CH9344 驱动安装

USB转多路485

Posted by LXG on June 18, 2024

USB转8串口芯片 CH348

Linux 驱动

CH9344SER_LINUX_ZIP


CH9344SER_LINUX/LINUX$ tree
.
├── demo
│   └── ch9344_demo_gpio.c
├── driver
│   ├── ch9344.c
│   ├── ch9344.h
│   └── Makefile
├── lib
│   ├── ch9344_lib.c
│   └── ch9344_lib.h
└── README.md

驱动下载

sudo snap install curl

curl -o CH9344SER_LINUX.ZIP http://rk3588image.wif.ink/driver/ch348/CH9344SER_LINUX.ZIP

unzip CH9344SER_LINUX.ZIP

内核升级

sudo yum update kernel

reboot

编译环境准备

sudo yum install kernel-headers-3.10.0-1160.119.1.el7.x86_64

sudo yum install kernel-devel-3.10.0-1160.119.1.el7.x86_64

编译失败 1


[root@localhost driver]# make
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build  M=/root/LINUX/driver  
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
arch/x86/Makefile:96: stack-protector enabled but compiler support broken
arch/x86/Makefile:169: *** CONFIG_RETPOLINE=y, but not supported by the compiler. Compiler update recommended.。 停止。
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”

解决方案

vim /usr/src/kernels/3.10.0-1160.119.1.el7.x86_64/include/config/auto.conf

vim /usr/src/kernels/3.10.0-1160.119.1.el7.x86_64/.config

注释掉 CONFIG_RETPOLINE=y

编译失败 2


[root@localhost driver]# make
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build  M=/root/LINUX/driver  
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
arch/x86/Makefile:96: stack-protector enabled but compiler support broken
Makefile:648: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
make[1]: gcc:命令未找到
  LD      /root/LINUX/driver/built-in.o
  CC [M]  /root/LINUX/driver/ch9344.o
/bin/sh: gcc: 未找到命令
make[2]: *** [/root/LINUX/driver/ch9344.o] 错误 127
make[1]: *** [_module_/root/LINUX/driver] 错误 2
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
make: *** [default] 错误 2

解决方案

sudo yum -y install gcc

Centos 7 驱动安装失败


[root@localhost driver]# make install
make -C /lib/modules/3.10.0-957.el7.x86_64/build  M=/root/LINUX/driver  
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
insmod ch9344.ko || true
insmod: ERROR: could not insert module ch9344.ko: Invalid parameters
mkdir -p /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/usb/serial/ || true
cp -f ./ch9344.ko /lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/usb/serial/ || true
depmod -a
depmod: ERROR: fstatat(3, buildbak): No such file or directory

问题原因: 当前系统内核版本和编译驱动使用的内核版本不一致导致

  • 当前运行的内核版本: 3.10.0-957.el7.x86_64
  • 编译驱动使用的内核版本: 3.10.0-1160.119.1.el7.x86_64

[root@localhost lib]# rpm -qa | grep kernel
kernel-headers-3.10.0-1160.119.1.el7.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-devel-3.10.0-1160.119.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64

解决方案: 升级内核版本


[root@localhost lib]# sudo yum update kernel
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * centos-sclo-rh: mirrors.aliyun.com
 * centos-sclo-sclo: mirrors.aliyun.com
 * epel: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 kernel.x86_64.0.3.10.0-1160.119.1.el7 将被 安装

升级后命令查看内核版本


[root@localhost ~]# rpm -qa | grep kernel
kernel-headers-3.10.0-1160.119.1.el7.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-3.10.0-1160.119.1.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-devel-3.10.0-1160.119.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64


编译驱动并安装


[root@localhost driver]# make clean 
rm -rf *.mk .tmp_versions Module.symvers *.mod.c *.o *.ko .*.cmd Module.markers modules.order *.a *.mod

[root@localhost driver]# make 
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build  M=/root/LINUX/driver  
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
  LD      /root/LINUX/driver/built-in.o
  CC [M]  /root/LINUX/driver/ch9344.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/LINUX/driver/ch9344.mod.o
  LD [M]  /root/LINUX/driver/ch9344.ko
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
[root@localhost driver]# make install
make -C /lib/modules/3.10.0-1160.119.1.el7.x86_64/build  M=/root/LINUX/driver  
make[1]: 进入目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: 离开目录“/usr/src/kernels/3.10.0-1160.119.1.el7.x86_64”
insmod ch9344.ko || true
mkdir -p /lib/modules/3.10.0-1160.119.1.el7.x86_64/kernel/drivers/usb/serial/ || true
cp -f ./ch9344.ko /lib/modules/3.10.0-1160.119.1.el7.x86_64/kernel/drivers/usb/serial/ || true
depmod -a

[root@localhost ~]# ls /dev/ttyCH9344USB*
/dev/ttyCH9344USB0  /dev/ttyCH9344USB1  /dev/ttyCH9344USB2  /dev/ttyCH9344USB3  /dev/ttyCH9344USB4  /dev/ttyCH9344USB5  /dev/ttyCH9344USB6  /dev/ttyCH9344USB7

配置设备重启后驱动自动加载

sudo cp LINUX/driver/ch9344.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/

此命令的作用是将 ch9344.ko 内核模块复制到系统的内核模块目录中。这样,系统才能在需要时加载该模块,并且在内核启动时能够识别和使用它

sudo depmod

作用是更新 Linux 内核模块的依赖关系并生成相应的缓存文件

sudo modprobe ch9344

作用是加载 ch9344 内核模块,处理模块的依赖关系,初始化驱动,并使内核能够与对应的硬件设备进行交互

方式一

sudo vim /etc/modules-load.d/ch9344.conf


ch9344

方式二

sudo nano /etc/systemd/system/ch9344.service

