转自:http://blog.csdn.net/liqingyuan2008/article/details/46637383

定制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网络。


  定制Android之中移动4G-LTE上网业务

一.简介

    在上篇讲述将中移动4G-LTE制式的华为MU909驱动添加到Android内核后,modem驱动加载后,接着可以使用PPP拨号实现上网业务。

CPU:TI-AM3354

Kernel:linux 3.2

4Gmod:HUAWEI—MU909

Authority:ACE 2014-12-13

1.2       PPP(Point to Point Protocol)协议是一种广泛使用的数据链路层协议,在国内广泛使用的宽带拨号协议PPPoE其基础就是PPP协议,此外和PPP相关的协议 PPTP,L2TP也常应用于VPN虚拟专用网络。随着智能手机系统Android的兴起,PPP协议还被应用于GPRS拨号,3G/4G数据通路的建立,在嵌入式通信设备及智能手机中有着广泛的应用基础。

1.3       模块组成:

上图为PPP模块组成示意图,包括:

PPPD:PPP用户态应用程序

PPP驱动:PPP在内核中的驱动部分,kernel源码在/drivers/net/下的ppp_generic.c, slhc.c。

PPP线路规程*:PPPTTY线路规程,kernel源码在/drivers/net/下的ppp_async.c, ppp_synctty.c,本文只考虑异步PPP。

TTY核心:TTY驱动,线路规程的通用框架层。

TTY驱动:串口TTY驱动,和具体硬件相关,本文不讨论。

Linux中PPP实现主要分成两大部分:PPPD和PPPK。PPPD是用户态应用程序,负责PPP协议的具体配置,如MTU、拨号模式、认证方 式、认证所需用户名/密码等。 PPPK指的是PPP内核部分,包括上图中的PPP驱动和PPP线路规程。PPPD通过PPP驱动提供的设备文件接口/dev/ppp来对PPPK进行管理控制,将用户需要的配置策略通过PPPK进行有效地实现,并且PPPD还会负责PPP协议从LCP到PAP/CHAP认证再到IPCP三个阶段协议建立和状态机的维护。因此,从Linux的设计思想来看,PPPD是策略而PPPK是机制;从数据收发流程看,所有控制帧(LCP,PAP/CHAP/EAP,IPCP/IPXCP等)都通过PPPD进行收发协商,而链路建立成功后的数据报文直接通过PPPK进行转发,如果把Linux当做通信平台,PPPD就是ControlPlane而PPPK是DataPlane。

二 移植步骤

    1.移植PPP软件

 下载ppp-2.4.4.tar ,重新使用交叉工具链编译得到pppd 和chat,chomd 777pppd chat,修改权限,下载到开发板中。

   2. 编写拨号脚本。

典型的拨号脚本包括ppd的脚本和chat的脚本。具体文件位于/etc/ppp/peers/下。

  2.2 pppd脚本

  #cd /etc/ppp/peers/

  新建LTE文件,对脚本内容有疑问,可以查阅linux脚本的解释

  #man pppd

  #vi LTE

 /dev/ttyUSB0 9600  #ttyUSB0 作为modem的拨号端口 波特率为9600

Crtscts   #指定pppd的应设置串口的RS-232接口使用RTS和CTS信号使用硬件流控制

Modem              #使用调制解调器控制线

Debug                        #启用连接调试工具

Nodetach           #不连接控制终端,作为后台程序

Defaultroute       #添加默认路由到系统路由表

user"cmnet"

usepeerdns        #请求peer对方提供两个DNS地址

connect'/usr/sbin/chat -s -v -f /etc/ppp/peers/LTE-connect-chat'

disconnect'/usr/sbin/chat -s -v -f /etc/ppp/peers/LTE-disconnect-chat'

 2.3 chat脚本

新建LTE-connect-chat文件,对脚本内容有疑问,可以查阅linux脚本的解释

  #man chat

TIMEOUT 15

ABORT 'ERROR'                #抓取error 信息 报告给终端

ABORT 'NODIALTONE'         #抓取NO DIALTONE信息报告给终端

ABORT 'BUSY'                #抓取BUSY忙信息 报告给终端

ABORT 'NOANSWER'           #抓取NO ANSWER无应答信息报告给终端

'' AT                       #发AT

OKAT+CGDCONT=1,\"IP\",\"cmnet\"  #收到OK 发送字符串

OKATDT*99***1#                    #收到OK 发送字符串

CONNECT                            #收到connect  表明脚本是成功

2.4新建断开连接脚本LTE-disconnect-chat

#vi  LTE-disconnect-chat

ABORT  OK

ABORT  BUSY

ABORT  DELAYED

ABORT  "NOANSWER"

ABORT  "NOCARRIER"

ABORT  "NODIALTONE"

ABORT  VOICE

ABORT  ERROR

ABORT  RINGING

TIMEOUT  12

""  \K

""  \K

""  \K

""  +++ATH                   #发ATH 断开连接

""  +++ATH

""  +++ATH

""  ATZ                       #发ATZ 结束

SAY "\nGoodbay\n"           #打印Goodbye

至此 脚本已经编写完

3.1 运行测试

root@ok335x:/# pppd call lte &

[1] 1370

root@ok335x:/# timeout set to 15 seconds

abort on (ERROR)

