Добавить переносимый драйвер parallel NAND
This commit is contained in:
88
c/parallel-nand/README.md
Normal file
88
c/parallel-nand/README.md
Normal 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(),
|
||||
¶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`.
|
||||
Reference in New Issue
Block a user