Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];

Вниз

Идеологический вопрос про USB (+)   Найти похожие ветки 

 
Ega23   (2003-06-25 09:22) [0]

Народ, вопрос следующего толка: если в момент подключения устройства его инициализация по какой-либо причине не прошла, то можно будет потом к нему обратиться? Т.е. ОС говорит, что подключено неизвестное устройство, а я через стандартный API опрашиваю все возможные хабы и все возможные подключенные к ним устройства, считываю их дескрипторы, нахожу нужное мне устройство и начинаю с ним работать.


 
N169   (2003-06-25 11:32) [1]

Что значит "его инициализация по какой-либо причине не прошла"?
Возможные варианты: {камень не заработал} или {устройсво не было опознано} или {опознано, но драйвер не загрузился}?


 
Ega23   (2003-06-25 11:40) [2]

Устройство не было опознано.


 
N169   (2003-06-25 12:15) [3]

"Не было опознано" - значит, с ним не была установлена связь (то есть обмен с ним невозможен в силу аппаратных проблем или устройство не поддерживает принятый протокол обмена).
Может быть, устройство неисправно и работать с ним нельзя в принципе.


 
Ega23   (2003-06-25 12:45) [4]

Нет, просто в Device дескрипторе устройства используются зарезервированные ID-шники. Т.е. Винда сама его определить не может.


 
N169   (2003-06-25 13:10) [5]

А, ну это другое дело. Значит, с устройством есть связь, были получены product id и vendor id, но драйвер не был загружен?
И с ним желаем вести обмен?
Дык! Нельзя это делать мимо специализированного драйвера устройства.

Единственное, что можно делать полезного через драйверы хабов - читать дескрипторы. А чтобы вести обмен, надо добраться до endpoint-ов. А это может сделать только специализированный драйвер устройства.

В общем, совет такой - читайте дескрипторы, пишите их на бумажку, разберите их вручную и потом делайте свой драйвер.

Ещё есть т.н. универсальный драйвер USB. Видел его где-то на Listsoft.ru , но он шароварный и, поскольку универсальный, значит ненадёжный.

Ещё есть JungoWinDriver, sharoware.

Совет: можно найти старую версию USB compliance test, и попробовать поиграть с девайсом, подёргать его, помучить.


 
Ega23   (2003-06-26 11:58) [6]

Исходные данные: Разработан некий хитрый device - считыватель Proximity карт. Вся его задача по запросу извне выдавать код карты (4 байта). Устройство подключается к USB.

Теперь, собственно, вопросы.
1. Каким образом составить DeviceDescriptor и ReportDescriptor, т.е. какие поля обязательны, а в какие можно нули проставить?
2. Нужен ли для этого устройства собственный драйвер, или можно воспользоваться чем-нибудь стандартным, например hid.sys?

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

Буду рад любой информации


 
Слесарь Матерящийся   (2003-06-26 12:24) [7]

>Ega23 (26.06.03 11:58)

Решаем практически:

1)Качаем доку по USB1.1 с www.usb.org:
http://www.usb.org/developers/docs/usbspec.zip
распаковываем, нам нужен документ usb11.pdf

2)Открываем его и идём на страницу 212 (нумерована как 196) в разделе 9.
Страничкой ниже расположена таблица "Table 9-7. Standard Device Descriptor".
Берём бумажку и заполняем поля:

bLength = 18

bDescriptorType = 1 (Device descriptor)

bcdUSB = 0x0110 для full speed контроллеров или 0x0100 для low speed. Какой контроллер у Вас, спросите электронщика.

bDeviceClass = 0xFF <-- пользовательский тип

bDeviceSubClass = 0 <-- нет подразделения на подклассы

bDeviceProtocol = 0xFF <-- пользовательский протокол

bMaxPacketSize0 = ? <-- размер буфера endpointa. Зависит от типа контроллера.

idVendor = ???? <-- Выберите произвольный код, не назначенный иному вендору. Список вендоров в виде файла *.h можно получить на www.usb.org или взять из Windows DDK.

idProduct = ???? <-- любое Ваше число, идентифицирующее продукт. Например, 0x0001

bcdDevice = ???? <-- Номер девайса в рамках Вашего продукта. Например, 0x0001

iManufacturer = 0 <-- Нет строковых дескрипторов (с ними одна морока!) Если есть, то ставим здесь его индекс (начиная с 1)

iProduct ( одной достаточно) >Ega23 (26.06.03 11:58)

Решаем практически:

1)Качаем доку по USB1.1 с www.usb.org:
http://www.usb.org/developers/docs/usbspec.zip
распаковываем, нам нужен документ usb11.pdf

2)Открываем его и идём на страницу 212 (нумерована как 196) в разделе 9.
Страничкой ниже расположена таблица "Table 9-7. Standard Device Descriptor".
Берём бумажку и заполняем поля:

bLength = 18

bDescriptorType = 1 (Device descriptor)

