按照FIBOCOM给的Android适配文档进行操作即可。其中有几个坑会在描述过程中标注出来。
一、添加USB驱动。
直接将FIBOCOM的NL668模块接上,插上卡,是检测不到卡的。串口调试模式下,输入指令:
$ su
# cd dev
# ls
查看设备节点,是没有ttyUSB0-4的。
各个设备节点功能如下图所示:
其中ttyUSB2为AT指令端口。
因此第一步是添加ttyUSB0-4的设备节点。
cd kernel
make menuconfig
device drivers->usb support->usb serial converter support
选中如下组件:
USB driver for GSM and CDMA modems
选中后保存配置。
增加设备支持
1:打开内核源码文件 option.c(路径一般为 drivers/usb/serial/option.c)。在源码中找到 option_ids 数组,在数组中添加 NL668 产品的 VID(0x1508)和 PID(0x1001); (添加到数组的最后)
static const struct usb_device_id option_ids[] = {
… …
#if 1
{ USB_DEVICE(0x1508, 0x1001) },
#endif
… …
2:在 USB 串口驱动中,过滤 NDIS 接口。由于 USB 串口跟 NDIS 都属于非标准 CDC 设备,需要防止 NDIS口被 USB 串口驱动加载而导致无法正常加载 NDIS 口驱动。
比较新的 kernel 版本(3.8 以上),在 option.c 中的 opiton_ids 中添加 blacklist,驱动在加载时会自动跳过 blacklist 指定的 interface,设置 interface 4 不加载 otpion 驱动,具体代码如下: (添加在上一数据上边即可)
#if 1
static const struct option_blacklist_info fibocom_blacklist = {
.reserved = BIT(4),
};
#endif
添加 blacklist 到 option_ids 数组中(上第一步添加的地方下添加即可,注意格式),具体代码如下:
#if 1
{ USB_DEVICE(0x1508, 0x1001),
.driver_info = (kernel_ulong_t)&fibocom_blacklist
}
#endif
按照文章刚开始的操作,即可看到设备节点。
$ su
# cd dev
# ls
二、加载库文件。
驱动加载好后,看到ttyUSB0-4的设备节点,此时就可以通过该节点和4G模块通信了,可以简单的测试一下:
$ su
# chmod 777 /dev/ttyUSB2
# echo -e "AT\r\n" > /dev/ttyUSB2
# cat /dev/ttyUSB2
# echo -e "AT+CSQ\r\n" > /dev/ttyUSB2
# cat /dev/ttyUSB2
# echo -e "AT+CPIN?\r\n" > /dev/ttyUSB2
# cat /dev/ttyUSB2
其中 “AT\r\n”指令为测试指令,会返回OK,说明链路通了,如果不同,则需检查硬件是否正常工作;
“AT+CSQ\r\n”指令为信号强度指令,会返回 CSQ: 23,99,其中第一个数值在1-31之间,数值越大信号越强,99表示无信号。
“AT+CPIN?\r\n”指令会返回READY。
此时,调试模式下输入指令,会返回如下信息:
getprop |grep ver
因为库文件还没有替换,ril信息还是其他厂家的信息,因此无法完成ttyUSB设备节点的调用,无法检测到卡,必须替换NL668的库文件才能正常调用ttyUSB设备节点,ril信息也会更新为NL668的信息。替换后如下图:
替换库文件信息后,显示为NL668-RIL_V8X.06.15
替换库文件的方式为:
安装RE文件管理器;
将厂家提供给的 “libreference-ril.so”库文件拷贝到 /system/lib文件夹下,注意,芯片为64位的安卓系统,应拷贝到 /system/llib64文件夹下。
拷贝完成后,一定要确认是否拷贝成功,我的第一次没有拷贝成功,查了半天才发现,重新拷贝一次后正常了。
三、修改rild.c
在 rild.c 的 main 函数中,去掉 switchuser 函数的调用,如下图:
四、修改Android启动脚本init.rc
通过RE文件管理器修改init.rc,修改后,重启,发现恢复了,所以我是通过修改源文件实现的,具体路径根据自己工程确定。
/proj/firefly-rk3399/device/rockchip/rk3399/rk3399_firefly_box$ vim init.rc
修改启动脚本加载 NL668 模块的设备,并且设置使用的 RIL 库与相应的端口号。
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so -- -w 0 -d /dev/ttyUSB2 -m
/dev/ttyUSB1
class main
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root
group radio cache inet misc audio sdcard_rw log
注:-w 参数配置的是拨号方式,0----ppp 拨号,2---NDIS 拨号。根据实际情况选择-w 的参数。
修改后编译整个工程,重新下载,下载后别忘了替换库文件。
到这里基本就结束了。最后还有一个坑,所有的配置工作完成后,可以检测到中国移动,但是提示无服务。
NL668默认为网络为3G,居然搜索不到,到设置里面,找到网络选择,选择为网络LTE后,可正常上网。
附上驱动包的网盘链接,需要的提取就OK了。
链接:https://pan.baidu.com/s/1H8MS39KccSvN5QxHaDQemQ
提取码:qqgu