Files
templates/c/parallel-nand/README.md

3.9 KiB
Raw Blame History

parallel-nand

Переносимый C99-драйвер асинхронной parallel NAND x8 и окно управления через общее адресное пространство GAS. Первый профиль — Micron MT29F1G08ABADA: 2048+64 байта, 64 страницы в блоке, 1024 блока.

Подготовлены аппаратные порты:

  • TMS320F2812 — XINTF Zone 6;
  • STM32F407VET6 — аппаратный FSMC NAND Bank 2;
  • STM32G474CEU6 — GPIO bit-bang для корпуса UFQFPN-48.

Ядро не зависит от HAL и транспорта GUI. STM32 HAL используется только в конкретных портах. parallel_nand_gas реализует переносимую 16-битную карту GAS и компилируется в том числе TI C28x, где char имеет 16 бит.

Подключение

В проект добавить:

c/parallel-nand/src/parallel_nand.c
c/parallel-nand/src/parallel_nand_gas.c

Пути заголовков:

c/parallel-nand/include
c/parallel-nand/ports/<нужный-порт>

И один аппаратный порт, например:

c/parallel-nand/ports/stm32g474ce/parallel_nand_port_stm32g474ce.c

Минимальная инициализация:

static parallel_nand_t nand;
static parallel_nand_gas_t nand_gas;

void memory_init(void)
{
    int rc = parallel_nand_init(&nand,
        parallel_nand_port_stm32g474ce(),
        &parallel_nand_mt29f1g08_geometry);
    if (rc != PNAND_OK) {
        /* Оставить диагностику доступной GUI и сообщить ошибку платы. */
    }

    parallel_nand_gas_init(&nand_gas, &nand, PNAND_GAS_DEFAULT_BASE);
}

Диспетчер общего адресного пространства вызывает parallel_nand_gas_read()/parallel_nand_gas_write() для адресов 0xE000..0xE51F. Для STM32 с c/set-protocol/pcan_gas дополнительно включить src/parallel_nand_pcan_gas.c, создать pcan_gas_region_t и вызвать parallel_nand_pcan_gas_region_init(). Этот адаптер намеренно не нужен TMS. Для полного дампа предпочтительны пакетные READ_REGISTERS/WRITE_REGISTERS, а classic CAN GAS оставлен для совместимости и коротких диагностических чтений.

Доступ GUI и алгоритм полного дампа описаны в docs/MEMORY_GAS.md. Электрические соединения — в README соответствующего порта и docs/EMPTY_BOARD_PINOUT.md.

Текущие границы

  • Реализовано безопасное чтение, RESET, READ ID, STATUS и bad-block marker.
  • PROGRAM/ERASE намеренно отсутствуют; ядро включает аппаратную защиту WP#.
  • ECC пока не исправляет данные. GUI получает физические main/OOB и должен помечать дамп как raw.
  • В полном дампе bad-блоки не пропускаются: сохраняется физический порядок.
  • Для другой NAND нужно передать другую parallel_nand_geometry_t и проверить команды/маркер по её datasheet.

Проверка первого запуска

  1. Запустить parallel_nand_init().
  2. Через GAS проверить 0xE000 = 0x4E44.
  3. Записать 2 в 0xE004 (READ_ID).
  4. Проверить 0xE00B = 0x002C, 0xE00C = 0x00F1.
  5. Записать номер страницы в 0xE005/0xE006, затем 3 в 0xE004.
  6. Дождаться READY | PAGE_VALID в 0xE002.
  7. Прочитать main из 0xE100..0xE4FF, OOB из 0xE500..0xE51F.