Я запрограммировал микроконтроллер LPC11U14 для работы в качестве USB HID-клавиатуры. Это работает просто отлично, но я не могу заставить работать светодиоды. Я создал соответствующие дескрипторы, и я также могу (через USBlyzer) увидеть, что хост отправляет передачу управления OUT. Я просто не знаю, где и как обрабатывать отчет OUT.
Я могу включать и выключать светодиоды, когда нажимаю Caps Lock, Num Lock или Scroll Lock, но все они загораются независимо от того, какую из трех кнопок я нажимаю. Как будто я не получаю значения, какая кнопка была нажата, а только та кнопка a .
Вот мой дескриптор отчета HID:
const Int8U HidReportDescriptor[] =
{
0x05, 0x01, // Generic dekstop
0x09, 0x06, // Keyboard
0xA1, 0x01, // Application
0x05, 0x07, // Usage Page; Key Codes
0x19, 0xE0, // Usage minimum; 224
0x29, 0xE7, // Usage maximum; 231
0x15, 0x00, // Logical minimum; 0
0x25, 0x01, // Logical maximum; 1
0x75, 0x01, // Report size; 1
0x95, 0x08, // Report count; 8
0x81, 0x02, // Input (Data, Variable, Absolute); Modifier byte
0x95, 0x01, // Report count; 1
0x75, 0x08, // Report size; 8
0x81, 0x01, // Input (Constant); Reserved byte
0x95, 0x03, // Report count; 5
0x75, 0x01, // Report size; 1
0x05, 0x08, // Usage page, page # for LED's
0x19, 0x01, // Usage minimum; 1
0x29, 0x03, // Usage maximum; 5
0x91, 0x02, // Output (Data, Variable, Absolute); LED report
0x95, 0x01, // Report count; 1
0x75, 0x05, // Report size; 3
0x91, 0x01, // Output (Constant); LED report padding
0x95, 0x06, // Report count; 6
0x75, 0x08, // Report size; 8
0x15, 0x00, // Logical minimum; 0
0x26, 0xFF, 0x00, // Logical maximum; 101
0x05, 0x07, // Usage Page; Key Codes
0x19, 0x00, // Usage minimum; 0
0x2A, 0xFF, 0x00, // Usage maximum; 101
0x81, 0x00, // Input (Data, Array); Key arrays (6 bytes)
0xC0 // End collection
};
В моем файле "usb_hooks" есть все функции, которые вызываются при связи через USB. При использовании точек останова для отслеживания функции, используемой при нажатии, например, кнопка Num Lock, эта функция называется:
/*************************************************************************
* Function Name: USB_CLASS_REQUEST_HOOK
* Parameters: USB_Endpoint_t EP
*
* Return: UsbCommStatus_t
*
* Description: Called when class request receiving
*
*************************************************************************/
UsbCommStatus_t USB_CLASS_REQUEST_HOOK (pUsbSetupPacket_t pSetup)
{
//Add code here ...
return(UsbClassHidRequest(pSetup));
//return(UsbFault);
}
Кроме того, при проверке установочного пакета pSetup ни одна из его переменных не изменяется. Все они имеют одинаковое значение независимо от того, какую кнопку я нажимаю. pSetup содержит следующее:
typedef union _UsbSetupPacket_t
{
Int8U Data[8];
struct {
UsbRequestType_t mRequestType;
Int8U bRequest;
TwoBytes_t wValue;
TwoBytes_t wIndex;
TwoBytes_t wLength;
};
} UsbSetupPacket_t, * pUsbSetupPacket_t;
Есть предложения, где и как правильно читать конечную точку?