Files
alexandClaude Sonnet 5 44d8c888fd Clarify: the AT-command interface was added by this fork, not upstream
Was previously worded as if AT support pre-existed and this fork only
fixed bugs in it. It was actually added from scratch here, specifically
for backward compatibility with software written for old ESP8266-based
ZiFi modules running Espressif's own AT firmware.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 16:17:26 +03:00

129 lines
9.6 KiB
Markdown

# Прошивка ESP32 (модуль ZiFi32 для ZX Evolution / TS-Conf)
Скомпилированная прошивка для WiFi/SPI-модуля на базе ESP32-S3,
используемого платформой ZX Evolution / TS-Conf ("Pentevo").
**Исходная база**: этот форк основан на
[tslabs/zx-evo](https://github.com/tslabs/zx-evo/tree/master/pentevo/esp32) —
полный исходный код лежит в `pentevo/esp32/src` рядом с этой папкой; в
`firmware/` — только готовые к прошивке бинарники.
## Требования
Прошивка ядра платы ZX Evolution/TS-Conf должна быть собрана с поддержкой
**VDAC2** и **ESP32 (ZiFi32)** — без этого ядро вообще не увидит модуль
ESP32 на шине SPI (независимо от того, насколько корректна прошивка самого
ESP32), а видеочип FT8xx работать не будет. Проверьте это, прежде чем
считать проблему подключения проблемой стороны ESP32.
**Перемычка RESET на разъёме IDE тоже должна быть установлена** — см.
`../hardware/connection_diagram.webp`.
## Что изменено относительно апстрима
Основная часть работы в этом форке — **мост VFS, открывающий реальную
SD-карту ZX Evolution как сетевую шару по SMB2/3**, чтобы любой клиент
Windows/macOS/Linux мог просматривать, скачивать, загружать и удалять
файлы на реальной файловой системе Wild Commander без извлечения карты.
Эта часть всё ещё **активно дорабатывается** — см. раздел "Статус" ниже.
Изменения, примерно в порядке внесения:
- **Подключена реальная файловая система.** SMB2-обработчики в
`vfs_bridge.cpp` (CREATE/READ/WRITE/CLOSE/QUERY_DIRECTORY/QUERY_INFO и
т.д.) теперь общаются с реальной файловой системой через небольшой мост
запрос/ответ (`vfs_request.cpp`) поверх существующей SPI-связи со
стороной Z80, вместо оригинальной захардкоженной демо-файловой системы.
- **Поддержка загрузки файлов (WRITE) и удаления** файлов и пустых
директорий, включая корректную обработку `FILE_DELETE_ON_CLOSE` и ответ
`SMB2_STATUS_DIRECTORY_NOT_EMPTY` при попытке удалить непустую
директорию.
- **Исправления листинга директорий**: поддержка пагинации
`SMB2_RETURN_SINGLE_ENTRY` (нужна собственному SMB2-клиенту `cmd.exe`, не
только Проводнику), недостающие не-"ID" классы информации о директории,
синтезированные записи `.`/`..`, и баг кодирования `NextEntryOffset` в
вендоренном `libsmb2`, молча портивший любой листинг длиннее двух
записей.
- **Исправление перечисления шар в `srvsvc`**: RPC-канал всегда сообщал
заглушку-имя шары `"test"` из Фазы 1 независимо от того, к чему реально
подключился клиент — исправлено на реальное имя шары.
- **Добавлена поддержка `SMB2_FILE_FS_VOLUME_INFORMATION`** (нужна голому
`dir`/`net use`; Проводник её не запрашивает, поэтому пропустили
изначально).
- **Исправления стабильности**: падение по нулевому указателю в обработке
named-pipe RPC transceive, и нулевая по длине SPI DMA-транзакция, которая
могла подвесить весь SPI-канал к стороне Z80.
- **Добавлен интерфейс AT-команд по UART** (`at_uart.cpp`/`at_cip.cpp`,
не связан с VFS/SMB, но тоже добавлен в этом форке) — для обратной
совместимости с программами, написанными под старые ZiFi-модули на
реальном ESP8266 с оригинальной прошивкой Espressif AT. Поддерживаются
кратко: `AT+RST`, `AT+GMR`, `AT+CWJAP`, `AT+CWLAP`, `AT+CIPSTART`,
`AT+CIPSEND`, `AT+CIPSNTPCFG`, `AT+CIPSNTPTIME`. Попутные исправления:
- `AT+CIPSTART` (и любая другая первая после загрузки сетевая AT-команда)
падал, если стек WiFi ещё не был поднят (мьютекс `tcpip_task` ещё не
создан) — исправлено ленивой инициализацией WiFi перед первой сетевой
командой.
- Ответ на `AT+GMR` добавлял `vTaskDelay(500ms)` перед содержимым — без
этой паузы реальный ZiFi-клиент на ZX Evolution иногда не успевал
захватить баннер на экран.
- Собственная нестандартная команда `AT+NET_NTP` заменена на реальные
команды спецификации ESP-AT `AT+CIPSNTPCFG`/`AT+CIPSNTPTIME`.
- **Патчи `libsmb2`** (вендорено в `src/third_party/libsmb2`):
- `SMB2_FSCTL_DFS_GET_REFERRALS` теперь отвечает
`STATUS_OBJECT_PATH_NOT_FOUND` вместо `STATUS_NOT_IMPLEMENTED` —
неверный код статуса отправлял Проводник Windows в шторм повторных
запросов ещё до попытки подключения к шаре.
- Разбор `SET_INFO` стал терпимым к классам информации, которые сервер
отдельно не реализует (пропускает сырой буфер вместо ошибки разбора) —
раньше жёсткая ошибка разбора здесь рвала *всё* TCP-соединение вместо
отказа только в этом одном запросе, что проявлялось как обрыв
Проводником копирования файла посередине с общей ошибкой.
- Возврат `-2` из `close_cmd` теперь отображается в ответе CLOSE как
`SMB2_STATUS_DIRECTORY_NOT_EMPTY` вместо общего
`STATUS_NOT_IMPLEMENTED`.
- **Упрощена авторизация** до обычных гостевых/анонимных сессий
(`authorize_handler` всегда успешен) — более ранняя попытка
принудительной NTLMv2 + подписи SMB2 оказалась не связана с уже
исправленным багом листинга, поэтому убрана как лишняя сложность.
- Убрано частое отладочное логирование каждого запроса, добавленное для
отлова описанных выше багов, заменено одной итоговой строкой на
соединение.
## Статус
SMB2/3-сервер (чтение, просмотр, загрузка, удаление) работает с реальными
клиентами Windows/Samba. **Работа всё ещё продолжается** — создание
директорий (`MKDIR`) пока не реализовано, перезапись существующего файла
более коротким содержимым не обрезает старый хвост, и нет поддержки
уведомлений об изменениях в реальном времени (`change_notify`), поэтому
Проводник может на мгновение показывать устаревший листинг до обновления.
Актуальное состояние конкретных обработчиков — в комментариях исходного
кода.
## Прошивка
Целевой чип: **ESP32-S3**. Через `esptool.py` напрямую:
```bash
esptool.py --chip esp32s3 -p COM5 -b 460800 write_flash \
--flash-mode dio --flash-freq 80m --flash-size detect \
0x0 bootloader.bin \
0x8000 partition-table.bin \
0x10000 esp-spi.bin
```
(замените `COM5` на реальный порт; `flasher_args.json` в этой папке
содержит те же смещения в собственном JSON-формате `idf.py` — для справки
или скриптов.)
Если собираете из исходников: ESP-IDF **v6.1** (не `v6.1-rc1`) —
`idf.py build flash`.
## Аппаратная часть
См. `../hardware/`:
- `connection_diagram.webp` — как этот модуль подключается к плате ZX
Evolution.
- `pcb_photo.jpg` — фото переходной платы.
- `gerber/` — Gerber-файлы переходной платы.