串口类与网络类 Function

串口类与网络类 Function

1. 串口类:u_serial 公共层

u_serial.c实现 gadget 侧 TTY(/dev/ttyGS<N>),被 f_acm/f_serial/f_obex 复用:

1
2
3
4
5
6
7
8
tty写:  gs_write()        u_serial.c:732
-> port写环形buffer
-> gs_start_tx() :229 组request queue到IN端点
USB收: OUT complete -> 数据推入 TTY flip buffer -> ldisc
连接: function set_alt
-> gserial_connect() :1299 绑定gs_port与usb端点, gs_start_io() :538
断开: gserial_disconnect 端点禁用, tty侧hangup语义
行分配: gserial_alloc_line() :1267 / gserial_free_line() :1202

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
2
3
4
5
6
7
发送: eth_start_xmit()     u_ether.c:475
-> skb(经function wrap回调封包) -> IN request queue
-> tx_complete() :441 释放skb补队列
接收: OUT request complete -> rx_complete() u_ether.c:256
-> function unwrap解包 -> netif_rx
注册: gether_register_netdev() :871 (MAC来自configfs属性)
断链: gether_disconnect() :1167 停端点、清队列、carrier off

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 占用

文章互动

阅读 --

留言

0 条留言

正在加载留言…