RK3288 Android11 mini-pcie接口 4G模组EC200A适配(含自适应功能)

news2025/1/15 7:56:36

这里写目录标题

  • 1、修改驱动内核配置
    • ①使能USBNET功能
    • ②使能 USB 串口 GSM、CDMA 驱动
    • ③使能 USB 的 CDC ACM模式
    • ④使能PPP功能
  • 2、使用lsusb命令查看是否识别到usb接口的“EC200A”4G模组
  • 3、在drivers/usb/serial/option.c添加VID和PID信息
    • ①添加VID和PID定义
    • ②在option_ids 数组中添加
    • ③支持 ECM 接口,可以通过 ECM 接口轻松联网,在option_probe 函数添加如下
    • ④添加休眠后唤醒接口,在option_1port_device 结构体变量里面添加如下
  • 4、在drivers/usb/serial/usb_wwan.c 文件中的usb_wwan_setup_urb函数中添加零包处理代码
  • 5、插入EC200A模块,查看日志是否虚拟出USB接口,现象如下
  • 6、关闭SELINUX,路径:a\device\rockchip\common\BoardConfig.mk
  • 7、开启BOARD_HAVE_DONGLE和BOARD_HAS_RK_4G_MODEM,路径与第6点一样
  • 8、无自适应功能的适配方法,也就是不会动态加载RIL库,而是写死的方法,如下
    • ①将ril拷贝到对应的系统路径,创建adevice\rockchip\rk3288\rk3288_Android11\modify.mk文件,内容如下:
    • ②设置vendor.rild.libpath属性
    • ③设置rild.libpath属性
    • ④修改开启rild服务,加载libreference-ril-QUECTEL.so库文件
  • 9、自适应功能的适配方法,也就是会动态加载RIL库,如下
  • 10、添加权限,在a\device\rockchip\common\ueventd.rockchip.rc文件下添加如下
  • 11、查看库是否有和加载库是否正确及日志
  • 12、ping百度是否能上网
  • 13、PATCH补丁文件和需要添加的文件

1、修改驱动内核配置

①使能USBNET功能

-> Device Drivers 
	-> -*- Network device support 
 		-> USB Network Adapters 
			-> -*- Multi-purpose USB Networking Framework

②使能 USB 串口 GSM、CDMA 驱动

Device Drivers  --->
	[*] USB support  --->
	        <*> USB Serial Converter support
		          [*] USB Generic Serail Driver
		          [*] USB Driver for GSM and CMDA modems

③使能 USB 的 CDC ACM模式

-> Device Drivers 
	-> [*] USB support 
		-> <*> Support for Host-side USB
			-> <*> USB Modem (CDC ACM) support

④使能PPP功能

Device Drivers  --->
      [*] Network device support  --->
	        <*> PPP (point-to-point protocol) support
	        <*> PPP support for async serial ports
	        <*> PPP support for sync tty ports
	        <*> PPP Deflate compression

2、使用lsusb命令查看是否识别到usb接口的“EC200A”4G模组

rk3288_Android10:/ $ lsusb
Bus 001 Device 005: ID 2c7c:6005

  这里解释一下信息,“2c7c”指的是VID,“6005”指的是PID。

3、在drivers/usb/serial/option.c添加VID和PID信息

①添加VID和PID定义

#define QUECTEL_VENDOR_ID		0x2c7c	/* VID */
#define QUECTEL_PRODUCT_EC200A_CN       0x6005	/* PID */

②在option_ids 数组中添加

{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200A_CN) },	/* Quectel EC200A */

③支持 ECM 接口,可以通过 ECM 接口轻松联网,在option_probe 函数添加如下

#if 1 //Added by Quectel  
    //Quectel UC20's interface 4 can be used as USB Network device  
    if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)  
        && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)  
        return -ENODEV;  
  
    //Quectel EC20(MDM9215)'s interface 4 can be used as USB Network device  
    if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)  
        && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)  
        return -ENODEV;  
  
    if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {  
        __u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);  
        struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;  
  
        if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {  
            //ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB  
            return -ENODEV;  
        }  
  
        if ((idProduct&0xF000) == 0x0000) {  
            //MDM interface 4 is QMI  
            if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3  
                && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF)  
                return -ENODEV;  
        }  
    }  
