定制Android之4G-LTE模块驱动
一. 简介
本文讲述在Android内核中,添加中国移动4G-LTE制式华为MU909模块驱动,实现通过4G上网业务,电话业务,短信业务。
CPU:Samsung 6410
Kernel:linux 2.6.36
System: Android 2.3
4Gmod:HUAWEI—MU909
Authority:ACE 2014-12-8
华为模块在Android端使用的驱动分为两部分:
定制接口:对应的驱动为option,需要将华为模块的驱动适配数据添加到驱动才能被usb识别和使用。
通用接口:ECM,华为模块直接适配通用驱动。暂时无需修改代码。
二.具体内容
华为模块以PCI-E接口封装,主要以USB接口为通讯接口,将USB口虚拟成ttyUSB,将作为华为的定制接口,包括Modem PPP拨号,PCUI基本AT指令响应端口,Diag 日志抓取端口。
涉及三个文件:
/drivers/usb/serial/option.c
/drivers/usb/serial/usb_wwan.c
/include/linux/usb.h
2.1 usb转serial驱动
2.1.1 /include/linux/usb.h 添加
#define USB_VENDOR_AND_INTERFACE_INFO(vend,cl, sc, pr) \
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
|USB_DEVICE_ID_MATCH_VENDOR, \
.idVendor = (vend), \
.bInterfaceClass = (cl), \
.bInterfaceSubClass = (sc), \
.bInterfaceProtocol = (pr)
2.1.2
/drivers/usb/serial/option.c在static const struct usb_device_id option_ids[]
添加华为模块的ID,协议码等。
参数内容为{VID,InterfaceClass,InterfaceSubClass, InterfaceProtocol}
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID,0xff, 0xff, 0xff) },
{USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x01) },
2.1.3 USB零包机制
根据USB协议,添加关于传输中零包的处理
修改/drivers/usb/serial/usb_wwan.c,
增加bcdUSB值和华为vid值的定义
#define HW_bcdUSB 0x0110
#define HUAWEI_VENDOR_ID 0x12d1
在usb_wwan_write 函数中添加零包语句
intusb_wwan_write()
{
;;;
struct usb_host_endpoint *ep=NULL;
}
在usb_wwan_write 函数中添加零包判断
int usb_wwan_write()
{
;;;
if((HUAWEI_VENDOR_ID ==port->serial->dev->descriptor.idVendor)
&& (HW_bcdUSB !=port->serial->dev->descriptor.bcdUSB)){
ep = usb_pipe_endpoint(this_urb->dev, this_urb->pipe);
if(ep && (0 != this_urb->transfer_buffer_length)
&& (0 == this_urb->transfer_buffer_length %
ep->desc.wMaxPacketSize)){
this_urb->transfer_flags |= URB_ZERO_PACKET;
}
}
3.编译usb-serial进内核
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_OPTION=y
CONFIG_USB_SERIAL_WWAN=y
终端输入#make menuconfig
4. PPP 拨号配置
相关配置项:
CONFIG_PPP=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=y
5.CDC驱动
CDC驱动是华为模块适配标准的ECM通用驱动,无需代码修改,LTE模块使用PPP-modem拨号的方式进行数据业务。
修改Android内核的配置项
CONFIG_USB_USBNET=y
CONFIG_NETDEVICES=y
CONFIG_USB_NET_CDCETHER=y
6. usb-serial 电源管理集成
Usb-serial驱动需要内核支持selectivesuspend 电源管理,修改 /driver/usb/serial/option.c
找到static struct usb_serial_driver option_1port_device ={
.attach = usb_wwan_startup //添加接口
}
在usb_wwan_startup() 添加
{
if (serial->dev->descriptor.idVendor== HUAWEI_VENDOR_ID) {
if ( 0 !=(serial->dev->config->desc.bmAttributes & 0x20)){
usb_enable_autosuspend(serial->dev);
}
}
}
配置内核
CONFIG_USB_SUPPORT=y
CONFIG_USB =y
CONFIG_PM_RUNTIME=y
CONFIG_USB_SUSPEND=y
以上修改完内核,重新编译内核
#make zImage
7.将编译完内核烧进板子。
7.1将LTE模块接入板子
查看usb-serial驱动是否成功加载
一个USB口虚拟成三个串口ttyUSB,ttyUSB0 为modem接口,ttyUSB1为Dial,ttyUSB2为AT端口。
7.2 检查CDC驱动是否成功加载
已经识别为usb网卡,可以ifconfig eth1 使能网卡
至此完成对华为MU909 驱动的添加,还需添加PPP拨号软件,编写LTE拨号脚本,才能接入4G网络。