
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (51) « Первая ... 25 26 [27] 28 29 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#391
,
|
|
|
Цитата StasNewOs @ Недопонял только как передать устройство компаньону и как работать через контроллер. Я думал, что сначало надо остановить, а потом ресет. Чтоб передать порт компаньону, надо выставить бит 12 в регистре статуса порта (вВсе биты в портах я нумерую, начиная с 0). Остановленный контроллер не выполнит ресет - он же остановлен. По крайней мере, у меня попытка дать ресет при остановленном контроллере ни к чему хорошему не приводила. |
Сообщ.
#392
,
|
|
|
Малость опечатался. Periodic List - это base+caplen+14h. И не вижу кнопки "правка"..
|
Сообщ.
#393
,
|
|
|
...или же я все-таки ошибся с нумерацией бит? Я смотрю на свои исходники на Си. Похоже, ошибся. Если мы берем число 1L, это будет нулевой бит.. Если (1L<<13), это будет же 13-й бит? Да.. Значит, нужно в мои постинги внести поправки. К номерам битов, которые указывал я, прибавлять 1, ну, в общем, согласовывать с описанием контроллера, а не слепо следовать моим номерам. Жаль, что я не вижу кнопки "Правка" для постингов...
|
Сообщ.
#394
,
|
|
|
А сколько памяти нужно для base+caplen+18h
Вы писали что после ресета останавливаете, а в какой момент вы его запускаете? |
Сообщ.
#395
,
|
|
|
Запускаю контроллер сразу после установки всех нужных адресов.
QH при 32-битной адресации занимает 48 байт, qTD - 32 байта. В спецификации EHCI все написано. Там все структуры разрисованы. Причем есть разница для 32-битных и 64-битных контроллеров. Разрядность адресации контроллера определяется битом 0 (теперь точно 0!) в HCCPARAMS (base+8), при 64-битной адресации как в QH, так и в qTD появляются дополнительные поля. Добавлено Насчет необходимости нескольких qTD для блока в 2048 байт я тоже наврал. Давно это было, уже и подзабылось все... Одним qTD контроллер может передать 5 физических страниц по 4 кб, итого 20 Кб. Так что для mass-storage устройств в принципе можно обойтись всего одним QH и одним qTD (это асинхронные транзакции). Еще существуют изохронные устройства - такие, как видео и аудио интерфейсы, там все немного по-другому, но я с ними не работал за ненадобностью. |
Сообщ.
#396
,
|
|
|
Цитата zakharo @ Запускаю контроллер сразу после установки всех нужных адресов. QH при 32-битной адресации занимает 48 байт, qTD - 32 байта. В спецификации EHCI все написано. Там все структуры разрисованы. Причем есть разница для 32-битных и 64-битных контроллеров. Разрядность адресации контроллера определяется битом 0 (теперь точно 0!) в HCCPARAMS (base+8), при 64-битной адресации как в QH, так и в qTD появляются дополнительные поля. Добавлено Насчет необходимости нескольких qTD для блока в 2048 байт я тоже наврал. Давно это было, уже и подзабылось все... Одним qTD контроллер может передать 5 физических страниц по 4 кб, итого 20 Кб. Так что для mass-storage устройств в принципе можно обойтись всего одним QH и одним qTD (это асинхронные транзакции). Еще существуют изохронные устройства - такие, как видео и аудио интерфейсы, там все немного по-другому, но я с ними не работал за ненадобностью. У меня для дисков контроллер ahci читает байты, в одной ТД он читает 22^2 байт и на драйвер фат и нтфс я сразу читал кластером (не разбивал его на сектора), здесь тоже значит можно целый кластер в ТД забить (читает движок ДМА, а проц в это время не напрягается). Это хорошо. А если есть поддержка для 64 битной адресации, а мы работаем кук для 32битной и на поддержку не посмотрим, так можно? |
Сообщ.
#397
,
|
|
|
Цитата StasNewOs @ А если есть поддержка для 64 битной адресации, а мы работаем кук для 32битной и на поддержку не посмотрим, так можно? Можно, конечно. Только надо в регистр CTRLDSSEGMENT (base+10h) записать 0. А структуры надо предусматривать как для 64-битной адресации (аппендикс B описания EHCI версии 1.0), и в них старшие слова адресов (Extended Buffer Pointer Page) обнулять. |
Сообщ.
#398
,
|
|
|
У меня при ресете контроллера все порты сбрасываются и понять что там чтото есть не возможно, а порты не могу перезапустить потому, что HChalted у меня 0 и при записи 8 бита 1 на перезапуск он так и остаётся 1.
![]() |
Сообщ.
#399
,
|
|
|
Ее раз повторяю все процедуру, глядя в свои исходники. Тут уже все будет правильно - я, возможно, кое-где ошибался, пытаясь ответить по памяти..
1. Находим контроллер на шине (это я не описываю). 2. Читаем CAPLENGTH, HCSPARAMS, HCCPARAMS, ну и что еще там интересно из Host Controller Capability Registers. 3. В HCCPARAMS смотрим на EHCI Extended Capabilities Pointer (EECP) - биты 15:8. Если там не 0, то это - смещение в конфигурационного пространства PCI, по которому лежит первое слово EHCI extended capability. 4. Если EECP не 0, то читаем это самое слово (DWORD) - это будет регистр USBLEGSUP. Если в нем младший бит установлен в 1, то есть поддержка Pre-OS to OS Handoff Synchronization. Если нет, идем на п.6 5. Если в USBLEGSUP бит 16 установлен в 1, то контроллером владеет BIOS, и его надо "отнять". Чтобы отнять, устанавливаем в 1 бит 24 в USBLEGSUP и дожидаемся, пока бит 16 и бит 24 не сбросятся в 0. Если бит 16 был в 0, не делаем ничего. 6. Здесь начинается собственно работа с контроллером. 7. Останавливаем контроллер. Для этого пишем 0 в USBCMD (BASE+CAPLENGTH+0) 0 и дожидаемся, пока бит 12 (HCHalted) в USBSTS (BASE+CAPLENGTH+4) не выставится в 1. 8. Делаем ресет (пишем 1 в 1-й бит USBCMD) и дожидаемся, пока контроллер не сбросит этот бит в 0. 9. Дальше записываем все нужные регистры по п.4.1 описания EHCI и запускаем контроллер (устанавливаем в 1 бит 0 в USBCMD). 10. Дальше я делаю паузу аж в 300 мс (подобрана опытным путем). Дело в том, что у меня есть одна довольно старая флешка, которая чудит - без этой паузы отказывается работать по high speed, а работает только по full speed. Даже Windows не справляется с ней - пишет, что "быстрое устройство подключено к медленному порту". Из-за нее и приходится делать такую паузу, после которой она прекрасно работает по high speed. В общем, тут уже есть простор для экспериментов. 11. Смотрим бит 4 HCCPARAMS - это бит Port Power Control (PPC). Если он стоит в 1, то возможно управление питанием портов, и я тупо включаю питание для всех портов - в цикле по количеству портов записываю 1 в бит 12 соответствующего PORTSC (BASE+CAPLENGTH+44h+i*4). 12. В цикле по количеству портов начинаю опрос портов с целью выяснить, что там к ним подключено. ... устал писать... Попробуй сделать все эти операции и посмотри, что получится. Я раньше писал, что ресет надо давать на работающий (не остановленный) контроллер. Я ошибался - спутал с UHCI. Память подводит.. |
Сообщ.
#400
,
|
|
|
Похоже что то получилось. EECP на одном был 160, на другом 104. Проверка 16 бита на 0 проходит, а 24 виснет. Контроллер останавливаю, перезапускаю и в портах появляется инфа о скорости(там была мышка K-state и флешка с камерой J-state). Я ещё ставил CONFIGFLAG в 1 перед стартом, это я правильно сделал?
Но у меня HCHalted в результате всёровно 0, хотя после остановки была 1 иначе бы повис, поэтому порты не могу перезапускать. Забегая вперёд у меня вопрос, так можно заполнитьQH, и что нам это даст, а то я это ещё недопонял. ![]() ![]() mov [edi],edi add dword[edi],2 тип QH (queue head) в адресе добавим add edi,4 ;QH 2nd dword-Endpoint Characteristics ;5=NAK reload counter ;200=max packet, typically us 0x40 for control xfer, 0x200 for mass xfer ;e0=head of reclaim list, dt from TD, hi speed endpoint ;00=epnum and deviceadd are 0 for control endpoint mov dword[edi],0x5200e000 add edi,4 ;QH 3rd dword - Endpoint Capabilities ;40=1 transaction per microframe (Mult) ;PortNum=HubAddr=C-Mask=S-mask=0 mov dword[edi],0x40000000 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],1 ;5th dword Next qTD Pointer (1=terminate) add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 add edi,4 mov dword[edi],0 |
Сообщ.
#401
,
|
|
|
HCHalted - "контроллер остановлен". Когда контроллер работает, этот бит должен быть 0.
Конечно, бит 24 в USBLEGSUP должен остаться в 1. Это я опечатался.. В описании про 24 бит написано "Ownership is obtained when this bit reads as one and the HC BIOS Owned Semaphore bit (который 16-й) reads as zero". Ты читай описания - там все точно, а я могу и напутать. Главное дело - в программе-то у меня все правильно, а я смотрю туда и пишу другое. Просто давно уже это делалось. CONFIGFLAG, как я понимаю, ни на что принципиально не влияет - это просто памятка для тебя, что контроллер сконфигурирован. Я тоже его ставлю, но не стал на нем акцентировать внимание. |
Сообщ.
#402
,
|
|
|
Значит HCHalted = 0 - это хорошо и можно порты перезапускать, а проверять включение можно обнулением его? Если в портах 0 бит присутствия устройства 0, то этот порт можно не перезапускать, и помоему если K-state устройство его тоже можно не трогать. Подскажите ещё как пронумеровывать устройства?
|
Сообщ.
#403
,
|
|
|
Чтоб устройство пронумеровать, надо послать ему стандартный запрос (Request) SET_ADDRESS. Это пакет типа SETUP, адресованный 0-й конечной точке (endpoint). Его структура приведена во всех описаниях USB. Понятно, что структура запросов не зависит от типа контроллера. Адрес может быть любой (до 255), кроме 0. Но у всех устройств адреса, разумеется, должны быть разными. Я у себя делаю так: веду список подключенных устройств и каждому устройству присваиваю просто порядковый номер строки в этом списке (начиная с 1).
|
Сообщ.
#404
,
|
|
|
Мне осталось перезапустить порты и отдать компаньёнам их устройства (а комплектации с хабами, т.е. без компаньёнов там нужно бит ставить Port Owner) и уже не терпится послать им что-нибудь, но для этого нужно нормально QH оформить.
|
Сообщ.
#405
,
|
|
|
Понял в чём проблема, у меня после перезапуска контроллера появился статус low speed и full speed, я full-speed устройству посылаю ресет но бит 2 EHCI_PORT_ENABLE не появляется и иногдя бит 8 ресет не обнуляется.
Что то я не понял, а что после ресета порта контроллер не обнуляет этот бит, чтоли? Я сам обнулил его и увидел появившийся бит в Port Enabled/Disabled у флешки и веб камеры, мышка осталась без изменения. Сделал паузу после установки 8бита(ресет) в порт и перед его обнулением, 2бит появился, но если сразу отдаю порты компаньонам у которых он не появился, даже делая паузу после этого идут глюки с определением следующих портов. Передачю пока делать не буду, а попробую пронумеровать появившиеся порты usb2, подскажите как для этого оформить запрос. |