以前没有调试过RIL的东西, 从零开始, 花了两周时间,终于拨号成功,这里发表出来与大家共享经验,少走弯路.
上一篇文章是一个成功拨号的Android RIL log, 这里主要结合上一篇log进行分析, 分享一些注意事项, 由于时间有限,尽量言简意概, 主要要自己尝试去实践才会有所收获。
(本文所指的log行号,是指上一篇文章所标记的行号)
1. 所要了解的一些源码及脚本文件:
android/hardware/ril/reference_ril/ (reference_ril.c)
android/hardware/ril/rild
android/extern/ppp/pppd
android/extern/ppp/chat
android/data/etc/apn-conf-sdk.xml
android/system/core/rootdir/etc/ppp/init.gprs-pppd
android/system/core/rootdir/etc/ppp/peers/cmnet
android/system/core/rootdir/etc/ppp/chat/cmtc-isp
android/vendor/xxxxx/xxxx/system.prop
reference_ril.c: RIL的一些AT命令操作,通过一些onRequest接口操作,对不同的硬件,需作一些修改调整。
apn-conf-sdk.xml: 以下是一个例子,有些不支持的APN,需要自己加上去,否则在log 中会出现类似:No APN found for carrier: 46xxx, 的错误。一般移动的TD USIM是46007,
有些是46000.
mcc="310" mnc="995" apn="internet" user="*" server="*" password="*" mmsc="null" /> mcc="310" mnc="260" apn="internet" user="*" server="*" password="*" mmsc="null" /> mcc="460" mnc="00" apn="cmnet" user="*" server="*" password="*" mmsc="null" /> mcc="460" mnc="07" apn="cmnet" user="*" server="*" password="*" mmsc="null" /> init.gprs-pppd: 调用pppd GPRS拨号的初始化脚本。 PPPD_PID= /system/bin/setprop "net.gprs.ppp-exit" "" /system/bin/log -t pppd "Starting pppd" /system/xbin/pppd call cmnet $* PPPD_EXIT=$? PPPD_PID=$! /system/bin/log -t pppd "pppd exited with $PPPD_EXIT" /system/bin/setprop "net.gprs.ppp-exit" "$PPPD_EXIT" cmnet:pppd拨号option脚本: /dev/ttyACM2 921600 nocrtscts nocdtrcts local usepeerdns defaultroute noipdefault ipcp-accept-local ipcp-accept-remote user cmnet password cmnet lock nodetach connect "/system/xbin/chat -v -t 50 -f /system/etc/ppp/chat/cmtc-isp" cmtc-isp: ABORT 'BUSY' ABORT 'NO CARRIER' ABORT 'ERROR' ABORT '+CME ERROR: 100' "" AT OK AT+CGDCONT=1,"IP","CMNET" OK AT+CGEQREQ=1,2,128,384,0,0,0,0,"0E0","0E0",,0,0 OK AT OK AT OK ATS0=0 OK AT OK AT OK ATDT*98*1# CONNECT system.prop rild.libpath=/system/lib/libreference-ril.so rild.libargs=-d /dev/ttyACM0 2. 所要具备的调试工具: microcom: 可在linux下通过发送AT命令调试硬件模块,在较新版本busybox中可以找到此模块。如命令: #./microcom -t 12000 /dev/ttyACM0 注: -t 12000 为延迟退出ms时间,不宜太长时间,时间太长,会感觉 像死机,时间太短,经常会命令没输完就退出了。 ppp(pppd, chat):可手拨号连接GPRS,如命令: # pppd call cmnet & 3. 设备文件 1)/dev/ttyACM0, /dev/ttyACM1, /dev/ttyACM2 这是usb transceiver 模拟串口的设备文件,如果是直接串口连接,可能是/dev/ttyS0, /dev/mux0等。 2) #ifconfig ppp0 GPRS连接上后,会出现ppp0的网络接口,用如上命令可以查看ppp0网络接口属性。 4. 常用AT命令,具体可以查《中国移动宽带随e 行客户端软件A T命令接口规范》 AT+CFUN AT+CREG AT+CGREG AT AT+COPS AT+CPIN AT+CIMI AT^SYSCONFIG ATD AT+CGDCONT AT+CGEQREQ AT+CSQ 5. RIL启动过程分析 如果硬件模块驱动配置成功,在/dev目录下会出现类似于ttyACM0,ttyS0等的设备文件 。 1-36行: 初始化过程,设备文件由system.prop属性文件决定, 40行: D/RILJ ( 110): [0000]> SCREEN_STATE 这里开始了第一个onRequest, 然后会开始一系列的onRequest: 40 D/RILJ ( 110): [0000]> SCREEN_STATE 49 D/RILJ ( 110): [0001]> RADIO_POWER 62 D/RILJ ( 110): [0002]> BASEBAND_VERSION 63 D/RILJ ( 110): [0003]> GET_IMEI 64 D/RILJ ( 110): [0004]> GET_IMEISV 65 D/RILJ ( 110): [0005]> REQUEST_GET_ACCESS_MODE 83 D/RILJ ( 110): [0006]> OPERATOR 84 D/RILJ ( 110): [0007]> GPRS_REGISTRATION_STATE 85 D/RILJ ( 110): [0008]> REGISTRATION_STATE 86 D/RILJ ( 110): [0009]> QUERY_NETWORK_SELECTION_MODE 87 D/RILJ ( 110): [0010]> GET_CURRENT_CALLS 88 D/RILJ ( 110): [0011]> OPERATOR 91 D/RILJ ( 110): [0012]> GPRS_REGISTRATION_STATE 96 D/RILJ ( 110): [0013]> REGISTRATION_STATE 97 D/RILJ ( 110): [0014]> QUERY_NETWORK_SELECTION_MODE 100 D/RILJ ( 110): [0015]> OPERATOR 101 D/RILJ ( 110): [0016]> GPRS_REGISTRATION_STATE 102 D/RILJ ( 110): [0017]> REGISTRATION_STATE 103 D/RILJ ( 110): [0018]> QUERY_NETWORK_SELECTION_MODE 104 D/RILJ ( 110): [0019]> SET_NETWORK_SELECTION_AUTOMATIC 105 D/RILJ ( 110): [0020]> OPERATOR 106 D/RILJ ( 110): [0021]> GPRS_REGISTRATION_STATE 107 D/RILJ ( 110): [0022]> REGISTRATION_STATE 108 D/RILJ ( 110): [0023]> QUERY_NETWORK_SELECTION_MODE 116 D/RILJ ( 110): [0024]> getIMSI:RIL_REQUEST_GET_IMSI 11 GET_IMSI 117 D/RILJ ( 110): [0025]> GET_SIM_STATUS 118 D/RILJ ( 110): [0026]> QUERY_FACILITY_LOCK 119 D/RILJ ( 110): [0027]> QUERY_FACILITY_LOCK 239 D/RILJ ( 110): [0028]> OPERATOR 240 D/RILJ ( 110): [0029]> GPRS_REGISTRATION_STATE 241 D/RILJ ( 110): [0030]> REGISTRATION_STATE 242 D/RILJ ( 110): [0031]> QUERY_NETWORK_SELECTION_MODE 248 D/RILJ ( 110): [0032]> OPERATOR 249 D/RILJ ( 110): [0033]> GPRS_REGISTRATION_STATE 250 D/RILJ ( 110): [0034]> REGISTRATION_STATE 251 D/RILJ ( 110): [0035]> QUERY_NETWORK_SELECTION_MODE 以上onRequest不一定都是必须的,如果GPRS_REGISTRATION_STATE,REGISTRATION_STATE出现的注册状态为: AT< +CGREG: 1,1 AT< +CREG: 2,1,"a834","5692" 那么你的恭喜你网络注册成功了,如果出现 AT< +CGREG: 1,0 AT< +CREG: 2,0 那么要查一下为什么注册不成功,检查一下SIM插好没,我发现AT+CFUN=4命令有可能会影响到后来的网络注册。 如果网络没有注册,不会出现以下连接信息 295 D/GSM ( 110): [DataConnectionTracker] ***trySetupData due to gprsAttached 如果出现此条信息,那么恭喜你又进了一步,要开始下一步ppp拨号上网了, 通过 #logcat &命令,会看到 I/pppd ( 140): Starting pppd 如果拨号成功,会出现如下信息: Serial connection established.