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

Обновлено: 04.07.2024

ESP8266 RTOS поддерживает в данный момент только SPIFFS !

Поддержка SPIFFS

SPIFFS - это диск на встроенной SPI памяти.

По умолчанию раздел диска для ESP32/ESP32S2 равен 512кб. Для изменения его размера SPIFFS требуется заменить таблицу разделов по адресу 0x8000 с полной прошивкой с нуля модуля. Для размера в 1мб файл тут (информацию требуется проверить). Увеличение размера диска за счет секций прошивки ограничивает её размер не более 1 мб!

Для ESP32/ESP32S2 имеющих на борту 16 мегабайт файл таблицы тут. Размер диска 8 мегабайт. Необходимо, чтобы изначально была использована таблица разделов для 16 мегабайт иначе - требуется очистка бланком и прошивка с нуля.

ESP8266 RTOS по умолчанию таблица разделов рассчитана на SPIFFS диск размером 1 мб. Файл таблицы разделов с поддержкой SPIFFS находится тут. Прошить взамен файла по адресу 0x8000. Для модулей с памятью 1мб использование SPIFFS невозможно !

При первом запуске SPIFFS диска некоторое время идет его форматирование и в UART отладке возможны предупреждения от wachdog.


На картинке отображен список файлов в корневом каталоге диска и форма загрузки файлов на SD карту.

Обозначение букв в списке файлов: D - директория, F - файл.

Подключение SD карты по SDMMC интерфейсу

Опцию поддерживает только ESP32.

SD карта подключается по интерфейсу SDMMC в одно-проводном режиме по 3 проводам:

GPIO14 - CLK (SCK), GPIO15 - CMD (MOSI), GPIO2 - D0 (MISO). CS карты подключаем к плюсу питания. В скобках указано обозначение выводов, которое чаще всего используется для SPI режима на готовых модулях SD карт.

Возможно подключение и по четырех-проводному режиму(включается в шестеренке), где дополнительно используются еще 3 вывода SD карты: D1,D2,D3. Актуально только если у вас готовая китайская плата с такой разводкой.

Внимание . Часто на готовых платах ESP32 вывод GPIO 2 подтянут резистором к GND и требуется обязательно удалить этот резистор для работы SD карты . Иногда вместо резистора может стоять светодиод. На время прошивки по UART GPIO 2 потребуется закоротить на GND !

Переназначение выводов интерфейса SDMMC невозможно.

На некоторых готовых SD ридерах, предназначенных для Arduino в разрыв линий связи могут стоять ограничивающие резисторы - их необходимо замкнуть для нормальной работы SD карты.

Подключение SD карты по SPI интерфейсу

Для этого требуется в шестеренке опции включить эту возможность и выбрать необходимые GPIO для выводов CLK, MISO, MOSI, CS.

Опцию поддерживает ESP32 и ESP32S2.

Первоначальная настройка SD карты

Карта должна быть отформатирована в формате FAT32.

Обновление прошивки модуля с SD карты

Для обновления прошивки с SD карты достаточно нажать на значок '>' рядом с BIN файлом в проводнике. После подтверждения обновления в течении примерно 10 секунд прошивка будет обновлена.

Проигрывание MP3 и WAV файлов

Вся документация по опции находится здесь.

Сохранение логов датчиков

В настройках опции необходимо выбрать куда(SD или SPIFFS) сохранять записи и интервал добавления. Ниже необходимо заполнить шаблон, в котором указываем необходимые датчики и прочие параметры в удобном для Вас варианте.

Для работы опции логирования на SD карте необходимо создать папку LOGS.

Активное(частое) сохранение логов уменьшает срок службы flash памяти(особенно у SPIFFS)

Имя файла должно содержать путь, например /SD/www/index.html . Если файл существует, то он будет перезаписан.

Если в url задать текст fw, то на диск будет загружена последняя созданная прошивка из конструктора.

Загрузка больших файлов на SPIFFS может быть не стабильна.

Загрузка файла через веб интерфейс

В файловом менеджере доступна загрузка файлов на SPIFFS диск или на SD карту, файл будет загружен в ту папку, в которой находитесь в данный момент. Мультизагрузка не поддерживается.

Возможны сбои в загрузке при использовании длинных или русскоязычных имен файлов.

FTP сервер

Опция включается в дополнительных настройках.

Если логин и пароль не установлены модуле, то доступ по FTP осуществляется по логину и паролю ftp/ftp

