4G网卡驱动调试分三步走:
一、基本概念

USB 部分的功能接口
APN

二、驱动移植

USB Driver
GobiNet Driver 或者 QMI WWAN
PPP 拨号配置

三、RIL 移植

RIL Driver Integration
抓取 Android Log
RIL 移植

吃颗定心丸:

4G 模块都是 MiniPCIE 接口的,包括很多 4G 模块都是 MiniPCIE 接口的。但是研究一下就会发现,这些 4G 模块虽然用了MiniPCIE 接口,但是实际上的通信接口都是 USB,所以 4G 模块的驱动就转换为了 USB 驱动。而这些 4G模块厂商都提供了详细的文档讲解如何在 Linux 下使用 4G 模块,以及如何修改 Linux 内核加入 4G 模块驱动。

一、基本概念

  1. USB 部分的功能接口
    Quectel 3G/4G模块(UMTS/HSPA/LTE)的 USB 部分包括了几个不同的功能接口。

USB Serial

ttyUSB0 代表 DM 
ttyUSB1 代表 GPS NMEA (GPS导航设备统一的RTCM标准协议)信息输出 
ttyUSB2 代表 AT commands 
ttyUSB3 代表 PPP 连接

GobiNet

在移植了 GobiNet 驱动后,会产生一个网络设备和一个 QMI channel。 
网络设备叫做 ethX(在内核版本2.6.39前叫做 usbX)QMI channel 叫做 /dev/qcqmiX 的节点。 
网络设备用来进行数据传输,QMI 通道用来进行 QMI 信息交互。 
Qualcomm Gobi is a family of embedded mobile broadband modem products by Qualcomm. 
Gobi technology was designed to allow for any product with the embedded solution to
 connect to the internet anywhere a wireless carrier provides data coverage. One 
 of the more notable products that contain a Gobi modem is the iPhone 4 for Verizon, 
 which contains a MDM6600™, however it does not take advantage of the support for HSPA+

QMI WWAN

当移植了 QMI WWAN 驱动后,驱动将会创建网络设备和 QMI channel,网络设备被称作 wwanX,QMI 
通道被命名为 /dev/cdc-wdmX。 网络设备用来进行数据传输,QMI 通道用来进行 QMI 数据交互。

CDC ACM
在移植完了 CDC ACM 驱动后,将会在 /dev 下创建如下节点

ttyACM0 用于 PPP连接器 或者 AT命令 
ttyACM1 用于 Trace1 
ttyACM2 用于 Trace2 
ttyACM3 用于 AT commands 
ttyACM4 用于 AT commands

USB 的 CDC 类是 USB 通信设备类 (Communication Device Class)的简称。 CDC 类 是 USB
组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的 USB 子类。

  1. APN
    APN 指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。

二、驱动移植
1、[KERNEL]目录下进行配置
make menuconfig

1.1 USB Driver Configure

Device Drivers  --->
    [*] USB support  --->
            <*> USB Serial Converter support
                  [*] USB Generic Serail Driver
                  [*] USB Driver for GSM and CMDA modems

1.2 USB Driver Configure

Device Drivers  --->
      [*] USB support  --->
            <*> USB Modem (CDC ACM) suppor

1.3 PPP Configure(我是全部选)

Device Drivers  --->
  [*] Network device support  --->
    <*> PPP (point-to-point protocol) support
    <*> PPP support for async serial ports
    <*> PPP support for sync tty ports
    <*> PPP Deflate compression

1.4 查看是否配置hi3751v810_arm64_android_defconfig:

CONFIG_usb_usbnet=y

Android 4G模块重启 4g模块驱动_ico

CONFIG_USB_SERAIL=y
CONFIG_USB_SERAIL_OPTION=y

Android 4G模块重启 4g模块驱动_4G_02

2、添加 USB 设备信息

在 Linux 内核中添加 ec20的 USB 设备信息,因为我们前面说了,ec20-4G 模块用的 USB 接口。打开 Linux 源码的 drivers/usb/serial/option.c 文件,找到 options_ids 数组,然后在里面添加 ec20的 PID 和 VID, 要添加的内容如下,该内容由产商提供。

Android 4G模块重启 4g模块驱动_fish_03


ec20支持 ECM 接口,可以通过 ECM 接口轻松联网,如果要使用 ECM 接口的话需要修改 drivers/usb/serial/option.c 文件里面的 option_probe 函数。找到此函数,然后在里面输入如下内容:

Android 4G模块重启 4g模块驱动_4G_04


继续在 drivers/usb/serial/option.c 文件里面找到 option_1port_device 结构体变量,在里面加入休眠后唤醒接口,如图所示:

Android 4G模块重启 4g模块驱动_4G_05


