На главную Наши проекты:
Журнал   ·   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) « Первая ... 19 20 [21] 22 23 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Цитата Gerret @
    Сомневаюсь ... я еще не встречал открытых драйверов поддерживающих горячую замену.

    Есть такой драйвер DUSE называется. Но работате он очень криво и насколько я знаю не поддерживается сейчас. Я его пробовал на разных машинах ни на одной нормально не работал. Самый хороший драйвер для USB под DOS usbaspi v 2.27. Работает практически везде. Пробовал его на самых разных машинах. Кое-где есть проблемы с BIOS. Но не поддерживает горячее подключение. Думал хоть в последней версии сделают - нет, фигу :)
      Доброго дня!
      Народ, интересует вопрос по поводу запроса данных с устройства.
      Есть девайс с maxPacketSize = 8 байт. Запрашиваю 32 байта - соответственно выстраиваю очередь из одного SETUP и 5 DATA дескрипторов (последний нулевой). Жду, пока в QH.ELinkPointer будет нулевой бит единичкой (как в последнем TD).
      Если девайс выдаёт все запрошенные данные - всё отлично. Но если устройство отдаёт меньше, например, 0 байт, то как быть? Как проверить, что транзакция фактически завершена, просто оно не может удовлетворить просьбы всех дескрипторов? Неужели по всем дескрипторам пробегаться нужно?
      Если можно, поделитесь грамотным протоколом =)
      Спасибо.
      Сообщение отредактировано: Хрен -
        Вроде всегда должен ещё быть выход по таймауту. Соответственно, при нём, пробегая все отработанные дескрипторы, можно определить, сколько получено реально данных.
        ВОзможно, но точно не помню, если данных больше нет, то будет приходить NAK (выставляться бит на текущем дескрипторе). Так что можно ещё и так.
        Я делал через таймаут. Медленне, но проще.
          Доброго времени суток!
          Ещё возникла такая проблема:
          Есть USB 1.1 устройство. На некоторых материнках если оно вставлено до включения компа, оно находится на UHCI контроллере, и всё нормально определяется. Если изначально её не было, и девайс вставить после первого опроса, то при его включении состояние портов UHCI не меняется абсолютно. При этом, USB Legacy support в БИОСе отключен, а при опросе портов я сбрасываю и EHCI, и UHCI контроллеры. Подобное поведение я пока наблюдаю только на одной модели материнок, на остальных всё ок.

          В чём может быть проблема, не подскажете?
            Попробуй EHCI отключить совсем, сброса не достаточно.
              Цитата cppasm @
              Попробуй EHCI отключить совсем, сброса не достаточно.

              А каким образом примерно это делается? В спецификации не нашёл нигде такой опции. Мож проглядел...
                У меня такое было.
                Или в BIOS Setup отключаешь EHCI или пробегаешь по всем портам EHCI и смотришь на предмет появления нового устройства (порт будет с битом изменения статуса подключения, а может и не быть :D тогда надо исхитряться). Так вот переводишь этот порт во владение UHCI. В спецификации на EHCI все описания есть, это можно реализовать за полчаса.

                Есть подозрение, что ты не запрашиваешь own change. Или не так ресетишь. Так как после ресета все порты всегда отдаются медленным контроллерам.
                А если ты не забрал владение им, то может быть, как ты описываешь
                  Цитата lsvmo @
                  Или не так ресетишь

                  Нахожу EHCI контроллер среди PCI устройств.
                  Получаю базовый адрес из BAR0
                  В первый бит USBCMD записываю единицу и жду, пока он сбросится в ноль.

                  Поправь, если не правильно. Но контроллер в таком случае мне ничего не отдаёт =(
                    Вот, нашёл в спецификации:

                    Цитата
                    The Configured Flag (CF) bit (defined in Section 2.3.8), is used
                    to globally set the policy of the routing logic. Each port register has a Port Owner control bit which allows the EHCI Driver to explicitly control the routing of individual ports. Whenever the CF bit transitions from a zero to a one (this transition is only available under program control) the port routing unconditionally routes all of the port registers to the EHCI HC (all Port Owner bits go to zero). While the CF-bit is a one, the EHCI Driver can control individual ports' routing via the Port Owner control bit. Likewise, whenever the CF bit transitions from a one to a zero (as a result of Aux power application, HCRESET, or software writing a zero to CF-bit), the port routing unconditionally routes all of the port registers to the appropriate companion HC. The default value for the EHCI HC’s CF bit (after Aux power application or HCRESET) is zero.


                    Насколько я понял отсюда, бит CF глобально управляет перенаправлением портов на порты компаньонов, и по умолчанию этот бит равен нулю, т.е. все порты отдавать компаньону. Если даже этот бит изначально единичный, то после сброса он должен стать нулевым (он и становится, я проверял), и все порты должны отдаться компаньону.
                    Не понятно, почему этого не происходит.
                      Итак, ещё покурив спеки, пришёл к следующему алгоритму:

                      1. При начальном ресете контроллера ставим CF=1
                      2. Пробегаемся по всем портам на предмет наличия подключённых устройств.
                      3. Если находим, проверяем 11-й бит, который указывает на НЕ Hi-speed устройство.
                      4. Если 11-й бит единичный, производим сброс:
                      4.1 Записываем в 8-й бит (Port Reset) единицу и 2-й бит (Port Enabled) ноль, предварительно проверив, что контроллер запущен.
                      4.2 Ждём 5 мс
                      4.3 Записываем в Port Reset ноль.
                      4.4 Читаем Port Reset, пока не будем читать оттуда 0 - это означает, что сброс окончательно закончен.
                      5. Проверяем бит Port Enabled. Если он равен нулю, значит устройство не Hi-Speed, и можно переводить его на компаньона.
                      6. Выставляем Port Owner в единицу, говоря этим контроллеру, чтобы отдал порт компаньону.

                      Проблема заключается в том, что после ресета значение регистра порта - 1803h = 1100000000011b, т.е. устройство подключено, оно не Hi-Speed, и оно не отдано компаньону. И если выставить в единицу 13-й бит (Port Owner), то значение всё так же остаётся 1803h, даже если после записи подождать (ждал вплоть до секунды). Где я дурак?
                        Разобрался. Проблема была в ошибке записи в регистры.
                        Вобщем, редирект портов компаньону делается либо глобально (Установкой CF бита флага в 1) или отдельно для каждого порта, как я писал выше. CF при этом должен быть 0.
                          Здрасте. не сочтите лохом, но у меня проблема. только начинаю работать с usb под DOS на Паскале. есть OHСI и EHСI. в PCI conf space лежат их MemoryBaseAdress : EFFFD000h и EFFFC000h соответственно. Допустим мне нужно изменить регистр OHCI контроллера со смещением 100h (согласно даташиту материнки - это keyboard emulation logic (KEL) - эмулирует usb клаву и мышь как PS/2-шные, надо это отключить очень). Как это сделать? c UHC просто - там IO порты...
                          Как я понял EFFFD - это физический адрес... Помогите, пожалуйста, вторую неделю безрезультатно копаюсь в инете... подойдет хороший совет или примерчик на любом языке.
                            Цитата lojkofob @
                            Как я понял EFFFD - это физический адрес...

                            Нет, физический адрес тут EFFFD000h
                            Находится вверху 4Гб адресного пространства как и все отображаемые в память устройства.
                            Для доступа к нему надо либо переходить в protected mode, либо в unreal mode.
                            Из реального режима к этим адресам доступа нет, только к первому мегабайту.
                              Цитата lojkofob @
                              начинаю работать с usb под DOS на Паскале

                              Потребуется прямой доступ к физической памяти, что в паскале очень не удобно.

                              Добавлено
                              Цитата lojkofob @
                              Как это сделать?

                              Также как и в порты, только писать в физическую память. Например если использовать "нереальный" режим через GS, то это может выглядеть например так для записи байта:
                              ExpandedWrap disabled
                                mov EBX, [MemoryBaseAdress]
                                add EBX, [OHCRegister]
                                mov AL, [Value]
                                mov byte GS:[EBX], AL


                              Добавлено
                              ну я думаю, защищенным режимом тебе закорачиваться не стоит т.к. там еще кучу всего писать придется, а вот
                              программ переводящих в унреал предостаточно, можешь почитать Кулакова "программирование на аппаратном уровне"
                              Сообщение отредактировано: shm -
                                Нереальный режим проще в реализации (меньше кода), перешёл и забыл, можно написать на ассемблере 6 функций вида mem_write_8/16/32, mem_read_8/16/32 и пользоваться из Паскаля.
                                С защищённым тоже не всё так сложно, есть DOS-extender'ы которые многое делают за тебя по переходу в защищённый режим и обработке прерываний.
                                Есть ли такие которые можно с Паскалем использовать не знаю.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 19 20 [21] 22 23 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0559 ]   [ 15 queries used ]   [ Generated: 22.07.25, 18:06 GMT ]