Linux系统下CH365/CH367驱动程序编译及安装
2021-11-17 17:19:33 来源:华启智能
本文主要介绍公司KCPI-1847、KPCI-1840、KPCIE-1847和KPCIE-1840使用了CH365/CH367芯片等型号板卡在Linux系统下(包括国产的中标麒麟跟银河麒麟系统)驱动的编译和安装。
1. 使用的系统环境
本文使用Ubuntu 20.04 LTS版本Linux系统为测试环境。

2. 使用到的工具软件介绍
Linux系统下编译CH365/CH367的驱动使用到的工具主要有gcc和make,版本如下所示:

3. 下载CH365/CH367驱动的源代码CH36X_LINUX.ZIP,解压后文件结构如下:

4. 编译CH365/CH367驱动
执行cd指令进入drv目录下,执行make指令编译驱动程序。

执行make指令会遇到警告和错误,不重要的警告可以忽略,错误却不能忽略。
/home/ubuntu/CH36X_LINUX/drv/ch36x.c: In function ‘ch36x_init’:
/home/ubuntu/CH36X_LINUX/drv/ch36x.c:1679:56: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
1679 | printk(KERN_INFO "-->WCH ch36x dirver init %s, %s\n", __DATE__,
| ^~~~~~~~
/home/ubuntu/CH36X_LINUX/drv/ch36x.c:1680:9: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
1680 | __TIME__);
| ^~~~~~~~
/home/ubuntu/CH36X_LINUX/drv/ch36x.c: In function ‘ch36x_exit’:
/home/ubuntu/CH36X_LINUX/drv/ch36x.c:1736:56: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
1736 | printk(KERN_INFO "-->WCH ch36x driver exit %s, %s\n", __DATE__,
| ^~~~~~~~
/home/ubuntu/CH36X_LINUX/drv/ch36x.c:1737:9: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
1737 | __TIME__);
| ^~~~~~~~
At top level:
/home/ubuntu/CH36X_LINUX/drv/ch36x.c:778:1: warning: ‘ch365_interrupt_handler’ defined but not used [-Wunused-function]
778 | ch365_interrupt_handler(int irq, void *dev_id)
| ^~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:288:/home/ubuntu/CH36X_LINUX/drv/ch36x.o] 错误 1
make[1]: *** [Makefile:1849:/home/ubuntu/CH36X_LINUX/drv] 错误 2
make[1]: 离开目录“/usr/src/linux-headers-5.11.0-37-generic”
make: *** [Makefile:12:modules] 错误 2
网络上提供的解决方法如下:
1. 在编译驱动的相应 Makefile 中增加一行:CFLAGS += -Wno-error=date-time,然后保存重新 make;
2. 若 CFLAGS 不生效,将关键字替换为 EXTRA_FLAGS;
3. 修改 /lib/modules/'uname -r'/build/Makefile 文件,找到包含 “-Werror=date-time” 这一行注释掉,然后保存退出。之后重新 make 即可;
刘工分析报错是因为ch36x.c文件中1679和1735两行使用到了__DATE__,__TIME__。
经验证如下两种办法均可解决编译错误问题:
1. 直接注释掉使用了__DATE__,__TIME__这两个变量的相关代码行。
2. 修改/lib/modules/5.11.0-37-generic/build/Makefile文件注释掉KBUILD_CFLAGS += -Werror=date-time

重新执行make指令,可成功编译出CH365/CH367的驱动文件ch36x.ko。
ubuntu@LK:~/CH36X_LINUX/drv$ make
make -C /lib/modules/5.11.0-37-generic/build M=/home/ubuntu/CH36X_LINUX/drv
make[1]: 进入目录“/usr/src/linux-headers-5.11.0-37-generic”
make[1]: 离开目录“/usr/src/linux-headers-5.11.0-37-generic”
ubuntu@LK:~/CH36X_LINUX/drv$ ls
ch36x.c ch36x.ko ch36x.mod.c ch36x.mod.o Makefile Module.symvers
ch36x.dwo ch36x.mod ch36x.mod.dwo ch36x.o modules.order
5. 安装编译成功的驱动文件ch36x.ko
执行sudo insmod /home/ubuntu/CH36X_LINUX/drv/ch36x.ko 安装驱动
ubuntu@LK:~/CH36X_LINUX/drv$ sudo insmod /home/ubuntu/CH36X_LINUX/drv/ch36x.ko
执行 lsmod
ubuntu@LK:~/CH36X_LINUX/drv$ lsmod
Module Size Used by
ch36x 28672 0

参考资料:
1.linux - ch367驱动编译,https://blog.csdn.net/rong11417/article/details/102909500
2.Linux 驱动编译报错:error: macro "__DATE__" ,https://blog.csdn.net/rong11417/article/details/102909453