• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

pvvx

Активный участник сообщества
Собрал флэшер rebane из rebane / rtl8710_openocd / source / — Bitbucket
проверил вручную:
---
Итого: у меня rebane flasher работает. Наверно я что-то делаю неправильно.
Я собирал месяцы назад и не совпадало и не работал. Об ошибках было написано ранее...
Во первых не работает это rebane / rtl8710_openocd / source / make_array.c — Bitbucket
В Windows файл открывается в текстовом режиме и уже энный байт там имеет значение конца файла - терминатора. Но это не важно - не совпадает код с приведенным hex дампом. Вложенный hex дамп - работает, исходники - нет.
Разъясните что не так с исходниками rebane ?
Они не настолько сложны чтобы в них нельзя было разобраться
Не правильно работают с контроллером в чипе. А так более ничего :)
Прикольно, дамп флэша прочитанный rebane не совпадает с тем что читает jflash.
[inline]Verification failed @ address 0x98009080 (Read: 0x02, Expected: 0xFF)[/inline]
Требует правки скрипт. Данный флешер пишет только блоками из буфера памяти. Если передали записать два байта, то он запишет весь буфер с прошлыми значениями. Починить возможности нет - исходники у меня не работают.
У всех есть исходники флешера от Ameba и от Realtec датированные 2015 годом. Там правильная работа с разными Flash и прочими регистрами контроллера. Выходит, что rebane просто поленился поискать исходники от Realtek - бывает :).
 
Последнее редактирование:

sharikov

Active member
Не правильно работают с контроллером в чипе. А так более ничего
Работает как с тупым spi без "магии". Ничего предосудительного в этом нет. Потенциальное ускорение не стоит затраченных усилий потому что основные потери времени происходят на передаче данных по swd и стирании секторов.

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

У всех есть исходники флешера от Ameba и от Realtec датированные 2015 годом. Там правильная работа с разными Flash и прочими регистрами контроллера.
Дайте ссылку на исходники Realtek - посмотрю.
 

pvvx

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

sharikov

Active member
Если у вас блок не кратен записываемому за раз буферу, то он запишет кратный размер, дополненный грязью из буфера.
Ответьте на простой вопрос: что должен записать флэшер если записываемый блок меньше блока флэш ?

Давно дано, до rebane :) Загляните в SDK, вышедший до 11/2015 года для IAR или в мою сборки всего в кучу в проекте MP3...
Посмотрел в RTL00MP3
component/soc/realtek/8195a/misc/iar_utility/common/flashloader
если оно то это аццкий ад
 

pvvx

Активный участник сообщества
Ответьте на простой вопрос: что должен записать флэшер если записываемый блок меньше блока флэш ?
Все типы Flash, используемые в RTL871x имеют дискретность записи до 1 байта.
Ваш вопрос с технической стороны не ясен.
Flash делятся на две группы - с возможностью до-записи и без (только блочной записью). У нас используется только первый тип.
Посмотрел в RTL00MP3
component/soc/realtek/8195a/misc/iar_utility/common/flashloader
если оно то это аццкий ад
А вам должны были дать готовое под ваши условия? :eek:
Зачем делалась хоть эта тема? - Чтобы обсудить и учесть все варианты, а не обсуждать больных синдромом не восприятия чужих разработок и опыта, сильно распространенного на западе и ШША.
В флешере на паскале, который в заголовке темы, встроен heх от rebane и описанные "фичи" обойдены. Можно переписать и встроить свой - но мне лень :)
 
Последнее редактирование:

sharikov

Active member
Все типы Flash, используемые в RTL871x имеют дискретность записи до 1 байта.
Ваш вопрос с технической стороны не ясен.
Утомили вы уже придуриваться.
Флэш не может перезаписываться без стирания, это вам не озушка или фрам.
По этой причине запись нельзя рассматривать без учета стирания.
Со стиранием дискретность 4Кб а лучше использовать стирание 64Кб блоками потому что с четырехкилобайтными стирание идет слишком медленно.
mass_erase использовать в случае rtl нежелательно потому что оно сотрет калибровку.
Вот я и хочу понять что должно получиться с учетом стирания.
 

Вложения

pvvx

Активный участник сообщества
Утомили вы уже придуриваться.
Флэш не может перезаписываться без стирания, это вам не озушка или фрам.
Указано - "до-записи". :)
По этой причине запись нельзя рассматривать без учета стирания.
Что рассматривать? Запись первого и последующего блока не кратного сектору?
 

goodwin

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

pvvx