Поддерживается только одно соединение, ftp клиент должен работать(настроен) на одно соединение !

Продвинутые GET команды

Имя файла/папки должно содержать полный путь к файлу включая корневую папку SD или SPIFFS.

На большинстве старых модулях установлен чип памяти на 4 мегабита. т.е. это 512 кб что очень мало, если необходимо использование обновления через интернет (OTA).
Расмотрим маркировку чипов памяти:
чипы маркируются как W25Q4 или просто 25Q4 , где 4 - это объем памяти в мегабитах. Т.е. нам нужно не менее 8 мегабит, что соотвествует 1 мегабайту.

На Алиэкспресс можно найти чипы и на 8 и на 32 мегабит, но как я заметил на 32 мегабита цена выгоднее - берем их:

Перепаять чип вполне реально, дополнительных действий не требуется - после перепайки нужно просто стандартно перепрошить модуль через USB-UART переходник, указав размер флеш памяти 8 мегабит в прошивальщике при использовании OTA.

Иногда модуль может не запустится с новой памятью, чтобы успешно запустить модуль необходимо затереть память бланком, Сами бланки и инструкция находится тут.

я поменял заводские 4мбита на 32мбита (cFeon 032B-104HIP) на модуле ESP-201. всё отлично работает, только пришлось у новой памяти укоротить ножки - корпус оказался чуть больше.
кстати штатная память сдохла на второй день экспериментов . [Эксперименты] [Графики] [Телематика] [Магазин]
My contact info: [ICQ - 69278245] & [Gtalk/Gmail - FlyRouter]

Что-то у меня не заводится ESP-01
Запаял MX25L1605 Macronix стертую на программаторе.
NodeMCU флэшером заливаю однофайловую с адреса 0x00000 и тишина. В Safe Mode не запускается.
Пробовал и трехфайловой шить и галку "Поддержка flash 1mb" в конструкторе ставить - без разницы.
Попробую позже что-то из проверенных флэшек запаять.
Но подозреваю , что-то недопонял по прошивке
"Поддержка flash 1 мегабайт и выше. Только для OTA ! При прошивке необходимо установить объем flash 1 мегабайт(8 мегабит) в программе прошивальщике"
И тут
"после перепайки нужно просто стандартно перепрошить модуль через USB-UART переходник, указав размер флеш памяти 8 мегабит в прошивальщике при использовании OTA. "

Все-таки
первоначально нужно заливать прошивку на 512k ? или собирать с "поддержкой 1MB" ?
Как-бы убедится что код действительно записался во Flash (в NodeMCU верификации нет) , кроме как сдергивать на программатор ?

Прошивать нужно на 1 мег, если нужно на 1 мег. В прошивающей программе нужно выбрать 1 мегабайт, иногда нужно ставить реальный размер - в данном случае 16 мегабит..

Т.е. последовательность такая:
1. в конструкторе собираю прошивку с "Поддержка flash 1mb"
2. однофайловую заливаю флэшером с 0x00000 выбирая Flash Size 1MByte


3. замыкаю TX-RX и получаю safe mode

зы кстати , нехилая такая путаница получается с байтами-битами
в конструкторе вообще мили-биты

Как я уже говорил выше, модель состоит из flash ROM размером 512 КБ и SoC, который, по неподтвержденным данным имеет RAM до 248 КБ.

Вообще все, что касается памяти – расположения, свойств и атрибутов сегментов – это изыскания сообщества. В оригинальной китайской документации этот вопрос почему-то обойден стороной.

Один из вариантов (имеются противоречия с другими источниками) известной на сегодняшний день карты памяти можно посмотреть здесь. Приведу лишь наиболее интересные адреса:

Диапазон Описание
3FFE8000h — 3FFFBFFFh оперативная память для пользовательских приложений. При старте модуля может инициализироваться значениями из пользовательской прошивки.
3FFFC000h — 3FFFFFFFh системная оперативная память
40000000h — 4000FFFFh системный ROM. Отсюда стартует процессор, загружается пользовательская прошивка и здесь находятся основные системные библиотеки.
40100000h — 4010FFFFh оперативная память, содержит пользовательскую прошивку
40240000h — 40271FFFh вторая часть пользовательской прошивки. Здесь находятся код подключенных библиотек и SDK. Подмаплено к flash по адресу 40000h.

Различные сегменты адресного пространства могут быть RAM, ROM или подмаплены непосредственно к flash. Подмапленные области кэшируются для скорости работы.

