串口类与网络类 Function
1. 串口类:u_serial 公共层
u_serial.c实现 gadget 侧 TTY(/dev/ttyGS<N>),被 f_acm/f_serial/f_obex 复用:
1 | tty写: gs_write() u_serial.c:732 |
CONFIG_U_SERIAL_CONSOLE可把 ttyGS 作为内核 console(本树 Kconfig 提供,defconfig 未开)。
f_acm 与 f_serial 的区别
| f_acm | f_serial | |
|---|---|---|
| 模型 | CDC ACM:控制接口+数据接口,带 line coding/DTR 通知 | 裸 bulk in/out 单接口 |
| Host 驱动 | Windows/Linux 标准 cdc-acm | 需 vendor 驱动或 usbserial generic |
| 用途 | 与 PC 互操作的串口 | 私有协议简单通道 |
f_acm 的 SET_LINE_CODING/SET_CONTROL_LINE_STATE 由其 setup 处理并通过 notify 中断端点上报状态变化;波特率对虚拟串口无实际速率意义,仅透传给应用。
2. 网络类:u_ether 公共层
u_ether.c实现 gadget 侧网卡(默认usb0),被 ECM/NCM/RNDIS/EEM/subset 复用:
1 | 发送: eth_start_xmit() u_ether.c:475 |
qmult模块参数控制高速下请求队列深度,影响吞吐。
协议选择
| Function | 协议 | Host 兼容性 |
|---|---|---|
f_ecm |
CDC ECM | Linux/macOS 原生;Windows 需驱动 |
f_ncm |
CDC NCM,多帧聚合 | 现代三平台较好,吞吐最优 |
f_rndis |
Microsoft RNDIS | 老 Windows 原生;rndis.c实现控制消息状态机 |
f_eem |
CDC EEM | 简单,少用 |
f_subset |
ECM 子集 | 极简硬件 |
RNDIS 控制通道走 class request + notify 端点,rndis.c维护 OID 查询/设置;与 Windows 互操作常需 os_desc(见 ConfigFS 章)。NCM 的 NTB 参数(聚合大小/对齐)影响吞吐与内存占用。
3. 组合与命名
网络 function 的 configfs 属性含dev_addr/host_addr(两端 MAC)、ifname。同一 gadget 可同时含 acm+ncm 等;接口顺序由 symlink 创建顺序决定,影响 Windows 枚举行为。
4. RK3588 场景
Rockchip defconfig 启用 ACM 与 F_FS,网络 function 未默认启用(USB_CONFIGFS_NCM/ECM/RNDIS未设),需要 USB 网络共享时要在产品配置补齐相应CONFIG_USB_CONFIGFS_*。DWC3 SuperSpeed 下 NCM 单流可到数 Gbps 量级,瓶颈转向 CPU 软中断与内存拷贝。
5. 排障
| 现象 | 检查 |
|---|---|
/dev/ttyGS0不出现 |
function 是否 bind、gserial_alloc_line 日志 |
| 打开 ttyGS 阻塞 | 对端未配置(未 SET_CONFIGURATION 前 open 会等) |
| usb0 有设备无流量 | carrier 状态、Host 侧驱动、unwrap 错误统计 |
| Windows 不识别 RNDIS | os_desc、接口顺序、驱动签名策略 |
| 网络吞吐低 | 协商速度、qmult、NCM 聚合参数、CPU 占用 |
正在加载留言…