找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

975

积分

0

好友

139

主题
发表于 3 天前 | 查看: 6| 回复: 0

描述符结构解析

CH397A支持三种配置模式:自定义、ECM和NCM。本文聚焦于ECM(以太网控制模型)模式的配置与使用。

ECM设备的描述符拓扑结构如下,其架构与UVC(USB视频类)等设备类似,需要两个接口:一个控制接口和一个数据接口。
ECM描述符拓扑

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

除了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端点进行网络数据的读写。
包过滤请求

请求格式如下:
请求格式

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

枚举与初始化流程

以下是设备枚举的实例抓包数据。整个流程中需要注意三个核心步骤:

  1. 设置对应的配置(Configuration)。
  2. 设置数据接口到对应的备用接口以开启数据流。
  3. 发送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)进行间隔。
  • 初始化顺序:枚举后务必先开启数据流(设置备用接口),再设置包过滤,之后才能正常收发数据。
  • 状态通知:中断端点的通知并非强制处理,主机可根据需要选择是否响应。



上一篇:Python因果推断框架PyCausalSim详解:基于模拟的A/B测试分析与营销归因
下一篇:Spring AOP源码解析:MethodInterceptor与动态代理拦截流程详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 18:06 , Processed in 0.165024 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表