7. USB 网络适配器驱动

USB 网络适配器驱动

  • [1. 工程总体定位](#1. 工程总体定位)
  • [2. 驱动整体框架图](#2. 驱动整体框架图)
  • [3. 测试](#3. 测试)
    • [3.1 加载顺序](#3.1 加载顺序)
    • [3.2 验证加载状态](#3.2 验证加载状态)
    • [3.3 检查网络设备](#3.3 检查网络设备)
    • [3.4 卸载模块](#3.4 卸载模块)

1. 工程总体定位

2. 驱动整体框架图

#mermaid-svg-FLoWU47SnVwppgit{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FLoWU47SnVwppgit .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FLoWU47SnVwppgit .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FLoWU47SnVwppgit .error-icon{fill:#552222;}#mermaid-svg-FLoWU47SnVwppgit .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FLoWU47SnVwppgit .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FLoWU47SnVwppgit .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FLoWU47SnVwppgit .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FLoWU47SnVwppgit .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FLoWU47SnVwppgit .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FLoWU47SnVwppgit .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FLoWU47SnVwppgit .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FLoWU47SnVwppgit .marker.cross{stroke:#333333;}#mermaid-svg-FLoWU47SnVwppgit svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FLoWU47SnVwppgit p{margin:0;}#mermaid-svg-FLoWU47SnVwppgit .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FLoWU47SnVwppgit .cluster-label text{fill:#333;}#mermaid-svg-FLoWU47SnVwppgit .cluster-label span{color:#333;}#mermaid-svg-FLoWU47SnVwppgit .cluster-label span p{background-color:transparent;}#mermaid-svg-FLoWU47SnVwppgit .label text,#mermaid-svg-FLoWU47SnVwppgit span{fill:#333;color:#333;}#mermaid-svg-FLoWU47SnVwppgit .node rect,#mermaid-svg-FLoWU47SnVwppgit .node circle,#mermaid-svg-FLoWU47SnVwppgit .node ellipse,#mermaid-svg-FLoWU47SnVwppgit .node polygon,#mermaid-svg-FLoWU47SnVwppgit .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FLoWU47SnVwppgit .rough-node .label text,#mermaid-svg-FLoWU47SnVwppgit .node .label text,#mermaid-svg-FLoWU47SnVwppgit .image-shape .label,#mermaid-svg-FLoWU47SnVwppgit .icon-shape .label{text-anchor:middle;}#mermaid-svg-FLoWU47SnVwppgit .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FLoWU47SnVwppgit .rough-node .label,#mermaid-svg-FLoWU47SnVwppgit .node .label,#mermaid-svg-FLoWU47SnVwppgit .image-shape .label,#mermaid-svg-FLoWU47SnVwppgit .icon-shape .label{text-align:center;}#mermaid-svg-FLoWU47SnVwppgit .node.clickable{cursor:pointer;}#mermaid-svg-FLoWU47SnVwppgit .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FLoWU47SnVwppgit .arrowheadPath{fill:#333333;}#mermaid-svg-FLoWU47SnVwppgit .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FLoWU47SnVwppgit .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FLoWU47SnVwppgit .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FLoWU47SnVwppgit .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FLoWU47SnVwppgit .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FLoWU47SnVwppgit .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FLoWU47SnVwppgit .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FLoWU47SnVwppgit .cluster text{fill:#333;}#mermaid-svg-FLoWU47SnVwppgit .cluster span{color:#333;}#mermaid-svg-FLoWU47SnVwppgit div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FLoWU47SnVwppgit .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FLoWU47SnVwppgit rect.text{fill:none;stroke-width:0;}#mermaid-svg-FLoWU47SnVwppgit .icon-shape,#mermaid-svg-FLoWU47SnVwppgit .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FLoWU47SnVwppgit .icon-shape p,#mermaid-svg-FLoWU47SnVwppgit .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FLoWU47SnVwppgit .icon-shape .label rect,#mermaid-svg-FLoWU47SnVwppgit .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FLoWU47SnVwppgit .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FLoWU47SnVwppgit .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FLoWU47SnVwppgit :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Realtek RTL8152/8153
SMSC/LAN95xx
CDC Ethernet/RNDIS
Qualcomm QMI WWAN
Realtek
SMSC
QMI
CDC
系统启动或 insmod 加载驱动模块
驱动模块
r8152.ko
smsc95xx.ko
cdc_ether.ko
qmi_wwan.ko
module_usb_driver

rtl8152_driver
module_usb_driver

smsc95xx_driver
module_usb_driver

cdc_driver
module_usb_driver

qmi_wwan_driver
usb_register 注册 USB 驱动
USB Core 扫描/枚举 USB 设备
匹配 USB Device ID

或 Interface 信息
rtl8152_probe
usbnet_probe
usbnet_probe
qmi_wwan_probe
检查 Configuration
usb_reset_device
alloc_etherdev 分配 net_device
r8152b_get_version
rtl_ops_init
配置 RTL8152/RTL8153 芯片操作
配置 NAPI、ethtool、MAC、硬件特性
register_netdev
smsc95xx_info.bind
smsc95xx_bind
获取 USB Bulk 端点
分配 smsc95xx_priv
读取/设置 MAC 地址
smsc95xx_reset
读取芯片版本和硬件能力
配置 net_device_ops、ethtool
cdc_info/wwan_info.bind
usbnet_cdc_bind
usbnet_generic_cdc_bind
解析 CDC 描述符
识别 Control/Data Interface
获取 Bulk 和 Interrupt 端点
读取 MAC 地址
配置 CDC 过滤器和网络操作
qmi_wwan_info.bind
qmi_wwan_bind
解析 CDC Union 描述符
绑定 Control/Data Interface
获取 Bulk 和 Status 端点
注册 cdc-wdm 子驱动
配置 QMI 电源管理
修正 MAC 地址和 RX 数据
注册 Linux 网络设备

ethX / usbX / wwanX
网络设备操作
ndo_open
ndo_start_xmit
USB URB 接收
链路状态/中断通知
挂起、恢复、电源管理
ethtool / ioctl / MAC / MTU 配置
usbnet_open 或 rtl8152_open
TX 数据包封装
提交 USB Bulk OUT URB
USB Bulk IN URB 完成
接收数据修正
r8152_poll
smsc95xx_rx_fixup
qmi_wwan_rx_fixup
usbnet_cdc_status
上交 Linux 网络协议栈
更新 carrier/link 状态
USB Runtime PM / Suspend / Resume
USB 拔出或 rmmod
对应驱动卸载路径
rtl8152_disconnect
usbnet_disconnect

调用 smsc95xx_unbind
usbnet_disconnect

调用 usbnet_cdc_unbind
usbnet_disconnect

调用 qmi_wwan_unbind
注销网络设备、释放 URB/内存
注销 cdc-wdm 子驱动
usb_deregister

3. 测试

3.1 加载顺序

正确的模块加载顺序至关重要:

bash 复制代码
sudo insmod r8152.ko
sudo insmod qmi_wwan.ko
sudo insmod cdc_ether.ko
sudo insmod smsc95xx.ko

注意:如果模块之间有依赖关系,需按依赖顺序加载;本例中各模块相互独立,加载顺序不限。

3.2 验证加载状态

加载完成后,用以下命令验证模块是否成功注册:

bash 复制代码
lsmod | grep -E "r8152|qmi_wwan|cdc_ether|smsc95xx"

若输出中列出了对应的模块名及使用计数,说明加载成功。

3.3 检查网络设备

插入对应的 USB 网卡设备后,使用 ifconfig -aip link 查看新增的网络接口:

bash 复制代码
ifconfig -a

应能看到类似 eth1wwan0enx* 的新网络接口出现。对于有线网卡(如 r8152),可用 ifconfig eth1 up 激活接口;对于 4G 模块(qmi_wwan),还需配合 qmi-network 等工具拨号上网。

3.4 卸载模块

如需移除驱动,使用 rmmod 命令:

bash 复制代码
sudo rmmod r8152
sudo rmmod qmi_wwan
sudo rmmod cdc_ether
sudo rmmod smsc95xx

卸载后,对应的网络接口也会随之消失。

相关推荐
rest10241 小时前
使用内存探测bpf
linux
重生之我来学Python1 小时前
Docker套装的简介、安装、超级详细教程
linux·docker·容器·eureka·github
Ruiery2 小时前
Linux 6.6内核 PCIe 深度解析(十):PCIe Port Driver(portdrv)— 一个物理 Port,拆出五个逻辑服务
linux·运维·服务器
码农小韩3 小时前
Linux应用开发(二)——Linux的文件IO
linux·嵌入式软件·嵌入式操作系统·linux应用
Horn Still Sounds4 小时前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
10mAh4 小时前
【Linux】CPU 100% 怎么排查?——top、pidstat、jstack 到线程定位实战
linux·运维·服务器
深念Y4 小时前
开机启动优化记录
linux·开机
Titan20245 小时前
网络基础:传输层协议知识梳理
linux·服务器·网络
一叶龙洲5 小时前
Ubuntu从图标到卸载应用
linux·windows·ubuntu