【Linux Yocto】【EC200N-CN——Linux驱动移植】问题回顾(其它4G/5G模块类似)

1)、开发回顾

一、问题回顾与解决过程

问题背景
IMX8开发板运行Linux 5.4内核,插入EC200N-CN模块后,仅生成usb0网络接口,但未生成串口节点(如ttyUSB0ttyUSB1等),导致无法通过AT指令控制模块(如打电话、发短信)。

最终解决方案
在Linux内核的option.c(路径:/home/hugo/IMX8/Kernel/Linux-5.4.70/drivers/usb/serial/opticon.c)驱动代码中的usb_device_id option_ids[]数组,添加EC200N-CN的USB设备标识符:

{ USB_DEVICE(0x2C7C, 0x6002) }, // EC200N-CN的VID/PID
{ USB_DEVICE_AND_INTERFACE_INFO(0x2C7C, 0x6002, 0xff, 0xff, 0xff) }

在这里插入图片描述

添加后,模块插入时生成ttyUSB0ttyUSB1ttyUSB2节点,并可通过usb0上网。


二、核心原理分析

1. USB设备识别的关键:VID/PID

VID(Vendor ID):厂商标识符(Quectel的VID是0x2C7C)。
PID(Product ID):产品标识符(EC200N-CN的PID是0x6002)。
驱动匹配规则:内核通过VID/PID匹配对应的驱动程序。若未在驱动代码中声明支持的VID/PID,设备将无法被正确驱动。

2. 为什么之前不生成ttyUSB节点?

原因:原内核的option.c驱动源码未包含EC200N-CN的PID 0x6002,导致内核误认为该设备不需要USB转串口驱动option,仅加载了网络驱动(cdc_ether)。
结果:仅生成usb0网络接口,无串口节点/dev/ttyUSB。

3. 为什么添加PID后就能生成节点?

驱动绑定:添加PID后,内核的option驱动会主动接管设备,并为每个串口接口创建ttyUSB节点。
多接口设备:EC200N-CN是一个复合设备,包含:
接口1cdc_ether驱动(网络功能,生成usb0)。
接口2/3/4:USB转串口option驱动(生成ttyUSB0ttyUSB1ttyUSB2)。


三、日志关键信息解读

1. USB设备识别日志
[ 2671.047488] usb 1-1.3: new full-speed USB device number 11 using ci_hdrc

含义:检测到USB设备插入,总线位置为1-1.3,设备号为11

2. 端点(Endpoint)配置修正
[ 2671.168245] usb 1-1.3: config 1 interface 1 altsetting 1 endpoint 0x83 has invalid maxpacket 512, setting to 64

背景知识
端点(Endpoint):USB设备的数据通道,分为输入(IN)和输出(OUT)。
maxpacket:单次传输的最大数据包大小。
问题:EC200N-CN的端点报告了不兼容的maxpacket=512(USB全速设备最大应为64)。
内核修复:自动将maxpacket修正为64,确保数据传输正常。

3. 网络接口注册
[ 2671.195854] cdc_ether 1-1.3:1.0 usb0: register 'cdc_ether' at usb-ci_hdrc.1-1.3

含义cdc_ether驱动接管网络接口,生成usb0,用于4G上网。

4. 串口节点生成
[ 2671.207914] option 1-1.3:1.2: GSM modem converter detected
[ 2671.216275] usb 1-1.3: GSM modem converter now attached to ttyUSB0

含义option驱动识别到串口接口,生成ttyUSB0ttyUSB1ttyUSB2节点。


四、技术细节详解

1. 为什么能通过ttyUSB2发AT指令?

AT指令:一种基于文本的命令协议,用于控制调制解调器(如拨号、发短信)。
串口分工
ttyUSB0:用于调制解调器控制(PPP拨号)。
ttyUSB1:用于GPS定位(如果模块支持)。
ttyUSB2:专用AT指令通道。

2. 为什么能通过usb0上网?

CDC-ECM模式:EC200N-CN通过USB模拟以太网卡,内核的cdc_ether驱动将其识别为usb0,提供TCP/IP网络功能。
直接联网:无需PPP拨号,插入后自动获取IP(需运营商支持)。

3. 为什么不需要修改内核配置?

默认配置已包含

CONFIG_USB_SERIAL=y          # 启用USB串口支持
CONFIG_USB_SERIAL_OPTION=y   # 启用option驱动(支持高通、华为等模块)
CONFIG_USB_NET_CDCETHER=y    # 启用CDC-ECM网络驱动

