Форум: "Система";
Текущий архив: 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