本文为中兴MG3732为例,介绍3G模块在android系统上的移植过程。
大部分3G模块厂商已经提供了3G模块的移植方法和需要的相关库,只需要按照手册中的步骤一步一步操作即可,下面一部分摘抄自中兴提供的说明,一部分是个人移植过程中遇到问题的一些解决方法,供大家参考。
MG3732是ZTEMT的一款移动终端,可以通过usb接口接入具备usb主机控制器功能的PC或AndroidPAD等其他终端设备。基于WCDMA无线通信技术,实现语音、短信、无线数据业务。
作为一个USB设备,它包括了几个接口。
-
接口0:实现了一个modem, 用于AT控制指令的发送和接收,完成拨号上网功能。
-
接口1:实现的串口用做serviceport,用于发送和接收终端服务,短信、电话等控制指令(DM/AT)的响应。
-
接口2:实现的串口作为接收和发送pcm语音数据。
-
接口3,4:(如果有)则作为diagnosticsport或GPSport,目前基本不使用该串口。
对应Linux串口设备文件分别是:/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2、/dev/ttyUSB3。
MG3732在我电脑上的显示如下:
- lkp@lkp-desktop:/opt/EmbedSky/freescale/E9/TQIMX6_android-4.2.2$ ls /dev/ttyUSB*
- /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
- lkp@lkp-desktop:/opt/EmbedSky/freescale/E9/TQIMX6_android-4.2.2$
1、使用内核默认option驱动(推荐)
我们推荐的最方便简单的方法是,使用(Android)Linux内核自带的option.c模块;其中已经支持了不少usb3G模块设备。为了支持本公司新的模块,只需在option.c文件中添加对应的设备IDS就行了。
查询模块设备IDS的方法很简单,只需要lsusb命令就能列出Linux系统下的所有USB设备IDS了。
- lkp@lkp-desktop:/opt/EmbedSky/freescale/E9/TQIMX6_android-4.2.2$ lsusb
- Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
- Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- Bus 002 Device 008: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
- Bus 002 Device 004: ID 046d:c05a Logitech, Inc. Optical Mouse M90
- Bus 002 Device 009: ID 05e3:0723 Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader
- Bus 002 Device 010: ID 19d2:ffeb ZTE WCDMA Technologies MSM
- lkp@lkp-desktop:/opt/EmbedSky/freescale/E9/TQIMX6_android-4.2.2$
- Bus 002 Device 010: ID 19d2:ffeb ZTE WCDMA Technologies MSM
即为MG3732模块的信息,需要关注的是
19d2:ffeb,将MG3732
的
IDS
都加入drivers/usb/serial/
option.c
文件中,如下:
实际上,内核中已经添加好了的。
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffd, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffc, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffb, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff6, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff7, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff8, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff9, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffef, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffee, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffec, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffea, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffe9, 0xff, 0xff, 0xff) },
- { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffe8, 0xff, 0xff, 0xff) },
- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
加入ID后,重新编译内核即可。新的内核就能支持这些模块了。
2、无线接口层介绍
当模块驱动被内核加载并正确驱动后,该3G模块才能进行无线通信功能的应用开发。这在Android系统下称为无线接口层——RIL。即该文档所要说明的RIL驱动。
android的ril位于应用程序框架与内核之间,分成了两个部分,一个部分是rild,它负责socket与应用程序框架进行通信。另外一个部分是Vendor RIL,这个部分负责向下是通过两种方式与radio进行通信,它们是直接与radio通信的AT指令通道和用于传输数据包的通道,数据通道用于手机的上网功能。
也就是我们所提供的RIL驱动,是实现通信业务的核心功能模块。
对于RIL的java框架部分,也被分成了两个部分,一个是RIL模块,这个模块主要用于与下层的rild进行通信,另外一个是Phone模块,这个模块直接暴露电话功能接口给应用开发用户,供他们调用以进行电话功能的实现。这是属于Android应用程序的开发部分,简单了解即可。
所以RIL驱动模块,必需是针对不同的3G模块(模块)指令和通信业务功能定制的,以支不同应用需求。建议开发人员在使用我们的RIL驱动前,先了解下“3G模块的特点和构造”。
3、模块RIL驱动使用说明
3.1、目录结构说明
在我们提供的附件压缩包中,一般包含如下文件和目录:
ppp 目录为pppd拨号脚本目录(该目录文件为测试脚本,可能不提供)
ril目录为启动ril所需的相关文件(文件名可能会根据版本不同进行修改),主要包括以下几个:
libzteevdo-ril.so:支持evdo制式的ril动态链接库
libztewcdma-ril.so:支持wcdma制式的ril动态链接库
zterilPara:参数配置文件
ip-up:pppd连接之后调用的脚本文件
注:libzteevdo-ril.so和libztewcdma-ril.so并不一定会同时提供,根据模块的制式通常只会单独提供其中一个。
3.2、
RIL驱动使用说明
1、拷贝libzteevdo-ril.so (libztewcdma-ril.so)以及zterilPara到 /system/lib目录下。
确保/system/bin 目录下有pppd 和chat 两个程序,且具有执行权限。
添加ip-up到/system/etc/ppp/目录下。
2、修改系统初始化配置init.rc,将原本的rild服务
service ril-daemon /system/bin/rild
class main
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
socket rild-ppp stream 660 radio system
user root
group radio cache inet misc audio sdcard_rw log
修改为
service ril-daemon /system/bin/rild -l /system/lib/libztewcdma-ril.so
class main
socket rild stream 0660 root radio
socket rild-debug stream 0660 radio system
user root
group radio cache inet misc audio sdcard_rw log
3.3、修改相应的设备读写权限
包括/dev/ttyUSB0~/dev/ttyUSB3,有时会包括/dev/ttyUSB4和/dev/ttyUSB5,因此我们建议将所有的ttyUSB设备修改为radio用户可读写权限。修改init.freescale.rc文件,添加如下:
chmod 0777 /dev/ttyUSB0
chmod 0777 /dev/ttyUSB1
chmod 0777 /dev/ttyUSB2
chmod 0777 /dev/ttyUSB3
chmod 0755 /system/lib/usiuna-ril.so
chmod 0644 /system/lib/zterilPara
chmod 0755 /system/lib/libztewcdma-ril.so
chmod 0755 /system/lib/libzteevdo-ril.so
chown root /system/bin/pppd
chmod 4755 /system/bin/pppd
chown root /system/bin/chat
chmod 4755 /system/bin/chat
chmod 755 /system/etc/ppp/ip-up
setprop gsm.ril.delay 15
setprop ro.ril.wake_lock_timeout 300
3.4、 修改hardware/ril/rild/rild.c文件,以加载zte库,源码就不列了,等下以附件的形式供下载。
下载链接