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_driverrtl8152_driver
module_usb_driversmsc95xx_driver
module_usb_drivercdc_driver
module_usb_driverqmi_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 加载顺序
正确的模块加载顺序至关重要:
bashsudo insmod r8152.ko sudo insmod qmi_wwan.ko sudo insmod cdc_ether.ko sudo insmod smsc95xx.ko注意:如果模块之间有依赖关系,需按依赖顺序加载;本例中各模块相互独立,加载顺序不限。
3.2 验证加载状态
加载完成后,用以下命令验证模块是否成功注册:
bashlsmod | grep -E "r8152|qmi_wwan|cdc_ether|smsc95xx"若输出中列出了对应的模块名及使用计数,说明加载成功。
3.3 检查网络设备
插入对应的 USB 网卡设备后,使用
ifconfig -a或ip link查看新增的网络接口:
bashifconfig -a应能看到类似
eth1、wwan0或enx*的新网络接口出现。对于有线网卡(如 r8152),可用ifconfig eth1 up激活接口;对于 4G 模块(qmi_wwan),还需配合qmi-network等工具拨号上网。
3.4 卸载模块
如需移除驱动,使用
rmmod命令:
bashsudo rmmod r8152 sudo rmmod qmi_wwan sudo rmmod cdc_ether sudo rmmod smsc95xx卸载后,对应的网络接口也会随之消失。
