对技术执着
分类: LINUX
2013-05-29 18:43:49
URB定义:
usb 请求块(usb request block, urb)是usb设备驱动中用来描述与usb设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是usb主机与设备通信的电波。
URB 处理流程
1, usb设备驱动程序创建并初始化一个访问特定usb设备特定端点的urb,并提交给usb core
2, usb core提交该urb到usb主控制器驱动程序
3, usb主控制器驱动程序根据urb描述的信息,来访问usb设备
4,当设备访问结束后,usb主控制器驱动程序通知usb core(调用这个函数usb_complete_t complete;)然后其再通知usb设备驱动程序
创建URB
struct urb *usb_alloc_urb(int iso_packets, int mem_flags) 参数:iso_packets: urb 所包含的等时数据包的个数,若不是等时传输,则为0.
mem_flags: 内存分配标识(如GFP_KERNEL),参考kmalloc
初始化URB
对于中断urb,使用usb_fill_int_urb函数来初始化:
static inline void usb_fill_int_urb (struct urb *urb,要初始化的urb指针。
struct usb_device *dev,所要访问的设备
unsigned int pipe,要访问的端点所对应的管道,使用usb_sndintpipe()或usb_rcvintpipe()创建
void *transfer_buffer,要传输的数据缓冲区
int buffer_length,缓冲区长度
usb_complete_t complete_fn,当完成该urb所请求的操作时,要调用的回调函数
void *context,complet_fn函数所需的上下文,通常取值为dev
int interval)urb被调度的时间间隔
管道:驱动程序的数据缓冲区与一个端点的连接,它代表了一种在两者之间移动数据的能力
对于批量urb,使用usb_fill_bulk_urb函数来初始化。
对于控制urb,使用usb_fill_control_urb函数来初始化。
等时urb没有像中断,控制和批量urb那样的初始化函数,我们只能手动的初始化urb。
提交URB
在完成urb的创建和初始化后,urb便可以通过usb_submit_urb函数来提交给usb核心:
int usb_submit_urb(struct urb *urb,gfp_t mem_flags)
参数:
urb:指向urb的指针;
mem_flags:内存分配标识,它用于告知usb核心如何分配内存缓冲区。
处理URB:
URB被提交到USB核心后,usb核心指定usb主控制器驱动程序来处理该urb,在3种情况下,urb会被认为处理完成:
1 urb被成功发送给设备,并且设备返回成功确认。如果urb->status为0,意味着对于一个输出urb,数据被成功发送;对于一个输入urb,请求的数据被成功收到。
2如果发送数据到设备或从设备接受数据时发生了错误,urb->status将记录错误值。
3 urb被“取消”,这发生在驱动通过usb_unlink_urb()或usb_kill_urb()函数取消urb,或urb虽已提交,而usb设备被拔出的情况下
当urb处理完成后,urb完成函数将被调用。