• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Последнее редактирование:
Сверху Снизу