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

Увеличение памяти esp-01

SpLab

New member
Подскажите пожалуйста реально ли поменять память на 8 Мб? Есть SPI-flash в корпусе so-8 на 8 Мб, хочу попробовать поставить в модули ESP-01 чтобы себя не ограничивать печальными 512 кб.
Где у модуля находится bootloader? Если в чипе, то распознает ли он 8 Мб? А если в SPI-flash до достаточно ли клонировать содержимое штатной флешки на новую-большую?
 

pvvx

Активный участник сообщества
Загрузчик в чипе использует встроенную Boot ROM.
Не все "SPI-flash в корпусе so-8" подходят. Используются QSPI интерфейс и во время работы куски программы постоянно считывается в память (кешируются с flash) кусками на момент выполнения этого куска. Памяти RAM у чипа мало. Область кэширования flash задается в заголовке первого блока прошивки (в первых 16 байтах). Вся информация есть и вы дублируете тему http://esp8266.ru/forum/threads/rasshirenie-flesh-pamjati.36/
 

SpLab

New member
Спасибо, прочитал указанную Вами тему, нашел Ваш spi_flash_add.c/h и Web сервер. Буду разбираться. Честно говоря запутался, но так понял что с родным SDK без шаманства большие flash работать не будут. А не подскажете по Boot ROM какая-то информация есть, может укажете на какую нибудь документацию?
 

pvvx

Активный участник сообщества
Честно говоря запутался, но так понял что с родным SDK без шаманства большие flash работать не будут.
Да. Официально поддерживается только 0,5 и 1Mb flash - на них даны загрузчики в SDK. Остальное совсем не гарантированно и неопределенно.
Я использую любую flash как 512к для кода и всяких настроек, остальная часть - данные. И SDK всегда сообщаю, что у неё 512к flash. Иначе она лезет писать настройки выше 512к. Таким методом всё равно какой размер у Flash (куча хлама SDK работает в своей песочнице - первых 512к и не вылезает и не затирает данные выше) .
А не подскажете по Boot ROM какая-то информация есть, может укажете на какую нибудь документацию?
1) Есть загрузчик esptool.py и описание к нему.
2) Есть файл имен процедур в Boot ROM (в SDK в каталоге ld/eagle.rom.addr.v6.ld) и их адресов.
На этом пока всё. Вопросы слишком общие и на них ответить в одном посту форума невозможно - сами разбирайтесь и конкретизируйте - возможно кто и ответит c дополнениями . :)
 

SpLab

New member
Спасибо за правильно заданный вектор моего слепого тыканья :) Дизасемблировал BootFlash и загрузчик boot.bin - разбираюсь. Файл с адресами процедур eagle.rom.addr.v6.ld в этом огромное подспорье. Попутно изучаю архитектуру ядра и систему команд Xtensa. Да уж, это посложнее чем Cortex-M, особенно в части кэша. Так и не понял реализовали ли в ESP MMU. Но это не суть... Возникла пара более конкретных вопросов:
Да. Официально поддерживается только 0,5 и 1Mb flash - на них даны загрузчики в SDK. Остальное совсем не гарантированно и неопределенно.
Анализ доступной информации не дает повода усомниться в том, что на уровне SDK не поддерживаются SpiFlash отличные от 512кб. Заголовок образа прошивки предполагает как минимум 5 возможных объемов: 256 KB, 512 KB, 1024 KB, 2048 KB, 4096 KB. Загрузчик boot.bin также поддерживает эти же объемы. Так же есть документ ESP8266_IOT_Flash_read_write_guide_v0.2.pdf в котором не накладываются ограничения на объем Spiflash, оговаривая лишь что SystemDataArea должна быть расположена строго в последних 4-х секторах SpiFlash.
Назначение и возможности кода InternalROM (BootROM) пока изучаю. Вы говорили о том, что именно "BIOS не поддерживает flash более 524288 байт". Действительно проблема должна быть именно в драйвере SpiFlash, который очевидно должен находиться либо в InternalROM, либо в первом секторе SpiFlash и очевидно должен поддерживать лишь предопределенный набор чипов, ID которых в нем и должны быть определены. Т.о. теоретически если правильно собрать бинарный образ прошивки, корректно настроив заголовок и поместив SystemDataArea в конец, а также использовать SpiFlash поддерживаемую в драйвере SpiFlash, то все должно корректно работать (ну в пределах кривости самого SDK).
По какой информации Вы сделали вывод о том что именно код в InternalROM не поддерживает большие объемы SpiFlash ?
InternalROM это OTP память или его можно писать?
Частота процессора 80 или 160 МГц и можно ли ее задать через SDK?
Я использую любую flash как 512к для кода и всяких настроек, остальная часть - данные. И SDK всегда сообщаю, что у неё 512к flash. Иначе она лезет писать настройки выше 512к. Таким методом всё равно какой размер у Flash (куча хлама SDK работает в своей песочнице - первых 512к и не вылезает и не затирает данные выше) .
Пожалуй Вы правы и действительно безопаснее так делать, тем более что этого объема в большинстве случаев достаточно для кода, а данные сваливать выше 512 кб. Просто раз уж начал курить тему, то нужно разобраться. Тем более что теоретически SDK действительно лезет выше этого объема, но теоретически всеже только в последние 4 сектора.
 

