NetBSDでUSBシリアル変換IC CH340Kを動かす
秋月電子通商で¥100で買えるUSBシリアルICのCH340KがNetBSD 10.99.3でもまだこんな感じで認識してくれなかったけど数行いじったら動くようになったよ、というお話。
ugen0: QinHeng Electronics (0x1a86) USB Serial (0x7522), rev 1.10/2.64, addr 1
動機
- 認識しないのは数ヶ月前から認識してたけど最近になってふと気になったので追ってみることにした
- CH341/CH340はuchcom(4)で実装されている……あれ?
- データシートないかなとメーカーのページに行ったらLinux向けのソースコードがあったけど、ざっと見た感じでは特にCH340K(というよりProductIDが0x7522)固有の処理はなさそう
- じゃあuchcom(4)でなんで動かんの、と思ったら0x7522が対象に入ってなかった
- もしかしてuchcom(4)に0x7522を追加すれば動くのでは……?
やったこと
まずsys/dev/usb/usbdevs
にProductIDが0x7522になるデバイスを追加する。なお手元のはCH340Kだけどどうも他のCH340シリーズも中のチップは同じらしく、そうすると名称はCH340Kで良いものか一瞬悩む。が、そういえばメーカー純正のLinuxドライバコード中でも /* ch340k chip */
だったので気にしないことに。
--- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -2836,6 +2836,7 @@ product QINHENG CH341_EPP 0x5512 CH341 USB-EPP/SSP Bridge product QINHENG CH341_ASP 0x5523 CH341 USB-Serial Bridge product QINHENG CH341_UPC 0x5584 CH341 USB-Printer Bridge product QINHENG CH340 0x7523 CH340 USB-Serial Bridge +product QINHENG CH340K 0x7522 CH340K USB-Serial Bridge product QINHENG2 CH341SER 0x5523 CH341/CH340 USB-Serial Bridge /* Qtronix products */
次にusbdevs.h
と usbdevs_data.h
を再構築する。TOOLDIRはbuild.sh
時に-T
で指定しているところ。
$ TOOLDIR=../../../../tools/amd64 make -f Makefile.usbdevs
終了するとusbdevs.h
にUSB_PRODUCT_QINHENG_CH340K
という定義が生えてくる。
#define USB_PRODUCT_QINHENG_CH340K 0x7522 /* CH340K USB-Serial Bridge */
最後にuchcom(4)のデバイステーブルに追加しておしまい。
--- a/sys/dev/usb/uchcom.c +++ b/sys/dev/usb/uchcom.c @@ -164,6 +164,7 @@ static const uint32_t rates4x[8] = { static const struct usb_devno uchcom_devs[] = { { USB_VENDOR_QINHENG2, USB_PRODUCT_QINHENG2_CH341SER }, { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH340 }, + { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH340K }, { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH341_ASP }, }; #define uchcom_lookup(v, p) usb_lookup(uchcom_devs, v, p)
結果
[ 8134.473206] uchcom0 at uhub1 port 1 [ 8134.473206] uchcom0: QinHeng Electronics (0x1a86) USB Serial (0x7522), rev 1.10/2.64, addr 1 [ 8134.483205] ucom0 at uchcom0
うむ。
このCH340KはESP32のライター(自作)に使用しているので、とりあえずESP32と繋いでみたところ起動メッセージは表示されるのでちゃんとUSBシリアルとして動作していそう。なおminicomだとCtrl-A Z からの H(Hang up) をしないと何もでてこないので不具合かと思ったがFT232RLを使用したESP32ライターでも同じ動作だったのでminicomの設定か何かの問題らしい。ちなみにcuだと問題なさそう。
おまけ
FreeBSDは2022年の1月と6月ので対応したのかな。