高通X105 5G-Advanced模组实战(1): Linux驱动移植与USB枚举的踩坑经验
本文基于实际项目经验,详细记录高通X105(SDX75)5G-Advanced模组在Linux系统下的驱动移植全流程。不同于X62平台,X105引入了MHI新架构,USB枚举顺序有变化,PID也有更新,笔者在项目中踩了7个坑才彻底跑通,特此记录供同行参考。
一、高通X105 5G-A Modem-RF系统新架构
高通X105是高通2026年MWC发布的最新R19-ready 5G-A平台,相比X62 5G模组,硬件架构有较大变化,驱动也完全不同:
图1:X105 5G-Advanced Modem-RF系统架构图
X105相比X62的关键架构升级:
| 特性 | X62 | X105 | 对驱动的影响 |
|---|---|---|---|
| 工艺 | 4nm | 4nm基带+6nm RF | 新增RF控制通道 |
| 峰值速率 | 4.4Gbps/900Mbps | 14.8Gbps/4.2Gbps | 需要PCIe/MHI高速通道 |
| USB接口 | USB 3.1 | USB 3.2 Gen2 + MHI | MHI协议栈是新坑 |
| PCIe | 可选 | PCIe Gen3 x2 标配 | 需要MHI Bus驱动 |
| 数据通道 | QMI/PPP/GobiNet | MHI net + qmi_wwan | GobiNet彻底废弃 |
| AI处理器 | 无 | 第五代AI处理器 | 新增AI通道Interface |
| VID/PID | 05c6:90xx | 05c6:9078/9079/907a | 老驱动认不出新PID |
实战提醒:千万别直接用X62的驱动配置套X105!PID变了,Interface分配也变了,直接用会出现"lsusb能看到但没ttyUSB"的问题。
二、Linux USB复合设备枚举架构
X105枚举为USB复合设备,Interface分配相比老平台有变化,架构图如下:
图2:X105 USB复合设备枚举架构图
X105的USB Interface分配(笔者实测):
| Interface号 | 类型 | 驱动 | 设备节点 | 备注 |
|---|---|---|---|---|
| 0 | DIAG | option | ttyUSB0 | 诊断口 |
| 1 | ATC | option | ttyUSB1 | AT命令口(主用) |
| 2 | NMEA | option | ttyUSB2 | GNSS定位数据 |
| 3 | Modem | option | ttyUSB3 | PPP备用 |
| 4 | QMI/MBIM | cdc_mbim/qmi_wwan | wdm0 + wwan0 | 控制+数据 |
| 5 | MHI Data | mhi_net | mhi0_net0 | 高速数据口(10Gbps) |
| 6 | DBG | option | ttyUSB4 | 调试日志口(新增) |
| 7 | AI Channel | qcom_ai | /dev/qai0 | AI通道(新增) |
踩坑点#1:PID不在option驱动列表中
内核5.15及更早版本的option_ids[]里没有X105的PID(0x9078),直接插上只能看到"Qualcomm, Inc."但没有任何ttyUSB设备。
三、驱动移植全流程(Kernel 5.15实测)
3.1 内核配置(make menuconfig)
必须启用的配置项,笔者一开始漏了CONFIG_MHI_BUS,调了两天:
# 基础USB SerialCONFIG_USB_SERIAL=yCONFIG_USB_SERIAL_OPTION=yCONFIG_USB_SERIAL_WWAN=yCONFIG_USB_SERIAL_QCAUX=y# 新增!X105需要qcauxCONFIG_USB_SERIAL_QCOMQC=y# 新增!高通QC串口# MHI子系统(关键!X105必备)CONFIG_MHI_BUS=yCONFIG_MHI_BUS_PCI_GENERIC=yCONFIG_MHI_NET=y# MHI网络驱动CONFIG_WWAN=yCONFIG_WWAN_QCOM_MHI=y# 高通MHI WWAN驱动# QMI/MBIM网络CONFIG_USB_NET_QMI_WWAN=yCONFIG_USB_NET_CDC_MBIM=yCONFIG_USB_USBNET=yCONFIG_USB_NET_CDCETHER=y# PCIe(如果用PCIe接口)CONFIG_PCI=yCONFIG_PCIEPORTBUS=y3.2 给option驱动添加X105 PID
修改drivers/usb/serial/option.c,在option_ids[]数组中添加:
staticconststructusb_device_idoption_ids[]={// ... 原有设备保持不变 ...// 高通X105 (SDX75) 新增{USB_DEVICE(0x05C6,0x9078)},// X105 default composition{USB_DEVICE(0x05C6,0x9079)},// X105 MBIM composition{USB_DEVICE(0x05C6,0x907A)},// X105 PCIe+USB composition{USB_DEVICE_INTERFACE_CLASS(0x05C6,0x9078,0xFF)},{}/* Terminating entry */};MODULE_DEVICE_TABLE(usb,option_ids);另外还需要在option_probe()中保留QMI和MHI接口不被option接管,否则会冲突:
staticintoption_probe(structusb_serial*serial,conststructusb_device_id*id){// ... 原有代码 .../* X105: skip QMI/MBIM and MHI data interfaces */if(serial->dev->descriptor.idVendor==cpu_to_le16(0x05C6)&&serial->dev->descriptor.idProduct==cpu_to_le16(0x9078)){if(iface_desc->bInterfaceNumber==4||// QMI/MBIMiface_desc->bInterfaceNumber==5||// MHI dataiface_desc->bInterfaceNumber==7){// AI channelreturn-ENODEV;}}// ...}踩坑点#2:option驱动劫持了QMI接口
如果不跳过interface 4,option会把QMI口也当成串口,导致cdc_mbim/qmi_wwan无法绑定,表现为没有wdm0设备,QMI拨号失败。
3.3 动态添加ID(不想重编内核的临时方案)
如果不想编译内核,可以启动后通过sysfs动态添加:
# 先看模组的PIDlsusb# Bus 002 Device 003: ID 05c6:9078 Qualcomm, Inc.# 添加到option驱动echo05c69078>/sys/bus/usb-serial/drivers/option1/new_id# 添加到qcauxecho05c69078>/sys/bus/usb-serial/drivers/qcaux/new_id# 等2秒再看设备sleep2ls/dev/ttyUSB*踩坑点#3:添加new_id后仍然没有ttyUSBx
原因是模组可能启动在USB模式但需要先发送AT$QCPWRDN或AT+CFUN=1才完整枚举。如果是刚上电,需要等待15~20秒让模组内部启动完成,期间dmesg会有多次断开重连。
四、驱动移植完整调试流程(含真实dmesg日志分析)
下面是笔者项目中真实的调试流程图,包含每一步的验证命令和常见失败现象:
图3:X105驱动移植与USB枚举调试流程图
4.1 正常枚举的dmesg参考(成功案例)
以下是笔者平台上正常枚举的dmesg,对比自己的日志看卡在哪一步:
[ 123.456789] usb 2-1: new SuperSpeed USB device number 3 using xhci_hcd [ 123.483210] usb 2-1: New USB device found, idVendor=05c6, idProduct=0x9078, bcdDevice= 5.10 [ 123.483234] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 123.483240] usb 2-1: Product: Qualcomm X105 5G Modem [ 123.483245] usb 2-1: Manufacturer: Qualcomm, Incorporated [ 123.483249] usb 2-1: SerialNumber: 0123456789ABCDEF [ 123.501234] option 2-1:1.0: Qualcomm USB modem converter detected [ 123.501456] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB0 [ 123.503456] option 2-1:1.1: Qualcomm USB modem converter detected [ 123.503678] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB1 [ 123.505678] option 2-1:1.2: Qualcomm USB modem converter detected [ 123.505890] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB2 [ 123.507890] option 2-1:1.3: Qualcomm USB modem converter detected [ 123.508123] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB3 [ 123.510123] cdc_mbim 2-1:1.4: setting rx_max = 16384 [ 123.512345] cdc_mbim 2-1:1.4: cdc-wdm0: USB WDM device [ 123.514567] cdc_mbim 2-1:1.4 wwan0: register 'cdc_mbim' at usb-xhci-hcd.2.auto-1, CDC MBIM, xx:xx:xx:xx:xx:xx [ 123.523456] mhi_net 2-1:1.5: MHI net device mhi0_net0 registered [ 123.525678] option 2-1:1.6: Qualcomm USB modem converter detected [ 123.525890] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB44.2 常见错误日志分析
错误场景A:option驱动加载但只出3个ttyUSB(缺ttyUSB4)
# 原因:内核版本老,option驱动对新interface数量支持不足 # 解决:检查option.c里是否有USB_INTERFACE_PROBE_INFO限制错误场景B:cdc_mbim报错probe failed
[ 123.567890] cdc_mbim 2-1:1.4: probing failed, error -16 # 原因:option驱动已经把interface 4抢走了 # 解决:在option_probe()里加iface==4返回-ENODEV错误场景C:MHI超时无法ready
[ 130.123456] mhi mhi0: Wait for PM state to transition to M0 failed [ 130.123457] mhi mhi0: MHI NOT ready! # 原因:USB3信号质量差/供电不足 # 解决:换短USB线,加粗VBAT和VBUS电源线,量测VBUS纹波<100mV踩坑点#4:USB3.0信号完整性问题
X105是USB 3.2 Gen2(10Gbps),对走线阻抗要求很高。笔者第一次用普通飞线连接,MHI始终无法进入M0状态,降为USB2也只能到High-Speed。后来改用阻抗控制的PCB板,问题解决。调试阶段可以强制模组工作在USB2模式排除信号问题:
AT+QUSBCFG="usb2",1 // 强制USB2模式调试 AT+CFUN=1,1 // 重启生效
五、AT串口通信验证
驱动枚举成功后,第一件事是验证AT口能正常通信,这里也有坑:
5.1 打开AT口
# 安装minicom或microcomapt-getinstallminicom-y# 打开ttyUSB1(X105的AT口通常是ttyUSB1,但最好逐个试)microcom-s115200/dev/ttyUSB1# 或 minicom -D /dev/ttyUSB1 -b 115200打开后输入AT,正常应该返回:
AT OK踩坑点#5:AT口有输出但输入AT没反应
这是硬件流控问题!X105的AT口默认开启RTS/CTS硬件流控,如果你的串口线没接RTS/CTS引脚,就只能看到开机日志但发不了AT。临时解决:
# 方法1: minicom里关闭硬件流控 (Ctrl+A O → Serial port setup → F)# 方法2: 用stty关闭流控stty-F/dev/ttyUSB1-crtscts永久解决需要AT命令关闭硬件流控:
AT+IFC=0,0 // 关闭流控,重启生效 AT+CFUN=1,1
5.2 基础信息查询命令
ATI // 查型号,应该返回Qualcomm X105 AT+CGMR // 查固件版本 AT+CGSN // 查IMEI AT+CCID // 查SIM卡CCID AT+CPIN? // 查SIM状态,应返回+CPIN: READY AT+CFUN? // 查射频功能,应返回+CFUN: 1如果AT+CPIN?返回+CPIN: NOT READY,检查:
- SIM卡是否插反
- SIM_VDD是否有电(1.8V或3V)
- SIM_IO/SIM_CLK波形是否正常
- SIM卡是否损坏
六、高速MHI数据通路验证
X105最核心的升级是MHI数据通道,比传统QMI快5倍以上,这也是最容易出问题的地方:
图4:X105 MHI/PCIe高速数据通路架构图
6.1 验证MHI设备是否ready
# 查看MHI设备状态cat/sys/bus/mhi/devices/mhi0/status# 应输出: M0 (ready状态)# 查看MHI网络接口iplinkshow# 应看到: mhi0_net0: <BROADCAST,MULTICAST> ...# 查看MHI通道ls/sys/bus/mhi/devices/mhi0/channels/# 应看到多个channel,包括DIAG、AT、DATA0~DATA3等6.2 MHI常见问题
问题:/sys/bus/mhi下没有设备
- 检查CONFIG_MHI_BUS和CONFIG_MHI_NET是否编入内核或模块
- 手动加载模块:
modprobe mhi_net mhi_wwan_ctrl
问题:mhi0状态是SYS_ERR或DISABLE
- 通常是模组固件异常或USB连接不稳定,复位模组:
echo0>/sys/bus/usb/devices/2-1/authorizedsleep2echo1>/sys/bus/usb/devices/2-1/authorized
踩坑点#6:MHI通道ready但ping不通
MHI网卡加载成功只是通道通了,还需要通过QMI/MBIM拨号配置IP。MHI本身只是二层传输通道,不是配置完就自动能上网的,这点很多人搞错。拨号方法在下一篇文章详细讲。
问题:PCIe模式识别不到MHI
- X105支持PCIe Gen3 x2直连,速度比USB更快,但需要模组固件配置为PCIe模式:
AT+QPCIECFG="pcie_en",1 // 使能PCIe AT+QPOWD=1 // 重启 - 主机侧需要加载
mhi_pci_generic驱动,lspci应看到Qualcomm device。
七、驱动移植Checklist(交付前必查)
最后总结一个交付前的检查清单,笔者就是因为漏了#4项导致客户验收卡了一周:
- lsusb能看到05c6:9078设备
- /dev/下有ttyUSB0~ttyUSB4共5个串口
- ttyUSB1发AT能返回OK(波特率115200)
- AT+CPIN?返回READY(SIM卡识别正常)
- 有wwan0和mhi0_net0两个网络接口
- /dev/cdc-wdm0设备存在(QMI/MBIM控制)
- 大流量传输1小时无断连(
dd if=/dev/zero of=/dev/tcp/$host/$port bs=1M) - 模组休眠唤醒正常(echo mem > /sys/power/state后唤醒,ttyUSB不丢)
- dmesg无连续报错(
dmesg | grep -i error无异常)
八、总结
本文是X105 Linux驱动移植的实战记录,核心踩坑点总结:
- PID变更:新PID 0x9078必须加入option_ids,否则无ttyUSB
- 接口冲突:option必须跳过QMI/MHI/AI接口,否则网络驱动无法绑定
- MHI新驱动:必须启用CONFIG_MHI_BUS系列配置,这是老平台没有的
- USB3信号:10Gbps对走线要求高,飞线不行请强制USB2模式调试
- 硬件流控:AT口默认开RTS/CTS,飞线调试需临时关闭
- MHI≠自动上网:MHI只是数据通道,仍需QMI拨号配置IP
- 耐心等待:X105上电到完整枚举需要15~20秒,期间多次重连是正常的
驱动通了只是第一步,下一篇《高通X105 5G-Advanced模组的多PDN拨号与网络切片配置》将讲解如何配置QMI拨号、多个PDN同时上网、网络切片URSP规则配置等实战内容,包括如何做到"工业控制走URLLC切片、视频走eMBB切片、语音走IMS切片"同时工作。
欢迎在评论区交流驱动移植中遇到的问题,我会一一回复!