• 如果默认配置未启用这些选项,仍需通过menuconfig手动开启。


五、总结与拓展

1. 问题根源

EC200N-CN的PID未被内核驱动识别,导致串口功能未启用。添加PID后,驱动正确绑定设备,功能全部激活。

2. EC200N-CN的接口功能
接口功能对应节点
Interface 0CDC-ECM(网络)usb0
Interface 2调制解调器控制ttyUSB0
Interface 3辅助端口(调试)ttyUSB1
Interface 4AT指令端口ttyUSB2
3. 测试验证方法

AT指令测试

echo -e "AT\r\n" > /dev/ttyUSB2  # 发送AT指令
cat /dev/ttyUSB2                 # 查看响应(应返回"OK")

在这里插入图片描述
在这里插入图片描述

网络测试

ping www.baidu.com -I usb0       # 通过4G网络ping百度
4. 潜在优化方向

驱动补丁提交:将EC200N-CN的PID提交给Linux内核社区,避免后续用户手动修改。
电源管理:通过AT指令AT+CFUN=1启用模块全功能模式,确保网络稳定性。


2)开发中遇到问题的详细解析(重点!)

为什么直接插上EC200N-CN就能直接ping www.baidu.com了?但是却不能发短信和打电话?
难道是原本就可以发短信和打电话,只是因为没有设备节点(/dev/ ttyUSB0~2)去发送AT指令来发短信和打电话吗?

然后后面配置了下面两行代码才可以?

{ USB_DEVICE(0x2C7C, 0x6002) }, // EC200N-CN的VID/PID
{ USB_DEVICE_AND_INTERFACE_INFO(0x2C7C, 0x6002, 0xff, 0xff, 0xff) }, // 强制绑定到option驱动

下面还会详细分析这串打印的东西:
[ 2671.047488] usb 1-1.3: new full-speed USB device number 11 using ci_hdrc
[ 2671.160615] usb 1-1.3: not running at top speed; connect to a high speed hub
[ 2671.168245] usb 1-1.3: config 1 interface 1 altsetting 1 endpoint 0x83 has invalid maxpacket 512, setting to 64
[ 2671.178398] usb 1-1.3: config 1 interface 1 altsetting 1 endpoint 0xC has invalid maxpacket 512, setting to 64
[ 2671.195854] cdc_ether 1-1.3:1.0 usb0: register ‘cdc_ether’ at usb-ci_hdrc.1-1.3, CDC Ethernet Device, ae:0c:29:a3:9b:6d
[ 2671.207914] option 1-1.3:1.2: GSM modem (1-port) converter detected
[ 2671.216275] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 2671.224051] option 1-1.3:1.3: GSM modem (1-port) converter detected
[ 2671.230833] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 2671.238673] option 1-1.3:1.4: GSM modem (1-port) converter detected
[ 2671.245367] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2


一、核心问题解析

1. 为什么初始状态下直接插上EC200N-CN模块就能上网(ping www.baidu.com),但不能发短信/打电话?

网络功能(usb0
• EC200N-CN模块默认启用了 CDC-ECM模式Communication Device Class - Ethernet Control Model)。
CDC-ECM:一种USB协议,允许设备模拟成以太网卡,内核的cdc_ether驱动会自动识别并创建usb0接口。
直接联网:只要SIM卡正常且运营商支持,插入模块后即可通过usb0直接访问互联网,无需额外配置。

短信/电话功能缺失原因
AT指令依赖串口:发送短信/电话需要通过AT指令Attention Commands)控制模块进行操作,但是AT指令必须通过设备节点/dev/ttyUSB2,通过串口(如ttyUSB2)的方式发送给4G模块才行,所以就i是没有设备节点。
初始驱动未匹配
◦ 未添加VID/PID时,内核的option驱动(USB串口通用驱动)无法识别EC200N-CN的串口接口。
◦ 结果:仅加载网络驱动(cdc_ether),未生成ttyUSB节点,导致无法发送AT指令。

2. 为什么添加USB_DEVICE(0x2C7C, 0x6002)后功能正常?

驱动匹配机制
VID/PIDVendor ID/Product ID):内核通过这两个16进制数值唯一标识USB设备。
• 添加0x2C7C(Quectel厂商ID)和0x6002(EC200N-CN产品ID)后,option驱动会主动绑定设备。
结果:驱动为每个串口接口生成ttyUSB节点(如ttyUSB2用于AT指令),使短信/电话功能可用。


