libusb简要记录

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的移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大致意思: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 开始找线索,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值