Активный участник сообщества
Фигня это все - религиозные баталии на тему флэш ...
Более насущный вопрос:
1.Где физически расположен eFuses?
2.Если запретить JTAG в eFuses (ROM загрузчик его не включит) и не разрешать в загружаемом коде, то чип залочится с концами?
0) Угу.
1) Не знаю. Не копал. Два варианта: 70% что встроено в чип, 30% что в спец. области flash.
2) Угу.

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

sharikov

Active member
Указано - "до-записи". :)
Что рассматривать? Запись первого и последующего блока не кратного сектору?
Рассматривать процесс со всеми фазами с самого начала.
Начинаем шить модуль с "грязной" флэш, какие операции выполняет флэшер ?

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

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

pvvx

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

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

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

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

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

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

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

Скорее нет чем да. Возможно Mono поможет. Сложилось так, что с линуксом не работаю.
По этой причине надо переводить 'флешер' на Питон.
 
Последнее редактирование:

sharikov

Active member
У нас есть 4 блока бинарных Image.
Первый – кратный сектору, второй – нет, третий идет за вторым в байтном align, после записи 4-го надо ставить отметку валидности записи второго и последующих image. На данном коде флешера от reabane эта задача требует множества коррекций и лишних действий. Итог – долгая работа.
Вы еще не упомянули калибровочную область.
Опять не учитываете стирание.
Второй не кратный - а что в начале блока flash ?
Если третий "за вторым" соединяем из на pc и считаем одним блоком.
Чтобы не ставить отметки после 4-го пишем с конца: сначала 4-й, потом 3-й и так далее.

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


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


По этой причине надо переводить 'флешер' на Питон.
И как питон будет общаться с jtag адаптером ?
 

pvvx

Активный участник сообщества
Вы еще не упомянули калибровочную область.
Это смотря что считать калибровочной областью. Просто данный флешер не работает из любой прошивки. Для него надо предварительно иметь прошитую прошивку, которая подготавливает оборудование чипа для него.
В ROM-BIOS есть процедуры калибровки контролера Flash на разную скорость CPU и несколько CS (разных flash) и включения на 1,2,4 бита SPI - писать, кроме обращения к внешним процедурам ничего не требуется. Нет только процедуры записи данных во flash.
Опять не учитываете стирание.
Второй не кратный - а что в начале блока flash ?
Если третий "за вторым" соединяем из на pc и считаем одним блоком.
Чтобы не ставить отметки после 4-го пишем с конца: сначала 4-й, потом 3-й и так далее.
Тогда затирает начало сектора. :(
Какой тип flash в RTL871xAM ?
Любой. А лучше две и разных. :)
Покупать модули AM по абсурдной цене $12 я не собираюсь так что тестировать придется вам.
Аналогичные контролеры с 2.5 Мбайт RAM и Flash стоят дороже даже указанной вами цены.
Правки внесу если будут внятные указания типа flash в AM.
1-линия данных наиболее совместима. 2 и 4 уже начинается зоопарк.
Проще написать самому с нуля, чем давать указания. Вам уже написано текста больше, чем занимает полный исходник.
И как питон будет общаться с jtag адаптером ?
Через утилиты SEGGER в Linux, аналогично как в Windows. Не сложно сделать и на STLink.

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

sharikov

Active member
Security Register флэшки содержит 0x00 - это значит что лок не установлен.
Дамп secure OTP моего модуля (512 бит):
Код:
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
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 не инициализирует флэш.
(вывод: для критичных приложений надо ставить внешний ватчдог и рубить питание модулю)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Security Register флэшки содержит 0x00 - это значит что лок не установлен.
Дамп secure OTP моего модуля (512 бит):
Код:
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  FF
FF  FF  FF  FF  FF  FF  FF  FF  FF  FF  35  95  07  42  5D  55
Подозрительные 6 байт в конце, с mac из at прошивки не совпадает.
Это ESN (electrical serial number) Flash от её производителя и отношения к MAC не имеет.
При работе с otp нашел способ "убить" модуль до передергивания питания: нужно всего лишь послать каманду Enter Secured OTP (ENSO) - всего лишь 1 байт. После этого rom не находит image1, не помогают ни ресет ни ватчдог - только снятие питания. Очевидно что rom не инициализирует флэш.
(вывод: для критичных приложений надо ставить внешний ватчдог и рубить питание модулю)
А если подать всего одну команду erase all flash то и передергивание питания не поможет. Вывод - ?
Если модуль не загрузился, то он выходит на UART монитор. Ждет символа ESC и Flash можно записать по UART. Медленно, но работает.
Данный монитор запускается и из RTL00Flasher.exe. После запуска надо жмакнуть ReStart с перезагрузкой в RAM. Сделано для тех у кого 'reset' модуля недоступен и записали всякую ерунду.
Код:
RTL Console ROM: Start - press key 'Up', Help '?'
<RTL8710AF>
<RTL8710AF>?
----------------- COMMAND MODE HELP ------------------
        HELP (?)   : Print this help messag

        DB <Address, Hex> <Len, Dec>:
                                 Dump memory byte or Read Hw byte register
        DHW <Address, Hex> <Len, Dec>:
                                 Dump memory helf-word or Read Hw helf-word register
        DW <Address, Hex> <Len, Dec>:
                                 Dump memory word or Read Hw word register
        EW <Address, Hex> <Value, Hex>:
                                 Write memory word or Write Hw word register
                                 Can write more word at the same time
                                 Ex: EW Address Value0 Value1
        SPICTOOL <Mode, Dec> <BitMode, Dec>:
                                 Mode = 1: Init SPIC;  BitMode: 0(One)/1(Dual)/2(Quad)
                                 Mode = 2: Erase Chip

