目录

GobiNet-驱动移植调试

目录

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端口信息

某模组的端口列表为:

https://i-blog.csdnimg.cn/direct/661bf21a3f0d4b7d829e6dc50676bb4b.png

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

… …*

  1. 在 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的顺序相同。