如何修改USB自定义HID,避免传输Out Pipe时同一帧请求In Pipe?
USB自定义HID帧内In/Out Pipe冲突解决方法
一、修改端点描述符调整轮询间隔
主机每隔1ms触发In Pipe请求,是因为In端点描述符中的bInterval字段被设为1(对应1ms周期)。要减少同一帧内同时触发的概率,可调整该字段:
- 找到设备端点描述符中对应In端点的配置,将
bInterval值从1改为更大的数值(比如2对应2ms,4对应4ms),降低主机轮询In Pipe的频率。 - 注意:该方法无法完全避免偶发的同帧触发,但能大幅降低冲突概率,且无需修改固件逻辑。
二、固件层面动态控制In Pipe响应
如果需要彻底避免同帧触发,可在固件中做如下处理:
- 当检测到Out Pipe传输完成时,临时对后续的In Pipe请求返回
NAK响应,直到当前帧结束后再恢复正常响应。 - 部分USB控制器支持动态修改端点的
bInterval参数,可在收到Out数据时临时调大In端点的轮询间隔,处理完Out事务后再恢复原配置。
三、改用事件驱动的In传输模式
将In Pipe从周期性主动上报改为事件触发上报:
- 固件仅在设备有数据需要发送时,才响应主机的In Pipe请求;无数据时始终返回
NAK。 - 这种模式下,即使主机在Out传输的帧内发起In请求,设备也不会返回数据,不会占用额外带宽,间接达到减少同帧处理压力的效果。
内容的提问来源于stack exchange,提问作者노종흔
相关产品推荐
相关产品推荐

