本文约2000字,今天继续调试新硬件的USB外设,要实现的需求是USB转以太网和U盘存储功能。本文整理了调试USB转以太网和U盘存储功能中遇到的问题和解决方法。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
本次基于 AXERA 嵌入式 Linux 4.19 平台调试 USB 转以太网 和U盘存储功能,使用硬件为 ASIX AX88772C USB2.0 百兆网卡(USB转以太网转接线)。
调试过程遇到典型嵌入式 USB 疑难问题:
[ 44.238531] dwc3: Unknown symbol axera_usb_global_init (err -2)Jan 1 08:00:48 kernel: [ 44.238531] dwc3: Unknown symbol axera_usb_global_init (err -2)insmod: can't insert 'dwc3.ko': unknown symbol in[ 44.238531] dwc3: 8000000.dwc3:dr_mode is 3 (1-host 2-device 3-otg)# ifconfiglo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.255.255.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)usb 1-1: New USB device found, idVendor=0b95, idProduct=772b, Product: AX88772C#板载eth0是给有线网口使用,硬件上没有装有线网口,导致eth0能看到,但是ping不通最终完成 U 盘存储 + USB 转网口 双功能稳定运行,USB 网卡正常识别为 eth0。
AXERA DWC3 USB 分为平台适配层 + 通用控制器层 + 协议设备层,加载顺序严格不可逆:
dwc3-axera.ko:AXERA 原厂平台适配,提供专属底层初始化符号dwc3.ko:Linux 标准 DWC3 控制器驱动,依赖平台层符号xhci-hcd:USB3.0 主机协议栈,负责设备枚举usbcore:USB 子系统核心usbnet:USB 网络通用框架(所有 USB 网卡必须依赖)asix.ko:AX88772 系列专用网卡驱动USB Host 初始化 → 检测外接 USB 设备 → 匹配 VID/PID → 加载 usbnet 框架 → 加载对应芯片驱动 → 内核注册 netdev → 生成 eth 网口
我混淆两款 ASIX 网卡驱动,导致设备识别成功、无网口(当然我也需要支持ax88179千兆的USB转接线,所以保留ax88179_178a.ko驱动加载):
ax88179_178a.ko | ||
asix.ko |
✅ 本次硬件 VID/PID:
0b95:772b→ 必须使用asix.ko
dwc3.ko 加载报 unknown symbol axera_usb_global_init现象:单独加载 dwc3 内核模块,报平台符号未定义,模块加载失败。
根因:
dwc3 驱动依赖原厂平台适配层符号dwc3,后加载 dwc3-axera解决方案(固定顺序)
insmod dwc3-axera.koinsmod dwc3.ko现象:usb-storage.ko模块加载大量 SCSI host 符号未定义。
根因:USB 存储协议基于 SCSI 子系统,内核未开启 SCSI 核心、未加载 scsi 依赖模块。
解决方案:开启内核 SCSI 配置,启动脚本顺序加载:
scsi_mod → sd_mod → usb-storagelsusb 仅显示根集线器,不识别外设现象USB 驱动启动日志正常,无设备枚举日志。
根因DWC3 默认 OTG 模式,未强制切换为 Host 主机模式。查看dmesg信息可知:
[ 44.238531] dwc3: 8000000.dwc3:dr_mode is 3 (1-host 2-device 3-otg)解决方案修改dts中usb的模式,使固件默认 Host 模式:
&usb2 { dr_mode = "host"; //extcon = <&extcon_usb>; status = "okay";};eth0 后,USB 网卡彻底不生成网口(核心疑难坑)现象
eth0 时,ifconfig查看有eth0,误以为是USB转网口成功,但实际Ping不通eth0 后,USB 设备能枚举,但无 eth0 网口根因
ax88179_178a.ko,与我当前插入的USB转接口的网卡 AX88772C 硬件不匹配asix.ko 专用驱动,设备匹配成功但无法注册网络设备最终根治方案
CONFIG_USB_NET_ASIX,编译 asix.kousbnet.ko → asix.koifconfig 无网卡根因USB 网卡必须依赖 usbnet 通用网络框架,只加载芯片驱动无法生成网口。
# 外设依赖insmod extcon-core.koinsmod extcon-usb-gpio.ko# USB核心栈insmod usbcore.koinsmod xhci-hcd.koinsmod xhci-plat-hcd.ko# AXERA DWC3 核心(关键顺序不能错)insmod dwc3-axera.koinsmod dwc3.ko# SCSI 存储依赖(U盘必需)insmod scsi_mod.koinsmod sd_mod.koinsmod usb-storage.ko# USB网络核心(网卡必需)insmod usbnet.koinsmod asix.ko insmod ax88179_178a.ko✅ 加载完成后自动生成:
eth0
CONFIG_USB=mCONFIG_USB_SUPPORT=yCONFIG_USB_COMMON=yCONFIG_USB_DWC3=mCONFIG_USB_XHCI_HCD=mCONFIG_SCSI=mCONFIG_SCSI_DISK=mCONFIG_USB_STORAGE=mCONFIG_USB_NET_ASIX=mCONFIG_USB_NET_AX88179_178A=mCONFIG_NETDEVICES=yCONFIG_ETHERNET=yCONFIG_PHYLIB=ydwc3axera_usb_global_init 未定义 | dwc3-axera,后 dwc3 | |
dr_mode=1 | ||
usbnet 框架 | usbnet.ko | |
asix.ko,不用 ax88179,因为使用usb转接口与ax88179不匹配 | ||
eth0 后 USB 网卡失效 | asix.ko 并手动加载 | |
scsi_mod、sd_mod |
eth0,无资源冲突eth0⚠️ AXERA DWC3 驱动顺序绝对不能乱:平台层在前,通用层在后
⚠️ 百兆 AX88772 系列 ≠ 千兆 AX88179 系列,驱动不可混用
⚠️ USB 网卡生效三要素:Host 模式 +
usbnet框架 + 对应型号专属驱动
📌 本次调试完整记录,供嵌入式工程师参考。欢迎收藏、转发、讨论。
往期文章(欢迎订阅技术分享栏目全部文章):

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助