USB请求块(USB request block,URB)是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,与网络设备驱动中的sk_buff结构体类似,是USB主机与设备之间传输数据的封装。
传输过程
一个urb包含了执行usb传输所需要的所有信息。当要进行数据传输时,需要分配一个urb结构体,对其进行初始化,然后将其提交给usb核心。USB核心对urb进行解析,将控制信息提交给主机控制器,由主机控制器负责数据到设备的传输。这时,驱动程序只需等待,当数据回传到主机控制器后,会转发给USB核心,唤醒等待的驱动程序,由驱动程序完成剩下的工作。
更为具体地说,Linux中的设备驱动程序只要为每一次请求准备一个urb结构体,然后把它填充好,就可以调用函数usb_submit_urb()提交给USB核心。然后USB核心将urb传递给USB主机控制器,最终传递给USB设备。USB设备获得urb结构体后,会解析这个结构体,并以相反的路线将数据返回给Linux内核。
USB支持4种基本的数据传输模式:控制传输、同步传输、中断传输、批量传输。控制传输方式支持双向传输,用来处理主端口到USB从端口的数据传输,包括设备控制指令、设备状态查询及确认命令。对于高速设备,允许数据包最大容量为8,16,32或64字节,对于低速设备只有8字节一种选择。同步传输是一种周期的、连续的单向传输方式,通常用于与时间有密切关系的信息的传输。同步传输每次传输的最大有效负荷为1024字节。中断传输用于非周期的、自然发生的、数据量很小的信息的传输,主要用在键盘、鼠标及操纵杆等设备上。批量传输方式也是一种单向传输,用于大量的、对时间没有要求的数据传输。 [3]