
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.250] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Нет ли у кого каких-нибудь исходников для работы с USB OHCI контроллером. Именно OHCI. Спецификацию я читал, но вся проблема в том, что у меня на домашней машине UHCI. Соответственно я ничего протестировать не могу ![]() Платформа DOS, линуксовые исходники не предлагать ![]() Заранее спасибо. Только не надо говорить что это не реально. |
Сообщ.
#2
,
|
|
|
Что-то все читают и никто не пишет.
Или тема не интересная или исходников таки нет. ![]() Ну помогите хотябы протестировать у кого OHCI есть. Определить можно через DeviceManager в Windows - USB контроллеры-> должно быть Открытый USB хост-контроллер. Ну или прогой моей - она снизу прикреплена (xhci.rar в usb_ohci.rar) Протестируйте прогу ohci.exe, она конечно понятного мало чего выводит, но если систему не завесит уже хорошо. ![]() Обе проги работают только под DOS. Запустите потом с перенаправлением вывода для создания логов: xhci.exe>xhci.log и ohci.exe>ohci.log Логи или сюда приаттачте или на мыло мне: asm386[crazy_dog]mail.ru Если что получится - обязательно сообщу. ![]() Прикреплённый файл ![]() |
Сообщ.
#3
,
|
|
|
cppasm А можно в двух словах что такое OHCI и чем оно отличается от UHCI. Как мне понять OHCI у меня на машине или нет?
|
Сообщ.
#4
,
|
|
|
В двух словах - это другой хост контроллер.
Т.е. у него другой набор регистров и программируется он соответственно по другому. Если ты имеешь в виду преимущества или недостатки для конечного пользователя - они абсолютно эквивалентны: оба реализуют USB интерфейс. UHCI - Universal Host Controller Interface, OHCI - Open Host Controller Interface. UHCI создала Intel с компанией, а OHCI - Microsoft со своей компанией ![]() Как узнать я писал уже выше. Способ 1 (нужна Windows): заходишь в менеджер оборудования, потом USB контроллеры. Если там написано Открытый USB контроллер или Open Host Controller, значит OHCI. Если Универсальный - значит UHCI. Способ 2: качаешь архив прикреплённый выше, там есть прога xhci.exe. Запускаешь в чистом DOS - она всё напишет. Если DOS'a нет, ничего не получится, т.к. эти программы рассчитаны исключительно на DOS. Если не разберёшся - сделай скрин менеджера устройств с развёрнутой веткой USB контроллеры и прикркпи сюда. Я скажу что там у тебя стоит ![]() |
Сообщ.
#5
,
|
|
|
05/28/97-i430VX-2A59GSMBC-00
Цитата ohci USB Controller not detected Цитата xhci USB Controller 0 (UHCI) VENDOR ID = 8086h, DEVICE ID = 7020h ....................... PCI BUS = 0, PCI DEV = 7, PCI FN = 2 ....................... BASE ADDR = 6000h, IRQ = 10 08/10/2004-i865PE-6A79ZG0HC-00 Цитата ohci USB Controller not detected Цитата xhci USB Controller 0 (UHCI) VENDOR ID = 8086h, DEVICE ID = 24D2h ....................... PCI BUS = 0, PCI DEV = 29, PCI FN = 0 ....................... BASE ADDR = BC00h, IRQ = 9 USB Controller 1 (UHCI) VENDOR ID = 8086h, DEVICE ID = 24D4h ....................... PCI BUS = 0, PCI DEV = 29, PCI FN = 1 ....................... BASE ADDR = B000h, IRQ = 5 USB Controller 2 (UHCI) VENDOR ID = 8086h, DEVICE ID = 24D7h ....................... PCI BUS = 0, PCI DEV = 29, PCI FN = 2 ....................... BASE ADDR = B400h, IRQ = 11 USB Controller 3 (UHCI) VENDOR ID = 8086h, DEVICE ID = 24DEh ....................... PCI BUS = 0, PCI DEV = 29, PCI FN = 3 ....................... BASE ADDR = B800h, IRQ = 9 USB Controller 4 (EHCI) VENDOR ID = 8086h, DEVICE ID = 24DDh ....................... PCI BUS = 0, PCI DEV = 29, PCI FN = 7 ....................... BASE ADDR = FC000000h, IRQ = 9 12/04/2002-sis-646-6A6IXG0VC-00 Цитата ohci 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h ................. PCI BUS = 0, PCI DEV = 3, PCI FN = 0 ................. BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h ................. PCI BUS = 0, PCI DEV = 3, PCI FN = 1 ................. BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h ................. PCI BUS = 0, PCI DEV = 3, PCI FN = 2 ................. BASE ADDR = EF012000h, IRQ = 5 //----здесь я жму any key---------- Controller 0 [OHCI revision:1,0] SMM active, request ownership change Wait to SMM asknowledge the ownership change. Reset the controller, wait fo reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPort status: 00000000h RhPort 1, RhPort status: 00000000h //-----здесь система виснет------------ Цитата xhci USB Controller 0 (OHCI) VENDOR ID = 1039h, DEVICE ID = 7001h ....................... PCI BUS = 0, PCI DEV = 3, PCI FN = 0 ....................... BASE ADDR = EF010000h, IRQ = 11 USB Controller 1 (OHCI) VENDOR ID = 1039h, DEVICE ID = 7001h ....................... PCI BUS = 0, PCI DEV = 3, PCI FN = 1 ....................... BASE ADDR = EF011000h, IRQ = 9 USB Controller 2 (OHCI) VENDOR ID = 1039h, DEVICE ID = 7001h ....................... PCI BUS = 0, PCI DEV = 3, PCI FN = 2 ....................... BASE ADDR = EF012000h, IRQ = 5 USB Controller 3 (EHCI) VENDOR ID = 1039h, DEVICE ID = 7002h ....................... PCI BUS = 0, PCI DEV = 3, PCI FN = 3 ....................... BASE ADDR = EF013000h, IRQ = 11 Compaq Deskpro EP/SB series Цитата ohci USB Controller not detected Цитата xhci USB Controller 0 (UHCI) VENDOR ID = 8086h, DEVICE ID = 7112h ....................... PCI BUS = 0, PCI DEV = 20, PCI FN = 2 ....................... BASE ADDR = 1000h, IRQ = 11 02/14/97-i430VX, ITE8680-2A59GL1FC-00 Цитата ohci USB Controller not detected Цитата xhci USB Controller 0 (UHCI) VENDOR ID = 8086h, DEVICE ID = 7020h ....................... PCI BUS = 0, PCI DEV = 7, PCI FN = 2 ....................... BASE ADDR = 6000h, IRQ = 15 Вот ![]() ![]() |
Сообщ.
#6
,
|
|
|
Спасибо, буду разбираться.
Как я понял OHCI только на одной машине есть. Интересно это случайность или распределение контроллеров именно такое - т.е. OHCI достаточно редко встречается. //-----здесь система виснет------------ Я по коду посмотрел - там вроди виснуть-то негде. Она там ждёт нажатия на кнопку ![]() Вот скачай новую версию, попробуй. И ещё - я так понял (по мелким опечаткам) ты все отчёты руками сюда набивал? Запускай так ohci.exe>ohci.txt и весь отчёт будет в ohci.txt - руками ничего набирать не надо ![]() Попробуй на той машине, где OHCI обнаружилось. А то что xhci.exe USB контроллеры детектит, а ohci.exe нет - это не баг. Просто ohci.exe выводит информацию только об OHCI контроллерах, а xhci обо всех. Спасибо за помощ. Прикреплённый файл ![]() |
Сообщ.
#7
,
|
|
|
Цитата cppasm @ Я по коду посмотрел - там вроди виснуть-то негде. Ага вроде перестала виснуть Цитата cppasm @ Она там ждёт нажатия на кнопку Да вроде жал я на кнопки и не раз вроде... Видать действительно сам че-то не то нажал... Цитата cppasm @ И ещё - я так понял (по мелким опечаткам) ты все отчёты руками сюда набивал? ![]() ![]() просто лень было перекидывать диск, загружать, лезть в инет.. чтоб глянуть с какими параметрами запускать правильно. ![]() вобщем вот лог старой программы Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000000h RhPort 1, RhPortStatus: 00000000h Controller 1 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000000h RhPort 1, RhPortStatus: 00000000h Controller 2 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000000h RhPort 1, RhPortStatus: 00000000h вот той что посвежее Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h RhPort 1, RhPortStatus: 00000100h Controller 1 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Controller 2 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001302h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h |
Сообщ.
#8
,
|
|
|
Нашлась одна ошибочка пока.
Спецификацию бы нормально написали, а то блин биты путают ![]() Попробуй ещё эту программу. И если можешь - подключи какое-нибудь USB устройство перед запуском. Извини что надоедаю, но что делать... Прикреплённый файл ![]() |
Сообщ.
#9
,
|
|
|
Лог новой программы
Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h RhPort 1, RhPortStatus: 00000100h Controller 1 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Controller 2 [OHCI revision: 1.0] SMM active, request ownership change. Wait to SMM acknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h тоже с подключенной флешкой Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h RhPort 1, RhPortStatus: 00000100h Controller 1 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Controller 2 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h RhPort 1, RhPortStatus: 00000100h да, и в течение всех экспериментов к одному из портов оказывается был подключен дата кабель телефона. вот это надо полагать к нему относится Цитата Controller 0 [OHCI revision: 1.0] ....... RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h ...... извиняюсь если ввел в заблуждение |
Сообщ.
#10
,
|
|
|
Спасибо, в заблуждение не ввёл
![]() А про биты ты правильно догадался - это к нему относится. Я так и понял, что что-то подключено было, но уже после того как пост отправил. Теперь вроди всё как надо - буду дальше продвигаться. Пора уже с устройством пообщаться ![]() |
Сообщ.
#11
,
|
|
|
Попробуй ещё вот это.
![]() Как всегда создай лог. Но если вдруг повиснет при запуске, запусти с выводом на экран и напиши последние выводимые строки. Если это чудо будет работать как надо - следующий вариант уже будет с выводом детальной информации о подключённых устройствах. Огромное спасибо за помощ. Прикреплённый файл ![]() |
Сообщ.
#12
,
|
|
|
Эта версия на экран ничего не выводит, в логи ничего не пишет. Если к USB чего-нибудь подключено перезагружает машину, если не подключенно - просто вешает.
|
Сообщ.
#13
,
|
|
|
На экран вообще ничего не выводит, или ничего нового?
Ты может после Windows прогу запускал (Завершение работы->Перезагрузить в режиме MS-DOS для Win98)? Просто Windows после себя любит устройства отключать. Попробуй не грузить Windows. Пробовать надо с подключённым устройством. Ну и я сейчас ещё по коду пройдусь, может чего найду... Попробуй ещё раз. Ниже в архиве мои попытки что-то выяснить. Там два файла - ohci_1.exe и ohci_2.exe, попробуй, может хоть какой-то будет работать. Прикреплённый файл ![]() |
Сообщ.
#14
,
|
|
|
Цитата cppasm @ На экран вообще ничего не выводит, или ничего нового? вообще ничего Цитата cppasm @ Ты может после Windows прогу запускал винды на диске нет, чистый дос Цитата cppasm @ Попробуй не грузить Windows. я делал так -выключаю комп -вытаскиваю диск с виндой -подключаю диск с досом -включаю комп (загружается соответственно дос) думаю таких мер должно быть достаточно ![]() Цитата cppasm @ Пробовать надо с подключённым устройством. и так и так пробовал... Цитата cppasm @ Попробуй ещё раз. то же самое т.е.: Цитата SomeOtherOne @ на экран ничего не выводит, в логи ничего не пишет. Если к USB чего-нибудь подключено перезагружает машину, если не подключенно - просто вешает. пробовал запускать прогу из под отладчика - в отладчике все шоколадно, т.е. все программа прощелкивается, корректно завершается, даже логи пишет... ниче не виснет. если просто так запускать - вешается.. вот логи Цитата ohci_1 Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h -->> Device Connected, Enable Port: RhPort 0, RhPortStatus: 00000103h <<-- RhPort 1, RhPortStatus: 00000100h Controller 1 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Controller 2 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Turbo Debugger Version 5.0 Copyright © 1988,96 Borland International Цитата ohci_2 Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h -->> Device Connected, Enable Port: RhPort 0, RhPortStatus: 00000103h <<-- Ctrl ND\Start\TimeOut\Stop\Status=00000000h Ctrl RD\Start\TimeOut\Stop\Status=F0000000h Ctrl RD\Start\TimeOut\Stop\Status=F0000000h Ctrl ND\Start\TimeOut\Stop\Status=F0000000h RhPort 1, RhPortStatus: 00000100h Controller 1 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Controller 2 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h Turbo Debugger Version 5.0 Copyright © 1988,96 Borland International Может ты где нибудь задержку не выдерживаешь? |
Сообщ.
#15
,
|
|
|
Да блин вообще дело дрянь
![]() И где глюки-то... Ну попробуй ещё вот эти два варианта - может какой-нить будет работать. По сравнению с прошлым рабочим вообще минимум изменений. А насчёт вывода на экран, ты наверно запускал так же ohci.exe>ohci.txt. Просто так она должна в лог писать, но если зависон происходит или ребут, то буфера не сбрасываются и файл пустой. Попробуй просто запускать - ohci.exe, тогда вывод на экран будет. Ну это я так - на всякий случай. ![]() Прикреплённый файл ![]() |
Сообщ.
#16
,
|
|
|
Цитата cppasm @ Ну это я так - на всякий случай. не тот случай... скриншоты программ из поста намбер 15 Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 //-------------жмем any key--------- Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. SMM active, request ownership change Wait to SMM asknowledge the ownership change. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h -->> Device Connected, Enable Port: RhPort 0, RhPortStatus: 00000103h <<-- RhPort 1, RhPortStatus: 00000100h //-------жмем any key------------- //------дальше висим-------------- Цитата Detecting USB Controllers... 3 USB Controller(s) detected USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 BASE ADDR = EF010000h, IRQ = 11 USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 BASE ADDR = EF011000h, IRQ = 9 USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 BASE ADDR = EF012000h, IRQ = 5 //----------жмем any key--------- Controller 0 [OHCI revision: 1.0] Reset the controller. Wait for reset completition. SMM active, request ownership change Wait to SMM asknowledge the ownership change. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00010101h -->> Device Connected <<-- RhPort 1, RhPortStatus: 00000100h //-------жмем any key------------- //------дальше висим-------------- Нашел еше одну маму с OHCI 01/13/2003-sis-648-6A7I0G0DC-00 на ней все программы работают аналогично (как описано выше) сходство побитное, единственное отличие - прерывания заведены не в том порядке, а в остальном логи - один в один, и виснет в том же месте Добавлено Если подключить флешку к другому порту то такая картина Цитата ... bla-bla-bla ... //----------жмем any key--------- Controller 0 [OHCI revision: 1.0] SMM active, request ownership change Wait to SMM asknowledge the ownership change. Reset the controller. Wait for reset completition. Power on the Root Hub, wait Power On to Power Good time. RhDscA: 01001002h, RhDscB: 00000000h, RhSts: 00000000h RhPort 0, RhPortStatus: 00000100h RhPort 1, RhPortStatus: 00000100h //-------жмем any key------------- //------дальше висим-------------- |
Сообщ.
#17
,
|
|
|
Ну попробуй ещё вот это.
Блин, не могу ошибку найти ![]() Прикреплённый файл ![]() |
Сообщ.
#18
,
|
|
|
была замечена такая штука: если проги из поста 15 сначала запустить с выводом в файл то после этого они начинают работать и с выводом на экран, но если сразу на экран то система вешается. Кстати этим грешил имхо и самый первый твой вариант
![]() ![]() Добавлено Цитата cppasm @ Ну попробуй ещё вот это. то же самое. запускаем без параметров - зависает. Запускаем с выводом в файл - создает файл, и после этого перестает виснуть при выводе на экран. |
Сообщ.
#19
,
|
|
|
Так-с, а это уже интересно...
Видать точно гдето с задержками глюки... Буду смотреть. |
Сообщ.
#20
,
|
|
|
Попробуй ещё вот эти два варианта.
Пробуй уже с выводом на экран наверно, чтоб виснуть перестало... Там в архиве два файла: ohci_1.exe и ohci_2.exe (где-то это уже было ![]() Надеюсь какой-то из них работать будет. В ohci_1.exe я задержек понавтыкал где только можно было, ну а в ohci_2.exe чуть поменьше. Не хотелось бы и лишние ставить... Прикреплённый файл ![]() |
Сообщ.
#21
,
|
|
|
нифига, все то же самое. файлы пишет, при выводе на экран виснет. Кстати самый первый (после включения питания) лог программ отличается от всех последующих. логи прилагаются... я их там подписал какой когда и при каких условиях.
Ну и раз уж все так плохо то я немного расковырял одну из программ (ohci_1.exe) вот дамп: ![]() ![]() cs:0c4c 1e push ds cs:0c4d 55 push bp cs:0c4e 8bec mov bp, sp cs:0c50 83c506 add bp, 06 cs:0c53 33c0 xor ax,ax cs:0c55 8ed8 mov ds,ax cs:0c57 668b5e00 mov ebx,[bp] cs:0c5b 668b4604 mov eax,[bp+04] cs:0c5f 66678903>mov [ebx],eax ; усе баста, здесь улетаем в открытый космос cs:0c63 5d pop bp cs:0c64 1f pop ds cs:0c65 c3 ret и вот чего я не понял так это то чего это делают 32-разрядные регистры в дос-овском коде? это твои выкрутасы или компилятора? Прикреплённый файл ![]() |
Сообщ.
#22
,
|
|
|
Выкрутасы мои
![]() Просто регистры OHCI контроллера отображаются на адреса памяти, естественно за пределами мегабайта. Для доступа использую нереальный режим (Unreal Mode aka Flat Real Mode) - отсюда и регистры 32-битные. Хотя в принципе есть и компиляторы, которые 32-битные регистры в DOS используют. Ошибка может быть и не здесь, отладчику может это не нравиться, т.к. он в Protected Mode работает. Я конечно извиняюсь, если очень напрягаю, но... Не мог бы ты сказать адрес ОТКУДА идет вызов этой процедуры, просто она вызввается из многих мест. Помогло бы для локализации глюка так сказать... |
Сообщ.
#23
,
|
|
|
попоззжее немножко... впрочем для тебя это будет завтра уже..
|
Сообщ.
#24
,
|
|
|
И если можно значения EAX, EBX в момент зависона.
![]() Ну или хотя-бы AX, BX. |
Сообщ.
#25
,
|
|
|
стек вызовов
![]() ![]() main cs:0155 call 09dc cs:0af4 call 050e cs:0553 call 0c4c значения регистров ![]() ![]() eax=00110100 ebx=00110000 |
Сообщ.
#26
,
|
|
|
Спасибо, буду разбираться...
|
Сообщ.
#27
,
|
|
|
Неа, глюк не там.
Как я и писал - это просто отладчику не нравится. Это первое обращение за пределы мегабайта. Попробуй ещё вот это. Там болжны надписи выводиться типа [LINE=xxx]. Вот напиши на какой строке оно загнётся. И ещё Start Line, там тоже такое будет. Прикреплённый файл ![]() |
Сообщ.
#28
,
|
|
|
cppasm этот вариант не зависает
|
Сообщ.
#29
,
|
|
|
есть такое наблюдение - программа виснет когда ожидает ввод с клавиатуры
и соответствующее предположение - может ты чего не того делаешь с контроллером клавиатуры или контроллером прерываний? Ты там как делаешь? В защищенный режим переключаешься? таблицы дескрипторов настраиваешь? Дай чтоли исходники глянуть, чего там у тебя наворочено... |
Сообщ.
#30
,
|
|
|
Щас вышлю, если успею "причесать"...
Я просто уезжаю, так что продолжим в сентябре. ![]() У меня к тому времени доступ к контроллеру появится - думаю станет попроще немного ![]() Но должен успеть. |
Сообщ.
#31
,
|
|
|
Однако не я один такой, кто под дос USB пытается заставить работать.
Я сейчас занимаюсь написанием драйвера под ДОС для работы с USB флешками (с поддержкой "горячей" замены носителей). Есть сырая прога в виде EXE'шника которая работает с OHCI контроллером. Соответственно есть исходники (правда почти без коментариев) на C++. Готов поделиться опытом ICQ 93159686 |
Сообщ.
#32
,
|
|
|
Цитата Gerret @ Однако не я один такой, кто под дос USB пытается заставить работать. Не один ты такой, это точно. Шарил везде и много... Тема очень ВСЕМ нужна и её все муссируют и ломают голову, как? У меня она в отложенном состоянии... быть может к осени возобновлю интерес. Проект - ОСь. Пишем на FASM. Пройти мимо USB не удастся. Рад был бы если создастся "инициативная группа" по борьбе с USBями ![]() ДОС приветствую! Самое то, для изучения железа и солидные "арсеналы вооружения" для изучения, отладки. Скачал, посмотрю у себя и попробую если то. Постараюсь ответить. Как ВАМ книжень Кулакова в аспекте освещения USB? Кто может высказаться относительно инфы там изложенной и её полноты, корректности и пр.? Спасибо. |
Сообщ.
#33
,
|
|
|
Нифига не удалось потестить, кругом только универсальные... жаль.
|
Сообщ.
#34
,
|
|
|
Цитата Рад был бы если создастся "инициативная группа" по борьбе с USBями ![]() Почему бы и нет! Я только ЗА! Цитата Как ВАМ книжень Кулакова в аспекте освещения USB? Кулаков - супер! Если бы не он, фиг бы у меня что-нибудь получилось! Больше всего пригодился пример линейной адресации памяти. Про USB у него написано много и хорошо, но только применительно к UHCI контроллеру. Но для изучения основ, как работает USB контроллер, просто незаменимая информация! Я ухитрился, таки, заставить читаться UBS флешку под досом, но до полноценного драйвера руки так и не дошли... Писалось это под OHCI контроллер (т.к. на материнке он стоял), но в дальнейшем планируется сделать универсальный драйвер, который бы поддерживал все контроллеры. Так что если у кого-то еще есть подобный опыт, давайте делиться!!! ![]() |
Сообщ.
#35
,
|
|
|
USB клавиатура работает из BIOS-а до загрузки ОСи, может можно поделиться кодом
|
Сообщ.
#36
,
|
|
|
Кодом чего??? С клавиатурой работает драйвер BIOS-a (если конечно BIOS не очень старый)... А все приложения видят ее как самую обычную клавиатуру PS/2 и обращения к ней из ДОСа идут через стандартное клавиатурное преывание. Тоже самое и с мышой!
|
Сообщ.
#37
,
|
|
|
кодом драйвера usb из bios-а. там-то решены уже те вопросы которые вы сейчас пытаетесь понять
|
Сообщ.
#38
,
|
|
|
да уж, это было бы удачно, но где его взять, этот код?
|
Сообщ.
#39
,
|
|
|
2cppasm:
http://forum.codenet.ru/showthread.php?threadid=25928 |
Сообщ.
#40
,
|
|
|
Supervisor большое спасибо за информацию!!!
|
Сообщ.
#41
,
|
|
|
Спасибо, буду смотреть.
![]() Я раньше читал Кулакова, "Программирование на аппаратном уровне", 2 издание. Там USB описана, но из контроллеров только UHCI. Я примерно разобрался, сейчас это всё оформляю. У меня дома UHCI. С OHCI сложней - без живой железяки тестировать некак. Придётся с друзьями договариваться. |
Сообщ.
#42
,
|
|
|
Люди, а кто-нибудь эту книгу в руках держал??
Ценная информация в ней есть? Просто я было собрался даже покупать - но посмотрел оглавление: про каждый тип хост-контроллеров по 10-15 страниц (в официальной спецификации страниц по 100), про флеши, принтеры и ещё чего-то там по 1 странице. Меня сомнения мучать стали... Если кто читал - какие впечатления? |
Сообщ.
#43
,
|
|
|
Я имел неосторожность купить эту книжку
![]() В общем, там про OHC и прочие хосты написано по минимуму... У меня сложилось впечатление, что автор просто прочитал документацию на хост контроллеры и кратко изложил основные понятия... там нет ничего, ни про инициализацию, ни про настройку контроллеров... только про структуры данных, которыми оперирует контроллер и описание его регистров в виде таблицы! Так, что я не уверен, что тебе она очень пригодится. (я, например, расстроился, когда ее открыл ![]() В это книге в основном про PCI и FireWire написано! Про USB так, слегка, для общего развития ![]() |
Сообщ.
#44
,
|
|
|
Цитата Gerret @ я, например, расстроился, когда ее открыл ![]() Сочувствую. ![]() Просто меня объём материала смутил, я пока не покупал. Теперь наверное уже и не буду. |
Сообщ.
#45
,
|
|
|
У кого OHCI контроллер есть - попробуйте plz прогу.
Должна кучу всякого на экран выводить - главное виснуть не должна ![]() Ну и если можно киньте потом сюда лог. Для создания лога запускать ohci.exe>log Только под DOS. Прикреплённый файл ![]() |
Сообщ.
#46
,
|
|
|
cppasm, рекомендую тебе купить ohci-usb контроллер. Стоит всего 200-300руб, зато тестить драйвер будешь на своей машине...
|
Сообщ.
#47
,
|
|
|
Да есть такие мысли
![]() А как насчёт результатов? Я сегодня у друга попробовал - вроди работает. |
Сообщ.
#48
,
|
|
|
Попробовал прогу! Вот результаты:
![]() ![]() Detecting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 OHCI 0: rev 1.0, no legacy support. Reset Host Controller Host controller state: UsbOperational Reset Host Controller 0. Return control to SMM. SMM did not responce. Host controller state: UsbReset Ты, к стати, не пробовал еще с прерываниями от него работать? |
Сообщ.
#49
,
|
|
|
Я тож попробывал
![]() ![]() ![]() Detecting OHCI USB Controllers... 3 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 0 MM BASE = EF001000h, IRQ = 11 OHCI USB Controller 1: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 1 MM BASE = EF002000h, IRQ = 9 OHCI USB Controller 2: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 3, PCI FN = 2 MM BASE = EF003000h, IRQ = 5 OHCI 0: rev 1.0, no legacy support. SMM active, request ownership change. Reset Host Controller. Host controller state: UsbOperational OHCI 1: rev 1.0, no legacy support. SMM active, request ownership change. Reset Host Controller. Host controller state: UsbOperational OHCI 2: rev 1.0, no legacy support. SMM active, request ownership change. Reset Host Controller. Host controller state: UsbOperational Reset Host Controller 0. Return control to SMM. SMM did not responce. Host controller state: UsbReset Reset Host Controller 1. Return control to SMM. SMM did not responce. Host controller state: UsbReset Reset Host Controller 2. Return control to SMM. SMM did not responce. Host controller state: UsbReset |
Сообщ.
#50
,
|
|
|
Всем спасибо - буду двигаться дальше.
С прерываниями ещё не работал. Ещё блин одна проблемма объявилась - при запуске проги я управление контроллером у SMM забираю, а при выходе пытаюсь вернуть. А обработчик SMM (чмо) назад управление брать не хочет - что ему не нравится блин ![]() Так что у кого USB клавиатура или мышь лучше не запускать, возможно она повиснет просто до перезагрузки. Ну клавиатура так точно повиснет ![]() Управление то программой с клавиатуры происходит, а эмуляция отключается (USB драйвера ясен пень нет пока). Единственное можно запустить на создание лога - там от клавиатуры ничего не требуется. |
Сообщ.
#51
,
|
|
|
Прикольно - у вас обоих материнка SiS, ну или по крайней мере USB контроллер
![]() Такс, ну типа апдейт. Должен подключённые устройства детектить (только детектить). Вроди исправил баг с SMM. В общем просьба ещё раз потестировать. Прикреплённый файл ![]() |
Сообщ.
#52
,
|
|
|
Держи
![]() ![]() Detecting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 OHCI 0: rev 1.0, legacy support. Reset Host Controller. Host controller state: UsbOperational Detecting USB Devices... OHCI HC 0, NumberDownstreamPorts=3. Port 0, PortStatus=00000100h Device not connected. Port 1, PortStatus=00010101h Device connected. Port 2, PortStatus=00000100h Device not connected. 1 USB Device(s) detected Reset Host Controller 0. Return control to SMM. SMM did not responce. Host controller state: UsbReset А ты как возврщаешь управление SMM? просто еще раз Owenership change делаешь повторно? Добавлено О! я нашел возможную ошибку с передачей управления обратно SMM: ты делаешь ресет перед сменой владельца. Как я понял из описания: Цитата The OS driver should deconfigure all the devices on the USB, clear all interrupt masks, and disable all list processing. The OS driver should then write a one to the OwnershipChangeRequest bit in the HcCommandStatus register... ресет делать не надо. |
Сообщ.
#53
,
|
|
|
Да, делаю ещё раз OwnershipChange.
Может и не надо ресетить ![]() Там ещё ко всему надо чтоб прерывание по OwnershipChange было разрешено - это я поправил. Как видно не помогло. А не ресетить стрёмно как-то - вдруг BIOS SMM нет вообще, а хостконтроллер и дальше будет в рабочем состоянии и в HCCA писать будет. Конфликты возможны с himem например. PS: а это правда хоть что одно устройство подключено? ![]() |
Сообщ.
#54
,
|
|
|
Цитата cppasm @ а это правда хоть что одно устройство подключено? А как же ![]() Цитата cppasm @ А не ресетить стрёмно как-то - вдруг BIOS SMM нет вообще, а хостконтроллер и дальше будет в рабочем состоянии и в HCCA писать будет. Так ты сбрасывай все адреса, в том числе HCCA. Если адрес 0, то туда ничего не пишется... |
Сообщ.
#55
,
|
|
|
Так-с. Ещё одна попытка.
Там в архиве 2 ехе-шника. Больше надежда на второй ![]() Может какой будет всё-таки работать. Я во втором сделал так - вернуть управление, подождать 10мс, если SMM не отвечает - тогда ресет. Вроди должно быть всё ок. Если не будет работать, тогда наверно ну его, этот SMM вместе с эмуляцией ![]() Прикреплённый файл ![]() |
Сообщ.
#56
,
|
|
|
LOG 1
![]() ![]() Detecting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 OHCI 0: rev 1.0, legacy support. Reset Host Controller. Host controller state: UsbOperational Detecting USB Devices... OHCI HC 0, NumberDownstreamPorts=3. Port 0, PortStatus=00000100h Device not connected. Port 1, PortStatus=00010101h Device connected. Port 2, PortStatus=00000100h Device not connected. 1 USB Device(s) detected Reset Host Controller 0. Return control to SMM. SMM did not responce. Host controller state: UsbReset LOG 2 ![]() ![]() Detecting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 OHCI 0: rev 1.0, legacy support. Reset Host Controller. Host controller state: UsbOperational Detecting USB Devices... OHCI HC 0, NumberDownstreamPorts=3. Port 0, PortStatus=00000100h Device not connected. Port 1, PortStatus=00010101h Device connected. Port 2, PortStatus=00000100h Device not connected. 1 USB Device(s) detected Return control to SMM. SMM did not responce, resetting. Host controller state: UsbReset |
Сообщ.
#57
,
|
|
|
Ну и фиг с ним
![]() Попробуй ещё это - тут уже должны транзакции проходить. Если всё ок - должна выводиться информация о подключённых устройствах. Надеюсь работает. Завтра сам попробую. Спасибо за содействие. Прикреплённый файл ![]() |
Сообщ.
#58
,
|
|
|
Странная тема получается... Если я запускаю программу из под ДОС-Навигатора, то я вижу:
![]() ![]() ============================================================================ ENDPOINT DESCRIPTOR ============================================================================ EndpointAddress : E8h (08h IN) Attributes : 62h (Bulk pipe) MaxPacketSize : EB05h Interval : 246ms причем это я вижу 2-а раза... И как ты сам видишь, значения не коректные! А вот если я выхожу из навигатора и запускаю ее просто из командной строки, то кроме информации о контроллере и о том, что есть подключенное устройство, больше ничего не показывается... лог создавать пробовал, но в нем тоже только про контроллер... Я посмотрел ту область памяти, куда указывают HcHCCA и HcControlHeadED, там у меня что-то лежит... но ни как не дескрипторы передачи! Да, к стати, не очищай после своей программы регистры контроллера (ресет не делай), а то сложно понять, была ли вообще транзакция. И еще, я тут ставлю експерименты по поводу полноценного драйвера (даже нечто получается) и вот если мой драйвер загружен, то при запуске твоей программы комп ребутится... с предыдущими версиями такого не было! P.S. Я тут чисто случайно наткнулся на странную возможность программно защитить флешку от записи ![]() ![]() |
Сообщ.
#59
,
|
|
|
Насчёт защиты от записи - ничего такого не знаю...
У меня блин уже голова кругом идёт ![]() У тебя на машине случайно EHCI нет, или только OHCI? Сегодня попробовал на машине с EHCI - полный капец. Короче система такая - думаю как EHCI работает знаешь. Ну вкратце - он всегда стоит с компаньёном - OHCI или UHCI. EHCI обрабатывает только Highspeed устройства, остальные отдаёт компаньёнам. После ресета все порты отданы компаньёнам, безразлично какое устройство подключено. Точнее наоборот - он не отдаёт, а забирает себе только Highspeed устройства, но для этого его надо сконфигурировать. Это типа круто - если в системе нет дров EHCI, но есть дрова для компаньёна всё работать будет - только скорость ниже. Так вот втыкаю я сегодня флэшку, запускаю прогу - нет устройства... Все порты перепробовал. Грешил на BIOS, что вмешивается - но эмуляция отключена. Чё за нафиг??? По поводу программы - убрал ресет в конце, добавил дамп дескрипторов после транзакции. Надеюсь что-то прояснится. Если можешь скинь мне на мыло процедуру транзакции, например control_read. Прикреплённый файл ![]() |
Сообщ.
#60
,
|
|
|
Цитата cppasm @ У тебя на машине случайно EHCI нет, или только OHCI? Нет, на той машине, где я эксперименты ставлю, только OHC. Цитата cppasm @ Сегодня попробовал на машине с EHCI - полный капец. Ага, у меня была похожая история. Я начинал разбираться с USB с контроллера UHC... так вот мне удалось заставить его получать дескриптор устройства с мого MP3 плеера (USB 1.1), а когда я к нему подключал любую флешку с USB 2.0, то все транзакции заканчивались, типа, устройство не отвечает, хотя на порте определялось наличие устройства. Ух долго я с этим бился... пока не прочитал про EHC и не отключил его в биосе. Я до понедельника не смогу проверить твою прогу, машина с OHC на работе. Да и с процедурой транзакции тоже самое, все исходники на той же машине ![]() ![]() |
Сообщ.
#61
,
|
|
|
Я так понял с EHCI мне тоже ещё предстоит разбираться...
Пока тоже просто в BIOS отключу. А насчёт завершения транзакции - я точно также делаю, слово в слово ![]() Просто этот метод я из UHCI взял, там по другому практически нельзя, прерывания то есть, но от какого дескриптора оно пришло определить нельзя. В OHCI хоть DoneQueue есть. Хотя в общем мне UHCI проще в программировании показался, хотя пишут, что он большие требования к софту выдвигает. Типа в OHCI многие вещи аппаратно реализованы, а в UHCI программно приходится делать. Но единственное с чем я столкнулся, так это с тем, что в OHCI есть прерывание по подключению/отключению устройства, а в UHCI нет - я на таймер вешал процедуру и проверял биты состояния порта. А в общем с UHCI вроди проще - может потому что тестировать мне легче (дома он у меня), да и примеры из Кулакова помогают. И ещё такой вопрос - ты при транзакции (например control_read) данные на какие блоки разбиваешь?? Ну тоесть в одном дескрипторе какой размер данных указываешь?? Я wMaxPacketSize для Endpoint0, а пока неизвестно - во время инициализации - 8б. Может в этом трабла?? |
Сообщ.
#62
,
|
|
|
Цитата cppasm @ ты при транзакции (например control_read) данные на какие блоки разбиваешь?? Напиример для запроса дескриптора устройства я делал так: потом повторяем процедуру, но в дескрипторе приема указываем полный размер дескриптора устройства (если конечно конечная точка 0 устройства поддерживает такой объем). А вообще для OHC в том вся прелесть, что в дескрипторе передачи можно указывать длину больше, чем конечная точка может воспринять, он сам разберется, как ему осуществить такую транзакцию ![]() Я, например, при чтении/записи на флешку создаю один дескриптор с объемом данных 512 байт и контроллер сам спокойно это съедает ![]() |
Сообщ.
#63
,
|
|
|
Спасибо! По исходникам Linux и FreeBSD я так и понял.
Но вроди размер блока (кроме последнего) должен быть кратен wMaxPacketSize и не должен больше раза пересекать границу 4Кб. На счёт кратности не уверен. Т.е. блоки размером больше 4Кб в одном дескрипторе описывать не желательно. При 4Кб блоке пересечений границы больше 1 не будет 100% |
Сообщ.
#64
,
|
|
|
Я проверил твою прогу и вот результат:
![]() ![]() Detcting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 Detecting USB Devices... Ctrl ND: ED[0]=00080000h; ED[1]=00120030h; ED[2]=00120021h; ED[3]=00000000h; TD00[0]=5EE40000h; TD00[1]=0002D67Eh; TD00[2]=00000000h; TD00[3]=0002D685h; TD01[0]=1A2B01A0h; TD01[1]=007006F4h; TD01[2]=08110016h; TD01[3]=007006F4h; TD02[0]=FFFFFFFFh; TD02[1]=FFFFFFFFh; TD02[2]=FFFFFFFFh; TD02[3]=FFFFFFFFh; После всего этого машина повисла, но не совсем (NUM LOCK работет)... Такое ощущение, что она в бесконечный цикл ушла... Небольшой разбор полученых данных: Из ED[2] - ошибка при обработке TВ00 В TD00[0] стоит код, что устройство не отвеает. В TD00[2] должен, по идее, быть адрес TD01. TD01[0]=1A2B01A0h - странное значение... я бы даже сказал, не правильное TD01[1] если идет передача без данных, то указатель на буфер должен быть равен 0 TD01[2]=08110016h - странное значение... Цитата cppasm @ Но вроди размер блока (кроме последнего) должен быть кратен wMaxPacketSize... Кратность совершенно не обязательна... пакеты с длиной 1, 31 или 13 байт, ухотят и приходят ![]() |
Сообщ.
#65
,
|
|
|
Обнаружил в коде ДУРАЦКУЮ ошибку...
Проги надо на свежую голову писать ![]() Насчёт кратности - мы друг друга не поняли. Например такое возможно: SETUP, read 13b, write 0b (ACK) Но если блок данных большой - больше 1 пересечения границы в 4Кб - его нужно разбивать на разные TD. И такое уже не возможно: SETUP,read 65b, read 63b, write 0b (ACK) при wMaxPacketSize=64b. Т.е. граница TD не должна попадать внутрь пакета. Отсюда требование чтобы размер блоков данных кроме последнего был кратен размеру пакета (wMaxPacketSize). Если найду в спецификации - зацитирую. Значится другие траблы появились. Отрубаю в BIOS USB2.0. Поиск устройства - нет его и всё (флэшка вставлена). Гружу Win - она находит. Завтра ещё дрова под DOS попробую - может и со сбросом у меня какие-то нелады. Но с другой стороны у тебя ж детектит... Прикреплённый файл ![]() |
Сообщ.
#66
,
|
|
|
Цитата cppasm @ Насчёт кратности - мы друг друга не поняли Да, действительно ![]() Результат остальзя тотже, что и в прошлый раз... машина виснет! Проверь условие выхода из цикла ожидания завершения транзакции. И еще в TD00 запиши адрес следующего TD, а то не понятно, что контроллер должен обрабатывать после первого. А ресет порта делается перед транзакцией? Извени, что указываю на такие очевидные вещи ![]() ![]() P.S. Сделай прогу, чтобы она не ждала завершения транзакции! Пусть она запускает транзакцию и вываливается в ДОС, я помторю, что там в памяти творится. P.P.S В приложении есть файлик с функциями для осуществления SETUP транзакций и два файла со структурами (на асме). Это кусок моего драйвера, посмотри, должно помоч ![]() Добавлено Цитата Gerret @ Отрубаю в BIOS USB2.0. Поиск устройства - нет его и всё (флэшка вставлена). Когда я начинал разбираться с OHC, написал прогу, которая в цикле считывала и показывала мне значения в регистрах контроллера. Попробуй и посмотри, что происходит внутри контроллера при подключении и отключении флешки. Прикреплённый файл ![]() |
Сообщ.
#67
,
|
|
|
Такой вопрос - что указывать в MPS в ED.
wMaxPacketSize или максимальный передаваемый блок данных, описанный в одном TD? Я к первому склоняюсь, но всё-же. Ресет делаю, по поводу TD не понял - вроди там всё Ок должно быть (откуда 0???), сейчас буду смотреть. |
Сообщ.
#68
,
|
|
|
Цитата cppasm @ Такой вопрос - что указывать в MPS в ED. wMaxPacketSize! |
Сообщ.
#69
,
|
|
|
Значит так.
Сделал я прогу - запускает одну транзакцию, ждёт нажатия на кнопку и выходит. Команда - SET_ADDRESS, т.е. Control Nodata. ED_ADDR=0x120000, TD_ADDR=0x120010 TD идут друг за другом. Если что выяснишь - сообщи ![]() Прикреплённый файл ![]() |
Сообщ.
#70
,
|
|
|
Нуууу... ничего, ровным счетом не изменилось...
В памяти по этим адресам я вижу только то, что раньше выводила твоя программа: ![]() ![]() 00120000: 00 00 08 00 30 00 12 00 21 00 12 00 00 00 00 00 00120010: 00 00 E4 5E C0 BA 02 00 00 00 00 00 C7 BA 02 00 00120020: 00 00 F4 F3 00 00 00 00 30 00 12 00 00 00 00 00 По адресу, (02BAC0h) где должен лежать USB Request какая-то лабуда находится: ![]() ![]() 0002BAC0: 13 19 46 72 12 0E 00 00 5E 05 F4 FF 25 0E 00 00 В общем вот! Давай попробуем так: подготавлизай все дескрипторы и запрос, но транзакцию не запускай. Помотрим что там изначально. P.S. Перемести, плиз, дескрипторы куда-нибудь по дальше, к примеру в 500000h, а то твоя прога затирает кусок swap'a от DosNavigator'a и он работать после этого отказывается. Приходится из под голого доса ее грузить. Добавлено Во блин! после последнего эксперимента у меня с диска С пропал io.sys ![]() |
Сообщ.
#71
,
|
|
|
Вот - переместил всё на адреса 600000h, 600010h, транзакцию не запускаю.
Я проверил - список TD нормально создаётся. Насчёт USB Request - он в стеке создаётся, и когда ты смотришь уже возможно затёрт. И тут до меня дошло! А ведь дескрипторы те которые ты написал ПРАВИЛЬНЫЕ. ![]() Просто контроллер обработал первый TD, изменил HeadP. Обработанный TD поместил в DoneQueue - а там своя очередь, и этот TD в ней последний, поэтому NextTD=0. Но остаётся вопрос с тем, почему устройство не отвечает... Посмотри состояние порта - может я его разрешаю неправильно. В общем, что можешь сказать по поводу: Reset HC: ![]() ![]() void ohci_init(HC *hc,int hcn) { int i,k; dword HCCA=0x500000; for(i=0;i<hcn;i++) { // Initialize HCCA. Setup interrupt ED. for(k=0x00;k<0x080;k++) writed(HCCA+k,ED); for(k=0x80;k<0x100;k++) writed(HCCA+k,0); // If SMM active - request ownership change. if(readd(hc[i].base+0x04) & 0x100) { writed(hc[i].base+0x08,0x08); for(k=0;k<10 && (readd(hc[i].base+0x04) & 0x100);k++) delay(1); } // Reset HC, enter UsbReset state. writed(hc[i].base+0x04,0x00); delay(10); // Reset HC, HC enters UsbSuspend state. writed(hc[i].base+0x04,0x00); delay(10); // Reset HC, HC enters UsbSuspend state. writed(hc[i].base+0x08,0x01); // Wait for reset completition. for(k=0;k<10 && (readd(hc[i].base+0x08) & 0x01);k++) delay(1); // Set HCCA physical address. writed(hc[i].base+0x18,HCCA); HCCA+=0x100; // Set Control head ED. writed(hc[i].base+0x20,ED); // Set Bulk head ED. writed(hc[i].base+0x28,ED); // Disable all HC interrupts. writed(hc[i].base+0x14,0xFFFFFFFF); // Enable interrupt (SMI) on ownership change. writed(hc[i].base+0x14,0xC0000000); // Start Host Controller. // Set UsbOperational state. // Disable Periodic List, Isochronous List, // Control List and Bulk List processing. writed(hc[i].base+0x04,0x80); // Set Frame Interval. writed(hc[i].base+0x34,0x27792EDF); // Set Periodic Start (90%). writed(hc[i].base+0x40,0x00002A2F); // Root Hub ports are power switched. // All ports are powered at the same time. writed(hc[i].base+0x48,readd(hc[i].base+0x48) & 0xFFFFFCFF); // Turn on power to all ports. writed(hc[i].base+0x50,0x10000); // Wait Power On to Power Good time. delay((readd(hc[i].base+0x48)>>23) & 0x1FE); } } PortEnable: ![]() ![]() // Enable Port of USB Controller. writed(hc[i].base+port,0x001F0002); Может тут что не правильно, или лишнее, или порт обязательно ресетить надо (я не ресечу, только HC). Я транзакцию не запускаю - посмотри какие дескрипторы будут. Прикреплённый файл ![]() |
Сообщ.
#72
,
|
|
|
Reset HC отличный! даже немного есть того, чего я не делал, например "Turn on power to all ports" и прочее связанное с питанием портов
![]() Цитата cppasm @ или порт обязательно ресетить надо Да, обязательно, а то устройство, которое подключено, может иметь любой адрес. Когда ты делаешь ресет, оно выставляет свой адрес в 0 и сбрасывает все свои внутренние регистры. А PortEnable выставлять не надо, когда ты ресет сделаешь, контроллер сам включит порт (ПРОВЕРЕНО!!!). Надо так: ![]() ![]() writed(hc[i].base+port,0x001F0010); delay(20); //можно 10, но я 20 делаю :) А с дескрипторами действительно все ОК! Это я, что-то туплю мольца ![]() Делай обратно транзакцию (без ожидания завершения), но вставь ресет порта, должно заработать. |
Сообщ.
#73
,
|
|
|
Вот.
Сегодня сходил к другу в гости в общагу. У него OHCI, ну я попрограммил немного ![]() Убил пол дня, но сейчас всё работает. Кстати после записи в HCFS UsbReset ресетится вся шина USB, включая подключённые устройства. Так что с этим всё Ок. PortEnable оставил как было. Попробуй. Если вдруг чего - ED=0x520000, TD=0x520010. Прикреплённый файл ![]() |
Сообщ.
#74
,
|
|
|
У меня не работает... она виснет! Я запустил ее через debuger и действительно, она зацикливается в одном месте и никуда не идет больше (крутится в адресах от cs:1027 - cs:1043). В памяти все как и раньше (уст-во не отвечает и т.д.) за исключением того, что теперь в TD00, в ячейке адреса следующего дескриптора, записан его собственный адрес!
Судя по тому, что я в отладчике видел, твоя прога не выходит из цикла ожидания завершения транзакции по флагу Halted в ED. Цитата cppasm @ Кстати после записи в HCFS UsbReset ресетится вся шина USB, включая подключённые устройства. Так что с этим всё Ок. Если тебе не нужен hot-swap то тогда такой вариант работать наверное будет... но если ты хочешь менять флешки налету, то без ресета портов не обойтись. Не будешь же ты весь контроллер переинициализировать, когда новое устройство подключается... |
Сообщ.
#75
,
|
|
|
Такс, буду щас разбираться.
Насчёт горячено подключения - тогда конечно порт ресетить надо. Насчёт того что виснет - там цикл глухой есть. Т.е. если устройство не отвечает - запустить транзакцию ещё раз. А устройство видно жёстко не отвечает. Попробуй вот это - а я счас с ресетом портов забацаю. С отладчиком можешь сильно не усердствовать - не работает и фиг с ним. ![]() Я кажись знаю в чём проблемма... Прикреплённый файл ![]() |
Сообщ.
#76
,
|
|
|
Насчёт того что при PortReset устанавливается PortEnable - верю
![]() Вот из спецификации: ![]() ![]() This bit is also set, if not already, at the completion of a port reset when ResetStatusChange is set or port suspend when SuspendStatusChange is set. Завершения ресета можно ждать по биту PRSC, но я тоже просто задержку вставил. В общем попробуй это - тут с ресетом порта, и из предыдущего поста. Должны вроди обе работать. И ещё один вопрос. В общем у меня на машине UHCI. Я с флэшки читаю дескрипторы - в конфигурации MaxPower=100mA. Потом у друга юзал её под XP. Потом у него же с OHCI получаю дескриптор - MaxPower=300mA. Ну думаю - х.з. - может специфика OHCI. Прихожу домой - 300mA показывает. Я думал может меня глючит ![]() Но есть старые логи - там 100mA, я проверил. Так собственно вопрос. Есть такая штука - SET_DESCRIPTOR. Так вот - она дескриптор записывает только до отключения устройства, или типа перепрошивает его. Я вообще думал, что установка дескриптора до первого ресета устройства действует. По спецификации так и есть. Но я другого объяснения изменения параметров придумать не могу. Может есть какие мысли по этому поводу. XP вообще странные вещи мочит. Вставляю флэшку USB2.0 в UHCI контроллер, а она мне мол Быстрое устройство подключено к медленному порту. Откуда она вообще это знает, устройство ведь в FullSpeed работает. Единственное может по версии USB в дескрипторе устройства. Но с изменением питания мне вообще не понятно. Прикреплённый файл ![]() |
Сообщ.
#77
,
|
|
|
ОН ЖИВОЙ!!! ЖИВОЙ!!!
![]() ![]() Вот лог: ![]() ![]() Detecting OHCI USB Controllers... 1 OHCI USB Controller(s) detected OHCI USB Controller 0: VENDOR ID = 1039h, DEVICE ID = 7001h PCI BUS = 0, PCI DEV = 1, PCI FN = 2 MM BASE = DFFFB000h, IRQ = 5 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 08ECh ProductID : 0008h Device version : 1.0 iManufacturer : 01h iProduct : 02h iSerialNumber : 03h NumConfigurations: : 01h Supported LangID(s) : 0409h Manufacturer : Kingston Product : DataTraveler 2.0 Serial Number : 09319450C2A0A9C4 ======================================================================== CONFIGURATION DESCRIPTOR ======================================================================== NumInterfaces : 01h ConfigurationValue : 01h iConfiguration : 00h Remote Wakeup : NO Self Powered : NO MaxPower : 200 mA ======================================================================== INTERFACE DESCRIPTOR ======================================================================== Interface Number : 00h Alternate Settings : 00h NumEndpoints : 03h Interface Class : 08h Interface SubClass : 06h Interface Protocol : 50h iInterface : 00h ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 81h (01h, IN) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 02h (02h, OUT) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 83h (03h, IN) Attributes : 03h (Interrupt pipe) MaxPacketSize : 40h Interval : 1 ms Цитата cppasm @ Быстрое устройство подключено к медленному порту. Откуда она вообще это знает, устройство ведь в FullSpeed работает Блин, у меня кто-то книжку упер, я пока не могу посмотреть, но по моему там есть какая-то разница в подтягивающих резисторах при подключении... когда я ее найду, смогу точнее расказать. А насчет изменения значений в дескрипторе не знаю, никогда не эксперементировал ![]() |
Сообщ.
#78
,
|
|
|
Новости меня радуют
![]() Ты один пост пропустил - попробуй ещё прогу оттуда. Тоже должна работать - мне просто интересно, будет или нет. Короче выяснилась одна вещ: когда контроллер ресетиш, если у него уже HCFS=UsbReset, он ничего не делает. Я с этим парился - после SMM такая фигня была. Надо выйти в UsbSuspend на 10мс, а потом в UsbReset. Если та прога заработает - это будет тому подтверждением. И ещё - если есть возможность попробуй пожалуйста рабочий вариант с каким нибудь LowSpeed устройством. Огромное спасибо за помощ. ![]() Насчёт изменения дескрипторов - я сегодня сам попробую, результат сообщу. А насчёт резисторов - есть такое дело. Но USB 1.1 HC нифига ведь не знает про HiSpeed... Не очень в общем понятно. |
Сообщ.
#79
,
|
|
|
Та что я пропустил, не работает! Так что предположения не подтвердилось
![]() Цитата cppasm @ Огромное спасибо за помощ. Пожалуйста! ![]() Добавлено Цитата Gerret @ А насчёт резисторов - есть такое дело. Но USB 1.1 HC нифига ведь не знает про HiSpeed... Там наверное есть отличие, которое не влияет на 1.1 но для 2.0 это Hi Speed Добавлено а с Low-speed не выходит... прога виснет! |
Сообщ.
#80
,
|
|
|
Не подтвердилась и ладно.
Но там где я тестировал без выхода в UsbSuspend после SMM устройство не отвечало. А с суспендом всё ок было. Но я думаю с ресетом порта и без суспенда всё ок будет. На следующей неделе проверю. А у LowSpeed есть какая-то специфика, или отличается только установленным битом в ED. |
Сообщ.
#81
,
|
|
|
Я с Low-speed не работал, т.к. флешки Low-spped не бывают
![]() ![]() |
Сообщ.
#82
,
|
|
|
Вот кое-то раскопал в спецификации:
![]() ![]() The HcLSThreshold register contains an 11-bit value used by the Host Controller to determine whether to commit to the transfer of a maximum of 8-byte LS packet before EOF. Neither the Host Controller nor the Host Controller Driver are allowed to change this value. Т.е. для LowSpeed максимальный размер блока, описываемого в TD=8 байтам. А я по 4Кб блоки сделал. Думаю к понедельнику сделаю новый вариант. А насчёт того, что ты в соседнем топике написал, что ты в регистр LegacySupport HceControl записываешь 0, оно конечно не вредит но можно не делать. Это для управления эмуляцией, используется в основном самим BIOS и SMM. Если ты вызвал OwnershipChange и получил управление - BIOS вмешиваться больше не будет до возврата ему управления. Вот сделал - попробуй и на FULLSPEED и на LOWSPEED устройствах. Надеюсь теперь всё ок. А насчёт изменения дескрипторов - если можешь тоже поэкспериментируй. У меня результаты странные какие-то. Запускаю запрос SET_DESCRIPTOR и всё - система намертво виснет. Ни NumLock не работает, ничего. Сразу скажу, что пробовал на UHCI и с остальными запросами программа отлично работает. Так что вот такие дела. Прикреплённый файл ![]() |
Сообщ.
#83
,
|
|
|
Что-то у меня сомнения появились что прога заработает.
Если нет - попробуй эту. Тут отличий никаких нет, но она на экран пишет номер дескриптора на котором произошла ошибка, код ошибки и кое-какие параметры кадра. Если повиснет - перепиши куда-нибудь пару строк и закинь сюда. При зависании думаю в файле ничего не будет - выход по Ctrl-Alt-Del буфера на диск не сбрасывает... А может и будет. В общем попробуй. Неужели опять устройство не отвечает. ![]() Насчёт SET DESCRIPTOR так ничего и не выяснил. Одни устройства возвращают NoError, но при этом дескриптор не меняют вообще. Другие возвращают STALL и при любом последующем обращении лочат всю систему. Так что как изменились параметры флэшки я так и не понял. При работе с UHCI я данные разбивал на блоки размером wMaxPacketSize для каждого TD. Но меня всегда интересовало, зачем под размер выделено 11 бит если wMaxPacketSize<=64. Сегодня попробовал указать больший размер - 1024. Два устройства с wMaxPacketSize=64 схавали нормально и данные вернули правильные. А устройство с wMaxPacketSize=8 залочилось вместе с системой. Хотя я вот понять не могу как оно вообще работает. Там ведь вроди кроме как в дескрипторе нигде размер блока не указывается. А некоторые устройства всё равно работают. Как? Не понятно... Прикреплённый файл ![]() |
Сообщ.
#84
,
|
|
|
Слушай, я сейчас перешел на освоение UHC и машину с OHC разобрал (все сразу на стол не вмещается
![]() ![]() Цитата cppasm @ А насчёт того, что ты в соседнем топике написал Это я делал, когда еще только начинал освоение OHC, а потом не стал удалаять ![]() Цитата cppasm @ Но меня всегда интересовало, зачем под размер выделено 11 Это, наверно, запас для USB 2.0 где размер блока может быть сильно больше 64 байт (для конечных точек, которые не SETUP). А дескрипторы передачи, ведь, для всех одинаковые. Как я понял, ты пишешь не просто драйвер для флешек под ДОС, а универсальное что-то, да? Цитата cppasm @ При работе с UHCI... С этим контроллером вообще надо нежно обращатся ![]() |
Сообщ.
#85
,
|
|
|
Жаль конечно что потестировать не сможешь, я тогда во вторник-среду сам проверю.
Цитата Gerret @ Как я понял, ты пишешь не просто драйвер для флешек под ДОС, а универсальное что-то, да? Да, я хочу написать USB стек под DOS. Возможно и с поддержкой EHCI. Это если меня лень не замучает ![]() Просто если писать драйвер отдельного устройства то возникают некоторые проблеммы. Например нельзя одновременно использовать драйвер флэшки и USB мыши - они конфликтовать будут. Цитата Gerret @ Слушай, я сейчас перешел на освоение UHC Я с ним уже разобрался - раньше это было. Будут вопросы - спрашивай. И потестить что-нибудь могу... PS: насчёт 11 бит я уже разобрался. В USB 1.1 это только для Isohronous посылок - максимум 1024 байта. Но с ними я вообще не работал, ну нет у меня таких устройств ![]() А в USB 2.0 (но это уже и другой контроллер) максимальные размеры пакетов: Interrupt - 1024, Bulk - 512. |
Сообщ.
#86
,
|
|
|
Цитата cppasm @ Да, я хочу написать USB стек под ДОС. Возможно и с поддержкой EHCI. Это если меня лень не замучает Это грамотный подход ![]() ![]() ![]() Цитата cppasm @ Я с ним уже разобрался - раньше это было. Будут вопросы - спрашивай. И потестить что-нибудь могу... А как ты в UHC определял окнчание транзакции? Я правда еще транзакции не делал, но спрашиваю заранее. Еще вопрос про OHC, ты с прерываниями не разобрался? Мне, в драйвере, они без надобности оказались, но на будущее хотелось бы узнать, как, все-таки, они работают ![]() Потому, как стек мне скорее всего тоже придется писать ![]() А с прерваниями он получится гораздо изящнее ![]() |
Сообщ.
#87
,
|
|
|
Цитата Gerret @ А это ты для себя или по работе? Да нет, это я для себя пишу. Хобби так сказать. ![]() В OHCI с прерываниями не разбирался - это ещё предстоит. В UHCI конец транзакции определяю так (почти также как и в OHCI): - Пока в QH не установлен бит T - цикл. - В цикле смотрю TD -- Если TD активен - переход в начало цикла. -- Если не активен --- Если есть ошибка - выход --- Если нет - переход на следующий TD Короче в цикле просматриваю список TD на наличие ошибки. И ещё - когда будешь писать - TD можно делать размером 16б а не 32. Всё равно пользовательские эти данные использовать скорее всего не будешь. А производительность возрастает и выравнивание тоже соблюдается. Прерывания там точно не сильно помогут. Насчёт принтера и сканера под DOS. С принтером проблем не будет - особенно если печатать только текст. А вот со сканером... На них стандарта нет. Я со своим разобрался (Mustek BearPaw 2448TA Plus). Делается так. Есть шпион USB - пишет все транзакции в лог. Т.е. ставишь дрова под Win и в шпионе выбираешь нужное устройство. Ну и потом смотришь какие там команды + ещё SANE есть (дрова под Linux), кое-что там посмотрел. Только муторно это всё и очень не универсально. PS: а где это ещё DOS используют - просто интересно. |
Сообщ.
#88
,
|
|
|
Цитата cppasm @ В UHCI конец транзакции определяю так Понятно. Спасибо ![]() Цитата cppasm @ Прерывания там точно не сильно помогут. Меня прерывания, в основном, интересуют на подключение/отключение уст-ва, но в UHC такого, по ходу, не предусмотрено... Цитата cppasm @ И ещё - когда будешь писать - TD можно делать размером 16б а не 32. Точно, в документации на UHCI так и написано. Не понятно, почему господин Кулаков решил, что там 32б... А на QH там вообще 8 байт всего надо ![]() Цитата cppasm @ Есть шпион USB - пишет все транзакции в лог. Ага, знаю! (USB Sniffer) У меня такой тоже есть ![]() ![]() Цитата cppasm @ а где это ещё DOS используют - просто интересно. Да вот нашлись тут какие-то... Нафига им это надо - без понятия ![]() Шеф мой как-то ко мне подошел и говорит: "Можешь написать драйвер, чтобы USB флешки под ДОСом читались?". Я сказал, что могу... и вот теперь занимаюсь этим гемороем ![]() Для кого все это, я не интересовался ![]() Ладно, если про прерывания, что-нибудь выяснишь, сообщи плиз, а то у меня так и не получилось с ними работать ![]() |
Сообщ.
#89
,
|
|
|
Привет мужики! А тема, то благостно растет и Ваши успехи радуют! Сожалею, что у меня лично USB сейчас совсем заняться не получается даже теоретически, хотя PCI доступ уже прозрачен и поюзан. Правда железяки у меня другие. А как в будующем исходники рабочие да путящие народу будут ли хоть где то понюхать?
![]() Посмотрел вот мельком на USB Sniffer исходники то есть, если это тот самый: http://sourceforge.net/projects/usbsnoop/ но там похоже мутняк еще тот + виртуальное устройство... А вот еще надыбал один в плане мониторинга: http://www.hhdsoftware.com/usbmon.html никто не пробовал как с ним работается, хотя бы сравнительно? |
Сообщ.
#90
,
|
|
|
Ух ты!!! usbmon это просто супер
![]() VaStaNi большое спасибо! Единственное, она при установке мне перекоробила дрова от хостов ![]() cppasm очень советую попробовать! Цитата VaStaNi @ ...как с ним работается, хотя бы сравнительно? Мне очень понравилось! Горздо прикольнее и удобнее сделано чем usbsnoop! Цитата VaStaNi @ ...USB Sniffer исходники... А там ничего особенно интересного не найдешь (применительно к ДОСу ИМХО). Эта прога работает с виндовыми дровами, а не с хостами... |
Сообщ.
#91
,
|
|
|
UsbMon сейчас попробую. Только по ходу он у меня наверное не пойдёт - я под Win98 вишу.
Насчёт документации - да нет, там про 32 как раз написано. UHCI11d.pdf: ![]() ![]() 3.2.5 RESERVED FOR SOFTWARE (DWORDS [7:4]) The last 4 DWords of the Transfer Descriptor are reserved for use by software. Но реально использовать можно и 16байт. А насчёт QH из восьми байт - не очень удобно. Она всё равно должна быть выровняна на границу 16 байт. Но в принципе можно и только 8 использовать. |
Сообщ.
#92
,
|
|
|
cppasm у меня возник вопрос на тему ресета порта UHC:
как я понял из документации, надо сначала установить бит ресета, подождать какое-то время, а потом его снать, правильно? Так вот, если я это делаю, то у меня сбрасывается флаг подключения устройства... Как ты делал ресет порта контроллера? А вообще, можешь показать твою инициализацию контроллера? Как-то все в этом UHC странно после OHC ![]() |
Сообщ.
#93
,
|
|
|
Цитата Gerret @ Как-то все в этом UHC странно после OHC Во-во, а мне наоборот странно было... ![]() Там бит ресета лучше вообще не трогать. Как написано у Кулакова (я проверял - оно так и есть) бит ресета щас на большинстве контроллеров зарезервирован. Там ресет явно делать не надо - делаешь enable и толи автоматом ресет происходит толи чего, но устройство имеет адрес 0 чего и требовалось. Вот код: ![]() ![]() void uhci_init(HC *hc,int hcn) { int i,k; dword FL=0x110000,QH=0x120000; for(i=0;i<hcn;i++) { // Disable legacy support. pci_write_cfg(&hc[i].pci,0xC0,0x02,0x2000); // Reset USB Controller. outportw(hc[i].base,0x04); delay(10); outportw(hc[i].base,0x00); delay(10); // Initialize Frame List. for(k=0;k<0x1000;k+=0x04) writed(FL+k,QH | Q); // Initialize Queue Head. writed(QH+0x00,T); writed(QH+0x04,T); // Set Frame List Address. outportd(hc[i].base+0x08,FL); FL+=0x1000; QH+=0x10; // Run UHCI USB Controller. outportw(hc[i].base,0x0081); } } А вот enable порта: ![]() ![]() // Enable Port of USB Controller. outportw(hc[i].base+port,0x000E); Это точно работает. Я думал что это из-за ресета контроллера. Но потом просто вставил ожидание нажатия клавиши - всё равно работает. Т.е. проверял так: - делаю ресет HC - прога ждёт пока не нажму кнопку - я конекчу устройство - жму кнопку Устройство с HC 100% не ресетилось, но после port enable всё равно имеет адрес 0. Так что я думаю при горячем подключении тоже работать будет. В аттаче моя прога - попробуй. Если не заработает - буду разбираться. Но вроди должна работать. На счёт OHCI LowSpeed если тебе интересно - там просто задержки 20мс не хватало. Лучше ставить проверку - там у порта есть статус завершения ресета и определять по нему. А так всё Ок. Прикреплённый файл ![]() |
Сообщ.
#94
,
|
|
|
Цитата cppasm @ Вот код: Спасибо! Разобрался ![]() Да уж, с ресетом там муть какая-то... Прога твоя зараотала отлично! Цитата cppasm @ там просто задержки 20мс не хватало задержки где? |
Сообщ.
#95
,
|
|
|
Задержки после ресета порта.
Было что-то такое: ресет порта, задержка 20мс. А лучше: ресет порта, проверка по биту завершения ресета: если таймаут (50мс), то выход, если ресет завершён - выход; иначе цикл. Если не трудно кинь лог проги сюда. |
Сообщ.
#96
,
|
|
|
Вот смотри:
![]() ![]() Detecting UHCI USB Controllers... 1 UHCI USB Controller(s) detected UHCI USB Controller 0: VENDOR ID = 8086h, DEVICE ID = 7112h PCI BUS = 0, PCI DEV = 7, PCI FN = 2 IO BASE = FFE0h, IRQ = 11 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0EA0h ProductID : 2168h Device version : 2.0 iManufacturer : 01h iProduct : 02h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 0409h Manufacturer : USB Product : Flash Disk ======================================================================== CONFIGURATION DESCRIPTOR ======================================================================== NumInterfaces : 01h ConfigurationValue : 01h iConfiguration : 00h Remote Wakeup : NO Self Powered : NO MaxPower : 200 mA ======================================================================== INTERFACE DESCRIPTOR ======================================================================== Interface Number : 00h Alternate Setting : 00h NumEndpoints : 03h Interface Class : 08h Interface SubClass : 06h Interface Protocol : 50h iInterface : 00h ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 81h (01h, IN) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 02h (02h, OUT) Attributes : 02h (Bulk pipe) MaxPacketSize : 40h Interval : 0 ms ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 83h (03h, IN) Attributes : 03h (Interrupt pipe) MaxPacketSize : 02h Interval : 1 ms В ней есть какая-то странность: Этот лог от флешки Transcend 1GB, а когда я ее запускаю с флешкой Kingstone, она виснет на строке Detecting USB Devices намертво... Я попробовал ее запустить еще и с флешкой Seitec, так она повисла после вывода Device descriptor, но когда я ее вытащил из порта прога продолжила выполнятся... вот лог от Seitec: ![]() ![]() Detecting UHCI USB Controllers... 1 UHCI USB Controller(s) detected UHCI USB Controller 0: VENDOR ID = 8086h, DEVICE ID = 7112h PCI BUS = 0, PCI DEV = 7, PCI FN = 2 IO BASE = FFE0h, IRQ = 11 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0457h ProductID : 0151h Device version : 1.0 iManufacturer : 00h iProduct : 00h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 21CDh 1173h 95E8h C7FBh 0506h 13A7h C6A1h FF06h 0197h 42E9h C708h 0506h 44A7h BAA2h 99C4h A2E8h E804h 3005h 1EC3h 1E8Eh A3E5h 3E80h 0373h 7400h 830Ah 763Eh FF03h 1274h 53E9h B8D8h 122Eh 05B2h 3E8Bh 038Bh 068Eh 038Dh 2FCDh E81Fh 031Bh 068Eh A3E5h A126h 030Fh A326h 0016h A126h 0311h A326h 000Ah A126h 0313h A326h 000Ch 8E06h F506h B4A3h CD49h 0721h 4CB4h A026h 036Bh 21CDh D233h 3689h A67Dh 98E8h 3C2Fh 74FFh 3D09h 0000h 0175h E840h 0015h 89C3h 7D36h E8A6h 2F83h FF3Ch 0874h 003Dh 7400h E803h 0001h C6C3h FB06h 0297h FDBAh C697h 0004h ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 2.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 40h VendorID : 0457h ProductID : 0151h Device version : 1.0 iManufacturer : 00h iProduct : 00h iSerialNumber : 00h NumConfigurations: : 01h Supported LangID(s) : 2E89h 9F48h А с LG вообще непонятно, там лог вноль такой же как у Transcend'а... Так что вот! |
Сообщ.
#97
,
|
|
|
Gerret, я был не прав!
Ресет порта делать надо - это крайне положительно сказывается на многих устройствах. У меня например с принтером и сканером нормально работало, а подключаю телефон - работает через раз. Т.е. или нормально работает, или намертво вешает всю систему. Сделал ресет порта и всё Ок. Вот код: ![]() ![]() for(port=0x10;port<0x14;port+=0x02) // Цикл по портам if(inportw(hc[i].base+port) & 1) // Если устройство подключено { // Reset Port of USB Controller. outportw(hc[i].base+port,0x200); delay(20); outportw(hc[i].base+port,0x000); // Wait for connection bit set. // Ждём пока устройство завершит reset и установит бит своего подключения. // Если за 20мс устройство не появилось - наверное его отключили. for(k=0;k<20;k++) { if(inportw(hc[i].base+port) & 0x01) break; delay(1); } // Enable Port of USB Controller. outportw(hc[i].base+port,0x000E); // Wait for enable completition. // Ждём пока действительно enable. // Возможна задержка срабатывания!!! for(k=0;k<50;k++) { if(inportw(hc[i].base+port) & 0x04) break; delay(1); } // Дальше инициализация устройства: SET_ADDRESS и т.д. ... } Прога в архиве - поробуй. Ну и логи в студию ![]() Единственное - может ещё дескрипторы строк как-то не так получаются... Я для получения язык указываю английский, а вдруг он не поддерживается. Хотя очень мало вероятно. Прикреплённый файл ![]() |
Сообщ.
#98
,
|
|
|
Да уж, ресет порта помог, проблемы с разными флешками ушли.
Только у Seitec осталось как раньше... У этой флешки нет дескрипторов строк. Если индекс строки = 0, это значит его нет вообще и запрашивать его нельзя. Я архив закину с логами для разных устройств (что под рукой были). Прикреплённый файл ![]() |
Сообщ.
#99
,
|
|
|
Проблем меньше - это хорошо
![]() Насчёт индекса строки - я это проверяю. Здаётся мне она виснет при запросе строки с индексом 0 - т.е. строки с кодами поддерживаемых устройством языков. А как проверить оно поддерживает её или нет - не знаю, вроди по стандарту все должны поддерживать. В следующей версии это убиру наверное и отладочных записей больше добавлю, чтоб видно было точнее где виснет. PS: как я понял виснет не наглухо? Может оно NAK возвращает всё время, а он за ошибку не считается. Таймаута у меня там нет. |
Сообщ.
#100
,
|
|
|
Я понял!
![]() Если у устройства не определена ни одна строка, то может быть не определена и строка с кодами поддерживаемых языков. Вот из спецификации USB 1.1: ![]() ![]() A USB device may omit all string descriptors. USB devices that omit all string descriptors shall not return an array of LANGID codes. Она просто не нужна. А я в любом случае её получаю. Хотя Мышь например абсолютно нормально вернула пустой дескриптор - типа никаких я языков не поддерживаю. Но чтение LanguageID я убрал - я всё-равно его не использую, а так стабильнее. И ещё такой вопрос - ты случайно лог для LG не после Transcend создавал? Смущает меня что они одинаковые... У этих флэшек хоть объём одинаковый? В принципе вполне возможно - LG на чипах Transcend'a сделала флэшку и потому там VID и PID Transcend'a. Вроди и глюка быть не должно: перед получением дескриптора память очищается - старый дескриптор там остаться не мог. Но для чистоты эксперимента попробуй создать лог для LG не подключая до этого Transcend. Прога как всегда прикреплена. Вроди всё теперь исправил. А у тебя как дела с разработкой? Ну просто ты мне очень помог - ОГРОМНОЕ СПАСИБО. У меня под рукой столько устройств нет. Прикреплённый файл ![]() |
Сообщ.
#101
,
|
|
|
Я, когда дескрепторы строк получал, проверял значение индекса и если он - 0, то не запрашивал дескриптор.
Цитата cppasm @ Смущает меня что они одинаковые... У этих флэшек хоть объём одинаковый? Нет размер у них разный, у LG - 512, а у Transcend - 1GB. У них есть одна общая особенность, после каких-то моих экспериментов, они обе стали защащенными от записи... при том, что у LG вообще нет ползунка защиты, а у Transcend'а он стоит в положении "открыто". Снять эту защиты пока не удалось... Отсюда можно сделать вывод, что контроллеры у них одинаковые. Цитата cppasm @ А у тебя как дела с разработкой? В общем-то не плохо ![]() ![]() Сейчас занимаюсь повторением этого же, но для UHC. Цитата cppasm @ У меня под рукой столько устройств нет. Да уж, я убедил своего начальника, что нам надо их по больше после небольшой лажи с заказчиком... Я сначала сделал демонстрационную прогу, что бы показать заказчику, что мы это можем, и отлаживал ее только на одной флешке ![]() ![]() ![]() В понедельник на работу приеду и потестирую твою прогу ![]() |
Сообщ.
#102
,
|
|
|
Цитата Gerret @ Я, когда дескрепторы строк получал, проверял значение индекса и если он - 0, то не запрашивал дескриптор Я тоже так делаю. Суть проблеммы была не в этом. Есть просто дескриптор с индексом 0. Он содержит коды поддерживаемых языков. В других дескрипторах указатель на него не фигурирует. И вот этот дескриптор я получал. А как позже оказалось (см. цитату из спецификации выше) если у устройства нет дескрипторов строк - может не быть и дескриптора с кодами языков. А я этого не учитывал и всё равно его получал. Отсюда и проблеммы... |
Сообщ.
#103
,
|
|
|
Сообщ.
#104
,
|
|
|
В который раз ОГРОМНОЕ спасибо за помощ.
![]() Теперь вроди проблеммы закончились. Кстати - ты не пробовал флэшки разблокировать родной прогой Transcend'a? Я не уверен что поможет, но а вдруг. У меня с флэшкой на CD вместе с дровами шла. Если надо - могу выслать. Называется RecoverDisk. Но она при этом флэшку форматирует - так что данным скорее всего будет конец. |
Сообщ.
#105
,
|
|
|
Цитата cppasm @ В который раз ОГРОМНОЕ спасибо за помощ. Пожалуйста ![]() Пробовал, не помогает ![]() К стати, а в каком виде ты хочешь потом сделать свой USB стек? (драйвер, резидент, ???) |
Сообщ.
#106
,
|
|
|
Слушай, у меня тут страннось образовалась... с твоей прогой от "от 13.10.05 все работает отлично, а с прогой от 14.10.05 Kingstone опять виснет на Detecting Devices... в чем у них разница???
Я, просто, нарвался на странный глюк: мой драйвер со всеми флешками работает нормально, а с Kingstone не хочет! При SET_ADDRESS говорит, что устройство не отвечает ![]() ![]() Ресет порта делаю точно, как ты писал! Вот он на асме: ![]() ![]() ;в AX - номер порта для ресета UHC_PortReset PROC push EAX push EDX mov USB_TransErr, 0 mov DX, UHC_Address add DX, UHC_Port0Reg shl AX, 1 ;AX = AX*2 - смещение на регистр порта add DX, AX mov AX, 200h ;устанавливаем ресет out DX, AX mov AX, 20 call PTDelay ;за PTDelay спасибо Jin X'у mov AX, 0 out DX, AX ;снимаем ресет mov CX, 50 ;ждем установки флага подключенного устройства wait_res_end: mov AX, 1 call PTDelay ;1ms delay in AX, DX and AX, 1 cmp AX, 1 ;флаг установился, выходми je res_done loop wait_res_end jmp res_err res_done: mov AX, 0Eh ;включаем порт out DX, AX ;ждем 20ms для уверенности, что порт включился mov AX, 20 call PTDelay in AX, DX and AX, 4 cmp AX, 0 ;точно включился? je res_err ;нет - выходим с ошибкой jmp res_finish ;да - выходим без ошибки res_err: mov USB_TransErr, 1 res_finish: pop EDX pop EAX ret UHC_PortReset ENDP может быть я совсем уже глючу...? |
Сообщ.
#107
,
|
|
|
А разницы там никакой...
Только во второй дескриптор 0 строки не получается. Ресет у тебя вроди нормальный... Странно это всё как-то. Я сейчас буду разбираться - новый вариант часа через полтора думаю выложу. Вот покопался немного... В архиве три варианта. Если какой вдруг заработает, проверь на всех устройствах. Если обнаружится рабочий - потом сообщу в чём косяк был. Ну а если нет - буду искать дальше. Да, по поводу твоего вопроса - если дело всё-же дойдёт до стека, то скорее всего буду делать резидентом. Прикреплённый файл ![]() |
Сообщ.
#108
,
|
|
|
Мдя..... все 3 варианта работают на всех флешках! Что бы это значило?
|
Сообщ.
#109
,
|
|
|
Ну это мне вообще не понятно...
Я ради прикола в ohci_v1 оставил всё как было - только откомпилировал заново. Видать прикол получился... ![]() В остальных двух поувеличивал время ожидания кругом с 20мс до 50мс. Скорее всего проблеммы у тебя с транзакцией. Я создаю транзакцию с0 счётчиком ошибок = 3, и выхожу из цикла ожидания либо если всё Ок, либо при STALL. Плюс при конфигурировании устройства все транзакции повторяю по три раза. Т.е. например делаю SET_ADDRESS, если ошибка - попробовать ещё раз. И так три раза. Может устройство тормозит немного... |
Сообщ.
#110
,
|
|
|
cppasm спасай!!!
Я уже запарился с этим контроллером (на сколько все было проще с OHC)! Сейчас у меня 2-е глобальные проблемы: 1. SETUP посылки для Kingston'а не проходят (устройство не отвечает). SET_ADDRESS пробовал делать 10(!) раз подряд с проверкой на ошибки... нифига! Каждый раз устройство не отвечает. 2. Работаем с той флешкой от которой получили все нужные дескрипторы. Надо на Bulk OUT точку послать структуру CBW (Bulk Only Transport) с командой Inquie (опишу дальше). За тем с Bulk IN точки первым TD принимаем 36 байт информации, а следующим TD принимаем структуру CSW (см. Bulk Only Transport). Так у меня работало при OHC контроллере... В этом же получается какая-то фигня, в ответ на первый TD для Bulk IN точки мне приходит сразу CSW!!! Хотя должно быть 36 байт данных... ![]() Так вот, по поводу первой траблы, можешь поделится исходником функции, которая транзакцию осуществляет? А по поводу второго, если не влом, попробуй ты проделать выше описаные действия вот в hex'е вид CBW, который надо послать на Bulk OUT точку (длина CBW - 31 байт): ![]() ![]() 00000000: 55 53 42 43 01 00 00 00 24 00 00 00 80 00 06 12 00000001: 01 00 00 24 00 00 00 00 00 00 00 00 00 00 00 а ответный CSW выглядит вот так (его длина 13 байт): ![]() ![]() 00000000: 55 53 42 53 01 00 00 00 00 00 00 00 00 Попробуй плиз, а то я совсем уже потерялся... |
Сообщ.
#111
,
|
|
|
Исходники мылом.
Насчёт второй проблеммы - я такое делал, всё было Ок. Проверь код возврата после транзакции, может проясниться чего. По-моему OHCI NAK не так обрабатывает. Т.е. его в UHCI тоже ошибкой считать не надо - это достаточно легко достигается установкой счётчика ошибок в 3. При NAK он не уменьшается и транзакция остаётся активной, а при других ошибках уменьшается. Когда он падает в ноль - устанавливается STALL. Вот по нему и надо делать выход. Короче почитай исходники. Может что прояснится. Я может потом код чтения инфы с флэшки выложу. Просто после модификации дров я его не пробовал. А насчёт команд флэшки - можешь не описывать, у меня дока есть ![]() |
Сообщ.
#112
,
|
|
|
За исходник, еще раз спасибо!
А с чтением флешки, я нашел в чем трабла, но пока не понял как ее исправить ![]() Цитата cppasm @ А насчёт команд флэшки - можешь не описывать, у меня дока есть А у тебя какая дока? Случайно не описание SCSI 2 протокола? Если нет, то кинь ссылочку ПЛЗ. |
Сообщ.
#113
,
|
|
|
Цитата Gerret @ Случайно не описание SCSI 2 протокола? Случайно именно она ![]() Насчёт пропуска пакета - ты делаешь ресет флэшки перед использованием? Надо сделать общий ресет, а потом CLEAR_FEATURE для bulk in и bulk out. И тригер данных при первом использовании должен быть 0, а потом меняется. Причём сохраняется между транзакциями. Т.е. если ты скажем считал n байт и последний дескриптор имел тригер 0, то при следующей транзакции он должен быть 1. |
Сообщ.
#114
,
|
|
|
Цитата cppasm @ Причём сохраняется между транзакциями. Т.е. если ты скажем считал n байт и последний дескриптор имел тригер 0, то при следующей транзакции он должен быть 1. АААА!!! Спасибо!!! ![]() ![]() А то, даже в OHC драйвере мне приходилось перед каждой транзакцией делать CLEAR_FEATURE для обоих точек. Я еще думал, почему так получается?.. |
Сообщ.
#115
,
|
|
|
Цитата Gerret @ А где сие написано? Ну в стандарте где гаписано я не скажу... ![]() ![]() Лично я это видел в книге Кулакова. Ну и по личному опыту - просто так работает, а если не сохранять тригер то нет. Но первоисточник в принципе книга Кулакова. |
Сообщ.
#116
,
|
|
|
Тоесть, надо сохранять триггеры для каждой точки? Для Bulk IN свой и для Bulk OUT сыой, правилбно я понял?
В понедельник на работу приеду, попробую... если с этой штукой у меня заработает кардридер, с меня бутылка ![]() Как у тебя дела с OHCI? |
Сообщ.
#117
,
|
|
|
Цитата Gerret @ Тоесть, надо сохранять триггеры для каждой точки? Для Bulk IN свой и для Bulk OUT сыой, правилбно я понял? Да, именно так. Цитата Gerret @ Как у тебя дела с OHCI? Да нормально всё... ![]() Я потестировал на USB мыши и на флэшке - всё работает. Сейчас занимаюсь написанием bulk_read и bulk_write запросов. Ну и с флэшкой хочу немного пообщаться. ![]() На UHCI уже Inquiry попробовал - всё работает. У меня только прога не универсальная пока - без автодетекта. Ну типа параметры конечных точек руками забиваю в коде. Но это пока. А так всё Ок. И такой ещё вопрос: ты не знаешь где можно найти документацию на SCSI transparent command set. А то я команды беру из спецификации ATAPI и usbmass-ufi10 спецификации. А хотелось бы документа по чистому SCSI так сказать ![]() |
Сообщ.
#118
,
|
|
|
SCSI могу выслать на мыло, но там pdf'ка на 6 мегов и она без закладок по темам
![]() Если надо, я опять вернулся к OHCI (буду проверять сохранение траггера), так что могу потестить тебе, если что надо ![]() |
Сообщ.
#119
,
|
|
|
![]() ![]() ![]() ОГРОМНОЕ ТЕБЕ СПАСИБО!!! За подсказку про триггер!!! Кардридер заработал ![]() |
Сообщ.
#120
,
|
|
|
Цитата Gerret @ Кардридер заработал Прикольно ![]() Цитата Gerret @ SCSI могу выслать на мыло, но там pdf'ка на 6 мегов и она без закладок по темам Та не, 6 метров не надо. На T10 я был, документов там дофига, но мне ничего не понравилось ![]() Прога в архиве. Приду домой может чего ещё по флэшкам доделаю... Прикреплённый файл ![]() |
Сообщ.
#121
,
|
|
|
Ну и вот ещё с флэшками обмен.
Выводит данные, получаемые по Inquiry. Судя по логам, которые ты выкладывал, должно работать со всеми кроме Seitec. Просто детекта пока нет, а у Seitec другие адреса конечных точек. Да, и при этом флэшка должна быть единственным (ну или первым) устройством. Т.е. детектиться должна первой при просмотре портов. Короче лучше чтобы подключена была только она. Это так, первый тестовый вариант... Прикреплённый файл ![]() |
Сообщ.
#122
,
|
|
|
Первая прога работает со всеми флешками, а с мышью отказывается.
Говорит "USB Device not detected". Логи я приводить не буду, они все такие же, как раньше ![]() Со второй прогой тоже все ОК! Логи для omass в приложении. umass проверю позже, когда на другую машину пересяду ![]() Прикреплённый файл ![]() |
Сообщ.
#124
,
|
|
|
Проверил тебе umass, все ОК!
С OHC, извени, пока не получится ![]() |
Сообщ.
#125
,
|
|
|
Ok, я тогда ещё пару вариантов потом закину.
Больше вероятность будет что что-то заработает. ![]() И наверно напишу с отладочным выводом, чтоб понять хоть где траблы. Но это всё наверное завтра... Да. И если не трудно - кинь сюда описание основных команд, которые ты использовал при работе с flash. Я думаю там не много будет... Прикрепи тут файлик ну или на мыло. Но не больше метра желательно ![]() Да, и ещё пару вопросов - ты случайно не знаешь, нафига у Bulk only флэшки Interrupt Endpoint. Чё по ней получить можно. Я наверно в UsbSniffer посмотрю, но пока руки не доходят. И как флэшка реагирует при записи, если запись не разрешена. Она в статусе код ошибки устанавливает, или STALL возвращает? Да, и если у тебя гарантия на флэшки не кончилась, сходил бы ты в сервисный центр. Они я думаю флэшки разлочат, заодно может и узнаешь что с ними случилось ![]() Вроди всё сказал что хотел ![]() Вот, сделал. Проверь на мыши. Надеюсь какой-нибудь заработает. Если это вдруг случится, то тогда можно и на других устройствах попробовать. ![]() Там внутри readme.txt есть (кодировка DOS) - там всё написано. Создай от каждой логи и кинь сюда когда возможность появится. Очень надеюсь что ohci.exe из архива заработает. И это, когда хоть ориентировочно наступит конец недели? ![]() PS: а UHCI ты с этой мышью пробовал? Прикреплённый файл ![]() |
Сообщ.
#126
,
|
|
|
Ау Gerret, ты куда пропал?
Как там твоя сдача начальству... ![]() |
Сообщ.
#127
,
|
|
|
Ну ты телепат
![]() ![]() OHC показал, всем понравилось! Так теперь по порядку: Цитата cppasm @ нафига у Bulk only флэшки Interrupt Endpoint Честно сказать, не знаю... Я смотрел через снифер, ничего на нее не идет. Цитата cppasm @ описание основных команд, которые ты использовал при работе с flash Вышлю по мылу. 270КБ Цитата cppasm @ И как флэшка реагирует при записи, если запись не разрешена Она в CSW в статусе 1 присылает. Ну и наконец, долгожданные логи ![]() Прикреплённый файл ![]() |
Сообщ.
#128
,
|
|
|
За доки спасибо, исходники посмотрю...
![]() Как я понял нифига блин не работает мыша... Опять мне ничего не понятно. Буду разбираться. |
Сообщ.
#129
,
|
|
|
Так-с.
Ну по поводу исходников я на мыло написал... Попробуй плиз вот этот вариант всё на той же мыши. Что-то мне кажется что я вернулся к старой проблемме - SMM. Создай этой прогой 2 лога - один с включённой в BIOS поддержкой USB мыши, другой с выключенной. И попробуй какую-нибудь из предыдущих прог с выводом дескриптлоров при выключенной поддержке USB мыши. Что-то интуиция мне подсказывает что дело в этом. Кстати, буду ждать ответа на моё письмо. Прикреплённый файл ![]() |
Сообщ.
#130
,
|
|
|
Мышь не завелась!!!
С SMM теперь стало все ОК, твоя прога возвращает ему управление ![]() К сожалению отключить поддержку USB мыши не получится, на этой материнке BIOS этого не позволяет. В приложении логи для мыши и для флешки. Вообще, странно, OHC вроде бы довольно умный контроллер, с чего бы это он не хотел работать с мышой..? Вот дамп памяти с дескрипторами: ![]() ![]() 00510080: 19 00 00 00 10 00 52 00 00 00 00 00 00 00 00 00 00520000: 00 20 08 00 30 00 52 00 21 00 52 00 00 00 00 00 00520010: 00 00 E4 5E F0 08 02 00 10 00 52 00 F7 08 02 00 00520020: 00 00 F4 F3 00 00 00 00 30 00 52 00 00 00 00 00 Сделай еще, что бы в лог сливался дамп памяти с дескрипторами, удобнее будет. Прикреплённый файл ![]() |
Сообщ.
#131
,
|
|
|
Цитата Gerret @ Вообще, странно, OHC вроде бы довольно умный контроллер, с чего бы это он не хотел работать с мышой..? Да OHC с мышью работает, я на nForce2 проверял... Думаю, может в устройстве дело - медленное или ещё чего. Попробуй ещё вот это. Тормозной наверное вариант ![]() Я там попытку по 10 раз повторяю. Ну и ещё кое-какие изменения. Дескрипторы не вывожу - всё равно толку никакого нет. Код ошибки то видно, а причина... Буду дальше копать. Прикреплённый файл ![]() |
Сообщ.
#132
,
|
|
|
И ещё вот это попробуй.
Там три проги в архиве. Надежды у меня всё ещё есть... ![]() И из предыдущего поста тоже попробуй. Запускай сразу с выводом в файл, а то там сообщений много - думаю на экран всё не влезет. Надежда умирает последней... Прикреплённый файл ![]() |
Сообщ.
#133
,
|
|
|
Ни один из вариантов положительного результата не дал.
mouse1.txt это лог от проги из предыдущего поста. Прикреплённый файл ![]() |
Сообщ.
#134
,
|
|
|
Сообщ.
#135
,
|
|
|
О, и попробуй вот этот драйвер.
Интересно, он хоть мышу найдёт... В config.sys прописывать как usbaspi.sys /v Прикреплённый файл ![]() |
Сообщ.
#136
,
|
|
|
![]() P.S. На тему UHC, я тут столкнулся с интереснейшей штукой, оказывается иногда контроллеру требуется устанавливать в PCI регистре, что он может обращатся к I/O пространству и выступать в роли Bus master. Я сегодня пол дня потратил, прежде чем разобрался, почему при чтении регистров контроллера мне возвращались FFFFh. А на другой материнке вообще странно было, все регистры нормальные, но передача не запускается и к памяти контроллер не обращается... Регистр этот называетя PCI CMD (смещение 4h) и установлеными должны быть биты 0 и 2 (значение 5h). Бит 0 - IO Space (без этого читаются FFh) Бит 2 - Bus master (без этого он не обращается к памяти) Это так, для общего развития ![]() Добавлено Этот драйвер тоже не находит... Прикреплённый файл ![]() |
Сообщ.
#137
,
|
|
|
Цитата Gerret @ Регистр этот называетя PCI CMD (смещение 4h) и установлеными должны быть биты 0 и 2 (значение 5h). Бит 0 - IO Space (без этого читаются FFh) Бит 2 - Bus master (без этого он не обращается к памяти) Насчёт этого я знал - но BIOS вроди как это должен сам делать. Я с таким сталкивался при переходе в DOS после Windows. Цитата Gerret @ Этот драйвер тоже не находит... А что пишет? Или вообще ничего... |
Сообщ.
#138
,
|
|
|
Пишет, что нет подключенных устройств.
|
Сообщ.
#139
,
|
|
|
Вот попытка номер x
Прикреплённый файл ![]() |
Сообщ.
#140
,
|
|
|
И ещё одна попытка.
Тут уже всё сложнее... План действий: Прикреплённый файл ![]() |
Сообщ.
#141
,
|
|
|
Ну что же, попытка номер х успехом не увенчалась...
Зато та, что с планом действий ЗАРАБОТАЛА!!! ![]() Расскажи, в чем дело было? Оба лога в приложении. P.S. У меня, к стати, UHC получился ![]() После недельных мытарств я нашел свою ошибку. Как всегда она оказалась маленькой, но противной... Я ухитрился при создании bulk дескрипторов писать длину пакета не отнимая от нее единицу ![]() Прикреплённый файл ![]() |
Сообщ.
#142
,
|
|
|
Да я не знаю в чём глюк...
Просто я подумал, что или она hw reset плохо воспринимает, но скорее всего SMM ей чего-то не то говорит. А ты её когда отключаешь - всё сбрасывается. Я вот думаю может питание порта отрубать... Перед ресетом. А так мышь только ресет порта получает. Напишу ещё наверное прогу чтоб регистры OHCI в файлик сливала - может в параметрах глюки. С SMM ведь мышь работает? Прикреплённый файл ![]() |
Сообщ.
#143
,
|
|
|
Цитата cppasm @ С SMM ведь мышь работает? Нет, в ДОСе мышиный драйвер ее не подхватывает. Но SMM явно пытается до нее достучатся. Я нашел область памяти (0x000EC000) в которой SMM держит свои дескрипторы и пр. Так там создается дескриптор конечной точки на низкоскоростное устройство. Там же я нашел дескрипторы передачи для получения 8-и байт конфигурации и в SETUP дескрипторе стоял код ошибки - Уст-во не отвечает. Может быть дело в том, что материнка на которой я тестирую это все не на стандартном чипсете. Это ICOP - промышленная материнка. Вот эта: [img]http://www.ipc2u.ru/cf/20697/$File/icop6047.jpg[/img] |
Сообщ.
#144
,
|
|
|
Не работает...
Лог - mouse.txt Я попробовал такую фишку: 1. Своей прогой я забрал управление у SMM. 2. Воткнул мышу 3. Запустил твою програмулину и тогда все сработало. лог - log3.txt Прикреплённый файл ![]() |
Сообщ.
#145
,
|
|
|
Спасибо.
Ну попробуй ещё вот эти две. ohci_1 просто запускай, а ohci_dbg по хитрому плану ![]() Я вроди понял в чём косяк, хотя х.з. Прикреплённый файл ![]() |
Сообщ.
#146
,
|
|
|
Похоже SMM какой-то глюченый - лочит мышу.
А переподключать заставлять юзера не есть гуд ![]() Я вот тут написал ну виртуальное переподключение что-ли. Отрубаю питание, жду, потом врубаю, опять жду. Ну а дальше всё по плану. Надеюсь заработает. Вторая там такая-же как первая, только задержки по-больше. Надеюсь заработают обе... А Windows нормально с мышью работает, или тоже надо переподключать. Понять бы хоть реально ли сделать чтоб она заработала... Или там на машине Windows нет? И ещё просьба. Ты той прогой логи делал, когда SMM уже неактивен был. Ну то что не работает я уже понял ![]() Но сделай плиз логи при работающем SMM - работать то не будет, но я хочу посмотреть какие SMM параметры устанавливает. А то так контроллер после ресета получается - все регистры дефолтовые и ничего не понятно. Прикреплённый файл ![]() |
Сообщ.
#147
,
|
|
|
Цитата сделай плиз логи при работающем SMM Сделал. SMM_ON.txt Ни один из вариантов работать не захотел... Windows'a на машине нет, но я думаю, что там все работать будет. Прикреплённый файл ![]() |
Сообщ.
#148
,
|
|
|
Полный SUX
![]() Я ж питание у устройства отрубаю, что ему ещё надо... Ну есть у меня ещё одна идея, если не поможет то наверное забью на это да и всё. |
Сообщ.
#149
,
|
|
|
Сообщ.
#150
,
|
|
|
Сообщ.
#151
,
|
|
|
Бинарников сегодня больше не будет...
Зато будет две просьбы ![]() Но всё по порядку. Я тут пару экспериментов поставил ![]() Дела такие: если устройству послать неправильный запрос (на несуществующую конечную точку или просто запрос не поддерживаемый устройством) - оно лочится, причём намертво. Не помагает даже перезагрузка машины. Помогает только переподключить устройство. Это халтится нулевая конечная точка. А Clear Halt Feature для Endpoint0 сделать по понятным причинам нельзя - запрос через эту же конечную точку и пересылается. Так что скорее всего здесь я сделать ничего не смогу - SMM лочит устройство и прийдётся его переподключать. А теперь просьбы. Ну первая - не мог бы ты привести дамп дескрипторов с которыми работает SMM и сам USB Request. Интересно взглянуть - может что прояснится. А вторая наверное даже слишком наглая, но всё же... Ты сказал, что на машине Windows нет, и я понимаю что ради эксперимента её инсталить - это ну его нафиг ![]() Но в природе существует Live CD WindowsXP (~200Mb). Если у тебя есть возможность его слить, то можно было бы загрузиться с CD. Просто если Windows с мышью работать не сможет, то я окончательно успокоюсь ![]() Хотя я понимаю что это уже полный наглёж... |
Сообщ.
#152
,
|
|
|
Видать просьба действительно наглая получилась
![]() |
Сообщ.
#153
,
|
|
|
да нет, дело не в просьбе
![]() Просто я в отпуск ушел, а комп тот на работе ![]() так что все это может случится только через 2 недели еще ![]() |
Сообщ.
#154
,
|
|
|
Я вернулся
![]() С Live CD WinXP не получилось ![]() А вот дамп, который удалось вытянуть из SMM Дескриптор конечной точки ![]() ![]() 000EC220: 00 60 40 50 00 00 00 00 C1 C4 0E 00 00 00 00 00 Дескрипторы передачи ![]() ![]() 000EC4A0: 00 00 E4 5E B8 C4 0E 00 00 00 00 00 BF C4 0E 00 000EC4C0: 00 00 14 F3 FB CA 0E 00 E0 C4 0E 00 02 CB 0E 00 USB Request ![]() ![]() 000EC4B8: 80 06 00 01 00 00 08 00 Вот правда не удалось узнать, сколько всего запросов он произвел... но он, тоже не смог достучатся до мыши ![]() |
Сообщ.
#155
,
|
|
|
С возвращением
![]() Хотя это может и грустно, как-никак отпуск закончился... Спасибо за логи, буду смотреть. Но скорее всего дело не в проге. Насчёт WinXP - ну и ладно. ![]() А какая там вообще ОС стоит, или кроме DOS нет ничего? Ну в смысле можно и с Linux или FreeBSD попробовать. ![]() |
Сообщ.
#156
,
|
|
|
Кроме доса, там больше ничего нет
![]() |
Сообщ.
#157
,
|
|
|
Я вроди глюк нашёл
![]() Вот лог от той мыши но на UHCI: ![]() ![]() Detecting UHCI USB Controllers... 1 UHCI USB Controller(s) detected UHCI USB Controller 0: VENDOR ID = 8086h, DEVICE ID = 7112h PCI BUS = 0, PCI DEV = 7, PCI FN = 2 IO BASE = FFE0h, IRQ = 11 Detecting USB Devices... 1 USB Device(s) detected ======================================================================== DEVICE DESCRIPTOR ======================================================================== USB version : 1.0 Device Class : 00h Device SubClass : 00h Device Protocol : 00h Endpoint Zero Max Packet Size : 08h VendorID : 1241h ProductID : 1122h Device version : 1.0 iManufacturer : 00h iProduct : 00h iSerialNumber : 00h NumConfigurations : 01h ======================================================================== CONFIGURATION DESCRIPTOR ======================================================================== NumInterfaces : 01h ConfigurationValue : 01h iConfiguration : 00h Remote Wakeup : YES Self Powered : NO MaxPower : 100 mA ======================================================================== INTERFACE DESCRIPTOR ======================================================================== Interface Number : 00h Alternate Setting : 00h NumEndpoints : 01h Interface Class : 03h Interface SubClass : 01h Interface Protocol : 02h iInterface : 00h ======================================================================== ENDPOINT DESCRIPTOR ======================================================================== EndpointAddress : 81h (01h, IN) Attributes : 03h (Interrupt pipe) MaxPacketSize : 08h Interval : 8 ms А вот разбор Endpoint Descriptor: ![]() ![]() Endpoint Descriptor 0: 50406000 1: 00000000 2: 000EC4C1 3: 00000000 RES = 0Ah=10 Ok: From Spec: Fields containing '--' are not interpreted or modified by the Host Controller and are available for use by the Host Controller Driver for any purpose. MPS = 64 ERROR: This Mouse and all LS devices have MPS=8 F = 0 OK: General TD K = 1 ??: Skip this ED S = 1 OK: Speed=LS D = 00 OK: Get direction from TD EN = 0 OK: Endpoint0 FA = 0 OK: Device0 Там размер пакета устанавливается равным 64 байта, а у мыши и у всех LS устройств размер пакета равен 8 байт. Вот мышь и лочится. WinXP я тоже найти не смог, может попозже на ftp выложу, а может просто ну его нафиг ![]() Если есть возможность слить, попробуй Linux: BLinux (~183Mb) Тоже LiveCD ![]() |
Сообщ.
#158
,
|
|
|
Цитата Supervisor @ cppasm, рекомендую тебе купить ohci-usb контроллер. Стоит всего 200-300руб, зато тестить драйвер будешь на своей машине... Облазил половину магазинов в городе, в и-нете смотрел, никак не получается найти PCI-USB с OHCI. Уже пару плат расширения вернул в магазины, на них были UHCI компаньоны ![]() Могли бы вы подсказать, как можно купить плату расширения с ohci ? Добавлено И ещё. Что значит: (обратная) совместимость с OHCI 1.0a ? На той плате расширения, которую я покупал, было так написано. Но там был в кач-ве компаньона UHCI...покрайней мере, Windows именно так определила. |
Сообщ.
#159
,
|
|
|
OHCI чаще в embedded-процессорах встречается. Например в Atmel-овских ARM-ах, вроде AT91SAM9260.
Для него существует linux и winCE. http://atmel.com/dyn/products/product_card.asp?part_id=3870 |
Сообщ.
#160
,
|
|
|
Цитата whoIS @ Могли бы вы подсказать, как можно купить плату расширения с ohci ? NEC ищи, он работает стабильно даже с относительно старыми материнками и у них OHCI компаньоны. Будеш покупать смотри внимательно, есть контроллеры которые требуют PCI 2.2 и на старых материнках с PCI 2.1 не работают (в частности VIA, но у VIA UHCI компаньоны). Цитата whoIS @ И ещё. Что значит: (обратная) совместимость с OHCI 1.0a ? Значит что должен быть OHCI... Они может хотели написать что совместимость с USB1.1 |
Сообщ.
#161
,
|
|
|
Купил плату расширения PCI USB Maxxtro с чипсетом Nec на 5 портов.
Так вот там OHCI контроллер в кач-ве компаньона к EHCI. (купил за 14 у.е.) Плата расширения на VIA чипсете (10 у.е.) на 2 порта (на коробке от неё тоже было написано "совместимость с ohci 1.0a"), там в качестве компаньона к ehci стоит uhci. |
Сообщ.
#162
,
|
|
|
Помогите
![]() Что-то я запутался с этими регистрами %) Сделал сброс контроллера, ресет порта, задетектил девайс (HcRhPortStatus = 0x110103) Теперь пишу Control транзакцию, и уже голова кругом от количества этих регистров. HCCA фактически нужен только для Interrupt Transaction? Каша в голове ![]() ![]() ![]() Схему с ED0 -> TD(Set_Address) -> TD(acknowledge) это я понял. всмысле расставил указатели, заполнил поля структур. А как собственно запустить транзакцию? Вообщем ... ![]() |
Сообщ.
#163
,
|
|
|
Здравствуйте
![]() С Control транзакциями я разобрался. Но вот как я думал у меня не получилось... Вообщем, у меня возник вопрос. Схема таже. Устройство, имеет одну конечную точку с типом передачи по прерываниям. Необходимо реализовать HID протокол. Я пытался повторить схему с UHCI в лоб. Не получилось ![]() Сейчас я пытаюсь делать следующее, но пока не получается получить ответа от устройства: Посылаю на нулевую конечную точку запрос устройству, т.е. обрабатываю очередь TD присоединенных к HcEndpointDescriptor0 (ED_FullSpeed,FunctionAddress,ED_Direction_TD,EP_NUM_ZERO): Set_Report (bufferRounding = 1, TD_SETUP,DelayInterrupt=111b,DataToggle = 10, buffersize = 8 bytes) Report (bufferRounding = 1, TD_OUT,DelayInterrupt=111b,DataToggle = 11, buffersize = 64 bytes) HandShake (bufferRounding = 1, TD_IN,DelayInterrupt=111b,DataToggle = 11, buffersize = 0 bytes) вроде бы проходит без ошибок, сверяя ED0.HeadP = ED0.TailP. Алгоритм правильный? А как реализовать приём ответа с конечной точки? Я пробовал прикрепить такие дескрипторы передачи в EndpointDescr1: GetResponse (bufferRounding = 1, TD_IN,DelayInterrupt=111b,DataToggle = 10, buffersize = 64 bytes) HandShake (bufferRounding = 1, TD_OUT,DelayInterrupt=111b,DataToggle = 11, buffersize = 0 bytes) А куда собственно записывать адрес этой конечной точки? Сейчас пробую через HCCA. Для этого заполняю все 32 указателя на конечную точку 1. Устанавливаю Master Interrupt Enable, WDH enable. Но почему-то WD в InterruptStatus не устанавливается. Подскажите, плиз, алгоритм. |
Сообщ.
#164
,
|
|
|
Неужели ни у кого нет никаких идей?
![]() или я слишком глупые вопросы задаю? ![]() вообщем ещё такую вещь заметил... при SetReport-e возникает ошибка 0xB. В спецификации на ohci reserved. И Status Interrupt Register устанавливается в 0. Ещё один момент. Если я пишу еденицу в бит WritebackDoneHead в InterruptStatus перед приёмом данных с устройства - то бит WDH не устанавливается. Имею ввиду, что по окончании обработки очереди из HCCA устанавливается бит WDH, так?! Хотя при чтении регистра InterruptStatus бит не установлен. Однако, если же я не делаю этого, то вроде бы как транзакция проходит и в HccaDoneHead содержится указатель на первый TD. Вообщем я уже не совсем понимаю чего делать уж... Попробую через Bulk Транзакции...но не уверен что получится...ведь конечная точка то по прерываниям... ![]() Неужели ни у кого ни каких идей, соображений? ![]() |
Сообщ.
#165
,
|
|
|
У меня есть код работы с OHCI т.е виды транзакций: controll и bulk но они только для изхронного режима. В том числе запуск транзакции. Если нужно могу дать.
Добавлено Вообще схема control-транзакции такая: 1. Подготовка дескиптора EP 2. Формирование дескриптора передачи для SETUP-пакета 3. Подготовка дескрипторов передачи данных и формирование очереди 4. Устанавливаем заголовок очереди в HCCONTROLHEAD_ED 5. Запус контроллера на обработку: 2 в OHCI_HCCOMMANDSTATUS |
Сообщ.
#166
,
|
|
|
потом...
Добавлено не успел. потом опишу |
Сообщ.
#167
,
|
|
|
Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание:
ты пишешь ;Disable Periodic List, Isochronous List ;Control List and Bulk List proccessing mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь? Добавлено или ты вообще списки кадров не обрабатывашь? |
Сообщ.
#168
,
|
|
|
Цитата uchtinka @ Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание: ты пишешь ;Disable Periodic List, Isochronous List ;Control List and Bulk List proccessing mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь? почему 0B3h? ![]() ![]() ![]() PROC WaitTransactionComplete near pushad mov ESI,[USB_BaseAddr] mov [dword ptr GS:ESI+03Ch],0 mov ESI,[Addr_HcEndpoint0] xor [word ptr GS:ESI],CW1Skip mov ESI,[USB_BaseAddr] or [dword ptr GS:ESI+8],02h;ControlListFilled or [dword ptr GS:ESI+4],16;ControlListEnabled ... А вот PeriodicListEnable я не выставляю...только обратил внимание на это.Спасибо. Попробую вечерком с этим изменением. Цитата uchtinka @ или ты вообще списки кадров не обрабатывашь? А в OHCI есть FrameList? ![]() Вероятно, не обрабатываю. Я выложил все исходники, только без функций получения стандартных дескрипторов. Но получаю я их точно так же, как и запрос делаю. Почти те же функции, только тут константы забиты. |
Сообщ.
#169
,
|
|
|
Да список кадров нужен, только для UHCI прихидится резать пакет на кусочки, а в OHCI можно сразу до 4к кажется размер кадра указать. Поэтому если у тебя скажем mass storage устройство то можно пакет вовсе не резать поскольку все равно по секторам обмен идет. Фактически очередь будет из одного дескриптора передачи -если это bulk -транзакция.
А вот если control то схема транзакции такая: 1. Сначала setup пакет 2. Данные 3. Статус пакет и каждый пакет упаковывается в свой TD |
Сообщ.
#170
,
|
|
|
uchtinka
я так и делаю, setup packet, пакет данных ... ![]() ![]() ;setup packet (hid, set report) SetReport DB 21h,09h,01,02,0,0,40h,0 ;Пакет данных DataReport DB 64 dup(0) на uhci получается работать с устройством, а вот ohci - никак нет ![]() Исправил (Periodic List Enable), никаких изменений не дало. Кстати, попытался сделать ожидание завершения транзакции через проверку в дескрипторе первой конечной точки указателей на пакеты получения данных (IN) и пакет подтверждения (OUT), они никогда не равны. Т.е., получается что этот дескриптор вообще не обрабатывается HC-ом? Хотя в HccaDoneHead хранится указатель на дескриптор передачи на приём данных с устройства с первой КТ. |
Сообщ.
#171
,
|
|
|
Анализируя твой код возник ряд вопросов
1. ![]() ![]() mov EAX,[Addr_HcTransDescr] mov [dword ptr GS:ESI+8],EAX;TD Queue Head Pointer (HeadP) 0 C=0 H=0 mov [dword ptr GS:ESI+4],EAX;TD Queue Tail Pointer (TailP) mov [dword ptr GS:ESI+12],0;Next Endpoint Descriptor (NextED) Получается что у тебя и начало и конец очереди в дескрипторе EP совпадают? Но ведь у тебя там 3 дескиптора в очереди наверное надо прибавить к [dword ptr GS:ESI+4] +30h ? попробую Добавлено TD - Set Report (8 байт) - правильно Добавлено только зачем bufferRounding в 1 поставил? Добавлено 3;Handshake TD в DelayInterrupt поставь 000 Добавлено Досмотрел до конца - первый пункт отпадает ![]() Добавлено Попробуй проверять HCINTERRUPTSTATUS еще Добавлено и еще попробуй проверить HccaDoneHead это HCCA+0x84 - туда запосятся обработнные дескрипторы Вот как у меня ![]() ![]() ... obulk_loop: ; ... push OCADR_DONE_HEAD call XMSCadrGetDWORD add sp, 2 or eax, eax jz short obulk_read_intstatus test al, 1 jnz short obulk_read_intstatus mov eax, 2 ; WritebackDoneHead jmp short obulk_tst_status ; --------------------------------------------------------------------------- obulk_read_intstatus: ; ... push OHCI_HCINTERRUPTSTATUS ; Register call ReadFromDevice add sp, 2 obulk_tst_status: ; ... mov [bp+SaveIntStatusReg], eax test eax, 2 ; WritebackDoneHead jnz short obulk_end_loop2 test eax, 4 ; StartofFrame jz short obulk_flush_status dec cx or cx, cx jnz short obulk_flush_status jmp short obulk_end_loop |
Сообщ.
#172
,
|
|
|
Ошибка возникает в пакете DataReport...покрайней мере адрес в HcDoneHead является адресом DateReport пакетом.
Код ошибки 0101 Device did not respond to token (IN) or did not provide a handshake (OUT). Если же EN=0010b, то вылетает по таймауту... Вообщем ошибка где-то в запросе к устройству... ![]() Кстати, на UHCI я через нулевую КТ отправлял запросы к устройству, с первой КТ (IN) получал ответы. А на OHCI точно так же? или тут принципиально запросы отправляются через 2ю КТ (OUT). Или вообще нужно SetupPacket(Set Report) на нулевую, сам Report на 2ю, а ответ с 1й? ![]() |
Сообщ.
#173
,
|
|
|
Попробуй еще в _HCCONTROLHEAD_ED записать физ адрес первого дескриптора конечной точки перед ControlListFilled
Добавлено С конечными точками работа аналогично UHCI |
Сообщ.
#174
,
|
|
|
На физ адрес дескриптора нулевой КТ, так?. Убрал BulkFilled и BulkHeadEd. не работает. (это ведь Control транзакция, запрос к устройству?!). Есть ещё какие-нибудь идеи?
![]() по таймауту вываливается |
Сообщ.
#175
,
|
|
|
попробуй bufferRounding в 0 а CC=1111
Добавлено Да вроде у меня тоже все так ![]() Добавлено А ты пробовал просто дескриптор какой-нибудь считать? |
Сообщ.
#176
,
|
|
|
Цитата uchtinka @ Может у тебя OHCI как плата расширения? Эм...это существенно меняет ситуацию? У меня OHCI как плата расширения ![]() Цитата uchtinka @ А ты пробовал просто дескриптор какой-нибудь считать? Да, я выполнил успешно Enumeration, получил стандартные дескрипторы: устройства, конфигурации; выполнил Set Configuration тоже без ошибок, по-моему(кстати, Set Configuration Обязательно делать, или по умолчанию устанавливается конфигурация устройства, если она одна?). Теперь осталось реализовать обмен данными с HID устройством. |
Сообщ.
#177
,
|
|
|
То, чт это плата расширения - ничего не менят, это точно такоеже PCI устройство, как и контроллер в составие чипсета.
SetConfiguration длать обязательно, причем номер конфигурации брать из дескриптора конфигурации. |
![]() |
|
|
Огромное спасибо Barbosman. Вообщем ошибка заключалась в том что не проходил SET_ADDRESS и SET_CONFIGURATION.
А не проходили они из-за того что я не отправлял HandShake пакет. Как оказалось в очереди TD должен всегда присутствовать пустой TD. Тогда как у меня в очереди было при SET_ADDRESS, допустим, только 2 TD (Setup,Ack). Соответственно когда EP0.Headp==EP0.TailP Ack пакет не обрабатывался и транзакция устройство не обратывало Setup запросы. Теперь обращение к устройству вроде проходит нормально. Кто-нить может подсказать как получать ответ с конечной точки по прерываниям? Алгоритм. Цепочку TD я формирую такую: TD[0]=pidIN(DataX), TD[1]=pidOUT.Ack(Data1), TD[2]=Empty. EndpointDescriptor1 прописываю в HCCA во всех полях, т.к. PollingInterval = 1. В ED1 тоже нужно при формировании очереди устанавливать бит Skip, а потом снимать его для получения ответа от устройтсва? |
Сообщ.
#179
,
|
|
|
Вообщем не знаю правильно ли я делаю или нет, но попробовал работать с первой конечной точкой по прерываниям точно так же как и с нулевой и получить ответ от устройства удалось. Т.е. фактически просто поменял адрес конечной точки вместо 0 на 1 и всё дальше точно так же.
Причем адрес дескриптора конечной точки записываю в HcControlHeadEd. Устанавливаю бит ControlFilled и сверяю headp и tailp. Триггер сохраняю. Вообщем uhci и ohci побеждены для моей задачи, всем огромное спасибо за помощь. |
Сообщ.
#180
,
|
|
|
Привет всем! Решил потренироваться с USB под миниксом и столкнулся с такой проблемой. Пытаюсь записать 4 байта (0x00000008 - захват управления у SMM) в 32-битный регистр хост-контроллера OHCI (адрес 0xE8004008) и без толку. Если же пишу только в младшие 2 байта этого регистра, то запись проходит (есть нужная реакция в контрольном регистре). Ради интереса делал 12-байтовое копирование - и запись тоже прошла успешно. Как правильно писать 4 байта в регистр? Сейчас используется следующая функция:
![]() ![]() ! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination, ! phys_bytes bytecount); ! Copy a block of physical memory. PC_ARGS = 4 + 4 + 4 + 4 ! 4 + 4 + 4 ! es edi esi eip src dst len .align 16 _phys_copy: cld push esi push edi push es mov eax, FLAT_DS_SELECTOR mov es, ax mov esi, PC_ARGS(esp) mov edi, PC_ARGS+4(esp) mov eax, PC_ARGS+4+4(esp) cmp eax, 10 ! avoid align overhead for small counts jb pc_small mov ecx, esi ! align source, hope target is too neg ecx and ecx, 3 ! count for alignment sub eax, ecx rep eseg movsb mov ecx, eax shr ecx, 2 ! count of dwords rep eseg movs and eax, 3 pc_small: xchg ecx, eax ! remainder rep eseg movsb pop es pop edi pop esi ret |
Сообщ.
#181
,
|
|
|
Проблема решена. Надо movsd использовать
![]() |
Сообщ.
#182
,
|
|
|
Добрый день! Пытался найти помощь на разных форумах но пока там молчок.
Здесь обсуждение идёт по нужной теме! ![]() LPC1768 - микроконтроллер HOST взят за основу хост от LPC (который умеет работать с флэшкой) OCHI Почему то не работают interrupt transfers подключаю камеру UVC енумерация проходит, стандартные запросы работают такие как установка адреса, установка интерфейса, установка конфигурации, чтение дескриптора. почему то не работают interrupt transfers (точнее понятно почему - что-то не так делаю но что ... ) HCCA настраиваю (т.е. записываю в массив один указатель на ED) в HC адрес HCCA записываю. ED настроил по аналогии с ED для bulk TD к ED подключил прерывание по передачи TD разрешено (control transfer работают) поля CONTROL в TD и ED не изменяются такие же как и после их инициализации. Может засовываю в HCCA не вовремя - есть такое предположение. вообщем HC ничего с моим EDinterrupt не хочет делать Заранее Спасибо. |
Сообщ.
#183
,
|
|
|
Обнаружил что нужно заполнять ещё регистр USB->HcPeriodicStart=0x3E67;
для опроса по interrupt дескрипторам. но всё равно не работает. пытался отправить дескриптор по bulk на interrupt endpoint - но то же не проходит, впечатление, что хост не трогает этот endpoint вообще. Новые Вопросы: 1. Может ли такое вообще быть, что при запуске передачи вообще ничего не происходит (никакой из дескрипторов вообще не изменяеся ED TD) ? 2. Нужно ли включать interrupt точку? и что будет если послать транзакцию например несуществующей точке. |
Сообщ.
#184
,
|
|
|
немного ошибся реакция HC всё же есть
LPC_USB->HcBulkHeadED = (uint32_t)ed; LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF; LPC_USB->HcControl |= OR_CONTROL_BLE; после включения BLE BLF сразу же сбрасывается. Но сами дескрипторы не изменяются и другие регистры HC не меняются. ![]() если это же действие проделать с Control endpoint 0 то данные передаются ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Сообщ.
#185
,
|
|
|
Сделал SET_FEATURE для interrupt ep
теперь дескриптор стал обрабатываться ! ![]() |
Сообщ.
#186
,
|
|
|
правда возвращает STALL
а через HCCA не хочет почему-то всё-равно работать хотя HcPeriodCurrentED устанавливается правильно сам на нужный ED как же запустить interrupt передачи ??? ![]() |
Сообщ.
#187
,
|
|
|
К сожалению, сейчас спешу, поэтому коротко.
Цитата Пришелец @ поля CONTROL в TD и ED не изменяются такие же как и после их инициализации. Цитата Пришелец @ прерывание по передачи TD разрешено (control transfer работают) Правильно ли ты работаешь с точками по прерываниям? Делаешь ли обработчик прерывания по завершении транзакции, если ты включаешь этот бит? Как ты организуешь непрерывную периодичность активного дескриптора. Ведь как он отработал, он больше не выполнится. |
Сообщ.
#188
,
|
|
|
О спасибо! За отклик!!!
да прерывание разрешено по WDH планирую по прерыванию эту точку и обрабатывать т.е. после каждой передачи перенастраивать дескрипторы. но пока суть не в этом - дескриптор не обрабатывается ни одного раза т.е. HeadTd!=TailTd при этом всё же HcPeriodCurrentED устанавливается правильно сам на нужный ED |
Сообщ.
#189
,
|
|
|
Начали обрабатываться и через HCCA !
неправильно был установлен HcPeriodicStart |
Сообщ.
#190
,
|
|
|
Здравствуйте скиньте пожалуйста исходники USB на мыло tyreunion@yandex.ru
|
Сообщ.
#191
,
|
|
|
На сайте usbisnotprogram.org лежат исходники USB, а так же можно найти исходники монитора и принтера 8)
|
Сообщ.
#192
,
|
|
|
У меня проблема c OHCI 1.0 - не устанавливается флаг PORT_ENABLE в регистре PORT_CHANGE после запроса PORT_RESET к USB Flash 2.0 (bcdDevice 1.10). C USB Flash 2.0 (bcdDevice 1.0) таких проблем нет. С релизом OHCI 1.1 работает всё нормально. В чем может быть проблема?
Работа с OHCI 1.0 и USB Flash 2.0 (bcdDevice 1.0) PORT 1 STATUS //после подключения USB Flash 2.0 (bcdDevice 1.0) к OHCI 1.0 wPortStatus = 0101 DevicePresent Powered wPortChange = 0001 ConnectChange //после сброса PORT 1 STATUS wPortStatus = 0103 DevicePresent Enabled Powered wPortChange = 0010 ResetChange //после отключения устройства PORT 1 STATUS wPortStatus = 0100 Powered wPortChange = 0001 ConnectChange Работа с OHCI 1.0 и USB Flash 2.0 (bcdDevice 1.0) PORT 1 STATUS //после подключения USB Flash 2.0 (bcdDevice 1.10) к OHCI 1.0 wPortStatus = 0101 DevicePresent Powered wPortChange = 0001 ConnectChange //после сброса PORT 1 STATUS wPortStatus = 0101 DevicePresent Powered wPortChange = 0011 ConnectChange ResetChange //после отключения устройства PORT 1 STATUS wPortStatus = 0100 Powered wPortChange = 0001 ConnectChange |
Сообщ.
#193
,
|
|
|
я OHCI не программировал (только UHCI пока), но могу сказать, что это происходит врядли из-за версии. Скорее всего ты неправильно резетишь. Возможно допустил ошибку с задержками. Читай другие топики посвященные этой проблеме. И внимательно перечитай спецификацию (особенно что касается резета и инита).
|
Сообщ.
#194
,
|
|
|
Спасибо за ответ! Только не понятно почему с другими флэшками работает? У тестируемых флэшек единственное отличие - строки (bcdDevice 1.0 - рабочая) (bcdDevice 1.10 - не рабочая), размер один и тот же - 2Gb. Но на другой платформе тот же код для OHCI работает с обеими флэшками,но ревизия у контроллера OHCI: reg_rev - 0x110. Ещё есть ноутбук IBM на котором установлен XP и имеется ОНСI, с которым так же не работает эта же флэшка (bcdDevice 1.10).
|
Сообщ.
#195
,
|
|
|
Да,подключив эту флешку (bcdDevice 1.0) через HUB 2.0, она работает, а на прямую нет (не сбрасывается корректно).
|
Сообщ.
#196
,
|
|
|
Это происходит скорее всего потому, что некоторые контроллеры "исправляют" ошибки разработчика. У меня например, это было с контроллером VIA IDE который "переваривал" мои некорректные таблицы PRD, а когда стал теснить на других чипах долго не мог понять в чем дело, оказалось, что не уловил одну тонкость написанную в спецификации. Конкретно от версии в твоём случае врядли что-то зависит, если ты только не используешь фитчи добавленные в более новом релизе (но это странно так как на начальном этапе разработки да и вообще для простого драйвера они абсолютно бесполезны). Короче этот баг не от версии, а от конкретного контроллера. Попробуй для начала "поиграть" с задержками резета и посмотри результат.
Цитата oliva13 @ Спасибо за ответ! Только не понятно почему с другими флэшками работает? У тестируемых флэшек единственное отличие - строки (bcdDevice 1.0 - рабочая) (bcdDevice 1.10 - не рабочая), размер один и тот же - 2Gb. Но на другой платформе тот же код для OHCI работает с обеими флэшками,но ревизия у контроллера OHCI: reg_rev - 0x110. Далеко не единственное, плохо смотрел разделы форума посвященные USB. перечитай: "Программирование USB в MS-DOS" Я уж непомню точно, но вроде какую-то флешку вообще 2 секунды надо резетить А размер вообще никак к этой проблеме не относится. Добавлено И еще одно. Некоторые программисты под DOS неправильно делают задержки. Учти что системный таймер после настройки BIOS тикает с частотой примерно 18.2 раза в секунду. Тоесть Delay(10) при реализации "в лоб" задержит не на 1мс, и не на 0,1с а прримерно на пол секунды. Возможно у тебя наоборот задержка слишком большая и устройство в спячку впадает. |
Сообщ.
#197
,
|
|
|
Цитата shm @ Возможно у тебя наоборот задержка слишком большая и устройство в спячку впадает Врядли, ведь в спецификации написано, что задержка должна быть не менее 50 мс... |
Сообщ.
#198
,
|
|
|
Проблема оказалась в подключении hub контроллера ISP1520, который добавляет четыре порта к встроенному в процессор hub'у. Схема подключения ISP1520. Закоротив резюки R1 и R2, флэшка (bcdDevice 1.10) заработала.
|-------------------| R1 27 | | ______ | DM |------+-------------|______|----+-------------- D+ | | | C1 22pF | | ISP1520 | | R2 27 | | | | ______ | | DP |------|------+------|______|-----------+------- D- | | ----- | _|_ _|_ | | ----- ----- C2 22pF | | | | | | | ----- R3 | | R4| | | | | | 15K |__|15k|__| | | | | | | |-------------------| __|__ _|__ __|__ __|__ |
Сообщ.
#199
,
|
|
|
Добрый день , вопрос немного не по теме , но может не будете судить строго и поможете. Я начинающий программист. Был написан драйвер под юсб-устройство - просто пробрасывает данные из устройства - в программу и обратно , никакой обработки. Так вот в чем проблема драйвер работает только на ОHCI, UHCI - нет , в чем может быть проблема ? Даже не знаю в какую сторону копать
|
Сообщ.
#200
,
|
|
|
Проблема в том, что OHCI и UHCI это абсолютно разные контроллеры, и их программировать надо по разному.
Надо писать отдельный код для работы с UHCI. |
Сообщ.
#201
,
|
|
|
Писал win driver foundation , там ни одного слова нет про разницу хост контроллеров =(
|
Сообщ.
#202
,
|
|
|
xp3, ты под винду драйвер ЮСБ железки пишешь?
|
Сообщ.
#203
,
|
|
|
Цитата shm @ да |
Сообщ.
#204
,
|
|
|
Тогда мой ответ не в тему, разница есть если самому с контроллером работать.
Если драйвер под Windows на основе Windows Driver Foundation написан - работать должно с любым контроллером. А устройство своё, или промышленное? Могут быть проблемы в самом устройстве... |