解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题
解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题
- 问题
- 官网下载
- 解压驱动包
- 编译安装
- 给驱动签名
- 再来载入模块(设备驱动程序)
问题
Ubuntu22.04.1
Linux版本5.19.0-32-generic
运行Qt串口通信 m_serialPort->open(QIODevice::ReadWrite) 时,总是失败。
负责硬件的同事说可能是需要安装ch340驱动。
官网下载
WCH官网下载驱动 CH341SER_LINUX.ZIP
解压驱动包
ncyf@NCYF:~/Downloads$ unzip -O GBK CH341SER_LINUX.ZIP
Archive: CH341SER_LINUX.ZIPcreating: CH341SER_LINUX/inflating: CH341SER_LINUX/ch34x.c inflating: CH341SER_LINUX/Makefile inflating: CH341SER_LINUX/readme.txt
ncyf@NCYF:~/Downloads$
编译安装
如果直接编译,会报错
ncyf@NCYF:~/Downloads$ cd CH341SER_LINUX/
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ ls
ch34x.c Makefile readme.txt
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ make
make -C /lib/modules/5.19.0-32-generic/build M=/home/ncyf/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 kernelThe kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0You are using: gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0CC [M] /home/ncyf/Downloads/CH341SER_LINUX/ch34x.o
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c: In function ‘ch34x_close’:
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:591:9: error: unknown type name ‘wait_queue_t’; did you mean ‘wait_event’?591 | wait_queue_t wait;| ^~~~~~~~~~~~| wait_event
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:591:22: warning: unused variable ‘wait’ [-Wunused-variable]591 | wait_queue_t wait;| ^~~~
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:590:14: warning: unused variable ‘timeout’ [-Wunused-variable]590 | long timeout;| ^~~~~~~
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:589:13: warning: unused variable ‘bps’ [-Wunused-variable]589 | int bps;| ^~~
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c: At top level:
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:1297:27: error: initialization of ‘unsigned int (*)(struct tty_struct *)’ from incompatible pointer type ‘int (*)(struct tty_struct *)’ [-Werror=incompatible-pointer-types]1297 | .write_room = ch34x_write_room,| ^~~~~~~~~~~~~~~~
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:1297:27: note: (near initialization for ‘ch34x_device.write_room’)
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:1298:28: error: initialization of ‘unsigned int (*)(struct tty_struct *)’ from incompatible pointer type ‘int (*)(struct tty_struct *)’ [-Werror=incompatible-pointer-types]1298 | .chars_in_buffer = ch34x_chars_in_buffer,| ^~~~~~~~~~~~~~~~~~~~~
/home/ncyf/Downloads/CH341SER_LINUX/ch34x.c:1298:28: note: (near initialization for ‘ch34x_device.chars_in_buffer’)
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:257:/home/ncyf/Downloads/CH341SER_LINUX/ch34x.o] 错误 1
make[1]: *** [Makefile:1850:/home/ncyf/Downloads/CH341SER_LINUX] 错误 2
make[1]: 离开目录“/usr/src/linux-headers-5.19.0-32-generic”
make: *** [Makefile:5:default] 错误 2
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
原因在 readme.txt 里面有说明
// ChangeLog
// 1.0 - 1.1 modified to solve transmition between ch341 and ch341
// 1.1 - 1.2 Support high Linux kernel
InstructionsNote: 1.Please run followed executable programs as root privilege2.Current Driver support versions of linux kernel range from 2.6.25 to 3.13.x3.Current Driver support 32bits and 64bits linux systemsUsage:(load or unload linux driver of CH34x)//compile #make//load ch34x chips driver#make load//unload ch34x chips driver#make unload
// 1.2 - 1.3 Fix some bugs
第七行Current Driver support versions of linux kernel range from 2.6.25 to 3.13.x的意思是linux内核的当前驱动程序支持版本从2.6.25到3.13.x
而我的是5.19.0-32-generic
所以需要去查看ch34x.c的 源代码,直接复制到CH341SER_LINUX/ch34x.c 中,重新make
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ make
make -C /lib/modules/5.19.0-32-generic/build M=/home/ncyf/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 kernelThe kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0You are using: gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0CC [M] /home/ncyf/Downloads/CH341SER_LINUX/ch34x.oMODPOST /home/ncyf/Downloads/CH341SER_LINUX/Module.symversCC [M] /home/ncyf/Downloads/CH341SER_LINUX/ch34x.mod.oLD [M] /home/ncyf/Downloads/CH341SER_LINUX/ch34x.koBTF [M] /home/ncyf/Downloads/CH341SER_LINUX/ch34x.ko
Skipping BTF generation for /home/ncyf/Downloads/CH341SER_LINUX/ch34x.ko due to unavailability of vmlinux
make[1]: 离开目录“/usr/src/linux-headers-5.19.0-32-generic”
ncyf@NCYF:~/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
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
此时目录下,已生成.ko文件,说明 make 成功了。
载入模块(设备驱动程序)
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ sudo make load
[sudo] ncyf 的密码:
modprobe usbserial
insmod ch34x.ko
insmod: ERROR: could not insert module ch34x.ko: Key was rejected by service
make: *** [Makefile:10:load] 错误 1
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
错误提示:Key was rejected by service
说明.ko文件需要签名。
查看驱动签名情况
ncyf@NCYF:~/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
ncyf@NCYF:~/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
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
此时没有签名。
给驱动签名
首先依赖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”。
将签名写入驱动
ncyf@NCYF:~/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
ncyf@NCYF:~/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
ncyf@NCYF:~/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
ncyf@NCYF:~/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
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
此时驱动程序数据中有~Module signature appended~,可知已写入签名。
再来载入模块(设备驱动程序)
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ sudo make load
modprobe usbserial
insmod ch34x.ko
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
对比之前的,确实载入成功了。
ncyf@NCYF:~/Downloads/CH341SER_LINUX$ sudo make load
[sudo] ncyf 的密码:
modprobe usbserial
insmod ch34x.ko
insmod: ERROR: could not insert module ch34x.ko: Key was rejected by service
make: *** [Makefile:10:load] 错误 1
ncyf@NCYF:~/Downloads/CH341SER_LINUX$
使用lsmod查看模块,发现已识别。
ncyf@NCYF:/lib/modules/5.19.0-32-generic/kernel/drivers/usb/serial$ lsmod
Module Size Used by
ch34x 24576 0
rfcomm 86016 4
有的博主说需要将目录中生成ch34x.ko文件复制到/lib/modules/$(uname -r)/kernel/drivers/usb/serial下,再使用lsmod查看模块,本人好像没做也行。
参考
解决Ubuntu22.04无法使用ch34x串口问题
linux secure boot(安全启动)下为内核模块签名
Linux驱动 - Ubuntu驱动签名
相关文章:

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题
解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题问题官网下载解压驱动包编译安装给驱动签名再来载入模块(设备驱动程序)问题 Ubuntu22.04.1 Linux版本5.19.0-32-generic 运行Qt串口通信 m_serialPort->open(QIO…...

[python入门㊿] - python如何打断点
目录 ❤ 什么是bug(缺陷) ❤ python代码的调试方式 ❤ 使用 pdb 进行调试 测试代码示例 利用 pdb 调试 退出 debug debug 过程中打印变量 停止 debug 继续执行程序 debug 过程中显示代码 使用函数的例子 对函数进行 debug 在调试的时候动态改变值 ❤ 使用 PyC…...

CCNP350-401学习笔记(501-550题)
501、Refer to the exhibit. What is the effect of the configuration? A. The device will allow users at 192.168.0.202 to connect to vty lines 0 through 4 using the password ciscotestkey B. The device will allow only users at 192 168.0.202 to connect to vty …...

音箱上8键触摸芯片绿芯GTC08L完美替换启攀微
由工采网代理提供的韩国GreenChip电容式触摸芯片-GTC08L是GreenTouch5CTM电容式触摸传感器系列之一;可以在发动机运行下进行8通道电容传感;对电磁兼容、电磁干扰、温湿度变化、电压干扰、温度漂移、湿度漂移等都有较强的抗干扰能力。不会对CS, RS,EFT&am…...

php+vue加油站会员服务系统 java微信小程序
目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 3.2网站性能需求分析 10 3.3网站功能分析 10 3.4系统…...

ES6--class类(详解/看完必会)
目录 1、基本概念 2、基本用法 3、class与构造函数的区别 4、constructor的使用 5、自定义方法 6、extends和super (1)问题一:我们想要在点击按钮二的时候改变字体大小,如何写呢? (2)问…...

ChatGPT的出现网络安全专家是否会被替代?
ChatGPT的横空出世,在业界掀起了惊涛骇浪。很多人开始担心,自己的工作岗位是否会在不久的将来被ChatGPT等人工智能技术所取代。网络安全与先进技术发展密切相关,基于人工智能的安全工具已经得到很多的应用机会,那么未来是否更加可…...

游戏服务器框架设计 总纲
服务器框架篇: 1.配置文件系统 libxml 2.日志系统 log4xx 3.数据库保存以及接口设计 4.Proto协议定义 5.Redis接口设计 6.网络层设计 epoll/iocp 7.服务器内部协议路由层设计 8.分布式节点管理设计 9.服务器负载伸缩管理设计 10.服务器进程热更流程设计 11.GM系…...

PB里post提交
PB 通过 PostRul 一、 创建Standard Class对象 type为"internetresult" n_ir 二、 界面中,增加按钮。点击测试post提交。 Blob lblb_args String ls_header String ls_url String ls_args Long ll_length Integer li_rc inet iinet_base,iinet n_ir ir iinet_ba…...

Linux 配置网卡(基础配置、网卡会话配置、网卡绑定配置)
目录 配置网卡基本信息 通过nmcli命令配置网卡 通过配置网卡文件配置网卡 通过nmtui命令配置网卡 通过nm-connection-editor命令配置网卡 网卡高级配置 配置网络会话 配置网卡绑定(Bonding) 通过nmcli命令配置网卡绑定 nm-connection-editor 进…...

深度学习Week16-yolo.py文件解读(YOLOv5)
目录 简介 需要的基础包和配置 二、主要组件介绍 2.1 parse_model 2.2Detect类 2.3DetectionModel类 三、实验 🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊…...

富文本编辑组件封装,tinymce、tinymce-vue
依赖:package.json yarn add tinymce tinymce/tinymce-vue {"dependencies": {"tinymce/tinymce-vue": "5.0.0","tinymce": "6.3.1","vue": "3.2.45",}, } 本地依赖: 在publ…...

电子作业指导书系统能树立良好的生产形象
“制造”就是以规定的成本、规定的工时、生产出品质均匀、符合规格的产品。从全球新能源汽车的发展来看,其动力电源主要包括锂离子电池、镍氢电池、铅酸电池、超级电容器,其中超级电容器大多以辅助动力源的形式出现。那么,电子作业指导书系统…...

Doris单机部署
文章目录1. 前言2. 安装3. 启动4. 使用1. 前言 Apache Doris 是一款现代 MPP (Massively Parallel Processing大规模并行处理) 的分布式 SQL 分析数据库,所谓分析数据库就是将其数据集分布在许多机器或节点上,以处理大量数据,采用 Apache 2.0…...

利用身份证号获取生日信息
1 问题如何利用Java程序从身份证号中获取生日信息。2 方法采用“截图文字代码”的方式描述。//调用函数获取当前日期以及截取身份证号码中的数字import java.util.Calendar;import java.util.Scanner;public class nain { static Scanner sc new Scanner(System.in); st…...

c++模板的简单认识
文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言 ADD函数很好写,但是如果我们要有int类型的,double类型的,char类型的等等各种类型,难道要写这么多不同的ADD函数吗,这么写简直太麻…...

真香!Linux 原来是这么管理内存的
Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。 一,基本概念 每个 Linux 进程都会有地址空间,这…...

计网之IP协议和以太网
文章目录一. IP协议1. IPv4报头介绍2. 解决IPv4地址不够用的问题3. IP地址管理4. 路由选择二. 以太网三. 浅谈DNS域名解析系统一. IP协议 IP协议是位于OSI模型中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但IP协议是网络层传输所使用的最主流的一种协议, 有IPv4和…...

华为OD机试 - 关联子串(Python) | 机试题+算法思路+考点+代码解析 【2023】
关联子串 题目 给定两个字符串str1和str2 如果字符串str1中的字符,经过排列组合后的字符串中 只要有一个是str2的子串 则认为str1是str2的关联子串 若不是关联子串则返回-1 示例一: 输入: str1="abc",str2="efghicaibii" 输出: -1 预制条件: 输入的…...

SpringBoot学习笔记(二)
配置文件分类 SpringBoot中4级配置文件 1级:file:config/application.yaml 【最高】 2级:file:application.yml 3级:classpath:config/application.yml 4级:classpath:application.…...

亚马逊云科技SageMaker:实现自动、可视化管理迭代
现如今,AI正在成为跨时代的技术,在数字经济发展中登上舞台,发挥关键作用。在Gartner发布的《2022年新兴技术成熟度曲线》*报告中,AIGC(即AI Generated Content,人工智能自动生成内容)被列为2022…...

汽车 Automotive > CAN Transceivers收发器选择
参考:https://www.nxp.com/products/interfaces/can-transceivers/3-3-v-5-v-io-can-transceivers:33VIO-CAN3.3 V / 5V IO CAN收发器组合TJA1042高速CAN收发器,具有待机模式,适用于所有类型的高速CAN网络,在需要低功耗模式的节点…...

AI将如何影响程序员的未来,以及如何不被AI所替代。
随着人工智能技术的不断发展,越来越多的工作被自动化和智能化所取代,其中程序员这个职业也不例外。然而,我们需要客观地分析AI在未来对程序员的影响,并且给出建议,以便程序员能够保持竞争力,不被AI所取代。…...

nginx 常用配置之 pass_proxy
大家好,我是 17。 今天和大家聊聊 pass_proxy 代理。 pass_proxy 代理 在前端代理主要是为了跨域。虽然前端跨域有多种方法,各有利弊,但用代理来跨域对开发是最友好的。用代理可以不用修改产品代码切换线上线下,非常安全。pass…...

Linux中驱动模块加载方法分析
如何管理驱动模块 由于Linux驱动模块众多,系统对模块加载顺序有要求,一些基础模块在系统启动时需要很早就被加载;开发者加入自己的模块时,需要维护一个模块初始化列表,上面两方面的做起来很困难,为了科学地…...

yarn 通过 resolutions,指定子孙依赖包版本号,解决froala-editor 版本问题
前端开发项目过程中会使用到各种依赖包。但是这些依赖包虽然好用,但是一味使用最新版本可能会出现各种奇葩问题,因此我们经常会针对一些依赖包指定一个稳定版本。 常用版本 版本号注释“1.0.2”必须切到1.0.2版“>1.0.2”必须大于1.0.2版“>1.0.…...

Elasticsearch7.8.0版本进阶——多文档操作流程
目录一、多文档操作1.1、多文档操作的概述1.2、多文档操作与单文档模式区别二、用单个 mget 请求取回多个文档2.1、用单个 mget 请求取回多个文档的图解2.2、用单个 mget 请求取回多个文档的步骤三、bulk API 的模式请求取回多个文档3.1、bulk API 的模式请求取回多个文档的图解…...

Scala函数式编程(第五章:函数基础、函数高级详解)
文章目录第 5 章 函数式编程5.1 函数基础5.1.1 函数基本语法5.1.2 函数和方法的区别5.1.3 函数定义5.1.4 函数参数5.1.5 函数至简原则(重点)5.2 函数高级5.2.1 高阶函数5.2.2 匿名函数5.2.3 高阶函数案例5.2.4 函数柯里化&闭包5.2.5 递归5.2.6 控制抽…...

ZED相机快速使用指南
1、安装SDK ZED SDK 3.8 - Download | Stereolabs 2、安装ros GitHub - stereolabs/zed-ros-wrapper: ROS wrapper for the ZED SDK 其他教程:ZED2相机SDK安装使用及ROS下使用_可即的博客-CSDN博客 3、官方文档 Get Started with ZED | Stereolabs 4、标定参…...

树莓派4b配置OpenWrt联网
文章目录前言一、下载固件二、配置wan口三、简单介绍1、修改无线名称、设置密码2、下载软件包总结前言 树莓派4b内置wifi模块,加一个千兆网口 好像有一种办法,通过无线wifi链接其他wifi通网,然后把这个网口作为lan口,连接电脑使…...