bcdUSB = 0x0110 для full speed контроллеров или 0x0100 для low speed. Какой контроллер у Вас, спросите электронщика.

bDeviceClass = 0xFF <-- пользовательский тип

bDeviceSubClass = 0 <-- нет подразделения на подклассы

bDeviceProtocol = 0xFF <-- пользовательский протокол

bMaxPacketSize0 = ? <-- размер буфера endpointa. Зависит от типа контроллера.

idVendor = ???? <-- Выберите произвольный код, не назначенный иному вендору. Список вендоров в виде файла *.h можно получить на www.usb.org или взять из Windows DDK.

idProduct = ???? <-- любое Ваше число, идентифицирующее продукт. Например, 0x0001

bcdDevice = ???? <-- Номер девайса в рамках Вашего продукта. Например, 0x0001

iManufacturer = 0 <-- Нет строковых дескрипторов (с ними одна морока!) Если есть, то ставим здесь его индекс (начиная с 1)

iProduct = 0 <-- см. ^^^

iSerialNumber = 0 <-- см. ^^^

bNumConfigurations = 1 <-- допустим, у нас буде одна конфигурация (одной достаточно).


Итог: дескриптор устройства составлен.
Ничего сложного. Будем продолжать? :)


 
Слесарь Матерящийся   (2003-06-26 12:42) [8]

Опс!
Поправка: Список вендоров находится в исходниках Windows (2000/XP) DDK в папке с примером usbview.
Т.е.:
\src\wdm\usb\usbview\vndrlist.h

На usb.org что-то не ищется...


 
Ega23   (2003-06-26 14:04) [9]

ЗАМЕЧАТЕЛЬНО! БОЛЬШОЕ СПАСИБО!

А про драйвер? Свой собственный драйвер обязателен, или можно чем-то стандартным воспользоваться? А если обязателен, то какой пример из NT DDK \src\wdm\usb\ посоветуете посмотреть?


 
Слесарь Матерящийся   (2003-06-26 14:38) [10]

Драйвер история отдельная. Чуть-чуть попозже.
Сначала надо получить рабочий девайс, потом мы его испытаем, а в конце напишем драйвер :)

А пока составим конфигурационный дескриптор, дескриптор интерфейса и endpoint-ов. Без них девайс невозможно будет сконфигурировать.

Итак:

***Конфигурационный дескриптор.

bLength = 9
bDescriptorType = 2 <-- config descr.
wTotalLength = ??? <-- внимание! Это сумма длин конфигурационного дескриптора, дескриптора интерфейса и дескрипторов endpoint-ов.
Все эти дескрипторы могут быть прочитаны как отдельно, так и скопом вместе с конфигурационным д. Поэтому в памяти МК они должны располагаться последовательно, без промежутков.
Более подробно - см. документацию Windows DDK (там и картинка есть :)

bNumInterfaces = 1 <-- Один интерфейс. (Интерфейс - это набор неких комбинаций режимов endpoint-ов, не более того)

bConfigurationValue = 1 <-- Номер конфигурации по умолчанию. А у нас она одна.

iConfiguration = 0 <-- Здесь индекс строкового дескриптора с названием конфигурации. Ну его!

bmAttributes = ???? <-- Это битовые флаги, которые относятся к управлению питанием. Подробней - см. страницу 216 (200). Как устройство питается и какие операции поддерживает, знает человек, разрабатывавший firmware Вашего устройства.

MaxPower = ???? <-- Кодирует ток, потребляемый девайсом в рабочем режиме. Одна единица - 2 мА. Для устройств, питающихся автономно, не-от-шины, ставим MaxPower = 1.


***Дескриптор интерфейса

bLength = 9

bDescriptorType = 4 <-- interface

bInterfaceNumber = 0 <-- Запись номер 0. Первая и единственная. Если будет ещё один интерфейс, он получит индекс 1 и т.д.

bAlternateSetting = 0 или 1 <-- значение, которым активируют этот интерфейс. Если интерфейс один, то firmware МК может игнорировать этот номер.

bNumEndpoints = ?? <-- Количество активных endpoint-ов, исключая управляющую endpoint 0. Должно точно соответствовать количеству дескрипторов endpoint-ов в рамках данной альтернативы.

bInterfaceClass = 0xFF <-- пользовательский тип

bInterfaceSubClass = 0 <-- нет деления

bInterfaceProtocol = 0xFF <-- пользовательский протокол

iInterface = 0 <-- номер строкового дескриптора с названием интерфейса. Ноль, если строковые дескрипторы не используются.


(Продолжение следует)


 
Ega23   (2003-06-26 14:45) [11]

Жду с нетерпением (Продолдения) :-)


 
Слесарь Матерящийся   (2003-06-26 14:54) [12]

Ну-с, осталось составить дескрипторы endpoint-ов и поговорить о тестировании.

*** Дескрипторы endpoint-ов

Их может быть несколько. Перед составлением дескрипторов надо проконсультироваться у человека, который писал firmware о количестве и режимах endpoint-ов.
Дескрипторы же составляется так:

