rk3128 平台适配高新兴物联的 ME3630-W 4G 模块的记录。

 2019-04-26

关键字:高新兴 ME3630-W 适配、rk3128 移植 4G 模块

本篇文章系笔者在移植 高新兴物联 ME3630-W 4G 模块到运行着 Android4.4 操作系统的 rk3128 开发板上的一篇日志。文章以快速适配为目的进行讲解,不涉及一些步骤的原理讲解。


这款 4G 模块是一个全网通模块,它在 rk 平台的适配资料并不多,难得的几篇博文讲的也比较片面。笔者在适配移植的过程中遇到了不少的问题,现将解决过程记录一下,以期能帮到有需要的同学。

 

首先,没有官方提供的适配文档是很难完成适配工作的,这款模块的官方网站为:高新兴物联 ME3630-W 官方网站 。官网中下部给出了很全面的文档。

 

如果没有办法直接在网上下载文档,可以要求采购向厂家索要。

 

硬件排查

硬件虐我千百遍,我待硬件如初恋!

 

这块不打算详细聊,总之您想办法确保硬件电路 OK 就好。祝好运!

 

软件排查

1. 内核支持

要调 4G 模块,首先需要确保对应的内核功能模块是可用的。一般可以在 menuconfig 作如下配置( 在 kernel 目录下执行 make menuconfig 命令

Android eh0 挂在4G模块 安卓4g模块_功能模块

Android eh0 挂在4G模块 安卓4g模块_功能模块_02

在保存了上面的配置以后,还可以去 ./kernel/.config 文件下检查一下,看是否有如下图所示的配置

Android eh0 挂在4G模块 安卓4g模块_Android_03

 

需要注意的是:一定要确保 make menuconfig 对内核功能模块做出的更改是 “最终更改” 。因为笔者这边的情况就是可以通过 make menuconfig 来更改内核功能模块,然后再编译大包的时候还会再从另外一个地方读取一下内核功能配置模块。对于这种有多处可以修改内核功能模块的情况,一定要保证好上面的配置项不会被重置掉! 这个很重要。

 

2. 注册模块

这款 4G 模块会以 ttyUSB0 ~ ttyUSB2

Android eh0 挂在4G模块 安卓4g模块_Android_04

如果没有,则是没有配好相应的 vendor id 和 product id 。此时,我们就需要操作这个文件了

.\kernel\drivers\usb\serial\option.c

 

在 option.c 的 option_ids[] 中添加您模块对应的 VID 和 PID 。

static const struct usb_device_id option_ids[] = {
    // ...
    
    { USB_DEVICE(0x19d2, 0x1476) },
    
    // ...
}

如果您不知道您手里的模块的 VID  和 PID ,有官方适配文档的直接参考官方适配文档,没有的则可以上网查一下,实在不行,可以看串口的打印,通常在内核打印中都会将新设备的 vid , pid 打印出来的。中兴集团的 VID 固定为 0x19d2 。

 

然后,最好再在 option.c 文件中的 option_probe 函数中添加下面一段代码,这一步的目的是为了防止用来传输上网数据的 USB 口被映射成普通 USB 串口。

static int option_probe(struct usb_serial *serial, const struct usb_device_id *id)
{

    // ... 
    
    printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\n\n",
            serial->dev->descriptor.idVendor,
            serial->dev->descriptor.idProduct,
            serial->interface->cur_altsetting->desc. bInterfaceNumber);

    if (serial->dev->descriptor.idVendor == 0x19d2 &&
            serial->dev->descriptor.idProduct == 0x1476 &&
            serial->interface->cur_altsetting->desc. bInterfaceNumber == 3)
        return -ENODEV;
    
    if (serial->dev->descriptor.idVendor == 0x19d2 &&
            serial->dev->descriptor.idProduct == 0x1476 &&
            serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
        return -ENODEV;

    if (serial->dev->descriptor.idVendor == 0x19d2 &&
        serial->dev->descriptor.idProduct == 0x1476 &&
        serial->interface->cur_altsetting->desc. bInterfaceNumber == 5)
        return -ENODEV;

    // ...
    
}

 

3. 预置驱动文件

按照下表将对应的文件预置到系统中。

Android eh0 挂在4G模块 安卓4g模块_功能模块_05

这些文件都是模块厂商提供的。

 

4. 系统配置

在您的 init.rc 文件中添加以下信息

service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-gosuncn.so
    class main
    socket rild stream 660 root radio
    socket rild-debug stream 660 radio system
    user root
    group radio cache inet misc audio log

service pppd_gprs /system/etc/init.gprs-pppd
    user root
    group radio cache inet misc log
    disabled
    oneshot

 

对了,或许您还需要再关注一下 APN 的配置。

./device/rockchip/common/phone/etc/apns-full-conf.xml

关于 APN 信息,笔者这边也不是很清楚,因为笔者没有配置过 APN 信息。

 

这边贴一个简要参考,可以通过 Android 系统启动以后在系统设置中配置一下 APN 信息

电信  -->  ctnet
联通  -->  3gnet
移动  -->  cmnet

 

5. 调试

此时,我们的基本适配工作就做完了。编译系统并烧写。首先可以来检查我们的 4G 模块是否被正确识别到。可以查看内核打印来检查。

dmesg

通常,如果您能看到类似下面所示的打印,就稳的了。

usb 1-1: new high-speed USB device number 2 using rockchip_ehci_host
usb 1-1: New USB device found, idVendor=19d2, idProduct=1476
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: Android
usb 1-1: Manufacturer: Android
usb 1-1: SerialNumber: d6ee6d9b
idVendor=19d2, idProduct=1476, bInterfaceNumber =0
option 1-1:1.0: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
idVendor=19d2, idProduct=1476, bInterfaceNumber =1
option 1-1:1.1: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
idVendor=19d2, idProduct=1476, bInterfaceNumber =2
option 1-1:1.2: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
cdc_ether 1-1:1.3 usb0: register 'cdc_ether' at usb-101c0000.usb-1, CDC Ethernet Device, c6:92:10:17:52:43

如果很不幸您 /dev 目录下并没有 ttyUSB0 ~ ttyUSB2 这 3 个节点,那就得再回去好好检查检查了。

 

然后这个时候,如果有屏幕的话就可以去屏幕上确认确认,所插的 SIM 卡是否成功入网,并且能够通过蜂窝网络访问互联网了。

 

如果这个时候发现所插 SIM 卡无法正确入网,常用的检测手段是可以通过如下命令查看电话网络的打印

logcat -b radio

对应地,清日志缓冲区的命令是

logcat -c -b radio

 

如果您的适配过程并不那么顺利,那就需要对照着官方提供的适配文档来排错了。

 

关于官方提供的文档与驱动,笔者这边碍于版权问题,就不提供下载链接了。

 

6. ttyUSB 释义

这里再解释一下 ttyUSB0, ttyUSB1, ttyUSB2 各自有什么作用,看下表

型号

设备号

作用

ME3630-W ( pid: 0x1476 )

ttyUSB0

DIAG

ttyUSB1

AT

ttyUSB2

MODEM

3

ECM

4

ECM

 

7. 自定义拨号流程

如果您的业务需要客制化拨号流程,或者您怀疑系统的拨号流程有问题,可以关注下这块代码

./hardware/ril/

入网拨号流程一般是首先走

./rild/rild.c

里的 main() 函数。然后在 main() 函数中调用到

./reference-ril/reference-ril.c

里面的 RIL_Init 函数。在这个 reference-ril.c 里面比较重要的函数还有 mainLoop 、initializeCallback 、 onUnsolicited 、 onRequest 。

 

其实 Android 原生的入网流程就已经很完善了,如果是排查问题的话,笔者建议可以不用看这里的代码,大概率是没有什么结果的。

 

如果要查看拨号日志,使用如下命令

logcat -s pppd

 

 


参考:

Android 4G模块调试总结