前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >4G模组拨号上网功能

4G模组拨号上网功能

原创
作者头像
以为带点燃结局就会改变
发布2022-08-29 09:39:20
2.4K0
发布2022-08-29 09:39:20
举报
文章被收录于专栏:tinker board 2s嵌入式

上一期介绍了一下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,将

代码语言:javascript
复制
BOARD_HAS_RK_4G_MODEM := false

改为

代码语言:javascript
复制
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,并且在

代码语言:javascript
复制
PRODUCT_PROPERTY_OVERRIDES += \
        vendor.rild.libpath=/vendor/lib64/librk-ril.so

修改为

代码语言:javascript
复制
PRODUCT_PROPERTY_OVERRIDES += \
        vendor.rild.libpath=/vendor/lib64/libquectel-ril.so

在PRODUCT_COPY_FILE下面加入

代码语言:javascript
复制
$(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+触摸屏+扩展板装在一起。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档