----------------- COMMAND MODE END  ------------------
<RTL8710AF>
Пока находится в мониторе Jtag доступен из недоделанных программаторов.
Так-же в мониторе ROM-BIOS есть полная инициализация SPIC в любом BitMode и стирание всего чипа Flash.
Так-же заметьте, что почти все функции для работы с Flash есть в ROM-BIOS:
Код:
VOID SpicInitRtl8195A(u8 InitBaudRate, u8 SpicBitMode);            // spi-flash controller initialization
VOID SpicRxCmdRtl8195A(u8 cmd);                                 // recieve command
VOID SpicTxCmdRtl8195A(u8 cmd, SPIC_INIT_PARA SpicInitPara);    // transfer command
u8 SpicGetFlashStatusRtl8195A(SPIC_INIT_PARA SpicInitPara);        // RDSR, read spi-flash status register
VOID SpicSetFlashStatusRtl8195A(u32 data, SPIC_INIT_PARA SpicInitPara);        // WRSR, write spi-flash status register
VOID SpicWaitBusyDoneRtl8195A(VOID);    // wait sr[0] = 0, wait transmission done
VOID SpicWaitWipDoneRtl8195A(SPIC_INIT_PARA SpicInitPara);        // wait spi-flash status register[0] = 0
VOID SpicEraseFlashRtl8195A(VOID);        // CE, flash chip erase
u32 SpicCmpDataForCalibrationRtl8195A(VOID);            // compare read_data and golden_data
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.
 
Последнее редактирование:

sharikov

Active member
Это ESN (electrical serial number) Flash от её производителя и отношения к MAC не имеет.
Согласно ДШ на MX25L8006E 16-байтный ESN расположен по адресам 0x00-0x0f, оттуда читается ff т.е ESN не прописан.
В модуле 6 непонятных байт расположены по адресам 0x3a-0x3f.
С ESN не совпадают адреса и размер.
 

pvvx

Активный участник сообщества
Согласно ДШ на MX25L8006E 16-байтный ESN расположен по адресам 0x00-0x0f, оттуда читается ff т.е ESN не прописан.
В модуле 6 непонятных байт расположены по адресам 0x3a-0x3f.
С ESN не совпадают адреса и размер.
Может вы прописали? :)
У меня не читалась OTP простыми командами из Jtag совместно с кодами от rebane и я тогда бросил там копаться - были более насущные дела...
Снимок38.gif
Меня счас больше интересует SPI flash более 16 Мегабайт. А то в ESP8266 было ограничение до 16 и не мог использовать...
Это надо для логгирования и чтобы не ставить FRAM.
 
Последнее редактирование:

pvvx

Активный участник сообщества
При работе с otp нашел способ "убить" модуль до передергивания питания: нужно всего лишь послать каманду Enter Secured OTP (ENSO) - всего лишь 1 байт. После этого rom не находит image1, не помогают ни ресет ни ватчдог - только снятие питания. Очевидно что rom не инициализирует флэш.
(вывод: для критичных приложений надо ставить внешний ватчдог и рубить питание модулю)
JLINKARM_WriteU32($40006000, 0);
JLINKARM_WriteU32($40006004, rdl);
JLINKARM_WriteU32($40006008, wrl);
JLINKARM_WriteU32($40006060, $B1); // ENSO (enter secured OTP)
И ничего описанного вами не происходит. Что не так?
 
Сверху Снизу