Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Составное USB устройство на CY7C68013A?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
DiMonstr
Мужики, Кто-нибудь разрабатывал USB девайс, который бы в винде определялся как два устройства? Не важно на контроллере какой фирмы.
К примеру, мне необходимо реализовать в рамках одного устройства USB сетевой адаптер и USB винтчестер.
Драйвера предполагается использовать стандартные, виндузовские - это драйвер для работы с устройствами класса USB Mass Storage Device и CDC для Ethernet Control Devices. Соответственно эти два класса мне нужно реализовать в CY7C68013A.
Данный периферийный контроллер будет работать в режиме slave fifo и будет управляться ПЛИСиной Xilinx. Xilinx должен будет забирать пакеты из FIFO, определить сетевой это пакет или SCSI команда и передать в зависимости от этого в функциональный узел работы с винтом, либо с сетью.
Возникли такие вопросы:
1) Какая будет структура дескрипторов? Я предполагаю, что будет два дескриптора конфигурации, в каждом из которых будет описан свой интерфейс. Либо одна конфигурация, но два интерфейса. Как правильно?
2) Как винда, будет распределять передачу пакетов для винчестера и ЛВС?
3) Как обрабатывать переключаться между функциями обработки пакетов USB Mass Storage Device и CDC Ethernet Emulation Model?
4) Сможет ли пользовать работать с ЛВС и винчестером одновременно?
galjoen
Цитата(DiMonstr @ Mar 18 2009, 22:12) *
Мужики, Кто-нибудь разрабатывал USB девайс, который бы в винде определялся как два устройства? Не важно на контроллере какой фирмы.
...

Я такое неоднократно делал. Конфигурация одна д.б., а интерфейсов два или больше. Там у каждого интерфейса свои EP. А в SETUP пакетах есть специальное поле, в котором N интерфейса указывается, к которому этот пакет относится. Всё это решается. НО. Раньше CDC класс виндой определялся только по полю bDeviceClass в дескрипторе DEVICE. А он один на весь девайс. А при попытке CDC класс задать в дескрипторе INTERFACE у меня что-то ничего не работало. Хотя м.б. это у меня руки кривые. Или м.б. сейчас уже и работает - ошибку в винде исправили. Не знаю - мне с тех пор не надо было.
Единственно у них там ещё один глюк был. Дескриптор интерфейса у MassStorage должен первым идти и bInterfaceNumber у него соответственно д.б. =0. Иначе MS работать не будет.
DiMonstr
Цитата(galjoen @ Mar 19 2009, 03:17) *
Я такое неоднократно делал...


Хорошо, спасибо galjoen.
А для каких целей тогда применяется несколько конфигураций в устройстве?
Вот Вы говорите у каждого интерфейса своя EP. А как же быть, если контроллер имеет 2-е IN EP и 2-е OUT EP, а мне нужно организовать 3 интерфейса. Получается не хватит мне EP.
Можно ли организовать структуру устройства следующим образом?

1) дескриптор конфигурации-1
дескриптор интерфейса-1
дескриптор EP-1 для интерфейса-1
дескриптор EP-2 для интерфейса-1

2) дескриптор конфигурации-2
дескриптор интерфейса-1
дескриптор EP-1 для интерфейса-1
дескриптор EP-2 для интерфейса-1

Т.е. во всех конфигурациях использовать одни и те же EP?
Седой
Цитата(DiMonstr @ Mar 19 2009, 10:43) *
Хорошо, спасибо galjoen.
А для каких целей тогда применяется несколько конфигураций в устройстве?
Вот Вы говорите у каждого интерфейса своя EP. А как же быть, если контроллер имеет 2-е IN EP и 2-е OUT EP, а мне нужно организовать 3 интерфейса. Получается не хватит мне EP.


Более одной конфигурации Windows поддерживает начиная c Vista. Естественно, может быть активна только одна конфигурация.

Если не хватает EP, используйте EP0 (Control Endpoint).
galjoen
Цитата(Седой @ Mar 21 2009, 12:55) *
Более одной конфигурации Windows поддерживает начиная c Vista. Естественно, может быть активна только одна конфигурация.

Мне просто любопытно, а что будет в этом (bNumConfigurations>1) случае? Окошко с вопросом "какую конф-ию выбрать" откроется? Сам бы попробовал, да что-то нигде Висты поблизости нет. Простите за офтоп.
Цитата(Седой @ Mar 21 2009, 12:55) *
Если не хватает EP, используйте EP0 (Control Endpoint).

Interrupt In передачи, конечно, переносятся на EP0. А разве bulk передачи будут на EP0 переносится? И что, в таком случае можно LowSpeed MassStorage сделать?
Седой
Цитата(galjoen @ Mar 21 2009, 22:23) *
Interrupt In передачи, конечно, переносятся на EP0. А разве bulk передачи будут на EP0 переносится? И что, в таком случае можно LowSpeed MassStorage сделать?


