parallel-nand

Переносимый C99-драйвер асинхронной parallel NAND x8 и окно управления через общее адресное пространство GAS. Есть профили Micron MT29F1G08ABADA и Hynix HY27UF084G2M (512 MiB, 2048+64 байта, 64 страницы в блоке, 4096 блоков, ID AD DC 80 95).

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

  • TMS320F2812 — XINTF Zone 6;
  • STM32F407VET6 — аппаратный FSMC NAND Bank 2;
  • STM32F103RCT6 — GPIO bit-bang, так как в LQFP64 FSMC недоступен;
  • 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);
}

Для Hynix на STM32F103RCT6 используйте parallel_nand_port_stm32f103rc() и parallel_nand_hy27uf084g2m_geometry; распиновка и ограничения приведены в ports/stm32f103rc/README.md.

Диспетчер общего адресного пространства вызывает 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.
Description
No description provided
Readme 1.3 MiB
Languages
C 72.3%
Python 16.7%
Kotlin 9.3%
CMake 0.9%
Batchfile 0.6%