На главную Наши проекты:
Журнал   ·   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) [1] 2 3 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    Я звметил, что тема работы с USB флешками под ДОС довольно часто поднимается.
    Давайте в этой теме, что ли, будем делиться имеющейся информацией и опытом!

    Для начала расскажу о том, какие основные моменты я уяснил спустя пол года мороки с этим вопросом:
      [1]. Существует всего 3 типа хост-контроллеров шины USB
      [2]. Все эти контроллеры являются устройствами подключенными к шине PCI компьютера. Каждому типу контроллера соответствует свой класс-код устройства PCI:
      • OHC - 0x0C0310
      • UHC - 0x0C0300
      • EHC - 0x0C0320
      [3]. Какая ОС у вас установлена, значения не имеет. Главное, чтобы она не блокировала вызовы прерываний BIOS.
      [5]. Контроллеры OHC и EHC проецируют свои управляющие регистры на оперативную память (например у меня регистры OHC лежат по адресу 0xDFFFB000).
      [6]. Доступ к регистрам UHC контроллера осуществляется через порты ввода/вывода.
      [7]. Для всех USB флешек, протоколом обмена данными верхнего уровня является SCSI 2 протокол. Команды этого протокола упаковываются в пакеты протокола USB Bulk Only transport (Дакументация).
    есть еще много всего, но сейчас писать лень ;)

    Мне удалось заставить работать USB флешки под ДОС на материнке с OHC хост контроллером.
    Так же есть опыт (были только пробы) работы с UHC контроллером.
    В частности, я тут видел, поднимался вопрос о том, почему UHC не работает с USB 2.0 устройствами.
    Отвечу:
    потому что на этой материнке установлен EHC контроллер. А в его состав входит несколько UHC контроллеров. И при подключенни устройства у порту специальная логика сама определяет, к какому контроллеру дать управление этим устройством.

    Ну так вот! Давайте сдесь задавать свои вопросы и обсуждать решения!

    P.S. Рекомендую почитать Кулакова "Программирование на аппаратном уровне 2-е издание", у него очень не плохо освещена тема работы с UHC контроллером.
      У меня задача такая - Необходимо распознавать USB Flash диски в DOS-е и поддерживать hot swapping без перезагрузки компа.
      Спасибо за приведенные тобой ссылки. Придеться изучать документацию, хотья это не тривиальная задача.
      Сможешь ли ты поделится своими наработками по этому вопросу?
        Irakli911
        Что имеется в виду под наработками??? Если исходники, то у меня они в виде сырых классов и без коментариев, а тестовая программа есть как экзешник... Все это адоптировано под OHC контроллер.
        В настоящий момент я перехожу к созданию полноценного драйвера под ДОС (в виде резидентной проги). Так что все что было, буду переписывать...

        А ты что-нибудь начинал? Если нет, то сначала почитай Кулакова или Агурова, а то без представления, чем оперирует контроллер в исходник без коментариев врубиться не получится :)

        В общем, я приложу класс, который работает с OHC контроллером и asm файлы с функциями для перехода в режим линейной адресации и чтения памяти далеко за 1-ым мегабайтом (это взято из книги Кулакова).
        Прикреплённый файлПрикреплённый файлUSB_CLASS.zip (10.61 Кбайт, скачиваний: 1042)
          Ссылку взял. Пойду почитаю доки и через несколько дней опять появлюсь. Спасибо
            Gerret, может, статью в FAQ напишешь? ;)
              Уже были мысли :) тока я ни разу не пробовал статьи писать...
              Но я думаю, что когда я свой проект завершу, обязательно займусь :)
                Привет Garret, извиняюсь за задержку. Докумертацию по OHC и Агурова вроде освоил. Появилось масса вопросов. Во первых в ссылке USB_CLASS.ZIP не хватает несколько .h фаилов. Также не смог понять почему в конструкторе TOHCI написано PutToOpRegister(0x100,0), вроде в адресном пространстве со смещением 256 регистров нету. Тамже Off=0x210 - что это? Не очень понял назначение регистра HCCA.
                Если можно выложи полную ссылку. Заранее спасибо
                  Цитата Irakli911 @
                  не хватает несколько .h фаилов

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

                  Цитата Irakli911 @
                  почему в конструкторе TOHCI написано PutToOpRegister(0x100,0)

                  Это отключение Legacy Support. В самом конце документации про это написано.


                  Цитата Irakli911 @
                  Тамже Off=0x210 - что это?

                  Это смещение относительно начала области данных контроллера, в которую я складываю дескрипторы конечных точек и дескрипторы передачи для SETUP транзакций.

                  Цитата Irakli911 @
                  Не очень понял назначение регистра HCCA.

                  В этом регистре лежит адрес структуры HCCA. Про нее подробно написано в разделе 4.4 Host Controller Comunication Area.
                    Крутая отечественная инфа по делу:
                    Павел Агуров. "Интерфейс USB. Практика использования и программирования"
                    http://depositfiles.com/files/52364/156.rar.html или
                    http://rapidshare.de/files/20318919/usb.zip.html
                      Я из под ДОСа OHCI мучаю уже месяц, и, в принципе, многое понятно.
                      В спецификациях все разжовано, вот только проблема, что читать нуна, на английском не особо удобно, особенно не владея английским. :D
                      И вот что не понятно имено мне:
                      Я определяю наличие коннекта (по регистру HcRhPortStatus[NP]),
                      включаю порт, проверяю питание и т.д.
                      потом (интерфейс OHCI), наскока понял, надо послать запрос Get_Status, да?
                      Посылаю.
                      девайсы, питающиеся от собственного источника (например, винт с usb-интерфейсом) отвечают на запрос нормально.
                      флэшки, супер линки и т.д., питающиеся от шины, на запрос Get_Status, возвращают DeviceNotResponding (При отсутствии вобще каких либо устройств на портах возвращается тот же ответ).
                      И вот не понятно, то ли принудительно при обнаружении коннекта надо сбрасывать порт, а может запросы посылать не в той последовательности, послать, например, Set_Feature, ведь при этом запросе хаб посылает reset в соответствующий порт, а вдруг надо делать задержку.
                      И еще один момент, для всего выше перечисленного использую Control transfer. Не затрагивает ли этот трансфер поле HCCAInterruptTable области HCCA, можно ли обойтись без использования этой таблицы? И вобще, каким макароном эта таблица работает?
                        Цитата Barbosman @
                        И вот не понятно, то ли принудительно при обнаружении коннекта надо сбрасывать порт, а может запросы посылать не в той последовательности...

                        Что подразумевается под сбрасыванием порта? Установка PortResetStatus бита? Если да, то надо обязательно.

                        Цитата Barbosman @
                        потом (интерфейс OHCI), наскока понял, надо послать запрос Get_Status, да?

                        А какое отношение интерфейс OHCI имеет к Get_Status? Get_status это вроде команда USB протокола...

                        До установки адреса устройства можно запросить у него первые 8 байт дескриптора устройства, на этот запрос обязаны отвечать любые устройства. По поводу Get_Status не знаю, не использовал.

                        Цитата Barbosman @
                        Не затрагивает ли этот трансфер поле HCCAInterruptTable области HCCA

                        Нет не затрагивает.

                        Цитата Barbosman @
                        можно ли обойтись без использования этой таблицы?

                        Ну не использовать ее можно, но не определять ее адрес в регистре контроллера нельзя. Ее можно просто не заполнять.

                        Цитата Barbosman @
                        И вобще, каким макароном эта таблица работает?

                        Сам я ее не использовал, но насколько понял она используется для передач по прерываниям. Т.е. в ней лежат адреса дескрипторов конечных точек. Контроллер в определенное время (см. 3.3.2 Data Structures. Figure 3-4: Interrupt ED Structure) вытаскивает из таблицы адрес Interrupt ED и выполняет передачу. Дальше - ХЗ... не пробовал.

                        P.S. Если что не так понял... извените ;)
                        P.P.S. С хабами я вообще пока не сталкивался :ph34r:
                          ну по поводу Get_Status:
                          описалово этого запроса я взял из Агурова "Интерфейс USB", несмотря на то ,что там описывается UHCI (а у меня OHCI), оттуда взял коды этого запроса, оформил TD для пакета Setup, потом TD для приема считанной инфы, ну и TD для ответа (конца транзакции). С девайсиной, что питается от своего источника запрос прошел успешно, а с суперлинком, который мне как раз нужен - трабл.
                          Т. е., насколько я понял мысль, последовательность при обнаружении коннекта следующая:
                          сбросить порт установкой соответствующего бита в HcRhPortStatus[NP], потом послать ему Get_Descriptor, на что будут получены первые 8 байт стандартного дескриптора устройства, так получается?
                          А как расшифровывать значения этих 8-ми байт?
                          ну и в конце концов присвоить устройству адрес с помощью Set_Adress.
                          правильно я понял?

                          Добавлено
                          эти 8 байт соответствуют первым 8-ми байтам стандартного дескриптора? Он то целых 18 весит
                            Цитата Barbosman @
                            А как расшифровывать значения этих 8-ми байт?

                            Странный вопрос для человека читавшего Агурова... (см. стр. 106 - Дескриптор устройства).
                            Собственно самое ченное в этих 8-и байтах это максимальный размер пакета для 0-й конечной точки устройства.

                            Вот последовательность, по которой я инициализирую устройства на шине USB:
                            Шаг 1: Получаем 8 байт дескриптора устройства
                            Шаг 2: Устанавливаем адрес устройства
                            Шаг 3: Если надо, можно запросить полностью весь дескриптор устройства. Надо если у устройства может быть несколько конфигураций и для возможности считать строки с описанием изготовителя и продукта.
                            Шаг 4: Запрашиваем первые 8 байт дескриптора конфигурации. Из него берем полную длину конфигурации устройства. (см. Агурова)
                            Шаг 5: Запрашиваем всю конфигурацию устройства (на этот запрос пролучим все дескрипторы интерфейсов и конечных точек для данной конфигурации).
                            Шаг 6: Из дескриптора интерфейса узнаем тип устройства и если он нам подходит то выполняем SET_CONFIGURATION в качестве параметра которого выступает байт bConfigurationValue из дескриптора конфигурации.

                            Собственно SET_CONFIGURATION и есть так называемое конфигурирование (инициализация) устройства.

                            P.S. Все эти запросы к конкретным USB контроллерам отношения не имеют. Они одинаковы и для UHC, и для OHC, и для EHC.
                            P.P.S. А что такое суперлинк?
                            Сообщение отредактировано: Gerret -
                              ну, суперлинк, это возможно чисто жаргонное слово, употребляемое мной и некоторыми моими коллегами, это кабель типа host-to-host, тобишь связь двух компов через USB.
                                Цитата Gerret @
                                Вот последовательность, по которой я инициализирую устройства на шине USB:
                                Шаг 1: Получаем 8 байт дескриптора устройства
                                Шаг 2: Устанавливаем адрес устройства

                                А разве Кулаков учит не наоборот???
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) [1] 2 3 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0468 ]   [ 16 queries used ]   [ Generated: 28.03.24, 21:53 GMT ]