Estoy viendo la codificación de un dispositivo USB que es capaz de encapsular dos dispositivos USB. Me gustaría crear un teclado HID con un solo puerto USB adicional. Un dispositivo de almacenamiento masivo estaría conectado al puerto.
Me preguntaba, ¿sería capaz de programar el teclado para registrarlo como un dispositivo compuesto que encapsula el almacenamiento masivo y el teclado?
Mi proceso de pensamiento actual es declarar que el teclado tiene 2 interfaces. Estaba pensando en simplemente copiar los comandos USB del disco de masa en una de las interfaces del teclado. es posible?
Si este es un pensamiento incorrecto, hágame saber cuál se supone que es el formato de datos de las interfaces.
Gracias.
Además, esto es con fines educativos para ampliar mi conocimiento de USB.
No puede tener un "teclado HID" con un "único puerto extra"; el dispositivo de este tipo debe ser un dispositivo compuesto , hecho de un concentrador de dos puertos, con un puerto conectado a un dispositivo HID no extraíble. El otro puerto se puede conectar permanentemente a un dispositivo de almacenamiento masivo. En este caso, es posible que no necesite envolver todo esto como un dispositivo compuesto (un dispositivo que admite dos clases alternativas).
Diseñar el conjunto correcto de descriptores para este tipo de dispositivos es terriblemente complicado (al menos desde la perspectiva de un técnico de hardware), pero puede usar guías listas para usar de, por ejemplo, compatibilidad con el compilador Keil, MDK Middleware para dispositivos USB y Host Communication . Este enlace es para un ejemplo de dispositivo USB compuesto basado en dos de sus tutoriales anteriores, "Dispositivo USB HID" y "Almacenamiento masivo de dispositivo USB". Espero que esto sea exactamente lo que necesitas.
He hecho muchos de estos dispositivos compuestos (HID + almacenamiento masivo) antes, pero ya no. Hay dos problemas. La primera es que a Windows ya no le gustan. Hay un montón de problemas hoy en día con la comunicación con puntos finales de almacenamiento masivo compuestos. Funcionaron bien en Windows 2000 y Windows XP, pero ya no tanto. No tengo idea de por qué, ¿quizás alguien pueda educarme?
El segundo problema es que si declara un dispositivo de almacenamiento masivo como parte de su descriptor de dispositivo compuesto, entonces su código de microcontrolador debe manejar las solicitudes de dispositivos de almacenamiento masivo. No puede simplemente retransmitirlos byte a byte a otro puerto USB, ya que los descriptores de la interfaz son (casi con certeza) diferentes. Puede hacer esto si tiene otro puerto de host USB en su MCU: escriba el código de host USB que se comunica con la memoria flash USB (o incluso con un dispositivo de memoria totalmente diferente, como una tarjeta SD) y transmita los comandos de lectura y escritura del bloque entre su compuesto interfaz y el otro dispositivo de memoria. Funcionará, al menos con Linux y kernels de Windows más antiguos.
Pero si solo desea tener un puerto USB simple en el costado de su teclado, y no tiene requisitos adicionales (como que el teclado pueda leer la memoria flash USB sin la PC), entonces solo tome un USD0 .3 USB hub IC, colóquelo en la misma PCB, conecte uno de los puertos a su microcontrolador y el otro(s) a conector(es) externo(s) en su producto. El beneficio es que su producto es estándar, por ejemplo, cualquier tipo de dispositivo USB se puede conectar a los puertos externos, incluidos más concentradores, y no tiene ningún problema con su software MCU.
[Editar] hmm... Me puse a pensar... Supongo que podría ser posible transmitir los comandos del protocolo MSC (los USBC - datos - paquetes USBS) al otro puerto USB, lo que facilitaría la implementación general del software. .. pero los otros problemas permanecen.
Transeúnte