MassStorage можно сделать и на одном EP0 и вообще по любому интерфейсу, драйвер только написать надо.


Я имел ввиду следующее - если необходимо сделать именно составное устройство, а доступных endpoints не хватает, то можно использовать control endpoint. EP0 доступна всегда, а как вы организуете обмен данными, зависит от вашей фантазии.

Но фразу о переносе Interrupt In на EP0 не понял - это как?
galjoen
Цитата(Седой @ Mar 23 2009, 12:38) *
MassStorage можно сделать и на одном EP0 и вообще по любому интерфейсу, драйвер только написать надо.


Я имел ввиду следующее - если необходимо сделать именно составное устройство, а доступных endpoints не хватает, то можно использовать control endpoint. EP0 доступна всегда, а как вы организуете обмен данными, зависит от вашей фантазии.

С драйвером это понятно. Но тогда и составное устройство не нужно.
Цитата(Седой @ Mar 23 2009, 12:38) *
Но фразу о переносе Interrupt In на EP0 не понял - это как?

Если у HID девайса нет InterruptIn(Out) EP, а в HID-дескрипторе описаны такие репорты, то в EP0 начнут приходить специальные SETUP-пакеты с запросами тех данных. Т.е. драйвет будет запрашивать(передавать) данные InterruptIn(Out) через EP0. По крайней мере я с таким столкнулся. А прочитав ваш пост, я подумал, что это стандарт такой. Т.е. я подумал, что это не HID драйвер так делает, а где-то выше. И при недостатке EP всегда так будет. Только я об этом не знал... Вобщем не понял я вас.
arizona
Цитата(DiMonstr @ Mar 18 2009, 22:12) *
Мужики, Кто-нибудь разрабатывал USB девайс, который бы в винде определялся как два устройства? Не важно на контроллере какой фирмы.
К примеру, мне необходимо реализовать в рамках одного устройства USB сетевой адаптер и USB винтчестер.
Драйвера предполагается использовать стандартные, виндузовские - это драйвер для работы с устройствами класса USB Mass Storage Device и CDC для Ethernet Control Devices. Соответственно эти два класса мне нужно реализовать в CY7C68013A.
Данный периферийный контроллер будет работать в режиме slave fifo и будет управляться ПЛИСиной Xilinx. Xilinx должен будет забирать пакеты из FIFO, определить сетевой это пакет или SCSI команда и передать в зависимости от этого в функциональный узел работы с винтом, либо с сетью.
Возникли такие вопросы:
1) Какая будет структура дескрипторов? Я предполагаю, что будет два дескриптора конфигурации, в каждом из которых будет описан свой интерфейс. Либо одна конфигурация, но два интерфейса. Как правильно?
2) Как винда, будет распределять передачу пакетов для винчестера и ЛВС?
3) Как обрабатывать переключаться между функциями обработки пакетов USB Mass Storage Device и CDC Ethernet Emulation Model?
4) Сможет ли пользовать работать с ЛВС и винчестером одновременно?


посмотрите примеры на www.microchip.com/usb
есть пример составного MSD+HID
так же есть примеры
http://www.microchip.com.ru/Support/USB%20apps.html (но основаны на более ранней версии USB framework-a )
Седой
Цитата(galjoen @ Mar 23 2009, 17:51) *
С драйвером это понятно. Но тогда и составное устройство не нужно.


Именно с собственными драйверами использовать композитное устройство очень удобно. Зачем различный функционал
запихивать в одно коробку, наоборот лучше разделить.
SFx
Цитата(galjoen @ Mar 19 2009, 04:17) *
Я такое неоднократно делал. Конфигурация одна д.б., а интерфейсов два или больше. Там у каждого интерфейса свои EP. А в SETUP пакетах есть специальное поле, в котором N интерфейса указывается, к которому этот пакет относится. Всё это решается. НО. Раньше CDC класс виндой определялся только по полю bDeviceClass в дескрипторе DEVICE. А он один на весь девайс. А при попытке CDC класс задать в дескрипторе INTERFACE у меня что-то ничего не работало. Хотя м.б. это у меня руки кривые. Или м.б. сейчас уже и работает - ошибку в винде исправили. Не знаю - мне с тех пор не надо было.
Единственно у них там ещё один глюк был. Дескриптор интерфейса у MassStorage должен первым идти и bInterfaceNumber у него соответственно д.б. =0. Иначе MS работать не будет.


Поясните, плиз, про интерфейсы поподробнее, может видели такую проблему :

делаю три интерфейса,
bNumInterfaces 03h
и одну конфигурацию
bConfigurationValue 01h

