Empezando con el USB modo HID
1. Introducción:
El modo de funcionamiento HID (Human Interface Device) incluye los dispositivos más usados por los usuarios, como pueden ser un teclado, un ratón, .
Son dispositivos muy extendidos cuyo driver se integra por defecto en el sistema; lo que nos evita asociar un driver para tener todo en funcioamiento.
2. Empezando:
Lo primero que haremos será abrir el ejemplo (HID_Custom) del directorio MLA para ver qué ficheros son necesarios (C:\Program Files (x86)\Microchip\Mla\v2016_11_07\apps\usb\device\hid_custom\firmware\picdem_fs_usb.x):

Como podemos observar, los ficheros son los mismos, cambiando los cdc por hid:

2.1.Funciones importantes:
Lo primero que se hace es inicializar el puerto USB; para esto se llama a la función "USBInitialize()", esta función habilita el USB.
La función "USBTask()" gestiona los estados del USB y maneja los eventos. Esta función debe llamarse periódicamente para mantener el USB funcionando.
Tablas descriptoras del USB:
- USB Descriptor Table: En este punto, el USB se identifica:
- Device: Identifica el tipo de dispositivo e indica las posibles configuraciones.
- Configuration: Describe los tipos de interface y endpoints usados.
- Strings (Opcional): Nos da más información sobre el dispositivo.
- EndPoint Configuration Table: Describe la forma de comunicar funciones del USB con los interfaces. Puede haber más de un endpoint con su configuración (como mínimo debe existir el 0).

- Function Driver Table: Cada entrada en la tabla contiene la información necesaria para gestionar una función del driver.

La forma de funcionar es la siguiente, el HID función driver (USB Device) se comunica con el HID class driver (USB Host) usando el "pipe control" por defecto. Es obligatorio el uso de interrupción en recepción del Host, pero la interrupción en recepción del Device es opcional.

2.2.Funciones recibir y enviar:
Funciones:
- If (HIDRxHandleBusy(USBOutHandle) == false): Comprueba si ha recibido algo desde el host.
- ReceivedDataBuffer[]: En este buffer se guarda lo recibido automáticamente. Se declara al inicio: unsigned char ReceivedDataBuffer[64] @ ID_CUSTOM_OUT_DATA_BUFFER_ADDRESS;
- If (!HIDTxHandleBusy(USBInHandle)): Comprueba si estamos preparados para transmitir. Si se está enviando datos y no ha terminado, nos dará como puerto ocupado y debemos esperar.
- HIDTxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ToSendDataBuffer[0],64): Escribe en el buffer de salida.
- HIDRxPacket(CUSTOM_DEVICE_HID_EP, (uint8_t*)&ReceivedDataBuffer, 64): Rearma el buffer de entrada para poder recibir más elementos.

3. Preparando el proyecto:
Vamos a preparar el proyecto para ejecutarlo independientemente.
Lo más sencillo es copiar el proyecto anterior (USB_CDC_TEST01) y lo nombramos como USB_HDI_TEST01.
Ahora debemos reemplazar algunos ficheros:

Finalmente, desde el IDE, debemos apuntar a los ficheros necesarios que se encuentran en el directorio de nuestro proyecto, quedando como el ejemplo:

Ya podemos compilar sin problemas.
3.1. Conectando la placa con el firmware cargado:
Al conectar al pc, instalará automáticamente el elemento como HID, apareciendo en el árbol de administrador de dispositivos de la siguiente manera:


En el directorio de las MLA, hay una aplicación de ejemplo para comunicarnos con la placa
(C:\Program Files (x86)\Microchip\Mla\v2016_11_07\apps\usb\device\hid_custom\utilities\basic_example\windows\vc++2005_express\bin):


Al pulsar sobre el botón "Connect", se conecta sin necesidad de indicarle puerto. Esto lo hace porque reconoce el VID, PID.
Si pulsamos sobre el botón "Toggle LED(s)", cambia de estado el led L2 de nuestra placa.
Si pulsamos sobre el botón "Get Pushbutton State", recoge el estado del pulsador K2 de nuestra placa.
Lo que observamos, es facilidad de integración.
- Pic18f4550 usb HID controlado desde aplicación:
4. Ejemplo Mouse:
Ahora abriremos el ejemplo del "mouse". Para esto realizamos el proceso anterior para ejecutar el proyecto de forma independiente.
Una vez realizado, cargamos el firmware y conectamos al pc. Nos aparece lo siguiente:

En administrador de dispositivos aparece de la siguiente manera:

- Pic18f4550 usb HID emulando ratón:
5. Descargas: