GobiNet 驱动移植调试
1. 背景概述
因遇到 Android Ndis 拨号 GobiNet 驱动移植问题,导致 Android RIL 测试阻
塞,经分析梳理,现将该问题处理过程中的问题及解决方法简单整理,作为后续 Android
GobiNet 驱动移植的参考。
知识拓展:Gobi 其实是高通的数据卡和模块的一个系列,有 Gobi2000/Gobi3000/Gobi4000 等系列。GobiNet 驱动就是针对高通 Gobi 系列的 NDIS 网卡驱动,其实就是 Qualcomm CDC/ECM 驱动(也叫 RmNet 驱动)。拨号成功后,客户端系统通过 DHCP client获取模块 DHCP server 分配的 IP。
2. USB端口信息
某模组的端口列表为:
3. Gobinet驱动集成
Gobinet驱动一般是基于平台提供的源码基础上修改而来的,一般包含makefile、GobiUSBnet.c、QMI.c、QMI.h、QMIDevice.c、QMIDevice.h以及Structs.h文件。
3.1 Gobinet驱动添加系统组件
Gobinet驱动需要内核的usbnet驱动支持,因此需要配置Linux内核,配置方法如下:
cd kernel
make menuconfig
device drivers->Network device support->usb Network Adapters
选中如下组件,然后保存配置:
Multi-purpose USB Networking Framework
3.2 Gobinet驱动编译
用户可以编译为*.ko形式,也可以将代码放入内核中一起编译为*.o形式。
编译为*.ko形式:修改 Makefile 中 KDIR 的值为 kernel 的编译路径, 在 driver 目录下执行 make 命令,编译成功就可以生成 GobiNet.ko 驱动。
编译为*.o形式:将代码文件复制到用户自己的 kernel 代码的 drivers/net/usb 目录下;
在 drivers/net/usb/Makefile 中增加以下内容:
obj-y += GobiNet.o
GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o
之后每次编译内核都会自动编译 Gobinet驱动。
3.3 Gobinet驱动加载
驱动加载的两种方式如下:
1.通过 insmod 命令加载Gobinet驱动:
sudo insmod GobiNet.ko
驱动一般默认 debug 关闭,可以采用如下方式开启:
ehco 1 > /sys/module/GobiNet/parameters/debug
2.通过 modprobe 命令加载 Gobinet 驱动:
在 driver 目录执行 make install 命令;
sudo make install
会将驱动安装到系统的 module 目录中,并且分析依赖关系,将相关模块同时加载。
然后使用ifconfig命令查看网卡信息,一般如果出现usb0则表示驱动加载成功。
4. USB串口驱动集成
4.1 USB串口驱动添加系统组件
USB串口驱动添加需要配置Linux内核,配置方法如下:
cd kernel
make menuconfig
device drivers->usb support->usb serial converter support
选中如下组件,然后保存配置:
USB driver for GSM and CDMA modems
4.2 代码修改
1. 打开内核源码文件 option.c(路径一般为 drivers/usb/serial/option.c)。在源码中找到 option_ids 数组,
在数组中添加某产品的 VID和 PID;
static const struct usb_device_id option_ids[] = {
… …
#if 1
{ USB_DEVICE(VID, PID) },
#endif
… …
2. 在 USB 串口驱动中,过滤 NDIS 接口。由于 USB 串口跟 NDIS 都属于非标准 CDC 设备,需要防止NDIS 口被 USB 串口驱动加载而导致无法正常加载 NDIS 口驱动。
在 probe 函数内判断当前的 interface num 进行过滤,具体如下:
#if 1
if (serial->dev->descriptor.idVendor == cpu_to_le16(VID) &&
serial->dev->descriptor.idProduct == cpu_to_le16(PID) &&
serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) {
printk(KERN_INFO “Discover the 4 th interface for fibocom\n”);
return –ENODEV;
}
#endif
4.3 USB串口驱动加载
执行 sudo modprobe option,使用 lsusb 和 ls /dev/ttyUSB*命令,查看是否加载成功。一般会加载出/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2、/dev/ttyUSB3之类的端口,端口顺序与章节2的顺序相同。