• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

RTL871x ROM-BIOS

pvvx

Активный участник сообщества
У RTL8711AM, RTL8711AF, RTL8710AF коды в ROM-BIOS идентичны.
Наконец разобрал коды и данные ROM...
Теперь, после частичного "реверса" бинарника ROM есть правильные адреса и используемая память RAM из ROM-BIOS - Сделал себе правильные ld и хидеры...
Оказалось, что все файлы *.ld для линковщиков из всех SDK (хоть *.icf к IAR) и прочих прошивок не соответствуют имеющимся кодам в ROM-BIOS. Так-же не соответствует и кинутая rom.a. Во первых она предварительной версии, а ROM в чипе прошит V02.
Кратко можно ознакомиться в файле вложения. Полной информации не будет никогда. Описание заголовков и прочего войдет в мой SDK, но позже - долго оформлять.
Без правильной разметки данных в RAM невозможно их использовать совместно с ROM-BIOS. Использование совместно - сокращает задействованную RAM, исключая дубли, включая область boot-loadera. В оф. SDK все блоки данных, имеющихся в области RAM от ROM дублируются и согласования у них нет(!).

PS: Данная тема будет продолжаться с описанием ROM-BIOS для RTL... по мере накопления инфы и наличию обратной связи :)
 

Вложения

pvvx

Активный участник сообщества
Тестовый проект по сборке сегмента данных RAM используемых ROM для теста совместимости и начальной инициализации в boot-лоадерах.
Производит подмену данных для ram от rom.a из rtl_bios_data.с с описанием всех полей в rtl_bios_data.h. Требуется для исключения включения в проект GCC rom.a старой версии и проверки по получившемуся build\obj\build.map правильной линковки данных, для последующей возможности создания и коррекции полей в project\ld\export-rom_v04.txt.
Для сборки ROM - добавить либу lib_rom.a (rom.a) в SDK и:
1) sdkset.mk: all: LIBS += _rom c nosys gcc
2) закоментировать в rtl_bios_data.h: #define NOT_USE_LIBROM_A
- тогда структуры данных будут братся из rom.a.
Не для "телепузиков" - на проекты "с миганием светодиодом" это не распространяется, а для тех кому надо собрать что-то правильное и надежное на RTL с коррекцией ошибок во всяких кривых вариантов скриптов линкера и различий их с реальной ROM.
Так-же напомню - в IAR проект линкуется с rom.a (от старой версии rom-bios!) и не используется export-rom_v0X.txt и поля в rom.a не совпадают с реальными - V02 rom используемой в чипах. Так-же rom.a не содержит всех имен локальных переменных в RAM. И у GCC линковщика (и их версий) своя политика сортировки данных в пределах сегмента и align их начал - итого совпадений не будет, если не задать всё ручками и не переписать в соответствие с дизасмом дампа реальной ROM, а не по имеющимся непонятно от куда взятых файлов. :)
Т.е. история доводки долгая и сложная. Пока совместил только интересуемые данные - область RAM переменных rom-bios. Остальное - адресация процедур в ROM для GCC - подходит уже имеющаяся в *.ld-*.txt.
 

Вложения

Последнее редактирование:
  • Like
Реакции: KomX

pvvx

Активный участник сообщества
Выходят такие позиции у реальной ROM в начальной области RAM и Boot:
Код:
10000000 D NewVectorTable
10000100 D UserIrqFunTable
10000200 D UserIrqDataTable
10000300 D CfgSysDebugWarn
10000304 D CfgSysDebugInfo
10000308 D CfgSysDebugErr
1000030c D ConfigDebugWarn
10000310 D ConfigDebugInfo
10000314 D ConfigDebugErr
10000318 D HalTimerOp
10000334 D GPIOState
1000034c D gTimerRecord
10000350 D SSI_DBG_CONFIG
10000354 D _pHAL_Gpio_Adapter
10000358 D Timer2To7VectorTable
10000370 D _rand_first
10000374 D _rand_z1
10000378 D _rand_z2
1000037c D _rand_z3
10000380 D _rand_z4
10000384 D pUartLogCtl
10000388 D UartLogBuf
10000408 D UartLogCtl
10000430 D UartLogHistoryBuf
100006ac D ArgvArray
100006d4 D rom_wlan_ram_map
100006e0 D FalseAlmCnt
10000720 D ROMInfo
10000738 D DM_CfoTrack
10000760 D rom_libgloss_ram_map
10000780 D __rtl_malloc_av_
10000b88 D __rtl_malloc_trim_threshold
10000b8c D __rtl_malloc_top_pad
10000b90 D __rtl_malloc_sbrk_base
10000b94 D __rtl_malloc_max_sbrked_mem
10000b98 D __rtl_malloc_max_total_mem
10000b9c D __rtl_malloc_current_mallinfo
10000bc4 D __rtl_errno
10000bc8 D gRamStartFun
10000bcc D gRamPatchWAKE
10000bd0 D gRamPatchFun0
10000bd4 D gRamPatchFun1
10000bd8 D gRamPatchFun2
10000bdc D RAM_IMG1_VALID_PATTEN
10000be4 D rand_x
10000be8 D AvaWds
10001be8 D SdrDramInfo
10001bfc D SdrDramTiming
10001c30 D SdrDramModeReg
10001c4c D SdrDramDev
10001c60 A _rtl_impure_ptr
10001c68 D impure_reent
10002090 D _rom_неивестные_данные
100020b4 D _sdr_rnd2_y
100020b8 D _sdr_rnd2_z
100020bc D _sdr_rnd2_c
Конец использования у Ameba назначен вроде как 0x10002114. Но пока не встретил в IDA обращений из ROM по фиксед адресам выше 0x100020bc (ну кроме блока SDIO использующего конец RAM c 0x1006D000.. до конца).
Т.е., если обращаемся к процедурам rom-bios, то надо предоставить область c 0x10000000 по 0x10002100 c проинициализированными там данными... bss область rom-ram можно и очистить при старте уже в boot, но нарушатся отметки используемых i/o на периферию и прочие глупости... Так оно и работает у Ameba - Hal ругается не по делу и i/o не работают :) О SDRAM и SPIC вообще пока помолчу - том полный бардак и по этому всякие Ameba используют режим только SIO обращений к Flash и наблюдаем кучу бреда от разных версий загрузчиков и конфликтов их с калибровочными значениями...
Переинициализация SPIC в SDK при старте доходит до 5 раз и в разных вариантах кода (куча дублей - с пометками процедур как _patch и так и сяк :) - а достаточно всего одной и одного массива параметров в области ram-rom :))
При загрузке их boot (ram_1.r.bin) перекрывает область параметров rom-bios со значениями для spic и поля у них не совпадают по адресации для текущей версии ROM - итог = мешанина и необходимость дублирования процедур инициализации и их данных в других областях RAM. :) Затем boot (ram_1.r.bin) загружает и запускает image2 - в нем новые инициализации и новые буфера для их данных калибровок... :) Потом инится mbed api - у него опять новые поля и данные калибровок... :) И т.д. В одном интерфейсе spic иниться на DIO, в другом на SIO и всё это как-то живет, требуя процедур с патчем на патче при обращении к специфичным функциям flash :) А пол мега процедур в rom - выходят ненужным хламом - как пример - процедура Random-а из ROM дублирована в SDK более 5-ти раз под разными именами... :)
Потом не удивительно, что 512к RAM не хватает ни для чего :)

