大致意思:libusb是kernel借助usbfs对usb的支持,主要是让application可直接透过usbfs对device发出usb transfer,实做于devio .c, inode.c, and devices.c 等三个kernel sources.
in libusb-0.1.12:
: :
usb_urb_transfer()
usb_urb_transfer() 大致上,仅仅提供了synchronous 的传送方式(就是呼叫之后就等待它完成)。还有asynchronous 的方式(就是呼叫后就离开,将来urb 收/送完成后,系统会呼叫complete function)。
注意:这是libusb-0.1.12 并没有提供asynchronous 的函数,但是kernel 的IOCTL_USB_SUBMITURB 工作方式却都是asynchronous 的动作,等下追踪kernel 的部份时就会知道。
usb_urb_transfer() 用IOCTL_USB_SUBMITURB 送出urb 之后,一直重复使用IOCTL_USB_REAPURBNDELAY 来收取completed urb ,并且把使用者传入的timeout 切成1ms 的单位用select() 来等待。结果有几种:
1. select() 等到了I/O 动作,REAPURB 得到了某个completed urb ,返回值是所收送的data 长度。
2. select() 等不到I/O 动作,重复1ms 的select()等待,一直到timeout 了,返回值是-ETIMEDOUT
继续往kernel 的devio.c 追踪. 首先从IOCTL_USB_SUBMITURB 开始找线索,