Каковы ограничения устройства USB Composite

Я рассматриваю кодирование USB-устройства, способного инкапсулировать два USB-устройства. Я хотел бы создать HID-клавиатуру с одним дополнительным USB-портом. К порту будет подключено запоминающее устройство.

Мне было интересно, смогу ли я запрограммировать клавиатуру, чтобы зарегистрировать ее как составное устройство, инкапсулирующее запоминающее устройство и клавиатуру?

Мой текущий мыслительный процесс состоит в том, чтобы объявить клавиатуру с двумя интерфейсами. Я думал просто скопировать команды USB с флешки в один из интерфейсов клавиатуры. Это возможно?

Если это неправильное мышление, пожалуйста, дайте мне знать, каким должно быть форматирование данных интерфейсов.

Спасибо.

Кроме того, это в образовательных целях, чтобы расширить мои знания о USB.

Проще использовать аппаратный USB-концентратор, чем пытаться сделать USB-концентратор в композите. Так что из этих микросхем нужен только колпачок и кристалл.

Ответы (2)

У вас не может быть «HID-клавиатуры» с «одним дополнительным портом»; устройство такого типа должно быть составным устройством , состоящим из двухпортового концентратора, с одним портом, подключенным к несъемному HID-устройству. Другой порт может быть постоянно подключен к запоминающему устройству. В этом случае вам может не понадобиться оборачивать все это как составное устройство (устройство, поддерживающее два альтернативных класса).

Разработка правильного набора дескрипторов для таких устройств ужасно сложна (по крайней мере, с точки зрения специалиста по аппаратному обеспечению), но вы можете использовать готовые руководства, например, из поддержки компилятора Keil, промежуточного программного обеспечения MDK для USB-устройств и связи с хостом . Эта ссылка представляет собой пример составного USB-устройства, созданного на основе двух их предыдущих руководств: «USB-устройство HID» и «USB-устройство большой емкости». Надеюсь, это именно то, что вам нужно.

Привет. Спасибо за ваш ответ. Спасибо за ресурс. Я посмотрю на это позже. Однако мне интересно, почему это должно быть составное устройство? До сих пор я понимаю, что составное устройство может позволить двум usb-устройствам отображаться как 1 через интерфейс. Является ли это понимание неверным?
@philm, наверное, я не понял, что у вас есть два пути: составной и составной. Поскольку вы сказали «дополнительный USB-порт», это будет путь для составного устройства, когда обе функции доступны одновременно через встроенный концентратор. Преимуществом будет использование всех стандартных хост-драйверов для этого устройства. Если вы хотите, чтобы функция запоминающего устройства была скрыта и использовалась путем переключения интерфейсов составного устройства, вам, вероятно, понадобится проприетарный драйвер.
Окей, это проясняет. Итак, при каких условиях я должен использовать составное устройство по сравнению с составным устройством и наоборот?
@philm, составные устройства обычно состоят из микросхем дискретного контроллера, я считаю, что в целом невозможно синтезировать USB-концентратор в MCU. Если у вас есть только микроконтроллер, то композит — единственный выход.
Да, опять же, это только для образования. Я читал статью, в которой я мог реализовать TLC и ссылаться на каждое USB-устройство через идентификатор отчета. Мне это кажется достаточно простым решением вместо использования интерфейсов, которые, судя по всему, были бы занозой в заднице.

Раньше я делал много таких составных устройств (HID + запоминающее устройство), но не сейчас. Есть две проблемы. Во-первых, Windows их больше не любит. Сегодня существует масса проблем с обменом данными с конечными точками составных запоминающих устройств. Они прекрасно работали в Windows 2000 и Windows XP, но уже не так. Я понятия не имею, почему - может быть, кто-то может просветить меня?

Вторая проблема заключается в том, что если вы объявляете запоминающее устройство как часть составного дескриптора устройства, код вашего микроконтроллера должен обрабатывать запросы к запоминающему устройству. Вы не можете просто передавать их на другой USB-порт байт за байтом, поскольку дескрипторы интерфейса (почти наверняка) отличаются. Вы можете сделать это, если у вас есть другой USB-хост-порт в вашем MCU: напишите хост-код USB, который взаимодействует с USB-флеш-накопителем (или даже с совершенно другим устройством памяти, таким как SD-карта), и передайте команды чтения и записи блока между вашим составным интерфейс и другое запоминающее устройство. Это будет работать, по крайней мере, с Linux и старыми ядрами Windows.

Но если вы просто хотите иметь простой порт USB на боковой стороне клавиатуры и у вас нет дополнительных требований (например, способность клавиатуры читать флэш-память USB без ПК), просто возьмите карту USD0. .3 Микросхема USB-концентратора, поместите ее на ту же печатную плату, подключите один из портов к микроконтроллеру, а другой (-ые) к внешнему разъему (-ам) вашего продукта. Преимущество заключается в том, что ваш продукт становится стандартным, например, к внешнему порту (-ам) можно подключить любое USB-устройство (устройства), включая большее количество концентраторов, и у вас не будет проблем с программным обеспечением MCU.

[Правка] хм... Я подумал... Я думаю, можно было бы передать команды протокола MSC (пакеты USBC - данные - USBS) на другой порт USB, что облегчило бы общую реализацию программного обеспечения. .. но другие проблемы остаются.