На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (51) « Первая ... 9 10 [11] 12 13 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Цитата SanSan @
    1) Почему не текут данные, что я делаю не так?

    Ну так трудно определить - раз данные не приходят, значит ты транзакцию неправильно производиш, в дескрипторах ошибка или ещё где...
    Цитата SanSan @
    2) В документации и в Кулакове используется понятие "Сброс порта". Что это такое и как это делается? Я произвожу только общий сброс контроллера. Может, из-за этого?

    Сброс порта, это только сброс одного порта, а сброс хост контроллера - это сброс контроллера и всех портов.
    После подключения устройства надо делать сброс порта чтобы произошёл сброс устройства и оно получило нулевой адрес.
    Хотя на некоторых UHCI и без сброса работает.
    Ты же не будеш при подключении нового устройства сбрасывать весь контроллер и полностью перенумеровывать все устройства...
    Цитата SanSan @
    3) Windows в списке устройств USB показывает помимо универсального хост-контроллера еще "Корневой концентратор USB", причем все подключенные устройства можно увидеть, если залезть в его свойства. Значит ли это, что с устройствами надо работать, используя спецификации для хабов, в частности, при енумерации?

    Нет - корневой хаб это абстракция.
    Ты когда работаеш с регистрами контроллера - по сути работаеш с корневым хабом.
    Просто в Windows сделали таким образом что реализовали как-бы виртуальный хаб, все запросы к которому обрабатывает драйвер.
    Это чтобы не было различий между корневым хабом и всеми остальными.
    Цитата SanSan @
    4) На некоторых компах (вполне современных) при попытке прочитать PCI BIOS (как по Кулакову) говорит, что PCI BIOS не обнаружен. Режим 16-разрядный. Как же тогда получить адреса контроллера?

    Проверялось в реальном режиме?
    Даже если нет поддержки PCI BIOS (в чём я очень сомневаюсь), можно работать с PCI на уровне портов ввода/вывода.
      Транзакцию делаю так: в очередь добавляю два дескриптора. Первый дескриптор передает команду в конечную точку 2 (BULK OUT), в маркере задаю PID = 0xE1, MaxLen = 30, триггер данных DATA1. Вторым дескриптором пытаюсь получить данные из конечной точки 1 (BULK IN), в маркере задаю PID = 0x69, MAxLen = 63, триггер данных устанавливаю тоже DATA1. Скажи, пожалуйста, хотя бы правильно ли рассуждаю в принципе, или я не понимаю механизм BULK-обмена?

      Насчет сброса порта. Не подскажешь, как это делается для UCHI? В Кулакове не нашел (может, пллохо читал?), а больше ничего в руки не попадалось по UCHI.

      Насчет PCI BIOS. Да, пытаюсь выяснить его наличие в реальном режиме, как по Кулакову, через функцию 0xB101 прерывания 0x1A и она выставляет мне флаг переноса(
        Цитата SanSan @
        Скажи, пожалуйста, хотя бы правильно ли рассуждаю в принципе, или я не понимаю механизм BULK-обмена?

        В принципе правильно.
        Только после получения данных надо ещё пакет статуса читать - 13 байт.
        Ну это я думаю ты знаеш - посмотри простокол обмена.
        Я думаю грабли у тебя всё те же. Просто видно лень 10 страниц топика читать :)
        Если коротко - то суть такая.
        В начале делаеш Reset Recovery и ClearFeature(HALT) для обоих конечных точек.
        Для каждой конечной точки заводиш переменную и храниш в ней тригер данных.
        Для каждой конечной точки - свой. Они никак не связаны.
        После ClearFeature(HALT) все тригеры ставиш в DATA0.
        После пересылки пакета в/из конечной точки меняеш тригер этой конечной точки на противоположный.
        А как данные не идут?
        Статус дескриптора какой - может ты STALL получаеш?
        Там тогда немного другая история...


        Цитата SanSan @
        Насчет сброса порта. Не подскажешь, как это делается для UCHI? В Кулакове не нашел (может, пллохо читал?), а больше ничего в руки не попадалось по UCHI.

        В спецификации UHCI есть, и в Кулакове есть в описании регистров.
        Просто там написано что-то вроди:
        ExpandedWrap disabled
          Port Reset - в современных контроллерах не используется.

        А это не правда. Точнее не совсем правда.
        Без сброса порта всё работает, но не со всеми устройствами.
        Экспериментально установил что работают стационарные устройства (типа принтеры, сканеры), а если мобилу подключить - не работает.
        В общем не работает большинство переносных устройств - они просто питание экономят и из спячки при подключении выходить смысла не видят :)
        А ресет им говорит что пришла пора просыпаться и на роботу идти :)


        Цитата SanSan @
        Насчет PCI BIOS. Да, пытаюсь выяснить его наличие в реальном режиме, как по Кулакову, через функцию 0xB101 прерывания 0x1A и она выставляет мне флаг переноса(

        Первый раз такую фигню встречаю...
        Правда я сам PCI BIOS не использую.
        Поищи описание регистров PCI - просто сайт где я читал счас в дауне.
        Потом ссылку выложу если подымется.

        PS: а вообще я конечно понимаю что читать много, но перечитай этот топик с начала, и есть ещё тема OHCI_USB в этом разделе - тоже можеш почитать.
        Многие вопросы отпадут.
          Все, заработало! По крайней мере, с одной флешкой. Действительно, на 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?

          Растолкуй, плз)))
            Посоветуите пожалуйста!
            Я в качестве File System решил использовать EFSL
            Библиотека простенкая, но рабочая (всего час потратил чтобы прицепить к своему bc31, ведь она, кажется пингвином родилась).
            Может есть другое мнение по этому поводу, или может кто нибудь знаком с этой библиотекой и не посоветует ее использовать.
              Почитал.
              Вроди ничего библиотека.
              Хотя сам не пользовался - так что это первое впечатление так сказать...
              Кстати, PRT если тебе ещё интересно - я раскопал насчёт команды 23h (Read Format Capacities).
              Попробовал на своей флэшке и на MP3 плеере помониторить транзакции.
              Результат такой.
              Вот как Windows инициализирует устройства:

              ExpandedWrap disabled
                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 сработает с первого раза - у меня ни с флэшкой ни с плеером не помогло...

              Вот так.
              Сообщение отредактировано: cppasm -
                ExpandedWrap disabled
                  Но максимальное время ожидания должно быть 2 сек - Win за это время успевает 5 раз попытаться, моя прога тоже около того.
                  Но это не существенно - можно и два раза если между попытками сделать задержку 1.5 - 2 секунды.
                  Плюс я просто постоянно пытаюсь выполнить READ CAPACITY пока не удастся, ну или таймаут через 2 сек - всё работает.

                Ах, вот в чем дело!!! У меня все кардридеры и флешки отвечают на READ_CAPASITY сразу, а вот с одной флешкой (кстати с самой дорогой :) ) приходилось ставить delay(2000)

                ExpandedWrap disabled
                  В твоих логах тоже должна быть команда 25h - пролистай ниже

                Ты прав, пролистал и нашел. Так что несколько килобаит спасибо тебе.
                  Цитата 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
                  Скрытый текст
                  Нужен будет ключ пиши в приват - я генерилку сделал.
                    Вопрос про EHCI.
                    EHCI-это контроллер, который обслуживает только HS устроиства. Для работы с LS и FS устроиств он в паре имеет компаньона UHCI или OHCI. Так как исключительно все HS устроиства умеют работать в FS режиме, и если не нужна HS
                    производительность, можно обойтись без программирования EHCI контроллера, так как по умолчанию он отдает управление компаньону, даже если подключено HS устроиство.
                    Иначе говоря (по человечески): можно наплевать на EHCI, все будет работать и без него.
                    Вообщем вопрос такой: все что я сейчас наговорил, правильно или нет?
                      Всё что наговорил - правильно. Но с одной оговоркой.
                      Есть некоторые 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 виснет.
                      Что за ерунда - не пойму...
                        ExpandedWrap disabled
                          В принципе для 100% гарантии надо сделать сброс EHCI - тогда он отдаст все устройства компаньону.

                        Да, разумнее сделать именно так.

                        Насчет со всеми флэшками работает или нет, на одном кардридере ResetRecovery не проходит, но ничего не зависает. Я его (request = 21h ffh 00h 00h 00h) вообще убрал и использую только ClearSTALL, не знаю насколько это правильно но пока живу счастливо.
                          Цитата PRT @
                          Я его (request = 21h ffh 00h 00h 00h) вообще убрал и использую только ClearSTALL, не знаю насколько это правильно но пока живу счастливо.

                          Да я вот тоже заметил что без него счастья больше :)
                          Просто Win вроди делает и у неё нормально всё...
                          Буду копать.
                            Цитата cppasm @
                            А именно на запросе Bulk Only Reset виснет.
                            Что за ерунда - не пойму...

                            У меня тоже такая фигня наблюдалась с МП3 плеером и одним крадридером, но как ее победить я так и не нашел, просто перестал делать Bulk Only Reset в принципе :) без него флешки легко работают ;)

                            Добавлено
                            Мда, не пролестнул на следующую страницу :)
                              Цитата Gerret @
                              У меня тоже такая фигня наблюдалась с МП3 плеером и одним крадридером, но как ее победить я так и не нашел, просто перестал делать Bulk Only Reset в принципе

                              Я счас усиленно мониторы пользую - хочу посмотреть что там Win делает.
                              Может удасться побороть.
                              А то Reset для восстановления после ошибок вроди ввели, а он сам как ошибка <_<
                              Ещё думаю исходники дров от FreeBSD посмотреть...
                              Если чего выясню - отпишусь.

                              Добавлено
                              Забавно, в исходниках Linux Bulk_Only_Reset есть, но нигде не используется :)
                              Т.е. функция есть, а её вызовов нет...
                                Windows тоже Bulk_Only_Reset не делает.
                                Наверное и я не буду :)
                                Но всё таки мне такой расклад не сильно нравится.
                                Получается некоторые разработчики решили что их устройство 100% сбои давать не будет.
                                Неужели так трудно было сделать поддержку ещё одной команды :ph34r:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 9 10 [11] 12 13 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0519 ]   [ 15 queries used ]   [ Generated: 21.07.25, 19:28 GMT ]