Fork me on GitHub

urb中几个函数的使用

usb_buffer_alloc(free)

说是为了更好的从名字看出这个函数真实做的事情:DMA coherency linux提供两种方式,来保证使用dma时,内存和硬件cache的一致性:

usb_buffer_alloc() is renamed to usb_alloc_coherent()  usb_buffer_free()  is renamed to usb_free_coherent()

usb_alloc(free)_coherent

usb_alloc_coherent(ch341_dev->usb_dev, out_len, GFP_KERNEL, &urb->transfer_dma);

作用:申请usb缓冲区,并保持内存和硬件cache一致性

usb_fill_int_urb

urb 参数指向要被初始化的urb 的指针;dev 指向这个urb 要被发送到的USB 设备;pipe 是这个urb 要被发送到的USB 设备的特定端点;transfer_buffer 是指向发送数据或接收数据的缓冲区的指针,和urb 一样,它也不能是静态缓冲区,必须使用kmalloc()来分配;buffer_length 是transfer_buffer 指针所指向缓冲区的大小;complete 指针指向当这个 urb 完成时被调用的完成处理函数;context 是完成处理函数的“上下文”;interval 是这个urb 应当被调度的间隔。

usb_anchor_urb 是 Linux 内核 USB 子系统中的一个函数,用于将一个 USB 请求块(URB, USB Request Block)添加到一个 USB 锚(USB anchor)中。USB 锚实际上是一个用于跟踪和管理多个 URB 的结构体(usb_anchor),它提供了一种机制,可以方便地对多个 URB 进行管理,例如批量取消、等待所有 URB 完成等操作。

usb_anchor_urb

usb_anchor_urb 的主要作用包括:

  1. 批量管理:当一个 USB 设备需要提交多个 URB 时,使用 usb_anchor_urb 可以将这些 URB 归属于同一个锚,便于统一管理。

  2. 同步处理:通过 usb_anchor,可以方便地等待所有已经提交的 URB 完成,适用于需要同步等待的场景。

  3. 取消操作:在某些情况下,需要取消已经提交的 URB,使用 usb_kill_anchored_urbs 可以一并取消锚中的所有 URB,这在处理 USB 错误或设备断开时非常有用。

总的来说,usb_anchor_urb 提供了一种便捷的机制来批量管理和控制多个 URB,简化了复杂 USB 传输场景中的代码实现。

posted @ 2024-08-28 10:50  yooooooo  阅读(25)  评论(0编辑  收藏  举报