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

RTL871x Flash Memory Map

pvvx

Активный участник сообщества
RTL871x Flash Memory Map

В RTL8711АF/RTL8710АF SPI Flash MX25L8006E размером 1 МБ встроена в чип.
На модулях с RTL8195АM и RTL8711АM Flash от 2МБ выведена из чипа, а её место в чипе занимает 2 МБ SDRAM.

Общая глобальная таблица распределения данных в flash для стандартного устаревшего SDK и Ameba Arduino(!)*:
FlashMemoryMapGlobal.gif
Описание заголовков разделов (Images) можно посмотреть в документе UM0034 Realtek Ameba-1 memory layout.pdf
Потом, в данной теме, разберу подробнее и точнее.

Имеющиеся и раскиданные куски по форуму вокруг данной темы:
Boot - RTL8710AF - загрузчик в ROM-BIOS
Calibration data
flash_api


Далее разберем по пунктам. Буду дописывать в перерывах между своими делами.
А то на это Как работать с RTL8710/RTL00 just do it - страшно смотреть.

*Для стандартного устаревшего SDK и Ameba Arduino(!) - подразумевается, что данную разметку поддерживает только Ameba. Пользовательские прошивки и другие источники ПО на модуль могут иметь другую общую разметку и другие поля данных.

PS: При копировании и использовании информации из данной темы - обязательное указание на источник - в данном случае сайт - и на русском языке! :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Резерв для шапки - FAQ по этой ветке, т.к. в одно сообщение мало лезет.
Далее задаем вопросы и обсуждаем, спамим и не стесняемся :) Без "обратной связи" дело не пойдет.
Ссылки на важные сообщения всё равно скопирую в эти начальные два сообщения.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Сектор System Data.

Находится по адресу 0x9000 – 9-ый сектор Flash.
При изменении и записи, в некоторых процедурах, используется 8-ой сектор (адрес 0x8000) для бэкапа при неудачной перезаписи.
FlashMemoryMapSystemDataSDRAM.gif
Потом уточню все поля и их формат... А может платно? :)
Адресация описана в rtl8195a.h


Поле назначения I/O пинов для запуска Default Image в обход OTA Image:
FlashMemoryMapSystemDataPins1.gif
Если байт равен 0xFF – пин не задан.
Если старший бит в байте равен “1” (инверсия) – активное значение на входе пина принимается за “0” (Pull Low).
Номер пина кодируется как:
FlashMemoryMapSystemDataPinsBits.gif

Код:
int __attribute__((section(".hal.ram.text"))) IsForceLoadDefaultImg2(void) {
    u8 gpio_pin[4];
    HAL_GPIO_PIN GPIO_Pin;

    *((u32 *) &gpio_pin) = HAL_READ32(SPI_FLASH_BASE, FLASH_SYSTEM_DATA_ADDR + 0x08); // config data + 8
    int i = 0;
    _pHAL_Gpio_Adapter = (int) &gBoot_Gpio_Adapter;
    int result = 0;
    do {
        u8 x = gpio_pin[i];
        if (x != 0xff) {
            GPIO_Pin.pin_name = HAL_GPIO_GetIPPinName_8195a(x & 0x7F);
            u32 flg;
            if (x & 0x80) {
                GPIO_Pin.pin_mode = DIN_PULL_LOW;
                flg = 1;
            } else {
                GPIO_Pin.pin_mode = DIN_PULL_HIGH;
                flg = 0;
            }
            HAL_GPIO_Init_8195a(&GPIO_Pin);
            result = ((HAL_GPIO_ReadPin_8195a(&GPIO_Pin) - flg) <= 0);
            HAL_GPIO_DeInit_8195a(&GPIO_Pin);
        }
        ++i;
    } while (i < 2);
    _pHAL_Gpio_Adapter->IrqHandle.IrqFun = NULL;
    return result;
}
Т.е. в ПО от Ameba содержится ошибка. Если заданы 2 пина, то процедура не отработает по первому(!).
Назначение пинов и адреса OTA можно произвести в программе Image_Tool:
Image_Tool.gif

Калибровка SDRAM контроллера - это таблица до 8 значений по 8 байт (итого 64 байта). Каждое значение описывает установки для 6-ти вариантов частот CLK CPU (0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz, 6..7 - резерв). Если значение в таблице Flash пусто (поля равны 0xff), то запись таблицы производится при старте, после прохода "калибровки" на максимальную производительность с разгоном до появления ошибок в SDRAM. Если значение при старте уже записано и "валидно" - теста не производится, а используется это значение для установок SDRAM контроллера.
FlashMemoryMapSystemDataSDRAM.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
Сектор Calibration Data.

