
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.4] |
![]() |
|
Страницы: (51) « Первая ... 44 45 [46] 47 48 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#676
,
|
|
|
Нет, для Get_Configuration будут нужны три TD. Один - отправка пакета типа SETUP, второй - прием пакета типа IN, третий - отправка пакета типа OUT нулевой длины. В каждом TD можно поставить свой адрес буфера.
|
Сообщ.
#677
,
|
|
|
Значит для каждой из трех транзакций нужно править поле Direction в ED или создать ED каждого типа?
|
Сообщ.
#678
,
|
|
|
Ставишь в ED в поле D 00 или 11 - Get Direction from TD, то есть использовать PID из TD.
|
Сообщ.
#679
,
|
|
|
Значит нужно править поле D при каждой транзакции в зависимости её типа?
|
Сообщ.
#680
,
|
|
|
Не надо. Используй всегда 00 или 11 - и все. А конкретный тип транзакции ставь уже в TD.
|
Сообщ.
#681
,
|
|
|
Все ясно, огромное спасибо, буду пробовать)
Добавлено Хотя не все) При отправке того же Get Descriptor первый описываю TD типа SETUP, потом в NextTD записываю адрес второго TD типа IN и во втором TD указываю на третий TD типа OUT, Так получается?Что бы уж совсем расставить все точки над и) |
Сообщ.
#682
,
|
|
|
SET_ADDRESS проходит успешно. Потом переставляю HcControlHeadED на адрес ED для первого устройства, но результатом команды GET_DESCRIPTOR является 1010.
И еще вопрос, поле NextED является указателем на следующий ED этого же устройства или все ED для всех устройств завязаны друг на друге? |
Сообщ.
#683
,
|
|
|
Завтра все подробно расскажу. Надо код посмотреть. Я же пока тебе только по спецификации OHCI да по собственной памяти все говорил. Завтра..
Все ED всех устройств могут быть завязаны друг на друга и таким образом они составляют единую очередь на выполнение транзакций для контроллера. Цитата Modulator @ При отправке того же Get Descriptor первый описываю TD типа SETUP, потом в NextTD записываю адрес второго TD типа IN и во втором TD указываю на третий TD типа OUT, Так получается?Что бы уж совсем расставить все точки над и) Да. Третий TD - последний, не указывает никуда. А что такое 1010? Где оно появляется? |
Сообщ.
#684
,
|
|
|
1010 в ConditionCode
|
Сообщ.
#685
,
|
|
|
1010 reserved (стр. 32). Такого кода не бывает.. Ничего не путаешь? Сделай дамп ED и TD, покажи, что ты пытаешься сделать.
|
Сообщ.
#686
,
|
|
|
Ну, вот, наконец я на работе и посмотрел свои коды.
Вот как все сделано у меня. Есть один 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 (я эти поля просто обнуляю). |
Сообщ.
#687
,
|
|
|
Кто-нибудь сталкивался с такой проблемой.
Есть EHCI с хабом без низкоскоростных контроллеров (generic hub, кажется). То есть всё общение идёт через хаб. Портов от самого контроллера не выведено наружу. Соответственно на плате две таких связки. То есть имеем два контроллера, у каждого хаб. Втыкаю низкоскоростное устройство в порт на одной связке - всё работает. Втыкаю в порт на другой связке : set_address проходит. А получение дескриптора устройства не срабатывает - происходит установка битов babble и halt статуса дескриптора. Запрашиваю, как положено сначала 8 байт. Чтобы узнать MaxPacketSize. При этом, что интересно, судя по выходу, нужных 8 байт он выдаёт. Но что-то выдаёт ещё и происходит babble. Как с этим бороться? Ведь на дескрипторах стоит обработчик halt и babble. Мало ли ошибка. Это тут понятно, что всё нормально, просто что-то ещё выдаёт.. А для общего случая это ошибка. И вообще, почему он выдаёт больше, чем нужно. |
Сообщ.
#688
,
|
|
|
Припоминаю, сталкивался с подобным. Именно babble, и именно через хаб. Решилось подбором времени задержки между выдачей ресета на порт хаба и первым обращением к устройству. Или, может быть, задержкой после SET_ADDRESS. Сейчас точно и не вспомню.
Там у меня есть задержки в нескольких местах - после включения питания порта хаба, после ресета (Port Reset), после установки адреса и после SET_CONFIGURATION. Некоторые устройства работают и без них, а некоторые - нет. Если внимательно вчитаться в полную спецификацию USB, то там допускаются задержки со стороны устройства - например, микропрограмма устройства после старта может делать какую-то свою инициализацию, и, соответственно, неправильно реагировать на запросы хоста. Поэтому во избежание всяких недоразумений я везде поставил по 100 мс - и вроде как проблем больше нет. |
Сообщ.
#689
,
|
|
|
Согласен - с задержками это магия.
Когда писал код под низкоскоростные контроллеры - на то, чтобы подобрать нужные и работоспособные на 95% задержки ушло полгода при возникающих на разных конфигурациях изредка проблемах. А теперь вот EHCI. И ведь многие задержки уже делали по спецификации, но всё равно... магия. Попробую, спасибо. С ними ещё и переборщить нельзя. Иначе устройство в спячку уйдёт... |
Сообщ.
#690
,
|
|
|
Если есть возможность запустить программу в каком-нибудь дебаггере с пошаговым исполнением, то сразу становится ясно, в каком именно месте нужна задержка. Я работал в Borland C 3.1, там все удобно - можно сразу же править и запускать.
Насчет спячки - у меня проблем не было. Пока порт включен и контроллер посылает SOF, устройство засыпать не должно. |