【EC200N-CN——Linux驱动移植】问题回顾
- 1)、开发回顾
- 一、问题回顾与解决过程
- 二、核心原理分析
- 1. **USB设备识别的关键:VID/PID**
- 2. **为什么之前不生成`ttyUSB`节点?**
- 3. **为什么添加PID后就能生成节点?**
- 三、日志关键信息解读
- 1. **USB设备识别日志**
- 2. **端点(Endpoint)配置修正**
- 3. **网络接口注册**
- 4. **串口节点生成**
- 四、技术细节详解
- 1. **为什么能通过`ttyUSB2`发AT指令?**
- 2. **为什么能通过`usb0`上网?**
- 3. **为什么不需要修改内核配置?**
- 五、总结与拓展
- 1. **问题根源**
- 2. **EC200N-CN的接口功能**
- 3. **测试验证方法**
- 4. **潜在优化方向**
- 2)开发中遇到问题的详细解析(重点!)
- 一、核心问题解析
- 1. **为什么初始状态下直接插上EC200N-CN模块就能上网(`ping www.baidu.com`),但不能发短信/打电话?**
- 2. **为什么添加`USB_DEVICE(0x2C7C, 0x6002)`后功能正常?**
- 二、专业术语全称与解释
- 1. **关键术语解析**
- 2. **其他重要概念**
- 三、日志逐行分析
- 1. **USB设备检测**
- 2. **速度警告**
- 3. **端点配置修复**
- 4. **网络接口注册**
- 5. **串口节点生成**
- 四、总结
- 1. **功能实现流程**
- 2. **关键结论**
1)、开发回顾
一、问题回顾与解决过程
问题背景:
IMX8开发板运行Linux 5.4内核,插入EC200N-CN模块后,仅生成usb0
网络接口,但未生成串口节点(如ttyUSB0
、ttyUSB1
等),导致无法通过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) }
添加后,模块插入时生成ttyUSB0
、ttyUSB1
、ttyUSB2
节点,并可通过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
,导致内核误认为该设备不需要串口驱动,仅加载了网络驱动(cdc_ether
)。
• 结果:仅生成usb0
网络接口,无串口节点。
3. 为什么添加PID后就能生成节点?
• 驱动绑定:添加PID后,内核的option
驱动会主动接管设备,并为每个串口接口创建ttyUSB
节点。
• 多接口设备:EC200N-CN是一个复合设备,包含:
• 接口1:cdc_ether
(网络功能,生成usb0
)。
• 接口2/3/4:串口功能(生成ttyUSB0
、ttyUSB1
、ttyUSB2
)。
三、日志关键信息解读
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
驱动识别到串口接口,生成ttyUSB0
、ttyUSB1
、ttyUSB2
节点。
四、技术细节详解
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 0 | CDC-ECM(网络) | usb0 |
Interface 2 | 调制解调器控制 | ttyUSB0 |
Interface 3 | 辅助端口(调试) | ttyUSB1 |
Interface 4 | AT指令端口 | 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/PID(Vendor 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_ether | CDC Ethernet Control Model | USB协议的一种,允许设备模拟以太网卡,提供TCP/IP网络功能。 |
option 驱动 | USB Serial Option Driver | Linux内核中用于支持高通、华为等厂商USB调制解调器的通用串口驱动。 |
ci_hdrc | ChipIdea High-Speed Dual-Role Controller | IMX8芯片的USB控制器驱动,负责管理USB主机/设备模式切换。 |
altsetting | Alternate Setting | USB接口的备选配置,用于切换接口的不同工作模式(如不同传输速率)。 |
endpoint | USB Endpoint | USB设备的数据通道,每个端点有方向(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. 功能实现流程
- 插入模块 → 内核检测到USB设备,但未匹配串口驱动。
- 加载
cdc_ether
驱动 → 创建usb0
,支持上网。 - 在option.c源文件添加VID/PID →
option
驱动绑定设备,生成ttyUSB
节点。 - 通过
ttyUSB2
发送AT指令 → 控制模块发短信/打电话。
2. 关键结论
• CDC-ECM模式:模块默认支持,无需配置即可上网。
• AT指令依赖串口:必须通过ttyUSB
节点通信,驱动未匹配时节点缺失。
• 内核驱动的VID/PID匹配:是激活串口功能的核心条件。