hi3798mv100编译ch341串口驱动
这是一场持久战
查阅了无数资料
经历了无数失败
直到...
[373010.516498] usbcore: registered new interface driver ch341
[373010.516706] usbserial: USB Serial support registered for ch341-uart
首先感谢各位前辈的分享:
@teasiu https://www.znds.com/tv-1207323-1-1.html
@AyFun https://github.com/AyFun/HiSTBLinux_drive
@07bug https://github.com/07bug/HiSTBLinuxV100R005C00SPC060
@三见故山秋 https://blog.csdn.net/m0_48931482/article/details/136988649?spm=1001.2014.3001.5502
那就开始吧。
盒子的基本信息:
板型名称 : hi3798mv100_hi3798mdmo1d
CPU 信息 : hi3798mv100-series@4核处理器 | armv7l架构
系统版本 : Ubuntu 20.04.6 LTS | V20230401-4.4.35_ecoo_81092768-32
编译所用的pc系统信息,是腾讯云的服务器...
Distributor ID: Ubuntu
Description: Ubuntu 20.04 LTS
Release: 20.04
一、下载SDK
https://github.com/07bug/HiSTBLinuxV100R005C00SPC060
解压到root目录下。
二、编译环境
安装需要的编译工具
apt-get install gcc make gettext bison flex bc zlib1g-dev libncurses5-dev lzma
三、编译
1.根据盒子拷贝相应的config
cp configs/hi3798mv100/hi3798mdmo1d_hi3798mv100_cfg.mak cfg.mak
2.make hiboot
这一步是为了生成交叉编译工具链
# 首先要配置以下环境变量 在sdk根目录下
source ./env.sh
make hiboot
大概38秒就完成了。
3.编译内核
这一步是为了编译依赖吧,反正不编译没法直接编译模块
cd /root/HiSTBLinuxV100R005C00SPC060/source/kernel
make all
解决:
wget 下载linux-4.4.35.tar.gz到third_party/open_source/下
# 先删除
rm ../../third_party/open_source/linux-4.4.35.tar.gz
# 下载到third_party/open_source/
wget -P ../../third_party/open_source/ https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.35.tar.gz
4.收集盒子信息:
在盒子上看看你的内核版本是多少
uname -r
然后到 /lib/modules/4.4.35ecoo 目录下找到任意一个驱动,查看驱动信息。
modinfo cfg80211.ko
5.到编译机器上编辑vermagic.h文件
编译完成后会出现linux-4.4.y目录
vim linux-4.4.y/include/linux/vermagic.h
看下面的拼接字符要和modinfo cfg80211.ko里面的一致
我这边是:替换 UTS_RELEASE 为 4.4.35_ecoo_xxxx;删掉了MODULE_VERMAGIC_PREEMPT的内容
6.下载官网ch341驱动
https://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html
在root下mkdir个ch341目录
把下载的驱动ch341.h/ch341.c放在里面,不要官网的Makefile文件。
7.创建ch341的Makefile文件
vim /root/ch341/Makefile
键入以下内容:
obj-m := ch341.o
KDIR := /root/HiSTBLinuxV100R005C00SPC060-master/source/kernel/linux-4.4.y # 修改为你的 Linux 内核源码路径
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
8.编辑Makefile文件,主要是交叉编译参数太多,图个方便,避免出错!
vim Makefile
拷贝上面menuconfig
新行粘贴后修改menuconfig为M=/root/ch341 modules
9.开始编译模块
# 开始make
make ch341
10.进入 /root/ch341 拷贝ko到盒子
cd /root/ch341
注意了下面是盒子上操作了
1.加载驱动
insmod ch341.ko
报错:insmod: ERROR: could not insert module ch341.ko: Invalid module format
输入dmesg | tail查看具体错误:
dmesg | tail
啥错误没提示那就是合适了,恭喜你!
2.放到 /usr/lib/modules/4.4.35_xxxx/kernel/drivers
cp ch341.ko /usr/lib/modules/4.4.35_xxxx/ch341.ko
# 更新模块依赖
depmod -a
# 查看状态
dmesg | tail
3.开机自动加载
编辑/etc/modules在最后加入ch341
vim /etc/modules
4.重启后验证
lsmod | grep ch341
@ayFun 提到的官网的串口驱动死机问题:
测试在minicom下确实会卡死,测试 echo "test" > /dev/ttyCH341USB0 也是可以正常接受到的。
在screen工具下不会的,screen /dev/ttyCH341USB0 9600 完美!
还有sdk自带的ch341驱动在接收的时候丢数据延迟,不知道什么原因。
至此完毕,祝君成功!