DiMonstr 0 18 марта, 2009 Опубликовано 18 марта, 2009 · Жалоба Мужики, Кто-нибудь разрабатывал 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 0 19 марта, 2009 Опубликовано 19 марта, 2009 · Жалоба Мужики, Кто-нибудь разрабатывал USB девайс, который бы в винде определялся как два устройства? Не важно на контроллере какой фирмы. ... Я такое неоднократно делал. Конфигурация одна д.б., а интерфейсов два или больше. Там у каждого интерфейса свои EP. А в SETUP пакетах есть специальное поле, в котором N интерфейса указывается, к которому этот пакет относится. Всё это решается. НО. Раньше CDC класс виндой определялся только по полю bDeviceClass в дескрипторе DEVICE. А он один на весь девайс. А при попытке CDC класс задать в дескрипторе INTERFACE у меня что-то ничего не работало. Хотя м.б. это у меня руки кривые. Или м.б. сейчас уже и работает - ошибку в винде исправили. Не знаю - мне с тех пор не надо было. Единственно у них там ещё один глюк был. Дескриптор интерфейса у MassStorage должен первым идти и bInterfaceNumber у него соответственно д.б. =0. Иначе MS работать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DiMonstr 0 19 марта, 2009 Опубликовано 19 марта, 2009 · Жалоба Я такое неоднократно делал... Хорошо, спасибо 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 21 марта, 2009 Опубликовано 21 марта, 2009 · Жалоба Хорошо, спасибо galjoen. А для каких целей тогда применяется несколько конфигураций в устройстве? Вот Вы говорите у каждого интерфейса своя EP. А как же быть, если контроллер имеет 2-е IN EP и 2-е OUT EP, а мне нужно организовать 3 интерфейса. Получается не хватит мне EP. Более одной конфигурации Windows поддерживает начиная c Vista. Естественно, может быть активна только одна конфигурация. Если не хватает EP, используйте EP0 (Control Endpoint). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 21 марта, 2009 Опубликовано 21 марта, 2009 · Жалоба Более одной конфигурации Windows поддерживает начиная c Vista. Естественно, может быть активна только одна конфигурация. Мне просто любопытно, а что будет в этом (bNumConfigurations>1) случае? Окошко с вопросом "какую конф-ию выбрать" откроется? Сам бы попробовал, да что-то нигде Висты поблизости нет. Простите за офтоп. Если не хватает EP, используйте EP0 (Control Endpoint). Interrupt In передачи, конечно, переносятся на EP0. А разве bulk передачи будут на EP0 переносится? И что, в таком случае можно LowSpeed MassStorage сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба Interrupt In передачи, конечно, переносятся на EP0. А разве bulk передачи будут на EP0 переносится? И что, в таком случае можно LowSpeed MassStorage сделать? MassStorage можно сделать и на одном EP0 и вообще по любому интерфейсу, драйвер только написать надо. Я имел ввиду следующее - если необходимо сделать именно составное устройство, а доступных endpoints не хватает, то можно использовать control endpoint. EP0 доступна всегда, а как вы организуете обмен данными, зависит от вашей фантазии. Но фразу о переносе Interrupt In на EP0 не понял - это как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба MassStorage можно сделать и на одном EP0 и вообще по любому интерфейсу, драйвер только написать надо. Я имел ввиду следующее - если необходимо сделать именно составное устройство, а доступных endpoints не хватает, то можно использовать control endpoint. EP0 доступна всегда, а как вы организуете обмен данными, зависит от вашей фантазии. С драйвером это понятно. Но тогда и составное устройство не нужно. Но фразу о переносе Interrupt In на EP0 не понял - это как? Если у HID девайса нет InterruptIn(Out) EP, а в HID-дескрипторе описаны такие репорты, то в EP0 начнут приходить специальные SETUP-пакеты с запросами тех данных. Т.е. драйвет будет запрашивать(передавать) данные InterruptIn(Out) через EP0. По крайней мере я с таким столкнулся. А прочитав ваш пост, я подумал, что это стандарт такой. Т.е. я подумал, что это не HID драйвер так делает, а где-то выше. И при недостатке EP всегда так будет. Только я об этом не знал... Вобщем не понял я вас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arizona 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба Мужики, Кто-нибудь разрабатывал 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 ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 23 марта, 2009 Опубликовано 23 марта, 2009 (изменено) · Жалоба С драйвером это понятно. Но тогда и составное устройство не нужно. Именно с собственными драйверами использовать композитное устройство очень удобно. Зачем различный функционал запихивать в одно коробку, наоборот лучше разделить. Изменено 23 марта, 2009 пользователем Седой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба Я такое неоднократно делал. Конфигурация одна д.б., а интерфейсов два или больше. Там у каждого интерфейса свои 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 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба Поясните, плиз, про интерфейсы поподробнее, может видели такую проблему : Выложите свои дескрипторы, тогда и можно будет что-то ответить. Хотя с CYconsol дела не имел. М.б. дело в ней? А винда ваш девайс нормально воспринимает? Длины везде правильные указаны? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба Выложите свои дескрипторы, тогда и можно будет что-то ответить. Хотя с 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 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба Да винда нормально детектит. USBlyzer все дискрипторы нормально одупляет. везде длины верные. вот пример с 2мя интерфейсами. Вроде с дескрипторами всё верно. Но вот CDC класс... Сам не работал, но где-то читал, что его ТОЛЬКО в дескрипторе DEVICE можно писать. Т.е. винда свой драйвер только тогда поставит. И составного девайса с CDC из-за этого не м.б. Но это всё так, предположения/слухи... Но попробовать классы в интерфейсах поменять стоит... И на usb.org по этому поводу сходить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 12 мая, 2009 Опубликовано 12 мая, 2009 · Жалоба Сам не работал, но где-то читал, что его ТОЛЬКО в дескрипторе DEVICE можно писать... ну это я щас расследую. а вот с точки зрения inf файла - какие отличия если устройство составное ? с несколькими if ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SFx 0 14 мая, 2009 Опубликовано 14 мая, 2009 · Жалоба вообщем, как выяснилось, оригинальный CyUSB.sys работает только с одним интерфейсом. чтобы заработать с двумя и более интерфейсами необходимо написать свой драйвер. По сему вопрос: Есть ли пример реализации драйвера, который работает с двумя интерфейсами (для любого класса) у сабжевой микросхеме? Если нет - то какие какие доки можно почитать на эту тему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться