Ubuntu22.04安装CH34x串口驱动爬坑指南

1.官网下载

WCH官网下载驱动 CH341SER_LINUX.ZIP

2.解压驱动包

robot@kx:~/Downloads$ unzip -O GBK CH341SER_LINUX.ZIP 
Archive:  CH341SER_LINUX.ZIP
   creating: CH341SER_LINUX/
  inflating: CH341SER_LINUX/ch34x.c  
  inflating: CH341SER_LINUX/Makefile  
  inflating: CH341SER_LINUX/readme.txt  
robot@kx:~/Downloads$ 

3.编译安装

robot@kx:~/Downloads$ cd CH341SER_LINUX/
robot@kx:~/Downloads/CH341SER_LINUX$ ls
ch34x.c  Makefile  readme.txt
robot@kx:~/Downloads/CH341SER_LINUX$ make

如果编译报错,请通过"uname -r" 检查内核版本

然后去查看ch34x.c的 源代码

找到自己内核对应的版本,直接复制到CH341SER_LINUX/ch34x.c 中,重新make

robot@kx:~/Downloads/CH341SER_LINUX$ make
make -C /lib/modules/5.19.0-32-generic/build  M=/home/kx/Downloads/CH341SER_LINUX  
make[1]: 进入目录“/usr/src/linux-headers-5.19.0-32-generic”
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
  You are using:           gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
  CC [M]  /home/kx/Downloads/CH341SER_LINUX/ch34x.o
  MODPOST /home/kx/Downloads/CH341SER_LINUX/Module.symvers
  CC [M]  /home/kx/Downloads/CH341SER_LINUX/ch34x.mod.o
  LD [M]  /home/kx/Downloads/CH341SER_LINUX/ch34x.ko
  BTF [M] /home/kx/Downloads/CH341SER_LINUX/ch34x.ko
Skipping BTF generation for /home/kx/Downloads/CH341SER_LINUX/ch34x.ko due to unavailability of vmlinux
make[1]: 离开目录“/usr/src/linux-headers-5.19.0-32-generic”
robot@kx:~/Downloads/CH341SER_LINUX$ ls
ch34x.c  ch34x.ko  ch34x.mod  ch34x.mod.c  ch34x.mod.o  ch34x.o  Makefile  modules.order  Module.symvers  readme.txt
robot@kx:~/Downloads/CH341SER_LINUX$ 

编译完成后目录下会生成一个ch34x.ko的库,说明make成功了

4.载入模块(设备驱动程序)

robot@kx:~/Downloads/CH341SER_LINUX$ sudo make load
[sudo] kx的密码: 
modprobe usbserial
insmod ch34x.ko
insmod: ERROR: could not insert module ch34x.ko: Key was rejected by service
make: *** [Makefile:10:load] 错误 1
robot@kx:~/Downloads/CH341SER_LINUX$ 

错误提示:Key was rejected by service
说明.ko文件需要签名。

查看驱动签名情况

robot@kx:~/Downloads/CH341SER_LINUX$ ls
ch34x.c  ch34x.ko  ch34x.mod  ch34x.mod.c  ch34x.mod.o  ch34x.o  Makefile  modules.order  Module.symvers  readme.txt
robot@kx:~/Downloads/CH341SER_LINUX$ hexdump -C ch34x.ko | tail
000566f0  08 00 00 00 00 00 00 00  18 00 00 00 00 00 00 00  |................|
00056700  09 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00056710  00 00 00 00 00 00 00 00  f8 cd 02 00 00 00 00 00  |................|
00056720  40 08 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |7...............|
00056730  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056740  11 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00056750  00 00 00 00 00 00 00 00  20 60 05 00 00 00 00 00  |........ Y......|
00056760  e0 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056770  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056780
robot@kx:~/Downloads/CH341SER_LINUX$ 

此时没有签名。

5.给驱动签名

首先依赖mokutil和shim-signed

sudo apt install mokutil
sudo apt install shim-signed
sudo update-secureboot-policy --new-key

生成的证书(MOK.der)和私钥(MOK.priv)位于 /var/lib/shim-signed/mok/ 目录下。

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"

 导入签名证书

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

重新启动 

电脑启动 UEFI 询问您是否要更改安全设置,选择”Yes”。

将签名写入驱动

