
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (51) « Первая ... 19 20 [21] 22 23 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#301
,
|
|
|
Есть такой драйвер DUSE называется. Но работате он очень криво и насколько я знаю не поддерживается сейчас. Я его пробовал на разных машинах ни на одной нормально не работал. Самый хороший драйвер для USB под DOS usbaspi v 2.27. Работает практически везде. Пробовал его на самых разных машинах. Кое-где есть проблемы с BIOS. Но не поддерживает горячее подключение. Думал хоть в последней версии сделают - нет, фигу ![]() |
Сообщ.
#302
,
|
|
|
Доброго дня!
Народ, интересует вопрос по поводу запроса данных с устройства. Есть девайс с maxPacketSize = 8 байт. Запрашиваю 32 байта - соответственно выстраиваю очередь из одного SETUP и 5 DATA дескрипторов (последний нулевой). Жду, пока в QH.ELinkPointer будет нулевой бит единичкой (как в последнем TD). Если девайс выдаёт все запрошенные данные - всё отлично. Но если устройство отдаёт меньше, например, 0 байт, то как быть? Как проверить, что транзакция фактически завершена, просто оно не может удовлетворить просьбы всех дескрипторов? Неужели по всем дескрипторам пробегаться нужно? Если можно, поделитесь грамотным протоколом =) Спасибо. |
Сообщ.
#303
,
|
|
|
Вроде всегда должен ещё быть выход по таймауту. Соответственно, при нём, пробегая все отработанные дескрипторы, можно определить, сколько получено реально данных.
ВОзможно, но точно не помню, если данных больше нет, то будет приходить NAK (выставляться бит на текущем дескрипторе). Так что можно ещё и так. Я делал через таймаут. Медленне, но проще. |
Сообщ.
#304
,
|
|
|
Доброго времени суток!
Ещё возникла такая проблема: Есть USB 1.1 устройство. На некоторых материнках если оно вставлено до включения компа, оно находится на UHCI контроллере, и всё нормально определяется. Если изначально её не было, и девайс вставить после первого опроса, то при его включении состояние портов UHCI не меняется абсолютно. При этом, USB Legacy support в БИОСе отключен, а при опросе портов я сбрасываю и EHCI, и UHCI контроллеры. Подобное поведение я пока наблюдаю только на одной модели материнок, на остальных всё ок. В чём может быть проблема, не подскажете? |
Сообщ.
#305
,
|
|
|
Попробуй EHCI отключить совсем, сброса не достаточно.
|
Сообщ.
#306
,
|
|
|
Цитата cppasm @ Попробуй EHCI отключить совсем, сброса не достаточно. А каким образом примерно это делается? В спецификации не нашёл нигде такой опции. Мож проглядел... |
Сообщ.
#307
,
|
|
|
У меня такое было.
Или в BIOS Setup отключаешь EHCI или пробегаешь по всем портам EHCI и смотришь на предмет появления нового устройства (порт будет с битом изменения статуса подключения, а может и не быть ![]() Есть подозрение, что ты не запрашиваешь own change. Или не так ресетишь. Так как после ресета все порты всегда отдаются медленным контроллерам. А если ты не забрал владение им, то может быть, как ты описываешь |
Сообщ.
#308
,
|
|
|
Цитата lsvmo @ Или не так ресетишь Нахожу EHCI контроллер среди PCI устройств. Получаю базовый адрес из BAR0 В первый бит USBCMD записываю единицу и жду, пока он сбросится в ноль. Поправь, если не правильно. Но контроллер в таком случае мне ничего не отдаёт =( |
Сообщ.
#309
,
|
|
|
Вот, нашёл в спецификации:
Цитата The Configured Flag (CF) bit (defined in Section 2.3.8), is used to globally set the policy of the routing logic. Each port register has a Port Owner control bit which allows the EHCI Driver to explicitly control the routing of individual ports. Whenever the CF bit transitions from a zero to a one (this transition is only available under program control) the port routing unconditionally routes all of the port registers to the EHCI HC (all Port Owner bits go to zero). While the CF-bit is a one, the EHCI Driver can control individual ports' routing via the Port Owner control bit. Likewise, whenever the CF bit transitions from a one to a zero (as a result of Aux power application, HCRESET, or software writing a zero to CF-bit), the port routing unconditionally routes all of the port registers to the appropriate companion HC. The default value for the EHCI HC’s CF bit (after Aux power application or HCRESET) is zero. Насколько я понял отсюда, бит CF глобально управляет перенаправлением портов на порты компаньонов, и по умолчанию этот бит равен нулю, т.е. все порты отдавать компаньону. Если даже этот бит изначально единичный, то после сброса он должен стать нулевым (он и становится, я проверял), и все порты должны отдаться компаньону. Не понятно, почему этого не происходит. |
Сообщ.
#310
,
|
|
|
Итак, ещё покурив спеки, пришёл к следующему алгоритму:
1. При начальном ресете контроллера ставим CF=1 2. Пробегаемся по всем портам на предмет наличия подключённых устройств. 3. Если находим, проверяем 11-й бит, который указывает на НЕ Hi-speed устройство. 4. Если 11-й бит единичный, производим сброс: 4.1 Записываем в 8-й бит (Port Reset) единицу и 2-й бит (Port Enabled) ноль, предварительно проверив, что контроллер запущен. 4.2 Ждём 5 мс 4.3 Записываем в Port Reset ноль. 4.4 Читаем Port Reset, пока не будем читать оттуда 0 - это означает, что сброс окончательно закончен. 5. Проверяем бит Port Enabled. Если он равен нулю, значит устройство не Hi-Speed, и можно переводить его на компаньона. 6. Выставляем Port Owner в единицу, говоря этим контроллеру, чтобы отдал порт компаньону. Проблема заключается в том, что после ресета значение регистра порта - 1803h = 1100000000011b, т.е. устройство подключено, оно не Hi-Speed, и оно не отдано компаньону. И если выставить в единицу 13-й бит (Port Owner), то значение всё так же остаётся 1803h, даже если после записи подождать (ждал вплоть до секунды). Где я дурак? |
Сообщ.
#311
,
|
|
|
Разобрался. Проблема была в ошибке записи в регистры.
Вобщем, редирект портов компаньону делается либо глобально (Установкой CF бита флага в 1) или отдельно для каждого порта, как я писал выше. CF при этом должен быть 0. |
Сообщ.
#312
,
|
|
|
Здрасте. не сочтите лохом, но у меня проблема. только начинаю работать с usb под DOS на Паскале. есть OHСI и EHСI. в PCI conf space лежат их MemoryBaseAdress : EFFFD000h и EFFFC000h соответственно. Допустим мне нужно изменить регистр OHCI контроллера со смещением 100h (согласно даташиту материнки - это keyboard emulation logic (KEL) - эмулирует usb клаву и мышь как PS/2-шные, надо это отключить очень). Как это сделать? c UHC просто - там IO порты...
Как я понял EFFFD - это физический адрес... Помогите, пожалуйста, вторую неделю безрезультатно копаюсь в инете... подойдет хороший совет или примерчик на любом языке. |
Сообщ.
#313
,
|
|
|
Цитата lojkofob @ Как я понял EFFFD - это физический адрес... Нет, физический адрес тут EFFFD000h Находится вверху 4Гб адресного пространства как и все отображаемые в память устройства. Для доступа к нему надо либо переходить в protected mode, либо в unreal mode. Из реального режима к этим адресам доступа нет, только к первому мегабайту. |
Сообщ.
#314
,
|
|
|
Цитата lojkofob @ начинаю работать с usb под DOS на Паскале Потребуется прямой доступ к физической памяти, что в паскале очень не удобно. Добавлено Цитата lojkofob @ Как это сделать? Также как и в порты, только писать в физическую память. Например если использовать "нереальный" режим через GS, то это может выглядеть например так для записи байта: ![]() ![]() mov EBX, [MemoryBaseAdress] add EBX, [OHCRegister] mov AL, [Value] mov byte GS:[EBX], AL Добавлено ну я думаю, защищенным режимом тебе закорачиваться не стоит т.к. там еще кучу всего писать придется, а вот программ переводящих в унреал предостаточно, можешь почитать Кулакова "программирование на аппаратном уровне" |
Сообщ.
#315
,
|
|
|
Нереальный режим проще в реализации (меньше кода), перешёл и забыл, можно написать на ассемблере 6 функций вида mem_write_8/16/32, mem_read_8/16/32 и пользоваться из Паскаля.
С защищённым тоже не всё так сложно, есть DOS-extender'ы которые многое делают за тебя по переходу в защищённый режим и обработке прерываний. Есть ли такие которые можно с Паскалем использовать не знаю. |