реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Два фнукциональных устройства в одном физическом
Vitaliy S.
сообщение Jan 22 2009, 15:28
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 11-11-08
Пользователь №: 41 539



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

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

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

Вообщем если кто-то что-то понял прошу ответить?
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jan 23 2009, 12:07
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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/
Почитайте описание, м.б. станет понятнее..
Go to the top of the page
 
+Quote Post
Седой
сообщение Jan 23 2009, 13:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



Цитата(Vitaliy S. @ Jan 22 2009, 20:28) *
Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

Да, может. Описание здесь http://msdn.microsoft.com/en-us/library/ms793564.aspx
Go to the top of the page
 
+Quote Post
arizona
сообщение Jan 26 2009, 15:42
Сообщение #4


Участник
*

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



Пример составного устройства с коменариями на русском есть тут:
http://www.microchip.com.ru/1010/Support/USB%20apps.html

В последнем USB стеке от микрочип есть готовый для вас пример составного устройства HID + MSD
www.microchip.com/usb
Go to the top of the page
 
+Quote Post
Remix
сообщение Feb 11 2009, 08:38
Сообщение #5





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 11 2009, 13:45
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



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

Если новичок в драйверописательстве - в топку все книжки типа Агурова (единственная достойная - Programming the Microsoft Windows Driver Model от Walter Oney), скачайте WDK и пишите в KMDF, а возможно достаточно будет готового WinUSB.
Go to the top of the page
 
+Quote Post
Remix
сообщение Feb 11 2009, 16:06
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687



DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно.
Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства?
Пните, плиз, хотя бы куда смотреть...
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 11 2009, 16:48
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Remix
сообщение Feb 12 2009, 07:07
Сообщение #9





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Седой
сообщение Feb 12 2009, 18:51
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



IAD должен быть один на 2 интерфейса СDC.
Go to the top of the page
 
+Quote Post
Remix
сообщение Mar 8 2009, 09:55
Сообщение #11





Группа: Новичок
Сообщений: 4
Регистрация: 11-02-09
Пользователь №: 44 687



Цитата(Седой @ Feb 12 2009, 20:51) *
IAD должен быть один на 2 интерфейса СDC.


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

сорри, что долго молчал - проклятый грипп... sad.gif
Go to the top of the page
 
+Quote Post
DiMonstr
сообщение Mar 19 2009, 08:01
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 26-10-06
Из: Россия, Пенза
Пользователь №: 21 706



А кто-нибудь разрабатывал USB устройство класса CDC Ethernet Emulation Model?
Т.е. это будет USB сетевой адаптер. Нужен совет специалиста, знающего работу с этим классом.
Как это будет выглядеть в Windows, т.е. настройка сетевых параметров? Корректно ли работает стандартный драйвер?
Go to the top of the page
 
+Quote Post
korbian
сообщение Nov 9 2009, 09:07
Сообщение #13





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



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


--------------------
© korbian
Go to the top of the page
 
+Quote Post
Седой
сообщение Nov 9 2009, 19:05
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806



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

Что вы понимаете под термином "заблокировать"?
Go to the top of the page
 
+Quote Post
korbian
сообщение Nov 10 2009, 06:37
Сообщение #15





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



Цитата(Седой @ Nov 9 2009, 22:05) *
Что вы понимаете под термином "заблокировать"?

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


--------------------
© korbian
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 01:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016