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典型生命周期:(异步)
- 被一个USB设备驱动创建;(创建URB)
- 初始化、设定特定USB设备的特定端点;(填充URB)
- USB设备驱动将URB提交给USB core;(提交URB)
- 被USB core提交到指定的USB HCD;
- USB HCD处理,进行USB设备的数据传输;
- 当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