欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Linux URB总结

程序员文章站 2022-06-16 18:41:34
URB典型生命周期:(异步)被一个USB设备驱动创建;(创建URB)初始化、设定特定USB设备的特定端点;(填充URB)USB设备驱动将URB提交给USB core;(提交URB)被USB core提交到指定的USB HCD;USB HCD处理,进行USB设备的数据传输;当URB完成,USB HCD通知USBD;(URB结果)创建URB填充URB提交URB处理URB创建URB创建URB结构体:struct urb *usb_alloc_urb(int iso_packets...

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);

Linux URB总结

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