![](https://habrastorage.org/getpro/habr/post_images/332/ac0/97c/332ac097cb7bfba245943a942c69f564.png)
x86-compatible, часть 1: «Тёмная лошадка с Тайваня»
6 мин
![](https://habrastorage.org/getpro/habr/post_images/332/ac0/97c/332ac097cb7bfba245943a942c69f564.png)
Компания KolibriOS Project Team временно не ведёт блог на Хабре
SET_INTERFACE
. Существование в живой природе хабов, поддерживающих режим с различными TT, не подтверждено, как и польза от этого режима, поэтому драйвер хабов даже не пытается его обнаружить и включить и просто использует режим единого TT, включённый по умолчанию.usb_hub_callbacks
, содержащую указатели на функции драйвера usb_hub_init
и usb_hub_disconnect
. Работа драйвера начинается, когда уровень логического устройства вызывает usb_hub_init
, и заканчивается, когда уровень поддержки каналов вызывает usb_hub_disconnect
в ответ на отключение устройства.usb_new_device
из bus/usb/protocol.inc.GET_DESCRIPTOR
, отправленная нулевой конечной точке; в команде должны быть указаны тип дескриптора, порядковый номер дескриптора среди всех с таким типом, длина данных для передачи. Каждая команда к управляющей конечной точке занимает 8 байт и может иметь или не иметь дополнительных данных, в некоторых командах некоторые поля не используются. Структура команд по байтам и используемые поля расписаны в главе 9 спецификации USB, здесь я буду только описывать входные и выходные данные для команд.It works with the latest build,К сожалению, пользователь был немногословен (либо английский — не его родной язык), поэтому некоторое время мы выясняли, что же именно не так, задавая наводящие вопросы, пока картина не прояснилась:
Thanks
EDIT: It freezes slower.
I mean it needs a little more time to freeze the mouse.Здесь уже я догадался, что причиной зависания, скорее всего, является драйвер SATA IDE, который в настоящий момент разрабатывает Mario_Z. На данный момент, в KolibriOS есть родной драйвер только для контроллера PATA, а поддержка контроллера SATA в режиме IDE осуществляется только через BIOS, что вносит 2 ограничения:
Oh yes, the whole system freezes. The Keyboard and the clock aren't working.
USBOpenPipe
из API, названная usb_open_pipe
в коде pipe.inc, открывает новый канал по указанным характеристикам канала и «родительскому» каналу, где записаны характеристики устройства. Для этого она:*hci_pipe+usb_pipe
, описывающих канал и выравненных на контроллеро-специфичную границу, вызовом контроллеро-специфичной функции usb_hardware_func.AllocPipe
;*hci_gtd+usb_gtd
, описывающих пустой дескриптор передачи и выравненных на контроллеро-специфичную границу, вызовом контроллеро-специфичной функции usb_hardware_func.AllocTD
;usb_hardware_func.InitPipe
, охраняемую мьютексом, глобальным для контроллера;usb_init
из init.inc в ходе загрузки системы.pcidev_list
. USB-контроллеры опознаются среди всех PCI-устройств по коду класса, подкласса и интерфейса: Тип | Класс | Подкласс | Интерфейс |
---|---|---|---|
UHCI | 0Ch | 03h | 00h |
OHCI | 0Ch | 03h | 10h |
EHCI | 0Ch | 03h | 20h |
XHCI | 0Ch | 03h | 30h |
usb_init
проходит по списку PCI-устройств несколько раз, каждый раз выделяя USB-контроллеры.int 13h
— такая поддержка встречается куда чаще поддержки мышей, ибо необходима для загрузки с флешек.cli
/sti
без собственно спинлока, на многопроцессорных внутри cli
/sti
остаётся обычный спинлок. Кроме того, контроллер прерываний во время обработки одного прерывания блокирует остальные с тем же или более низким приоритетом.Аббр. | Название интерфейса | Версия | Код поддержки контроллера в KolibriOS |
---|---|---|---|
UHCI | Universal Host Controller Interface | USB 1.1 | kernel/trunk/bus/usb/uhci.inc |
OHCI | Open Host Controller Interface | USB 1.1 | kernel/trunk/bus/usb/ohci.inc |
EHCI | Enhanced Host Controller Interface | USB 2.0 | kernel/trunk/bus/usb/ehci.inc |
XHCI | eXtensible Host Controller Interface (новый) | USB 3.0 | В KolibriOS ещё не поддерживается |