Сохранить текущие изменения NAND и LED перед объединением веток

This commit is contained in:
2026-09-15 15:57:06 +03:00
parent 20dbc2c721
commit 698632ebf3
35 changed files with 1841 additions and 31 deletions

View File

@@ -1,13 +1,16 @@
# parallel-nand
Переносимый C99-драйвер асинхронной parallel NAND x8 и окно управления через
общее адресное пространство GAS. Первый профиль — Micron `MT29F1G08ABADA`:
2048+64 байта, 64 страницы в блоке, 1024 блока.
общее адресное пространство GAS. Есть профили Micron `MT29F1G08ABADA` и
Hynix `HY27UF084G2M` (512 MiB, 2048+64 байта, 64 страницы в блоке,
4096 блоков, ID `AD DC 80 95`).
Подготовлены аппаратные порты:
- `TMS320F2812` — XINTF Zone 6;
- `STM32F407VET6` — аппаратный FSMC NAND Bank 2;
- `STM32F103RCT6` — GPIO bit-bang, так как в LQFP64 FSMC недоступен;
- `STM32F103ZET6` — аппаратный FSMC NAND Bank 3;
- `STM32G474CEU6` — GPIO bit-bang для корпуса UFQFPN-48.
Ядро не зависит от HAL и транспорта GUI. STM32 HAL используется только в
@@ -55,6 +58,12 @@ void memory_init(void)
}
```
Для Hynix на STM32F103ZET6 используйте
`parallel_nand_port_stm32f103ze()` и
`parallel_nand_hy27uf084g2m_geometry`; распиновка и ограничения приведены в
[`ports/stm32f103ze/README.md`](ports/stm32f103ze/README.md). Порт RCT6
с GPIO bit-bang сохранён как отдельный вариант для корпуса LQFP64.
Диспетчер общего адресного пространства вызывает
`parallel_nand_gas_read()`/`parallel_nand_gas_write()` для адресов
`0xE000..0xE51F`. Для STM32 с `c/set-protocol/pcan_gas` дополнительно включить
@@ -67,10 +76,28 @@ void memory_init(void)
[docs/MEMORY_GAS.md](docs/MEMORY_GAS.md). Электрические соединения — в README
соответствующего порта и [docs/EMPTY_BOARD_PINOUT.md](docs/EMPTY_BOARD_PINOUT.md).
## PROGRAM и ERASE
- `parallel_nand_program_page()` записывает полную main-область и, при
необходимости, полную OOB-область страницы.
- `parallel_nand_erase_block()` стирает один физический блок.
- Перед изменением ядро проверяет заводской bad-block marker, на время операции
снимает `WP#`, ждёт `R/B#`, проверяет fail-бит статуса и снова включает
защиту при любом результате.
- Порт обязан объявить `write_supported = 1`; иначе возвращается
`PNAND_ERROR_WRITE_PROTECTED`. Это защищает платы, где `WP#` постоянно
соединён с GND.
- Через GAS разрушительные команды требуют записи `0xA55A` в `CONFIRM`
непосредственно перед `PROGRAM_PAGE` или `ERASE_BLOCK`.
NAND можно программировать только из `1` в `0`; для повторной записи сначала
стирается весь блок. Не стирайте заводские bad-блоки и не используйте raw-запись
как файловую систему без ECC, wear leveling и защиты загрузочных блоков.
## Текущие границы
- Реализовано безопасное чтение, RESET, READ ID, STATUS и bad-block marker.
- PROGRAM/ERASE намеренно отсутствуют; ядро включает аппаратную защиту `WP#`.
- Реализованы чтение, программирование страницы, стирание блока, RESET,
READ ID, STATUS и проверка bad-block marker.
- ECC пока не исправляет данные. GUI получает физические main/OOB и должен
помечать дамп как raw.
- В полном дампе bad-блоки не пропускаются: сохраняется физический порядок.
@@ -86,3 +113,5 @@ void memory_init(void)
5. Записать номер страницы в `0xE005/0xE006`, затем `3` в `0xE004`.
6. Дождаться `READY | PAGE_VALID` в `0xE002`.
7. Прочитать main из `0xE100..0xE4FF`, OOB из `0xE500..0xE51F`.
8. PROGRAM/ERASE проверять только на заведомо расходном блоке после сохранения
полного raw-дампа.