Edit online

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