1. 项目概述
最近在Ubuntu 24.04上折腾CH341串口驱动时踩了不少坑,这里把完整的安装过程和解决方案整理出来。CH341是南京沁恒电子生产的一款USB转串口芯片,广泛应用于各种嵌入式开发板和调试工具中。虽然Linux内核自带了CH341驱动,但在最新的Ubuntu 24.04上可能会遇到驱动不兼容或加载失败的问题。
这个方案适用于以下场景:
- 使用CH341芯片的USB转串口设备(如常见的USB转TTL模块)
- 在Ubuntu 24.04系统上遇到驱动无法正常工作的情况
- 需要手动编译和安装最新版驱动的情况
整个过程涉及驱动源码下载、内核模块编译、Secure Boot设置等关键步骤,我会详细说明每个环节的注意事项和常见问题排查方法。
2. 准备工作与环境检查
2.1 确认硬件和系统信息
在开始安装前,建议先确认几个关键信息:
-
使用
lsusb命令检查设备是否被识别:bash复制
lsusb | grep CH341正常应该能看到类似"Bus 003 Device 004: ID 1a86:7523 QinHeng Electronics CH341 serial converter"的输出。
-
检查当前内核版本:
bash复制uname -rUbuntu 24.04默认使用6.x内核,这个信息在后续下载驱动源码时会用到。
-
检查Secure Boot状态:
bash复制
mokutil --sb-state如果显示"SecureBoot enabled",则可能需要关闭它才能加载自定义内核模块。
2.2 安装编译依赖
编译驱动需要安装内核头文件和编译工具链:
bash复制sudo apt update
sudo apt install build-essential linux-headers-$(uname -r) libelf-dev zstd
这里特别说明几个关键包的作用:
build-essential:提供gcc等基础编译工具linux-headers-$(uname -r):安装与当前运行内核匹配的头文件libelf-dev:处理内核模块所需的ELF格式支持zstd:用于处理.ko.zst压缩格式
注意:如果系统中有多个内核版本,务必确保安装的头文件版本与当前运行的内核版本一致。
3. 驱动源码获取与处理
3.1 下载官方驱动源码
从沁恒电子官网下载最新的Linux驱动:
bash复制wget http://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html
unzip CH341SER_LINUX.ZIP
解压后会得到以下文件:
code复制Makefile
ch34x.c
ch34x.h
readme.txt
3.2 获取最新内核源码
由于Ubuntu 24.04使用较新的内核版本,建议从官方内核源码库获取最新的驱动代码:
bash复制wget https://elixir.bootlin.com/linux/latest/source/drivers/usb/serial/ch341.c
将下载的最新ch341.c替换掉官方驱动中的ch34x.c文件:
bash复制mv ch341.c ch34x.c
提示:这一步是为了确保驱动兼容最新的内核API。官方提供的驱动可能没有及时更新,直接使用可能导致编译失败。
4. 驱动编译与安装
4.1 编译驱动模块
进入驱动目录执行编译:
bash复制make
正常编译完成后会生成ch34x.ko文件。如果遇到编译错误,通常是因为内核API变更导致的,需要根据错误信息调整代码。
常见问题处理:
- 如果提示"implicit declaration of function"之类的警告,可能需要添加相应的头文件包含
- 如果提示某些内核API不存在,需要查找替代API并修改代码
4.2 处理内核模块格式
Ubuntu 24.04使用了压缩的内核模块格式(.ko.zst),需要转换格式:
bash复制sudo cp ch34x.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/
sudo zstd /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch34x.ko
sudo mv /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch34x.ko.zst /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko.zst
关键步骤说明:
- 先将编译好的模块复制到标准驱动目录
- 使用zstd工具压缩模块
- 重命名为系统预期的文件名(ch341.ko.zst)
4.3 更新模块依赖关系
执行以下命令更新模块依赖关系:
bash复制sudo depmod -a
5. 系统配置与优化
5.1 移除冲突软件包
Ubuntu默认安装的brltty包可能与串口驱动冲突,建议移除:
bash复制sudo apt remove brltty
5.2 配置自动加载
创建配置文件让系统自动加载驱动:
bash复制sudo tee /etc/modules-load.d/ch341.conf <<<'ch341'
设置正确的文件权限:
bash复制sudo chmod 644 /etc/modules-load.d/ch341.conf
5.3 处理Secure Boot问题
如果驱动加载失败,可能需要关闭Secure Boot:
- 重启进入BIOS设置
- 找到Secure Boot选项并禁用
- 保存设置并重启
重要提示:关闭Secure Boot会降低系统安全性,仅在必要时使用此方法。对于生产环境,建议使用签名内核模块的方式。
6. 测试与验证
6.1 检查驱动加载
重启后检查驱动是否正常加载:
bash复制lsmod | grep ch341
dmesg | grep ch341
正常应该能看到驱动加载成功的日志信息。
6.2 测试串口通信
使用串口调试工具测试功能:
- 安装串口调试工具(如cutecom):
bash复制sudo apt install cutecom - 短接CH341模块的TX和RX引脚
- 打开cutecom,选择正确的串口设备(通常是/dev/ttyUSB0)
- 发送测试数据,应该能收到回显
6.3 常见问题排查
-
设备权限问题:
bash复制sudo chmod 666 /dev/ttyUSB0或者将用户加入dialout组:
bash复制sudo usermod -aG dialout $USER -
驱动版本不匹配:
- 确保下载的内核源码版本与当前内核版本接近
- 可以尝试从Ubuntu官方源码库下载对应版本的驱动代码
-
设备识别问题:
- 检查USB连接是否正常
- 尝试不同的USB端口
- 使用
dmesg查看内核日志中的设备识别信息
7. 高级配置与优化
7.1 固定设备名称
为了避免设备名随插入顺序变化,可以创建udev规则:
bash复制sudo tee /etc/udev/rules.d/99-ch341.rules <<<'SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyCH341"'
重新加载udev规则:
bash复制sudo udevadm control --reload-rules
sudo udevadm trigger
之后设备将固定为/dev/ttyCH341。
7.2 性能调优
调整串口缓冲区大小提升性能:
bash复制sudo tee /etc/sysctl.d/10-serial.conf <<<'kernel.printk = 3 4 1 7'
sudo sysctl -p /etc/sysctl.d/10-serial.conf
7.3 驱动签名(Secure Boot环境)
如果需要保持Secure Boot开启,可以签名自定义内核模块:
bash复制sudo apt install mokutil
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom Driver/"
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko.zst
sudo mokutil --import MOK.der
重启后按照提示完成密钥注册。
8. 替代方案与补充说明
8.1 使用DKMS自动管理驱动
对于需要长期维护的系统,建议使用DKMS管理驱动:
bash复制sudo apt install dkms
sudo cp -r ch34x /usr/src/ch341-1.0
sudo tee /usr/src/ch341-1.0/dkms.conf <<EOF
PACKAGE_NAME="ch341"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="ch341"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"
EOF
sudo dkms add -m ch341 -v 1.0
sudo dkms build -m ch341 -v 1.0
sudo dkms install -m ch341 -v 1.0
这样在升级内核时会自动重新编译驱动。
8.2 其他常见问题
- 如果遇到"Unknown symbol in module"错误,可能是内核API变更导致,需要更新驱动代码
- Ubuntu 24.04默认使用zstd压缩内核模块,直接使用.ko文件可能无法加载
- 某些CH341变种芯片可能需要特殊处理,可以尝试修改驱动中的设备ID列表
经过以上步骤,CH341驱动应该能在Ubuntu 24.04上正常工作。如果在实际操作中遇到其他问题,可以查看内核日志(dmesg)获取更多调试信息。