[Unit]
Description=Load Ch9344 Kernel Module
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/sbin/modprobe ch9344
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload

sudo systemctl enable ch9344.service

sudo systemctl start ch9344.service


[root@localhost modules]# sudo systemctl daemon-reload
[root@localhost modules]# sudo systemctl enable ch9344.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ch9344.service to /etc/systemd/system/ch9344.service.

两种方式的对比

特性 方式一:使用 /etc/modules-load.d/ 方式二:使用 systemd 服务
简洁性 非常简洁,只需创建一个配置文件并指定模块名。 稍复杂,需要创建一个 systemd 服务文件并配置启动条件。
灵活性 灵活性较低,仅能在启动时自动加载模块。 高度灵活,可以设置加载顺序、依赖、延迟加载等。
控制能力 控制能力较弱,无法进行高级的模块管理。 高度可控,可以自定义服务的行为,如重启、日志记录等。
适用场景 适用于简单的模块加载需求。 适用于需要复杂逻辑、依赖管理、延迟加载等的场景。
配置复杂度 配置简单,只需一个配置文件。 配置较复杂,需要创建 systemd 服务文件,并编写相应的配置。
启动顺序控制 只能按系统默认顺序加载模块。 可以通过 After 指定加载顺序,控制模块在特定服务后加载。
调试和监控 仅通过日志查看是否加载成功,缺少其他调试和监控功能。 可以通过 systemd 的状态管理和日志功能进行监控和调试。
服务管理 没有服务管理功能。 支持服务的启动、停止、重启等操作,可以方便地进行模块管理。

ubuntu 22.04

sudo apt-get install build-essential linux-headers-$(uname -r)

报错1


make install
make -C /lib/modules/6.1.57/build  M=/home/pi/LINUX/driver  
make[1]: *** /lib/modules/6.1.57/build: No such file or directory.  Stop.
make: *** [Makefile:5: default] Error 2

报错2


pi@bogon:~/LINUX/driver$ sudo apt-get install build-essential linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package linux-headers-6.1.57
E: Couldn't find any package by glob 'linux-headers-6.1.57'
E: Couldn't find any package by regex 'linux-headers-6.1.57'

最终失败的解决方案

安装linux-headers-6.1.57

sudo apt update

sudo apt upgrade

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.57.tar.xz

wget http://rk3588image.wif.ink/driver/linux-6.1.57.tar.xz

sudo cp linux-6.1.57.tar.xz /usr/src/

cd /usr/src/

sudo tar xvf linux-6.1.57.tar.xz

sudo make olddefconfig


pi@bogon:~/LINUX/linux-6.1.57$ make olddefconfig
  LEX     scripts/kconfig/lexer.lex.c
/bin/sh: 1: flex: not found
make[1]: *** [scripts/Makefile.host:9: scripts/kconfig/lexer.lex.c] Error 127
make: *** [Makefile:704: olddefconfig] Error 2

sudo apt-get install flex

sudo apt-get install bison

sudo apt-get install libssl-dev

sudo make modules_prepare

sudo make headers

sudo apt-get install rsync

sudo make headers_install

sudo ln -sf /usr/src/linux-6.1.57/ /lib/modules/$(uname -r)/build

编译警告


pi@NanoPi-R6C:~/LINUX/driver$ make
make -C /lib/modules/6.1.57/build  M=/home/pi/LINUX/driver  
make[1]: Entering directory '/usr/src/linux-6.1.57'
  CC [M]  /home/pi/LINUX/driver/ch9344.o
  MODPOST /home/pi/LINUX/driver/Module.symvers
WARNING: Module.symvers is missing.
         Modules may not have dependencies or modversions.
         You may get many unresolved symbol warnings.
WARNING: modpost: "_raw_spin_lock_irqsave" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "_raw_spin_unlock_irqrestore" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "__tty_alloc_driver" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "tty_std_termios" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "tty_register_driver" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "usb_register_driver" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "tty_unregister_driver" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "tty_driver_kref_put" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "_printk" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: "usb_bulk_msg" [/home/pi/LINUX/driver/ch9344.ko] undefined!
WARNING: modpost: suppressed 81 unresolved symbol warnings because there were too many)
  CC [M]  /home/pi/LINUX/driver/ch9344.mod.o
  LD [M]  /home/pi/LINUX/driver/ch9344.ko
make[1]: Leaving directory '/usr/src/linux-6.1.57'

最终因为头文件编译不完整导致此方案失败

友善官方文档提供的解决方案

NanoPi_R6C-Wiki

更换软件源为国内镜像源

sudo cp /etc/apt/sources.list /etc/apt/sources.list.org

sudo sed -i -e ‘s/ports.ubuntu.com/mirrors.ustc.edu.cn/g’ /etc/apt/sources.list

更新软件包列表

sudo apt-get update

安装软件中心

sudo apt-get install snapd sudo snap install snap-store

安装内核头文件

sudo dpkg -i /opt/archives/linux-headers-6.1.57_6.1.57-13_arm64.deb

r6c_ubuntu

gcc-12 安装


make -C /lib/modules/6.8.0-45-generic/build  M=/home/user/LINUX/driver
make[1]: Entering directory '/usr/src/linux-headers-6.8.0-45-generic'
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
  You are using:
  CC [M]  /home/user/LINUX/driver/ch9344.o
/bin/sh: 1: gcc-12: not found
make[3]: *** [scripts/Makefile.build:243: /home/user/LINUX/driver/ch9344.o] Error 127
make[2]: *** [/usr/src/linux-headers-6.8.0-45-generic/Makefile:1925: /home/user/LINUX/driver] Error 2
make[1]: *** [Makefile:240: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.8.0-45-generic'
make: *** [Makefile:7: default] Error 2

解决方案

sudo apt install gcc-12 g++-12