SourceSink Function
24 Jan 2024
Read time: 2 minute(s)
SourceSink Function
的主要功能是提供了一组 USB 测试 endpoint,其中:
-
Sink
。sinks bulk packets OUT to the peripheral。意思是把数据从 Host 引流到 Device,即OUT
方向。 -
Source
。sources them IN to the host。意思是把从 Device 发送数据到 Device,即IN
方向。
具体提供了 4 组 测试 endpoint:
Endpoint | Type | Direction | Descript| |
---|---|---|---|
in_ep | bulk | IN |
Source 发送数据到 Host, 注意这数据是 Device 主动生成的 |
out_ep | bulk | OUT | Sink 接收 Host 的数据 |
iso_in_ep | iso | IN | Source 发送数据到 Host |
iso_out_ep | iso | OUT | Sink 接收 Host 的数据 |
主要流程如下:
drivers\usb\gadget\function\f_sourcesink.c:
sourcesink_bind():
static int
sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
{
/* (1) 从 gadget 中分配 2 个 bulk endpoint */
/* allocate bulk endpoints */
ss->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc);
ss->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc);
/* (2) 如果支持 ISO,再从 gadget 中分配 2 个 iso endpoint */
/* allocate iso endpoints */
ss->iso_in_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_source_desc);
if (!ss->iso_in_ep)
goto no_iso;
ss->iso_out_ep = usb_ep_autoconfig(cdev->gadget, &fs_iso_sink_desc);
if (!ss->iso_out_ep) {
}
sourcesink_set_alt() → enable_source_sink() → usb_ep_enable()/source_sink_start_ep():
// 启动上述 endpoint
→ source_sink_complete():
// urb 的 complete() 函数,urb 发送/接收完成后,重新挂载 urb
还支持一些参数调整:
# ls functions/SourceSink.0/bulk_bufleniso_qlenisoc_maxburstisoc_multbulk_qlenisoc_intervalisoc_maxpacketpattern