usbredir-0.7内容详解(三)

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_receiving
usb_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_receiving
usb_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>

*/
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值