дальше пишу дискриптор, с номером "0" , и EP1IN для него. (соответсвенно и дискриптор EP1)
дальше пишу дискриптор, с номером "1" , и EP2 и EP4 для него. (соответсвенно и дискрипторы их по-порядку)
дальше пишу дискриптор, с номером "2" , и EP6 и EP8 для него. (соответсвенно и дискрипторы их тоже по-порядку)

компилю, зашиваю, смотрю в CYconsol, видит только интерфейс "0"....
в INIT функции ничего не пишу.
если оставляю один интерфейс, то в нем видны все заданные фифошки... если два - то тоже самое что и при трех...
куда смотреть?
galjoen
Цитата(SFx @ May 12 2009, 12:22) *
Поясните, плиз, про интерфейсы поподробнее, может видели такую проблему :

Выложите свои дескрипторы, тогда и можно будет что-то ответить. Хотя с CYconsol дела не имел. М.б. дело в ней? А винда ваш девайс нормально воспринимает? Длины везде правильные указаны?
SFx
Цитата(galjoen @ May 12 2009, 12:53) *
Выложите свои дескрипторы, тогда и можно будет что-то ответить. Хотя с CYconsol дела не имел. М.б. дело в ней? А винда ваш девайс нормально воспринимает? Длины везде правильные указаны?


Да винда нормально детектит. USBlyzer все дискрипторы нормально одупляет. везде длины верные.

вот пример с 2мя интерфейсами.

Код
Connection Status Device connected
Current Configuration 1
Speed High
Device Address 1
Number Of Open Pipes 4

Device Descriptor
Offset Field Size Value Description
0 bLength 1 12h  
1 bDescriptorType 1 01h Device
2 bcdUSB 2 0200h USB Spec 2.0
4 bDeviceClass 1 00h Class information in the Interface Descriptors
5 bDeviceSubClass 1 00h  
6 bDeviceProtocol 1 00h  
7 bMaxPacketSize0 1 40h 64 bytes
8 idVendor 2 04B4h Cypress Semiconductor Corp.
10 idProduct 2 1004h  
12 bcdDevice 2 0000h 0.00
14 iManufacturer 1 01h  
15 iProduct 1 02h  
16 iSerialNumber 1 03h  
17 bNumConfigurations 1 01h  

Configuration Descriptor 1 Bus Powered, 300 mA
Offset Field Size Value Description
0 bLength 1 09h  
1 bDescriptorType 1 02h Configuration
2 wTotalLength 2 0037h  
4 bNumInterfaces 1 02h  
5 bConfigurationValue 1 01h  
6 iConfiguration 1 00h  
7 bmAttributes 1 80h Bus Powered
4..0: Reserved  ...00000  
5: Remote Wakeup  ..0.....  No
6: Self Powered  .0......  No, Bus Powered
7: Reserved (set to one)
(bus-powered for 1.0)  1.......  
8 bMaxPower 1 96h 300 mA

Interface Descriptor 0/0 CDC Control, 2 Endpoints
Offset Field Size Value Description
0 bLength 1 09h  
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 00h  
3 bAlternateSetting 1 00h  
4 bNumEndpoints 1 02h  
5 bInterfaceClass 1 02h CDC Control
6 bInterfaceSubClass 1 02h Abstract Control Model
7 bInterfaceProtocol 1 00h  
8 iInterface 1 00h  

Endpoint Descriptor 02 2 Out, Bulk, 512 bytes
Offset Field Size Value Description
0 bLength 1 07h  
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 02h 2 Out
3 bmAttributes 1 02h Bulk
1..0: Transfer Type  ......10  Bulk
7..2: Reserved  000000..  
4 wMaxPacketSize 2 0200h 512 bytes
6 bInterval 1 00h  

Endpoint Descriptor 04 4 Out, Bulk, 512 bytes
Offset Field Size Value Description
0 bLength 1 07h  
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 04h 4 Out
3 bmAttributes 1 02h Bulk
1..0: Transfer Type  ......10  Bulk
7..2: Reserved  000000..  
4 wMaxPacketSize 2 0200h 512 bytes
6 bInterval 1 00h  

Interface Descriptor 1/0 Vendor-Specific, 2 Endpoints
Offset Field Size Value Description
0 bLength 1 09h  
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 01h  
3 bAlternateSetting 1 00h  
4 bNumEndpoints 1 02h  
5 bInterfaceClass 1 FFh Vendor-Specific
6 bInterfaceSubClass 1 00h  
7 bInterfaceProtocol 1 00h  
8 iInterface 1 00h  

Endpoint Descriptor 86 6 In, Bulk, 512 bytes
Offset Field Size Value Description
0 bLength 1 07h  
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 86h 6 In
3 bmAttributes 1 02h Bulk
1..0: Transfer Type  ......10  Bulk
7..2: Reserved  000000..  
4 wMaxPacketSize 2 0200h 512 bytes
6 bInterval 1 00h  

