Добавить переносимый драйвер parallel NAND

This commit is contained in:
2026-09-04 12:22:21 +03:00
parent e163d9ba55
commit 20850b26df
22 changed files with 1430 additions and 0 deletions

88
c/parallel-nand/README.md Normal file
View File

@@ -0,0 +1,88 @@
# 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 бит.
## Подключение
В проект добавить:
```text
c/parallel-nand/src/parallel_nand.c
c/parallel-nand/src/parallel_nand_gas.c
```
Пути заголовков:
```text
c/parallel-nand/include
c/parallel-nand/ports/<нужный-порт>
```
И один аппаратный порт, например:
```text
c/parallel-nand/ports/stm32g474ce/parallel_nand_port_stm32g474ce.c
```
Минимальная инициализация:
```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](docs/MEMORY_GAS.md). Электрические соединения — в README
соответствующего порта и [docs/EMPTY_BOARD_PINOUT.md](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`.