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 模块驱动。
一、基本概念
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、[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
CONFIG_USB_SERAIL=y
CONFIG_USB_SERAIL_OPTION=y
2、添加 USB 设备信息
在 Linux 内核中添加 ec20的 USB 设备信息,因为我们前面说了,ec20-4G 模块用的 USB 接口。打开 Linux 源码的 drivers/usb/serial/option.c
文件,找到 options_ids
数组,然后在里面添加 ec20的 PID 和 VID
, 要添加的内容如下,该内容由产商提供。
ec20支持 ECM 接口,可以通过 ECM 接口轻松联网,如果要使用 ECM 接口的话需要修改 drivers/usb/serial/option.c
文件里面的 option_probe 函数。找到此函数,然后在里面输入如下内容:
继续在 drivers/usb/serial/option.c 文件里面找到 option_1port_device 结构体变量,在里面加入休眠后唤醒接口,如图所示:
打开 drivers/usb/serial/usb_wwan.c 文件,在usb_wwan_setup_urb函数中添加零包处理代码,完成后的 usb_wwan_setup_urb 函数如下所示,就是要添加到 usb_wwan_setup_urb 函数里面的零包处理代码。
移植的时候最好先控制变量,第一步只移植 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
3、修改:device\hisilicon\Hi3751V811\manifest.xml
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
/dev/qcqmi0 0660 radio
/dev/veb_a3 0666 system system
调试遇到的问题:
a、没有生成ttyusb*这个节点
判断id是否存在,插入ec20模块,使用在打印终端使用命令:lsusb查看,然后拔掉在查看一次。如下
发现有ec20的id信息,说明能识别到模块,再配置有没有问题。添加如下的配置:
编译下载后:节点出来了
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