Endpoint Descriptor 88 8 In, Bulk, 512 bytes
Offset Field Size Value Description
0 bLength 1 07h  
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 88h 8 In
3 bmAttributes 1 02h Bulk
1..0: Transfer Type  ......10  Bulk
7..2: Reserved  000000..  
4 wMaxPacketSize 2 0200h 512 bytes
6 bInterval 1 00h


Может быть проблема с inf файлом ? я использую стандартный CyUSB.inf
galjoen
Цитата(SFx @ May 12 2009, 13:25) *
Да винда нормально детектит. USBlyzer все дискрипторы нормально одупляет. везде длины верные.

вот пример с 2мя интерфейсами.

Вроде с дескрипторами всё верно.
Но вот CDC класс... Сам не работал, но где-то читал, что его ТОЛЬКО в дескрипторе DEVICE можно писать. Т.е. винда свой драйвер только тогда поставит. И составного девайса с CDC из-за этого не м.б. Но это всё так, предположения/слухи... Но попробовать классы в интерфейсах поменять стоит... И на usb.org по этому поводу сходить...
SFx
Цитата(galjoen @ May 12 2009, 14:45) *
Сам не работал, но где-то читал, что его ТОЛЬКО в дескрипторе DEVICE можно писать...

ну это я щас расследую.

а вот с точки зрения inf файла - какие отличия если устройство составное ? с несколькими if ?
SFx
вообщем, как выяснилось, оригинальный CyUSB.sys работает только с одним интерфейсом.
чтобы заработать с двумя и более интерфейсами необходимо написать свой драйвер.

По сему вопрос:
Есть ли пример реализации драйвера, который работает с двумя интерфейсами (для любого класса) у сабжевой микросхеме? Если нет - то какие какие доки можно почитать на эту тему?
galjoen
Цитата(SFx @ May 14 2009, 15:50) *
вообщем, как выяснилось, оригинальный CyUSB.sys работает только с одним интерфейсом.
чтобы заработать с двумя и более интерфейсами необходимо написать свой драйвер.

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

Так работайте через стандартные вин драйвера (от микросхемы это не зависит). Есть HID, MassStorage, а теперь вроде ещё и CDC. Да ещё прошла новость, что теперь любой Setup пакет EP0 можно слать (документировали у вин эту возможность). Зачем вам свой драйвер? А у вин, надо признать, драйвера неплохие - я исследовал.
SFx
Цитата(galjoen @ May 14 2009, 16:21) *
Есть HID, MassStorage, а теперь вроде ещё и CDC.

HID и MassStorage не инетересны как раз то...

Мне по сути нужно устройство, которое будет в себе совмещать Сетевой интерфейс, и BDA.

Что то у меня сомнения закрадываются, что так можно сделать на CY.


Что касается Generic Драйверов, то вы имеете ввиду те которые идут в исходниках с WINDDK (к примеру, BulkUsb Driver) ?
galjoen
Цитата(SFx @ May 14 2009, 16:27) *
HID и MassStorage не инетересны как раз то...

Мне по сути нужно устройство, которое будет в себе совмещать Сетевой интерфейс, и BDA.

Что то у меня сомнения закрадываются, что так можно сделать на CY.

А программа с вашим устройсвом тоже только ваша будет работать? Если так, то работайте через HID+MassStorage - они отлично дополняют друг-друга. И программа, работающая с устройством, может в нём-же и хранится. Самодостаточная вещь получается.

Хотя я не знаю что такое BDA...
Цитата(SFx @ May 14 2009, 16:27) *
Что касается Generic Драйверов, то вы имеете ввиду те которые идут в исходниках с WINDDK (к примеру, BulkUsb Driver) ?

Те, которые установленны всегда. Никто ведь не ставит драйвер чтобы прочесть флешку и использовать мышку.
SFx
Цитата(galjoen @ May 14 2009, 16:47) *
А программа с вашим устройсвом тоже только ваша будет работать? Если так, то работайте через HID+MassStorage - они отлично дополняют друг-друга. И программа, работающая с устройством, может в нём-же и хранится. Самодостаточная вещь получается.
Хотя я не знаю что такое BDA...

по сути хотелось бы чтобы было так:
1. при включении устройства появлялся сетевой интерфейс (как у USB-Ethernet карточки) со всеми вытикающими (IP адресса, маршрутизация и тд)
2. Интерфейс чем то напоминающий TV-IN на видеокартах... ( чтоб можно было видео-аудио поток можно было принимать через DirectShow, к примеру) - это как раз решается через BDA (по крайней мере я так понял из MSDN).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.