Диапазон Описание
00000h — 3DFFFh адрес загрузки пользовательской прошивки
40000h — 7BFFFh адрес загрузки библиотек SDK (также может являться частью пользовательской прошивки)

Формат прошивки

Теперь, перед тем, как перейти к процессу запуска модуля, рассмотрим формат прошивки. Для загрузки пользовательской прошивки обычно достаточно записать 2 блока данных: по адресу 00000h и 40000h. Остальные блоки могут потребовать перепрошивки для сброса конфигурации, например, при заливке новой прошивки с несовместимым форматом данных.

Блок, начинающийся с 40000h содержит простой бинарный код, который загружается и работает в неизменном виде. А вот блок, начинающийся с 00000h, представляет собой структурированные данные о находящихся в нем сегментах и выглядит следующим образом:

Смещение Описание
0 идентификатор прошивки, всегда `0xE9`
1 количество сегментов в прошивке
2,3 параметры SPI Flash
4-7 адрес запуска прошивки (Entry Point)
8. далее идут данные сегментов

Смещение Описание
0-3 адрес для загрузки сегмента
4-7 размер сегмента
8. далее идут данные сегмента

Заполнен нулями для выравнивания до границы 16 байт минус 1 байт. После этого добавляется последний байт, представляющий собой контрольную сумму данных всех сегментов, вычисляемая функцией xor над всеми байтами и константой `0xEF`.

Формат прошивки взят из описания к утилите esptool.

Процесс запуска

Теперь, вооружившись этими знаниями, рассмотрим процесс старта модуля ESP8266 с точки зрения инициализации и запуска прошивки.

При подаче питания или поступлении сигнала сброса процессор начинает выполнение инструкций с адреса 40000080h (системный ROM). По адресу 40001308h располагается процедура, которая считывает блок 00000h flash и копирует сегменты, хранящиеся в ней по заданным адресам.


На схеме этот процесс показан фиолетовым цветом. Здесь видно, что часть прошивки является исполняемым кодом, а часть инициализирует данные в ОЗУ. Зеленым обозначен блок, напрямую подмапленный в адресное пространство процессора.

После всех инициализаций управление передается по адресу, указанному в заголовке прошивки. Обычно это адрес пользовательского кода 40100000h.

Поддавшись общей волне энтузиазма относительно систем «Умный дом», а также имея профильное образование инженера АСУ ТП, с удовольствием занимаюсь данной темой в виде хобби. В этой статье поделюсь с вами своим опытом реверс-инжиниринга популярного модуля ESP8266.


Содержание

  • ELF
  • Системная прошивка модуля
  • Пользовательская прошивка
  • Регистры
  • Базовые операторы
  • Функции
  • Условные переходы

1. Введение

В основном меня интересовали внутреннее устройство SoC, архитектура и система команд процессора, процедура старта и загрузки прошивки и другие не менее интересные вещи. Начав изучение данного модуля, я столкнулся с тем, что нужной информации по нему не много, и зачастую она достаточно противоречива. Поэтому многое приходилось перепроверять, что-то выяснять опытным путем, а о чем-то просто догадываться. Буду рад вашим комментариям и дополнениям.

Чтобы систематизировать всю полученную информацию и была написана эта статья.

2. Архитектура ESP8266


Не буду приводить технические характеристики, про это уже много написано, в том числе и на Хабре. Желающие могут ознакомиться, например, здесь.


Начнем с общей архитектуры системы. Модуль представляет собой Soc, в основе которого лежит процессор семейства Xtensa – Tensilica’s L106 Diamond series производства американской компании Cadence, а также микросхему флеш-памяти на 512кБ. Сам модуль разработан китайской компанией Espressif Systems. Таким образом, основная официальная информация по ESP8266 поступает от Espressif (на китайском языке и в переводе), а некоторые общие данные можно получать от Cadence.

Особенностью данного семейства процессоров является то, что они представляют собой конструктор, из которого заказчик с помощью предлагаемого инструмента Xtensa Processor Generator может собрать чип с нужными ему характеристиками и заказать его у производителя. Поэтому различные модификации могут сильно отличаться, например, количеством ядер, дополнительными инструкциями, модулями DSP и так далее.

Карта памяти (адресного пространства)

Как я уже говорил выше, модель состоит из flash ROM размером 512 КБ и SoC, который, по неподтвержденным данным имеет RAM до 248 КБ.

Вообще все, что касается памяти – расположения, свойств и атрибутов сегментов – это изыскания сообщества. В оригинальной китайской документации этот вопрос почему-то обойден стороной.

