在linux下加载驱动有两种常用方法:静态加载和动态加载。
- 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用。静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间。
- 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行内核的裁剪,将不需要的驱动去除,大大减小了内核的存储容量。
在台式机上,一般采用动态加载的方式;在嵌入式产品里,可以先采用动态加载的方式进行调试,调试成功后再编译进内核。
一开始在纠结是选择模块化添加驱动**.ko还是直接把驱动编译进内核,既然我已经会烧写内核了,那把驱动直接编译进内核也不像想象中那么困难,参照《UC20&EC20 Linux GobiNet User Guide》和网上一些资料,根据自己的理解,总结出海思3531添加移远EC20模块的详细过程。
UC20是3g通信模块,EC20是4g通信模块;
1. 介绍
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定(理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。)
VID和PID其实就相当于USB硬件的识别ID系统,也是通过他们来找到UC20/EC20设备的。
Product |
PID |
VID |
UC20 |
0x9003 |
0x05c6 |
EC20 |
0x9215 |
0x05c6 |
2. 在Linux中集成GobiNet
为了在Linux中为Quectel模块使用NDIS接口(Network Driver InterfaceSpecification,即网络驱动接口规范),必须集成GobiNet驱动程序。在linux内核中增加程序需要完成以下三项工作:
1.将编写的源代码添加到Linux内核源代码的相应目录
2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项
3.在目录的Makefile文件中增加对新源代码的编译条目
2.1 在内核中添加驱动源码
- 找到海思3531的内核源代码版本并解压它。
- 将GobiNet驱动程序源代码(ec20/DriveRSourceCode/src下的.c和.h文件)放入($_KERNELROOT)/ drivers / net / usb目录中。($ _KERNELROOT)应该内核源代码的根目录。
2.2 解除USB串口驱动对NDIS接口的绑定
NDIS不是串口设备,因此要在串口驱动中去掉这个端口。在集成GobiNet驱动程序之前,先解除USB串口驱动对NDIS接口的绑定。
- 打开源代码根目录中的文件:($_KERNELROOT)/drivers/usb/serial/option.c ,然后修改option_probe函数中的源代码。注意到指导书给的修改示例和源代码使用的变量名是不一样的,把变量名也修改成一样。