Определился с алгоритмом инициализации. Конироллер EHCI нужно отключить от биоса, в пространстве PCI по смещению (EECP) - биты 15:8 в EHCI Extended Capabilities Pointer 4байтный регистр USBLEGSUP, в нём установим 24 бит и подождём обнуления 16 бита там же. Останавливаем контроллер. Для этого пишем 0 в USBCMD (BASE+CAPLENGTH+0) 0 и дожидаемся, пока бит 12 (HCHalted) в USBSTS (BASE+CAPLENGTH+4) не выставится в 1. Делаем ресет (пишем 1 в 1-й бит USBCMD) и дожидаемся, пока контроллер не сбросит этот бит в 0. Дальше можно изменять регистры и включить контроллер, после чего нужно сделать паузу на несколько милискунд. Потом делаем цикл по портам BASE+CAPLENGTH+44h+i*4, регистр портов только 1, но там всё. В нём должно быть включено питпние и если нулевой бит включен, то в нём устройство, проверить ест ли в нём устройство high-speed с которым работает EHCI можно только через его ресет, после чего в нём добавится бит ENABLE. Если этот бит не появится, то его отдадим компаньёну установкой 12бита, если устройство не full-speed а low-speed то его не проверяем а отдаём сразу компаньёну и у них отключается нулевой бит присутствия, а при изменении в портах контроллер ставит 1 в первом бите и мы его должны обнулять. Ну а устройство high-speed будем пронумеровывать пакетом типа SETUP и потом можно получить с него инфу и качать сектора. Проверку того что оно не ушло можно первым битом изменения порта. Если у биоса не отнять контроллер то он будет обнулять этот бит и пакастить всячески. Для отправки пакетов нужно забить его адрес после ресета и перед включением контроллера, и по этому адресу работать.
Кстати при ресете пота бит 8 не обнуляется, а мы сами его должны обнулить после паузы, когда контроллер определяет, что это устройство high-speed. После отправки к компаньёну тоже нужна пауза и это неудобно, может быть есть какойто бит для проверки, но я ещё не в курсе.
|