A133P EC200M模块调试

Linux USB驱动框架:

        USB 是一种分层总线结构。USB 设备与主机之间的数据传输由 USB 控制器控制。Linux USB 驱动程序架构如下图所示。Linux USB 主机驱动包括三部分:USB 主机控制器驱动、USB 核心和 USB 设备驱动。

        模块加载 USB 转串口 option 驱动程序后,在/dev 目录下创建 ttyUSB0、ttyUSB1 和 ttyUSB2 等设备文件。以下章节介绍如何将 USB 转串口 option 驱动程序移植到 Linux 操作系统中。

一、驱动移植

// 需要修改的内核配置
longan/kernel/linux-4.9/.config// 需要修改的驱动文件
longan/kernel/linux-4.9/drivers/usb/serial/option.c
longan/kernel/linux-4.9/drivers/usb/serial/usb_wwan.c// 需要用到的驱动文件
longan/kernel/linux-4.9/drivers/net/usb/cdc-acm.c
longan/kernel/linux-4.9/drivers/net/usb/cdc-ether.c

1.在 option_ids 列表内增加 EC200M-CN 的 PID\VID, 这样才能识别到该 USB 设备为串口设备,文档内可查。

// linux-4.9/drivers/usb/serial/option.c
static const struct usb_device_id option_ids[] = {
#ifdef SUPPORT_QUECTEL{ USB_DEVICE(0x2C7C, 0x6002) }, // support EC200S/EC200M
#endif......
}

2.一个 USB 设备可以有多个功能不同的接口,在 option_ids 添加该设备的 PID\VID 后,会导致该设备的所有接口都会绑定到 USB Serial Option 驱动上,导致 USBNet 驱动接口无法正常工作,因此需要在 option_probe 中根据类码、接口索引、端点数量、子类码将 USBNet 的接口排除出来。

// linux-4.9/drivers/usb/serial/option.c
static int option_probe(struct usb_serial *serial, const struct usb_device_id *id)
{......    
#ifdef SUPPORT_QUECTEL 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, ADBreturn -ENODEV;}if ((idProduct&0xF000) == 0x0000) {//MDM interface 4 is QMIif (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3 && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF)return -ENODEV;}}#ifdef SUPPORT_QUECTEL_AUTO_SUSPEND//For USB Auto Suspendif (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {pm_runtime_set_autosuspend_delay(&serial->dev->dev, 3000);usb_enable_autosuspend(serial->dev);}#endif #ifdef SUPPORT_QUECTEL_REMOTE_WAKEUP//For USB Remote Wakeupif (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {device_init_wakeup(&serial->dev->dev, 1); //usb remote wakeup}#endif
#endif/* Store the device flags so we can use them during attach. */usb_set_serial_data(serial, (void *)device_flags);return 0;
}

3.根据USB协议的要求,在批量输出传输期间,通过设置 URB_ZERO_PACKET 标志来添加处理零数据包的机制。

