环境: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
加载。
完结撒花。🎆