На главную Наши проекты:
Журнал   ·   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) « Первая ... 44 45 [46] 47 48 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Нет, для Get_Configuration будут нужны три TD. Один - отправка пакета типа SETUP, второй - прием пакета типа IN, третий - отправка пакета типа OUT нулевой длины. В каждом TD можно поставить свой адрес буфера.
    Сообщение отредактировано: zakharo -
      Значит для каждой из трех транзакций нужно править поле Direction в ED или создать ED каждого типа?
        Ставишь в ED в поле D 00 или 11 - Get Direction from TD, то есть использовать PID из TD.
        Сообщение отредактировано: zakharo -
          Значит нужно править поле D при каждой транзакции в зависимости её типа?
            Не надо. Используй всегда 00 или 11 - и все. А конкретный тип транзакции ставь уже в TD.
              Все ясно, огромное спасибо, буду пробовать)

              Добавлено
              Хотя не все)
              При отправке того же Get Descriptor первый описываю TD типа SETUP, потом в NextTD записываю адрес второго TD типа IN и во втором TD указываю на третий TD типа OUT, Так получается?Что бы уж совсем расставить все точки над и)
                SET_ADDRESS проходит успешно. Потом переставляю HcControlHeadED на адрес ED для первого устройства, но результатом команды GET_DESCRIPTOR является 1010.
                И еще вопрос, поле NextED является указателем на следующий ED этого же устройства или все ED для всех устройств завязаны друг на друге?
                  Завтра все подробно расскажу. Надо код посмотреть. Я же пока тебе только по спецификации OHCI да по собственной памяти все говорил. Завтра..

                  Все ED всех устройств могут быть завязаны друг на друга и таким образом они составляют единую очередь на выполнение транзакций для контроллера.

                  Цитата Modulator @
                  При отправке того же Get Descriptor первый описываю TD типа SETUP, потом в NextTD записываю адрес второго TD типа IN и во втором TD указываю на третий TD типа OUT, Так получается?Что бы уж совсем расставить все точки над и)

                  Да. Третий TD - последний, не указывает никуда.

                  А что такое 1010? Где оно появляется?
                  Сообщение отредактировано: zakharo -
                    1010 в ConditionCode
                      1010 reserved (стр. 32). Такого кода не бывает.. Ничего не путаешь? Сделай дамп ED и TD, покажи, что ты пытаешься сделать.
                      Сообщение отредактировано: zakharo -
                        Ну, вот, наконец я на работе и посмотрел свои коды.
                        Вот как все сделано у меня.
                        Есть один ED, адрес которого записан в соответствующий регистр контроллера, и есть несколько TD.
                        Перед любыми изменениями ED и TD сбрасываю биты CLF и BLF - иначе контроллер будет пытаться выполнить не до конца заполненную очередь.

                        Для операции GetDescriptor используются 3 TD. 1-й - это транзакция типа SETUP, вывод пакета GET_DESCRIPTOR request (8 байт) на КТ номер 0. Второй - это прием нужного количества байт (8 для непронумерованного устройства и 18 для пронумерованного) - транзакция типа IN. Третий - это вывод пакета нулевой длины - транзакция типа OUT.
                        Понятно, что во все поля адресов записываются физические адреса памяти.

                        Для операции SetAddress использутся 2 TD. 1-й - это транзакция типа SETUP, вывод пакета SET_ADDRESS request (8 байт) на КТ номер 0. Второй - это прием нужного пакета нулевой длины - транзакция типа IN.

                        После всей подготовки выставляю бит CLF и жду, пока в ED HeadP не сравняется с TailP или в HeadP не выставится бит H (halted - младший бит HeadP). Если бит H выставляется, то смотрю ConditionCode в том TD, на который указывает HeadP.

                        В TD нет поля для указания длины пакета, но есть поле для адреса последнего байта (BE). Для пакета нулевой длины в TD ставим BE = CBP (я эти поля просто обнуляю).
                          Кто-нибудь сталкивался с такой проблемой.
                          Есть EHCI с хабом без низкоскоростных контроллеров (generic hub, кажется). То есть всё общение идёт через хаб. Портов от самого контроллера не выведено наружу.
                          Соответственно на плате две таких связки. То есть имеем два контроллера, у каждого хаб.
                          Втыкаю низкоскоростное устройство в порт на одной связке - всё работает.
                          Втыкаю в порт на другой связке :
                          set_address проходит.
                          А получение дескриптора устройства не срабатывает - происходит установка битов babble и halt статуса дескриптора.
                          Запрашиваю, как положено сначала 8 байт. Чтобы узнать MaxPacketSize.

                          При этом, что интересно, судя по выходу, нужных 8 байт он выдаёт. Но что-то выдаёт ещё и происходит babble.

                          Как с этим бороться? Ведь на дескрипторах стоит обработчик halt и babble. Мало ли ошибка. Это тут понятно, что всё нормально, просто что-то ещё выдаёт.. А для общего случая это ошибка.
                          И вообще, почему он выдаёт больше, чем нужно.
                            Припоминаю, сталкивался с подобным. Именно babble, и именно через хаб. Решилось подбором времени задержки между выдачей ресета на порт хаба и первым обращением к устройству. Или, может быть, задержкой после SET_ADDRESS. Сейчас точно и не вспомню.
                            Там у меня есть задержки в нескольких местах - после включения питания порта хаба, после ресета (Port Reset), после установки адреса и после SET_CONFIGURATION. Некоторые устройства работают и без них, а некоторые - нет. Если внимательно вчитаться в полную спецификацию USB, то там допускаются задержки со стороны устройства - например, микропрограмма устройства после старта может делать какую-то свою инициализацию, и, соответственно, неправильно реагировать на запросы хоста. Поэтому во избежание всяких недоразумений я везде поставил по 100 мс - и вроде как проблем больше нет.
                            Сообщение отредактировано: zakharo -
                              Согласен - с задержками это магия.
                              Когда писал код под низкоскоростные контроллеры - на то, чтобы подобрать нужные и работоспособные на 95% задержки ушло полгода при возникающих на разных конфигурациях изредка проблемах.
                              А теперь вот EHCI. И ведь многие задержки уже делали по спецификации, но всё равно... магия.
                              Попробую, спасибо. С ними ещё и переборщить нельзя. Иначе устройство в спячку уйдёт...
                                Если есть возможность запустить программу в каком-нибудь дебаггере с пошаговым исполнением, то сразу становится ясно, в каком именно месте нужна задержка. Я работал в Borland C 3.1, там все удобно - можно сразу же править и запускать.
                                Насчет спячки - у меня проблем не было. Пока порт включен и контроллер посылает SOF, устройство засыпать не должно.
                                Сообщение отредактировано: zakharo -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 44 45 [46] 47 48 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0647 ]   [ 14 queries used ]   [ Generated: 19.07.25, 11:31 GMT ]