|
|
  |
Два фнукциональных устройства в одном физическом |
|
|
|
Jan 22 2009, 15:28
|
Группа: Новичок
Сообщений: 9
Регистрация: 11-11-08
Пользователь №: 41 539

|
Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.
Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???
Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!
Вообщем если кто-то что-то понял прошу ответить?
|
|
|
|
|
Jan 23 2009, 12:07
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Vitaliy S. @ Jan 22 2009, 18:28)  Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.
Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???
Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!
Вообщем если кто-то что-то понял прошу ответить? Это будет составное (композитное) устройство. Это стандартно. Я такое сделал http://antel.info/Почитайте описание, м.б. станет понятнее.. Цитата(Vitaliy S. @ Jan 22 2009, 18:28)  Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.
Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???
Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!
Вообщем если кто-то что-то понял прошу ответить? Это будет составное (композитное) устройство. Это стандартно. Я такое сделал http://antel.info/Почитайте описание, м.б. станет понятнее..
|
|
|
|
|
Jan 23 2009, 13:22
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(Vitaliy S. @ Jan 22 2009, 20:28)  Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами??? Да, может. Описание здесь http://msdn.microsoft.com/en-us/library/ms793564.aspx
|
|
|
|
|
Jan 26 2009, 15:42
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 1-11-06
Пользователь №: 21 855

|
Пример составного устройства с коменариями на русском есть тут: http://www.microchip.com.ru/1010/Support/USB%20apps.htmlВ последнем USB стеке от микрочип есть готовый для вас пример составного устройства HID + MSD www.microchip.com/usb
|
|
|
|
|
Feb 11 2009, 08:38
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687

