一、模块连接
4g模块在系统中的连接:
(4g模块是以usb外设的形式进行操作的)
二、调试移植过程
1.准备工作
①驱动加入
VID
和
PID
根据模块产品型号在 kernel/drivers/usb/serial/option.c
中
加入
VID
和
PID
U9300C/U9507
为:
{ USB_DEVICE( 0x1c9e, 0x9b3c ) }
U9507A/E/J
为:
{ USB_DEVICE( 0x2df3, 0x9b3e ) }
U8300
为:
{ USB_DEVICE( 0x1c9e, 0x9b05 ) }
具体是:
在struct usb_device_id 中加入:
在option_probe()中添加:
②编译配置
PPP
如果拨号上网则配置
PPP
,
make menuconfig
后
Device Drivers --->
-*-Network device support --->
{*}ppp(point-to-point protocol) support
……
[*] ppp support for async serial ports
[*] ppp support for sync tty ports
……
一般选择以上即可,如果需要更多
PPP
服务,则
PPP
相关都选择上。
③配置
USB MODEM
Device Drivers --->
[*]USB support --->
[*]USB Serial Conerter support --->
[*]USB Generic Serial Driver
……
[*]USB driver for GSM and CDMA modems
……
2.Ril库适配
取到最新通用版的
Ril
库(一般研发提供的
Ril
库名字带有日期等信息,需要重命名,例如重命名为
libreference-ril-u9300c.so
)放入客户单板,
然后使用下面的方法进行适配
添加
init.rc
启动
rild
在
init.rc
中加入下面服务,例如:
service ril-daemon /system/bin/rild -l
/system/lib/libreference-ril- u9300c.so
-- -d
/dev/ttyUSB2 -m /dev/ttyUSB1
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
class main
user root
socket rild-ppp stream 660 root radio
group radio cache inet misc audio log vpn net_admin system
说明:
system/lib/libreference-ril-u9300c.so
---
这个是
Ril
库放的位置和名字,可以根据客户喜好进行修改,让
rild
进程能找到
Ril
库就可以。
/dev/ttyUSB2 -
--
这个是
AT
口的名字,一般是
ttyUSB2
,特殊情况是其他的需要更改。如果不指定默认为
ttyUSB2
。
具体操作如下:
①添加厂商的so库
libreference-ril-u9300c.so放置如下地址 ./vendor/rockchip/common/phone/lib
注意:库必须是32位的库,放进去后需要加上可执行权限(755)
②在下面的文件中添加适配:(最好是把init.rc全改了)
./system/core/rootdir/init.rc
./bootable/recovery/etc/init.rc
./device/rockchip/rk3368/rk3368_box_taurus/init.rc
./device/rockchip/common/recovery/etc/init.rc
./out/target/product/rk3368_box_taurus/root/init.rc
./device/rockchip/rk3368/init.rc
(init.rc的修改需要在device/rockchip/rk3368/init.rc中修改,否则重新编译可能又被rockchip的配置所覆盖)。
添加的内容:
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-u9300c.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
class main
user root
socket rild-ppp stream 660 root radio
group radio cache inet misc audio log vpn net_admin system
service pppd_gprs /system/bin/init.gprs-pppd
user root
group radio cache inet misc
disabled
on property:net.gprs.enable=1
start pppd_gprs
on property:net.gprs.enable=0
stop pppd_gprs
3.ppp拨号适配
如果使用
ppp
拨号,需要
修改
ip-up
脚本
./vendor/rockchip/common/phone/etc/ppp
下的
ip-up
内
是否有下面信息,若没有则加入,
(这里要加上执行权限)
/system/bin/setprop "net.interfaces.defaultroute" "gprs"
/system/bin/setprop "net.ppp0.dns1" "$DNS1"
/system/bin/setprop "net.ppp0.dns2" "$DNS2"
/system/bin/setprop "net.ppp0.local-ip" "$IPLOCAL"
/system/bin/setprop "net.ppp0.remote-ip" "$IPREMOTE"
/system/bin/setprop "net.dns1" "$DNS1"
/system/bin/setprop "net.dns2" "$DNS2"
4.
./
hardware/ril/rild/rild.c 文件修改如下部分:
main函数添加:
然后再
屏蔽掉switchUser();
这行代码
注意:
正常情况下通过上述
的配置模块就可以正常上网了。
三、验证调试
(重要:一定要将模块天线接上在调试)
调试时候经常用到的几个小命令:
netcfg : 查看当前所有网络接口
getprop net.dns
: 查看dns(有时候dns不对也会上不了网,比如8.8.8.8,这时候需要修改pppd)
logcat -s pppd : 查看pppd log
logcat -b radio: 查看radio log
cat ttyUSB2 & 然后echo AT+CMD > ttyUSB2: 对modem发命令看是否有应答。
dmesg 查看driver层有没有相关报错
(
根据打印信息去寻找bug出现的位置,
也
可以(文末有常见问题及解决办法)
具体测试可以参照:
1.重新编译整个android源码,将打包的统一固件烧录到开发板
2.查看是否有节点tyUSB* 和 ppp 产生
3.输入
busybox lsusb
查看usb设备,看是否存在4G模块
4.发送AT测试 (更多at指令见4g模块AT指令文档)
cat ttyUSB2 & //后台打开节点
echo AT+CGMI > ttyUSB2 //给出模块厂商的标识
echo AT+CGMM > ttyUSB2 //获得模块标识
echo AT+COPS? > ttyUSB2 //运营商信息获取
echo AT+SYSINFO > ttyUSB2 //查询网络状态,返回2代表有网
echo AT+PSRAT > ttyUSB2
//返回模块当前注册的网络信息
echo AT+BNDPRF? > ttyUSB2 //返回当前的网络频段
echo AT+CSQ > ttyUSB2
//查信号强度
举例:
5.
(手动拨号)
发送
pppd call gprsdial & (拨号脚本
gprsdial
需要提前添加)
或者
pppd call unicom &
(拨号脚本unicom
需要提前添加)
拨号成功后 netcfg 查看网络节点:ppp0是否出现:
如图:
6.尝试ping百度,
看j81指示灯是否正常亮起
ping www.baidu.com
ping 220.181.112.244
四、常见BUG及解决方案
1、
问题:
通过
logcat -b radio发现无法打开ip-up或者ttyUSB*
解决:
在init.rc
添加修改ttyUSB权限:
on boot
chmod 0777 /dev/ppp
chmod 0777 /dev/ttyUSB*
chmod 0775 /etc/ppp/ip-up
chmod 0775 /etc/ppp/ip-down
2、
问题:
添加的so文件无法打开
解决:
添加完库文件后需要加上可执行的权限
3、
问题:
解决:
还需要更改系统配置适配自己的4G模块,4G模块生成了/dev/ttyUSB0~4共5个串口,AT指令端口为/dev/ttyUSB2,进行如下操作:
地址:./
device/rockchip/rk3368/rk3368_box_taurus/system.prop
增加:
4、
问题:
解决:
在init.rc 添加修改ttyUSB权限:
on boot
chmod 0775 /proc/cmdline
5、
问题:
解决:
4g模块没有插天线(坑),插上天线
6、
问题:
发现始终打开的不是自己的so库文件:
解决:
将打印出的的库文件删除,把自己的库文件重名为这个库文件名字,添加系统,重新编译(
添加上权限
)
7、
问题:
拨号失败
解决:
(
根据你使用的SIM修改apns-conf.xml文件;就是apn接入点;如果apns-conf.xml文件里面没有相应的核心网的mcc和mnc则Android系统不能自动拨号
)
解决:
dns存在问题
9、新增开机执行AT命令
对于客户想开机执行的AT命令,Ril中进行了动态运行时加载,不用改库,只修改在init.rc中添加属性值即可。
首先在init.rc中设置 setprop ril.audio 1,然后设置setprop ril.audio.config1 AT+XXX=XXX
这样开机时Ril库就会去执行这些AT命令。
例如如果需要进行声音设置, 则首先设置 setprop ril.audio 1,然后根据需要设置其他参数具体值。例如,需要更改下行耳机声音大小,则设置 setprop ril.audio.config1 AT+CLVL=3 即可。可调试的声音相关参数的有:
setprop ril.audio.config1 AT+AUDIOPATH=XXX
setprop ril.audio.config2 AT+PCMCONFIG= XXX
setprop ril.audio.config3 AT+PCMAUDIO= XXX
setprop ril.audio.config4 AT+CLVL= XXX
setprop ril.audio.config5 AT+RXVOL= XXX
setprop ril.audio.config6 AT+CMIC= XXX
setprop ril.audio.config7 AT+SIDET= XXX
setprop ril.audio.config8 AT+ECHO= XXX
setprop ril.audio.config9 AT+ECHOOFF= XXX
setprop ril.audio.config0 AT+PCMPAD= XXX
setprop ril.audio.config0 AT+ECHO1= XXX
以上属性只是接口,也可以用于配置其他指令,例如setprop ril.audio.config1 AT^DSCI=1
不需要以上设置时,属性置空(setprop ril.audio “”),或不进行属性设置。可以先通过命令行输入进行调试,调试好后写入init.rc即可。
五、相关补充:
1.厂商提供的so库解读:
调用流程:
核心是reference-ril.c:
关键函数:
initializeCallback() 4G 模块初始化函数;里面就是一些发给4G模块的AT指令;不能出错;
onUnsolicited() 函数接收4G模块对AT指令的返回值;可以在里面添加根据返回值相应的动作;比如根据拨号成功返回值做出绑定网卡分配IP的动作;
onRequest() 主动拨号、上层发下来的所有AT指令都在这里;
2.PPPOE和pppd的流程了解 (具体见详细笔记)
PPD是用户态应用程序,负责PPP协议的具体配置,如MTU、拨号模式、认证方式、认证所需用户名/密码等
①终端介绍
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
终端驱动程序的主要功能是在程序与相关设备之间进行数据传递。在一个LINUX内核自身的内部,终端基本上包括两个主要的软件部分:设备驱动程序和行规则(见下图)。
②伪终端
伪终端(Pseudo Terminal)是成对的逻辑终端设备,在Linux系统上创建伪终端设备,使用了”pty master”方式,例如/dev/ptm3,它的对应端则会被自动地创建成/dev/pts/3。
伪终端从设备上的数据输入成为伪终端主设备的输入,反之亦然。
③PPPOE 概述
PPPOE协议是基于PPP协议的协议,在PPPOE应用程序中并没有将PPP协议实现,PPP协议是由PPPD这个用户空间程序实现的,PPPOE程序只实现PPPOE协议部分
代码,在适当的时候PPPD程序进行PPP协议。
在PPPOE用户程序与PPPOE服务器连接后,他将会建立一个PPP0设备,此设备是在PPPD程序中进行的,如果与服务器连接成功,他将会一直存在,此设备就与正常的网卡设备一样,但他是个虚拟设备,经过此设备的数据发出去时还是从真实存在的网卡设备接口发送出去的,但这已经在系统中做了转换。
④ PPPD
上文中说过PPPD是PPP协议的实现程序,PPP的实现由四部分组成
PPPD程序首先会进行一些初始化工作,读参数配置参数等,这部分工作非常重要,会在读代码时分析。
然后就开始走协议,代码流向见下:
main.c->main()
{
读参数
配置参数
从LCP协议开始,这是整个协议的开始部分,状态机开始发动了
lcp_lowerup(0);
lcp_open(0); /* Start protocol */
下面
while (phase != PHASE_DEAD) {
handle_events();
get_input();等待数据报文进入然后根据状态机处理报文
…………
…………
}
}
PPP协议与PPPOE有着重要的联系,但是PPP协议建立连接部分不是讨论重点,所以会着重讨论在pppoe连接成功后数据的报文流向,数据是如何被处理的。