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 | usb_submit_urb |
成功后URB归USB Core/HCD异步持有,buffer在complete前不得释放或修改。
3. 完成
1 | hardware IRQ |
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:
-EPIPEstall,可clear halt;-EPROTO/-EILSEQ链路/协议;-ETIMEDOUT;-ESHUTDOWN/-ENODEV拔出;-ENOENT/-ECONNRESET取消;-EOVERFLOW设备超长。
9. 同步API
usb_control_msg()、usb_bulk_msg()内部仍基于URB并等待completion。不可从不能睡眠的上下文调用。
正在加载留言…