На главную Наши проекты:
Журнал   ·   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) 1 [2] 3 4 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Да, учит он именно так, но есть там еще приписка "Виндоус использует более сложный механизм...". Я делал по аналогии с виндовсом, хотя это не имее решающего значения.
      Цитата chetr @
      А разве Кулаков учит не наоборот???


      Врядли, потому как Агурову это соответствует, а вобще в близжайщее время буду пробовать.
      Прояснится, расскажу. :)
        Нашёл стр 755. Да это и не важно...
          рассуждая об BULK transfer, я наткнулся на непонятку. Ведь BULK это протокол гарантированной доставки массивов данных, в то же время каждый TD описывает один или более аппаратных пакетов, а вот интересно, что если задать в TD массив размером эдак 1 Мб, или даже более. Контроллер в этом случае самостоятельно будет прогребаться в плане расфасовывания по пакетам? или необходимо эту рутину брать на себя и самостоятельно разбивать массив и выстраивать советскую очередь за дефицитом из дескрипторов передачи?
            По спецификации OHCI (4.3.1.3.1 Buffer Address Determination) массив данных передаваемый одним TD не должен пересекать границы 4096 байт (1000h). Т.е. если тебе надо передавать 1Мб то надо разбить его на блоки следующим образом:
            ExpandedWrap disabled
              00000526  |----------------|
                        |      1 TD      |
              00000FFF  |----------------|
              00001000  |----------------|
                        |      2 TD      |
              00001FFF  |----------------|
              00002000  |----------------|
                        |      3 TD      |
              00002FFF  |----------------|
              ...............................
              000X5000  |----------------|
                        |      n TD      |
              000X5245  |----------------|

            А разбиение на пакеты внутри одного TD возьмет на себя сам контроллер.
            Сообщение отредактировано: Gerret -
              Не должен пересекать границу 4К больше одного раза!
              Спецификации под рукой нет, но это написано вроди в том же разделе.
              Если происходит пересечение контроллер заменяет старшие 12 бит адреса.
              Т.е. вместо старших 12 бит BufferStart подставляет старшие 12 бит BufferEnd.
              Тоесть два куска могут находиться в физической памяти вообще не подряд - это сделано для удобного использования в системах со страничной адресацией (Win32, Nix). В EHCI этот механизм развит ещё больше - там не ограничились одним пересечением :)
              Таким образом если выровнять буфера на 4К то их можно брать размером 8К.
              Хотя проще брать 4К и не заморачиваться с выравниванием.
                cppasm, да действительно :whistle:
                Только не 12 а 20 старших бит.

                Цитата

                4.3.1.3.1 Buffer Address Determination
                If during the data transfer the buffer address contained in the HC’s working copy of CurrentBufferPointer crosses a 4K boundary, the upper 20 bits of Buffer End are copied to the working value of CurrentBufferPointer causing the next buffer address to be the 0th byte in the same 4K page that contains the last byte of the buffer (the 4K boundary crossing may occur within a data packet transfer.)
                  Появился новый полезный ресурс по наболевшей теме USBforDOS
                    Ну да, 20 бит :)
                    Т.е. то, что остаётся от 32бит - 12бит (4К).
                    Это я ошибся маленько...
                      http://www.georgpotthast.de/usb не буду спорить что, ссылка, возможно, хорошая, но что то там маловато написано. Я то в смысл не вникал, потому как меня щас намного сильнее интересует OHCI. За ссылку на инфу по OHCI я даже спасибо скажу :D , а если еще и на русском...... два раза скажу спасибо!
                        Написано то там мало, зато есть исходники, но это видимо тебе не актуально, раз уж ты работаешь с OHCI :)
                          ЛЮДИИИИИИИ!!!!!!

                          а кто что может сказать по поводу прерываний от HC. я глядел по спецификации, но так как в английском я не ас, то и понял соответственно не супер. Там что то говорится о том, что обработчики HC цепляются на IRQ 1 и IRQ 12, неужели на оба сразу? :blink:
                          Ну SMI я догадываюсь что это :)
                          В регистре HcControl есть бит определяющий маршрутизацию прерываний: либо SMI, либо normal host bus interrupt mechanism, который standard Host Controller Interrupt. Этот момент мне очень не понятен. Что такое normal host bus interrupt mechanism? standard Host Controller Interrupt?
                          Потом, все усложняется еще и тем, что на момент, когда я дорываюсь до контроллера, его уже обслуживает штатный биосный драйвер. Когда я делаю сброс HC, маскирются прерывания и, соответственно, этот драйвер перестает дергаться, но как с прерываниями быть мне? Ведь если начну развешивать свои обработчики, фигня может получиться с обработкой событий контроллера. Или я че то недопонимаю. А если полностью заместить обработчик хотя бы на том IRQ1, фигня получится с клавой. Кто в курсе как вызываются эти два вектора, когда и почему, где есть некий механизм управлением этими прерываниями?
                          заранее спасибо!
                            Цитата Barbosman @
                            Ну SMI я догадываюсь что это

                            Ты в этом уверен?
                            Просто по твоему посту понятно что ты не очень понимаешь что это такое.
                            Цитата Barbosman @
                            Там что то говорится о том, что обработчики HC цепляются на IRQ 1 и IRQ 12, неужели на оба сразу?

                            Хочу тебя обрадовать что даже на 3 сразу :)
                            Те что ты привёл - это для эмуляции BIOS'ом (для поддержки USB клавиатуры и мыши).
                            IRQ1 - клавиатура, IRQ12 - мышь ps/2.
                            А есть ещё один IRQ - непосредственно хост контроллера, используемый при штатном режиме работы.
                            PS: кстати .bas это что за ассэмблер такой, или это бэйсик вообще :) (по коду похоже немного)?
                            Сообщение отредактировано: cppasm -
                              Спасибо, C++ASM, за помощь!
                              Объяснил дураку, что не все так просто. А я то думал.... Хорошо, что есть такие как ты, которые всегда помогут неопытным молодым программерам-самоучкам, и "по-отцовски" укажут им на их ошибки, и подтолкнут на правильный путь. Спасибо тебе, что рассказал, что такое SMI (довольно доходчиво!!!) И что такое normal host bus interrupt mechanism. Я бы никада сам не догадался.
                                Ну во-первых ник ты мой не правильно расшифровал...
                                Цитата Barbosman @
                                Хорошо, что есть такие как ты, которые всегда помогут неопытным молодым программерам-самоучкам, и "по-отцовски" укажут им на их ошибки, и подтолкнут на правильный путь.

                                Во-вторых, я сам самоучка, и ничего вроди. Было бы желание разобраться.
                                В спецификации это описано более чем подробно.
                                Ну если читать лень - тогда чтож поделаешь!
                                Я конечно допускаю что английский для тебя не родной язык, но что-то ты ведь понимаешь.
                                А по поводу
                                Цитата Barbosman @
                                Спасибо тебе, что рассказал, что такое SMI (довольно доходчиво!!!) И что такое normal host bus interrupt mechanism.

                                Я же не могу здесь пересказать 15 страниц спецификации.
                                Кратко рассказать могу. И зачем столько иронии?

                                Есть у процессора такой режим - SMM (System Management Mode).
                                Похож на реальный, но с отличиями (сегменты 4Гб).
                                Используется для управления электропитанием и других системных вещей.
                                Есть прерывание SMI - System Management Interrupt.
                                Имеет наивысший приоритет, не маскируемое, вызывается при различных системных событиях (например когда ты кнопку Power жмёшь).
                                Можно вызвать программно, но разными способами для разных чипсетов.
                                Обработчик находится в паралельном адресном пространстве, т.е. из обычной памяти недоступен. Отображается в основную память по адресам (A0000h-C0000h).
                                Т.е. под видеопамятью находится.
                                Для доступа к обработчику надо перепрограммировать чипсет.
                                Вот. Это что есть SMM.
                                Теперь каким образом это относится к USB.
                                Если в BIOS включена эмуляция USB клавиатуры или мыши, он пишет в регистры контроллера что владелец контроллера SMM и тогда вместо всех прерываний от хост контроллера генерируется SMI, которое обрабатывается BIOS'ом.
                                Когда грузится драйвер, он забирает управление у BIOS.
                                После этого все прерывания от контроллера вызывают IRQnn.
                                Какое именно можно прочитать в конфигурационном пространстве PCI.
                                Вот это и есть
                                Цитата Barbosman @
                                normal host bus interrupt mechanism

                                Всё что тебе нужно - посмотреть в спецификации как забрать управление у BIOS (по памяти не помню, обманывать не хочу).
                                И ещё совет - найди в сети исходники драйвера USB от FreeBSD.
                                Сильно помогают.
                                Надеюсь теперь хоть чем-то помог :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) 1 [2] 3 4 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0419 ]   [ 16 queries used ]   [ Generated: 16.04.24, 16:12 GMT ]