Я рассматриваю кодирование USB-устройства, способного инкапсулировать два USB-устройства. Я хотел бы создать HID-клавиатуру с одним дополнительным USB-портом. К порту будет подключено запоминающее устройство.
Мне было интересно, смогу ли я запрограммировать клавиатуру, чтобы зарегистрировать ее как составное устройство, инкапсулирующее запоминающее устройство и клавиатуру?
Мой текущий мыслительный процесс состоит в том, чтобы объявить клавиатуру с двумя интерфейсами. Я думал просто скопировать команды USB с флешки в один из интерфейсов клавиатуры. Это возможно?
Если это неправильное мышление, пожалуйста, дайте мне знать, каким должно быть форматирование данных интерфейсов.
Спасибо.
Кроме того, это в образовательных целях, чтобы расширить мои знания о USB.
У вас не может быть «HID-клавиатуры» с «одним дополнительным портом»; устройство такого типа должно быть составным устройством , состоящим из двухпортового концентратора, с одним портом, подключенным к несъемному HID-устройству. Другой порт может быть постоянно подключен к запоминающему устройству. В этом случае вам может не понадобиться оборачивать все это как составное устройство (устройство, поддерживающее два альтернативных класса).
Разработка правильного набора дескрипторов для таких устройств ужасно сложна (по крайней мере, с точки зрения специалиста по аппаратному обеспечению), но вы можете использовать готовые руководства, например, из поддержки компилятора Keil, промежуточного программного обеспечения MDK для USB-устройств и связи с хостом . Эта ссылка представляет собой пример составного USB-устройства, созданного на основе двух их предыдущих руководств: «USB-устройство HID» и «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, что облегчило бы общую реализацию программного обеспечения. .. но другие проблемы остаются.
Прохожий