Перейти к содержанию
    

Два фнукциональных устройства в одном физическом

Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.

 

Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

 

Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!

 

Вообщем если кто-то что-то понял прошу ответить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.

 

Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

 

Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!

 

Вообщем если кто-то что-то понял прошу ответить?

Это будет составное (композитное) устройство. Это стандартно. Я такое сделал http://antel.info/

Почитайте описание, м.б. станет понятнее..

 

Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.

 

Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

 

Вроде каждый отдельный драйвер дейвацса сам должен считывать дескрипторы интерфейса и смотря их структуру с ним работать, и другому драйверу не свой интерфейс он не отдаст?!

 

Вообщем если кто-то что-то понял прошу ответить?

Это будет составное (композитное) устройство. Это стандартно. Я такое сделал http://antel.info/

Почитайте описание, м.б. станет понятнее..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

Да, может. Описание здесь http://msdn.microsoft.com/en-us/library/ms793564.aspx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример составного устройства с коменариями на русском есть тут:

http://www.microchip.com.ru/1010/Support/USB%20apps.html

 

В последнем USB стеке от микрочип есть готовый для вас пример составного устройства HID + MSD

www.microchip.com/usb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри за небольшой оффтоп (модератор, пни, плз, если неправ, в нужный топик - я не нашел более подходящего), но здесь приведены копозиты из стандарных классов. А у меня немного другая проблема: хочу композит 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что это за функция DoCallUSBD?

 

Если новичок в драйверописательстве - в топку все книжки типа Агурова (единственная достойная - Programming the Microsoft Windows Driver Model от Walter Oney), скачайте WDK и пишите в KMDF, а возможно достаточно будет готового WinUSB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно.

Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства?

Пните, плиз, хотя бы куда смотреть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно.

Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства?

Пните, плиз, хотя бы куда смотреть...

 

Нижний драйвер и есть драйвер композитного устройства и с точки зрения вашего драйвера устройства ему все равно, какой драйвер является нижним, разницы в запросах дескрипторов нет, просто драйвер композитного устройства сформирует дескриптор на основе прочитанного из самого устройства. Поэтому и спросил про функцию.

 

При использовании драйвера для устройства в составе композита может быть типичная ошибка (кстати wizard от DriverStudio грешит этим) - просмотрите код и обратите внимание на номер используемого интерфейса, если интерфейсы СDC первые, то ваш должен быть 2.

 

Да, если у CDC два интерфейса, то должен быть прописан IAD.

 

PS. Драйвер композита хитрая штука, например, запрос SetConfiguration от вашего драйвера до устройства не дойдет. Запрос SetConfiguration в устройство направляет драйвер композита.

Изменено пользователем Седой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нижний драйвер и есть драйвер композитного устройства и с точки зрения вашего драйвера устройства ему все равно, какой драйвер является нижним, разницы в запросах дескрипторов нет, просто драйвер композитного устройства сформирует дескриптор на основе прочитанного из самого устройства.

 

..........................

 

Да, если у 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAD должен быть один на 2 интерфейса СDC.

 

сделал, все равно не может получить дескриптор конфигурации. в связи с чем вопрос: а я вообще имею право работать с PhysicalDeviceObject в драйвере функции составного устройства? или за пределы FunctionDO мне выходить не велено?

 

сорри, что долго молчал - проклятый грипп... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто-нибудь разрабатывал USB устройство класса CDC Ethernet Emulation Model?

Т.е. это будет USB сетевой адаптер. Нужен совет специалиста, знающего работу с этим классом.

Как это будет выглядеть в Windows, т.е. настройка сетевых параметров? Корректно ли работает стандартный драйвер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите за офтоп. Не понял куда обратится, поэтому подниму более менее подходящую тему.

Есть композитное устройство на базе at9: Mass Storage + Generic(свой драйвер написан). Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо!

Что вы понимаете под термином "заблокировать"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что вы понимаете под термином "заблокировать"?

"Заблокировать" появление диска в системе до определенного момента(события на втором интерфейсе). Сейчас всегда возвращаю ошибку из "железа" на SCSI-комманды чтения и записи от хоста, диск в системе присутствует, но операции чтения\записи для него не проходят. Возможно есть более элегантное решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...