Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Кто доделает Flasher для RTL00 c JlinkARM.dll?

Тема в разделе "Realtek - SDK, прошивки и утилиты", создана пользователем pvvx, 30 сен 2016.

  1. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Я собирал месяцы назад и не совпадало и не работал. Об ошибках было написано ранее...
    Во первых не работает это rebane / rtl8710_openocd / source / make_array.c — Bitbucket
    В Windows файл открывается в текстовом режиме и уже энный байт там имеет значение конца файла - терминатора. Но это не важно - не совпадает код с приведенным hex дампом. Вложенный hex дамп - работает, исходники - нет.
    Не правильно работают с контроллером в чипе. А так более ничего :)
    Требует правки скрипт. Данный флешер пишет только блоками из буфера памяти. Если передали записать два байта, то он запишет весь буфер с прошлыми значениями. Починить возможности нет - исходники у меня не работают.
    У всех есть исходники флешера от Ameba и от Realtec датированные 2015 годом. Там правильная работа с разными Flash и прочими регистрами контроллера. Выходит, что rebane просто поленился поискать исходники от Realtek - бывает :).
     
    Последнее редактирование: 28 дек 2016
  2. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Работает как с тупым spi без "магии". Ничего предосудительного в этом нет. Потенциальное ускорение не стоит затраченных усилий потому что основные потери времени происходят на передаче данных по swd и стирании секторов.

    Как нужно сделать ?
    Записать FF или прочитать сектор и записать старые значения в неизменяемую часть ?
    Второе требует существенных правок и работать будет медленнее, обоснуйте зачем это нужно. С флэш памятью никто при программировании не работает как с озу.

    Дайте ссылку на исходники Realtek - посмотрю.
     
  3. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Т.е. не работает с разными Flash? Так-же там критически разные пред-установки.
    А кто осуждает? :) Вы сейчас? Предлагаете всё делать кое-как? :)
    Чередование стирания-записи и прочие изменения алго ускоряют процесс. Не требуется передавать лишнюю информацию и производить ожидания исполнения каждого минимального действа.
    Если у вас блок не кратен записываемому за раз буферу, то он запишет кратный размер, дополненный грязью из буфера.
    Давно дано, до rebane :) Загляните в SDK, вышедший до 11/2015 года для IAR или в мою сборки всего в кучу в проекте MP3... Я и туда это добавил недавно из-за частых запросов, хотя оно к проекту отношения не имеет.
     
    Последнее редактирование: 28 дек 2016
  4. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Ответьте на простой вопрос: что должен записать флэшер если записываемый блок меньше блока флэш ?

    Посмотрел в RTL00MP3
    component/soc/realtek/8195a/misc/iar_utility/common/flashloader
    если оно то это аццкий ад
     
  5. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Все типы Flash, используемые в RTL871x имеют дискретность записи до 1 байта.
    Ваш вопрос с технической стороны не ясен.
    Flash делятся на две группы - с возможностью до-записи и без (только блочной записью). У нас используется только первый тип.
    А вам должны были дать готовое под ваши условия? :eek:
    Зачем делалась хоть эта тема? - Чтобы обсудить и учесть все варианты, а не обсуждать больных синдромом не восприятия чужих разработок и опыта, сильно распространенного на западе и ШША.
    В флешере на паскале, который в заголовке темы, встроен heх от rebane и описанные "фичи" обойдены. Можно переписать и встроить свой - но мне лень :)
     
    Последнее редактирование: 28 дек 2016
  6. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Утомили вы уже придуриваться.
    Флэш не может перезаписываться без стирания, это вам не озушка или фрам.
    По этой причине запись нельзя рассматривать без учета стирания.
    Со стиранием дискретность 4Кб а лучше использовать стирание 64Кб блоками потому что с четырехкилобайтными стирание идет слишком медленно.
    mass_erase использовать в случае rtl нежелательно потому что оно сотрет калибровку.
    Вот я и хочу понять что должно получиться с учетом стирания.
     

    Вложения:

    • make_array.zip
      Размер файла:
      27 КБ
      Просмотров:
      5
  7. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Указано - "до-записи". :)
    Что рассматривать? Запись первого и последующего блока не кратного сектору?
     
  8. goodwin

    goodwin Читатель

    Сообщения:
    123
    Симпатии:
    22
    Фигня это все - религиозные баталии на тему флэш ...
    Более насущный вопрос:
    1.Где физически расположен eFuses?
    2.Если запретить JTAG в eFuses (ROM загрузчик его не включит) и не разрешать в загружаемом коде, то чип залочится с концами?
     
  9. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    0) Угу.
    1) Не знаю. Не копал. Два варианта: 70% что встроено в чип, 30% что в спец. области flash.
    2) Угу.

    1.1) Ошибок в SDK много - вскрыть не проблема.
    1.2) Большая вероятность что в чипе стоит EPROM. Т.е. есть вероятность, что можно стереть и писать снова, а не OTP.
     
    Последнее редактирование: 28 дек 2016
  10. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Рассматривать процесс со всеми фазами с самого начала.
    Начинаем шить модуль с "грязной" флэш, какие операции выполняет флэшер ?

    Что-то исправил, проверьте на предмет записи мусора при некратном размере.
    Проверял вручную:
    заполнил буфер нулями и скомандовал:
    rtl8710_flash_mass_erase
    rtl8710_flasher_write_block 0x20000 3
    rtl8710_flasher_write_block 0x20005 1

    потом слил дамп, в дампе нули только там где я писал.
     
  11. Seeker

    Seeker Читатель

    Сообщения:
    27
    Симпатии:
    5
    Скорее нет чем да. Возможно Mono поможет. Сложилось так, что с линуксом не работаю.
     
  12. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Откройте исходники и посмотрите. Это быстрее, чем искать ваши ошибки и не понимания алгоритмов.
    Решите задачу:

    У нас есть 4 блока бинарных Image.

    Первый – кратный сектору, второй – нет, третий идет за вторым в байтном align, после записи 4-го надо ставить отметку валидности записи второго и последующих image. На данном коде флешера от reabane эта задача требует множества коррекций и лишних действий. Итог – долгая работа.

    Для RTL871xAM он вообще не приспособлен. Не сможет работать с другими типами flash. + Нет выбора кол-ва линий SPI данных.
    Требуется доделка и изменения.

    Вообще есть желание сделать флешер сразу по сети, UART и USB и прошить его навеки в чип. К примеру эмуляцию сетевого Segger, OTA Ameba Arduino, VUSB Arduino и esptool.py :)

    По этой причине надо переводить 'флешер' на Питон.
     
    Последнее редактирование: 28 дек 2016
  13. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
  14. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Вы еще не упомянули калибровочную область.
    Опять не учитываете стирание.
    Второй не кратный - а что в начале блока flash ?
    Если третий "за вторым" соединяем из на pc и считаем одним блоком.
    Чтобы не ставить отметки после 4-го пишем с конца: сначала 4-й, потом 3-й и так далее.

    Есть тупое решение:
    во флэшере mass_erase заменяем на user_erase - она стирает все но не трогает калибровочную область.
    В функции записи предусматриваем обход страниц целиком содержащих 0xff.
    В функции верификации предусматриваем обход калибровочной области.
    На pc слиянием кусочков с заполнением дыр и калибровочной области 0xff готовим образ full-flash и который и заливаем.
    Недостаток: будет шить медленнее чем при индивидуальной заливке.
    Плюсы: алгоритм тупой и предсказуемый.
    Для заливки "полного образа с калибровкой" предусматриваем перевод флэшера в engineering mode в котором обход калибровочной области выполняться не будет.


    Какой тип flash в RTL871xAM ?
    Покупать модули AM по абсурдной цене $12 я не собираюсь так что тестировать придется вам. Правки внесу если будут внятные указания типа flash в AM.
    1-линия данных наиболее совместима. 2 и 4 уже начинается зоопарк. Во флэшере зоопарк нафиг не нужен. На зоопарк можете посмотреть в исходниках flashrom.


    И как питон будет общаться с jtag адаптером ?
     
  15. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Это смотря что считать калибровочной областью. Просто данный флешер не работает из любой прошивки. Для него надо предварительно иметь прошитую прошивку, которая подготавливает оборудование чипа для него.
    В ROM-BIOS есть процедуры калибровки контролера Flash на разную скорость CPU и несколько CS (разных flash) и включения на 1,2,4 бита SPI - писать, кроме обращения к внешним процедурам ничего не требуется. Нет только процедуры записи данных во flash.
    Тогда затирает начало сектора. :(
    Любой. А лучше две и разных. :)
    Аналогичные контролеры с 2.5 Мбайт RAM и Flash стоят дороже даже указанной вами цены.
    Проще написать самому с нуля, чем давать указания. Вам уже написано текста больше, чем занимает полный исходник.
    Через утилиты SEGGER в Linux, аналогично как в Windows. Не сложно сделать и на STLink.

    Взгляните на кол-во продаж ESP8266 с али и т.д. Больше всего их берут в комплекте с платой на которой установлена микросхема USB-UART. На модуль RTL00 плат вообще нет, а установка в качестве замены ESP-12x некорректна. Если будет востребован RTL00 на али, то китайцы тут-же прикрутят к нему STM32 за 10 центов. Будет “боард” сразу с Jtag и USB-UART. От этого и зависит какой интерфейс будет у Jtag. Если хотите быстрее получить такое изделие со своим вариантом Jtag – рисуйте схему и кидайте исходники китайцам.
     
    Последнее редактирование: 29 дек 2016
  16. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Security Register флэшки содержит 0x00 - это значит что лок не установлен.
    Дамп secure OTP моего модуля (512 бит):
    Код (Text):
    1. FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
    2. FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
    3. FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
    4. FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  35  95  07  42  5D  55
    Подозрительные 6 байт в конце, с mac из at прошивки не совпадает.

    ---
    При работе с otp нашел способ "убить" модуль до передергивания питания: нужно всего лишь послать каманду Enter Secured OTP (ENSO) - всего лишь 1 байт. После этого rom не находит image1, не помогают ни ресет ни ватчдог - только снятие питания. Очевидно что rom не инициализирует флэш.
    (вывод: для критичных приложений надо ставить внешний ватчдог и рубить питание модулю)
     
    Последнее редактирование: 29 дек 2016
  17. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Это ESN (electrical serial number) Flash от её производителя и отношения к MAC не имеет.
    А если подать всего одну команду erase all flash то и передергивание питания не поможет. Вывод - ?
    Если модуль не загрузился, то он выходит на UART монитор. Ждет символа ESC и Flash можно записать по UART. Медленно, но работает.
    Данный монитор запускается и из RTL00Flasher.exe. После запуска надо жмакнуть ReStart с перезагрузкой в RAM. Сделано для тех у кого 'reset' модуля недоступен и записали всякую ерунду.
    Код (Text):
    1. RTL Console ROM: Start - press key 'Up', Help '?'
    2. <RTL8710AF>
    3. <RTL8710AF>?
    4. ----------------- COMMAND MODE HELP ------------------
    5.         HELP (?)   : Print this help messag
    6.  
    7.         DB <Address, Hex> <Len, Dec>:
    8.                                  Dump memory byte or Read Hw byte register
    9.         DHW <Address, Hex> <Len, Dec>:
    10.                                  Dump memory helf-word or Read Hw helf-word register
    11.         DW <Address, Hex> <Len, Dec>:
    12.                                  Dump memory word or Read Hw word register
    13.         EW <Address, Hex> <Value, Hex>:
    14.                                  Write memory word or Write Hw word register
    15.                                  Can write more word at the same time
    16.                                  Ex: EW Address Value0 Value1
    17.         SPICTOOL <Mode, Dec> <BitMode, Dec>:
    18.                                  Mode = 1: Init SPIC;  BitMode: 0(One)/1(Dual)/2(Quad)
    19.                                  Mode = 2: Erase Chip
    20.  
    21. ----------------- COMMAND MODE END  ------------------
    22. <RTL8710AF>
    Пока находится в мониторе Jtag доступен из недоделанных программаторов.
    Так-же в мониторе ROM-BIOS есть полная инициализация SPIC в любом BitMode и стирание всего чипа Flash.
    Так-же заметьте, что почти все функции для работы с Flash есть в ROM-BIOS:
    Код (C):
    1. VOID SpicInitRtl8195A(u8 InitBaudRate, u8 SpicBitMode);            // spi-flash controller initialization
    2. VOID SpicRxCmdRtl8195A(u8 cmd);                                 // recieve command
    3. VOID SpicTxCmdRtl8195A(u8 cmd, SPIC_INIT_PARA SpicInitPara);    // transfer command
    4. u8 SpicGetFlashStatusRtl8195A(SPIC_INIT_PARA SpicInitPara);        // RDSR, read spi-flash status register
    5. VOID SpicSetFlashStatusRtl8195A(u32 data, SPIC_INIT_PARA SpicInitPara);        // WRSR, write spi-flash status register
    6. VOID SpicWaitBusyDoneRtl8195A(VOID);    // wait sr[0] = 0, wait transmission done
    7. VOID SpicWaitWipDoneRtl8195A(SPIC_INIT_PARA SpicInitPara);        // wait spi-flash status register[0] = 0
    8. VOID SpicEraseFlashRtl8195A(VOID);        // CE, flash chip erase
    9. u32 SpicCmpDataForCalibrationRtl8195A(VOID);            // compare read_data and golden_data
    10. VOID SpicLoadInitParaFromClockRtl8195A(u8 CpuClkMode, u8 BaudRate, PSPIC_INIT_PARA pSpicInitPara);
    и код от rebane упрощается и сокращается.
    Но есть но - не все функции из ROM-BIOS поддерживают любые Flash. Код от rebane аналогично и более зависим. С разной номенклатурой Flash были внесены дополнения, которые описаны в программаторе у Ameba и Hal spic в SDK в плоть до поддержки SPI Flash на 4096 МЕГАБАЙТ.

    features 3-byte or 4-byte address modes to access memory beyond 128Mb.

    When 4-byte address mode is enabled, all commands requiring an address must be entered and exited with a 4-byte address mode command: ENTER 4-BYTE ADDRESS MODE command and EXIT 4-BYTE ADDRESS MODE command. The 4-byte address mode can also be enabled through the nonvolatile configuration register. See Registers for more information.
     
    Последнее редактирование: 29 дек 2016
  18. sharikov

    sharikov Авторитетный участник сообщества

    Сообщения:
    564
    Симпатии:
    51
    Согласно ДШ на MX25L8006E 16-байтный ESN расположен по адресам 0x00-0x0f, оттуда читается ff т.е ESN не прописан.
    В модуле 6 непонятных байт расположены по адресам 0x3a-0x3f.
    С ESN не совпадают адреса и размер.
     
  19. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    Может вы прописали? :)
    У меня не читалась OTP простыми командами из Jtag совместно с кодами от rebane и я тогда бросил там копаться - были более насущные дела...
    Снимок38.gif
    Меня счас больше интересует SPI flash более 16 Мегабайт. А то в ESP8266 было ограничение до 16 и не мог использовать...
    Это надо для логгирования и чтобы не ставить FRAM.
     
    Последнее редактирование: 29 дек 2016
  20. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    8.688
    Симпатии:
    1.282
    JLINKARM_WriteU32($40006000, 0);
    JLINKARM_WriteU32($40006004, rdl);
    JLINKARM_WriteU32($40006008, wrl);
    JLINKARM_WriteU32($40006060, $B1); // ENSO (enter secured OTP)
    И ничего описанного вами не происходит. Что не так?
     

Поделиться этой страницей