URB典型生命周期:(异步)

  1. 被一个USB设备驱动创建;(创建URB)
  2. 初始化、设定特定USB设备的特定端点;(填充URB)
  3. USB设备驱动将URB提交给USB core;(提交URB)
  4. 被USB core提交到指定的USB HCD;
  5. USB HCD处理,进行USB设备的数据传输;
  6. 当URB完成,USB HCD通知USBD;(URB结果)

创建URB

创建URB结构体:
	struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
	void usb_free_urb(struct urb *urb);

parameter

  • iso_packets:同步数据包个数,0表示不创建同步传输;
  • mem_flags:分配内存标志,与kmalloc相同;

成功返回urb结构体指针。
urb必须动态创建。

填充URB

填充URB
	• 中断urb
		void usb_fill_int_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe, void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, int interval);
	• 批量urb
		void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, void *transfer_buffer,int buffer_length, usb_complete_t complete,void *context);
	• 控制urb
		void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, unsigned char *setup_packet,void *transfer_buffer, int buffer_length,usb_complete_t complete, void *context);
	• 同步urb
		特殊处理

parameter

  • urb:初始化的urb指针;
  • dev:需要发送的USB设备;
  • pipe:urb被发送到设备的特定端点;
  • transfer_buff:发送、接收缓冲区指针;(不可静态,kmalloc分配)
  • buffer_length:缓冲区大小;
  • complete:urb完成时的回调函数;
  • context:回调函数‘上下文’;
  • interval:urb调度间隔;
  • setup_packet:发送到端点的设置数据包;

Pipe:
Int : usb_sndintpipe()、usb_rcvintpipt()
Bulk : usb_sndbulkpipe()、usb_rcvbulkpipe()
control:usb_sndctrlpipe() 、usb_rcvictrlpipe()
iso:usb_sndisocpipe()、usb_rcvisocpipe()

提交URB

提交URB
	int usb_submit_urb(struct urb *urb, int mem_flags);

usb_submit_urb()调用成功返回0,否则返回错误号;
调用成功:urb控制权移交到USB core
parameter mem_flags:

  • GFP_ATOMIC:在中断处理函数、底半部、tasklet、定时器处理函数以及urb 完成函数中,在调用者持有自旋锁或者读写锁时以及当驱动将current→state 修改为非 TASK_RUNNING 时,应使用此标志。
  • GFP_NOIO:在存储设备的块I/O 和错误处理路径中,应使用此标志;
  • GFP_KERNEL:如果没有任何理由使用GFP_ATOMIC 和GFP_NOIO,就使用GFP_KERNEL。

处理URB

处理URB
urb处理3种情况,callback调用:

  • URB成功发送到设备;
  • 发生错误;(urb->status记录错误值)
  • URB被USB core 去除连接;(通过usb_unlink_urb() / usb_kill_urb() 取消urb 或 urb已提交,但设备拔出)

处理状态
Urb->status:

  • 0:成功
  • -ENOENT:usb_kill_urb()杀死
  • -ECONNRESET:usb_unlink_urb()杀死
  • -EPROTO:bitstuff 错误 或 硬件未能及时收到响应数据包
  • -ENODEV:表示USB 设备已被拔出
  • -EXDEV:表示等时传输仅完成了一部分

取消urb
int usb_unlink_urb(struct urb *urb);

本文地址:https://blog.csdn.net/Ali_DZT/article/details/107214287