描述符结构解析
CH397A支持三种配置模式:自定义、ECM和NCM。本文聚焦于ECM(以太网控制模型)模式的配置与使用。
ECM设备的描述符拓扑结构如下,其架构与UVC(USB视频类)等设备类似,需要两个接口:一个控制接口和一个数据接口。

数据接口同样需要备用接口(alt接口)用于实际数据传输,开启数据流的方式与UVC一致,即通过设置接口请求切换到对应的备用接口。

除了CDC规格书中定义的通用功能描述符(如Header Functional Descriptor、Union Functional Descriptor、Country Selection Functional Descriptor)外,ECM设备还有一个特有的Ethernet Networking Functional Descriptor。

其中的bmEthernetStatistics字段定义了设备支持的统计信息类型,对应关系如下:


实例解析:
描述符数据:0D 24 0F 03 00 00 00 00 EA 05 00 00 00
- MAC地址存储在字符串描述符3中。
- 最大区段大小为
0x05EA(即1514字节)。
- 不支持统计信息。
- 无多播过滤器和唤醒模式过滤器。
类特定请求
标准USB请求此处不再赘述。由于该设备为多配置,主机需获取所有配置描述符后,再设置目标配置。
对于数据流的开启,其流程与UVC/UAC/CDC一致:将数据接口设置到对应的备用接口即表示打开数据流。
在类特定请求中,SET_ETHERNET_PACKET_FILTER是必需且关键的一步。在开启数据流后,发送此请求即可通过BULK端点进行网络数据的读写。

请求格式如下:

支持的包过滤器位图定义如下:

枚举与初始化流程
以下是设备枚举的实例抓包数据。整个流程中需要注意三个核心步骤:
- 设置对应的配置(Configuration)。
- 设置数据接口到对应的备用接口以开启数据流。
- 发送
0x43类请求(SET_ETHERNET_PACKET_FILTER)设置包过滤。
完成以上步骤后,即可通过数据接口的BULK端点收发原始以太网数据包,进行网络数据传输。

数据传输机制
ECM模式的数据传输非常简洁,直接通过BULK端点透传完整的以太网帧。
数据接口的BULK IN/OUT端点用于直接收发以太网包。需注意:如果以太网帧的长度恰好是BULK端点最大包大小的整数倍,则需要在传输末尾追加一个零长度包(ZLP)来指示数据包的结束。
如下图所示,一次BULK传输即承载一个完整的以太网数据包。

状态通知
控制接口的中断端点可用来向主机发送状态变更通知,但主机并非必须主动轮询此端点。
ECM规格书定义了三种通知,通过中断端点返回给主机,其中0x00(Network Connection)和0x2A(Connection Speed Change)是必须实现的。

以下是0x00和0x2A通知的实例:

通知的具体含义在CDC规格书中定义。
- 0x00 通知(连接状态):仅8字节,其编码格式类似SETUP包(但实质是从中断端点读取的数据),用于指示网络连接状态。

实例数据 A1 00 01 00 00 00 00 00 表示:连接状态变化,涉及接口0。
- 0x2A 通知(速度改变):共16字节。前8字节与上述结构类似,后8字节分别表示下行与上行速率。

实例数据 A1 2A 00 00 01 00 08 00 00 E1 F5 05 00 E1 F5 05 解析得出,上下行速率均为 0x05F5E100,即100 Mbps。
总结
ECM模式结构清晰、操作简洁,直接使用BULK端点透传以太网帧,因此驱动实现相对简单。其描述符拓扑与UVC类似,若有UVC开发经验则更容易理解。
关键注意事项:
- 数据传输:当BULK传输的数据包长度与端点大小对齐时,需使用零长度包(ZLP)进行间隔。
- 初始化顺序:枚举后务必先开启数据流(设置备用接口),再设置包过滤,之后才能正常收发数据。
- 状态通知:中断端点的通知并非强制处理,主机可根据需要选择是否响应。
|