|
Сорри за небольшой оффтоп (модератор, пни, плз, если неправ, в нужный топик - я не нашел более подходящего), но здесь приведены копозиты из стандарных классов. А у меня немного другая проблема: хочу композит CDC+Generic, причем для Generic надо писать драйвер. Устройство бвло простым - драйвер работал, успешно получая дескриптор конфигурации, парсил его и перечислял конечные точки. А когда я пытаюсь поставить тот же драйвер для части составного устройства, драйвер затыкается на получении дескриптора конфигурации с ошибкой STATUS_DEVICE_NOT_READY ((NTSTATUS)0xC00000A3). Мысли идут по двум путям: 1. обойтись без дескриптора конфигурации, но тогда как перечислить конечные точки интерфейса? 2. Получить парента (сам композитный девайс) (как?), и как тогда определить, к какому MI меня подключили? При этом CDC драйсер ставиться нормально. Драйвер слизал из скелета Агурова. В программировании на нулевом кольце почти новичок, заранее спсб за любую подсказку Код UsbBuildGetDescriptorRequest( urb, (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, configurationDescriptor, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);
ntStatus = DoCallUSBD(DeviceObject, urb, FALSE, NULL); // <===== вот тут возврат "NOT READY"
Сообщение отредактировал Remix - Feb 11 2009, 08:39
|
|
|
|
|
Feb 11 2009, 16:06
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687

|
DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно. Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства? Пните, плиз, хотя бы куда смотреть...
|
|
|
|
|
Feb 11 2009, 16:48
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(Remix @ Feb 11 2009, 21:06)  DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно. Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства? Пните, плиз, хотя бы куда смотреть... Нижний драйвер и есть драйвер композитного устройства и с точки зрения вашего драйвера устройства ему все равно, какой драйвер является нижним, разницы в запросах дескрипторов нет, просто драйвер композитного устройства сформирует дескриптор на основе прочитанного из самого устройства. Поэтому и спросил про функцию. При использовании драйвера для устройства в составе композита может быть типичная ошибка (кстати wizard от DriverStudio грешит этим) - просмотрите код и обратите внимание на номер используемого интерфейса, если интерфейсы СDC первые, то ваш должен быть 2. Да, если у CDC два интерфейса, то должен быть прописан IAD. PS. Драйвер композита хитрая штука, например, запрос SetConfiguration от вашего драйвера до устройства не дойдет. Запрос SetConfiguration в устройство направляет драйвер композита.
Сообщение отредактировал Седой - Feb 11 2009, 16:53
|
|
|
|
|
Feb 12 2009, 07:07
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687

|
Цитата(Седой @ Feb 11 2009, 18:48)  Нижний драйвер и есть драйвер композитного устройства и с точки зрения вашего драйвера устройства ему все равно, какой драйвер является нижним, разницы в запросах дескрипторов нет, просто драйвер композитного устройства сформирует дескриптор на основе прочитанного из самого устройства.
..........................
Да, если у CDC два интерфейса, то должен быть прописан IAD.
PS. Драйвер композита хитрая штука, например, запрос SetConfiguration от вашего драйвера до устройства не дойдет. Запрос SetConfiguration в устройство направляет драйвер композита. спасибо. начинаю прояснять себе суть работы драйвера композита. ИАД прописан, но когда открываю свой девайс USBIO, пишет вот это: Цитата Device0 successfully opened. Get current device parameters was successful. GetDeviceInfo failed. видимо, я не туда полез - надо угадывать, почему девайс не отдает инфу, и главное - какую? ДевайсДескриптор отдает, Конфиг дескриптор - ниже по тексту - мож, я там где ошибся? а до SetConfiguration дело не доходит - все падает гораздо раньше... Код Configuration Descriptor: bLength : 09 bDescriptorType : 0x02 wTotalLength : 0106 bNumInterfaces : 03 bConfigurationValue: 01 iConfiguration : 00 bmAttributes : 0xC0 MaxPower : 0a
Interface Association Descriptor: bLength : 08 bDescriptorType : 0x0B bFirstInterface : 00 bInterfaceCount : 01 bFunctionClass : 0xFF bFunctionSubClass : 0xFF bFunctionProtocol : 0x00 iFunction : 02
Interface Association Descriptor: bLength : 08 bDescriptorType : 0x0B bFirstInterface : 01 bInterfaceCount : 02 bFunctionClass : 0x02 bFunctionSubClass : 0x00 bFunctionProtocol : 0x00 iFunction : 04
Interface Descriptor: bLength : 09 bDescriptorType : 0x04 bInterfaceNumber : 00 bAlternateSetting : 00 bNumEndpoints : 02 bInterfaceClass : 0xFF USB_DEVICE_CLASS_VENDOR_SPECIFIC bInterfaceSubClass : 0xFF bInterfaceProtocol : 0xFF iInterface : 01
Endpoint Descriptor: ...удалил для краткости...
Endpoint Descriptor: ...удалил для краткости...
Interface Descriptor: bLength : 09 bDescriptorType : 0x04 bInterfaceNumber : 01 bAlternateSetting : 00 bNumEndpoints : 01 bInterfaceClass : 0x02 USB_DEVICE_CLASS_COMMUNICATIONS bInterfaceSubClass : 0x02 bInterfaceProtocol : 0x01 iInterface : 04
CDC CS Interface Descriptor: Subtype: CDC Header Functional Descriptor bLength : 0x05 bDescriptorType : 0x24 bDescriptorSubType : 0x00 CDC_FDST_HEADER bcdCDC : 0x0110
CDC CS Interface Descriptor: Subtype: CDC Abstract Control Management Functional Descriptor bLength : 0x04 bDescriptorType : 0x24 bDescriptorSubType : 0x02 CDC_FDST_ABSTRACT_CONTROL_MANAGEMENT bmCapabilities : 0x02
CDC CS Interface Descriptor: Subtype: CDC Union Functional Descriptor bLength : 0x05 bDescriptorType : 0x24 bDescriptorSubType : 0x06 CDC_FDST_UNION bMasterIf : 0x01 bSlaveIf[0] : 0x02
CDC CS Interface Descriptor: Subtype: CDC Call Management Functional Descriptor bLength : 0x05 bDescriptorType : 0x24 bDescriptorSubType : 0x01 CDC_FDST_CALL_MANAGEMENT bmCapabilities : 0x00 bDataInterface : 0x02
Endpoint Descriptor: ...удалил для краткости...
Interface Descriptor: bLength : 09 bDescriptorType : 0x04 bInterfaceNumber : 02 bAlternateSetting : 00 bNumEndpoints : 02 bInterfaceClass : 0x0A USB_DEVICE_CLASS_DATA bInterfaceSubClass : 0x00 bInterfaceProtocol : 0x00 iInterface : 04
Endpoint Descriptor: ...удалил для краткости...
Endpoint Descriptor: ...удалил для краткости...
Сообщение отредактировал Remix - Feb 12 2009, 07:12
|
|
|
|
|
Mar 8 2009, 09:55
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687

|
Цитата(Седой @ Feb 12 2009, 20:51)  IAD должен быть один на 2 интерфейса СDC. сделал, все равно не может получить дескриптор конфигурации. в связи с чем вопрос: а я вообще имею право работать с PhysicalDeviceObject в драйвере функции составного устройства? или за пределы FunctionDO мне выходить не велено? сорри, что долго молчал - проклятый грипп...
|
|
|
|
|
Nov 9 2009, 09:07
|

Группа: Участник
Сообщений: 13
Регистрация: 13-03-09
Пользователь №: 46 063

|
Простите за офтоп. Не понял куда обратится, поэтому подниму более менее подходящую тему. Есть композитное устройство на базе at9: Mass Storage + Generic(свой драйвер написан). Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо!
--------------------
© korbian
|
|
|
|
|
Nov 9 2009, 19:05
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата(korbian @ Nov 9 2009, 14:07)  ... Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо! Что вы понимаете под термином "заблокировать"?
|
|
|
|
|
Nov 10 2009, 06:37
|

Группа: Участник
Сообщений: 13
Регистрация: 13-03-09
Пользователь №: 46 063

|
Цитата(Седой @ Nov 9 2009, 22:05)  Что вы понимаете под термином "заблокировать"? "Заблокировать" появление диска в системе до определенного момента(события на втором интерфейсе). Сейчас всегда возвращаю ошибку из "железа" на SCSI-комманды чтения и записи от хоста, диск в системе присутствует, но операции чтения\записи для него не проходят. Возможно есть более элегантное решение?
--------------------
© korbian
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|