abort on (NO DIALTONE)

abort on (BUSY)

abort on (NO ANSWER)

send (AT^M)

expect (OK)

AT^M^M

OK

 -- got it

 

send (AT+CGDCONT=1,\"IP\",\"cmnet\"^M)

expect (OK)

^M

AT+CGDCONT=1,"IP","cmnet"^M^M

OK

 -- got it

 

send (ATDT*99***1#^M)

expect (CONNECT)

^M

ATDT*99***1#^M^M

CONNECT

 -- got it

 

Script /usr/sbin/chat -s -v -f/etc/ppp/peers/lte-connect-chat finished (pid 1371), status = 0x0

Serial connection established.

using channel 1

Using interface ppp0

Connect: ppp0 <--> /dev/ttyUSB0

Warning - secret file /etc/ppp/pap-secrets has world and/orgroup access

sent [LCP ConfReq id=0x1 ]

rcvd [LCP ConfReq id=0x0 ]

No auth is possible

sent [LCP ConfRej id=0x0 ]

rcvd [LCP ConfAck id=0x1 ]

rcvd [LCP ConfReq id=0x1 ]

sent [LCP ConfAck id=0x1 ]

sent [CCP ConfReq id=0x1 ]

sent [IPCP ConfReq id=0x1 ]

rcvd [LCP DiscReq id=0x2 magic=0xf1d38998]

rcvd [LCP ProtRej id=0x3 80 fd 01 01 00 0f 1a 04 78 00 1804 78 00 15 03 2f]

Protocol-Reject for 'Compression Control Protocol' (0x80fd)received

rcvd [IPCP ConfNak id=0x1 ]

sent [IPCP ConfReq id=0x2 ]

rcvd [IPCP ConfReq id=0x0]

sent [IPCP ConfNak id=0x0 ]

rcvd [IPCP ConfRej id=0x2 ]

sent [IPCP ConfReq id=0x3 ]

rcvd [IPCP ConfReq id=0x1]

sent [IPCP ConfAck id=0x1]

rcvd [IPCP ConfNak id=0x3 ]

sent [IPCP ConfReq id=0x4 ]

rcvd [IPCP ConfAck id=0x4 ]

Could not determine remote IP address: defaulting to10.64.64.64

local  IP address10.128.64.238

remote IP address 10.64.64.64

primary   DNS address221.179.38.7

secondary DNS address 120.196.165.7

 

至此 模块获得IP和DNS,脚本运行成功,拨号成功。

3.2 联网测试

拨号成功后,查看网络信息,发现多了ppp0网卡,同时获得IP和收发数据包统计信息。

ifconfig

lo        Linkencap:Local Loopback 

          inetaddr:127.0.0.1  Mask:255.0.0.0

          UP LOOPBACKRUNNING  MTU:16436  Metric:1

          RXpackets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0carrier:0

         collisions:0 txqueuelen:0

          RX bytes:0(0.0 B)  TX bytes:0 (0.0 B)

 

ppp0      Linkencap:Point-to-Point Protocol 

          inetaddr:10.128.64.238 P-t-P:10.64.64.64  Mask:255.255.255.255

          UPPOINTOPOINT RUNNING NOARP MULTICAST MTU:1500  Metric:1

          RXpackets:6 errors:0 dropped:0 overruns:0 frame:0

          TXpackets:7 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:3

          RX bytes:102(102.0 B)  TX bytes:141 (141.0 B)

3.3 ping 测试

root@ok335x:/# ping www.baidu.com &

[2] 1378

root@ok335x:/# [ 205.042199] option: option_instat_callback: error -2

[  205.048624]option: option_instat_callback: error -2

PING www.baidu.com (111.13.100.91): 56 data bytes

64 bytes from 111.13.100.91: seq=0 ttl=52 time=1308.784 ms

64 bytes from 111.13.100.91: seq=1 ttl=52 time=3868.197 ms

64 bytes from 111.13.100.91: seq=2 ttl=52 time=2868.249 ms

64 bytes from 111.13.100.91: seq=4 ttl=52 time=867.837 ms

64 bytes from 111.13.100.91: seq=5 ttl=52 time=305.583 ms

至此,移动4G-LTE上网业务功能基本完成。



更多相关文章

  1. Android自动打包、签名、优化、上传ANT脚本
  2. Android 单独抽取 WebRtc-AGC(音频增益) 模块
  3. Android应用模块基本配置元素
  4. Android 进阶——Android Studio 项目结构详细述及Gradle脚本语
  5. Android 单独抽取 WebRtc-NS/NSX(音频降噪) 模块
  6. Android自动化测试之MonkeyRunner录制和回放脚本(十一)
  7. android模块化开发
  8. Android对于模块启动的permission
  9. Android Wifi模块分析(六)

随机推荐

  1. 第一课 vscode软件和常用插件的下载安装
  2. 编辑器安装与emmet语法
  3. Visual Studio Code 编辑器
  4. 超强大工具!快速下载安装vscode和必备插件
  5. 硬盘提示函数不正确怎么找回
  6. 菜鸟第一步
  7. 万岳知识付费系统更新内容 v 1.0.6
  8. Markdown学习
  9. 第一篇:markdown和emmet语法详情
  10. Java如何实现跨平台?原理是怎样的?