Skip to main content
  1. Posts/

💻 在 Jetson 上编译并驱动 CH340 模块

·251 words·2 mins·
f4bb0
Author
f4bb0
Meow meow meow
Table of Contents

环境:Jetson Orin Nano / Ubuntu Jammy / Kernel 5.15.148-tegra

🧩 起因:lsusb 识别但 dev 节点缺失
#

插入了 CH340 USB 串口模块。但设备节点 /dev/ttyUSB0 并没有出现,于是运行 lsusb 检查设备状态:

fabbo@ubuntu:~$ lsusb
Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics CH340 serial converter

设备确实被识别了,于是尝试加载模块:

fabbo@ubuntu:~$ sudo modprobe ch341
modprobe: FATAL: Module ch341 not found in directory /lib/modules/5.15.148-tegra

顺便查看系统日志:

fabbo@ubuntu:~$ sudo dmesg | grep ch34

没有输出内容,基本确认缺少驱动模块。


📦 配置驱动:准备源码
#

确认当前使用的 JetPack 版本,

dpkg-query --show nvidia-l4t-core

下载对应的 L4T BSP 源码包 Driver Package (BSP) Sources,得到一个 public_sources.tbz2,并解压。

下载链接: https://developer.nvidia.com/embedded/linux-tegra-r321

随后在解压出的 BSP 中找到了内核源码,里面可能还有一层压缩 kernel_src.tbz2 要解压,最后目录大概这样:

fabbo@ubuntu:~/Linux_for_Tegra/source/kernel/kernel-jammy-src$ ls
arch  block  drivers  fs  include  kernel  mm  net  scripts  ...

⚙️ 编译内核 module
#

尝试初始化配置文件,检查:

fabbo@ubuntu:~/LinuxforTegra/source/kernel/kernel-jammy-src$ ls arch/arm64/configs/ | grep tegra
tegraproddefconfig # 用于生产环境?
tegrarecoverychain_defconfig # 用于恢复链条

决定直接用通用配置:

make ARCH=arm64 O=../kernel_out defconfig

之后执行模块编译:

make ARCH=arm64 O=../kernel_out modules_prepare
make ARCH=arm64 O=../kernel_out modules -j$(nproc)
# 为加快速度,加入并行编译。当时我忘记了,然后单核编译了两个小时。。。

这一步编译内核自带的模块,生成 Module.symvers 文件到 kernel_out 目录。 后续 CH340 相关编译如果缺少 Module.symvers 会报错

WARNING: Symbol version dump "Module.symvers" is missing.
WARNING: modpost: "usb_register_driver" undefined!

🔧 编译 CH341 驱动模块
#

从沁恒官方 GitHub 获取驱动源码:

git clone https://github.com/WCHSoftGroup/CH341SER_LINUX.git
cd CH341SER_LINUX/driver

修改 Makefile 里面的 KDIR 让它指向你的内核输出路径,默认应该是KDIR := /lib/modules/$(shell uname -r)/build,改成刚刚的路径:

KDIR := /home/fabbo/Linux_for_Tegra/source/kernel/kernel_out

开始编译:

make ARCH=arm64

最后得到所需要的 ch341.ko


🧪 加载驱动
#

sudo insmod ./ch341.ko

此处有一个常见问题,似乎只在 Ubuntu 出现。insmod 后未能在 /dev 挂载。 dmesg 显示模块成功加载但被 brltty 抢占:

usbfs: interface 0 claimed by usb_ch341 while 'brltty' sets config #1
ch341 usb device disconnect

解决方案是卸载或停用 brltty

sudo apt remove brltty
# 或者
# sudo systemctl stop brltty
# sudo systemctl disable brltty

之后设备成功挂载为 /dev/ttyCH341USB0


🔁 模块持久化设置
#

将模块注册到系统模块目录:

sudo cp ch341.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/
sudo depmod
sudo modprobe ch341

也可通过 udev 创建规则自动加载并赋权,或者编辑 /etc/modules 加载。


完结撒花。🎆