pvvx

Активный участник сообщества
Заголовок образа прошивки предполагает как минимум 5 возможных объемов: 256 KB, 512 KB, 1024 KB, 2048 KB, 4096 KB. Загрузчик boot.bin также поддерживает эти же объемы. Так же есть документ ESP8266_IOT_Flash_read_write_guide_v0.2.pdf в котором не накладываются ограничения на объем Spiflash, оговаривая лишь что SystemDataArea должна быть расположена строго в последних 4-х секторах SpiFlash.
А какие гарантии этого? Я пробовал указывать 16Мегайт, как размер flash. При этом область записи смещается на последние сектора, но кещируемая область остается всего 1Мег. SDK перераспределяет и память, при старте. Функции работы с Flash в ROM работают на 16Мег, а использовать более меньшую flash по ценовой категории нет смысла - разница в центах. По этому выбор распределен между 512к и 16мег. При этом (16M Winbond) общее потребление падает и увеличивается быстродействие. Влияет скорость произвольной выборки секторов для кеша (и скорость записи страниц - но это менее актуально).
InternalROM это OTP память или его можно писать?
Скорее всего это масочная или одноразовая flash.
Частота процессора 80 или 160 МГц и можно ли ее задать через SDK?
Примеры же даны.
Код:
#ifdef USE_CPU_SPEED
#if    USE_CPU_SPEED > 80
    REG_SET_BIT(0x3ff00014, BIT(0));
    os_update_cpu_frequency(160);
#else
    REG_CLR_BIT(0x3ff00014, BIT(0));
    os_update_cpu_frequency(80);
#endif
Но SDK периодически сбрасывает 160MHz на 80.
Работа с flash показана в Web_base\app\web\flash.c моей свалки http://esp8266.ru/forum/threads/razrabotka-biblioteki-malogo-webservera-na-esp8266.56/
Пока, если действовать так, как там "накорябоно", то всё успешно.
Анализ доступной информации не дает повода усомниться в том, что на уровне SDK не поддерживаются SpiFlash отличные от 512кб.
Тут дело в том, что пока ни одно описание или пожелание, исходящее от Espressif, не совпало с реальностью :) Кроме мелких исключений, если остальное не повлияет и вы пишите программу уровня "HelloWorld" :)
От версии SDK всё гуляет как угодно.

PS: Если хотите разобраться и оказать помощь другим, тогда почините esptool.py – в текущих версиях она стирает большую область, чем пишет. Там что-то неверно в параметрах при обращении к процедуре SPIEraseArea(???), находящуюся в ROM чипа…
 
Последнее редактирование:

SpLab

New member
В общем ясно, что все SDK очень сырое и ничего не гарантируется и лучше пока работать с тем что проверено, т.е. использовать Ваш вариант эмуляции 512 кБ. В остальном, по ходу разбора имеющихся сведений возникло множество вопросов, которые уже не имеют отношения непосредственно к теме увеличения памяти. Буду искать ответы в соответствующих ветках форумов.
PS: Если хотите разобраться и оказать помощь другим, тогда почините esptool.py – в текущих версиях она стирает большую область, чем пишет. Там что-то неверно в параметрах при обращении к процедуре SPIEraseArea(???), находящуюся в ROM чипа…
Я потихоньку реверсю интересующие меня функции InternalROM, ну могу за одно и попытаться приложить усилия и к этой проблеме если Вы опишите ее подробнее или дадите ссылку на ее описание/обсуждение.
 

pvvx

Активный участник сообщества
Я потихоньку реверсю интересующие меня функции InternalROM, ну могу за одно и попытаться приложить усилия и к этой проблеме если Вы опишите ее подробнее или дадите ссылку на ее описание/обсуждение.
Это программа записи прошивки используемая в Unofficial Developer Kit.
Описание https://github.com/themadinventor/esptool
https://github.com/themadinventor/esptool/blob/master/esptool.py строка ~188, где формируются параметры запроса (и они правильные - делал распечатку, а что там глубже не разбирал).
При записи файла прошивки она стирает размер значительно больший, чем размер записываемого файла. Т.е. затирает большую область секторов за адресами записи файла в flash и она не кратна страницам стирания, а кратна размерам сектора. Пример дан: при записи файла размером 33456 байт в начало flash, стирается область в 73728 байт. Т.е. явная ошибка и для её исправления требуется полный анализ процедуры SPIEraseArea в InternalROM.
Не проявляется, если записывать файлы последовательно (они пишутся в область, где уже стерто, с повторным стиранием перед записью :) ) и последние файлы, к концу размера flash, имеют малый размер и не пишутся в самый конец flash, чтобы по кругу не затереть начало flash (так и решена пока). Размер стирания зависит от размера файла - у малых файлов размер области стирания за областью записи тоже выходит малым. Описания и обсуждения нет, по причине того, что очень мало людей пишет что-то на ESp8266.
 
Последнее редактирование:
Сверху Снизу