usbredir-0.7内容详解(三)
2016-11-08 16:58
274 查看
usbredir-0.7内容详解(三)
这一小结主要将iso,interrupt,bulk的数据包的控制包
usb_redir_start_iso_stream
usb_redir_header.type: usb_redir_start_iso_stream usb_redir_header.length: sizeof(usb_redir_start_iso_stream_header) struct usb_redir_start_iso_stream_header { uint8_t endpoint;//端点 uint8_t pkts_per_urb;//每个urb含有的包数目 uint8_t no_urbs;//urb个数 } /* usb-guest发送这个包开始接收指定的端点的iso流。 这个函数分配额no_urbs 个urb,每个urb包含 pkts_per_urb个包/帧,对于iso输入端点这些urb将会里被被提交到设备,对于iso输出端点usb-host将会等待直到它已经接收到 (pkts_per_urb * no_urbs / 2)个包去填充到它的缓冲里面,在提接地一个urb之前 */
usb_redir_stop_iso_stream
usb_redir_header.type: usb_redir_stop_iso_stream usb_redir_header.length: sizeof(struct usb_redir_start_iso_stream_header) struct usb_redir_stop_iso_stream_header { uint8_t endpoint;//端点 } /* usb-guest发送这个包去停止指定端点上的iso流。这个将会取消待定的urb,冲刷掉usb-host的buffer并且释放所有的相关的资源。 注意在发送完这个包后,usb-guest仍然可以可以接收来自一个端点内部isoc的isoc数据包,因为一些数据包已经存在在传输管道内了。 */
usb_redir_iso_stream_status
usb_redir_header.type: usb_redir_iso_stream_status usb_redir_header.length: sizeof(usb_redir_iso_stream_status_header) struct usb_redir_iso_stream_status_header { uint8_t status;//状态 uint8_t endpoint;//端点 } /* usb-host发送这个包去回应usb-guest发送的一个usb_redir_start_iso_stream 或者 usb_redir_stop_iso_stream 包。注意对于一个输出iso流开始的成功状态,仅仅是指所有的buffer被成功分配,直到充足的包被缓冲实际的流才会被开始。 注意在iso'输出流中含有一个错误的情况下,usb-host也会要求发送这个包,查看usb_redir_iso_packet。 如果流被恶意停止允许usb-guest侦测状态,而流是被除usb_redir_stop_iso_stream以外的任何原因所停止的,usb-host将会一直报告usb_redir_stall状态 */
usb_redir_start_interrupt_receiving
usb_redir_header.type: usb_redir_start_interrupt_receiving usb_redir_header.length: sizeof(usb_redir_start_interrupt_receiving_header) struct usb_redir_start_interrupt_receiving_header { uint8_t endpoint; } /* usb-guest发送这个包开始接收指定的端点的中断。这个功能仅仅是为了“Input” 中断端点,输入中断端点需要按时间依次轮巡,否则可能会丢失数据,因此对于输入中断端点usb-host对提交和重新提交的urb需要留意。 当usb-host接收到这个包后,usb-host将会开始一个中断传输到这个端点,使用的是来自描述符的interval(间隔)和maxPacketSize。当这个传输完成时,usb-host将会发送一个usb_redir_interrupt_packet到usb-guest,并重新提交这个urb。 */
usb_redir_stop_interrupt_receiving
usb_redir_header.type: usb_redir_stop_interrupt_receiving usb_redir_header.length: sizeof(struct usb_redir_start_interrupt_receiving_header) struct usb_redir_stop_interrupt_receiving_header { uint8_t endpoint; } /* usb-guest可以发送这个包停止指定端点上的中断接收,这将取消正在待定填充的urb。usb-guest在发送这个包后仍然可以接收一些usb_redir_interrupt_packet包,因为一些数据包可能已经存在在传输管道内部了。 */
usb_redir_interrupt_receiving_status
usb_redir_header.type: usb_redir_interrupt_receiving_status usb_redir_header.length: sizeof(usb_redir_interrupt_receiving_status_header) struct usb_redir_interrupt_receiving_status_header { uint8_t status; uint8_t endpoint; } /* usb-host发送这个包去回应usb-guest发送的usb_redir_start_interrupt_receiving或者usb_redir_stop_interrupt_receiving包 注意当在重新提交一个中断urb发生错误时也会要求usb-host发送这个状态包。 如果流被恶意停止允许usb-guest侦测状态,而流是被除usb_redir_stop_interrupt_receiving以外的任何原因所停止的,usb-host将会一直报告usb_redir_stall状态 */
usb_redir_alloc_bulk_streams
usb_redir_header.type: usb_redir_alloc_bulk_streams usb_redir_header.length: sizeof(usb_redir_alloc_bulk_streams_header) struct usb_redir_alloc_bulk_streams_header { uint32_t endpoints; /* bitmask indicating on which eps to alloc streams */ uint32_t no_streams; } /* usb-guest发送这个包要求usb-host分配ID,使得usb-guest可以在端点位掩码所指定的这些端点上可以最多使用no_streams个流ID。 位掩码所指定的端点是位号码(0-32),这与 在usb_redir_ep_info_header所使用的号码相同。 */
usb_redir_free_bulk_streams
usb_redir_header.type: usb_redir_free_bulk_streams usb_redir_header.length: sizeof(usb_redir_free_bulk_streams_header)
struct usb_redir_free_bulk_streams_header { uint32_t endpoints; /* bitmask indicating on which eps to free streams *///需要释放流的端点位掩码 }
/*这个包是usb-guest发向usb-host,用来清除位掩码指定的端点之前开辟的bulk流空间*/
usb_redir_bulk_streams_status
usb_redir_header.type: usb_redir_bulk_streams_status usb_redir_header.length: sizeof(usb_redir_bulk_streams_status_header) struct usb_redir_bulk_streams_status_header { uint32_t endpoints; /* bitmask indicating eps this status message is for *///指定端点的位掩码 uint32_t no_streams; uint8_t status; } /* 这个包是usb-host发送回usb-guest的用于回应usb_redir_alloc_bulk_streams 或者 usb_redir_free_bulk_streams 包。 对于包usb_redir_alloc_bulk_streams 回应的no_streams,将会对应no_streams个usb_redir_alloc_bulk_streams包被通过。usb-host是不被允许返回少于要求的streams。
对于usb_redir_free_bulk_streams 包所回应的no_streams为0。 在回应usb_redir_alloc_bulk_streams 成功后,usb-guest可能设置stream的id为1通过no_streams。 */
usb_redir_start_bulk_receiving
usb_redir_header.type: usb_redir_start_bulk_receivingusb_redir_header.length: sizeof(usb_redir_start_bulk_receiving_header)
struct usb_redir_start_bulk_receiving_header {
uint32_t stream_id;
uint32_t bytes_per_transfer;
uint8_t endpoint;
uint8_t no_transfers;
}
/*
usb-guest 发送这个包启动从bulk端点读取缓存。
在usb-host在接收到这个包后将会提交<span style="font-family: Arial, Helvetica, sans-serif;">no_transfers个bulk(每一个transfer中含有</span><span style="font-family: Arial, Helvetica, sans-serif;">bytes_per_transfer位),到usb-device指定的端点。</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>在一个transfer完成时,usb-host将会发送一个含有接收到数据的<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_buffered_bulk_packet 包,并且立即重新提交完成的transfer。</span>
注意<span style="font-family: Arial, Helvetica, sans-serif;">bytes_per_transfer 一定为端点</span><span style="font-family: Arial, Helvetica, sans-serif;">max_packet_size的倍数。</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>注意这个包仅仅在usb-host含有<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_cap_bulk_receiving 能力时才会被发送。</span>
*/
usb_redir_stop_bulk_receiving
usb_redir_header.type: usb_redir_stop_bulk_receivingusb_redir_header.length: sizeof(usb_redir_stop_bulk_receiving_header)
struct usb_redir_stop_bulk_receiving_header {
uint32_t stream_id;
uint8_t endpoint;
}
/*
usb-guest发送这个包停止指定端点的bulk接收。这将会取消所有正在挂起等待的transfers。
注意usb-guest任然会接收<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_bulk_packet在发送了这个包后,因为一些数据可能已经存在在传输的管道内部。</span>
<pre name="code" class="cpp">注意这个包仅仅在usb-host含有<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_cap_bulk_receiving 能力时才会被发送。</span>*/
usb_redir_bulk_receiving_status
usb_redir_header.type: usb_redir_bulk_receiving_status usb_redir_header.length: sizeof(usb_redir_bulk_receiving_status_header) struct usb_redir_bulk_receiving_status_header { uint32_t stream_id; uint8_t endpoint; uint8_t status; } /* 这包是usb-host发送回应<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_start_bulk_receiving 或者 usb_redir_stop_bulk_receiving 包。</span> 注意在重新提交bulk transfer出现错误时,这个包也会被usb-hos发送。 允许usb-guest检测是否stream被不利停止,usb-host将汇聚i一直报告<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_stall 状态如果stream被其他原因停止(除非是</span><span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_stop_interrupt_receiving造成的停止</span><span style="font-family: Arial, Helvetica, sans-serif;">)</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><pre name="code" class="cpp">注意这个包仅仅在usb-guest含有<span style="font-family: Arial, Helvetica, sans-serif;">usb_redir_cap_bulk_receiving 能力时才会被发送。</span>
*/
相关文章推荐
- usbredir-0.7内容详解(二)
- usbredir-0.7内容详解(二)
- USB检测过程及lsusb内容详解(转)
- usbredir-0.7内容详解(一)
- 在Java应用程序中访问USB设备详解-Java基础-Java-编程开发
- MANIFEST.MF 文件内容详解
- Delphi 中的 XMLDocument 类详解(1) - 等待研究的内容
- 机票票面各项内容详解
- MANIFEST.MF 文件内容详解
- nutch 0.7 plug-ins 详解
- USB系列之三:从你的U盘里读出更多的内容
- Spring发布包内容详解
- MANIFEST.MF 文件内容详解
- VC读取写入 ini文件内容的方法函数详解
- HTMLParser使用详解(3)- 通过Filter访问内容
- 12.6 显示频道内容功能 (征服ASP.NET 2.0 Ajax——Web开发技术详解)
- Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
- C#内容分页简单实现代码及详解
- JAR包中MANIFEST.MF 文件内容详解
- HTMLParser使用详解(2)- Node内容