二、专业术语全称与解释

1. 关键术语解析
术语全称解释
GSM modem (1-port)Global System for Mobile Communications Modem支持GSM网络的调制解调器,"1-port"表示驱动为每个接口分配一个串口(实际可能有多个接口)。
cdc_etherCDC Ethernet Control ModelUSB协议的一种,允许设备模拟以太网卡,提供TCP/IP网络功能。
option驱动USB Serial Option DriverLinux内核中用于支持高通、华为等厂商USB调制解调器的通用串口驱动。
ci_hdrcChipIdea High-Speed Dual-Role ControllerIMX8芯片的USB控制器驱动,负责管理USB主机/设备模式切换。
altsettingAlternate SettingUSB接口的备选配置,用于切换接口的不同工作模式(如不同传输速率)。
endpointUSB EndpointUSB设备的数据通道,每个端点有方向(IN/OUT)和传输类型(控制/批量/中断/等时)。
2. 其他重要概念

AT指令Attention Commands,用于控制调制解调器的文本指令集(如ATD10086拨打电话)。
maxpacket:USB端点单次传输的最大数据包大小(单位:字节)。
ttyUSB:Linux中USB串口设备的命名规则,tty表示"Teletype Terminal",USB表示接口类型。


三、日志逐行分析

1. USB设备检测
[ 2671.047488] usb 1-1.3: new full-speed USB device number 11 using ci_hdrc

1-1.3:设备在USB总线上的位置(总线1-端口1.3)。
full-speed:USB 1.1速度(12 Mbps),非高速(High-Speed, 480 Mbps)。
ci_hdrc:IMX8的USB控制器驱动已接管设备。

2. 速度警告
[ 2671.160615] usb 1-1.3: not running at top speed; connect to a high speed hub

原因:EC200N-CN工作在USB 1.1模式,但连接到了USB 2.0或3.0控制器。
建议:使用USB 2.0集线器避免兼容性警告(实际不影响功能)。

3. 端点配置修复
[ 2671.168245] usb 1-1.3: config 1 interface 1 altsetting 1 endpoint 0x83 has invalid maxpacket 512, setting to 64
[ 2671.178398] usb 1-1.3: config 1 interface 1 altsetting 1 endpoint 0xC has invalid maxpacket 512, setting to 64

endpoint 0x83:端点地址(0x83表示IN端点,编号3)。
maxpacket=512:USB全速设备端点最大应为64字节,内核自动修正为64。
影响:避免因数据包过大导致传输错误。

4. 网络接口注册
[ 2671.195854] cdc_ether 1-1.3:1.0 usb0: register 'cdc_ether' at usb-ci_hdrc.1-1.3, CDC Ethernet Device, ae:0c:29:a3:9b:6d

usb0:生成的网络接口名称。
ae:0c:29:a3:9b:6d:随机生成的MAC地址(若模块未提供固定地址)。

5. 串口节点生成
[ 2671.207914] option 1-1.3:1.2: GSM modem (1-port) converter detected
[ 2671.216275] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 2671.224051] option 1-1.3:1.3: GSM modem (1-port) converter detected
[ 2671.230833] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 2671.238673] option 1-1.3:1.4: GSM modem (1-port) converter detected
[ 2671.245367] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2

1-1.3:1.2:设备总线位置和接口编号(接口2)。
ttyUSB0~ttyUSB2:三个串口节点,分别用于不同功能:
ttyUSB0:调制解调器控制(PPP拨号)。
ttyUSB1:调试或辅助通道。
ttyUSB2:AT指令通道(用于发短信/打电话)。


四、总结

1. 功能实现流程
  1. 插入模块 → 内核检测到USB设备,但未匹配串口驱动。
  2. 加载cdc_ether驱动 → 创建usb0,支持上网。
  3. 在option.c源文件添加VID/PIDoption驱动绑定设备,生成ttyUSB节点。
  4. 通过ttyUSB2发送AT指令 → 控制模块发短信/打电话。
2. 关键结论

CDC-ECM模式:模块默认支持,无需配置即可上网。
AT指令依赖串口:必须通过ttyUSB节点通信,驱动未匹配时节点缺失。
内核驱动的VID/PID匹配:是激活串口功能的核心条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值