我是靠谱客的博主 温婉香水,这篇文章主要介绍ubuntu加载4G模块驱动的调试过程记录,现在分享给大家,希望可以做个参考。

一个工业平板电脑,原本安装的是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:

复制代码
1
2
3
4
5
6
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中的这句话

复制代码
1
2
3
PWD :=$(shell pwd) $(MAKE) -C $(KERNEL) M=$(PWD) modules

其中PWD并没有实际得到目录,需要将PWD直接改为shell pwd,可能原作者是可以编译通过的。我的环境和他不一样。我必须要要使用shell pwd才行,就是需要改为以下形式

复制代码
1
2
$(MAKE) -C $(KERNEL) M=$(shell pwd) modules

错误信息2:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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:

复制代码
1
2
3
4
5
6
7
8
9
10
11
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文件,从内核源码中将这个文件拷贝过来,再次编译,编译通过。

编译通过的信息:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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:

复制代码
1
2
3
root@qzyn-desktop:/usr/src/option# insmod option.ko insmod: ERROR: could not insert module option.ko: Unknown symbol in module

错误原因:
缺少需要的依赖
使用如下命令查找依赖,并加载依赖

复制代码
1
2
3
4
5
6
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

查考资料:

重新插入驱动模块,驱动模块成功。

复制代码
1
2
3
4
5
6
7
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文件,这个驱动模块直接插入的话,会报错,据说是由于内核信息不对导致的。错误信息如下:

复制代码
1
2
insmod: ERROR: could not insert module option.ko: Invalid module format

注意这个错误和错误信息4的区别。

对错误做个记录,希望对后来者有所帮助。
继续加油努力,成功就在你再试一次之后。

总结

新增一个4G模块的驱动,其实很简单,只要修改option.c,将VID和PID的信息加进去,然后重新编译option.ko的驱动模块,加载这个驱动模块就可以了。以下是美格的4G模块的指导手册里的内容,将下面的+后面的内容加入到option.c里,重新编译生产option.ko。虽然总结起来就是这么简单,可是要走通这条路,也是要曲曲折折,步步坎坷。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--- 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模块驱动内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部