1 概述
平台:freescale i.MX 6Quad 4核开发板Sabre-sd(不带屏幕)
操作系统:Android 4.2.2_r1(代码补丁为android_jb4.2.2_1.1.0-ga_source)
内核:3.0.35
3G模块:中兴MG3732和UbloxLISA-U130
2 中兴MG3732模块移植
2.1 准备
准备一张可用的联通3G卡,放入SIM卡卡槽,接着把中兴MG3732开发板通过usb连接到主板上。
2.2 移植步骤
1) 拷贝基于android4.2的libztewcdma-ril.so文件到 /system/lib目录下
2) 在/driver/usb/serial/option.c中添加pid,vid如下:
{ USB_DEVICE(0x19d2, 0xffff) }, {USB_DEVICE(0x19d2, 0xfffe) }, {USB_DEVICE(0x19d2, 0xfffd) }, {USB_DEVICE(0x19d2, 0xfffc) }, {USB_DEVICE(0x19d2, 0xfffb) }, {USB_DEVICE(0x19d2, 0xfff1) }, {USB_DEVICE(0x19d2, 0xfff6) }, {USB_DEVICE(0x19d2, 0xfff7) }, {USB_DEVICE(0x19d2, 0xfff8) }, {USB_DEVICE(0x19d2, 0xfff9) }, {USB_DEVICE(0x19d2, 0xffee) }, {USB_DEVICE(0x19d2, 0xffed) }, {USB_DEVICE(0x19d2, 0xffeb) }, {USB_DEVICE(0x19d2, 0xffec) },
3) 拷贝chat, pppd到/system/bin目录下,确保/system/bin 目前下有pppd 和chat 两个程序,且可以运行
4) 添加ip-up到/system/ppp/目录下
5) 在init.rc文件中添加
chmod 0755 /system/lib/libztewcdma-ril.sochown root /system/bin/pppdchmod 4755 /system/bin/pppd service ril-daemon /system/bin/rild -l /system/lib/libztewcdma-ril.so -- -d /dev/ttyUSB0 class main socket rild stream 660 root radio socket rild-debug stream 660 radio system user root group radio cache inet misc
6) 配置menuconfig如下:
[*] Network device support ---> <*> PPP (point-to-point protocol) support [*] PPP multilink support (EXPERIMENTAL) [*] PPP filtering <*> PPP support for async serial ports <*> PPP support for sync tty ports <*> PPP Deflate compression <*> PPP BSD-Compress compression <*> PPP MPPE compression (encryption)(EXPERIMENTAL) <*> PPP over Ethernet (EXPERIMENTAL) <*> PPP over L2TP (EXPERIMENTAL)
2.3 调试过程
1、 进入android系统后,首先查看模块的端口是否识别,如果能正确识别的话,可以看到以下4个端口:
/dev/ttyUSB0/dev/ttyUSB1/dev/ttyUSB2/dev/ttyUSB3
在调试过程中,发现Log出现此句错误:
usb1-1: device v19d2 pffeb is not supported
说明modem模块没有被识别到,但此时已在option.c中添加了这个设备属性:
{ USB_DEVICE(0x19d2, 0xffeb) }
所以怀疑可能是usb的问题。
因sabre-sd开发板只有1个usb-otg接口,没有普通的usb口,我尝试用飞线重新飞了一个普通usb口出来,把中兴3G模块接到这个普通的usb口上,这句错误log就没有再出现了。
2、 在系统启动后,发现log打印:
I/RIL ( 2308): 3G modemmonitor thread is startI/RIL ( 2308): Opening ttydevice /dev/ttyUSB0I/RIL ( 2308): Runtime 3Gcan't find supported modemE/RILC ( 2308):RIL_register: RIL version 7E/RIL ( 2308): openingdata channel device - /dev/ttyFAKEPort. retrying...E/RIL ( 2308): openingdata channel device - /dev/ttyFAKEPort. retrying...E/RIL ( 2308): openingdata channel device - /dev/ttyFAKEPort. retrying...
这些log信息是在libreference-ril.so中打印的,说明系统没有调用到libztewcdma-ril.so文件。
后查看hardware/ril/rild/rild.c文件的源码,发现问题出现在main函数的switch(modem_type)语句段中。
解决方法是把switch(modem_type)语句段注释掉,重新编译rild可执行程序,即可正常地调用到libztewcdma-ril.so文件。
3、 注意设置ril-daemon的端口为/dev/ttyUSB0,否则rild进程无法启动,在
logcat –b radio中会显示以下错误:
I/RILJ ( 2392): Couldn't find 'rild' socket; retrying after timeoutI/RILJ ( 2392): Couldn't find'rild' socket; retrying after timeoutI/RILJ ( 2392): Couldn't find'rild' socket; retrying after timeoutI/RILJ ( 2392): Couldn't find'rild' socket; retrying after timeoutI/RILJ ( 2392): Couldn't find'rild' socket; retrying after timeout
4、 在调试过程中,模块可以拨打电话,但无法上网,用ps命令未发现pppd进程,log如下:
D/RILJ ( 2369): 0: [77] SETUP_DATA_CALL E/RILD ( 2135): get exit sig 17 E/RILD ( 2135): checkPPPConnection: pid_exit == 1 E/RILD ( 2135): checkPPPConnection: interface[ppp0]information is not found E/RILD ( 2135): start_pppd: failed to check PPP interfaceUP E/RILD ( 2135): EVENT_PPPD_MANAGER_PPPD_EXIT E/RILD ( 2135): pppd exit. status = 1024 E/RILD ( 2135): pppd exit . no restart pppd . E/RILD ( 2135): SetupDefaultPDP failed.
说明pppd进程启动失败。
后发现是pppd权限问题导致,解决方法如下:
启动系统后,在adb中执行以下命令修改pppd权限:
chown root /system/bin/pppdchmod 4755 /system/bin/pppd
若系统是只读属性,需用remount命令重新挂载文件系统:
mount –o remount,rw /dev/block/mmcblk0p5 /system/
3 ublox LISA-U130模块移植
3.1 准备
准备一张可用的联通3G卡,放入SIM卡卡槽,接着把ublox u130开发板通过usb连接到主板上。
3.2 移植步骤
1) 解压ublox提供的android4.2的3g驱动压缩文件如下:
RIL_sc_<version>.zipril_sc_<version> Sourceoverlay for Android Platform build/target/product Device configuration folder files external/ppp/ Data connection files hardware/gsm0710muxd Channel multiplexer hardware/ril/ublox_ril/ RIL core directory system/core/rootdir/Android.mk Compilation script system/core/init/property_service.c Set RIL services property system/core/liblog/logd_write.c Log configuration files
2) 把相关文件拷贝到android源码中
cp –pvRf ril_sc_<version>/external/ppp/ <android_root>/external/pppcp –pvRf ril_sc_<version>/hardware/ril/ublox_ril <android_root>/hardware/ril/cp –pvRf ril_sc_<version>/system/* <android_root>/systemcp –pvRf ril_sc_<version>/build/* <android_root>/build
3) 在device/fsl/imx6/AndroidProducts.mk中添加:
RIL_COM_INTERFACE := usb
4) 在init.rc文件中添加如下语句:
# Changepermissions for modem chmod 0660 /dev/ttyACM0 chown radio radio /dev/ttyACM0 chmod 0660 /dev/ttyACM1 chown radio radio /dev/ttyACM1 chmod 0660 /dev/ttyACM2 chown radio radio /dev/ttyACM2 # Set permissions for u-blox RILRepository chown radio radio /system/etc/rril chmod 0770 /system/etc/rril chown radio radio/system/etc/rril/repository.txt chmod 0660 /system/etc/rril/repository.txt # Set u-blox RIL repository state setprop net.rril.repository notready # Prepare u-blox RIL repository service uril-repo /system/bin/uril-repo.sh user root group radio oneshot # Load u-blox RIL service ril-daemon /system/bin/rild -l /system/lib/librapid-ril-core.so -- -a /dev/ttyACM0 -n /dev/ttyACM1 class main socket rild stream 660 root radio socket rild-debug stream 660 radiosystem user root group radio cache inet misc audio service pppd_data0/system/bin/init.gprs-pppd user root radio group radio cache inet misc disabled oneshot service pppd_data1/system/bin/init.gprs-pppd user root radio group radio cache inet misc disabled oneshot service pppd_term /system/bin/stop_pppd15 class main disabled oneshot service pppd_kill /system/bin/stop_pppd 9 class main disabled oneshot
5) 配置menuconfig如下:
DeviceDrivers USB Support <*>USB Modem (CDC ACM)support DeviceDrivers Network device support <*>PPP (point-to-pointprotocol) support <*>PPP support for asyncserial ports <*>PPP support for sync ttyports <*>PPP Deflate compression
6) 重新编译系统,确保生成以下文件
/system/lib/librapid-ril-core.so/system/lib/librapid-ril-util.so/system/lib/librapid-ril-oem.so /system/bin/pppd/system/bin/chat /system/bin/init.gprs-pppd/system/bin/ip-down/system/bin/ip-up/system/bin/stop_pppd/system/bin/rril-repo.sh /system/etc/uril/repository.txt /system/etc/ppp/ chap-secrets/system/etc/ppp/ chat-isp1/system/etc/ppp/ chat-isp2/system/etc/ppp/ ip-down-ppp0/system/etc/ppp/ ip-up-ppp0/system/etc/ppp/ ip-up-vpn/system/etc/ppp/pap-secrets /system/etc/ppp/peers/gprs1/system/etc/ppp/peers/gprs2
3.3 调试过程
1、 启动系统后,确保3G模块端口可以被系统识别:
/dev/ttyACM0/dev/ttyACM1/dev/ttyACM2/dev/ttyACM3/dev/ttyACM4/dev/ttyACM5
2、 用ps命令查看rild进程是否启动,如果已启动,此时一般拨打电话是没问题的。
3、 在调试过程中发现不能上网,用ps命令查看,发现pppd进程未启动。在adb中用logcat –b radio查看日志发现有两处错误:
第一处错误:
E/RILR ( 2109):CRepository::OpenRepositoryFile() - ERROR: Could not open file"/data/rril/repository.txt" - No such file or directory
第二处错误:
I/pppd.gprs( 3262): Configure pppd securityoptions I/pppd.start( 3271): Starting pppd E/pppd ( 3272): unrecognizedoption 'gprs1'I/pppd.start( 3279): pppd exited with2
第一处错误could not find /data/rril/repository.txt的原因是/system/bin/uril-repo.sh脚本未得到执行,解决方法是修改/system/bin/uril-repo.sh的权限,以及在init.rc中添加servicerril-repo的class属性:
# Prepare u-blox RIL repositoryservice uril-repo /system/bin/uril-repo.shclass mainuser rootgroup radiooneshot
第二处错误unrecognizedoption 'gprs1'的原因是执行/system/bin/init.gprs-pppd脚本时出错,当$ppp_usr为空字符串时,脚本执行以下语句:
----------------------------------
/system/bin/pppd user $ppp_usr call gprs$(( $ppp_if + 1 ))
=》
/system/bin/pppd user call gprs1
----------------------------------
此语句执行失败,所以pppd进程无法启动。
修改后的正确的脚本为:
case $ppp_auth in 0) /system/bin/log -t pppd.start "/system/bin/pppd call gprs$(( $ppp_if+ 1 ))"/system/bin/pppd call gprs$(( $ppp_if + 1 )) ;; *) if [ "$ppp_usr" = "" ];then/system/bin/log -t pppd.start "/system/bin/pppd call gprs$(( $ppp_if+ 1 ))"/system/bin/pppd call gprs$(( $ppp_if + 1 )) else/system/bin/log -t pppd.start "/system/bin/pppd user $ppp_usr callgprs$(( $ppp_if + 1 ))"/system/bin/pppd user $ppp_usr call gprs$(( $ppp_if + 1 )) fi
4、 在android 4.2上作了以上修改后,发现pppd进程还未能启动,经检测,发现/system/bin/init.gprs-pppd文件未能得到执行,相关的服务在init.rc中的:
service pppd_data0 /system/bin/init.gprs-pppd user root radio group radio cache inet misc disabled oneshot
Disabled表示服务暂停执行,等待property_set("ctl.start", "pppd_data0")的时候才执行,说明可能是初始化系统的时候出现了问题。
我重新编译system/core/init目录,发现不能编译通过,报错如下:
undefined reference to watchdogd_main
因/system/core/init/property_service.c和/system/core/init/Android.mk文件都是ublox驱动文件修改过的,所以我仔细查看这两个文件,发现是Android.mk文件出现问题,ublox提供的Android.mk文件是针对android 4.1的,并不是4.2,在LOCAL_SRC_FILES中缺少了watchdogd.c文件,修改Android.mk文件如下:
1) 在LOCAL_SRC_FILES中添加watchdogd.c
2) 在SYMLINKS中添加$(TARGET_ROOT_OUT)/sbin/watchdogd
然后重新编译system/core/init,生成root/init程序,pppd进程即可成功启动,并可使用3G网络。