Понятно, что это всё сделано ради совместимости с предыдущими патчами, как это ныне модно. Тут без OTAсовсем ни как. На пошлый патч нужен новый патч и их цикл бесконечен – это и есть основа и главные задачи современного ПО - обновление ради обновления, вместо исправления начального нарушения. :)

Отец...
вы так ошибаетесь.
Позвольте объяснить.
Жизнь, которой вы так благородно служите,
происходит из разрушения и хаоса.
Возьмем этот пустой стакан.
Вот он, спокойный...
скучный.
Но если его...
уничтожить.
Посмотри на этих малышей.
Как они теперь заняты.
Заметьте, как полезна каждая.
Что за прекрасный балет...
полный форм и красок.
Теперь подумайте обо всех тех людях
создавших их.
Техники, инженеры. Люди, которые
могут накормить сегодня своих детей...
чтобы эти дети затем выросли
и имели своих детей...
и так далее.
Таким образов создается
великая цепочка...
жизни.

Вода.
Фрукты.

Вот видите, святой отец,
создавая небольшое разрушение...
Я поддерживаю жизнь.
По сути, мы заняты одним делом.
(с) Пятый элемент
 
Последнее редактирование:

sharikov

Active member
Для чего используется область между UartLogHistoryBuf и ArgvArray - 676 байт?
 

pvvx

Активный участник сообщества
Для чего используется область между UartLogHistoryBuf и ArgvArray - 676 байт?
Откройте файлы rtl_bios_data.c и rtl_bios_data.h "и да прозреете" :) Уточнения в rtl_console.c
Есть такая функция в операционке - поиск называется. Ищет по знакомым буквам и словам в указанных файлах... Укажите SDK или прямо google :)
Мне гугла сказало RTL00MP3/RTL00_SDKV35a/component/soc/realtek/8195a/misc/driver at master · pvvx/RTL00MP3 · GitHub
А far на UartLogHistoryBuf в SDK это:
Снимок1296.gif
А Windows по "F3":
Снимок1297.gif
А в rtl_bios_data.c:
MON_RAM_BSS_SECTION u8 UartLogHistoryBuf[UART_LOG_HISTORY_LEN][UART_LOG_CMD_BUFLEN]; // 10000430 UartLogHistoryBuf[5][127] !
Далее вводим это дело в windows->стандартные->кУлькулятор:
Снимок1298.gif
Получаем ваши искомые 635 байт, с учетом align(4) будет что-то другое.
А IDA на бинарник ROM и область между эти переменными сказала:
Снимок1299.gif
что в процедуре ROM GetArgv() есть обращение к статической переменной за данным буфером. Она не интересна и не требует глобального имени.
Повторить описываемую примерную последовательность действий может каждый и на такие вопросы без приколов не отвечаю :p
Тем более когда немного доработаю rtl_bios_data.c и rtl_bios_data.h и выложу в git или куда ещё, то гугла вам сам ответит на эти вопросы. :)
И у вас, в отличии от автомата, останется единственная миссия - разделение на реальное и вымышленное. "Телепузики" для этого не нужны. Автомат и ИИ ещё сотни лет не сможет это сделать - он руководствуется ограниченным числом датчиков и не имеет... В общем фантасты забыли про это и пишут только хрень по консервные баночки с людьми в космосе :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Кто знает что-то о загрузке не в режиме с Flash, а в режиме с SDIO?
В текущих ROM-BIOS V02 стартовая процедура изменена:
Reset_Handler -> HalResetVsrV02() ->HalBootFlowV02()
и имеет ветку загрузки SDIO SDIO_Boot_Up() по регистру 0x40000038 (REG_SYS_EFUSE_SYSCFG6).
 
Сверху Снизу