Add LUFA mouse feature and fix mouse report.
- add LUFA boot mouse feature - remove report_id from mouse report - fix LUFA descriptor
This commit is contained in:
parent
effa5914bf
commit
a9a3610dd4
@ -82,15 +82,14 @@ typedef struct {
|
|||||||
uint8_t mods;
|
uint8_t mods;
|
||||||
uint8_t rserved;
|
uint8_t rserved;
|
||||||
uint8_t keys[REPORT_KEYS];
|
uint8_t keys[REPORT_KEYS];
|
||||||
} report_keyboard_t;
|
} __attribute__ ((packed)) report_keyboard_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t report_id;
|
|
||||||
uint8_t buttons;
|
uint8_t buttons;
|
||||||
int8_t x;
|
int8_t x;
|
||||||
int8_t y;
|
int8_t y;
|
||||||
int8_t v;
|
int8_t v;
|
||||||
int8_t h;
|
int8_t h;
|
||||||
} report_mouse_t;
|
} __attribute__ ((packed)) report_mouse_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -132,6 +132,14 @@ SRC += keymap.c \
|
|||||||
CONFIG_H = config.h
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# comment out to disable the options.
|
||||||
|
#
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys
|
||||||
|
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
|
||||||
|
#EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||||
|
#NKRO_ENABLE = yes # USB Nkey Rollover
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
LUFA_OPTS = -D USB_DEVICE_ONLY
|
LUFA_OPTS = -D USB_DEVICE_ONLY
|
||||||
|
@ -111,7 +111,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
|
|||||||
HID_RI_END_COLLECTION(0),
|
HID_RI_END_COLLECTION(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
|
const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
|
||||||
{
|
{
|
||||||
HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
|
HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
|
||||||
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
|
||||||
@ -180,7 +180,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
/*
|
/*
|
||||||
* Keyboard
|
* Keyboard
|
||||||
*/
|
*/
|
||||||
.HID0_KeyboardInterface =
|
.Keyboard_Interface =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID0_KeyboardHID =
|
.Keyboard_HID =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.HIDReportLength = sizeof(KeyboardReport)
|
.HIDReportLength = sizeof(KeyboardReport)
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID0_ReportINEndpoint =
|
.Keyboard_INEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
/*
|
/*
|
||||||
* Mouse
|
* Mouse
|
||||||
*/
|
*/
|
||||||
.HID1_MouseInterface =
|
.Mouse_Interface =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID1_MouseHID =
|
.Mouse_HID =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.HIDReportLength = sizeof(MouseReport)
|
.HIDReportLength = sizeof(MouseReport)
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID1_ReportINEndpoint =
|
.Mouse_INEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
@ -258,9 +258,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic
|
* Console
|
||||||
*/
|
*/
|
||||||
.HID2_GenericInterface =
|
.Console_Interface =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
|
||||||
|
|
||||||
@ -276,7 +276,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.InterfaceStrIndex = NO_DESCRIPTOR
|
.InterfaceStrIndex = NO_DESCRIPTOR
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID2_GenericHID =
|
.Console_HID =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
|
||||||
|
|
||||||
@ -284,10 +284,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.CountryCode = 0x00,
|
.CountryCode = 0x00,
|
||||||
.TotalReportDescriptors = 1,
|
.TotalReportDescriptors = 1,
|
||||||
.HIDReportType = HID_DTYPE_Report,
|
.HIDReportType = HID_DTYPE_Report,
|
||||||
.HIDReportLength = sizeof(GenericReport)
|
.HIDReportLength = sizeof(ConsoleReport)
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID2_ReportINEndpoint =
|
.Console_INEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
@ -297,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
|
|||||||
.PollingIntervalMS = 0x01
|
.PollingIntervalMS = 0x01
|
||||||
},
|
},
|
||||||
|
|
||||||
.HID2_ReportOUTEndpoint =
|
.Console_OUTEndpoint =
|
||||||
{
|
{
|
||||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
|
||||||
|
|
||||||
@ -380,15 +380,15 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
|||||||
case HID_DTYPE_HID:
|
case HID_DTYPE_HID:
|
||||||
switch (wIndex) {
|
switch (wIndex) {
|
||||||
case KEYBOARD_INTERFACE:
|
case KEYBOARD_INTERFACE:
|
||||||
Address = &ConfigurationDescriptor.HID0_KeyboardHID;
|
Address = &ConfigurationDescriptor.Keyboard_HID;
|
||||||
Size = sizeof(USB_HID_Descriptor_HID_t);
|
Size = sizeof(USB_HID_Descriptor_HID_t);
|
||||||
break;
|
break;
|
||||||
case MOUSE_INTERFACE:
|
case MOUSE_INTERFACE:
|
||||||
Address = &ConfigurationDescriptor.HID1_MouseHID;
|
Address = &ConfigurationDescriptor.Mouse_HID;
|
||||||
Size = sizeof(USB_HID_Descriptor_HID_t);
|
Size = sizeof(USB_HID_Descriptor_HID_t);
|
||||||
break;
|
break;
|
||||||
case GENERIC_INTERFACE:
|
case GENERIC_INTERFACE:
|
||||||
Address = &ConfigurationDescriptor.HID2_GenericHID;
|
Address = &ConfigurationDescriptor.Console_HID;
|
||||||
Size = sizeof(USB_HID_Descriptor_HID_t);
|
Size = sizeof(USB_HID_Descriptor_HID_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -404,8 +404,8 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
|
|||||||
Size = sizeof(MouseReport);
|
Size = sizeof(MouseReport);
|
||||||
break;
|
break;
|
||||||
case GENERIC_INTERFACE:
|
case GENERIC_INTERFACE:
|
||||||
Address = &GenericReport;
|
Address = &ConsoleReport;
|
||||||
Size = sizeof(GenericReport);
|
Size = sizeof(ConsoleReport);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -46,20 +46,20 @@ typedef struct
|
|||||||
USB_Descriptor_Configuration_Header_t Config;
|
USB_Descriptor_Configuration_Header_t Config;
|
||||||
|
|
||||||
// Keyboard HID Interface
|
// Keyboard HID Interface
|
||||||
USB_Descriptor_Interface_t HID0_KeyboardInterface;
|
USB_Descriptor_Interface_t Keyboard_Interface;
|
||||||
USB_HID_Descriptor_HID_t HID0_KeyboardHID;
|
USB_HID_Descriptor_HID_t Keyboard_HID;
|
||||||
USB_Descriptor_Endpoint_t HID0_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t Keyboard_INEndpoint;
|
||||||
|
|
||||||
// Mouse HID Interface
|
// Mouse HID Interface
|
||||||
USB_Descriptor_Interface_t HID1_MouseInterface;
|
USB_Descriptor_Interface_t Mouse_Interface;
|
||||||
USB_HID_Descriptor_HID_t HID1_MouseHID;
|
USB_HID_Descriptor_HID_t Mouse_HID;
|
||||||
USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t Mouse_INEndpoint;
|
||||||
|
|
||||||
// Generic HID Interface
|
// Console HID Interface
|
||||||
USB_Descriptor_Interface_t HID2_GenericInterface;
|
USB_Descriptor_Interface_t Console_Interface;
|
||||||
USB_HID_Descriptor_HID_t HID2_GenericHID;
|
USB_HID_Descriptor_HID_t Console_HID;
|
||||||
USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
|
USB_Descriptor_Endpoint_t Console_INEndpoint;
|
||||||
USB_Descriptor_Endpoint_t HID2_ReportOUTEndpoint;
|
USB_Descriptor_Endpoint_t Console_OUTEndpoint;
|
||||||
} USB_Descriptor_Configuration_t;
|
} USB_Descriptor_Configuration_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ static host_driver_t lufa_driver = {
|
|||||||
|
|
||||||
|
|
||||||
static void SetupHardware(void);
|
static void SetupHardware(void);
|
||||||
static void Generic_HID_Task(void);
|
static void Console_HID_Task(void);
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
@ -93,7 +93,7 @@ int main(void)
|
|||||||
while (1) {
|
while (1) {
|
||||||
keyboard_proc();
|
keyboard_proc();
|
||||||
|
|
||||||
Generic_HID_Task();
|
Console_HID_Task();
|
||||||
USB_USBTask();
|
USB_USBTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ void SetupHardware(void)
|
|||||||
USB_Init();
|
USB_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Generic_HID_Task(void)
|
static void Console_HID_Task(void)
|
||||||
{
|
{
|
||||||
/* Device must be connected and configured for the task to run */
|
/* Device must be connected and configured for the task to run */
|
||||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||||
@ -126,13 +126,13 @@ static void Generic_HID_Task(void)
|
|||||||
if (Endpoint_IsReadWriteAllowed())
|
if (Endpoint_IsReadWriteAllowed())
|
||||||
{
|
{
|
||||||
/* Create a temporary buffer to hold the read in report from the host */
|
/* Create a temporary buffer to hold the read in report from the host */
|
||||||
uint8_t GenericData[GENERIC_REPORT_SIZE];
|
uint8_t ConsoleData[GENERIC_REPORT_SIZE];
|
||||||
|
|
||||||
/* Read Generic Report Data */
|
/* Read Console Report Data */
|
||||||
Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
|
Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
|
||||||
|
|
||||||
/* Process Generic Report Data */
|
/* Process Console Report Data */
|
||||||
//ProcessGenericHIDReport(GenericData);
|
//ProcessConsoleHIDReport(ConsoleData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finalize the stream transfer to send the last packet */
|
/* Finalize the stream transfer to send the last packet */
|
||||||
@ -175,13 +175,26 @@ void EVENT_USB_Device_ConfigurationChanged(void)
|
|||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
||||||
HID_EPSIZE, ENDPOINT_BANK_SINGLE);
|
HID_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||||
|
|
||||||
/* Setup Generic HID Report Endpoints */
|
/* Setup Console HID Report Endpoints */
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
|
||||||
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
|
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
|
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
|
||||||
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
|
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Appendix G: HID Request Support Requirements
|
||||||
|
|
||||||
|
The following table enumerates the requests that need to be supported by various types of HID class devices.
|
||||||
|
|
||||||
|
Device type GetReport SetReport GetIdle SetIdle GetProtocol SetProtocol
|
||||||
|
------------------------------------------------------------------------------------------
|
||||||
|
Boot Mouse Required Optional Optional Optional Required Required
|
||||||
|
Non-Boot Mouse Required Optional Optional Optional Optional Optional
|
||||||
|
Boot Keyboard Required Optional Required Required Required Required
|
||||||
|
Non-Boot Keybrd Required Optional Required Required Optional Optional
|
||||||
|
Other Device Required Optional Optional Optional Optional Optional
|
||||||
|
*/
|
||||||
/** Event handler for the USB_ControlRequest event.
|
/** Event handler for the USB_ControlRequest event.
|
||||||
* This is fired before passing along unhandled control requests to the library for processing internally.
|
* This is fired before passing along unhandled control requests to the library for processing internally.
|
||||||
*/
|
*/
|
||||||
@ -288,7 +301,12 @@ static void send_mouse(report_mouse_t *report)
|
|||||||
if (Endpoint_IsReadWriteAllowed())
|
if (Endpoint_IsReadWriteAllowed())
|
||||||
{
|
{
|
||||||
/* Write Mouse Report Data */
|
/* Write Mouse Report Data */
|
||||||
Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
|
/* Mouse report data structure
|
||||||
|
* LUFA: { buttons, x, y }
|
||||||
|
* tmk: { buttons, x, y, v, h }
|
||||||
|
*/
|
||||||
|
//Endpoint_Write_Stream_LE((uint8_t *)report+1, 3, NULL);
|
||||||
|
Endpoint_Write_Stream_LE(report, 3, NULL);
|
||||||
|
|
||||||
/* Finalize the stream transfer to send the last packet */
|
/* Finalize the stream transfer to send the last packet */
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
|
@ -62,6 +62,11 @@ int main(void)
|
|||||||
|
|
||||||
debug("initForUsbConnectivity()\n");
|
debug("initForUsbConnectivity()\n");
|
||||||
initForUsbConnectivity();
|
initForUsbConnectivity();
|
||||||
|
int i;
|
||||||
|
while(--i){ /* To configured */
|
||||||
|
usbPoll();
|
||||||
|
_delay_ms(1);
|
||||||
|
}
|
||||||
|
|
||||||
debug("main loop\n");
|
debug("main loop\n");
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -90,10 +95,15 @@ int main(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!suspended)
|
if (!suspended) {
|
||||||
usbPoll();
|
usbPoll();
|
||||||
|
|
||||||
|
// TODO: configuration process is incosistent. it sometime fails.
|
||||||
|
// To prevent failing to configure NOT scan keyboard during configuration
|
||||||
|
if (usbConfiguration && usbInterruptIsReady()) {
|
||||||
keyboard_proc();
|
keyboard_proc();
|
||||||
if (!suspended)
|
}
|
||||||
vusb_transfer_keyboard();
|
vusb_transfer_keyboard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -91,23 +91,48 @@ static void send_keyboard(report_keyboard_t *report)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t report_id;
|
||||||
|
report_mouse_t report;
|
||||||
|
} __attribute__ ((packed)) vusb_mouse_report_t;
|
||||||
|
|
||||||
static void send_mouse(report_mouse_t *report)
|
static void send_mouse(report_mouse_t *report)
|
||||||
{
|
{
|
||||||
report->report_id = REPORT_ID_MOUSE;
|
vusb_mouse_report_t r = {
|
||||||
|
.report_id = REPORT_ID_MOUSE,
|
||||||
|
.report = *report
|
||||||
|
};
|
||||||
if (usbInterruptIsReady3()) {
|
if (usbInterruptIsReady3()) {
|
||||||
usbSetInterrupt3((void *)report, sizeof(*report));
|
usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
typedef struct {
|
||||||
|
uint8_t report_id;
|
||||||
|
uint8_t data0;
|
||||||
|
uint8_t data1;
|
||||||
|
} __attribute__ ((packed)) vusb_system_report_t;
|
||||||
|
*/
|
||||||
|
|
||||||
static void send_system(uint16_t data)
|
static void send_system(uint16_t data)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
// Not need static?
|
// Not need static?
|
||||||
static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
|
static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
|
||||||
report[1] = data&0xFF;
|
report[1] = data&0xFF;
|
||||||
report[2] = (data>>8)&0xFF;
|
report[2] = (data>>8)&0xFF;
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
vusb_system_report_t r = {
|
||||||
|
.report_id = REPORT_ID_SYSTEM,
|
||||||
|
.data0 = data&0xFF,
|
||||||
|
.data1 = (data>>8)&0xFF
|
||||||
|
};
|
||||||
if (usbInterruptIsReady3()) {
|
if (usbInterruptIsReady3()) {
|
||||||
usbSetInterrupt3((void *)&report, sizeof(report));
|
usbSetInterrupt3((void *)&r, sizeof(vusb_system_report_t));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void send_consumer(uint16_t data)
|
static void send_consumer(uint16_t data)
|
||||||
|
Reference in New Issue
Block a user