На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (51) « Первая ... 25 26 [27] 28 29 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Цитата StasNewOs @
    Недопонял только как передать устройство компаньону и как работать через контроллер. Я думал, что сначало надо остановить, а потом ресет.

    Чтоб передать порт компаньону, надо выставить бит 12 в регистре статуса порта (вВсе биты в портах я нумерую, начиная с 0).
    Остановленный контроллер не выполнит ресет - он же остановлен. По крайней мере, у меня попытка дать ресет при остановленном контроллере ни к чему хорошему не приводила.
      Малость опечатался. Periodic List - это base+caplen+14h. И не вижу кнопки "правка"..
        ...или же я все-таки ошибся с нумерацией бит? Я смотрю на свои исходники на Си. Похоже, ошибся. Если мы берем число 1L, это будет нулевой бит.. Если (1L<<13), это будет же 13-й бит? Да.. Значит, нужно в мои постинги внести поправки. К номерам битов, которые указывал я, прибавлять 1, ну, в общем, согласовывать с описанием контроллера, а не слепо следовать моим номерам. Жаль, что я не вижу кнопки "Правка" для постингов...
          А сколько памяти нужно для base+caplen+18h
          Вы писали что после ресета останавливаете, а в какой момент вы его запускаете?
          Сообщение отредактировано: StasNewOs -
            Запускаю контроллер сразу после установки всех нужных адресов.
            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 (это асинхронные транзакции). Еще существуют изохронные устройства - такие, как видео и аудио интерфейсы, там все немного по-другому, но я с ними не работал за ненадобностью.
              Цитата 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битной и на поддержку не посмотрим, так можно?
              Сообщение отредактировано: StasNewOs -
                Цитата StasNewOs @
                А если есть поддержка для 64 битной адресации, а мы работаем кук для 32битной и на поддержку не посмотрим, так можно?

                Можно, конечно. Только надо в регистр CTRLDSSEGMENT (base+10h) записать 0. А структуры надо предусматривать как для 64-битной адресации (аппендикс B описания EHCI версии 1.0), и в них старшие слова адресов (Extended Buffer Pointer Page) обнулять.
                  У меня при ресете контроллера все порты сбрасываются и понять что там чтото есть не возможно, а порты не могу перезапустить потому, что HChalted у меня 0 и при записи 8 бита 1 на перезапуск он так и остаётся 1. :(((((((
                  Сообщение отредактировано: StasNewOs -
                    Ее раз повторяю все процедуру, глядя в свои исходники. Тут уже все будет правильно - я, возможно, кое-где ошибался, пытаясь ответить по памяти..
                    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. Память подводит..
                      Похоже что то получилось. EECP на одном был 160, на другом 104. Проверка 16 бита на 0 проходит, а 24 виснет. Контроллер останавливаю, перезапускаю и в портах появляется инфа о скорости(там была мышка K-state и флешка с камерой J-state). Я ещё ставил CONFIGFLAG в 1 перед стартом, это я правильно сделал?
                      Но у меня HCHalted в результате всёровно 0, хотя после остановки была 1 иначе бы повис, поэтому порты не могу перезапускать.
                      Забегая вперёд у меня вопрос, так можно заполнитьQH, и что нам это даст, а то я это ещё недопонял.
                      ExpandedWrap disabled
                          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
                      Сообщение отредактировано: trainer -
                        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, как я понимаю, ни на что принципиально не влияет - это просто памятка для тебя, что контроллер сконфигурирован. Я тоже его ставлю, но не стал на нем акцентировать внимание.
                          Значит HCHalted = 0 - это хорошо и можно порты перезапускать, а проверять включение можно обнулением его? Если в портах 0 бит присутствия устройства 0, то этот порт можно не перезапускать, и помоему если K-state устройство его тоже можно не трогать. Подскажите ещё как пронумеровывать устройства?
                          Сообщение отредактировано: StasNewOs -
                            Чтоб устройство пронумеровать, надо послать ему стандартный запрос (Request) SET_ADDRESS. Это пакет типа SETUP, адресованный 0-й конечной точке (endpoint). Его структура приведена во всех описаниях USB. Понятно, что структура запросов не зависит от типа контроллера. Адрес может быть любой (до 255), кроме 0. Но у всех устройств адреса, разумеется, должны быть разными. Я у себя делаю так: веду список подключенных устройств и каждому устройству присваиваю просто порядковый номер строки в этом списке (начиная с 1).
                              Мне осталось перезапустить порты и отдать компаньёнам их устройства (а комплектации с хабами, т.е. без компаньёнов там нужно бит ставить Port Owner) и уже не терпится послать им что-нибудь, но для этого нужно нормально QH оформить.
                                Понял в чём проблема, у меня после перезапуска контроллера появился статус low speed и full speed, я full-speed устройству посылаю ресет но бит 2 EHCI_PORT_ENABLE не появляется и иногдя бит 8 ресет не обнуляется.
                                Что то я не понял, а что после ресета порта контроллер не обнуляет этот бит, чтоли? Я сам обнулил его и увидел появившийся бит в Port Enabled/Disabled у флешки и веб камеры, мышка осталась без изменения.

                                Сделал паузу после установки 8бита(ресет) в порт и перед его обнулением, 2бит появился, но если сразу отдаю порты компаньонам у которых он не появился, даже делая паузу после этого идут глюки с определением следующих портов. Передачю пока делать не буду, а попробую пронумеровать появившиеся порты usb2,
                                подскажите как для этого оформить запрос.
                                Сообщение отредактировано: StasNewOs -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 25 26 [27] 28 29 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1384 ]   [ 15 queries used ]   [ Generated: 22.07.25, 00:00 GMT ]