当前位置:首页>Linux>【项目实战】:Linux下USB 转以太网和U盘存储功能调试问题及解决方案

【项目实战】:Linux下USB 转以太网和U盘存储功能调试问题及解决方案

  • 2026-10-11 07:30:58
【项目实战】:Linux下USB 转以太网和U盘存储功能调试问题及解决方案
Hello,大家好,我是程序媛MM。

本文约2000字,今天继续调试新硬件的USB外设,要实现的需求是USB转以太网和U盘存储功能。本文整理了调试USB转以太网和U盘存储功能中遇到的问题和解决方法。

关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。


一 调试背景

本次基于 AXERA 嵌入式 Linux 4.19 平台调试 USB 转以太网 和U盘存储功能,使用硬件为 ASIX AX88772C USB2.0 百兆网卡(USB转以太网转接线)。

调试过程遇到典型嵌入式 USB 疑难问题:

  • DWC3 模块加载符号报错
[   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
  • USB Host 启动失败、设备无法枚举
[   44.238531] dwc3: 8000000.dwc3:dr_mode is 3 (1-host 2-device 3-otg)
  • USB 设备识别成功,但无网卡设备生成
# 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)
  • 混淆 AX88179 与 AX88772 驱动导致网口不生成
usb 1-1: New USB device found, idVendor=0b95, idProduct=772b, Product: AX88772C
  • 板载 ETH0 资源冲突导致 USB 网络异常
#板载eth0是给有线网口使用,硬件上没有装有线网口,导致eth0能看到,但是ping不通

最终完成 U 盘存储 + USB 转网口 双功能稳定运行,USB 网卡正常识别为 eth0。

二 核心原理:AXERA USB 体系工作流程

1. AXERA USB 架构分层

AXERA DWC3 USB 分为平台适配层 + 通用控制器层 + 协议设备层,加载顺序严格不可逆:

  • dwc3-axera.ko:AXERA 原厂平台适配,提供专属底层初始化符号
  • dwc3.ko:Linux 标准 DWC3 控制器驱动,依赖平台层符号
  • xhci-hcd:USB3.0 主机协议栈,负责设备枚举
  • usbcore:USB 子系统核心
  • usbnet:USB 网络通用框架(所有 USB 网卡必须依赖)
  • asix.ko:AX88772 系列专用网卡驱动

2. USB 网卡工作完整链路

USB Host 初始化 → 检测外接 USB 设备 → 匹配 VID/PID → 加载 usbnet 框架 → 加载对应芯片驱动 → 内核注册 netdev → 生成 eth 网口

3. 关键区分(本次最大踩坑点)

我混淆两款 ASIX 网卡驱动,导致设备识别成功、无网口(当然我也需要支持ax88179千兆的USB转接线,所以保留ax88179_178a.ko驱动加载):

驱动文件
适用芯片
速率
ax88179_178a.ko
AX88179 / AX88178A
千兆
asix.ko
AX88772A/B/C
百兆

✅ 本次硬件 VID/PID:0b95:772b → 必须使用 asix.ko

三 全流程问题复盘与根因分析

问题1:dwc3.ko 加载报 unknown symbol axera_usb_global_init

现象:单独加载 dwc3 内核模块,报平台符号未定义,模块加载失败。

根因:

  • AXERA 平台特殊性:通用 dwc3 驱动依赖原厂平台适配层符号
  • 加载顺序颠倒:先加载 dwc3,后加载 dwc3-axera

解决方案(固定顺序)

insmod dwc3-axera.koinsmod dwc3.ko

问题2:USB 模块依赖缺失,SCSI 符号报错

现象:usb-storage.ko模块加载大量 SCSI host 符号未定义。

根因:USB 存储协议基于 SCSI 子系统,内核未开启 SCSI 核心、未加载 scsi 依赖模块。

解决方案:开启内核 SCSI 配置,启动脚本顺序加载:

scsi_mod → sd_mod → usb-storage

问题3:USB 驱动全部加载,lsusb 仅显示根集线器,不识别外设

现象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";};

问题4:屏蔽板载 eth0 后,USB 网卡彻底不生成网口(核心疑难坑)

现象

  • 未屏蔽板载 eth0 时,ifconfig查看有eth0,误以为是USB转网口成功,但实际Ping不通
  • DTS 屏蔽板载 eth0 后,USB 设备能枚举,但无 eth0 网口

根因

  • 屏蔽板载网卡后,内核原生自带的兼容驱动失效
  • 脚本加载 ax88179_178a.ko,与我当前插入的USB转接口的网卡 AX88772C 硬件不匹配
  • 缺少 asix.ko 专用驱动,设备匹配成功但无法注册网络设备

最终根治方案

  • 内核开启 CONFIG_USB_NET_ASIX,编译 asix.ko
  • 严格顺序:usbnet.ko → asix.ko

问题5:USB 设备枚举成功,但 ifconfig 无网卡

根因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

五 对应内核必开配置(Linux 4.19.15)

1. USB 主机核心

CONFIG_USB=mCONFIG_USB_SUPPORT=yCONFIG_USB_COMMON=yCONFIG_USB_DWC3=mCONFIG_USB_XHCI_HCD=m

2. SCSI 存储子系统

CONFIG_SCSI=mCONFIG_SCSI_DISK=mCONFIG_USB_STORAGE=m

3. USB 网络核心(本次修复关键)

CONFIG_USB_NET_ASIX=mCONFIG_USB_NET_AX88179_178A=m

4. 网络基础支撑

CONFIG_NETDEVICES=yCONFIG_ETHERNET=yCONFIG_PHYLIB=y

六 高频问题速查手册(调试总结)

现象
根因
解决方法
dwc3
 报 axera_usb_global_init 未定义
模块顺序颠倒
先 dwc3-axera,后 dwc3
USB 驱动正常,不识别外设
未进入 Host 模式
确保 dr_mode=1
能识别 USB 设备,无网口
未加载 usbnet 框架
优先加载 usbnet.ko
AX88772C 枚举成功无网口
驱动加载错误
使用 asix.ko,不用 ax88179,因为使用usb转接口与ax88179不匹配
屏蔽板载 eth0 后 USB 网卡失效
原生兼容驱动丢失 + 驱动不匹配
编译 asix.ko 并手动加载
U 盘加载报 SCSI 符号错误
缺少 SCSI 核心模块
加载 scsi_mod、sd_mod

七 最终稳定状态

  • ✅ DTS 屏蔽板载 eth0,无资源冲突
  • ✅ USB 自动 Host 模式,无需手动切换
  • ✅ U 盘存储功能正常
  • ✅ AX88772C USB 网卡稳定识别为 eth0
  • ✅ 可正常配置 IP、链路协商、ping 通信

八 核心调试总结(最重要三点)

⚠️ AXERA DWC3 驱动顺序绝对不能乱:平台层在前,通用层在后

⚠️ 百兆 AX88772 系列 ≠ 千兆 AX88179 系列,驱动不可混用

⚠️ USB 网卡生效三要素:Host 模式 + usbnet 框架 + 对应型号专属驱动


📌 本次调试完整记录,供嵌入式工程师参考。欢迎收藏、转发、讨论。

往期文章(欢迎订阅技术分享栏目全部文章):


【从零开始撸内核驱动源码】:以ttyserial(串口驱动)为例,串联字符设备驱动基础知识点的学习计划
Linux内核源码顶层 Makefile分析并单独编译调试内核自带的驱动
【从零开始撸内核驱动源码】:ttynull驱动
Linux内核驱动安装失败问题调试及解决方法
Linux内核驱动源码走读之编译内核及外部驱动实操指南

“谢谢你看到这里”

这里是女程序员的笔记本

 15年+嵌入式软件工程师兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

最新文章

随机文章