打开 drivers/usb/serial/usb_wwan.c 文件,在usb_wwan_setup_urb函数中添加零包处理代码,完成后的 usb_wwan_setup_urb 函数如下所示,就是要添加到 usb_wwan_setup_urb 函数里面的零包处理代码。

Android 4G模块重启 4g模块驱动_Android 4G模块重启_06


移植的时候最好先控制变量,第一步只移植 USB Serial Driver 部分。完成这部分的移植后 /dev/下就应该生成 ttyUSB0-ttyUSB4 。一次添加的东西多了如果出现问题不好定位问题出现的地方。

三、RIL 移植

1、打包4G的一些so库等信息相关文件到系统中将下面几个文件打包到系统中,确保系统编译完成后,文件出现在对应的目录中。

PRODUCT_COPY_FILES += \
device/hisilicon/bigfish/etc/4G/libreference-ril-ec20.so:/vendor/lib64/libreference-ril-ec20.so \
    device/hisilicon/bigfish/etc/4G/spn-conf.xml:/system/etc/spn-conf.xml \
    device/hisilicon/bigfish/etc/4G/apns-conf.xml:/system/etc/apns-conf.xml \
    device/hisilicon/bigfish/etc/4G/chat:/system/bin/chat \
    device/hisilicon/bigfish/etc/4G/ip-down:/system/etc/ppp/ip-down \
    device/hisilicon/bigfish/etc/4G/ip-up:/system/etc/ppp/ip-up \
    device/hisilicon/bigfish/etc/4G/start_softap.sh:/system/bin/start_softap.sh

注:
(device/hisilicon/bigfish/etc/4G/libreference-ril-ec20.so: 该目录下的4G模块*.so库)
(/vendor/lib64/libreference-ril-ec20.so \ 复制到系统的/vendor/lib64第三方库下面)

2、hisilicon3751\device\hisilicon\Hi3751V811\device_property.mk添加修改

PRODUCT_PROPERTY_OVERRIDES += \
	rild.libpath=/vendor/lib64/libreference-ril-ec20.so
PRODUCT_PROPERTY_OVERRIDES += \
	ro.telephony.default_network=9

Android 4G模块重启 4g模块驱动_4G_07


Android 4G模块重启 4g模块驱动_4G_08


3、修改:device\hisilicon\Hi3751V811\manifest.xml

Android 4G模块重启 4g模块驱动_Android 4G模块重启_09


4、修改设备文件权限

rk:

文件路径:system/core/rootdir/ueventd.rc,在其中添加如下几行:

/dev/ttyUSB0 0660 radio radio 
/dev/ttyUSB1 0660 radio radio 
/dev/ttyUSB2 0660 radio radio 
/dev/ttyUSB3 0660 radio radio 
/dev/ttyUSB4 0660 radio radio

注意:如果在系统中设备的序号是其它值,则应按照上述格式修改其权限。例如,如果模块的某个端口在系统中为/dev/ttyUSB10,则应添加:/dev/ttyUSB10 0660 radio radio

Hisi:
文件路径:hisilicon3751\device\hisilicon\bigfish\etc\ueventd.bigfish.rc

/dev/ttyUSB*               0666   radio      radio
/dev/cdc-wdm0             0660   radio      vpn
/dev/qcqmi0               0660   radio      vpn
/dev/veb_a3               0666   system     system

调试遇到的问题:

a、没有生成ttyusb*这个节点

判断id是否存在,插入ec20模块,使用在打印终端使用命令:lsusb查看,然后拔掉在查看一次。如下

Android 4G模块重启 4g模块驱动_Android 4G模块重启_10


发现有ec20的id信息,说明能识别到模块,再配置有没有问题。添加如下的配置:

Android 4G模块重启 4g模块驱动_fish_11


编译下载后:节点出来了

Hi3751V811:/dev # ls ttyUSB 
ttyUSB0  ttyUSB1  ttyUSB2  ttyUSB3

ping一下百度:测试ok!!!

130|Hi3751V811:/ # ping www.baidu.com 
PING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.
64 bytes from 163.177.151.110: icmp_seq=1 ttl=54 time=29.3 ms
64 bytes from 163.177.151.110: icmp_seq=2 ttl=54 time=30.3 ms
64 bytes from 163.177.151.110: icmp_seq=3 ttl=54 time=28.4 ms
64 bytes from 163.177.151.110: icmp_seq=4 ttl=54 time=35.5 ms
64 bytes from 163.177.151.110: icmp_seq=5 ttl=54 time=27.7 ms
--- www.a.shifen.com ping statistics ---
30 packets transmitted, 30 received, 0% packet loss, time 29040ms
rtt min/avg/max/mdev = 26.741/28.988/36.052/2.371 ms