Как xhci_urb_enqueue () узнает, в какую конечную точку отправить управляющий запрос в USB-стек Linux? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь понять, как xhci_urb_enqueue() выясняет, какой адрес конечной точки направляет запросы управления. Из кода он вызывает ep_index = xhci_get_endpoint_index(&urb->ep->desc) для получения ep_index, который в конечном итоге использует epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK для определения адреса конечной точки.

Насколько я понимаю, на управляющие запросы для получения device/configuration/interface /endpoint descriptors отвечает только ep0, и после этого хост выдает на устройство Set_Address/Set_configuration, с этого момента все управляющие запросы должны отправляться на адрес фактической конечной точки, упомянутый в конечной точке. дескриптор.

Мои вопросы:

  1. Должно ли USB-устройство вызывать конечные точки после получения запроса Set_configuration?

  2. Как и когда устанавливается epd->bEndpointAddress на этапе настройки, упомянутом выше?

1 Ответ

0 голосов
/ 16 января 2019

Я выяснил, ep_index изменяется в зависимости от того, какой драйвер устройства / XHCI прочитал из дескрипторов. На этапе настройки на USB-устройство передаются только запросы на управление, поэтому ep_index всегда равно 0 (urb_pipetype(urb) == PIPE_CONTROL), это основано на дизайне протокола USB. После завершения этапа установки ep_index всегда возвращает правильный индекс конечной точки для запросов на массовую / внутреннюю передачу (urb_pipetype(urb) == PIPE_BULK | PIPE_INTERRUPT.

...