大致意思: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 开始找线索,因为这个是libusb 定义的I/O control code,kernel 里相对应的是USBDEVFS_SUBMITURB I/O control code,负责处理这个I/O control code 的是proc_submiturb(ps,

libusb是一个允许应用程序直接通过usbfs与设备交互的库,主要实现于devio.c、inode.c和devices.c。在libusb-0.1.12中,usb_urb_transfer()提供了同步和异步传输方式。异步传输虽然未直接提供API,但通过IOCTL_USB_SUBMITURB进行。libusb使用select()和IOCTL_USB_REAPURBNDELAY来处理超时和 urb完成。内核部分,USBDEVFS_SUBMITURB由proc_submiturb()处理, urb的流程包括拷贝urb到内核空间、初始化async数据结构、提交urb给主机控制器,最后由async_complete()完成 urb的移动。
最低0.47元/天 解锁文章
2369

被折叠的 条评论
为什么被折叠?



