Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Два фнукциональных устройства в одном физическом
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Vitaliy S.
Как сделать так чтобы одно физ.устройство было видно виндой в виде двух, к примеру как HID устройство и mass-storage, я пытаюсь сделать в прошивке устройства два интерфейса один типа класс mass-staorage, другое класс HID. Получится ли такое? Т.е теоретически предполагается что винда подключит к моему устройству два драйвера - Custom HID и mass-storage.

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

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

Вообщем если кто-то что-то понял прошу ответить?
galjoen
Цитата(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/
Почитайте описание, м.б. станет понятнее..
Седой
Цитата(Vitaliy S. @ Jan 22 2009, 20:28) *
Вообщем работает ли Винда с одним физустройством но с разными его интерфейсами???

Да, может. Описание здесь http://msdn.microsoft.com/en-us/library/ms793564.aspx
arizona
Пример составного устройства с коменариями на русском есть тут:
http://www.microchip.com.ru/1010/Support/USB%20apps.html

В последнем USB стеке от микрочип есть готовый для вас пример составного устройства HID + MSD
www.microchip.com/usb
Remix
Сорри за небольшой оффтоп (модератор, пни, плз, если неправ, в нужный топик - я не нашел более подходящего), но здесь приведены копозиты из стандарных классов. А у меня немного другая проблема: хочу композит 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"
Седой
А что это за функция DoCallUSBD?

Если новичок в драйверописательстве - в топку все книжки типа Агурова (единственная достойная - Programming the Microsoft Windows Driver Model от Walter Oney), скачайте WDK и пишите в KMDF, а возможно достаточно будет готового WinUSB.
Remix
DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно.
Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства?
Пните, плиз, хотя бы куда смотреть...
Седой
Цитата(Remix @ Feb 11 2009, 21:06) *
DoCallUSBD - по мотивам того же Агурова - функция передает запрос нижнему драйверу и по KeWaitForSingleObject ждет результата. ПРиводить ее код, думаю, нет необходимости - все прозрачно.
Покурил MSDN - как то там все отрывисто и не совсем понятно. Драйвер композитного устройства создает PDO для каждой функции устройства. то есть, как я понимаю, у этих устройств должно быть можно прочесть и дескрипторы... или я окончательно запутался? и как эти дескрипторы должны выглядеть? или надо делать запрос к драйверу композитного устройства?
Пните, плиз, хотя бы куда смотреть...


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

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

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

PS. Драйвер композита хитрая штука, например, запрос SetConfiguration от вашего драйвера до устройства не дойдет. Запрос SetConfiguration в устройство направляет драйвер композита.
Remix
Цитата(Седой @ 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:
...удалил для краткости...
Седой
IAD должен быть один на 2 интерфейса СDC.
Remix
Цитата(Седой @ Feb 12 2009, 20:51) *
IAD должен быть один на 2 интерфейса СDC.


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

сорри, что долго молчал - проклятый грипп... sad.gif
DiMonstr
А кто-нибудь разрабатывал USB устройство класса CDC Ethernet Emulation Model?
Т.е. это будет USB сетевой адаптер. Нужен совет специалиста, знающего работу с этим классом.
Как это будет выглядеть в Windows, т.е. настройка сетевых параметров? Корректно ли работает стандартный драйвер?
korbian
Простите за офтоп. Не понял куда обратится, поэтому подниму более менее подходящую тему.
Есть композитное устройство на базе at9: Mass Storage + Generic(свой драйвер написан). Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо!
Седой
Цитата(korbian @ Nov 9 2009, 14:07) *
...
Как корректно заблокировать mass storage внутри устройства до появления сигнала на другом интерфейсе? Спасибо!

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

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

Делайте реэнумерацию. Когда нужен mass storage - устройство должно содержать его интерфейс, когда не нужен - интерфейса нет.
Но будут тонкости - система должна видеть это как два разных устройства.
korbian
Цитата(Седой @ Nov 10 2009, 10:53) *
Делайте реэнумерацию. Когда нужен mass storage - устройство должно содержать его интерфейс, когда не нужен - интерфейса нет.
Но будут тонкости - система должна видеть это как два разных устройства.

Как я понял, вы предлагаете модифицировать дескриптор устройства на лету? НО второй\специализированный интерфейс должен быть доступен ВСЕГДА, а первый (mass storage) должен "отлочить" диск только по сигналу на втором. на этот интерфейс предполагается посадить стандартный драйвер Windows usbstor.sys.
Седой
Цитата(korbian @ Nov 10 2009, 13:16) *
Как я понял, вы предлагаете модифицировать дескриптор устройства на лету? НО второй\специализированный интерфейс должен быть доступен ВСЕГДА, а первый (mass storage) должен "отлочить" диск только по сигналу на втором. на этот интерфейс предполагается посадить стандартный драйвер Windows usbstor.sys.


"Отлочить" и "прилочить" должен второй (управляющий) интерфейс, который должен быть доступен ВСЕГДА.
Посмотрите спецификацию DFU 1.1 - как раз так и сделано.
korbian
Цитата(Седой @ Nov 10 2009, 13:51) *
"Отлочить" и "прилочить" должен второй (управляющий) интерфейс, который должен быть доступен ВСЕГДА.
Посмотрите спецификацию DFU 1.1 - как раз так и сделано.

спасибо, посмотрю!

Цитата(korbian @ Nov 10 2009, 14:05) *
спасибо, посмотрю!

глянул одним глазом! smile.gif сразу возник вопрос, если придется перепрошивать устройство много раз за один сеанс работы (одно подключение к компьютеру) не исчерпаю ли я резерв по перепрошивки внутренней флеш микроконтроллера? то есть в каких пределах обычно находится этот параметр(количество перезаписей внутренней флеш)?
galjoen
korbian, а если ваше устройство как хаб описать? И уже к нему, с точки зрения ОС, подключается/отключается всё, что угодно.
korbian
Цитата(galjoen @ Nov 10 2009, 14:58) *
korbian, а если ваше устройство как хаб описать? И уже к нему, с точки зрения ОС, подключается/отключается всё, что угодно.

спасибо за идею, можно попробовать!
Седой
Цитата(galjoen @ Nov 10 2009, 16:58) *
korbian, а если ваше устройство как хаб описать? И уже к нему, с точки зрения ОС, подключается/отключается всё, что угодно.


В принципе возможно, только одно но ... обычный USB блок в известных мне микроконтроллерах не позволит вам это сделать - "подключать/отключать всё что угодно"


Цитата(korbian @ Nov 10 2009, 16:15) *
глянул одним глазом! smile.gif сразу возник вопрос, если придется перепрошивать устройство много раз за один сеанс работы ...

А это ещё зачем?
galjoen
Цитата(Седой @ Nov 12 2009, 16:07) *
В принципе возможно, только одно но ... обычный USB блок в известных мне микроконтроллерах не позволит вам это сделать - "подключать/отключать всё что угодно"

Да, про то, что адреса (старшие 7 бит) у хаба, и подключенных к нему девайсов, будут разные. Я об этом как-то и не подумал... А так хаб дополнительно всего одну Interrupt In EP займёт, ну и контрольный канал, конечно.
Жаль, что это невозможно. Т.о. можно много проблем решить было бы.
Да и вообще, у современных микроконтроллеров даже и младшие то 4 бита адреса у EP изменить невозможно.
korbian
Цитата(Седой @ Nov 12 2009, 16:07) *
А это ещё зачем?

ну как зачем. в исходном состоянии одна прошивка, после определенного события заливается другая или я что то неправильно понял?
Седой
Цитата(korbian @ Nov 13 2009, 14:32) *
ну как зачем. в исходном состоянии одна прошивка, после определенного события заливается другая или я что то неправильно понял?

Совершенно не нужно перепрограммировать контроллер для того, чтобы провести реэнумерацию с другим набором дескрипторов и логикой обработки USB пакетов.
korbian
Цитата(Седой @ Nov 13 2009, 15:44) *
провести реэнумерацию с другим набором дескрипторов и логикой обработки USB пакетов.

а где почитать про это?
DiMonstr
А поддерживается составное USB устройство, к примеру, с интерфейсом Mass Storage Device (MSD) и Communications Device Class (CDC) на уровне BIOSа??? Сможет ли BIOS распознать подобный девайс, поставить драйвер для MSD и выполнить программу с загрузочного сектора флэш памяти, которая подключена к контроллеру USB?
galjoen
MassStorage, в т.ч. и в составном устройстве, биос поддерживает. И загрузится с него можно. Только интерфейс MassStorage должен первым идти. Что-то у меня иначе в винде не работало.
CDC не делал. Попробовал и пришёл к выводу, что винда только если в дескрипторе DEVICE его класс прописать понимает, а в INTERFACE - нет. Т.е. составное устройство сделать невозможно. А м.б. это у меня руки кривые...
А про драйвера и биос скажу, что это две вещи несовместные. В биосе нужно через прерывания работать. Он только MassStorage, клавиатуру и мышку понимает. Причём у двух последних для этого специальный биосовский протокол должен поддерживаться. Но из своей программы, с загрузочного MassStorage в биосе запущенной, со своим же CDC, конечно, работать можно. Через прерывания биос. Там ограничений куда как меньше, чем в случае работы из под ОС будет...
DiMonstr
Цитата(galjoen @ Nov 18 2009, 21:39) *
В биосе нужно через прерывания работать. Он только MassStorage, клавиатуру и мышку понимает.

Как показывает практика, BIOS поддерживает и USB хабы. Вчера пробовал подключать загрузочную флэшку с DOS'ом через хаб. На первой машине это привело к зависанию на этапе POST, а на второй прокатило. BIOS увидел флэшку и загрузился с неё biggrin.gif
DiMonstr
Нажмите для просмотра прикрепленного файла
Цитата(galjoen @ Nov 18 2009, 21:39) *
...Попробовал и пришёл к выводу, что винда только если в дескрипторе DEVICE его класс прописать понимает, а в INTERFACE - нет. Т.е. составное устройство сделать невозможно. А м.б. это у меня руки кривые...

Хочу опровергнуть заявление galjoen о невозможности создания составного устройста biggrin.gif
Сегодня попробовал сделать составное USB устройство: Mass Storage Device и CDC Ethernet Emulation Model.

Прилагаю описание дескрипторов во вложении.

А также картинку диспетчера устройств во вложении.
korbian
DiMonstr, а что за софт дескриптор устройства в таком виде(html) отображает?
DiMonstr
Цитата(korbian @ Nov 21 2009, 09:01) *

Да любой софт для анализа обмена на шине usb.Я использую последнее время USBAnalyser.
korbian
Цитата(DiMonstr @ Nov 22 2009, 12:22) *
Да любой софт для анализа обмена на шине usb.Я использую последнее время USBAnalyser.

а ссылку можно, а то гугл много чего выдает на такой запрос!
DiMonstr
Цитата(korbian @ Nov 22 2009, 12:41) *
а ссылку можно, а то гугл много чего выдает на такой запрос!

Извиняюсь за невеное название софта. Вот список программ для анализа USB трафика:
USBlyzer.1.5.97
SysNucleus USBTrace
Advanced USB Port Monitor 2.3.0.14.
galjoen
Цитата(DiMonstr @ Nov 20 2009, 17:17) *
Хочу опровергнуть заявление galjoen о невозможности создания составного устройста biggrin.gif
Сегодня попробовал сделать составное USB устройство: Mass Storage Device и CDC Ethernet Emulation Model.

Ну, если можно сделать MS+CDC, то это радует. Хотя м.б. эта возможность только начиная с SP1 появилась. И ещё, неизвестно как драйвера встали - по bInterfaceClass или по VID+PID. Попробуйте, как я в своё время, в дескрипторе DEVICE idVendor=idProduct=bcdDevice=0 сделать. Если и в этом случае всё работать будет, то действительно можно радоваться...

К списку ПО, анализирующего USB, могу ещё BusHound (не совсем то и платное wink.gif ) и SnoopyPro (лично мне нравится и бесплатное) добавить.
DiMonstr
Для класса устройства Mass Storage Device описанного в дескрипторе интерфейса №0 драйвера у меня встали автоматически.
Для класса устройства Communication Device Descriptor описанного в дескрипторе интерфейса №1 драйвера автоматически ось не поставила. Чтобы установить стандартный драйвер usbser.sys для интерфейса №1, необходимо создать INF-файл. Образец я выложил.

Основная его фишка в этой строке: biggrin.gif
Код
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_DC99&PID_C906&MI_01

Здесь идентификатор устройства включает Vendor ID, Product ID и "MI_01" означает номер интерфейса USB устройства для которого нужно поставить драйвер.

Как вы заметили, я не применял дескриптор Interface Association Descriptor (IAD). Я описал интерфейс CDC с тремя конечными точками. Я не стал отдельно создавать интерфейс данных и коммуникационный интерфейс. Кроме того, я не описал следующие дескрипторы:
- заголовочный (Header Functional Descriptor);
- режима команд (Call Management Functional Descriptor);
- абстракции устройства (Abstract Control Management Functional Descriptor);
- группирования (Union Functional Descriptor).

Работу девайса по второму интерфейсу я пока не проверял. На днях протестирую. smile3009.gif
galjoen
Цитата(DiMonstr @ Nov 25 2009, 16:04) *
Для класса устройства Communication Device Descriptor описанного в дескрипторе интерфейса №1 драйвера автоматически ось не поставила.

И у меня так было. Поэтому и дальнейшие попытки не предпринимал т.к. мне нужно было чтобы программа со встроенного диска без установки на комп работала.
А вот если в дескрипторе DEVICE bDeviceClass=CDC установить, то драйвера автоматически ставятся в т.ч. и при VID=PID=0, но устройство уже будет без MassStorage. Хотя я, к сожалению, не попробовал при этом устройство составным, в т.ч. и с интерфейсом MassStorage, делать. А вдруг прокатило бы?
aal
2 DiMonstr Ну и чем опыты закончились?
DiMonstr
Цитата(aal @ Jan 15 2010, 13:19) *
2 DiMonstr Ну и чем опыты закончились?

На этом всё и закончилосьsmile.gif
Сейчас другим делом занят. Разбираюсь со спецификацией Remote NDIS. Хочу забацать типа адаптера USB-Ethernet
KIM
народ, а кто нить писал композитное устройство на основе cy7c68013? Хочу сделать Mass Storage плюс свой девайс, чтобы драйвера и софт на него таскать вместе с ним и ставить прямо с него. Я там понимаю проблема далеко не нова и повсеместно применяется в мобильных usb девайсах, модемах и пр. Мож есть какие примеры на эту тему? Вообще мне нужно корректно поставить задачу для проектирования и разводки ПП для устройтва. А как программировать его можно разобраться и позже. То есть необходимо составить что то вроде функциональной схемы. Пока в голову приходит вот что:

CY7c16013 (Cypress, usb fx2) связан с FPGA (она все равно будет в девайсе для реализации его основного функционала), на FPGA заведена FLASH память какая-нить (для mass storage девайса). Вооот... Все остальное достигается за счет программирования CY7c16013 и FPGA.
KIM
Цитата(KIM @ Aug 5 2010, 00:30) *
CY7c16013 (Cypress, usb fx2) связан с FPGA (она все равно будет в девайсе для реализации его основного функционала), на FPGA заведена FLASH память какая-нить (для mass storage девайса). Вооот... Все остальное достигается за счет программирования CY7c16013 и FPGA.

Пардон, не CY7c16013 , а CY7C68013
galjoen
Цитата(KIM @ Aug 5 2010, 00:30) *
CY7c16013 (Cypress, usb fx2) связан с FPGA (она все равно будет в девайсе для реализации его основного функционала), на FPGA заведена FLASH память какая-нить (для mass storage девайса). Вооот... Все остальное достигается за счет программирования CY7c16013 и FPGA.

Чтобы сделать составное устойство нужно чтобы кол-во EndPoint (EP) было достаточным. Вот например для HID+MassStorage нужно 3 EP (не считая 0й) - 1. HID-овская InterruptIn, 2. MassStorage Bulk IN, 2. MassStorage Bulk OUT. Можно обойтись и без InterruptIn EP - сделать HID только с Get(Set)Feature через контрольный канал (0-я EP). Но у CY7C68013 кол-во EP для всех случаев вполне достаточное.

Не знаю какие требования к скорости и объёму передаваемых данных (кроме MassStorage) в вашем случае, поэтому рекомендовать ничего не могу. Но хочу заметить, что м.б. всё можно сделать и вообще без CY7C68013? На самой FPGA.
KIM
Цитата(galjoen @ Aug 5 2010, 12:45) *
Чтобы сделать составное устойство нужно чтобы кол-во EndPoint (EP) было достаточным. Вот например для HID+MassStorage нужно 3 EP (не считая 0й) - 1. HID-овская InterruptIn, 2. MassStorage Bulk IN, 2. MassStorage Bulk OUT. Можно обойтись и без InterruptIn EP - сделать HID только с Get(Set)Feature через контрольный канал (0-я EP). Но у CY7C68013 кол-во EP для всех случаев вполне достаточное.

Не знаю какие требования к скорости и объёму передаваемых данных (кроме MassStorage) в вашем случае, поэтому рекомендовать ничего не могу. Но хочу заметить, что м.б. всё можно сделать и вообще без CY7C68013? На самой FPGA.


Честно говоря, у меня есть опыт работы с cy7c68013, а на FPGA я usb никогда не реализовывал. Думаю есть готовые ядра, но я их пока не смотрел. Кстати FPGA скорее всего будет EP3C55 (Altera Cyclone III). Для моего девайса вполне достаточно будет двух Bulk EP (одна на вход, одна на выход), скорости там небольшие - если 15 мегабит на проходе через девайс получится, буднет очень Здорово. FPGA как вы наверняка поняли, будет определенную обработку входных данных проводить и гнать их обратно.

То есть создание композитного девайса заключается в написании драйвера и прошивки для CY7C680013, данные получать из FLASH через FPGA... Интерфейс для mass storage сложен в реализации? Мост между ним и FPGA с флеш-памятью придется на CY7C68013 реализовывать, я правильно понимаю?

galjoen
Цитата(KIM @ Aug 5 2010, 19:22) *
Для моего девайса вполне достаточно будет двух Bulk EP (одна на вход, одна на выход), скорости там небольшие - если 15 мегабит на проходе через девайс получится, буднет очень Здорово.

FPGA как вы наверняка поняли, будет определенную обработку входных данных проводить и гнать их обратно.

Интерфейс для mass storage сложен в реализации?

Тогда вам вообще составное устройство не нужно. Можно одним MassStorage обойтись. Например, опишите его как устройство с 2-мя логическими дисками и всё. На одном, защищённом от записи, все программы для работы с вашим девайсом, а на другой, фиктивный, будет для приёма-передачи данных использоваться. Работать с ним придётся через запись/чтение сектора (иначе винда закэширует), но зато никаких драйверов не нужно. И две bulk EP нужны всего.

Так что, вам никакого общения с внешним миром не нужно? Что же это такое будет? Защита от копирования?

MassStorage в реализации не сложен, но требуется аккуратность. И виндовсие глюки обойти, иначе виндой отформатировать невозможно будет.
KIM
Цитата(galjoen @ Aug 5 2010, 20:00) *
Так что, вам никакого общения с внешним миром не нужно? Что же это такое будет? Защита от копирования?


Да, типа того, защита от копирования, реинженеринга и все такое, плюс шифрованный конфиг прям на девайсе - получается все свое ношу с собой )

А может есть где в открытом доступе примеры реализации композитных девайсов под CY7C68013? А примеры драйверов для композитных девайсов?
Spider
Привет! А можно я тоже задам вопрос? smile.gif

Я пытаюсь реализовать TouchScreen и клавиатуру в одном USB устройстве. Чтобы не изобретать велосипед, я взял драйвер для TouchScreen у eGalaxTouch и полностью проэмулировал работу его чипов. Но вот всё работало до поры, когда надо было соединить это с клавиатурой. В виде составного устройства eGalax драйвер уже не устанавливается. Можно как-то это обойти?
Как я понял ситуация такая, что родное eGalax устройство уже от части составное, но с 1 интерфейсом и драйвер ставится на Device, а в моём случае Этот самый Device содержит ещё один интерфейс -> клавиатуру, что вводит его в замешательство. Может можно сделать какой-нить SubDevice в составе Device? smile.gif Не не знаю как объяснить smile.gif
DiMonstr
Цитата(aal @ Jan 15 2010, 14:19) *
2 DiMonstr Ну и чем опыты закончились?


Опыты закончились успешноsmile.gif Создание составного устройства не проблема!
На контроллере AT90USB1286 реализовал Mass Storage Device и CDC виртуальный com-порт.

Сейчас делаю на CY7C68013A мега составной девайс. Упаковываю в один девайс 3 логических.
- USB Remote NDIS: 3 endpoints. Эта удаленная сетка через USB. Своего рода адаптер USB<->Ethernet;
- Mass Storage Device: 2 endpoints. Поддержка трех LUN - винт Serial ATA и две Flash USB Drive;
- Служебный канал: 2 endpoints.
Сейчас пока реализовал каждое из этих логических устройств на отдельном контроллере.

Контроллер, хочу сказать, просто супер! Можно реализовать всё, что хочешь. Очень гибкий по настройкам функционирования в различных режимах. Правда он мне мозг реально вынес smile3046.gif в режиме работы Slave FIFO Manual IN/OUT.
kan35
А случаем на STM32 никто ничего подобного не встречал? нужен именно MSD + CDC VCP.

Еще разбираю примеры USB классов для STM32 на их примерах, и правильно ли я понимаю, что весь обмен по USB а так же чтение с флэшки (в MSD) происходят в прерываниях USB?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.