Один из вариантов (имеются противоречия с другими источниками) известной на сегодняшний день карты памяти можно посмотреть здесь. Приведу лишь наиболее интересные адреса:

Внутренняя память:

Диапазон Описание
3FFE8000h — 3FFFBFFFh оперативная память для пользовательских приложений. При старте модуля может инициализироваться значениями из пользовательской прошивки.
3FFFC000h — 3FFFFFFFh системная оперативная память
40000000h — 4000FFFFh системный ROM. Отсюда стартует процессор, загружается пользовательская прошивка и здесь находятся основные системные библиотеки.
40100000h — 4010FFFFh оперативная память, содержит пользовательскую прошивку
40240000h — 40271FFFh вторая часть пользовательской прошивки. Здесь находятся код подключенных библиотек и SDK. Подмаплено к flash по адресу 40000h.

Различные сегменты адресного пространства могут быть RAM, ROM или подмаплены непосредственно к flash. Подмапленные области кэшируются для скорости работы.

Flash:

Диапазон Описание
00000h — 3DFFFh адрес загрузки пользовательской прошивки
40000h — 7BFFFh адрес загрузки библиотек SDK (также может являться частью пользовательской прошивки)

Формат прошивки

Теперь, перед тем, как перейти к процессу запуска модуля, рассмотрим формат прошивки. Для загрузки пользовательской прошивки обычно достаточно записать 2 блока данных: по адресу 00000h и 40000h. Остальные блоки могут потребовать перепрошивки для сброса конфигурации, например, при заливке новой прошивки с несовместимым форматом данных.

Блок, начинающийся с 40000h содержит простой бинарный код, который загружается и работает в неизменном виде. А вот блок, начинающийся с 00000h, представляет собой структурированные данные о находящихся в нем сегментах и выглядит следующим образом:

Смещение Описание
0 идентификатор прошивки, всегда `0xE9`
1 количество сегментов в прошивке
2,3 параметры SPI Flash
4-7 адрес запуска прошивки (Entry Point)
8. далее идут данные сегментов

Структура сегмента:
Смещение Описание
0-3 адрес для загрузки сегмента
4-7 размер сегмента
8. далее идут данные сегмента

Завершающий блок:

Заполнен нулями для выравнивания до границы 16 байт минус 1 байт. После этого добавляется последний байт, представляющий собой контрольную сумму данных всех сегментов, вычисляемая функцией xor над всеми байтами и константой `0xEF`.

Формат прошивки взят из описания к утилите esptool.

Процесс запуска

Теперь, вооружившись этими знаниями, рассмотрим процесс старта модуля ESP8266 с точки зрения инициализации и запуска прошивки.

При подаче питания или поступлении сигнала сброса процессор начинает выполнение инструкций с адреса 40000080h (системный ROM). По адресу 40001308h располагается процедура, которая считывает блок 00000h flash и копирует сегменты, хранящиеся в ней по заданным адресам.


На схеме этот процесс показан фиолетовым цветом. Здесь видно, что часть прошивки является исполняемым кодом, а часть инициализирует данные в ОЗУ. Зеленым обозначен блок, напрямую подмапленный в адресное пространство процессора.

После всех инициализаций управление передается по адресу, указанному в заголовке прошивки. Обычно это адрес пользовательского кода 40100000h.

3. Инструменты

Что ж, теперь, когда мы разобрались с архитектурой и процедурой старта модуля ESP8266, давайте перейдем к изучению его программного кода. Какие ресурсы и инструменты у нас есть для этого?

Для разработки, сборки прошивок и выгрузки отладочной информации нам будет полезно развернуть среду разработки, как описано здесь.

Из традиционных инструментов воспользуемся IDA Pro и HIEW.

Для изучения кода процессора Xtensa необходимо использовать IDA Pro версии 6.6 и выше со встроенным интерпретатором питона для выполнения скриптов. В перечень стандартно поддерживаемых процессоров Xtensa не входит, поэтому каждый раз при запуске IDA Pro перед открытием исследуемого файла необходимо загружать скрипт “xtensa.py”, который можно взять здесь.

Также для автоматического создания сегментов и наименования функций системного ROM нам понадобится скрипт для IDA Pro. Скрипт и дамп системной прошивки можно скачать здесь.

HIEW будет полезен для исследования структуры ELF- и готовых двоичных файлов прошивки.

В следующей части мы рассмотрим процесс загрузки прошивки для исследования.

Читайте также: