Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.15;
Скачать: CL | DM;

Вниз

Идеологический вопрос про 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
6-48663
Nikma
2003-06-30 03:33
2003.09.15
Как получить данные с web сайта


14-48717
Ahmad K
2003-08-26 02:43
2003.09.15
Delphi 7 vs Delphi 3


14-48693
Lu
2003-08-25 11:12
2003.09.15
Еще одна простенькая задачка


3-48446
DelphiM
2003-08-25 10:27
2003.09.15
Grid


1-48528
dataMaster
2003-09-02 12:06
2003.09.15
Как в ComboBox отключить какой-нибудь пукнт