robot@kx:~/Downloads/CH341SER_LINUX$ ls
ch34x.c  ch34x.ko  ch34x.mod  ch34x.mod.c  ch34x.mod.o  ch34x.o  Makefile  modules.order  Module.symvers  readme.txt
robot@kx:~/Downloads/CH341SER_LINUX$ hexdump -C ch34x.ko | tail
000566f0  08 00 00 00 00 00 00 00  18 00 00 00 00 00 00 00  |................|
00056700  09 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00056710  00 00 00 00 00 00 00 00  f8 cd 02 00 00 00 00 00  |................|
00056720  37 08 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |7...............|
00056730  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056740  11 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00056750  00 00 00 00 00 00 00 00  20 59 05 00 00 00 00 00  |........ Y......|
00056760  e0 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056770  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00056780
robot@kx:~/Downloads/CH341SER_LINUX$ sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der ch34x.ko 
robot@kx:~/Downloads/CH341SER_LINUX$ hexdump -C ch34x.ko | tail
000568d0  c4 6c 1c 49 a8 4d e4 68  b2 c2 ab c1 a6 4f f7 45  |.l.I.M.h.....O.E|
000568e0  bd 9b 33 23 f1 3d 38 41  29 bb 05 5f 81 16 73 62  |..3#.=8A).._..sb|
000568f0  b2 8c 2a f6 9c 7e e2 e9  1a 0f 79 32 9e b5 8e 6b  |..*..~....y2...k|
00056900  50 0e a4 49 e4 06 59 79  8f 81 ef 7c df 9d e9 1f  |P..I..Yy...|....|
00056910  3b 2f 15 0f 12 43 b9 5d  05 09 f3 d8 0e bc 8b aa  |;/...C.]........|
00056920  e2 0a d7 bf cc 01 24 04  36 de 93 00 00 02 00 00  |......$.6.......|
00056930  00 00 00 00 00 01 ab 7e  4d 6f 64 75 6c 65 20 73  |.......~Module s|
00056940  69 67 6e 61 74 75 72 65  20 61 70 70 65 6e 64 65  |ignature appende|
00056950  64 7e 0a                                          |d~.|
00056953
robot@kx:~/Downloads/CH341SER_LINUX$ 

 此时驱动程序数据中有~Module signature appended~,可知已写入签名。

6.再来载入模块(设备驱动程序)

robot@kx:~/Downloads/CH341SER_LINUX$ sudo make load
modprobe usbserial
insmod ch34x.ko
robot@kx:~/Downloads/CH341SER_LINUX$ 

如果遇到报错ERROR: could not insert module ch341.ko: Unknown symbol in module

robot@kx:~/Downloads/CH341SER_LINUX$ sudo make load
insmod ch341.ko
insmod: ERROR: could not insert module ch341.ko: Unknown symbol in module
make: *** [Makefile:9: load] Error 1
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ sudo insmod ch341.ko
insmod: ERROR: could not insert module ch341.ko: Unknown symbol in module
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ modinfo ch341.ko |grep depends
depends:        usbserial
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ sudo modprobe usbserial
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ insmod ch341.ko
insmod: ERROR: could not insert module ch341.ko: Operation not permitted
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ sudo insmod ch341.ko
robot@kx-NUC12WSKi5:~/Downloads/CH341SER_LINUX$ sudo make install
make -C /lib/modules/5.15.0-78-generic/build  M=/home/kx/Downloads/CH341SER_LINUX
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-78-generic'
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-78-generic'
mkdir -p /lib/modules/5.15.0-78-generic/kernel/drivers/usb/serial/
cp -f ./ch341.ko /lib/modules/5.15.0-78-generic/kernel/drivers/usb/serial/
depmod -a

 1、当使用insmod xxx.ko(需要在src源码目录下)提示如题信息时,说明缺少依赖模块。
 2、使用 modinfo xxx.ko | grep depends 查看依赖的模块(lsmod 命令可以查看内核中已经的模块)。
 3、使用 modprobe <缺少的依赖模块>。
 4、再次使用 insmod xxx.ko 就加载成功。

使用lsmod查看模块,发现已识别。

robot@kx:~/Downloads/CH341SER_LINUX$ lsmod
Module                  Size  Used by
ch34x                  24576  0
rfcomm                 86016  4

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值