Platform: RK3288
OS: Android 5.1.1
Kernel: v3.10.0

需求:

适配4G模块,本文以YUGA-CLM920-AC3为例

1、添加USB转虚拟串口设备

把4G模块虚拟成ttyUSB0~ttyUSB5等几个虚拟串口。

1.1 确认模块的Vendor ID and Product ID

方法一:根据厂商提供的适配文档确认模块VID、PID

方法二:拔插4G模块,根据内核日志确认模块VID、PID

1.2 kernel驱动修改

添加宏定义&添加blacklist

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index f89de98..6f86d12 100755
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -418,8 +418,14 @@ static void option_instat_callback(struct urb *urb);#define YUGE_PRODUCT_CLM920_EC5                0x9020#define YUGE_PRODUCT_CLM920_NC5_1      0x9025#define YUGE_PRODUCT_CLM920_NC5_2      0x9625
+#define YUGA_VENDOR_AC3                        0x1286
+#define YUGA_PRODUCT_AC3               0x4E3C
+#define YUGA_PRODUCT_CLM920_NC5_GPS    0x9125  //end
+
+#define YUGA_VENDOR_ID                         0x257A#define YUGA_PRODUCT_CEM600                    0x1601#define YUGA_PRODUCT_CEM610                    0x1602
@@ -626,7 +632,9 @@ static const struct option_blacklist_info nodecom_nl650_blacklist = {.reserved = BIT(4) | BIT(5),};/*end add*/
-
+static const struct option_blacklist_info YUGA_VENDOR_AC3_blacklist = {
+        .reserved = BIT(0) | BIT(1),
+};static const struct option_blacklist_info YUGA_9X07_GPS_blacklist = {.reserved = BIT(0) | BIT(1) | BIT(5),
@@ -1836,6 +1844,8 @@ static const struct usb_device_id option_ids[] = {.driver_info = (kernel_ulong_t)&YUGA_9X07_blacklist },{ USB_DEVICE(CLM920_VENDOR_ID, YUGA_PRODUCT_CLM920_NC5_GPS),.driver_info = (kernel_ulong_t)&YUGA_9X07_GPS_blacklist },
+       { USB_DEVICE(YUGA_VENDOR_AC3, YUGA_PRODUCT_AC3),
+         .driver_info = (kernel_ulong_t)&YUGA_VENDOR_AC3_blacklist },

1.3 验证是否修改成功

编译并烧录完成后,插入4G模块通过查询命令:ls /dev/ttyU*,应有 ttyUSB0、ttyUSB1、ttyUSB2 三个端口,如 下图:

或者加载模块时的内核日志,如下图:

2.导入rilLib文件

模块厂商会提供一堆rilLib文件,根据主板CPU(32位还是64位),以及系统版本选对应的rilLib文件;

2.1 将rilLib文件放置到源码并加到mk文件进行编译

路径:/vendor/rockchip/common/phone/lib

为了方便维护,将rilLib文件名改为libreference-ril-yuga-ac3.so

路径:/vendor/rockchip/common/phone/phone.mk

diff --git a/phone/phone.mk b/phone/phone.mk
index 3051b60..b43a50e 100755
--- a/phone/phone.mk
+++ b/phone/phone.mk
@@ -37,6 +37,7 @@ PRODUCT_COPY_FILES += \$(CUR_PATH)/phone/lib/libreference-ril-me3630.so:system/lib/libreference-ril-me3630.so \$(CUR_PATH)/phone/lib/libsoftwinner-ril-yuga-all2.so:system/lib/libsoftwinner-ril-yuga-all2.so \$(CUR_PATH)/phone/lib/libreference-ril-nodecom-5.1.so:system/lib/libreference-ril-nodecom-5.1.so \
+       $(CUR_PATH)/phone/lib/libreference-ril-yuga-ac3.so:system/lib/libreference-ril-yuga-ac3.so \$(CUR_PATH)/phone/lib/libreference-ril-U9507E.so:system/lib/libreference-ril-U9507E.so

以上步骤没有问题编译之后将在out/target/product/rk3288/system/lib/生成该rilLib文件

2.2 修改rild.c以实现根据不同的VID、PID开机读取指定的rilLib。

路径:/hardware/ril/rild/rild.c

diff --git a/rild/rild.c b/rild/rild.c
index 5774a04..248236c 100644
--- a/rild/rild.c
+++ b/rild/rild.c
@@ -336,6 +336,8 @@ done:#define   YUGA_VENDOR_ID_CM920 "05c6"#define   YUGA_TB5_PRODUCT_ID  "9025"
+#define   YUGA_VENDOR_ID_AC3 "1286"
+#define   YUGA_AC3_PRODUCT_ID  "4e3c"#define   ME3630_VENDOR_ID   "19d2"#define   ME3630_PRODUCT_ID  "1476"
@@ -384,7 +386,7 @@ int checkVendor(char* path)ALOGD("tempPath = %s, idVendor = %s", tempPath, idVendor);if((strcmp(idVendor, YUGA_VENDOR_ID) == 0)
-     || (strcmp(idVendor, YUGA_VENDOR_ID_CM920) == 0)){
+     || (strcmp(idVendor, YUGA_VENDOR_ID_CM920) == 0)  || (strcmp(idVendor, YUGA_VENDOR_ID_AC3) == 0)){return VENDOR_YUGA;}else if(strcmp(idVendor, LONGSHAN_VENDOR_ID) == 0){return VENDOR_LONGSHAN;
@@ -603,6 +605,8 @@ OpenLib:flag = HWM600;}if((NULL != idProduct) && (strcmp(idProduct,YUGA_HEM600_PRODUCT_ID) == 0)){rilLibPath = "/system/lib/libreference-ril-yuga-hem600.so";
+            } if ((NULL != idProduct) && (strcmp(idProduct, YUGA_AC3_PRODUCT_ID) == 0)) {
+                rilLibPath = "/system/lib/libreference-ril-yuga-ac3.so";}else{rilLibPath = "/system/lib/libsoftwinner-ril-yuga-all2.so";}
(END)

原理

C语言strcmp库函数:

int strcmp(const char *str1, const char *str2)

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

该函数返回值如下:

如果返回值小于 0,则表示 str1 小于 str2。

如果返回值大于 0,则表示 str1 大于 str2。

如果返回值等于 0,则表示 str1 等于 str2。

报错

dlopen failed: dlopen failed: empty/missing DT_HASH in "libreference-ril-Longsung-M5700.so" (built with --hash-style=gnu?)

咨询模块厂商,打开rilLib失败,需要模块厂商这边修改rilLib;或者提供与当前系统(android5.1/7.1、32位/64位)兼容的rilLib;

踩过的坑 

blacklist不是必须要添加,若适配文档还有明确要求则不需要添加

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 6f86d12..3bc3f9d 100755
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -425,6 +425,10 @@ static void option_instat_callback(struct urb *urb);#define YUGA_PRODUCT_CLM920_NC5_GPS    0x9125//end+// add for M5700
+#define Longsung_VENDOR_M5700                  0x1782
+#define Longsung_PRODUCT_M5700         0x4d10
+// end#define YUGA_VENDOR_ID                         0x257A#define YUGA_PRODUCT_CEM600                    0x1601
@@ -480,6 +484,8 @@ static void option_instat_callback(struct urb *urb);#define YUGA_PRODUCT_CLU528                    0x360D#define YUGA_PRODUCT_CLU526                    0x360F+
+/* Viettel products */#define VIETTEL_VENDOR_ID                      0x2262#define VIETTEL_PRODUCT_VT1000                 0x0002
@@ -645,6 +651,7 @@ static const struct option_blacklist_info YUGA_9X07_blacklist = {};// add end+static const struct usb_device_id option_ids[] = {//add by ZHQ 2017-11-23 for Quectel EC20//{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_ID) },
@@ -1846,6 +1853,7 @@ static const struct usb_device_id option_ids[] = {.driver_info = (kernel_ulong_t)&YUGA_9X07_GPS_blacklist },{ USB_DEVICE(YUGA_VENDOR_AC3, YUGA_PRODUCT_AC3),.driver_info = (kernel_ulong_t)&YUGA_VENDOR_AC3_blacklist },
+       { USB_DEVICE(Longsung_VENDOR_M5700,  Longsung_PRODUCT_M5700)},{ USB_DEVICE(CLM920_VENDOR_ID, YUGE_PRODUCT_CLM920_EC5) },{ USB_DEVICE(CLM920_VENDOR_ID, YUGE_PRODUCT_CLM920_NC5_2) },/* add end */

[RK3288][Android5.1] 调试笔记 --- 根据VIDPID读取不同的rilLib以实现4G模块的适配相关推荐

  1. [RK3288][Android5.1] 调试笔记 --- 编译libwebviewchromium.so出错

    Platform: RK3288 OS: Android 5.1 现象: 编译的时候出现如下Error Log: make: *** [out/target/product/rk3288_box/ob ...

  2. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...

  3. [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...

  4. [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...

  5. [调试记录]3288 7.1平台上移植美格 SLM790 4G模块

    [调试记录]3288 7.1平台上移植美格 SLM790 4G模块 一 驱动配置 1.1 PPP 配置 需要配置 Android 内核来支持 PPP 功能,按照以下步骤来配置 PPP 选项 Devic ...

  6. gpio驱动广播Android,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成后控 ...

  7. android 系统gpu 调试_[RK3288][Android6.0] 调试笔记 --- 读取当前DDR和GPU频率方法

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 ddr和gpu的clock都受dvfs模块管控, 所以只要执行: root@rk3288:/ # ...

  8. android 避免cpu降频,[RK3288][Android6.0] 调试笔记 --- CPU温度降频控制

    rk3288平台关于温度调节cpu频率有个bug. 在rk3288.dtsi中,有: temp-limit-enable = <1>; target-temp = <80>; ...

  9. [RK3288][Android6.0] 调试笔记 --- ro.serialno的获取

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 rk3288平台的serial number是由drmservice写进去的,drmservice在r ...

最新文章

  1. 黑马程序员—易混淆的知识
  2. 学习linux决心书
  3. 利用自己的电脑设置web服务器建网站_win7系统篇,win7系统利用iis搭建web服务器实现信息浏览资源共享的操作方法...
  4. Android中实现一个简单的逐帧动画(附代码下载)
  5. JavaWeb课程复习资料(四)——创建Servlet
  6. 等差数列划分 II - 子序列(动态规划)
  7. 前端构建新世代,Esbuild 原来还能这么玩!
  8. php过滤句尾空格,php正则过滤各种标签,空格,换行符的实现方法
  9. python中的namespace
  10. Excel之【保护工作表】功能(工具----保护) ------可以防止修改格式,删除行。只能在里面填写数据。
  11. 解决Linux下使用sqlplus不能使用上下键,退格键
  12. 如何截取QQ密码和聊天内容、去掉QQ广告栏、添加QQ尾巴
  13. 达梦数据库/DM7迁移之导出sql脚本
  14. Windows11系统引导修复(因EasyBCD误删win11启动)
  15. 关于AS(Android studio)添加recyclerview控件后的进一步仿微信界面
  16. 链接测试工具-Xenu
  17. 饥荒服务器模组全部显示冲突,饥荒联机洞穴设置及常见问题的解决方法
  18. 无法打开登录所请求的数据库database登录失败用户登录失败
  19. uni-app小程序基础知识速览(上)
  20. 【拓扑学知识】1.拓扑空间与度量拓扑

热门文章

  1. 前端搞一个扭蛋抽奖小动画?
  2. 实现阿里云物联网平台设备信息到微信小程序分享过程
  3. 读书笔记,《刻意练习》,第三章,心理表征
  4. mac c语言 新手,第1次买Mac必看,新手买Mac全攻略!
  5. Lively Wallpaper —— 优秀的开源视频壁纸软件
  6. DSP28335入门教程:ADC的使用
  7. 零基础能掌握seo知识吗
  8. 帮优质粉丝脱单|【英国女】No.33|22岁,硕士,喜欢旅行爱好做饭,消费者心理学...
  9. 迁移学习(基于ResNet18的蜜蜂和蚂蚁分类)
  10. 平方根不用计算机怎么算,怎么算立方根(平方根)?不用计算器的!