[USB] ID хаба и номер порта
От: jonnybbs  
Дата: 08.12.09 10:51
Оценка:
Здравствуйте,

Собрали USB девайс. Работаю с ним через драйвера производителя USB контроллера (cypress).

Встала задача определить ID (номер или другую информацию, к которой можно сделать привязку) хаба, к которому подключен наш USB-девайс, а также номер порта. В API драйвера производителя таких функций нет. Единственное, что я могу узнать, это device handle (скорее всего тот, который возвращает CreateFile) и несколько структур USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR, USB_INTERFACE_DESCRIPTOR.

Насколько я понял, номер порта можно узнать из symbolic name моего устройства. Но я не знаю как его получить, имея на руках только device handle. Скорее всего надо на этот хендл натравить DeviceIoControl с какими-то IOCTL_XXX, но какими никак не могу разобраться.

Построение дерева USB (перечисление всех устройств как в утилите usbview) думаю не подойдет, по причине того, что одновременно к компьютеру будет подключен десяток наших USB девайсов, т.е. сравнение по VID и PID не прокатит. А сравнивать по device handle (одно открыто в драйвере, другое мной в user mode) наверное нет смысла, т.к. скорее всего они будут разные.

Подскажите направление, какую информацию можно извлечь о устройстве имея на руках только этот device handle ?
usb устройство хаб порт
Re: [USB] ID хаба и номер порта
От: _f_b_i_  
Дата: 08.12.09 12:38
Оценка:
Здравствуйте, jonnybbs, Вы писали:

J>Здравствуйте,


J>Собрали USB девайс. Работаю с ним через драйвера производителя USB контроллера (cypress).


J>Встала задача определить ID (номер или другую информацию, к которой можно сделать привязку) хаба, к которому подключен наш USB-девайс, а также номер порта. В API драйвера производителя таких функций нет. Единственное, что я могу узнать, это device handle (скорее всего тот, который возвращает CreateFile) и несколько структур USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR, USB_INTERFACE_DESCRIPTOR.


J>Насколько я понял, номер порта можно узнать из symbolic name моего устройства. Но я не знаю как его получить, имея на руках только device handle. Скорее всего надо на этот хендл натравить DeviceIoControl с какими-то IOCTL_XXX, но какими никак не могу разобраться.


J>Построение дерева USB (перечисление всех устройств как в утилите usbview) думаю не подойдет, по причине того, что одновременно к компьютеру будет подключен десяток наших USB девайсов, т.е. сравнение по VID и PID не прокатит. А сравнивать по device handle (одно открыто в драйвере, другое мной в user mode) наверное нет смысла, т.к. скорее всего они будут разные.


Как это usbview не подойдет? собственно она это и делает, разливает девайсы воткнутые в разные порты на разных usb-hub. Все что нужно сделать это разобраться с алгоритмом энумерации девайсов в usbview. Также смотреть в сторону IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX.

Связать device handle через symlink можно с помощью CM_XXX функций.
Re[2]: [USB] ID хаба и номер порта
От: jonnybbs  
Дата: 08.12.09 17:48
Оценка:
Здравствуйте, _f_b_i_, Вы писали:

___>Как это usbview не подойдет? собственно она это и делает, разливает девайсы воткнутые в разные порты на разных usb-hub. Все что нужно сделать это разобраться с алгоритмом энумерации девайсов в usbview. Также смотреть в сторону IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX.


Используя в качестве примера usbview, я смогу построить дерево USB устройств и узнать к каким хабам и портам подключены мои USB-девайсы. Я смогу узнать из symlink'и. Потом смогу натравить на них CreateFile и получить device handle, но полученный хендл не будет равен тому, который возвратит API драйвера производителя. Я не знаю как можно их связать.
По-моему надо действовать от обратного, получить из device handle его symlink и найти его в дереве USB устройств. Но я не знаю как.

___>Связать device handle через symlink можно с помощью CM_XXX функций.


Я не смог найти функцию из списка CM_XXX в которую можно засунуть device handle и что-то получить
Буду благодарен, если пнете в нужном направлении.
Re: [USB] ID хаба и номер порта
От: resource  
Дата: 12.05.10 23:13
Оценка:
Я сам недавно столкнулся с похожей проблемой. Кстати сами микрософтовцы не рекомендуют использовать рилейт имена.
Связать с помощью стандартной апи хэндл с айди видимо не получиться.
DeviceIoControl не подойдет, сам не до конца разобрался, но получение айди можно реализовать, насколько понял, только для накопителей (IOCTL_STORAGE...).

Как варинт использовать DriverKit (дремучий лес =) ), или вот, что собственно хочу попробовать реализовать:
DeviceManager Object (http://msdn.microsoft.com/en-us/library/ms630500%28VS.85%29.aspx)

Может оказаться весьма полезным, в том плане, что построено на событиях. Его будет удобно использовать, ессли программа создает дополнительные трэды (отпадают вопросы приостановки работы драйвера и т.п.). Вроди бы как оно должно принимать значение истины, когда устройство с указанным айди подключено, или используется и там еще есть параметры.
По поводу привязки к хэндлу, думаю попробовать пойти обратным путем — по айди получить хэндл. Возможно запросить логическое имя порта и тот же CreateFile использовать. Еще пока не уверен точно.

Пишу на ASM-е, поэтому еще не уверен, что такие вещи есть в библиотеке (в крайнем случае придется переписать). Если у Вас что-нибудь получиться — отпишите тут пожалуйста, как говорится одна голова хорошо, а две — лучше. =)
Re[2]: [USB] ID хаба и номер порта
От: jonnybbs  
Дата: 13.05.10 04:43
Оценка:
Здравствуйте,

R>Пишу на ASM-е, поэтому еще не уверен, что такие вещи есть в библиотеке (в крайнем случае придется переписать). Если у Вас что-нибудь получиться — отпишите тут пожалуйста, как говорится одна голова хорошо, а две — лучше. =)


У меня в итоге было сделано так:
1) Запрашивал список серийных номеров у API закрытого драйвера устройства.
2) С помощью SetupDiGetClassDevs получал список всех "моих устройств" по их GUID
hDI = SetupDiGetClassDevs(&GUID_PIK, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
3) В цикле for(DWORD i = 0; SetupDiEnumDeviceInfo(hDI, i, &dd); i++) просматривал каждое устройство.
3.1) Получал серийный номер устройства с помощью SetupDiGetDeviceInstanceId и сравнивал с пунктом 1 (на всякий случай еще и VID/PID).
3.2) Получал номер порт хаба, к которому подключено устройство (из п.3.1) с помощью SetupDiGetDeviceRegistryProperty с константой SPDRP_ADDRESS. Т.е. у USB-хаба все порты пронумерованы и можно узнать в какой порт подключили наш девайс.
3.3) Получал ИД хаба (за его основу взял device id, который возвращает CM_Get_Parent) и группировал свои устройства.

В данном варианте у нас возникла только одна небольшая проблема. Закупили несколько одинаковых хабов в одном магазине, но в каких-то хабах стояла 1 микросхема для подключения 8 устройств, а в каких-то было две 4-х портовых микросхемы (два разных хаба получалось).

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