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

89 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.