89 lines
3.9 KiB
Markdown
89 lines
3.9 KiB
Markdown
# 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(),
|
||
¶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](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`.
|