2023年6月26日发(作者:)
Android6.0RK3399PCIe接⼝4G模块EC20调试记录·Younix’sSt。。。Platform: RK3399OS: Android 6.0Kernel: 4.4Version: v2017.044G Module: EC20-CE[TOC]⼀、基本概念1. USB 部分的功能接⼝Quectel 3G/4G模块(UMTS/HSPA/LTE)的 USB 部分包括了⼏个不同的功能接⼝。USB SerialttyUSB0 代表 DMttyUSB1 代表 GPS NMEA (GPS导航设备统⼀的RTCM标准协议)信息输出ttyUSB2 代表 AT commandsttyUSB3 代表 PPP 连接GobiNet在移植了 GobiNet 驱动后,会产⽣⼀个⽹络设备和⼀个 QMI channel。⽹络设备叫做 ethX(在内核版本2.6.39前叫做 usbX)QMI channel 叫做 /dev/qcqmiX 的节点。⽹络设备⽤来进⾏数据传输,QMI 通道⽤来进⾏ QMI 信息交互。Qualcomm Gobi is a family of embedded mobile broadband modem products by Qualcomm. Gobi technology was designed toallow for any product with the embedded solution to connect to the internet anywhere a wireless carrier provides data of the more notable products that contain a Gobi modem is the iPhone 4 for Verizon, which contains a MDM6600™,however it does not take advantage of the support for HSPA+QMI WWAN当移植了 QMI WWAN 驱动后,驱动将会创建⽹络设备和 QMI channel,⽹络设备被称作 wwanX,QMI 通道被命名为 /dev/cdc-wdmX。⽹络设备⽤来进⾏数据传输,QMI 通道⽤来进⾏ QMI 数据交互。CDC ACM在移植完了 CDC ACM 驱动后,将会在 /dev 下创建如下节点ttyACM0 ⽤于 PPP连接器 或者 AT命令ttyACM1 ⽤于 Trace1ttyACM2 ⽤于 Trace2ttyACM3 ⽤于 AT commandsttyACM4 ⽤于 AT commandsUSB 的 CDC 类是 USB 通信设备类 (Communication Device Class)的简称。CDC 类 是 USB 组织定义的⼀类专门给各种通信设备(电信通信设备和中速⽹络通信设备)使⽤的 USB ⼦类。2. APNAPN 指⼀种⽹络接⼊技术,是通过⼿机上⽹时必须配置的⼀个参数,它决定了⼿机通过哪种接⼊⽅式来访问⽹络通过哪种接⼊⽅式来访问⽹络。⼆、驱动移植1. USB Driver主要参考官⽅⽂档《Quectel_WCDMA<E_Linux_USB_Driver_User_Guide_》精简版的移植⼿册可以参考 /hnjztyx/article/details/72495433 这篇,三星平台 Android5.1 的,写的⽐较清晰。另外有部分地⽅需要强调⼀下。1. 如果是 EC20 需要将其 VendorID 和 ProductID 打印出来看⼀下,因为有的 EC20 是有两个版本的,分别是 EC20-C 和EC20-CE。EC20-CE。EC20-C IDVendor=0x05c6 IDProduct=0x9215EC20-CE IDVendor=0x2c7c IDProduct=0x0125插拔设备出现信息如下:[ 723.730113] usb 1-1: New USB device found, idVendor=2c7c, idProduct=0125可见我的设备是 EC20-CE。务必确认好⾃⼰的物料版本。2. 移植的时候最好先控制变量,第⼀步只移植 USB Serial Driver 部分。完成这部分的移植后 /dev/下就应该⽣成 ttyUSB0-ttyUSB4 。⼀次添加的东西多了如果出现问题不好定位问题出现的地⽅。2. GobiNet Driver 或者 QMI WWANGobiNet Driver 和 QMI WWAN 两者的作⽤相同,只不过⼀个是在 Kernel Space 实现,⼀个是在 Userspace 实现。对于 GobiNet Driver,需要在 Kernel 中添加 供应商提供的 GobiNet 的源码;对于 QMI WWAN ,默认 Android 6.0 中已经实现了这种⽅式,我们只需要添加 ID 即可,所以我选择的后者。调试完成后会在 /dev 下⽣成cdc-wdmX节点。3. PPP 拨号配置在驱动部分参考⼿册打开对应的宏即可。下⾯是关于 APN 的配置,在我们完成 RIL 的移植后进⾏。APN : Access Point Names 。ChinaUnicom 联通 3gnet ,ChinaMobile 移动 cmnet,ChinaTelecom 电信 ctnet。三、RIL 移植RIL 在 Android 中的位置如下图可以看到,RIL 在 Android 架构中的位置处于 Kernel 和 Framework 之间。Libraries 中的 RIL 被分为两个部分,RILD 和 Vendor RIL。RILD 负责 Socket 和 Framework 之间的通信。Vendor RIL 负责 和 Radio 的通信(通过 AT command channel 与 Packet data channel(PDCH))。AT command channel ⽤来直接和 Radio 通信,PDCH ⽤以 data service。Java framework 中的 RIL 也被分为来两个部分,⼀部分是 RIL module 另⼀部分是 Phone module。The RIL modeule ⽤来和底层的 RILD 通信,The Phone module 直接为应⽤层(Application)提供电话功能的接⼝。1. RIL Driver Integration以 Quectel 的 EC20 为例。Quectel 以源码形式提供了 RIL driver(package/reference-ril)。我们只需要拷贝到我们的 Android 源码的正确路径并编译即可。相应 Android 源码路径为:hardware/ril/reference-ril ,⽤代理商提供的代码替换即可。并且修改 1service ril-daemon /system/bin/rild -l /system/lib/2 class main3 socket rild stream 660 root radio
4 socket rild-debug stream 666 radio system
5 user root
6 group radio cache inet misc audio sdcard_rw log禁能切换⽤户 hardware/ril/rild/rild.c1OpenLib:2 #endif3 //switchUser();如果需要在 ⾮root 下进⾏调试的话,还可以在 common/ 中加上:1# for radio2/dev/ttyUSB0 0666 radioradio3/dev/ttyUSB1 0666 radioradio4/dev/ttyUSB2 0666 radioradio5/dev/ttyUSB3 0666 radioradio重新编译即可。2. 抓取 Android Log1# 只看 RIL module 的 log2adb logcat -b radio -v time3. RIL 移植问题汇总1. 代码出现⼤量 errorEC20 的代理代码释放有误,Android6.0 对应的代码是《Quectel_Android_RIL_SR01A41V17》。2. 出现模块冲突报错:1build/core/base_:157: *** hardware/ril/reference-ril: alread defined by external/ppp/chat。直接删除 rk 的 chat 模块即可1rm externel/ppp/chat -rf3. RIL 没有⽣效(完成了 RIL 部分的移植后,看起来 4G 模块没有起作⽤)1)确认 RIL 进程有没有运⾏1# getprop -daemon2应该得到 Running ,如果得到的是 Stopped 或者 Restarting,则需要重新检查移植步骤2)看⼀下 lib 是否是 Quectel 的1# getprop -impl2如果是 Quectel 的应该是3Quectel_Android_RIL_SR 开头的如果这⾥显⽰的是RIL_RK_DATA_V3.6_android6.0 //说明调⽤到 rk ⾃⼰的 ril 库了,去下⼀步确定 的修改有没有成功,如果没成功参照 第4点。点。如果这⾥显⽰的是 空说明 库 和平台不兼容,检查是不是调⽤和⾃⼰平台兼容的库,⽐如 32 位是在 system/lib 下,64位 是在 system/lib64 下3)确认⼀下 中的修改有没有成功1cat | grep ril-daemon没有成功请参照后⾯的第4点。4)确认 SELinux 没有打开1# getenforce 来获取 SELinux 的状态23# setenforce 0 将其设置为 Permissive4. 中的修改没有⽣效在 device/rockchip/rk3399/ 中的修改没有⽣效去 out/…/rk3399_mid/root/ 中看,并没有产⽣我们需要的修改在 rk3399/ 中可以看到1#ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), tablet)2#PRODUCT_COPY_FILES +=
3 $(LOCAL_PATH)/rk3399_32/:root/4#endif如果是 tablet 产品,会 copy rk3399_32 中的 init rc 到 mid/ 中。所以这个地⽅的逻辑修改为1PRODUCT_COPY_FILES +=
2 $(LOCAL_PATH)/:root/另外,在3399 平台,会在 中追加⼀次 lib 的路径./rockchip/common/:588: h=/system/lib64/它会将之前我们指定的库的路径覆盖,需要将这⼀⾏删掉。5. 不修改 ,修改 的⽅式指定 lib 库有些产品,⽐如 vr、box 会在 中指定 h 。。所以我们也可以参考 RK 提供的做法来完成 库 路径的指定:⽐如我是 mid 产品,指定 lib 路径为 64 bit 的库路径:1vi device/rockchip/rk3399/rk3399_mid/2-- h=/system/lib/3-- s=-d /dev/ttyACM04++ h=/system/lib64/5++ s=-d /dev/ttyUSB06. SIM 卡 ABSENT如果出现如下 Log101-18 08:50:21.678 D/ATC ( 225): AT> AT+CPIN?201-18 08:50:21.679 D/ATC ( 225): AT< +CME ERROR: 10301-18 08:50:21.681 D/RILJ ( 731): [3664]< GET_SIM_STATUS IccCardState
4{CARDSTATE_ABSENT,PINSTATE_UNKNOWN,num_apps=0,gsm_id=8,cdma_id=8,ims_id=8} [SUB0]5“CARDSTATE_ABSENT”说明可能是 SIM 卡卡座有问题。检查 SIM 卡卡座与 SIM 卡,发现 SIM 卡插反了。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687752654a39412.html
评论列表(0条)