#endif 

④添加休眠后唤醒接口,在option_1port_device 结构体变量里面添加如下

.reset_resume = usb_wwan_resume,

4、在drivers/usb/serial/usb_wwan.c 文件中的usb_wwan_setup_urb函数中添加零包处理代码

#if 1 //Added by Quectel for Zero Packet  
    if (dir == USB_DIR_OUT) {  
        if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9090))  
            urb->transfer_flags |= URB_ZERO_PACKET;  
        if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003))  
            urb->transfer_flags |= URB_ZERO_PACKET;  
        if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215))  
            urb->transfer_flags |= URB_ZERO_PACKET;  
        if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C))  
            urb->transfer_flags |= URB_ZERO_PACKET;  
    }  
#endif

5、插入EC200A模块,查看日志是否虚拟出USB接口,现象如下

[ 2537.919546] option 1-1.4:1.2: GSM modem (1-port) converter detected
[ 2537.920339] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
[ 2537.921527] option 1-1.4:1.3: GSM modem (1-port) converter detected
[ 2537.922340] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[ 2537.923486] option 1-1.4:1.4: GSM modem (1-port) converter detected
[ 2537.924214] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2

  再使用ls /dev/ttyUSB*命令查看,如下:

rk3288_Android10:/ $ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2

6、关闭SELINUX,路径:a\device\rockchip\common\BoardConfig.mk

BOARD_SELINUX_ENFORCING ?= false

  当BOARD_SELINUX_ENFORCING设置为1时,表示SELinux处于强制执行模式;当设置为0时,表示SELinux处于宽松模式。在强制执行模式下,SELinux会严格限制应用程序和系统服务的权限,确保它们只能访问其被授权的资源。

7、开启BOARD_HAVE_DONGLE和BOARD_HAS_RK_4G_MODEM,路径与第6点一样

  如果编译时报android.hardware.radio.deprecated这个错误,那么就是BOARD_HAS_RK_4G_MODEM引起的错误。
  解决方法:

a\device\rockchip\common\manifest.xml
     <hal format="hidl">
         <name>android.hardware.radio</name>
         <transport>hwbinder</transport>
         <fqname>@1.1::IRadio/slot1</fqname>
         <fqname>@1.1::IRadio/slot2</fqname>
         <fqname>@1.2::ISap/slot1</fqname>
     </hal>
-     <hal format="hidl">
-         <name>android.hardware.radio.deprecated</name>
-         <transport>hwbinder</transport>
-         <version>1.0</version>
-         <interface>
-             <name>IOemHook</name>
-             <instance>slot1</instance>
-         </interface>
-     </hal>
-     <kernel target-level="5"/>
  </manifest>	

a\device\rockchip\common\4g_modem\manifest.xml
<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.radio</name>
        <transport>hwbinder</transport>
        <fqname>@1.1::IRadio/slot1</fqname>
        <fqname>@1.1::IRadio/slot2</fqname>
        <fqname>@1.2::ISap/slot1</fqname>
    </hal>
    <hal format="hidl">
        <name>android.hardware.radio.deprecated</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IOemHook</name>
            <instance>slot1</instance>
        </interface>
    </hal>
    <hal format="hidl">
-        <name>android.hardware.radio.config</name>
+        <name>android.hardware.radio</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
-            <name>IRadioConfig</name>
+            <name>IRadio</name>
-            <instance>default</instance>
+            <instance>slot1</instance>
        </interface>
    </hal>
</manifest>

  如果报的错误是FAILED: out/target/product/rk3568_r/obj/EXECUTABLES/usb_dongle_intermediates/Misc.o
  解决方法:

\external\usb_modeswitch\usb_dongle\Android.mk
- common_local_tidy_flags := -warnings-as-errors=clang-analyzer-security*,cert-*
+ #common_local_tidy_flags := -warnings-as-errors=clang-analyzer-security*,cert-*

8、无自适应功能的适配方法,也就是不会动态加载RIL库,而是写死的方法,如下

①将ril拷贝到对应的系统路径,创建adevice\rockchip\rk3288\rk3288_Android11\modify.mk文件,内容如下:

PRODUCT_PACKAGES += rild
PRODUCT_COPY_FILES += \
    device/rockchip/rk3288/rk3288_Android11/modify/xG_module/libquectel-ril/armeabi/libreference-ril-QUECTEL.so:vendor/lib/libreference-ril-QUECTEL.so \
    device/rockchip/rk3288/rk3288_Android11/modify/xG_module/libquectel-ril/armeabi/chat:system/bin/chat \
    device/rockchip/rk3288/rk3288_Android11/modify/xG_module/libquectel-ril/armeabi/ip-up:system/bin/ip-up \
    device/rockchip/rk3288/rk3288_Android11/modify/xG_module/libquectel-ril/armeabi/ip-down:system/bin/ip-down \
    device/rockchip/rk3288/rk3288_Android11/apns-conf.xml:system/etc/apns-conf.xml
然后a\device\rockchip\rk3288\device.mk文件下添加如下:
include $(LOCAL_PATH)/rk3288_Android11/modify.mk

②设置vendor.rild.libpath属性

a\device\rockchip\common\device.mk
ifeq ($(strip $(BOARD_HAS_RK_4G_MODEM)),true)
PRODUCT_PACKAGES += \
    CarrierDefaultApp \
    CarrierConfig \
    rild \
-   librk-ril \
+   libreference-ril-QUECTEL.so \
    dhcpcd
 
PRODUCT_COPY_FILES += vendor/rockchip/common/phone/etc/apns-full-conf.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/apns-conf.xml
 
PRODUCT_PACKAGES += \
    android.hardware.radio@1.2-radio-service \
    android.hardware.radio.config@1.0-service
 
PRODUCT_PROPERTY_OVERRIDES += \
		ro.boot.noril=false \
		ro.telephony.default_network=9
 
ifeq ($(strip $(TARGET_ARCH)), arm64)
PRODUCT_PROPERTY_OVERRIDES += \
-        vendor.rild.libpath=/vendor/lib64/librk-ril.so
+		 vendor.rild.libpath=/vendor/lib64/libreference-ril-QUECTEL.so
 
PRODUCT_COPY_FILES += \
		$(LOCAL_PATH)/4g_modem/bin64/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
		$(LOCAL_PATH)/4g_modem/lib64/librk-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib64/librk-ril.so
else
PRODUCT_PROPERTY_OVERRIDES += \
-		vendor.rild.libpath=/vendor/lib/librk-ril.so
+		vendor.rild.libpath=/vendor/lib/libreference-ril-QUECTEL.so
 
PRODUCT_COPY_FILES += \
		$(LOCAL_PATH)/4g_modem/bin32/dhcpcd:$(TARGET_COPY_OUT_VENDOR)/bin/dhcpcd \
		$(LOCAL_PATH)/4g_modem/lib32/librk-ril.so:$(TARGET_COPY_OUT_VENDOR)/lib/librk-ril.so
 
endif
endif

③设置rild.libpath属性

a\device\rockchip\rk3288\device.mk
PRODUCT_PROPERTY_OVERRIDES += \
                ro.ril.ecclist=112,911 \
                ro.opengles.version=196610 \
                wifi.interface=wlan0 \
+		ro.telephony.default_network=9 \
+		rild.libpath=/vendor/lib64/libreference-ril-QUECTEL.so \
+		rild.libargs=-d /dev/ttyUSB2 \
                ro.audio.monitorOrientation=true \
                debug.nfc.fw_download=false \
                debug.nfc.se=false \
                vendor.hwc.compose_policy=1 \
                sys.wallpaper.rgb565=0 \
                sf.power.control=2073600 \
                sys.rkadb.root=0 \
                ro.sf.fakerotation=false \
                ro.tether.denied=false \
                sys.resolution.changed=false \
                ro.default.size=100 \
                ro.product.usbfactory=rockchip_usb \
                wifi.supplicant_scan_interval=15 \
                ro.factory.tool=0 \
                ro.kernel.android.checkjni=0 \
                ro.build.shutdown_timeout=6 \
                persist.enable_task_snapshots=false \
                ro.vendor.frameratelock=true

