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.
 
Последнее редактирование:
Сверху Снизу