NetBSDでUSBシリアル変換IC CH340Kを動かす

秋月電子通商で¥100で買えるUSBシリアルICのCH340KNetBSD 10.99.3でもまだこんな感じで認識してくれなかったけど数行いじったら動くようになったよ、というお話。

ugen0: QinHeng Electronics (0x1a86) USB Serial (0x7522), rev 1.10/2.64, addr 1

動機

  1. 認識しないのは数ヶ月前から認識してたけど最近になってふと気になったので追ってみることにした
  2. CH341/CH340はuchcom(4)で実装されている……あれ?
  3. データシートないかなとメーカーのページに行ったらLinux向けのソースコードがあったけど、ざっと見た感じでは特にCH340K(というよりProductIDが0x7522)固有の処理はなさそう
  4. じゃあuchcom(4)でなんで動かんの、と思ったら0x7522が対象に入ってなかった
  5. もしかして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 */

note.com

次にusbdevs.husbdevs_data.h を再構築する。TOOLDIRはbuild.sh時に-Tで指定しているところ。

$ TOOLDIR=../../../../tools/amd64 make -f Makefile.usbdevs

終了するとusbdevs.hUSB_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月ので対応したのかな。

github.com github.com