④修改开启rild服务,加载libreference-ril-QUECTEL.so库文件

-	service ril-daemon /vendor/bin/hw/rild
+	service ril-daemon /vendor/bin/hw/rild -l /vendor/lib/libreference-ril-QUECTEL.so
    socket rild stream 660 root radio
    socket rild-debug stream 660 radio system
    class main
    user radio
    group radio cache inet misc audio log readproc wakelock
    capabilities BLOCK_SUSPEND NET_ADMIN NET_RAW

9、自适应功能的适配方法,也就是会动态加载RIL库,如下

参考博客链接👈

10、添加权限,在a\device\rockchip\common\ueventd.rockchip.rc文件下添加如下

#quectel port
/dev/ttyUSB*              0660   radio      radio
/dev/ttyACM*              0660   radio      radio
/dev/cdc-wdm*             0660   radio      radio
/dev/qcqmi*               0660   radio      radio
/dev/cdc-acm*             0660   radio      radio

11、查看库是否有和加载库是否正确及日志

①查看库是否存在:cd vendor/lib/
②查看加载库:getprop | grep rild
③应用日志:logcat -b radio

12、ping百度是否能上网

在这里插入图片描述

13、PATCH补丁文件和需要添加的文件

文件链接👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

找寻openSUSE的前世今生

找寻开始的地方 在一些资产管理平台、网管系统&#xff0c;完全依赖资产录入资产&#xff0c;假如存在SUSE类型网元&#xff0c;能否将SLES和openSUSE一同接入到SUSE类型下&#xff0c;就有待商榷了。 SLES和openSUSE是两个不同的Linux发行版&#xff0c;更准确说是两个不同的…

基于PHP的蛋糕甜品商店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

python读写.pptx文件

1、读取PPT import pptx pptpptx.Presentation(rC:\Users\user\Documents\\2.pptx) # ppt.save(rC:\Users\user\Documents\\1.pptx) # slideppt.slides.add_slide(ppt.slide_layouts[1])# 读取所有幻灯片上的文字 for slide in ppt.slides:for shape in slide.shapes:if shape…

[尚硅谷React笔记]——第4章 React ajax

目录&#xff1a; 脚手架配置代理_方法一 server1.js开启服务器server1:App.js解决跨域问题&#xff1a;脚手架配置代理_方法二 ​​​​​​​server2.js开启服务器server2第一步&#xff1a;创建代理配置文件编写setupProxy.js配置具体代理规则&#xff1a;App.js运行结果&a…

js实现红包雨功能(canvas,react,ts),包括图片不规则旋转、大小、转速、掉落速度控制、屏幕最大红包数量控制等功能

介绍 本文功能由canvas实现红包雨功能&#xff08;index.tsx&#xff09;本文为react的ts版。如有其他版本需求可评论区观赏地址&#xff0c;需过墙 import React, { Component } from react; // import ./index.css; import moneyx from /assets/images/RedEnvelopeRain/bal…

SEO业务适合什么代理IP?2023海外代理IP推荐排名

随着数字营销趋势的变化&#xff0c;搜索引擎优化仍然是企业在网络世界中努力繁荣的重要组成部分。为了实现 SEO 成功&#xff0c;从搜索引擎获取准确且多样化的数据至关重要&#xff0c;然而可能会受到诸如基于位置的限制和被检测风险等限制的阻碍&#xff0c;IP代理则可以帮助…

百度开源分布式id生成器集成--真香警告

百度开源分布式id生成器集成–真香警告 文章目录 [toc] 1.为什么需要分布式id生成器&#xff1f;2.常见id生成方案2.1 数据库表主键自增2.2 uuid2.3 雪花算法2.3.1 实现代码2.3.2 缺点的解决方案百度开源的分布式唯一ID生成器UidGenerator(本文重点讲解这个)Leaf--美团点评分布…

gnome-terminal禁止关闭确认

当你想要关闭一个终端时&#xff0c;弹出“确认关闭&#xff1f;”多少有些烦。 比如当前为root下&#xff0c;要么一路exit&#xff0c;要么就点击确认&#xff1a; 解决方法&#xff1a; 安装一个配置编辑器来帮我们方便地编辑配置项 sudo apt install dconf-editor找到…

