首页 理论教育 Linux驱动程序开发实例USB请求块urb

Linux驱动程序开发实例USB请求块urb

时间:2023-10-19 理论教育 版权反馈
【摘要】:USB体系的各个模块之间使用USB请求块进行信息传递。释放一个urb使用下面的函数:void usb_free_urb;usb_submit_urb用来提交USB请求块:int usb_submit_urb;usb_submit_urb是个异步调用,它会立即返回,提交的urb被放入处理队列,处理完毕会调用struct urb->complete函数,complete函数的定义如下:typedef void;要取消提交的请求,可以用usb_unlink_urb函数或usb_kill_urb函数。控制传输方式支持双向传输,用来处理主端口到USB从端口的数据传输,包括设备控制指令、设备状态查询及确认命令。同步传输每次传输的最大有效负荷可为1024B。

Linux驱动程序开发实例USB请求块urb

USB体系的各个模块之间使用USB请求块(urb)进行信息传递。urb结构如下:

创建一个urb使用下面的函数:

struct urb*usb_alloc_urb(int iso_packets,gfp_t mem_flags);

iso_packets代表等时数据包的数量,如果不创建等时urb则该值为0。mem_flags为创建标志。释放一个urb使用下面的函数:

void usb_free_urb(struct urb*urb);

usb_submit_urb用来提交USB请求块:

int usb_submit_urb(struct urb*urb,gfp_t mem_flags);

usb_submit_urb是个异步调用,它会立即返回,提交的urb被放入处理队列,处理完毕会调用struct urb->complete函数,complete函数的定义如下:

typedef void(*usb_complete_t)(struct urb*);

要取消提交的请求,可以用usb_unlink_urb函数或usb_kill_urb函数。(www.xing528.com)

int usb_unlink_urb(struct urb*urb);//不等待成功就返回

void usb_kill_urb(struct urb*urb);//等待取消成功

USB支持四种基本的数据传输模式:控制传输、同步传输、中断传输、批量传输。控制传输方式支持双向传输,用来处理主端口到USB从端口的数据传输,包括设备控制指令、设备状态查询及确认命令。对于高速设备,允许数据包最大容量为8,16,32或64B,对于低速设备只有8B一种选择。同步传输是一种周期的、连续的单向传输方式,通常用于与时间有密切关系的信息的传输。同步传输每次传输的最大有效负荷可为1024B。中断传输用于非周期的、自然发生的、数据量很小的信息的传输,主要用在键盘、鼠标及操纵杆等设备上。批量传输方式也是一种单向传输,用于大量的、对时间没有要求的数据传输。

usb_fill_int_urb用来填充中断传输模式的urb:

usb_fill_control_urb用来填充控制传输模式的urb:

usb_fill_bulk_urb用来填充批量传输模式的urb:

Linux内核没有提供专门的函数用来填充同步模式的urb,同步模式的urb需要设置URB_ISO_ASAP标志:

下面几个USB数据发送函数为同步型函数,用于创建一个urb,并将其发送出去,等待处理结束。这些函数均不能用于中断上下文。从函数名称不难看出其数据传输模式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