Руководство пользователя Allwinner H616


  Описание    Система    Графика      Память      Ethernet    Видео    Аудио    Интерфейсы    Безопасность  

5. Память (Memory)

5.1. Контроллер SDRAM (DRAMC)

  5.2. Контроллер Nand Flash (NDFC)  

5.3. Хост-контроллер SD / MMC (SMHC)



Глава 5. Память - Memory
Раздел 5.2. Контроллер Nand Flash (NDFC) - Nand Flash Controller(NDFC)

5.2. Контроллер Nand Flash (NDFC)


5.2.1. Обзор

NDFC - это контроллер флэш-памяти NAND, который поддерживает всю флэш-память NAND, доступную на рынке. Флеш-память нового типа может поддерживаться путем изменения конфигурации программного обеспечения. Код исправления ошибок на лету (ECC) встроен в NDFC для повышения надежности. Реализован BCH, который может обнаруживать и исправлять до 80 ошибок на 1024 байта данных. Встроенная схема ECC и проверки четности NDFC освобождает CPU для других задач. Функцию ECC можно отключить программно. Данные могут быть переданы с помощью прямого доступа к памяти или методом ввода-вывода с отображением памяти ЦП. NDFC обеспечивает автоматический контроль времени для чтения или записи внешней Flash. NDFC поддерживает надлежащую относительность для линий управляющих сигналов CLE, CE # и ALE. Существует три различных режима доступа для последовательного чтения: mode0 - для обычного последовательного доступа, mode1 - для типа EDO, а mode2 - для расширенного типа EDO. NDFC может контролировать состояние сигнальной линии R / B #. Управление блоками и управление выравниванием износа реализовано программно. NDFC имеет следующие особенности:
  • Поддерживает все доступные на рынке флеш-память SLC / MLC / TLC и EF-NAND
  • Настройте рандомизацию начального числа двигателя с помощью программного обеспечения
  • Метод настройки программного обеспечения для различных типов системы и памяти
  • Поддерживает 2 выбора микросхемы и 2 сигнала готовности к работе
  • Ширина шины данных до 8 бит
  • Поддерживает размер 1024, 2048, 4096, 8192, 16384, 32768 байтов на страницу
  • Обычный и последовательный метод доступа EDO для последовательного чтения Flash
  • 80 бит / 1 КБ Проверка кода BCH на лету и исправление ошибок
  • Выводит информацию о количестве битов об исправленной ошибке
  • Функция автоматического отключения ECC для всех данных 0xff
  • Информация о состоянии NDFC передается его регистрами, поддерживается прерывание
  • One Command FIFO
  • Внутренний контроллер DMA на основе цепочечного списка дескрипторов
  • Два 256x32-битных RAM для конвейерной обработки
  • Поддерживает SDR, ONFI DDR1.0, Toggle DDR1.0, ONFI DDR2.0 и Toggle DDR2.0 RAW NAND FLASH
  • Максимальная частота ввода-вывода 50 МГц в режиме SDR и 60 МГц в режимах DDR1.0 и DDR2.0
  • Самостоятельная отладка для отладки NDFC


    5.2.2. Блок-схема

    Блок-схема NDFC показана ниже.

    Рисунок 5-1. Блок-схема NDFC.



    5.2.3. Операции и функциональное описание


    5.2.3.1

    Внешние сигналы

    В Таблице 5-1 описаны внешние сигналы NDFC. DQ0 ~ DQ7 и DQS - это двунаправленный ввод / вывод. WE, ALE, CLE, CE, RE - выходной контакт, RB - входной контакт. Вывод RB в устройстве NAND представляет собой драйвер с открытым стоком, для которого необходим подтягивающий резистор.


    5.2.3.2

    Источники часов

    Чтобы обеспечить эффективность ECC, механизм ECC и внутренняя логика NDFC используют разные часы. Тактовая частота внутренней логики NDFC задается регистром тактовой частоты NAND_0, тактовая частота механизма ECC устанавливается регистром тактовой частоты NAND_1. Обратите внимание, что регистр тактовой частоты NAND_0 устанавливает внутреннюю логическую тактовую частоту NDFC, но частота внешнего устройства NAND Flash составляет половину от NDFC внутренние логические часы. То есть, если внешняя Nand Flash работает на частоте 40 МГц, тогда NDFC необходимо установить на 80 МГц. И механизм ECC, и внутренняя логика NDFC имеют пять разных источников синхронизации. Пользователи могут выбрать один из них, чтобы сделать механизм ECC или источник внутренних логических часов. В Таблице 5-2 описаны источники синхронизации NDFC. Пользователи могут увидеть CCU в главе 3.3 для информации о настройке часов, конфигурации и стробировании.

    Таблица 5-2. Источники тактовой частоты NDFC

    Источники часов Описание

  • OSC24M Кристалл 24 МГц
  • PLL_PERIPH0 (1X) Периферийные часы, значение по умолчанию - 600 МГц
  • PLL_PERIPH1 (1X) Периферийные часы, значение по умолчанию - 600 МГц
  • PLL_PERIPH0 (2X) Периферийные часы, значение по умолчанию 1,2 ГГц
  • PLL_PERIPH1 (2X) Периферийные часы, значение по умолчанию - 1,2 ГГц


    5.2.3.3

    Временная диаграмма

    Обычно существует два вида методов последовательного доступа. Одним из методов является традиционный метод, который выбирает данные на переднем фронте сигнальной линии NDFC_RE #. Другой тип - EDO, который выбирает данные на следующем спадающем фронте сигнальной линии NDFC_RE #.

    Рисунок 5-2. Цикл обычного последовательного доступа (SAM0)



    Рисунок 5-3. Последовательный доступ типа EDO после цикла чтения (SAM1)



    Рисунок 5-4. Расширение режима последовательного доступа типа EDO (SAM2)



    Рисунок 5-5. Цикл фиксации команды


    Рисунок 5-6. Цикл фиксации адреса



    Рисунок 5-7. Цикл записи данных во флэш-память.



    Рисунок 5-8. Диаграмма ожидания R / B # Ready.



    Рис. 5-9. Временная диаграмма от WE # High до RE # Low.



    Рис. 5-10. Временная диаграмма RE # High - WE # Low.



    Рисунок 5-11. Временная диаграмма загрузки данных.


    Список временных циклов:


    ID Параметр Время (нс) Примечания

  • t1 Время установки NDFC_CLE 2T
  • t2 Время удержания NDFC_CLE 2T
  • t3 Время установки NDFC_CE 2T
  • t4 Время удержания NDFC_CE 2T
  • t5 NDFC_WE # ширина импульса T (1)
  • t6 NDFC_WE # время удержания T
  • t7 Время установки NDFC_ALE 2T
  • t8 Время установки данных T
  • t9 Время удержания данных T
  • t10 Готов к NDFC_RE # low 3T
  • t11 NDFC_ALE время удержания 2T
  • t12 NDFC_RE # ширина импульса T
  • t13 NDFC_RE # время удержания T
  • t14 Время цикла чтения 2T
  • t15 Время цикла записи 2T
  • t16 NDFC_WE # от высокого к R / B # занято T_WB (2) Задается регистром настройки синхронизации (NDFC_TIMING_CFG)
  • t17 NDFC_WE # high to NDFC_RE # low T_WHR (3) Задается регистром настройки синхронизации (NDFC_TIMING_CFG)
  • t18 NDFC_RE # high to NDFC_WE # low T_RHW (4) Задается регистром настройки синхронизации (NDFC_TIMING_CFG)
  • t19 Адрес для времени загрузки данных T_ADL (5) Задается регистром настройки синхронизации (NDFC_TIMING_CFG)

    Примечание (1): T - это цикл внутренних часов

    Примечание (2), (3), (4), (5): эти значения настраиваются в контроллере nand flash. Значение T_WB может быть 14 * 2T / 22 * ??2T / 30 * 2T / 38 * 2T, значение T_WHR может быть 0 * 2T / 6 * 2T / 14 * 2T / 22 * ??2T, значение T_RHW может быть 4 * 2T / 12 * 2T / 20 * 2T / 28 * 2T, значение T_ADL может быть 0 * 2T / 6 * 2T / 14 * 2T / 22 * ??2T.



    Рисунок 5-12. Диаграмма команд чтения страницы

    Рисунок 5-13. Диаграмма программы страницы

    Рисунок 5-14. Диаграмма чтения страницы EF-NAND

    Рисунок 5-15. Диаграмма чтения страницы с чередованием 5.2.3.4.

    Дескрипторы внутреннего контроллера DMA

    5.2.3.4.1. Структура дескриптора

    Внутренний контроллер DMA NDFC может передавать данные между DMA FIFO в NDFC и буфером DMA в памяти хоста, используя дескрипторы DMA. Дескрипторы DMA в памяти хоста с цепочечной структурой показаны на рисунке 5-16.

    Рисунок 5-16. Внутренняя структура цепочки дескрипторов DMA

    Начальный адрес списка дескрипторов DMA должен быть выровнен по слову (32 бита) и будет настроен как регистр базового адреса списка дескрипторов DMA NDFC. Каждый дескриптор DMA состоит из четырех слов (32-битных).

    5.2.3.4.2. Определение дескриптора

    Конфиг

    Бит Описание

  • 31: 4 /
  • 3 FIRST_FLAG Когда установлен, этот бит указывает, что этот дескриптор содержит первый буфер данных. В первом дескрипторе должно быть установлено значение 1.
  • 2 LAST_FLAG Когда установлен, этот бит указывает, что буферы, указанные этим дескриптором, являются последним буфером данных.
  • 1: 0 /
    Размер

    Бит Описание

  • 31:16 /
  • 15: 0 BUFF_SIZE Эти биты указывают размер байта буфера данных, который должен быть кратным 8 байтам. Если это поле равно 0, DMA игнорирует этот буфер и переходит к следующему дескриптору. Buff Addr

    Бит Описание

  • 31: 0 BUFF_ADDR Эти биты указывают физический адрес буфера данных DMA в памяти хоста. Адрес буфера должен быть выровнен на 4 байта.

    Следующее описание

    Бит Описание

  • 31: 0 NEXT_DESC_ADDR Эти биты указывают на наличие указателя на физическую память хоста следующего дескриптора.


    5.2.3.5

    Регистр маски блока данных NDFC

    ECC_DATA_BLOCK записывается или считывается через значение регистра маски блока данных NDFC. Но в реальном сценарии приложения емкость не может быть потрачена впустую, поэтому операция записи обычно не использует эту функцию, используется только операция чтения. При чтении мы разделяем режим последовательности и режим чередования на позицию сохранения user_data. Последовательный режим: user_data каждой 1K данных основной области и данные кодера ECC находятся рядом с данными основной области. Режим чередования: все данные кодировщика user_data и ECC хранятся с позиции page_size. Когда любой ECC_DATA_BLOCK на странице считывается с помощью пакетной команды (NDFC_CMD_TYPE в регистре 0x24 равен 0x10), регистр используется по-разному для режима последовательности и режима чередования. Последовательный режим может поддерживать только продолжение ECC_DATA_BLOCK, значение регистра может быть только 0x1,0x3,0x7 и т.д. Но режим чередования не имеет ограничений. Независимо от режима последовательности или режима чередования, первое чтение ECC_DATA_BLOCK используется для вычисления соответствующего адреса столбца, а адрес столбца записывается в регистры 0x14 и 0x18.


    5.2.3.6

    Регистр расширенных функций NDFC

    Бит [24] и бит [23:16] регистра используются для определения того, нужно ли заполнять свободное пространство случайными данными, за исключением достоверных данных, когда используется функция пакетной команды. В качестве примера возьмем микросхему SanDisk (SDTNQGAMA-008G): Обратитесь к спецификации чипа SanDisk, размер страницы чипа SanDisk составляет (16384 + 1280) байтов, но уровень BCH использует 40 бит / 1 КБ, если user_data составляет 32 байта, то используемое пространство составляет 1152 байта (14 * 40/8 * 16 + 32), 128 байтов (1280-1152) не записываются. Если необходимо заполнить 1 страницу, то бит [24] регистра может быть установлен в 1, а бит [23:16] записывается в 0x80, чтобы контроллер мог автоматически заполнять 128 байтов случайными данными.

    Примечание Убедитесь, что функция случайного выбора включена, если необходимо отправить случайные данные, то есть NDFC_RANDOM_EN регистра 0x34 равно 0x1, иначе данные заполнения не являются случайными, все равно 0.


    5.2.4. Рекомендации по программированию


    5.2.4.1

    Инициализация Nand Flash

    Флэш-память NAND инициализируется следующим образом:
  • Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 2. Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; напишите 0xFF в NDFC_CMD [NDFC_CMD_LOW_BYTE] для отправки команды сброса.
  • Шаг 3. Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания, Запишите 1, чтобы сбросить флаг.


    5.2.4.2

    Стирание Nand Flash

    NAND Flash стирается следующим образом:
  • Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 2. Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; Настройте NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи; Запишите адрес удаляемого блока в NDFC_ADDR_LOW и NDFC_ADDR_HIGH; Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x60 для отправки команды стирания блока.
  • Шаг 3: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания запишите 1, чтобы сбросить флаг.
  • Шаг 4: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 5: Установите NDFC_CMD [NDFC_WAIT_FLAG] в 1, чтобы гарантировать RB ожидания, установите NDFC_CMD [NDFC_SEND_FIRST_CMD] в 1, чтобы отправить первую команду; установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0xD0 для отправки команды стирания.
  • Шаг 6: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания введите 1, чтобы сбросить флаг.
  • Шаг 7. Считайте состояние флэш-памяти, пока флэш-память не будет готова, настройте NDFC_CNT [NDFC_DATA_CNT] для установки 1-байтовых данных передачи, установите NDFC_CMD [NDFC_SEND_FIRST_CMD, NDFC_DATA_TRANS] на 0x3, чтобы отправить первую команду и передать данные. Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x70 для отправки команды состояния чтения, прочтите RAM0_BASE, чтобы дождаться состояния готовности.


    5.2.4.3

    Запись Nand Flash

  • Шаг 1: Удалите адрес блока, который будет работать.
  • Шаг 2: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 3: Настройте RAM0_BASE для записи данных в RAM0.
  • Шаг 4: Настройте NDFC_CNT [NDFC_DATA_CNT] для установки передаваемых данных;
    - Установите NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_DATA_TRANS, NDFC_ACCESS_DIR] на 0x3, чтобы установить направление доступа как запись;
    - Установите NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи, запишите адрес блока, который будет работать, в NDFC_ADDR_LOW и NDFC_ADDR_HIGH;
    - Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x80 для отправки команды программы страницы.
  • Шаг 5: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 6: Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1, чтобы отправить первую команду, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; настройте NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x10 для отправки команды завершения.
  • Шаг 7: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания запишите 1, чтобы сбросить флаг.


    5.2.4.4

    Чтение Nand Flash

  • Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 2. Настройте NDFC_CNT [NDFC_DATA_CNT] для установки передаваемых данных;
    - Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды; Настройте NDFC_CMD [NDFC_ACCESS_DIR] на 0, чтобы установить направление доступа как чтение;
    - Установите NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи, запишите адрес блока, который будет работать, в NDFC_ADDR_LOW и NDFC_ADDR_HIGH;
    - Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x00 для отправки команды чтения страницы.
  • Шаг 3. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания.
  • Шаг 4: Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1, чтобы отправить первую команду, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; настройте NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x30 для отправки команды завершения.
  • Шаг 5: Прочтите RAM0_BASE, чтобы получить данные из флеш-памяти.
  • Шаг 6: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания введите 1, чтобы сбросить флаг.




  •    5.2.5. Список регистров