
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (51) « Первая ... 9 10 [11] 12 13 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#151
,
|
|
|
Ну так трудно определить - раз данные не приходят, значит ты транзакцию неправильно производиш, в дескрипторах ошибка или ещё где... Цитата SanSan @ 2) В документации и в Кулакове используется понятие "Сброс порта". Что это такое и как это делается? Я произвожу только общий сброс контроллера. Может, из-за этого? Сброс порта, это только сброс одного порта, а сброс хост контроллера - это сброс контроллера и всех портов. После подключения устройства надо делать сброс порта чтобы произошёл сброс устройства и оно получило нулевой адрес. Хотя на некоторых UHCI и без сброса работает. Ты же не будеш при подключении нового устройства сбрасывать весь контроллер и полностью перенумеровывать все устройства... Цитата SanSan @ 3) Windows в списке устройств USB показывает помимо универсального хост-контроллера еще "Корневой концентратор USB", причем все подключенные устройства можно увидеть, если залезть в его свойства. Значит ли это, что с устройствами надо работать, используя спецификации для хабов, в частности, при енумерации? Нет - корневой хаб это абстракция. Ты когда работаеш с регистрами контроллера - по сути работаеш с корневым хабом. Просто в Windows сделали таким образом что реализовали как-бы виртуальный хаб, все запросы к которому обрабатывает драйвер. Это чтобы не было различий между корневым хабом и всеми остальными. Цитата SanSan @ 4) На некоторых компах (вполне современных) при попытке прочитать PCI BIOS (как по Кулакову) говорит, что PCI BIOS не обнаружен. Режим 16-разрядный. Как же тогда получить адреса контроллера? Проверялось в реальном режиме? Даже если нет поддержки PCI BIOS (в чём я очень сомневаюсь), можно работать с PCI на уровне портов ввода/вывода. |
Сообщ.
#152
,
|
|
|
Транзакцию делаю так: в очередь добавляю два дескриптора. Первый дескриптор передает команду в конечную точку 2 (BULK OUT), в маркере задаю PID = 0xE1, MaxLen = 30, триггер данных DATA1. Вторым дескриптором пытаюсь получить данные из конечной точки 1 (BULK IN), в маркере задаю PID = 0x69, MAxLen = 63, триггер данных устанавливаю тоже DATA1. Скажи, пожалуйста, хотя бы правильно ли рассуждаю в принципе, или я не понимаю механизм BULK-обмена?
Насчет сброса порта. Не подскажешь, как это делается для UCHI? В Кулакове не нашел (может, пллохо читал?), а больше ничего в руки не попадалось по UCHI. Насчет PCI BIOS. Да, пытаюсь выяснить его наличие в реальном режиме, как по Кулакову, через функцию 0xB101 прерывания 0x1A и она выставляет мне флаг переноса( |
Сообщ.
#153
,
|
|
|
Цитата SanSan @ Скажи, пожалуйста, хотя бы правильно ли рассуждаю в принципе, или я не понимаю механизм BULK-обмена? В принципе правильно. Только после получения данных надо ещё пакет статуса читать - 13 байт. Ну это я думаю ты знаеш - посмотри простокол обмена. Я думаю грабли у тебя всё те же. Просто видно лень 10 страниц топика читать ![]() Если коротко - то суть такая. В начале делаеш Reset Recovery и ClearFeature(HALT) для обоих конечных точек. Для каждой конечной точки заводиш переменную и храниш в ней тригер данных. Для каждой конечной точки - свой. Они никак не связаны. После ClearFeature(HALT) все тригеры ставиш в DATA0. После пересылки пакета в/из конечной точки меняеш тригер этой конечной точки на противоположный. А как данные не идут? Статус дескриптора какой - может ты STALL получаеш? Там тогда немного другая история... Цитата SanSan @ Насчет сброса порта. Не подскажешь, как это делается для UCHI? В Кулакове не нашел (может, пллохо читал?), а больше ничего в руки не попадалось по UCHI. В спецификации UHCI есть, и в Кулакове есть в описании регистров. Просто там написано что-то вроди: ![]() ![]() Port Reset - в современных контроллерах не используется. А это не правда. Точнее не совсем правда. Без сброса порта всё работает, но не со всеми устройствами. Экспериментально установил что работают стационарные устройства (типа принтеры, сканеры), а если мобилу подключить - не работает. В общем не работает большинство переносных устройств - они просто питание экономят и из спячки при подключении выходить смысла не видят ![]() А ресет им говорит что пришла пора просыпаться и на роботу идти ![]() Цитата SanSan @ Насчет PCI BIOS. Да, пытаюсь выяснить его наличие в реальном режиме, как по Кулакову, через функцию 0xB101 прерывания 0x1A и она выставляет мне флаг переноса( Первый раз такую фигню встречаю... Правда я сам PCI BIOS не использую. Поищи описание регистров PCI - просто сайт где я читал счас в дауне. Потом ссылку выложу если подымется. PS: а вообще я конечно понимаю что читать много, но перечитай этот топик с начала, и есть ещё тема OHCI_USB в этом разделе - тоже можеш почитать. Многие вопросы отпадут. |
Сообщ.
#154
,
|
|
|
Все, заработало! По крайней мере, с одной флешкой. Действительно, на ClearFeature ей, похоже, наплевать, а накосячил я с триггерами.
Спасибо Большое! Но вопросы некоторые остались. 1. Как узнать про эти Stall/NAK/ACK?? Вот рассмотрим все тот же мой пример. В конечную точку BULK-OUT посылаю дескриптор с CBW, в маркере PID = 0xE1. Второй дескриптор - прием данных - в конечную точку BULK-IN c PID = 0x69. И третий дескриптор тоже с BULK-IN, PID = 0x69, прием CSW. Как мне проверить Stall/NAK/ACK? Надо смотреть биты 19 и 22 слова управления? Если да, то какого дескриптора? И почему в документации для этих Stall/NAK/ACK определены специальные PID в маркере? Ведь, насколько я понимаю, маркер дескриптора не изменяется при обработке дескриптора, а меняется только слово управления/состояния? 2. Насчет ResetRecovery. Я это так себе понимаю. Сначала делаю сброс порта: Выставляю в регистре порта бит №9, жду некоторое время (кстати, сколько надо ждать?), потом зануляю этот бит, и выставляю биты 3, 2, 1 (Разблокирую порт). Потом в нулевую конечную точку посылаю setup-пакет с командой "Bulk-Only Mass Storage Reset". Правильно я делаю? 3. В случае получения Stall надо делать ResetRecovery? Растолкуй, плз))) |
Сообщ.
#155
,
|
|
|
Посоветуите пожалуйста!
Я в качестве File System решил использовать EFSL Библиотека простенкая, но рабочая (всего час потратил чтобы прицепить к своему bc31, ведь она, кажется пингвином родилась). Может есть другое мнение по этому поводу, или может кто нибудь знаком с этой библиотекой и не посоветует ее использовать. |
Сообщ.
#156
,
|
|
|
Почитал.
Вроди ничего библиотека. Хотя сам не пользовался - так что это первое впечатление так сказать... Кстати, PRT если тебе ещё интересно - я раскопал насчёт команды 23h (Read Format Capacities). Попробовал на своей флэшке и на MP3 плеере помониторить транзакции. Результат такой. Вот как Windows инициализирует устройства: ![]() ![]() RESET RECOVERY GET MAX LUN for(lun=0;lun<MAX_LUN;lun++) { INQUIRY if(MAX_LUN>0) READ FORMAT CAPACITIES; // зачем я не знаю... do READ CAPACITY while (ERROR && timeout<2s); } READ SECTOR .... Ну и всё это разбавлено ещё REQUEST SENSE - но это несущественно... Тут сразу два замечания. 1. В твоих логах тоже должна быть команда 25h - пролистай ниже. 2. Твой код скорее всего будет работать не со всеми флэшками. В том смысле что ты делаеш READ CAPACITY, если ошибка пробуеш ещё раз. Т.е. попытки две. Лично по моим экспериментам - моя флэшка просыпается где-то через секунду. Но максимальное время ожидания должно быть 2 сек - Win за это время успевает 5 раз попытаться, моя прога тоже около того. Но это не существенно - можно и два раза если между попытками сделать задержку 1.5 - 2 секунды. Плюс я просто постоянно пытаюсь выполнить READ CAPACITY пока не удастся, ну или таймаут через 2 сек - всё работает. А Win по очереди пытается READ CAPACITY и READ SECTOR(0) выполнить. Да, кстати - тут писали выше в постах что если перед READ CAPACITY сделать REQUEST SENSE то READ CAPACITY сработает с первого раза - у меня ни с флэшкой ни с плеером не помогло... Вот так. |
Сообщ.
#157
,
|
|
|
![]() ![]() Но максимальное время ожидания должно быть 2 сек - Win за это время успевает 5 раз попытаться, моя прога тоже около того. Но это не существенно - можно и два раза если между попытками сделать задержку 1.5 - 2 секунды. Плюс я просто постоянно пытаюсь выполнить READ CAPACITY пока не удастся, ну или таймаут через 2 сек - всё работает. Ах, вот в чем дело!!! У меня все кардридеры и флешки отвечают на READ_CAPASITY сразу, а вот с одной флешкой (кстати с самой дорогой ![]() ![]() ![]() В твоих логах тоже должна быть команда 25h - пролистай ниже Ты прав, пролистал и нашел. Так что несколько килобаит спасибо тебе. |
Сообщ.
#158
,
|
|
|
Цитата PRT @ У меня все кардридеры и флешки отвечают на READ_CAPASITY сразу Там ерунда в том что кардридер у тебя к шине подключён наверное при загрузке. А флэшку ты когда подключаеш - она просто как бы флэш накопитель монтирует при первом обращении. Потому и долго. У меня флэшка тоже вроди не дешёвая - Transcend. А 2 сек. - это специфика SCSI вроди - для CD-ROM например готовности тоже 2 сек ждать надо... Цитата PRT @ Так что несколько килобаит спасибо тебе. Всегда пожалста ![]() Кстати если нужен монитор USB - скачай USBTrace 1.3.1 http://www.sysnucleus.com/USBTrace_Build_25_270207_Installer.exe Скрытый текст Нужен будет ключ пиши в приват - я генерилку сделал. |
Сообщ.
#159
,
|
|
|
Вопрос про EHCI.
EHCI-это контроллер, который обслуживает только HS устроиства. Для работы с LS и FS устроиств он в паре имеет компаньона UHCI или OHCI. Так как исключительно все HS устроиства умеют работать в FS режиме, и если не нужна HS производительность, можно обойтись без программирования EHCI контроллера, так как по умолчанию он отдает управление компаньону, даже если подключено HS устроиство. Иначе говоря (по человечески): можно наплевать на EHCI, все будет работать и без него. Вообщем вопрос такой: все что я сейчас наговорил, правильно или нет? |
Сообщ.
#160
,
|
|
|
Всё что наговорил - правильно. Но с одной оговоркой.
Есть некоторые BIOS'ы с дурацкой привычкой инициализировать EHCI - они или обеспечивают работу с флэшкой как с обычным диском, или для загрузки с флэшки. В принципе их не так уж много - но они есть. И тогда EHCI заберёт HS устройство у компаньона. В принципе для 100% гарантии надо сделать сброс EHCI - тогда он отдаст все устройства компаньону. Сложного там нет ничего: детектиш контроллер на PCI, читаеш базовый адрес и записью в определённый регистр сбрасываеш EHCI контроллер. Или можно в BIOS USB2.0 или EHCI отключить - смотря как оно там числится и если вообще есть такая опция. Но тогда EHCI и под Win работать не будет. А так в принципе да, поддержка UHCI и OHCI - это 100% поддержка USB, только максимум на 12Mb/s (FullSpeed). Кстати - а у тебя со всеми флэшками работает? А то у меня тут какой-то косяк обнаружился с MP3 плеером :/ Делаю Bulk Only Reset - и он подвисает... Если не делать - всё работает. Если делать только Clear Feature(HALT) на конечных точках - тоже работает. А именно на запросе Bulk Only Reset виснет. Что за ерунда - не пойму... |
Сообщ.
#161
,
|
|
|
![]() ![]() В принципе для 100% гарантии надо сделать сброс EHCI - тогда он отдаст все устройства компаньону. Да, разумнее сделать именно так. Насчет со всеми флэшками работает или нет, на одном кардридере ResetRecovery не проходит, но ничего не зависает. Я его (request = 21h ffh 00h 00h 00h) вообще убрал и использую только ClearSTALL, не знаю насколько это правильно но пока живу счастливо. |
Сообщ.
#162
,
|
|
|
Цитата PRT @ Я его (request = 21h ffh 00h 00h 00h) вообще убрал и использую только ClearSTALL, не знаю насколько это правильно но пока живу счастливо. Да я вот тоже заметил что без него счастья больше ![]() Просто Win вроди делает и у неё нормально всё... Буду копать. |
Сообщ.
#163
,
|
|
|
Цитата cppasm @ А именно на запросе Bulk Only Reset виснет. Что за ерунда - не пойму... У меня тоже такая фигня наблюдалась с МП3 плеером и одним крадридером, но как ее победить я так и не нашел, просто перестал делать Bulk Only Reset в принципе ![]() ![]() Добавлено Мда, не пролестнул на следующую страницу ![]() |
Сообщ.
#164
,
|
|
|
Цитата Gerret @ У меня тоже такая фигня наблюдалась с МП3 плеером и одним крадридером, но как ее победить я так и не нашел, просто перестал делать Bulk Only Reset в принципе Я счас усиленно мониторы пользую - хочу посмотреть что там Win делает. Может удасться побороть. А то Reset для восстановления после ошибок вроди ввели, а он сам как ошибка ![]() Ещё думаю исходники дров от FreeBSD посмотреть... Если чего выясню - отпишусь. Добавлено Забавно, в исходниках Linux Bulk_Only_Reset есть, но нигде не используется ![]() Т.е. функция есть, а её вызовов нет... |
Сообщ.
#165
,
|
|
|
Windows тоже Bulk_Only_Reset не делает.
Наверное и я не буду ![]() Но всё таки мне такой расклад не сильно нравится. Получается некоторые разработчики решили что их устройство 100% сбои давать не будет. Неужели так трудно было сделать поддержку ещё одной команды ![]() |