diff --git a/longan/kernel/linux-4.9/drivers/usb/serial/usb_wwan.c b/longan/kernel/linux-4.9/drivers/usb/serial/usb_wwan.c
old mode 100644
new mode 100755
index 3dfdfc8..e56b275
--- a/longan/kernel/linux-4.9/drivers/usb/serial/usb_wwan.c
+++ b/longan/kernel/linux-4.9/drivers/usb/serial/usb_wwan.c
@@ -36,6 +36,8 @@#include <linux/serial.h>#include "usb-wwan.h"+#define SUPPORT_QUECTEL 1
+/** Generate DTR/RTS signals on the port using the SET_CONTROL_LINE_STATE request* in CDC ACM.
@@ -504,6 +506,14 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,usb_fill_bulk_urb(urb, serial->dev,usb_sndbulkpipe(serial->dev, endpoint) | dir,buf, len, callback, ctx);
+       
+#ifdef SUPPORT_QUECTEL 
+       if (dir == USB_DIR_OUT) {
+               struct usb_device_descriptor *desc = &serial->dev->descriptor;
+               if (desc->idVendor == cpu_to_le16(0x2C7C))
+                       urb->transfer_flags |= URB_ZERO_PACKET;
+       }
+#endifreturn urb;}


4.增加 USB 控制器复位后恢复操作

// linux-4.9/drivers/usb/serial/option.c
static struct usb_serial_driver option_1port_device = {......
#ifdef SUPPORT_QUECTEL.reset_resume      = usb_wwan_resume,
#endif
};

5.在内核中启用 USB SERIAL 配置

CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_WWAN=y
CONFIG_USB_SERIAL_OPTION=y
CONFIG_USB_ACM=y
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_CDCETHER=y

 6.配置内核

(1):执行以下命令切换到内核目录cd <用户内核目录>(2):执行以下命令编译内核。make menuconfig(3):启用配置项。选择<*>表示将驱动程序编译到内核映像。选择<M>表示将驱动程序编译成模块。

以 USB 转串口 option 驱动为例,用户可以通过以下选项启用CONFIG_USB_SERIAL_OPTION,将USB 转串口 option 驱动编译到内核镜像。

二、系统适配


主要是修改 ril 库相关的文件,实现拨号和衔接数据通路。

1.ril 库移植
涉及文件列表

android/hardware/ril/rild/radio.xml
android/hardware/ril/rild/rild.rc
android/device/softwinner/common/sepolicy/vendor/rild.te
android/vendor/aw/public/prebuild/lib/librild/radio_common.mk
android/vendor/aw/public/prebuild/lib/librild/lib/lib32/libquectel-ril.so
android/vendor/aw/public/prebuild/lib/librild/lib/lib64/libquectel-ril.so

构建文件拷贝脚本,将移远的 ril 库以及 apns-conf.xml、ql-ril.conf 文件更新到系统指定目录下

android/vendor/aw/public/prebuild/lib/librild/lib/lib32/libquectel-ril.so
android/vendor/aw/public/prebuild/lib/librild/lib/lib64/libquectel-ril.so

三、查看系统属性

mercury-demo:/ # getprop | grep ril
getprop | grep ril
[gsm.version.ril-impl]: [Quectel_Android_RIL_Driver_V3.5.0]
[init.svc.vendor.ril-daemon]: [running]
[ro.boottime.vendor.ril-daemon]: [9918673186]
[ro.radio.noril]: [false]
[vendor.rild.libargs]: [-d/dev/ttyUSB2]
[vendor.rild.libpath]: [/vendor/lib64/libquectel-ril.so]

 以上信息包括ril库的版本,ril守护进程的运行状态,还有ril库文件的路径等等,在移植相应ril库文件后EC200M模块可正常上网。

四、日志抓取

如有其他问题可进行抓取日志分析,抓取模块Log方法如下:

adb root
adb shell mkdir /data/quectel_debug_log
adb shell chmod 777 /data/quectel_debug_log
adb reboot

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录docker 部署nessus

1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 &#xff1a;注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…

JAVA设计模式第十讲:SPI - 业务差异解决方案

JAVA设计模式第十讲&#xff1a;SPI - 业务差异解决方案 我们需要在不修改源代码的情况下&#xff0c;动态为程序提供一系列额外的特性。首先想到的是Spring的AOP技术来构建应用插件&#xff0c;但是在Java自带的插件中&#xff0c;就有完整的实现。SPI&#xff08;Service Pro…

echarts饼图label自定义样式

生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…

DQN算法概述及基于Pytorch的DQN迷宫实战代码

一. DQN算法概述 1.1 算法定义 Q-Learing是在一个表格中存储动作对应的奖励值&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很大的局限性。在现实中很多情况下&#xff0c;强化学习任务所面临的状态空间是连续的&#xff0c;存在无穷多个状态&#xff0c;这种情…

CSS笔记(黑马程序员pink老师前端)浮动,清除浮动

浮动可以改变标签的默认排列方式。浮动元素常与标准流的父元素搭配使用. 网页布局第一准则:多个块级元素纵向排列找标准流&#xff0c;多个块级元素横向排列找浮动。 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框…

Xilinx IDDR与ODDR原语的使用

文章目录 ODDR原语1. OPPOSITE_EDGE 模式2. SAME_EDGE 模式 ODDR原语 例化模板&#xff1a; ODDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" .INIT(1b0), // Initial value of Q: 1b0 or 1b1.SRTYPE("SYNC…

使用Python操作MySQL数据库

准备 安装Python,打开命令提示符&#xff0c;我已经安装成功了 安装Mysql我也安装成功了 我在用户的86188下利用记事本写了一个.py的python代码&#xff0c;在命令提示符中运行 Python自带的集成式开发环境,在电脑搜索框直接IDEA你也会打开 一&#xff0c;建立连接 使用Python…

colab使用(基础入门)——随手记

挂载到google drive 挂载目录/content/drive from google.colab import drive drive.mount(/content/drive) 图解colab读取Google Drive 文件 - 知乎 下载文件 !curl -L https://dl.fbaipublicfiles.com/imagebind/imagebind_huge.pth -o imagebind_ckpt参数&#xff1a;[-…

Nginx 学习(十)高可用中间件的配置与实现

一 Keepalived热备 1 概述 调度器出现单点故障&#xff0c;如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点的状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 2 运行原理 Keepalived检测每个服务器节点状…

Pytest系列-快速入门和基础讲解(1)

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试框架介绍 单元测试…

【智慧工地源码】物联网和传感器技术在智慧工地的应用

物联网&#xff08;IoT&#xff09;和传感器技术在智慧工地中扮演着至关重要的角色。这些技术的应用&#xff0c;使得智慧工地能够实现对施工过程的精确监控、数据收集和分析&#xff0c;以及设备互联&#xff0c;从而提高工程效率、减少成本并改善工人的工作环境。 一、物联网…

微信小程序navigateTo进入页面后返回原来的页面需要携带数据回来

需求 如图&#xff1a;点击评论后会通过wx.navigateTo进入到评论页面&#xff0c;评论完返回count给原页面&#xff0c;重新赋值实现数量动态变化&#xff0c;不然要刷新这个页面才会更新最新的评论数量。 实现方式&#xff1a; 在评论页面通过wx.setStorageSync(‘data’…