bLength = 7
bDescriptorType = 5 <--endpoint
bEndpointAddress = ?? <-- Адрес и направление. Адрес отсчитывается с 1. Подробно - см. стр. 219 usb11.pdf
bmAttributes = ?? <-- Тип endpoint-а.
wMaxPacketSize = ?? <-- Длина буфера конкретного endpoint-а. Зависит от типа контроллера.
bInterval = 0xFF для всех типов endpoint-ов, кроме interrupt. Для interrupt - это значение периода, с которым хост будет опрашивать endpoint, в миллисекундах.

***

Вот. С дескрипторами мы покончили. Теперь про тестирование.

Когда девайс будет в целом готов, его потребуется испытать (в присутствии автора firmware) в ручном режиме с помощью утилиты USB compliance test. Она объявлена устаревшей, но не верьте - с её помощью можно дёргать девайс "за усы" как угодно.
Взять можно здесь:
http://progrex.narod.ru/files/USBComp.zip
Или воспользоваться новым тестом USB check (точно не помню название), найдёте его на www.usb.org

Правильный девайс должен опознаваться, конфигурироваться вручную и проходить циклический тест.

Если всё так, можно браться за создание драйвера...

(Продолжение следует...)


 
Ega23   (2003-06-26 15:13) [13]

А что с драйвером?


 
Слесарь Матерящийся   (2003-06-26 15:23) [14]

Теперь про драйвер.

Вы спрашивали насчёт HID. Это зависит от firmware. Если разработчик firmware делал его как HID, то HID :)
Особого выигрыша это не даст. HID имеет некий стандартный драйвер от Microsoft, но работать через него сущий ад.

Мы будем лениться в меру и напишем свой драйвер.

В Windows DDK есть пример драйвера bulkusb. Можно адаптировать его, но это вариант для мазохистов. Можно сделать проще и получить драйвер-способный-грузиться c помощью driver wizard от Walter Oney. Заодно почитаем его замечательную книгу "Programming the Windows Driver Model", которая разрешит многие Ваши вопросы по драйверописательству.
Качаем отсюда:
http://www.proglib.ru/detail.asp?id=925
http://www.proglib.ru/detail_book.asp?id=83

Также потребуется MS Visual Studio и Windows 2000 DDK.

Wizard для генерации шаблонного кода драйвера выдаст "на гора" набор файлов - в сущности, каркас будущего драйвера и inf-файл.

Для компиляции используйте не MSVC, а командную строку. Надо будет вручную составить файл sources и бросить в папку проекта файл makefile.
Полученный при компиляции драйвер уже может быть пригоден для загрузки (в большинстве случаев это так).

Inf-файл придётся откорректировать, положить его вместе с драйвером в отдельную папку, и, подключив девайс, обновить драйвер для него.
Если драйвер загрузится, поздравляю, Вам останется только
дополнить его кодом для выполнения специфичных для устройства задач.

У кого как, но у меня после данной процедуры от шаблона оставалось едва ли 30%; всё остальное рефакторил, ибо при работе с USB главное - надёжность.

///

Вот. Рассказал почти всё, что знал :)

Тут конец нашей истории...


 
Ega23   (2003-06-26 15:36) [15]

ОГРОМНОЕ СПАСИБО!!!
Дальше, надеюсь, сам разберусь.

Куда пиво посылать? :-))


 
Слесарь Матерящийся   (2003-06-26 15:45) [16]

www.microsoft.com :)


 
Ega23   (2003-07-02 14:31) [17]

Все очень здорово, все более-иенее с мертвой точки сдвинулось. Единственная проблема которая осталась - ReportDescriptor. Чего с ним делать?


 
Слесарь Матерящийся   (2003-07-02 15:03) [18]

Ой. Вроде бы, нет таких :)

Для девайса как такового достаточно тех, что были перечислены.
И в документации нет, я проверил...

Если речь идёт о защите от использования третьими лицами, то достаточно иметь "секретный" строчный дескриптор, о котором будет знать только драйвер устройства.

Если девайс всё-таки был приписан к какому-либо классу (HID, например), то надо искать описания дескрипторов для конкретного класса устройств.


 
Ega23   (2003-07-02 16:00) [19]

Понял, спасибо. Да, это как раз при присании устройства к классу (HID), например.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.027 c
14-48696
vopros
2003-08-25 09:49
2003.09.15
Люди, мне опять не посебе. Прошло почти 1,5 года после того


14-48749
Knight
2003-08-26 08:06
2003.09.15
Miranda рулит...


9-48389
Skyslider
2002-08-13 18:54
2003.09.15
Пошаговое создание платформенной стрелялки.


1-48644
ossa
2003-09-03 07:26
2003.09.15
Пожскажите, как при создании ехе-файла поменять стандарт-ю иконку


1-48583
Karburator
2003-09-03 16:39
2003.09.15
Удаление каталога с содержимым





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский