这节分析urb的收发流程。
我们首先知道对于usb device 来讲,读写数据用到的是usb_request。而对于usb host来讲,读写数据用到的是urb,有些类似于网络中skbuff。
无论是进行 读还是写 用到的函数都是 usb_submit_urb。在urb结构体中有一个回调函数指针complete。(usb_request中也有一个回调函数指针)这样,对于一个写请求,complete函数表示写请求结束。对于读请求,complete函数表示要读的数据已经读到,通常在complete函数中进行处理。 因此,无论读写都可以通过usb_submit_urb来实现。既然有回调函数,那么usb_submit_urb就是异步的。
下面,我们来看usb_submit_urb的实现。usb_submit_urb 最终会调用usb_hcd_submit_urb。
int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
{
int status;
struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);
usb_get_urb(urb);
atomic_inc(&urb->use_count);
atomic_inc(&urb->dev->urbnum);
usbmon_urb_submit(&hcd->self, urb);
status