Добрый день, я пытался разобраться со стандартом ECHI контроллера, но у меня остались некоторые вопросы и пробелы в знаниях. Хотя может что-то неправильно понял.
Как контроллер сообщает о новом устройстве на шине? Как определить какие устройства и на какой скорости подключены к данному ECHI контроллеру? Как я понял из стандарта при подключении устройства ему выдается номер на шине и проходит его установка через entry_point_0, все дальнейшее общение ложится на плечи драйвера устройства. А в случае когда я смотрю регистры контроллера в Windows через RWE где можно посмотреть эту информацию?
Я пытался смотреть в PORTSC из operational registers, но у меня данные не совпадают с реальностью, я подключил 3 устройства: 2 флешки и LS-мышь. А проходя по регистрам бит Current Connection Status стоит только у одного. И у всех портов сброшен 13 bit - Port Owner. Может ли влиять на эту ситуацию наличие xCHI контроллера?
Поиск USB устройства
Контроллеры называются *HCI, не CHI.
Если в системе есть USB3-контроллер XHCI, то устройства, подключённые к его портам, он не отдаст другим контроллерам. Часто бывает так, что в системе некоторые из портов отведены под XHCI-контроллер, некоторые - под EHCI. В таком случае через EHCI будут в принципе видны только некоторые устройства - те, которые подключены к отведённым под него портам.
EHCI сам по себе умеет обрабатывать только устройства на скорости High-Speed, USB2. Устройства Low-Speed и Full-Speed он делегирует USB1-контроллерам-компаньонам UHCI либо OHCI. Бит Port Owner отвечает как раз за делегирование - если он 1, то устройство делегировано компаньону, EHCI-контроллер про него забыл.
Есть трюк, позволяющий избежать включения UHCI/OHCI-контроллеров в систему с EHCI: устройства подключены не напрямую к контроллеру, а через виртуальный хаб. Виртуальный хаб всегда работает на High-Speed, его делегировать не нужно, компаньоны не нужны. Этот трюк особенно любит Intel. Твоя конфигурация, похоже, именно такая - только один порт connected, на нём висит виртуальный хаб, всё остальное - не считая устройств, подключённых к XHCI-портам - висит на портах виртуального хаба. Которых ни в каких регистрах просто не видно.
По регистрам контроллера можно определить только базовые вещи - подключено устройство или нет, и на какой скорости оно подключено. Устройство, подключённое к EHCI, может работать только на High-Speed, в регистрах OHCI и UHCI есть отдельный бит Low-Speed. Вся информация о том, что это за устройство, хранится только в структурах операционной системы.
В винде иерархию подключённых USB-устройств показывает USBView из Debugging Tools. В линуксе - lsusb -t и lsusb -v.
Если в системе есть USB3-контроллер XHCI, то устройства, подключённые к его портам, он не отдаст другим контроллерам. Часто бывает так, что в системе некоторые из портов отведены под XHCI-контроллер, некоторые - под EHCI. В таком случае через EHCI будут в принципе видны только некоторые устройства - те, которые подключены к отведённым под него портам.
EHCI сам по себе умеет обрабатывать только устройства на скорости High-Speed, USB2. Устройства Low-Speed и Full-Speed он делегирует USB1-контроллерам-компаньонам UHCI либо OHCI. Бит Port Owner отвечает как раз за делегирование - если он 1, то устройство делегировано компаньону, EHCI-контроллер про него забыл.
Есть трюк, позволяющий избежать включения UHCI/OHCI-контроллеров в систему с EHCI: устройства подключены не напрямую к контроллеру, а через виртуальный хаб. Виртуальный хаб всегда работает на High-Speed, его делегировать не нужно, компаньоны не нужны. Этот трюк особенно любит Intel. Твоя конфигурация, похоже, именно такая - только один порт connected, на нём висит виртуальный хаб, всё остальное - не считая устройств, подключённых к XHCI-портам - висит на портах виртуального хаба. Которых ни в каких регистрах просто не видно.
По регистрам контроллера можно определить только базовые вещи - подключено устройство или нет, и на какой скорости оно подключено. Устройство, подключённое к EHCI, может работать только на High-Speed, в регистрах OHCI и UHCI есть отдельный бит Low-Speed. Вся информация о том, что это за устройство, хранится только в структурах операционной системы.
В винде иерархию подключённых USB-устройств показывает USBView из Debugging Tools. В линуксе - lsusb -t и lsusb -v.
Сделаем мир лучше!
С *CHI я что-то погорячился ![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
В моем случае, видимо, XHCI ничего не забирает себе.
Тогда есть другой вопрос, если я сам сформирую QHead и QTD к какому либо устройству, допустим к мыши, и вставлю в периодическую очередь контроллера, имеет ли смысл делать их LS или FS? Или так как хаб HS-устройство, они все равно будут преобразованы в HS?
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
В моем случае, видимо, XHCI ничего не забирает себе.
Тогда есть другой вопрос, если я сам сформирую QHead и QTD к какому либо устройству, допустим к мыши, и вставлю в периодическую очередь контроллера, имеет ли смысл делать их LS или FS? Или так как хаб HS-устройство, они все равно будут преобразованы в HS?
- Attachments
-
-
Безымянный.png (72.46 KiB)Viewed 6336 times
В Queue Head у EHCI есть двухбитовое поле Endpoint Speed, его нужно заполнять в соответствии со скоростью конечного устройства. Для LS и FS-устройств нужно ещё заполнить адрес на шине последнего HS-хаба на пути к устройству и порт на этом хабе. Дальше контроллер с хабом сами разберутся.
Сделаем мир лучше!
Who is online
Users browsing this forum: No registered users and 4 guests