USBを持たないCH32V003をUSBで書き込むrv003usb bootloader
CH32を理解するためのノート群 の中でも、CH32V003の開発文化を象徴する例。
事実
CH32V003はハードウェアUSB peripheralを持たない。
cnlohr/rv003usbは、V003のGPIOとソフトウェア処理だけでUSB Low-Speed deviceを実装するプロジェクトである。
低レベルの受信処理はassembly、上位USB処理はCで実装される。
rv003usbにはHID、gamepad、keyboard/mouseなどの例に加え、self-flashing bootloaderが含まれる。
bootloader版はHIDとしてenumerateし、コード実行・書き換え機能を約1,920 bytesへ収めている。
V003には通常のuser Code Flashとは別に、0x1FFFF000から始まる1,920-byteのSystem/BOOT領域がある。工場出荷時bootloaderもこの領域を使う。
rv003usb bootloaderをここへ配置すれば、16KBのuser Code Flashをbootloaderで削らずに運用できる。
minichlinkはこのUSB bootloader経由の書き込みをサポートする。
工場bootloaderとの違い
V003の工場bootloaderはUART ISPである。
CH32V00xにはUSB ISPはなく、wchispもV00xについてserial transportを使うよう説明している。
またV003の工場bootloaderは、BOOT0 pinのような外部pin状態だけで入る方式ではない。ユーザープログラムがFLASH_STATR.MODEを設定してsoftware resetする必要がある。
そのため工場出荷直後のblank chipへUARTだけで最初のコードを入れる用途には制約がある。
考察
rv003usbの価値は「USBが使える」ことより、安価な製品へUSB connectorだけを出し、日常のfirmware update経路まで作れることにある。
初回だけSWIO programmerでbootloaderを入れれば、その後は専用書き込み器なしで更新できる。
V003のような非常に安いMCUでは、製品一台あたりに高価なdebug connectorを残さず、USBをupdate経路として使える意味が大きい。
一方software USBはtiming制約が厳しい。アプリケーション動作中にUSB stackを常用する場合と、起動時bootloaderだけで使う場合を分けて考えるべきである。
さらに変な使い方
rv003usbにはV003自身をSWIO programmerとして使うrvswdio_programmerも存在する。
つまり、
PC → software USB → CH32V003 → SWIO → 別のCH32
という構成まで作れる。