URB、端点、DMA 与传输生命周期

URB、端点、DMA 与传输生命周期

1. URB

struct urb描述一次异步Host传输:

  • device/endpoint pipe;
  • transfer buffer/length;
  • setup packet;
  • DMA address;
  • interval;
  • ISO packet descriptors;
  • complete callback/context;
  • status/actual_length;
  • flags。

2. 提交

1
2
3
4
5
6
7
usb_submit_urb
-> 参数/设备/endpoint检查
-> PM和带宽约束
-> usb_hcd_submit_urb
-> map_urb_for_dma
-> hc_driver->urb_enqueue
-> controller ring/queue

成功后URB归USB Core/HCD异步持有,buffer在complete前不得释放或修改。

3. 完成

1
2
3
4
5
hardware IRQ
-> HCD harvest completion
-> usb_hcd_giveback_urb
-> unmap DMA
-> urb->complete

Callback可能在atomic语义下,不能睡眠;驱动通常从callback重新提交RX URB。

4. 取消

  • usb_unlink_urb():异步请求取消;
  • usb_kill_urb():同步等待callback结束;
  • usb_poison_urb():阻止再次submit直到unpoison。

Disconnect/remove通常使用kill/poison。

5. Anchor

usb_anchor_urb()把多个URB归组:

  • suspend时kill anchored;
  • disconnect统一清理;
    -等待anchor为空;
    -避免漏掉并发提交。

6. DMA

Core依据HCD DMA mask映射buffer。可使用:

-普通kmalloc buffer;
-usb_alloc_coherent()
-scatter-gather;
-预映射DMA配合URB flags。

栈内存、vmalloc和生命周期不足的buffer不能直接用于一般DMA URB。

7. Transfer类型

  • Control:setup/data/status;
  • Bulk:可靠、无周期保证;
  • Interrupt:周期轮询;
  • Isochronous:预留带宽,无重传,每packet独立status。

8. 错误

常见status:

  • -EPIPE stall,可clear halt;
  • -EPROTO/-EILSEQ链路/协议;
  • -ETIMEDOUT
  • -ESHUTDOWN/-ENODEV拔出;
  • -ENOENT/-ECONNRESET取消;
  • -EOVERFLOW设备超长。

9. 同步API

usb_control_msg()usb_bulk_msg()内部仍基于URB并等待completion。不可从不能睡眠的上下文调用。

文章互动

阅读 --

留言

0 条留言

正在加载留言…