![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Идеологический вопрос про USB (+)
Ega23 © (2003-06-25 09:22:00)
Народ, вопрос следующего толка: если в момент подключения устройства его инициализация по какой-либо причине не прошла, то можно будет потом к нему обратиться? Т.е. ОС говорит, что подключено неизвестное устройство, а я через стандартный API опрашиваю все возможные хабы и все возможные подключенные к ним устройства, считываю их дескрипторы, нахожу нужное мне устройство и начинаю с ним работать.
Ega23 (2003-07-02 16:00:00) [1]
Понял, спасибо. Да, это как раз при присании устройства к классу (HID), например.
Слесарь Матерящийся (2003-07-02 15:03:00) [2]
Ой. Вроде бы, нет таких :)
Для девайса как такового достаточно тех, что были перечислены.
И в документации нет, я проверил...
Если речь идёт о защите от использования третьими лицами, то достаточно иметь "секретный" строчный дескриптор, о котором будет знать только драйвер устройства.
Если девайс всё-таки был приписан к какому-либо классу (HID, например), то надо искать описания дескрипторов для конкретного класса устройств.
Ega23 (2003-07-02 14:31:00) [3]
Все очень здорово, все более-иенее с мертвой точки сдвинулось. Единственная проблема которая осталась - ReportDescriptor. Чего с ним делать?
Слесарь Матерящийся (2003-06-26 15:45:00) [4]
www.microsoft.com :)
Ega23 (2003-06-26 15:36:00) [5]
ОГРОМНОЕ СПАСИБО!!!
Дальше, надеюсь, сам разберусь.
Куда пиво посылать? :-))
Слесарь Матерящийся (2003-06-26 15:23:00) [6]
Теперь про драйвер.
Вы спрашивали насчёт 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:13:00) [7]
А что с драйвером?
Слесарь Матерящийся (2003-06-26 14:54:00) [8]
Ну-с, осталось составить дескрипторы 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 14:45:00) [9]
Жду с нетерпением (Продолдения) :-)
Слесарь Матерящийся (2003-06-26 14:38:00) [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:04:00) [11]
ЗАМЕЧАТЕЛЬНО! БОЛЬШОЕ СПАСИБО!
А про драйвер? Свой собственный драйвер обязателен, или можно чем-то стандартным воспользоваться? А если обязателен, то какой пример из NT DDK \src\wdm\usb\ посоветуете посмотреть?
Слесарь Матерящийся (2003-06-26 12:42:00) [12]
Опс!
Поправка: Список вендоров находится в исходниках Windows (2000/XP) DDK в папке с примером usbview.
Т.е.:
\src\wdm\usb\usbview\vndrlist.h
На usb.org что-то не ищется...
Слесарь Матерящийся (2003-06-26 12:24:00) [13]>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 <-- допустим, у нас буде одна конфигурация (одной достаточно).
Итог: дескриптор устройства составлен.
Ничего сложного. Будем продолжать? :)
Ega23 (2003-06-26 11:58:00) [14]
Исходные данные: Разработан некий хитрый device - считыватель Proximity карт. Вся его задача по запросу извне выдавать код карты (4 байта). Устройство подключается к USB.
Теперь, собственно, вопросы.
1. Каким образом составить DeviceDescriptor и ReportDescriptor, т.е. какие поля обязательны, а в какие можно нули проставить?
2. Нужен ли для этого устройства собственный драйвер, или можно воспользоваться чем-нибудь стандартным, например hid.sys?
В принципе, эти вопросы основные. Для меня это дело абсолютно новое (до этого с БД работал), поэтому совершенно непонятно с чего начать. Электронщику, который это устройство разрабатывал, нужно прошить в чип дескрипторы, а я его этими дескрипторами держу.
Буду рад любой информации
N169 (2003-06-25 13:10:00) [15]
А, ну это другое дело. Значит, с устройством есть связь, были получены product id и vendor id, но драйвер не был загружен?
И с ним желаем вести обмен?
Дык! Нельзя это делать мимо специализированного драйвера устройства.
Единственное, что можно делать полезного через драйверы хабов - читать дескрипторы. А чтобы вести обмен, надо добраться до endpoint-ов. А это может сделать только специализированный драйвер устройства.
В общем, совет такой - читайте дескрипторы, пишите их на бумажку, разберите их вручную и потом делайте свой драйвер.
Ещё есть т.н. универсальный драйвер USB. Видел его где-то на Listsoft.ru , но он шароварный и, поскольку универсальный, значит ненадёжный.
Ещё есть JungoWinDriver, sharoware.
Совет: можно найти старую версию USB compliance test, и попробовать поиграть с девайсом, подёргать его, помучить.
Ega23 (2003-06-25 12:45:00) [16]
Нет, просто в Device дескрипторе устройства используются зарезервированные ID-шники. Т.е. Винда сама его определить не может.
N169 (2003-06-25 12:15:00) [17]
"Не было опознано" - значит, с ним не была установлена связь (то есть обмен с ним невозможен в силу аппаратных проблем или устройство не поддерживает принятый протокол обмена).
Может быть, устройство неисправно и работать с ним нельзя в принципе.
Ega23 (2003-06-25 11:40:00) [18]
Устройство не было опознано.
N169 (2003-06-25 11:32:00) [19]
Что значит "его инициализация по какой-либо причине не прошла"?
Возможные варианты: {камень не заработал} или {устройсво не было опознано} или {опознано, но драйвер не загрузился}?