高通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的关键架构升级:

特性X62X105对驱动的影响
工艺4nm4nm基带+6nm RF新增RF控制通道
峰值速率4.4Gbps/900Mbps14.8Gbps/4.2Gbps需要PCIe/MHI高速通道
USB接口USB 3.1USB 3.2 Gen2 + MHIMHI协议栈是新坑
PCIe可选PCIe Gen3 x2 标配需要MHI Bus驱动
数据通道QMI/PPP/GobiNetMHI net + qmi_wwanGobiNet彻底废弃
AI处理器第五代AI处理器新增AI通道Interface
VID/PID05c6:90xx05c6:9078/9079/907a老驱动认不出新PID

实战提醒:千万别直接用X62的驱动配置套X105!PID变了,Interface分配也变了,直接用会出现"lsusb能看到但没ttyUSB"的问题。

二、Linux USB复合设备枚举架构

X105枚举为USB复合设备,Interface分配相比老平台有变化,架构图如下:

图2:X105 USB复合设备枚举架构图

X105的USB Interface分配(笔者实测):

Interface号类型驱动设备节点备注
0DIAGoptionttyUSB0诊断口
1ATCoptionttyUSB1AT命令口(主用)
2NMEAoptionttyUSB2GNSS定位数据
3ModemoptionttyUSB3PPP备用
4QMI/MBIMcdc_mbim/qmi_wwanwdm0 + wwan0控制+数据
5MHI Datamhi_netmhi0_net0高速数据口(10Gbps)
6DBGoptionttyUSB4调试日志口(新增)
7AI Channelqcom_ai/dev/qai0AI通道(新增)

踩坑点#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=y

3.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日志分析)

下面是笔者项目中真实的调试流程图,包含每一步的验证命令和常见失败现象:

看不到

能看到

数量不对

无响应

不是

OK

模组上电

等待20秒模组启动

lsusb能看到设备?

检查VBAT供电/USB线/dmesg报错

dmesg看枚举日志

有ttyUSB创建?

检查PID是否加入option_ids

重新加载option驱动或添加new_id

ls /dev/ttyUSB* 确认数量

有4到5个ttyUSB?

检查option_probe白名单/黑名单

microcom打开ttyUSB1

发送AT测试

返回OK?

检查波特率/串口是否被占用/RTS引脚

AT口是ttyUSB1?

逐个试ttyUSB0-4

检查模组固件/复位模组

检查wwan/mhi网卡

ip link有wwan0?

检查MHI/MBIM/QMI驱动是否加载

modprobe mhi_wwan ctrl

驱动移植成功

图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 ttyUSB4

4.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,检查:

  1. SIM卡是否插反
  2. SIM_VDD是否有电(1.8V或3V)
  3. SIM_IO/SIM_CLK波形是否正常
  4. 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驱动移植的实战记录,核心踩坑点总结:

  1. PID变更:新PID 0x9078必须加入option_ids,否则无ttyUSB
  2. 接口冲突:option必须跳过QMI/MHI/AI接口,否则网络驱动无法绑定
  3. MHI新驱动:必须启用CONFIG_MHI_BUS系列配置,这是老平台没有的
  4. USB3信号:10Gbps对走线要求高,飞线不行请强制USB2模式调试
  5. 硬件流控:AT口默认开RTS/CTS,飞线调试需临时关闭
  6. MHI≠自动上网:MHI只是数据通道,仍需QMI拨号配置IP
  7. 耐心等待:X105上电到完整枚举需要15~20秒,期间多次重连是正常的

驱动通了只是第一步,下一篇《高通X105 5G-Advanced模组的多PDN拨号与网络切片配置》将讲解如何配置QMI拨号、多个PDN同时上网、网络切片URSP规则配置等实战内容,包括如何做到"工业控制走URLLC切片、视频走eMBB切片、语音走IMS切片"同时工作。

欢迎在评论区交流驱动移植中遇到的问题,我会一一回复!