Находится по адресу 0xA000 – 10-ый сектор Flash.
Содержит информацию для драйвера WiFi. Распаковывается и переносится в массив из 512 байт в структуру [inline]_adapter.eeprompriv.efuse_eeprom_data[512];[/inline] поверх данных из eFuse. Внимание: Часть eFuse значений отображаются в регистрах REG_SYS_EFUSE_SYSCFGx - от них зависят ветвления инциализации старта в ROM-BIOS и НАL. Для конфигурации WiFi cначала читаются значения eFuse из OTP чипа (!), а поверх них распаковывается данный сектор.
Искать в нем что-то по смещению, как это делают зарубежные братия, не стоит. Запись в него производится с дозаписью измененных блоков до границы сектора. Кумулятивное сохранение тоже бывает в rtw_flash_map_write() – тогда братьям везет – в том случае MAC находится по заданному смещению, и то если данные стандартны и не добавлены в массив :)
FlashMemoryMapCalibrationData.gif
Обычно блоки записаны по 16 байт данных. Значения кусков таблицы заполненные 0xFF не сохраняются, сохраняются только отличные от 0xFF куски-блоки.
Начальные значения таблицы efuse_eeprom_data шифрованы в eFuse. Значения из Flash замешают их.
Код:
signed int rtw_flash_map_update(uint8_t *configTbl) {
    signed int result = 1;
    unsigned int i;
    uint16_t magic_number;
    uint16_t data_addr;
    uint16_t data_len;
    flash_t flash;

    device_mutex_lock(RT_DEV_LOCK_FLASH);
    flash_stream_read(&flash, FLASH_CAL_DATA_BASE, 2, &magic_number);
    if (magic_number == 0x8195) {
        i = 2;
        do {
            flash_stream_read(&flash, i + FLASH_CAL_DATA_BASE, 2, &data_addr);
            if (data_addr == 0xFFFF) break;
            flash_stream_read(&flash, i + FLASH_CAL_DATA_BASE + 2, 2, &data_len);
            if (data_len == 0xFFFF) break;
            if ((data_addr + data_len > 512) || (data_len > 512) || (data_addr > 512)) {
                result = 0;
                break;
            }
            flash_stream_read(&flash, i + FLASH_CAL_DATA_BASE +4, data_len,
                    &configTbl[data_addr]);
            i += data_len + 4;
        } while (i < FLASH_SECTOR_SIZE);
    } else result = 0;
    device_mutex_unlock(RT_DEV_LOCK_FLASH);
    return result;
}
Отдельная тема на сайте Calibration data и связанная с данным разделом Efuse RTL00.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Продолжение к Сектор System Data.

Калибровка SPIC контроллера
имеет 3 раздела для SIO, DIO и QIO по 6 значений CLK. Итого выходит таблица на 3*6 значений по 8 байт (итого 144 байта).

6 значений CLK берутся из REG_SYS_CLK_CTRL1. Если не установлен бит 17 в REG_SYS_SYSPLL_CTRL1, то это:
0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000* Hz
Если бит 17 в REG_SYS_SYSPLL_CTRL1 выставлен, то это:
0 - 200000000 Hz, 1 - 10000000 Hz, 2 - 50000000 Hz, 3 - 25000000 Hz, 4 - 12500000 Hz, 5 - 4000000* Hz

*4000000 - не уточнено, но явно частота другая - SDK врет.


Каждая запись состоит из 4 байт калибровочных значений и 4 байт XOR этих значений:
FlashMemoryMapSystemDataSPIC.gif

У прошивок от Ameba существуют проблемы со значениями в данной таблице. В зависимости от версии Boot-Loader-а и запускаемой Image, часто встречается комбинация, приводящая к зависанию системы сразу при старте. Для коррекции требуется прописать правильные значения в данную таблицу или использовать другой Boot-Loader и Startup код в Image (не от Ameba).

Для модeлей с MXIC Flash это такие значения:
FlashMemoryMapSystemDataSpicDef.gif
В таблице даны минимальные рабочие значения. SDK от Ameba ставит более медленную конфигурацию (от 72 тактов на чтение байта через SPIC в среднем при читаемом блоке от сотен байт). Простое увеличение или изменение значений приводит к зависанию. Существуют только определенные рабочие комбинации. Режима QIO у MXIC Flash нет и не разведен в чипе RTL871xAF.
 
Последнее редактирование:
Сверху Снизу