小程序搭建OA项目首页布局界面

首先让我们来学习以下Flex布局 一&#xff0c;Flex布局简介 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性 Flex布局简介 Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的…

tomcat、nginx实现四层转发+七层代理+动静分离实验

实验环境&#xff1a; nginx1——20.0.0.11——客户端 静态页面&#xff1a; nginx2——20.0.0.21——代理服务器1 nginx3——20.0.0.31——代理服务器2 动态页面&#xff1a; tomcat1——20.0.0.12——后端服务器1 tomcat2——20.0.0.22——后端服务器2 实验步骤&…

什么是4K三路虚拟情景互动教学软件?

4K三路虚拟情景互动教学软件具备了AI对话&#xff0c;场景库丰富自定义选择&#xff0c;画面色差调节&#xff0c;人物滤镜调节&#xff0c;截图编辑&#xff0c;视频录制与编辑&#xff0c;视频直播&#xff0c;画中画控制功能&#xff0c;字幕&#xff0c;图片和特效录入功能…

sqlmap --os-shell选项原理解析

文章目录 sqlmap --os-shell选项原理解析原理解析总结 sqlmap --os-shell选项原理解析 以sqli第一关为例。 --os-shell 是 SQLMap 工具的一个参数&#xff0c;用于在成功注入数据库后&#xff0c;执行操作系统命令并获取其输出。 sqlmap -u "http://192.168.188.199/sq…

学信息系统项目管理师第4版系列31_信息系统工程

1. 信息系统战略三角突出了业务战略、信息系统和组织机制之间的必要一致性 1.1. 【高23上选07】 2. 软件工程 2.1. 软件工程方法是完成软件工程项目的技术手段&#xff0c;它支持整个软件生命周期 2.2. 软件工程使用的工具是人们在开发软件的活动中智力和体力的扩展与延伸 …

React合成事件

一、合成事件 event 是 SyntheticEvent &#xff0c;模拟出来 DOM 事件所有能力 event.nativeEvent 是原生事件对象 所有的事件&#xff0c;都被挂载到 document 上&#xff08;React ≤ 16&#xff09;&#xff0c;React17之后是挂载到root组件 和 DOM 事件不一样&#xff…

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍 本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽&#xff0c;后端使用GO开发&#xff0c;前端使用VUE的Element-Plus作为UI框架&#xff0c;整个面板的管理都是基于docker的&#xff0c;想法很先进。官方还提供了视频的使用教程&…

Spring Security配置多个数据源并添加登录验证码(7)

1、配置多个数据源 多个数据源是指在同一个系统中&#xff0c;用户数据来自不同的表&#xff0c;在认证时&#xff0c;如果第一张表没有查找到用户&#xff0c;那就去第二张表中査询&#xff0c;依次类推。 看了前面的分析&#xff0c;要实现这个需求就很容易了&#xff0c;认…

【计算机网络笔记】计算机网络体系结构概念

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

GO 语言的函数??

函数是什么&#xff1f; 学过编程的 xdm 对于函数自然不会陌生&#xff0c;那么函数是什么呢&#xff1f; 函数是一段可以重用的代码块&#xff0c;可以被多次调用&#xff0c;我们可以通过使用函数&#xff0c;提高咱们代码代码的模块化&#xff0c;提高程序的可读性和可维护…

渐进式编程之旅:探寻PHP函数的奇妙世界

目录 前言 一、函数的定义和调用 1.1 初识函数 1.1.1 函数分类 1.1.2 自定义函数 1.1.3 return关键字 1.2 参数设置 1.2.1 无参函数 1.2.2 按值传递参数 1.2.3 引用传参 1.2.4 设置参数默认值 1.2.5 指定参数类型&#xff08;弱&#xff09; 1.3 变量的作用域 1.3.1 变量分类 1…

使用bisect模块进行二分查找操作 bisect.bisect()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用bisect模块 进行二分查找操作 bisect.bisect() 选择题 请问bisect.bisect(c,2)的结果是&#xff1a; import bisect print("【执行】c [1,2,2,6,7]") c [1,2,2,6,7] print(c…