概述
一个工业平板电脑,原本安装的是win7系统,希望改用ubuntu系统。其他的驱动都好说,关键是有个4G模块,平板电脑厂家使用的是一个小品牌的,ubuntu内部没有集成驱动,需要自己编译驱动。这个对linux的老手来说,应该是手到擒来,轻松easy。不过对我来说,却是一脸茫然,束手无策。
厂家给了个移植手册,洋洋洒洒,描写的挺全面。现在回过头去看,里面的内容还是不错的。但是在最开始拿到这个手册的时候,那是一万个草泥马,说得啥玩意啊,不是应该像window一样,点个开始安装,然后一直下一步就好了吗?或者使用个apt-get install,一招解决。怎么稀里哗啦这么多,乱七八糟。
整理整理思路,好在,也不是在零基础的情况下做这个移植,之前在周立功的手册指导下,调试过A6G2C核心板+龙尚4G模块的驱动,对4G模块驱动的调试还是有个大概的认识。
整理下思路,说是可以下载当前ubuntu的内核源码,然后修改option.c的内容,重新编译内核。按照这个思路做了两遍,第一遍直接导致进不了系统,必须要重装系统才能进入。第二遍编译出来的内核不能正常启动,其实和第一遍的情况一样,只是这一次还能进入系统。重新编译内核的路走不通。顺便说一句,我编译了一把内核,需要4个小时才编译好,哎时间好长。。。
重新编译内核参考的文章
重新编译内核
(https://blog.csdn.net/soviet1941/article/details/104630810)
说是可以直接编译驱动模块,只加载驱动模块就可以了。那就试试这个驱动模块吧。怎么编译驱动模块啊,以前做过hello.ko的编译,现在也忘记了。那就重新做一遍。
编译hello.ko的参考文档
编译hello.ko
https://worthsen.blog.csdn.net/article/details/79227760
重要提示:如果要复制文档中的代码,一定要在将所有的空格和回车键处理一下。每一条代码都重新自己修改一下,空格啊,回车键啊,都处理一下。是的,这样很耗时间。如果你不这么做,那么会更耗时间,因为每一个空格都可能导致你编译不通过。而每一次编译不通过,都会是你不再继续下去的借口,然后就此作罢。
这个链接里,我遇到的坑有以下这些
错误信息1:
make -C /lib/modules/5.4.0-66-generic/build M= modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-66-generic'
make[2]: *** No rule to make target 'arch/x86/tools/relocs_32.c', needed by 'arch/x86/tools/relocs_32.o'.
Stop.
arch/x86/Makefile:232: recipe for target 'archscripts' failed
错误原因:
这个是由于Makefile文件的问题,Makefile中的这句话
PWD :=$(shell pwd)
$(MAKE) -C $(KERNEL) M=$(PWD) modules
其中PWD并没有实际得到目录,需要将PWD直接改为shell pwd,可能原作者是可以编译通过的。我的环境和他不一样。我必须要要使用shell pwd才行,就是需要改为以下形式
$(MAKE) -C $(KERNEL) M=$(shell pwd) modules
错误信息2:
root@ubuntu:~/liuzm/test-for-fun/hello-module# make
make -C /lib/modules/5.4.0-66-generic/build M=/home/vmuser/liuzm/test-for-fun/hello-module modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-66-generic'
CC [M]
/home/vmuser/liuzm/test-for-fun/hello-module/hello-module.o
/home/vmuser/liuzm/test-for-fun/hello-module/hello-module.c:2:9: error: #include expects "FILENAME" or <FILENAME>
#include��<linux/init.h>
^
/home/vmuser/liuzm/test-for-fun/hello-module/hello-module.c:3:9: error: #include expects "FILENAME" or <FILENAME>
#include��<linux/module.h>
^
/home/vmuser/liuzm/test-for-fun/hello-module/hello-module.c:4:1: error: stray ‘302’ in program
��
^
/home/vmuser/liuzm/test-for-fun/hello-module/hello-module.c:4:2: error: stray ‘240’ in program
��
错误原因:
.c文件中的空格和回车键导致问题,将所有的空格和回车键重新处理一下
可以编译hello.ko以后,就可以尝试编译option.ko
将修改好的option.C文件和Makefile文件放在同一个文件夹下,编译。然后报错,缺少usb-wwan.h文件,从内核源码中将这个文件拷贝过来,再次编译,编译通过。
错误信息3:
root@qzyn-desktop:/usr/src/option# make
make -C /lib/modules/5.8.0-50-generic/build M=/usr/src/option modules
make[1]: 进入目录“/usr/src/linux-headers-5.8.0-50-generic”
CC [M]
/usr/src/option/option.o
/usr/src/option/option.c:41:10: fatal error: usb-wwan.h: 没有那个文件或目录
41 | #include "usb-wwan.h"
|
^~~~~~~~~~~~
compilation terminated.
原因分析:
缺少usb-wwan.h文件,从内核源码中将这个文件拷贝过来,再次编译,编译通过。
编译通过的信息:
root@qzyn-desktop:/usr/src/option# make
make -C /lib/modules/5.8.0-50-generic/build M=/usr/src/option modules
make[1]: 进入目录“/usr/src/linux-headers-5.8.0-50-generic”
CC [M]
/usr/src/option/option.o
MODPOST /usr/src/option/Module.symvers
CC [M]
/usr/src/option/option.mod.o
LD [M]
/usr/src/option/option.ko
make[1]: 离开目录“/usr/src/linux-headers-5.8.0-50-generic”
插入驱动模块,然后报错:
错误信息4:
root@qzyn-desktop:/usr/src/option# insmod option.ko
insmod: ERROR: could not insert module option.ko: Unknown symbol in module
错误原因:
缺少需要的依赖
使用如下命令查找依赖,并加载依赖
root@qzyn-desktop:/usr/src/option# sudo modinfo option.ko|grep depend
depends:
usb_wwan,usbserial
root@qzyn-desktop:/usr/src/option# sudo modprobe usb_wwan
root@qzyn-desktop:/usr/src/option# sudo modprobe usbserial
查考资料:
重新插入驱动模块,驱动模块成功。
root@qzyn-desktop:/usr/src/option# sudo insmod option.ko
root@qzyn-desktop:/usr/src/option# ls /dev/ttyUSB*
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
错误信息5
在之前,我直接编译内核源码,也生成了一个option.ko文件,这个驱动模块直接插入的话,会报错,据说是由于内核信息不对导致的。错误信息如下:
insmod: ERROR: could not insert module option.ko: Invalid module format
注意这个错误和错误信息4的区别。
对错误做个记录,希望对后来者有所帮助。
继续加油努力,成功就在你再试一次之后。
总结
新增一个4G模块的驱动,其实很简单,只要修改option.c,将VID和PID的信息加进去,然后重新编译option.ko的驱动模块,加载这个驱动模块就可以了。以下是美格的4G模块的指导手册里的内容,将下面的+后面的内容加入到option.c里,重新编译生产option.ko。虽然总结起来就是这么简单,可是要走通这条路,也是要曲曲折折,步步坎坷。
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -85,6 +85,13 @@ static int option_probe(struct usb_serial *serial,
#define HUAWEI_PRODUCT_K3765 0x1465
#define HUAWEI_PRODUCT_K4605 0x14C6
#define HUAWEI_PRODUCT_E173S6 0x1C07
+/*[MEIG-zhaopf-2019-11-04]add for meig modem supported {*/
+#define MEIG_VENDOR_ID 0x2DEE
+#define MEIG_PRODUCT_SRM815 0x4D22
+#define MEIG_PRODUCT_SRM815_ECM 0x4D23
+#define MEIG_PRODUCT_SLM790 0x4D20
+#define MEIG_QCM_VENDOR_ID 0x05C6
+#define MEIG_QCM_PRODUCT_SLM750_SRM815_SLM868 0xF601
+/*[MEIG-zhaopf-2019-11-04]add for meig modem supported }*/
+
#define QUANTA_VENDOR_ID 0x0408
#define QUANTA_PRODUCT_Q101 0xEA02
@@ -564,6 +571,12 @@ static int option_probe(struct usb_serial *serial,
static const struct usb_device_id option_ids[] = {
+ /*[MEIG-zhaopf-2019-11-04]add for meig modem supported {*/
+ { USB_DEVICE(MEIG_VENDOR_ID, MEIG_PRODUCT_SRM815),
+ .driver_info = RSVD(4) | RSVD(5) },
+ { USB_DEVICE(MEIG_VENDOR_ID, MEIG_PRODUCT_SRM815_ECM),
+ .driver_info = RSVD(4) | RSVD(5) }, + { USB_DEVICE(MEIG_QCM_VENDOR_ID, MEIG_QCM_PRODUCT_SLM750_SRM815_SLM868),
+ .driver_info = RSVD(4) | RSVD(5) },
+ { USB_DEVICE(MEIG_VENDOR_ID, MEIG_PRODUCT_SLM790),
+ .driver_info = RSVD(0) | RSVD(5) | RSVD(6) | RSVD(7) },
+ /*[MEIG-zhaopf-2019-11-04]add for meig modem supported }*/
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
最后
以上就是温婉香水为你收集整理的ubuntu加载4G模块驱动的调试过程记录的全部内容,希望文章能够帮你解决ubuntu加载4G模块驱动的调试过程记录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复