USB转串口CH343驱动

背景

在网上用9.9淘的一块ESP32-C3(RISC-V)的小开发板上,用的CH343的USB转串口。
最近打算学习用Rust开发ESP32-C3,在Ubuntu上搭建开发环境的时候发现,Ubuntu20.04上默认使用的是 CDC-ACM 驱动,即生成的节点为/dev/ttyACM0,但是用Rust开发ESP32-C3,需要使用 VCP 驱动,于是在网上找到了官方(WCH-南京沁恒)的一份Linux驱动源码:https://github.com/WCHSoftGroup/ch343ser_linux

里面的文档也说明了使用 CDC-ACM 驱动的一些局限性:

The CDC-ACM driver has limited capabilities to control specific devices. This generic driver does not have any knowledge about specific device protocols. Because of this, device manufacturers can create an alternate, or custom driver that is capable of accessing the device specific function sets, such as hardware flow control or GPIO functions.

到目前为止,这份驱动支持的USB转串口的芯片,挺全挺新的,感觉官方一直在维护:

This driver and application support USB to single serial port chip ch343/ch347/ch9101/ch9102, USB to dual serial ports chip ch342/ch347/ch9103, USB to quad serial ports chip ch344, etc.

编译安装

下载驱动源码,按照正常编译安装核外KO的步骤操作即可,大致步骤如下:

git clone https://github.com/WCHSoftGroup/ch343ser_linux.git

cd ch343ser_linux/driver/

#编译,正常情况下,会生成ch343.ko
make

#临时加载
sudo insmod ch343.ko
#临时卸载
sudo rmmod ch343.ko

#永久安装
sudo make install
#卸载安装
sudo make uninstall

使用

使用时,如果保证能用 VCP 驱动,还需要使CH343的驱动优先级高于系统自带的CDC-ACM驱动,有下面2种方法:

  • 每次手动卸载 ACM 驱动
    #临时卸载
    sudo rmmod cdc_acm
  • 在内核启动阶段加载CH343驱动,即写入到内核模块文件,驱动在 install 的时候就时使用的这种方式
    echo "ch343" >> /etc/modules
    depmod -a
    下面是该驱动Makefile中 install 和 uninstall 处理:
    install: default
            mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial
            cp -f ./ch343.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial
            echo "ch343" >> /etc/modules
            depmod -a
    uninstall:
            rm -rf /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial/ch343.ko
            depmod -a
    

    /etc/modules: 内核模块文件,里面列出的模块会在系统启动时自动加载。

插拔下USB转串口(CH343)设备,此时使用的就是 VCP 驱动,即会生成节点:/dev/ttyCH343USB0,然后就可以通过该节点操作串口了

参考