USB体系的各个模块之间使用USB请求块(urb)进行信息传递。urb结构如下:
创建一个urb使用下面的函数:
struct urb*usb_alloc_urb(int iso_packets,gfp_t mem_flags);
iso_packets代表等时数据包的数量,如果不创建等时urb则该值为0。mem_flags为创建标志。释放一个urb使用下面的函数:
void usb_free_urb(struct urb*urb);
usb_submit_urb用来提交USB请求块:
int usb_submit_urb(struct urb*urb,gfp_t mem_flags);
usb_submit_urb是个异步调用,它会立即返回,提交的urb被放入处理队列,处理完毕会调用struct urb->complete函数,complete函数的定义如下:
typedef void(*usb_complete_t)(struct urb*);
要取消提交的请求,可以用usb_unlink_urb函数或usb_kill_urb函数。(www.xing528.com)
int usb_unlink_urb(struct urb*urb);//不等待成功就返回
void usb_kill_urb(struct urb*urb);//等待取消成功
USB支持四种基本的数据传输模式:控制传输、同步传输、中断传输、批量传输。控制传输方式支持双向传输,用来处理主端口到USB从端口的数据传输,包括设备控制指令、设备状态查询及确认命令。对于高速设备,允许数据包最大容量为8,16,32或64B,对于低速设备只有8B一种选择。同步传输是一种周期的、连续的单向传输方式,通常用于与时间有密切关系的信息的传输。同步传输每次传输的最大有效负荷可为1024B。中断传输用于非周期的、自然发生的、数据量很小的信息的传输,主要用在键盘、鼠标及操纵杆等设备上。批量传输方式也是一种单向传输,用于大量的、对时间没有要求的数据传输。
usb_fill_int_urb用来填充中断传输模式的urb:
usb_fill_control_urb用来填充控制传输模式的urb:
usb_fill_bulk_urb用来填充批量传输模式的urb:
Linux内核没有提供专门的函数用来填充同步模式的urb,同步模式的urb需要设置URB_ISO_ASAP标志:
下面几个USB数据发送函数为同步型函数,用于创建一个urb,并将其发送出去,等待处理结束。这些函数均不能用于中断上下文。从函数名称不难看出其数据传输模式。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。