上一期介绍了一下tinkerboard2 Android11下面增加触摸和旋转的方式(https://blog.csdn.net/chenchen00000000/article/details/125699675 ),这一期来介绍一下如何支持4G模组拨号上网功能。4G模组拨号上网功能同样是Android设备上面的标配功能。
硬件准备
深圳风火轮作为华硕tinkerboard官方合作伙伴,推出了一款tinkerboard2的扩展板,上面有一个4G模组的MINI PCIE插槽,还有CH9344 USB转四串口芯片,这款扩展板如下图所示。
扩展板上有两个USB口,一个是连接到MINI PCIE插槽上的,另外一个是接CH9344的。
除了扩展板之外,还需要一个MINI PCIE封装的4G通讯模组,这个可选的有很多,笔者这里使用的是移远EC20模组。其他的模组调试方式是类似的。
接线比较简单,将EC20模组安装天线,然后装到扩展板上,装上SIM卡
然后用一根USB线连接扩展板和tinkerboard2即可。
EC20模组调试
官方默认的固件没有对4G模组支持,因此必须在SDK基础上添加功能并编译。SDK可以从华硕AIOT中国论坛下载到,比从GIT上直接拉取速度快,地址是
www.tinkerboard.cn/thread-202-1-1.html
Android里面对modem的支持,是通过RIL(Radio Interface Layer)服务来实现的,其框架如下
RIL属于hardware的一部分,它分为两个部分,对上,它提供了一系列接口,比如开关移动网络,拨号,获取IP地址,设置APN,获取ICCID,获取IMEI等,这一部分属于Android的标准接口。对下,它会调用各个厂家的libreferece-ril.so动态库的接口,这些接口是各个厂家自行实现的。因此各个厂家的libreferece-ril.so不一样,这个动态库一般由modem制造商提供。
然后更底层,就是各个厂家的libreferece-ril.so要和Linux的驱动进行交互,这些驱动包含在内核中,源码由modem制造商提供。这一部分不是Android的标准。
具体到EC20模组,需要修改内核源码和Android系统层的配置。其中内核驱动部分,EC20通过USB和RK3399连接。EC20端作为usb device,RK3399端作为USB host。EC20的USB是一个复合设备,interface 0-3采用USB虚拟串口驱动,interface 4用于网络数据包传输
interface 0-3需要启用options驱动,源码位于kernel/drivers/usb/serial,在RK的SDK里面,已经默认支持EC20模组,不需要修改,只需要确保内核config的CONFIG_USB_SERIAL_OPTION和CONFIG_USB_SERIAL_WWAN选项打开即可。
然后interface 4需要采用QMI_WWAN驱动或者GobiNet驱动,二者只能选择其一。这里以 QMI_WWAN驱动为例介绍。移远通信会提供QMI_WWAN源码,文件名为qmi_wwan_q.c,将这个源码放到kernel/drivers/net/usb里面,然后修改Makefile
这个qmi_wwan.c是内核原本就有的qmi_wwan驱动。内核自带的qmi_wwan驱动和EC20并不能完全匹配,会出现能拨号成功,但是上不了网的问题。因此这里qmi_wwan_q.o在Makefile中必须放在qmi_wwan.o前面,这样编译的时候,qmi_wwan_q.o就会靠前,当识别到EC20模组的interface 4设备时,就会先于qmi_wwan与设备匹配。然后内核打开CONFIG_USB_NET_QMI_WWAN的选项。
内核部分配置好option驱动和qmi_wwan驱动后,就可以编译内核,然后将得到的boot.img烧录到板上。将装有EC20模组的扩展板与tinkerboard2连接,可以看到如下信息,说明内核部分配置完成。注意红框部分必须是qmi_wwan_q。
内核驱动适配之后,还需要对Android系统层进行修改。RK在其SDK里面已经带了一个适配4G模组的demo,不过适配的是他们自家的RM310模组,这里可以直接在其基础上进行修改。
找到对应product文件夹(如果如果编译的时候选择的板型是WW_Tinker_Board_2,则是asus/tinker_board_2/Tinker_Board_2,自定义的product类似)下面的BoardConfig.mk,将
BOARD_HAS_RK_4G_MODEM := false
改为
BOARD_HAS_RK_4G_MODEM :=true
这个设置在device/rockchip/common/device.mk中生效
然后把移远提供的64位ril库libreference-ril.so放到device/rockchip/common/4g_modem/lib64/ 下面,重命名为libquectel-ril.so,并且在
将
PRODUCT_PROPERTY_OVERRIDES += \
vendor.rild.libpath=/vendor/lib64/librk-ril.so
修改为
PRODUCT_PROPERTY_OVERRIDES += \
vendor.rild.libpath=/vendor/lib64/libquectel-ril.so
在PRODUCT_COPY_FILE下面加入
$(LOCAL_PATH)/4g_modem/lib64/libquectel-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/libquectel-ril.so
如下图
修改vendor.rild.libpath 的目的是Android 11的rild会从此property获取ril库路径,其代码如下图所示
这段代码的意思是,rild启动时,优先从-l的参数取ril库的路径,如果取不到,就从vendor.rild.libpath取。取到这个ril库的路径之后,通过dlopen打开,并通过dlsym调用里面的函数。
此外,移远的ril库使用qmi方式拨号时,需要有/dev/cdc-wdm0节点。 Android11加强了权限管理,部分设备节点不会被自动创建,需要修改system/core/ init/devices.cpp。
另外还要给这个设备节点权限,在device/rockchip/common/ueventd.rockchip.rc增加一行
/dev/cdc-wdm0 0666 radio radio
上述修改完成之后,执行make -j8,编译出super.img,烧录到板上。开机之后,使用getprop | grep gsm可以看到modem和sim卡的相关信息
如果这里读取不到baseband的信息,说明没有识别到EC20模组,需要检查EC20是不是没插好。如果读取不到运营商信息,说明是卡没插好。上述信息正常后,使用ifconfig命令,可以看到wwan0网卡状态
这里如果有网卡而没有ip地址,那有可能是卡没流量了。
在系统界面上,选择设置 - 关于平板电脑 - SIM卡信息,可以看到信号强度等具体信息
此时可以通过移动网络访问网站。如下图所示,右上角有个4G图标,意思是此时使用的是4G网络(即LTE),如果当地只有3G或者2G网络,则不会有这个4G标志。将移动数据关闭后,这个4G标志也会消失。
整机外接扩展板和4G模组上网的整体效果如下图
总结
本文以深圳风火轮科技出品的tinker扩展板+EC20模组为例,介绍了如何在tinkerboard2s的Android 11系统上实现移动网络连接。依靠移动网络,可以将tinkerboard2s应用到车载等领域。略有遗憾的是,目前这款扩展板还无法直接叠加安装到tinkerboard2s上面,希望风火轮后续能够设计一款外壳,将tinkerboard2s+触摸屏+扩展板装在一起。