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
的主要作用包括:
-
批量管理:当一个 USB 设备需要提交多个 URB 时,使用
usb_anchor_urb
可以将这些 URB 归属于同一个锚,便于统一管理。 -
同步处理:通过
usb_anchor
,可以方便地等待所有已经提交的 URB 完成,适用于需要同步等待的场景。 -
取消操作:在某些情况下,需要取消已经提交的 URB,使用
usb_kill_anchored_urbs
可以一并取消锚中的所有 URB,这在处理 USB 错误或设备断开时非常有用。
总的来说,usb_anchor_urb
提供了一种便捷的机制来批量管理和控制多个 URB,简化了复杂 USB 传输场景中的代码实现。