定制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網絡。