3.9 KiB
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(),
¶llel_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.
Проверка первого запуска
- Запустить
parallel_nand_init(). - Через GAS проверить
0xE000 = 0x4E44. - Записать
2в0xE004(READ_ID). - Проверить
0xE00B = 0x002C,0xE00C = 0x00F1. - Записать номер страницы в
0xE005/0xE006, затем3в0xE004. - Дождаться
READY | PAGE_VALIDв0xE002. - Прочитать main из
0xE100..0xE4FF, OOB из0xE500..0xE51F.