From 8bc1583805bcf24d3b0184ea728e3e38dce08e2d Mon Sep 17 00:00:00 2001 From: gromov_ia <1keyten1@gmail.com> Date: Fri, 2 Oct 2026 14:59:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=88=D0=B8=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=BE=D1=81=D1=82=D0=B0=20BL616=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20Tang=20Primer=2025K=20=D0=B8=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B0=D1=82=D0=BE=D1=80=20TangPr?= =?UTF-8?q?ogrammer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/: прошивка встроенного отладчика BL616 — составное USB-устройство 1209:C0CA: DirtyJTAG v3 (WinUSB через MS OS 2.0) + CDC-ACM UART к FPGA B3/C3; UART до 20 Мбод на DMA, JTAG до 30 МГц через аппаратный SPI; - bin/: загрузчик Sipeed (0x0) и штатная прошивка 2025030317 для отката; - gui/: TangProgrammer.exe (C# WinForms, .NET Framework 4) — загрузка FPGA в SRAM и во флеш-память, копия и стирание флеш-памяти FPGA, прошивка моста; светлая и тёмная тема; - scripts/: setup, build, flash, build_gui, make_portable, а также make_release и publish_release для релизов Gitea; - fpga_test/, tests/: тестовые проекты Gowin (loopback, stream) и тесты UART на Python; - tools/openFPGALoader/: openFPGALoader 1.1.1 для Windows x64. --- .gitattributes | 8 + .gitignore | 20 + CHANGELOG.md | 38 + CMakeLists.txt | 26 + Makefile | 10 + README.md | 284 +++ bin/README.md | 16 + ...l616_bootloader_0x20000_nano20k_signed.bin | Bin 0 -> 68976 bytes bin/bl616_fpga_partner_25kDock.bin | Bin 0 -> 88672 bytes defconfig | 10 + flash_prog_cfg.ini | 17 + fpga_test/loopback/build.tcl | 9 + fpga_test/loopback/loopback.cst | 5 + fpga_test/loopback/loopback.v | 8 + fpga_test/stream/build.tcl | 9 + fpga_test/stream/stream.cst | 5 + fpga_test/stream/stream.v | 40 + gui/Controls.cs | 793 +++++++ gui/MainForm.cs | 2034 +++++++++++++++++ gui/Support.cs | 433 ++++ gui/app.ico | Bin 0 -> 48266 bytes gui/app.manifest | 28 + gui/portable_readme.txt | 35 + restore_prog_cfg.ini | 10 + scripts/build.ps1 | 19 + scripts/build_gui.ps1 | 25 + scripts/common.ps1 | 42 + scripts/flash.ps1 | 72 + scripts/make_portable.ps1 | 80 + scripts/make_release.ps1 | 56 + scripts/publish_release.ps1 | 91 + scripts/setup.ps1 | 15 + src/board_overlay.h | 14 + src/board_tang25k.c | 92 + src/djtag.c | 426 ++++ src/djtag.h | 24 + src/hw.h | 38 + src/jtag_io.c | 329 +++ src/jtag_io.h | 39 + src/main.c | 59 + src/sys.c | 154 ++ src/sys.h | 29 + src/uart_bridge.c | 513 +++++ src/uart_bridge.h | 32 + src/usb_config.h | 60 + src/usb_desc.c | 190 ++ src/usb_desc.h | 36 + tests/uart_loopback_test.py | 88 + tests/uart_stream_test.py | 59 + tools/openFPGALoader/README.md | 19 + tools/openFPGALoader/bin/libftdi1.dll | Bin 0 -> 134552 bytes tools/openFPGALoader/bin/libgcc_s_seh-1.dll | Bin 0 -> 150537 bytes tools/openFPGALoader/bin/libstdc++-6.dll | Bin 0 -> 2659194 bytes tools/openFPGALoader/bin/libusb-1.0.dll | Bin 0 -> 244884 bytes tools/openFPGALoader/bin/libwinpthread-1.dll | Bin 0 -> 64574 bytes tools/openFPGALoader/bin/openFPGALoader.exe | Bin 0 -> 4269085 bytes tools/openFPGALoader/bin/zlib1.dll | Bin 0 -> 127291 bytes 57 files changed, 6439 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 bin/README.md create mode 100644 bin/bl616_bootloader_0x20000_nano20k_signed.bin create mode 100644 bin/bl616_fpga_partner_25kDock.bin create mode 100644 defconfig create mode 100644 flash_prog_cfg.ini create mode 100644 fpga_test/loopback/build.tcl create mode 100644 fpga_test/loopback/loopback.cst create mode 100644 fpga_test/loopback/loopback.v create mode 100644 fpga_test/stream/build.tcl create mode 100644 fpga_test/stream/stream.cst create mode 100644 fpga_test/stream/stream.v create mode 100644 gui/Controls.cs create mode 100644 gui/MainForm.cs create mode 100644 gui/Support.cs create mode 100644 gui/app.ico create mode 100644 gui/app.manifest create mode 100644 gui/portable_readme.txt create mode 100644 restore_prog_cfg.ini create mode 100644 scripts/build.ps1 create mode 100644 scripts/build_gui.ps1 create mode 100644 scripts/common.ps1 create mode 100644 scripts/flash.ps1 create mode 100644 scripts/make_portable.ps1 create mode 100644 scripts/make_release.ps1 create mode 100644 scripts/publish_release.ps1 create mode 100644 scripts/setup.ps1 create mode 100644 src/board_overlay.h create mode 100644 src/board_tang25k.c create mode 100644 src/djtag.c create mode 100644 src/djtag.h create mode 100644 src/hw.h create mode 100644 src/jtag_io.c create mode 100644 src/jtag_io.h create mode 100644 src/main.c create mode 100644 src/sys.c create mode 100644 src/sys.h create mode 100644 src/uart_bridge.c create mode 100644 src/uart_bridge.h create mode 100644 src/usb_config.h create mode 100644 src/usb_desc.c create mode 100644 src/usb_desc.h create mode 100644 tests/uart_loopback_test.py create mode 100644 tests/uart_stream_test.py create mode 100644 tools/openFPGALoader/README.md create mode 100644 tools/openFPGALoader/bin/libftdi1.dll create mode 100644 tools/openFPGALoader/bin/libgcc_s_seh-1.dll create mode 100644 tools/openFPGALoader/bin/libstdc++-6.dll create mode 100644 tools/openFPGALoader/bin/libusb-1.0.dll create mode 100644 tools/openFPGALoader/bin/libwinpthread-1.dll create mode 100644 tools/openFPGALoader/bin/openFPGALoader.exe create mode 100644 tools/openFPGALoader/bin/zlib1.dll diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..65df984 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +* text=auto + +*.bin binary +*.exe binary +*.dll binary +*.ico binary +*.fs binary +*.zip binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f86734 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# SDK и тулчейн: scripts\setup.ps1 скачивает их сюда (~2.4 ГБ) +/third_party + +# Сборка прошивки моста, программы и релиза +build/ +build_log.txt +dist/ +/TangProgrammer.exe +*.pdb + +# Дампы флеш-памяти конкретной платы +backup/ + +# Вывод Gowin для тестовых битстримов (fpga_test\*\build.tcl) +fpga_test/*/impl/ +fpga_test/*/*.gprj* + +# Python +__pycache__/ +*.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..87c097c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,38 @@ +# Изменения + +## v1.0.0 — 2026-10-01 + +Первый выпуск. + +**Прошивка моста BL616** (`tang25k_debugger_bl616.bin`, версия 1.0.0) + +* Составное USB-устройство `1209:C0CA`: DirtyJTAG v3 (WinUSB ставится сам, + без Zadig) + CDC-ACM UART к пинам FPGA B3/C3; работают одновременно. +* UART от 300 бод до 20 Мбод, 5–8 бит, чётность none/odd/even, 1/1.5/2 + стоп-бита. Проверено 9600 … 12 Мбод в обе стороны без потерь, поток + FPGA → ПК 10 Мбод непрерывно 30 с без ошибок. +* JTAG до 30 МГц, длинные сдвиги через аппаратный SPI. Загрузка GW5A-25 в + SRAM ≈ 2 с при 6 МГц, запись во флеш-память FPGA с проверкой ≈ 8 с. +* Обход особенностей BL616: зависание приёмника UART при смене скорости + посреди байта, запись `usbser.sys` без завершающего ZLP, потеря ZLP на IN. +* Переход в загрузчик без перемычки: открыть COM-порт моста на 1234 бод или + держать S3 при подключении USB. + +Пишется вместе с загрузчиком Sipeed: `bl616_bootloader_0x20000_nano20k_signed.bin` +по адресу `0x0`, прошивка моста по адресу `0x20000`. Откат — +`bl616_fpga_partner_25kDock.bin` (штатная Sipeed 2025030317) по адресу `0x0`. + +**Программатор TangProgrammer** (Windows 10/11 x64, .NET Framework 4) + +* FPGA: загрузка `.fs` в SRAM и во флеш-память, автозагрузка при пересборке + в Gowin IDE, перезапуск из флеш-памяти. +* Флеш-память FPGA: определение микросхемы, резервная копия с двойным чтением, + запись `.bin`/`.fs`, стирание. +* Прошивка моста BL616 и возврат штатной прошивки Sipeed. +* Светлая и тёмная тема. + +**Тестовые битстримы** для GW5A-25: `loopback.fs` (петля UART) и `stream.fs` +(поток 10 Мбод) — к `tests\uart_loopback_test.py` и `tests\uart_stream_test.py`. + +**Ограничения:** Gowin Programmer с этой прошивкой не работает (только +openFPGALoader); `--unprotect-flash` с флеш-памятью XTX на плате не использовать. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0467537 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.15) + +find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE}) + +# The SDK adds -save-temps/-fstack-usage to every object. They only produce +# extra files and make Windows builds (antivirus scanning) many times slower. +get_target_property(_sdk_opts sdk_intf_lib INTERFACE_COMPILE_OPTIONS) +list(REMOVE_ITEM _sdk_opts "-save-temps=obj" "-fstack-usage") +set_target_properties(sdk_intf_lib PROPERTIES INTERFACE_COMPILE_OPTIONS "${_sdk_opts}") + +# src/ holds board_overlay.h, which replaces the SDK bl616dk board.c/board.h +sdk_add_include_directories(src) +sdk_add_compile_definitions(-DCONFIG_USB_HS) + +target_sources(app PRIVATE + src/board_tang25k.c + src/usb_desc.c + src/djtag.c + src/jtag_io.c + src/uart_bridge.c + src/sys.c +) + +sdk_set_main_file(src/main.c) + +project(tang25k_debugger) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9b46cfb --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +SDK_DEMO_PATH ?= $(abspath .) +BL_SDK_BASE ?= $(SDK_DEMO_PATH)/third_party/bouffalo_sdk + +export BL_SDK_BASE + +CHIP ?= bl616 +BOARD ?= bl616dk +CROSS_COMPILE ?= riscv64-unknown-elf- + +include $(BL_SDK_BASE)/project.build diff --git a/README.md b/README.md new file mode 100644 index 0000000..c76baf9 --- /dev/null +++ b/README.md @@ -0,0 +1,284 @@ +# Прошивка отладчика BL616 для Tang Primer 25K + +Замена штатной прошивки встроенного отладчика (BL616) на плате **Sipeed Tang +Primer 25K Dock**. Вместо эмуляции FT2232 плата становится составным +USB-устройством из двух независимых функций: + +| Функция | Что это | Драйвер Windows | +|---|---|---| +| **JTAG** | DirtyJTAG v3 (`1209:C0CA`, интерфейс 0) для `openFPGALoader -c dirtyJtag` | WinUSB, ставится сам (MS OS 2.0) — Zadig не нужен | +| **UART** | CDC-ACM, обычный COM-порт к пинам FPGA **B3/C3** | встроенный `usbser.sys` | + +Оба работают одновременно: можно грузить битстрим, не закрывая терминал. + +## Скачать + +Готовые файлы — в [релизах](http://gitea.vector.ru/Gromov_IA/BL616-firmware/releases): + +| Файл | Что это | +|---|---| +| `TangProgrammer-<версия>-win64.zip` | **программатор с окном** — распаковать и запустить, внутри всё нужное (openFPGALoader, BLFlashCommand, прошивки моста) | +| `TangProgrammer.exe` | только программа — для клона этого репозитория (рядом должна быть папка `tools\`) | +| `tang25k_debugger_bl616.bin` | прошивка моста, пишется по адресу `0x20000` | +| `bl616_bootloader_0x20000_nano20k_signed.bin` | загрузчик Sipeed, пишется по адресу `0x0` вместе с прошивкой моста | +| `bl616_fpga_partner_25kDock.bin` | штатная прошивка Sipeed (`0x0`) — для отката | +| `fpga_test_bitstreams-GW5A-25.zip` | тестовые битстримы `loopback.fs` и `stream.fs` для проверки UART | +| `SHA256SUMS.txt` | контрольные суммы | + +Чтобы только пользоваться платой, достаточно архива `TangProgrammer-…-win64.zip`: +он прошивает и мост (один раз), и FPGA. SDK и сборка не нужны. + +## Что получилось (проверено на плате) + +| | | +|---|---| +| UART, скорости | любые от 300 бод до 20 Мбод (делитель от 160 МГц); проверено 9600 … **12 Мбод в обе стороны без единой потери** | +| UART, формат | 5–8 бит, чётность none/odd/even, 1 / 1.5 / 2 стоп-бита | +| UART, поток FPGA → ПК | 10 Мбод непрерывно (1 МБ/с) 30 с — 0 ошибок; точность частоты подтверждена генератором FPGA | +| UART, ПК → FPGA | управление потоком по USB (NAK), данные не теряются при любой скорости | +| UART, буфер | кольцевой DMA-буфер 64 КБ на приём, 16 КБ на передачу | +| JTAG | `--detect` за ~40 мс; загрузка GW5A-25 в SRAM ≈ 2 с при 6 МГц | +| JTAG, частота | до 30 МГц; длинные сдвиги идут через аппаратный SPI BL616 | + +Стресс-тест: сотни прогонов петли с произвольными скоростями и объёмами — без ошибок. + +## Как это устроено + +**Загрузка.** У BL616 на этих платах прожжён eFuse: ROM запускает с адреса +`0x0` только образ, зашифрованный ключом Sipeed. Поэтому по `0x0` пишется +загрузчик Sipeed (`bin/bl616_bootloader_0x20000_nano20k_signed.bin`, +выпущен Sipeed для Nano 20K; ключ у всех плат серии общий — проверено +сравнением шифротекстов штатных прошивок), а он безусловно передаёт +управление нашей прошивке по `0x20000`. + +**Распиновка BL616** (схема `Tang_25K_60033`): + +| Сигнал | BL616 | FPGA | +|---|---|---| +| TMS | GPIO0 | B1 | +| TCK | GPIO1 | C1 | +| TDO | GPIO2 (он же BOOT) | A2 | +| TDI | GPIO3 | A3 | +| UART TX (ПК → FPGA) | GPIO11 | **B3** (`uart_rx` в FPGA) | +| UART RX (FPGA → ПК) | GPIO10 | **C3** (`uart_tx` в FPGA) | +| светодиод LED5 | GPIO20 | — | +| кнопка S3 | GPIO12 | — | + +Кварц BL616 на Dock — **26 МГц** (а не 40 МГц, как в SDK по умолчанию). + +**Почему штатный UART работал плохо, а этот нет** — коротко о найденных +особенностях BL616, которые обходит прошивка: + +* приёмник UART BL616 намертво зависает, если сменить скорость посреди + приходящего байта (типичная ситуация: FPGA уже шлёт данные, а терминал + открывается на другой скорости); сброс бита EN, как делает SDK, не + помогает — прошивка делает полный программный сброс блока UART1 при + каждой реальной смене параметров и держит сторожевой таймер; +* `usbser.sys` пишет порциями, кратными 512 байтам, без завершающего + нулевого пакета — приём ведётся строго по одному пакету; +* нулевой пакет (ZLP) на IN, запрошенный пока прошлый пакет ещё в FIFO, + теряется — передачи к ПК всегда заканчиваются коротким пакетом. + +## Установка (один раз) + +1. Закройте Gowin Programmer / BouffaloLabDevCube, если они открыты. +2. Отключите USB-C (JTAG/UART) от платы. +3. Замкните тестовые точки **TDO** и **3V3** (нижняя сторона Dock, левый + верхний угол), подключите USB, разомкните. Появится устройство + «Bouffalo CDC DEMO» (COM-порт). +4. Прошейте мост одним из способов: + * **TangProgrammer** из релиза: вкладка «Прошивка моста (BL616)» → + «Записать прошивку моста»; + * из исходников (нужны `scripts\setup.ps1` и `scripts\build.ps1`): + ```powershell + .\scripts\flash.ps1 + ``` + *(пишет загрузчик Sipeed из `bin\` и собранную прошивку моста + `build\build_out\tang25k_debugger_bl616.bin`)*; + * вручную, BouffaloLabDevCube или BLFlashCommand: файлы из релиза, + `bl616_bootloader_0x20000_nano20k_signed.bin` по адресу `0x0` и + `tang25k_debugger_bl616.bin` по адресу `0x20000`. +5. Переподключите USB. Появятся «DirtyJTAG» и новый COM-порт. + +Перед первой прошивкой стоит сохранить полный дамп флеш-памяти BL616 +(плата в загрузчике, как в шаге 3): +```powershell +.\third_party\bouffalo_sdk\tools\bflb_tools\bouffalo_flash_cube\BLFlashCommand.exe --interface=uart --baudrate=2000000 --port=COMxx --chipname=bl616 --cpu_id= --flash --read --start=0x0 --len=0x400000 --file=backup\flash_full_4M.bin +``` +Папка `backup\` в git не попадает. + +## Обновление прошивки + +```powershell +.\scripts\build.ps1 +.\scripts\flash.ps1 +``` +`flash.ps1` сам переводит работающую прошивку в загрузчик (открывает её +COM-порт на «магической» скорости **1234 бод**) и прошивает. После записи +**переподключите USB** — флаг «загрузиться в ISP» живёт до снятия питания. + +Другие способы попасть в загрузчик: держать **S3** при подключении USB +(если эта прошивка уже стоит) или перемычка TDO→3V3 (работает всегда). + +## Возврат штатной прошивки Sipeed + +```powershell +.\scripts\flash.ps1 -Restore +``` +(или в TangProgrammer: «Вернуть штатную прошивку Sipeed»). Пишет `bin/bl616_fpga_partner_25kDock.bin` (версия 2025030317, sha256 +`1be5c1f9…aacd`) — ровно то, что стояло на плате. + +## Программатор с окном: `TangProgrammer.exe` + +Замена Gowin Programmer поверх openFPGALoader, без консоли. Готовая программа — +архив `TangProgrammer-…-win64.zip` из релиза; в клоне репозитория её собирает +`.\scripts\build_gui.ps1` (появляется `TangProgrammer.exe` в корне, рядом с +`tools\`). Ничего ставить не нужно (.NET Framework 4 есть в Windows). Вверху окна — состояние моста +(подключён / загрузчик BL616 / штатная прошивка / нет платы), оно +обновляется само при подключении USB. + +**Вкладка «FPGA»** +* битстрим `.fs` выбирается кнопкой «Обзор…» (Ctrl+O), из списка последних или + перетаскиванием в окно; под полем — модель FPGA из файла, размер и время + сборки (предупреждение, если файл собран не для GW5A-25); +* «Загрузить в SRAM» (F5) — до отключения питания; «Записать во Flash» — во + внешнюю флеш-память FPGA, с проверкой; +* «Загружать в SRAM автоматически, когда файл пересобран» — для работы вместе с + Gowin IDE: после каждой сборки новый `.fs` сразу попадает в FPGA; +* «Определить FPGA», «Перезапуск из Flash» (FPGA заново грузится из своей + флеш-памяти, как после включения питания). + +**Вкладка «Флеш-память FPGA»** — определение микросхемы (на этой плате XTX, +JEDEC `0B4017`, 8 МБ), резервная копия в `.bin` (первый 1 МБ с конфигурацией +или вся микросхема; по умолчанию читается дважды и сравнивается), запись +`.bin`/`.fs` во флеш (пустой хвост 0xFF не пишется) и стирание всей микросхемы. +Время на этой плате: запись `.fs` с проверкой ≈ 8 с, копия 1 МБ ≈ 3 с на одно +чтение, стирание ≈ 13 с. + +**Вкладка «Прошивка моста (BL616)»** — то же, что `scripts\flash.ps1`: записать +прошивку моста или вернуть штатную Sipeed. + +Справа вверху — тема: как в Windows, светлая или тёмная. Настройки хранятся в +`%LOCALAPPDATA%\Tang25kProgrammer\settings.ini`. Пересборка программы: +`.\scripts\build_gui.ps1` (исходники — в `gui\`). + +Если запись во флеш-память FPGA прервалась с ошибкой, программа сама повторяет +её один раз: недописанная флеш-память означает, что FPGA не загрузится при +включении. + +**На другой компьютер** — архив из релиза или свой: +`.\scripts\make_portable.ps1` собирает `dist\TangProgrammer\` и +`dist\TangProgrammer.zip` (≈ 14 МБ) — программа, openFPGALoader, BLFlashCommand +(только exe и `chips\` вместо 238 МБ папки SDK), прошивки моста и памятка +`README.txt`. Распаковать в любую папку, куда можно писать (не в Program Files), +и запустить `TangProgrammer.exe`. Нужна Windows 10/11 x64; драйверы для платы +Windows ставит сама. + +## Использование из консоли + +JTAG — нужен **openFPGALoader ≥ 1.1.0** (в 1.1.0 исправлена работа DirtyJTAG +с GW5A). Готовая сборка для Windows лежит в `tools\openFPGALoader\bin`. + +```powershell +$ofl = ".\tools\openFPGALoader\bin\openFPGALoader.exe" +& $ofl -c dirtyJtag --detect # GW5A-25, idcode 0x0001281b +& $ofl -c dirtyJtag design.fs # загрузить битстрим в SRAM (до отключения питания) +& $ofl -c dirtyJtag --freq 15M design.fs # загрузить в SRAM быстрее +& $ofl -c dirtyJtag -f design.fs # прошить битстрим во внешнюю флеш-память FPGA (навсегда) +& $ofl -c dirtyJtag --dump-flash --file-size 1048576 copy.bin # копия первого 1 МБ флеш-памяти FPGA +& $ofl -c dirtyJtag -f copy.bin # записать образ обратно (с адреса 0) +& $ofl -c dirtyJtag --bulk-erase # стереть всю флеш-память FPGA +``` +`--unprotect-flash` с этой микросхемой флеш-памяти не использовать: её нет в +справочнике openFPGALoader 1.1.1, и эта функция на ней падает. Защита записи +(биты BP) на плате и так снята. + +UART — любой терминал или pyserial на появившемся COM-порту, скорость и +формат задаются как обычно. При открытии порта (DTR=1) накопленные за время +простоя данные сбрасываются, как у FTDI. + +**Gowin Programmer эта прошивка не поддерживает** (он работает только с FTDI). +Для него — `flash.ps1 -Restore`. + +## Сборка из исходников + +```powershell +.\scripts\setup.ps1 # Bouffalo SDK v2.3.16 + тулчейн T-Head в third_party\ +.\scripts\build.ps1 # build\build_out\tang25k_debugger_bl616.bin +``` +Если проект лежит на сетевом диске, который смотрит на эту же машину +(например `D:` → `\\PC\Projects`), скрипты сами собирают по локальному пути +— через SMB сборка в десятки раз медленнее. + +## Тесты + +`fpga_test\` — два тестовых проекта Gowin (готовые `.fs` есть в релизе): + +* `loopback` — `uart_tx = uart_rx`, петля на любой скорости; +* `stream` — FPGA сама шлёт счётчик на ровно 10 Мбод. + +Сборка — из папки проекта, например: +```powershell +cd fpga_test\loopback; & C:\Gowin\Gowin_V1.9.12_x64\IDE\bin\gw_sh.exe build.tcl; cd ..\.. +``` + +```powershell +& $ofl -c dirtyJtag fpga_test\loopback\impl\pnr\loopback.fs +python tests\uart_loopback_test.py --port COM14 +& $ofl -c dirtyJtag fpga_test\stream\impl\pnr\stream.fs +python tests\uart_stream_test.py --port COM14 --seconds 30 --switches 10 +``` + +## Выпуск релиза + +1. Поднять `FW_VERSION_STR` в `src/sys.h` и описать изменения в `CHANGELOG.md`. +2. Собрать прошивку и тестовые битстримы, затем файлы релиза: + ```powershell + .\scripts\build.ps1 + .\scripts\make_release.ps1 # dist\release\v<версия>\ + SHA256SUMS.txt + ``` +3. Закоммитить, поставить тег и отправить: + ```powershell + git tag -a v1.0.0 -m "v1.0.0" + git push origin main v1.0.0 + ``` +4. Опубликовать релиз с файлами — нужен токен Gitea с правом + `write:repository` (Настройки → Приложения → Создать токен): + ```powershell + $env:GITEA_TOKEN = "<токен>" + .\scripts\publish_release.ps1 + ``` + Или вручную: «Релизы» → «Новый релиз» → тег, текст из `CHANGELOG.md`, + файлы из `dist\release\v<версия>\`. + +## Ограничения + +* Gowin Programmer не работает (только openFPGALoader). +* Чётность mark/space не поддерживается аппаратно (передаётся как «нет»). +* DTR/RTS и BREAK не выведены на FPGA — на плате нет таких линий. +* Нулевой пакет на JTAG-IN не отправляется: клиенты DirtyJTAG читают ответ + известной длины. + +## Структура + +``` +src/ прошивка (main, JTAG, UART-мост, USB-дескрипторы, плата) +gui/ исходники TangProgrammer.exe (C# WinForms, .NET Framework 4) +bin/ загрузчик Sipeed и штатная прошивка для отката +scripts/ setup / build / flash / build_gui / make_portable / make_release / publish_release +fpga_test/ тестовые проекты Gowin (loopback, stream) +tests/ тесты UART на Python (pyserial) +tools/ openFPGALoader 1.1.1 для Windows +``` + +Не в git (создаются скриптами): + +``` +third_party/ Bouffalo SDK и тулчейн (setup.ps1) +build/ сборка прошивки моста: build\build_out\tang25k_debugger_bl616.bin (build.ps1) +dist/ переносная версия программы и файлы релиза (make_portable.ps1, make_release.ps1) +backup/ дампы флеш-памяти своей платы +``` + +Диагностика: vendor-запрос `0x42` к устройству (`bmRequestType=0xC0`) +возвращает версию, частоту JTAG, скорость UART и счётчики байт. diff --git a/bin/README.md b/bin/README.md new file mode 100644 index 0000000..aa00cda --- /dev/null +++ b/bin/README.md @@ -0,0 +1,16 @@ +# Образы Sipeed для BL616 + +Не собираются из этого репозитория — взяты у Sipeed как есть. Нужны для +прошивки моста (`flash_prog_cfg.ini`, `restore_prog_cfg.ini`). + +| Файл | Адрес | Зачем | +|---|---|---| +| `bl616_bootloader_0x20000_nano20k_signed.bin` | `0x0` | загрузчик, зашифрованный ключом Sipeed: ROM с прожжённым eFuse запускает только такие образы. Безусловно передаёт управление на `0x20000`, где лежит наша прошивка | +| `bl616_fpga_partner_25kDock.bin` | `0x0` | штатная прошивка отладчика Tang Primer 25K Dock (эмуляция FT2232), версия 2025030317 — для отката (`scripts\flash.ps1 -Restore`) | + +SHA-256: + +``` +1b5d0ed698a3f2bf0b9d4f72d242868da993e737bbea0c8288267b69b73fbc12 bl616_bootloader_0x20000_nano20k_signed.bin +1be5c1f99270ccc483b5570bec01d877e22902c8b402141f6eeb4ac5b745aacd bl616_fpga_partner_25kDock.bin +``` diff --git a/bin/bl616_bootloader_0x20000_nano20k_signed.bin b/bin/bl616_bootloader_0x20000_nano20k_signed.bin new file mode 100644 index 0000000000000000000000000000000000000000..7742abe76203afa209c8e4496acc522f1e84499d GIT binary patch literal 68976 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∾+zEv9`B3vpbJC(BjG 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 S*3JOlxpy|;mrJDWa!zlmH;sk> literal 0 HcmV?d00001 diff --git a/defconfig b/defconfig new file mode 100644 index 0000000..5a11545 --- /dev/null +++ b/defconfig @@ -0,0 +1,10 @@ +CONFIG_CHERRYUSB =y +CONFIG_CHERRYUSB_DEVICE =y +CONFIG_CHERRYUSB_DEVICE_CDC_ACM =y + +CONFIG_NEWLIB =n +CONFIG_NEWLIB_STANDARD =n +CONFIG_VSNPRINTF_NANO =y +CONFIG_BFLB_LOG =n +CONFIG_COREDUMP =n +CONFIG_TLSF =y diff --git a/flash_prog_cfg.ini b/flash_prog_cfg.ini new file mode 100644 index 0000000..cad7b0e --- /dev/null +++ b/flash_prog_cfg.ini @@ -0,0 +1,17 @@ +[cfg] +# 0: no erase, 1: programmed section erase, 2: chip erase +erase = 1 +# skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated +skip_mode = 0x0, 0x0 +# 0: not use isp mode, #1: isp mode +boot2_isp_mode = 0 + +# Sipeed-encrypted stage-1 loader: the eFuse secure boot only runs images +# encrypted with Sipeed's key at 0x0. It unconditionally jumps to 0x20000. +[bootloader] +filedir = ./bin/bl616_bootloader_0x20000_nano20k_signed.bin +address = 0x0 + +[FW] +filedir = ./build/build_out/tang25k_debugger_$(CHIPNAME).bin +address = 0x20000 diff --git a/fpga_test/loopback/build.tcl b/fpga_test/loopback/build.tcl new file mode 100644 index 0000000..ed04842 --- /dev/null +++ b/fpga_test/loopback/build.tcl @@ -0,0 +1,9 @@ +# gw_sh build.tcl (run from this directory) +set_device -name GW5A-25A GW5A-LV25MG121NC1/I0 +add_file -type verilog loopback.v +add_file -type cst loopback.cst +set_option -top_module loopback +set_option -output_base_name loopback +set_option -use_sspi_as_gpio 1 +set_option -use_cpu_as_gpio 1 +run all diff --git a/fpga_test/loopback/loopback.cst b/fpga_test/loopback/loopback.cst new file mode 100644 index 0000000..5f2b374 --- /dev/null +++ b/fpga_test/loopback/loopback.cst @@ -0,0 +1,5 @@ +IO_LOC "uart_rx" B3; +IO_LOC "uart_tx" C3; + +IO_PORT "uart_rx" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3; +IO_PORT "uart_tx" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3; diff --git a/fpga_test/loopback/loopback.v b/fpga_test/loopback/loopback.v new file mode 100644 index 0000000..2a75873 --- /dev/null +++ b/fpga_test/loopback/loopback.v @@ -0,0 +1,8 @@ +// UART loopback for testing the BL616 bridge: everything the PC sends to the +// serial port comes straight back, at any baud rate / format. +module loopback ( + input wire uart_rx, // B3, driven by BL616 GPIO11 (TX) + output wire uart_tx // C3, read by BL616 GPIO10 (RX) +); + assign uart_tx = uart_rx; +endmodule diff --git a/fpga_test/stream/build.tcl b/fpga_test/stream/build.tcl new file mode 100644 index 0000000..6e6efb4 --- /dev/null +++ b/fpga_test/stream/build.tcl @@ -0,0 +1,9 @@ +# gw_sh build.tcl (run from this directory) +set_device -name GW5A-25A GW5A-LV25MG121NC1/I0 +add_file -type verilog stream.v +add_file -type cst stream.cst +set_option -top_module stream +set_option -output_base_name stream +set_option -use_sspi_as_gpio 1 +set_option -use_cpu_as_gpio 1 +run all diff --git a/fpga_test/stream/stream.cst b/fpga_test/stream/stream.cst new file mode 100644 index 0000000..d519643 --- /dev/null +++ b/fpga_test/stream/stream.cst @@ -0,0 +1,5 @@ +IO_LOC "clk" E2; +IO_LOC "uart_tx" C3; + +IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=NONE BANK_VCCIO=3.3; +IO_PORT "uart_tx" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3; diff --git a/fpga_test/stream/stream.v b/fpga_test/stream/stream.v new file mode 100644 index 0000000..9eca7a0 --- /dev/null +++ b/fpga_test/stream/stream.v @@ -0,0 +1,40 @@ +// Continuous UART stream from the FPGA at exactly 10 Mbaud, 8N1 +// (50 MHz / 5 clocks per bit), payload is a free-running byte counter. +// Checks absolute baud accuracy of the BL616 and sustained RX throughput: +// every received byte must be the previous one + 1. +module stream ( + input wire clk, // E2, 50 MHz + output reg uart_tx = 1'b1 // C3, read by BL616 GPIO10 (RX) +); + localparam CLKS_PER_BIT = 5; + + reg [2:0] div = 0; + reg [3:0] bitn = 0; // 0 start, 1..8 data, 9 stop + reg [7:0] data = 0; + reg [7:0] shreg = 0; + + always @(posedge clk) begin + if (div == CLKS_PER_BIT - 1) begin + div <= 0; + case (bitn) + 4'd0: begin + uart_tx <= 1'b0; + shreg <= data; + bitn <= 1; + end + 4'd9: begin + uart_tx <= 1'b1; + data <= data + 8'd1; + bitn <= 0; + end + default: begin + uart_tx <= shreg[0]; + shreg <= {1'b0, shreg[7:1]}; + bitn <= bitn + 4'd1; + end + endcase + end else begin + div <= div + 3'd1; + end + end +endmodule diff --git a/gui/Controls.cs b/gui/Controls.cs new file mode 100644 index 0000000..e05c28c --- /dev/null +++ b/gui/Controls.cs @@ -0,0 +1,793 @@ +// Light/dark palette and the owner-drawn controls of the programmer GUI. +// Stock WinForms controls (tabs, buttons, check boxes, progress bar) are +// drawn by the light Windows theme only, so these paint themselves. +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace TangProgrammer +{ + enum Tone { Text, Dim, Ok, Err, Warn, Title } + + sealed class Theme + { + public bool IsDark; + public Color Window, Card, CardBorder, LogBg; + public Color Text, TextDim, TextDisabled; + public Color Button, ButtonHover, ButtonPressed, ButtonBorder, ButtonDisabled; + public Color Accent, AccentHover, AccentPressed, AccentText, AccentDisabled, AccentTextDisabled; + public Color ToggleFill, ToggleBorder; + public Color Input, Track; + public Color Ok, Err, Warn, Title; + public Color DotOn, DotWarn, DotOff; + public Color MenuBg, MenuHover, MenuBorder; + + public static readonly Theme Light = new Theme + { + Window = Rgb(0xF3F3F3), Card = Rgb(0xFFFFFF), CardBorder = Rgb(0xE3E3E3), LogBg = Rgb(0xFFFFFF), + Text = Rgb(0x1B1B1B), TextDim = Rgb(0x626262), TextDisabled = Rgb(0xA3A3A3), + Button = Rgb(0xFBFBFB), ButtonHover = Rgb(0xF3F3F3), ButtonPressed = Rgb(0xEBEBEB), + ButtonBorder = Rgb(0xD3D3D3), ButtonDisabled = Rgb(0xF5F5F5), + Accent = Rgb(0x0067C0), AccentHover = Rgb(0x1975C5), AccentPressed = Rgb(0x3183CA), + AccentText = Rgb(0xFFFFFF), AccentDisabled = Rgb(0xC5C5C5), AccentTextDisabled = Rgb(0xFFFFFF), + ToggleFill = Rgb(0xFAFAFA), ToggleBorder = Rgb(0x8A8A8A), + Input = Rgb(0xFFFFFF), Track = Rgb(0xE0E0E0), + Ok = Rgb(0x0F7B0F), Err = Rgb(0xC42B1C), Warn = Rgb(0x9D5D00), Title = Rgb(0x005FB8), + DotOn = Rgb(0x13A10E), DotWarn = Rgb(0xE8911A), DotOff = Rgb(0xA0A0A0), + MenuBg = Rgb(0xFFFFFF), MenuHover = Rgb(0xEDEDED), MenuBorder = Rgb(0xD5D5D5), + }; + + public static readonly Theme Dark = new Theme + { + IsDark = true, + Window = Rgb(0x202020), Card = Rgb(0x2B2B2B), CardBorder = Rgb(0x3A3A3A), LogBg = Rgb(0x252525), + Text = Rgb(0xEDEDED), TextDim = Rgb(0xA6A6A6), TextDisabled = Rgb(0x6E6E6E), + Button = Rgb(0x373737), ButtonHover = Rgb(0x3E3E3E), ButtonPressed = Rgb(0x333333), + ButtonBorder = Rgb(0x484848), ButtonDisabled = Rgb(0x313131), + Accent = Rgb(0x4CC2FF), AccentHover = Rgb(0x48B1E8), AccentPressed = Rgb(0x42A1D2), + AccentText = Rgb(0x000000), AccentDisabled = Rgb(0x454545), AccentTextDisabled = Rgb(0x9A9A9A), + ToggleFill = Rgb(0x262626), ToggleBorder = Rgb(0x9E9E9E), + Input = Rgb(0x383838), Track = Rgb(0x474747), + Ok = Rgb(0x6CCB5F), Err = Rgb(0xFF99A4), Warn = Rgb(0xFCE100), Title = Rgb(0x60CDFF), + DotOn = Rgb(0x6CCB5F), DotWarn = Rgb(0xF7B955), DotOff = Rgb(0x6E6E6E), + MenuBg = Rgb(0x2C2C2C), MenuHover = Rgb(0x3D3D3D), MenuBorder = Rgb(0x484848), + }; + + public static Theme Current = Light; + + static Color Rgb(int rgb) + { + return Color.FromArgb((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF); + } + + public Color Of(Tone tone) + { + switch (tone) + { + case Tone.Dim: return TextDim; + case Tone.Ok: return Ok; + case Tone.Err: return Err; + case Tone.Warn: return Warn; + case Tone.Title: return Title; + default: return Text; + } + } + + // "Choose your app mode" in the Windows settings + public static bool SystemPrefersDark() + { + try + { + using (RegistryKey k = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")) + { + object v = k == null ? null : k.GetValue("AppsUseLightTheme"); + return v is int && (int)v == 0; + } + } + catch (Exception) + { + return false; + } + } + } + + static class Ui + { + public static float Scale = 1f; + + public static int S(float px) + { + return (int)Math.Round(px * Scale); + } + + public static GraphicsPath Round(RectangleF r, float radius) + { + var p = new GraphicsPath(); + float d = Math.Min(radius * 2, Math.Min(r.Width, r.Height)); + if (d < 1f) + { + p.AddRectangle(r); + return p; + } + p.AddArc(r.X, r.Y, d, d, 180, 90); + p.AddArc(r.Right - d, r.Y, d, d, 270, 90); + p.AddArc(r.Right - d, r.Bottom - d, d, d, 0, 90); + p.AddArc(r.X, r.Bottom - d, d, d, 90, 90); + p.CloseFigure(); + return p; + } + + public static Color ParentBack(Control c) + { + return c.Parent != null ? c.Parent.BackColor : c.BackColor; + } + + [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] + static extern int SetWindowTheme(IntPtr hwnd, string subAppName, string subIdList); + + [DllImport("dwmapi.dll")] + static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int value, int size); + + [DllImport("user32.dll")] + static extern IntPtr SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); + + // dark scroll bars and combo boxes of native controls (Windows 10 1809+); + // null restores the default look + public static void SetNativeTheme(Control c, string themeClass) + { + SetWindowTheme(c.Handle, themeClass, null); + c.Invalidate(); + } + + public static void SetDarkTitleBar(Form f, bool dark) + { + int v = dark ? 1 : 0; + // DWMWA_USE_IMMERSIVE_DARK_MODE: 20, was 19 before Windows 10 20H1 + if (DwmSetWindowAttribute(f.Handle, 20, ref v, 4) != 0) + DwmSetWindowAttribute(f.Handle, 19, ref v, 4); + } + + public static void SetRedraw(Control c, bool on) + { + SendMessage(c.Handle, 0x000B /* WM_SETREDRAW */, (IntPtr)(on ? 1 : 0), IntPtr.Zero); + if (on) + c.Invalidate(); + } + } + + // White (or dark) rounded panel with a thin border + sealed class Card : Panel + { + public Color Border = Color.Gray; + + public Card() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + Graphics g = e.Graphics; + g.Clear(Ui.ParentBack(this)); + g.SmoothingMode = SmoothingMode.AntiAlias; + using (GraphicsPath p = Ui.Round(new RectangleF(0.5f, 0.5f, Width - 1f, Height - 1f), Ui.S(7))) + using (var fill = new SolidBrush(BackColor)) + using (var pen = new Pen(Border)) + { + g.FillPath(fill, p); + g.DrawPath(pen, p); + } + } + } + + // Text tabs with an accent underline (replaces the TabControl, which can't be dark) + sealed class TabStrip : Control + { + readonly List items = new List(); + int selected, hot = -1; + Font bold; + + public event EventHandler SelectedIndexChanged; + + public TabStrip() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + SetStyle(ControlStyles.Selectable, false); + } + + public void Add(string text) + { + items.Add(text); + Invalidate(); + } + + public int SelectedIndex + { + get { return selected; } + set + { + if (value == selected || value < 0 || value >= items.Count) + return; + selected = value; + Invalidate(); + if (SelectedIndexChanged != null) + SelectedIndexChanged(this, EventArgs.Empty); + } + } + + public int Count + { + get { return items.Count; } + } + + Font Bold + { + get + { + if (bold == null || bold.Size != Font.Size) + bold = new Font("Segoe UI Semibold", Font.Size); + return bold; + } + } + + int ItemWidth(int i) + { + return TextRenderer.MeasureText(items[i], Bold).Width + Ui.S(24); + } + + Rectangle ItemRect(int i) + { + int x = 0; + for (int k = 0; k < i; k++) + x += ItemWidth(k); + return new Rectangle(x, 0, ItemWidth(i), Height); + } + + int HitTest(Point p) + { + for (int i = 0; i < items.Count; i++) + if (ItemRect(i).Contains(p)) + return i; + return -1; + } + + public override Size GetPreferredSize(Size proposed) + { + int w = 0; + for (int i = 0; i < items.Count; i++) + w += ItemWidth(i); + return new Size(w, Font.Height + Ui.S(16)); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + Theme th = Theme.Current; + Graphics g = e.Graphics; + g.Clear(Ui.ParentBack(this)); + int line = Ui.S(3); + for (int i = 0; i < items.Count; i++) + { + Rectangle r = ItemRect(i); + bool sel = i == selected; + Color c = sel || i == hot ? th.Text : th.TextDim; + TextRenderer.DrawText(g, items[i], sel ? Bold : Font, new Rectangle(r.X, 0, r.Width, r.Height - line), + c, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | + TextFormatFlags.SingleLine | TextFormatFlags.NoPrefix); + if (sel) + { + int w = TextRenderer.MeasureText(items[i], Bold).Width - Ui.S(6); + var u = new RectangleF(r.X + (r.Width - w) / 2f, r.Bottom - line - Ui.S(1), w, line); + g.SmoothingMode = SmoothingMode.AntiAlias; + using (GraphicsPath p = Ui.Round(u, line / 2f)) + using (var b = new SolidBrush(th.Accent)) + g.FillPath(b, p); + g.SmoothingMode = SmoothingMode.None; + } + } + } + + protected override void OnMouseMove(MouseEventArgs e) + { + int h = HitTest(e.Location); + if (h != hot) + { + hot = h; + Cursor = h >= 0 && h != selected ? Cursors.Hand : Cursors.Default; + Invalidate(); + } + base.OnMouseMove(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + hot = -1; + Invalidate(); + base.OnMouseLeave(e); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + int h = HitTest(e.Location); + if (h >= 0 && e.Button == MouseButtons.Left) + { + SelectedIndex = h; + Cursor = Cursors.Default; + } + base.OnMouseDown(e); + } + + protected override void Dispose(bool disposing) + { + if (disposing && bold != null) + bold.Dispose(); + base.Dispose(disposing); + } + } + + enum Glyph { None, Contrast } + + // Rounded button in the colors of the current theme; Accent = the main action + sealed class FlatButton : Button + { + public bool Accent; + public Glyph Glyph; + bool hover, pressed; + + public FlatButton() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + FlatStyle = FlatStyle.Flat; + FlatAppearance.BorderSize = 0; + UseVisualStyleBackColor = false; + } + + public override Size GetPreferredSize(Size proposed) + { + Size t = TextRenderer.MeasureText(Text, Font, Size.Empty, TextFormatFlags.SingleLine | TextFormatFlags.NoPrefix); + return new Size(Math.Max(MinimumSize.Width, t.Width + Padding.Horizontal + Ui.S(8)), + Math.Max(MinimumSize.Height, t.Height + Padding.Vertical + Ui.S(6))); + } + + protected override void OnMouseEnter(EventArgs e) + { + hover = true; + Invalidate(); + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + hover = pressed = false; + Invalidate(); + base.OnMouseLeave(e); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + pressed = true; + Invalidate(); + } + base.OnMouseDown(e); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + pressed = false; + Invalidate(); + base.OnMouseUp(e); + } + + protected override void OnEnabledChanged(EventArgs e) + { + hover = pressed = false; + Invalidate(); + base.OnEnabledChanged(e); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + Theme th = Theme.Current; + Graphics g = e.Graphics; + g.Clear(Ui.ParentBack(this)); + Color bg, fg, border; + if (Accent) + { + bg = !Enabled ? th.AccentDisabled : pressed ? th.AccentPressed : hover ? th.AccentHover : th.Accent; + fg = Enabled ? th.AccentText : th.AccentTextDisabled; + border = bg; + } + else + { + bg = !Enabled ? th.ButtonDisabled : pressed ? th.ButtonPressed : hover ? th.ButtonHover : th.Button; + fg = Enabled ? th.Text : th.TextDisabled; + border = th.ButtonBorder; + } + g.SmoothingMode = SmoothingMode.AntiAlias; + using (GraphicsPath p = Ui.Round(new RectangleF(0.5f, 0.5f, Width - 1f, Height - 1f), Ui.S(4))) + using (var b = new SolidBrush(bg)) + using (var pen = new Pen(border)) + { + g.FillPath(b, p); + g.DrawPath(pen, p); + } + if (Focused && ShowFocusCues) + { + using (GraphicsPath p = Ui.Round(new RectangleF(2.5f, 2.5f, Width - 5f, Height - 5f), Ui.S(3))) + using (var pen = new Pen(fg)) + g.DrawPath(pen, p); + } + if (Glyph == Glyph.Contrast) + { + float d = Math.Min(Width, Height) * 0.46f; + var r = new RectangleF((Width - d) / 2f, (Height - d) / 2f, d, d); + using (var b = new SolidBrush(fg)) + g.FillPie(b, r.X, r.Y, r.Width, r.Height, 90, 180); + using (var pen = new Pen(fg, Math.Max(1.2f, Ui.Scale * 1.3f))) + g.DrawEllipse(pen, r); + return; + } + g.SmoothingMode = SmoothingMode.None; + TextRenderer.DrawText(g, Text, Font, ClientRectangle, fg, + TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | + TextFormatFlags.SingleLine | TextFormatFlags.NoPrefix | TextFormatFlags.EndEllipsis); + } + } + + static class TogglePainter + { + const TextFormatFlags Flags = TextFormatFlags.SingleLine | TextFormatFlags.NoPrefix; + + static int Box(Control c) + { + return Math.Max(13, c.Font.Height); + } + + public static Size Measure(ButtonBase c) + { + Size t = TextRenderer.MeasureText(c.Text, c.Font, Size.Empty, Flags); + int box = Box(c); + return new Size(box + Ui.S(8) + t.Width + Ui.S(2), Math.Max(box, t.Height) + Ui.S(4)); + } + + public static void Paint(ButtonBase c, Graphics g, bool on, bool radio, bool hover, bool focus) + { + Theme th = Theme.Current; + g.Clear(Ui.ParentBack(c)); + int box = Box(c); + var r = new RectangleF(0.5f, (c.Height - box) / 2f + 0.5f, box - 1f, box - 1f); + Color accent = !c.Enabled ? th.AccentDisabled : hover ? th.AccentHover : th.Accent; + Color border = !c.Enabled ? th.TextDisabled : hover ? th.Text : th.ToggleBorder; + g.SmoothingMode = SmoothingMode.AntiAlias; + if (radio) + { + if (on) + { + using (var b = new SolidBrush(accent)) + g.FillEllipse(b, r); + float d = box * 0.4f; + using (var b = new SolidBrush(th.AccentText)) + g.FillEllipse(b, r.X + (r.Width - d) / 2f, r.Y + (r.Height - d) / 2f, d, d); + } + else + { + using (var b = new SolidBrush(th.ToggleFill)) + g.FillEllipse(b, r); + using (var pen = new Pen(border)) + g.DrawEllipse(pen, r); + } + } + else + { + using (GraphicsPath p = Ui.Round(r, box * 0.2f)) + { + if (on) + { + using (var b = new SolidBrush(accent)) + g.FillPath(b, p); + using (var pen = new Pen(th.AccentText, Math.Max(1.5f, box * 0.12f))) + { + pen.StartCap = pen.EndCap = LineCap.Round; + pen.LineJoin = LineJoin.Round; + g.DrawLines(pen, new[] + { + new PointF(r.X + box * 0.25f, r.Y + box * 0.52f), + new PointF(r.X + box * 0.43f, r.Y + box * 0.70f), + new PointF(r.X + box * 0.76f, r.Y + box * 0.32f), + }); + } + } + else + { + using (var b = new SolidBrush(th.ToggleFill)) + g.FillPath(b, p); + using (var pen = new Pen(border)) + g.DrawPath(pen, p); + } + } + } + g.SmoothingMode = SmoothingMode.None; + var tr = new Rectangle(box + Ui.S(8), 0, Math.Max(0, c.Width - box - Ui.S(8)), c.Height); + TextRenderer.DrawText(g, c.Text, c.Font, tr, c.Enabled ? th.Text : th.TextDisabled, + Flags | TextFormatFlags.VerticalCenter | TextFormatFlags.Left | TextFormatFlags.EndEllipsis); + if (focus) + { + Size t = TextRenderer.MeasureText(c.Text, c.Font, Size.Empty, Flags); + ControlPaint.DrawFocusRectangle(g, new Rectangle(tr.X - 1, (c.Height - t.Height) / 2, t.Width + 2, t.Height), + th.Text, Ui.ParentBack(c)); + } + } + } + + sealed class ThemedCheck : CheckBox + { + bool hover; + + public ThemedCheck() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + } + + public override Size GetPreferredSize(Size proposed) + { + return TogglePainter.Measure(this); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + TogglePainter.Paint(this, e.Graphics, Checked, false, hover, Focused && ShowFocusCues); + } + + protected override void OnMouseEnter(EventArgs e) + { + hover = true; + Invalidate(); + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + hover = false; + Invalidate(); + base.OnMouseLeave(e); + } + } + + sealed class ThemedRadio : RadioButton + { + bool hover; + + public ThemedRadio() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + } + + public override Size GetPreferredSize(Size proposed) + { + return TogglePainter.Measure(this); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + TogglePainter.Paint(this, e.Graphics, Checked, true, hover, Focused && ShowFocusCues); + } + + protected override void OnMouseEnter(EventArgs e) + { + hover = true; + Invalidate(); + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + hover = false; + Invalidate(); + base.OnMouseLeave(e); + } + } + + enum BarState { Running, Ok, Error, Paused } + + // Thin rounded progress bar; Marquee = "busy, amount unknown" + sealed class FlatProgress : Control + { + int value; + bool marquee; + BarState state; + float phase; + readonly Timer timer = new Timer { Interval = 15 }; + + public FlatProgress() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true); + SetStyle(ControlStyles.Selectable, false); + timer.Tick += (s, e) => + { + phase += 0.009f; + if (phase > 1f) + phase -= 1f; + Invalidate(); + }; + } + + public int Value + { + get { return value; } + set { this.value = Math.Max(0, Math.Min(100, value)); Invalidate(); } + } + + public bool Marquee + { + get { return marquee; } + set { marquee = value; phase = 0; timer.Enabled = value; Invalidate(); } + } + + public BarState State + { + get { return state; } + set { state = value; Invalidate(); } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + Theme th = Theme.Current; + Graphics g = e.Graphics; + g.Clear(Ui.ParentBack(this)); + g.SmoothingMode = SmoothingMode.AntiAlias; + float h = Math.Min(Height, Ui.S(6)); + var track = new RectangleF(0, (Height - h) / 2f, Width, h); + using (GraphicsPath p = Ui.Round(track, h / 2f)) + using (var b = new SolidBrush(th.Track)) + g.FillPath(b, p); + RectangleF bar; + if (marquee) + { + float seg = Width * 0.28f; + // ease in-out sweep across the track + float t = (float)(0.5 - Math.Cos(phase * Math.PI) / 2); + bar = RectangleF.Intersect(new RectangleF(-seg + t * (Width + seg), track.Y, seg, h), track); + } + else + { + bar = new RectangleF(0, track.Y, Width * value / 100f, h); + } + if (bar.Width < 0.5f) + return; + Color fill = state == BarState.Ok ? th.Ok : state == BarState.Error ? th.Err : + state == BarState.Paused ? th.Warn : th.Accent; + using (GraphicsPath p = Ui.Round(bar, h / 2f)) + using (var b = new SolidBrush(fill)) + g.FillPath(b, p); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + timer.Dispose(); + base.Dispose(disposing); + } + } + + sealed class StatusDot : Control + { + Color dotColor = Color.Silver; + + public StatusDot() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true); + } + + public Color DotColor + { + get { return dotColor; } + set { dotColor = value; Invalidate(); } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.Clear(Ui.ParentBack(this)); + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + using (var b = new SolidBrush(dotColor)) + e.Graphics.FillEllipse(b, 0.5f, 0.5f, Width - 1.5f, Height - 1.5f); + } + } + + // Context menus in the colors of the current theme + sealed class MenuRenderer : ToolStripProfessionalRenderer + { + public MenuRenderer() : base(new MenuColors()) + { + RoundedEdges = false; + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = e.Item.Enabled ? Theme.Current.Text : Theme.Current.TextDisabled; + base.OnRenderItemText(e); + } + + protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) + { + Rectangle r = e.ImageRectangle; + float s = Math.Min(r.Width, r.Height); + float x = r.X + (r.Width - s) / 2f, y = r.Y + (r.Height - s) / 2f; + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + using (var pen = new Pen(Theme.Current.Text, Math.Max(1.5f, s * 0.11f))) + { + pen.StartCap = pen.EndCap = LineCap.Round; + pen.LineJoin = LineJoin.Round; + e.Graphics.DrawLines(pen, new[] + { + new PointF(x + s * 0.22f, y + s * 0.52f), + new PointF(x + s * 0.42f, y + s * 0.72f), + new PointF(x + s * 0.78f, y + s * 0.30f), + }); + } + e.Graphics.SmoothingMode = SmoothingMode.None; + } + + sealed class MenuColors : ProfessionalColorTable + { + public MenuColors() + { + UseSystemColors = false; + } + + static Theme T + { + get { return Theme.Current; } + } + + public override Color ToolStripDropDownBackground { get { return T.MenuBg; } } + public override Color ImageMarginGradientBegin { get { return T.MenuBg; } } + public override Color ImageMarginGradientMiddle { get { return T.MenuBg; } } + public override Color ImageMarginGradientEnd { get { return T.MenuBg; } } + public override Color MenuBorder { get { return T.MenuBorder; } } + public override Color MenuItemBorder { get { return T.MenuHover; } } + public override Color MenuItemSelected { get { return T.MenuHover; } } + public override Color MenuItemSelectedGradientBegin { get { return T.MenuHover; } } + public override Color MenuItemSelectedGradientEnd { get { return T.MenuHover; } } + public override Color SeparatorDark { get { return T.MenuBorder; } } + public override Color SeparatorLight { get { return T.MenuBg; } } + public override Color CheckBackground { get { return T.MenuBg; } } + public override Color CheckSelectedBackground { get { return T.MenuHover; } } + public override Color CheckPressedBackground { get { return T.MenuHover; } } + } + } +} diff --git a/gui/MainForm.cs b/gui/MainForm.cs new file mode 100644 index 0000000..24f22c2 --- /dev/null +++ b/gui/MainForm.cs @@ -0,0 +1,2034 @@ +// Tang Primer 25K programmer: a window around openFPGALoader (-c dirtyJtag) +// for loading FPGA bitstreams, plus flashing of the BL616 bridge firmware +// (what scripts\flash.ps1 does). Build with scripts\build_gui.ps1. +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TangProgrammer +{ + static class Program + { + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } + + enum ToolKind { Ofl, BlFlash } + + sealed class RunResult + { + public int ExitCode = -1; + public bool FailSeen; + public readonly List Lines = new List(); + + // openFPGALoader exits with 0 even when loading the SRAM fails + public bool Ok + { + get { return ExitCode == 0 && !FailSeen; } + } + + public bool Has(string text) + { + return Lines.Any(l => l.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0); + } + + public string Find(Regex rx) + { + foreach (string l in Lines) + { + Match m = rx.Match(l); + if (m.Success) + return m.Groups[1].Value; + } + return null; + } + } + + sealed class LogEntry + { + public string Text; + public Tone Tone; + public bool Bold; + } + + sealed class MainForm : Form + { + const string AppTitle = "Tang Primer 25K — программатор"; + // where the tools and the bridge firmware are: the source tree, or the + // portable copy made by scripts\make_portable.ps1 + static readonly string[] BlFlashPaths = + { + @"third_party\bouffalo_sdk\tools\bflb_tools\bouffalo_flash_cube\BLFlashCommand.exe", + @"tools\bouffalo_flash_cube\BLFlashCommand.exe", + }; + static readonly string[] BridgeFwPaths = + { + @"build\build_out\tang25k_debugger_bl616.bin", + @"firmware\tang25k_debugger_bl616.bin", + }; + static readonly int[] FreqList = { 1, 2, 4, 6, 10, 15, 20, 30 }; // MHz; the firmware does up to 30 + const int DefaultFreq = 6; // what the firmware starts with + const int MaxLogEntries = 4000; + + // openFPGALoader: "Load SRAM: [===== ] 33.00%" + static readonly Regex OflProgressRx = new Regex(@"^(?