|
@@ -46,13 +46,12 @@
|
|
|
#include "descriptor.h"
|
|
|
#include "lufa.h"
|
|
|
|
|
|
+static uint8_t idle_duration = 0;
|
|
|
+static uint8_t protocol_report = 1;
|
|
|
static uint8_t keyboard_led_stats = 0;
|
|
|
|
|
|
-// TODO: impl Control Request GET_REPORT
|
|
|
static report_keyboard_t keyboard_report_sent;
|
|
|
-#ifdef MOUSE_ENABLE
|
|
|
-static report_mouse_t mouse_report_sent;
|
|
|
-#endif
|
|
|
+
|
|
|
|
|
|
/* Host driver */
|
|
|
static uint8_t keyboard_leds(void);
|
|
@@ -83,12 +82,8 @@ int main(void)
|
|
|
debug_keyboard = true;
|
|
|
debug_mouse = true;
|
|
|
|
|
|
-/* TODO: can't print here
|
|
|
- _delay_ms(5000);
|
|
|
- USB_USBTask();
|
|
|
- print("abcdefg\n");
|
|
|
- USB_USBTask();
|
|
|
-*/
|
|
|
+ // TODO: can't print here
|
|
|
+ debug("LUFA init\n");
|
|
|
|
|
|
keyboard_init();
|
|
|
host_set_driver(&lufa_driver);
|
|
@@ -228,19 +223,6 @@ void EVENT_USB_Device_ControlRequest(void)
|
|
|
ReportData = (uint8_t*)&keyboard_report_sent;
|
|
|
ReportSize = sizeof(keyboard_report_sent);
|
|
|
break;
|
|
|
-#ifdef MOUSE_ENABLE
|
|
|
- case MOUSE_INTERFACE:
|
|
|
- // TODO: test/check
|
|
|
- ReportData = (uint8_t*)&mouse_report_sent;
|
|
|
- ReportSize = sizeof(mouse_report_sent);
|
|
|
- break;
|
|
|
-#endif
|
|
|
-#ifdef EXTRAKEY_ENABLE
|
|
|
- case EXTRA_INTERFACE:
|
|
|
- break;
|
|
|
-#endif
|
|
|
- case CONSOLE_INTERFACE:
|
|
|
- break;
|
|
|
}
|
|
|
|
|
|
/* Write the report data to the control endpoint */
|
|
@@ -252,35 +234,65 @@ void EVENT_USB_Device_ControlRequest(void)
|
|
|
case HID_REQ_SetReport:
|
|
|
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
|
|
{
|
|
|
- Endpoint_ClearSETUP();
|
|
|
-
|
|
|
- /* Wait until the LED report has been sent by the host */
|
|
|
- while (!(Endpoint_IsOUTReceived()))
|
|
|
- {
|
|
|
- if (USB_DeviceState == DEVICE_STATE_Unattached)
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
// Interface
|
|
|
switch (USB_ControlRequest.wIndex) {
|
|
|
case KEYBOARD_INTERFACE:
|
|
|
- // TODO: test/check
|
|
|
- /* Read in the LED report from the host */
|
|
|
+ Endpoint_ClearSETUP();
|
|
|
+
|
|
|
+ while (!(Endpoint_IsOUTReceived())) {
|
|
|
+ if (USB_DeviceState == DEVICE_STATE_Unattached)
|
|
|
+ return;
|
|
|
+ }
|
|
|
keyboard_led_stats = Endpoint_Read_8();
|
|
|
- break;
|
|
|
-#ifdef MOUSE_ENABLE
|
|
|
- case MOUSE_INTERFACE:
|
|
|
- break;
|
|
|
-#endif
|
|
|
-#ifdef EXTRAKEY_ENABLE
|
|
|
- case EXTRA_INTERFACE:
|
|
|
- break;
|
|
|
-#endif
|
|
|
- case CONSOLE_INTERFACE:
|
|
|
+
|
|
|
+ Endpoint_ClearOUT();
|
|
|
+ Endpoint_ClearStatusStage();
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- Endpoint_ClearOUT();
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HID_REQ_GetProtocol:
|
|
|
+ if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
|
|
+ {
|
|
|
+ Endpoint_ClearSETUP();
|
|
|
+ while (!(Endpoint_IsINReady()));
|
|
|
+ Endpoint_Write_8(protocol_report);
|
|
|
+ Endpoint_ClearIN();
|
|
|
+ Endpoint_ClearStatusStage();
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case HID_REQ_SetProtocol:
|
|
|
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
|
|
+ {
|
|
|
+ Endpoint_ClearSETUP();
|
|
|
+ Endpoint_ClearStatusStage();
|
|
|
+
|
|
|
+ protocol_report = ((USB_ControlRequest.wValue & 0xFF) != 0x00);
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case HID_REQ_SetIdle:
|
|
|
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
|
|
|
+ {
|
|
|
+ Endpoint_ClearSETUP();
|
|
|
+ Endpoint_ClearStatusStage();
|
|
|
+
|
|
|
+ idle_duration = ((USB_ControlRequest.wValue & 0xFF00) >> 8);
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case HID_REQ_GetIdle:
|
|
|
+ if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
|
|
|
+ {
|
|
|
+ Endpoint_ClearSETUP();
|
|
|
+ while (!(Endpoint_IsINReady()));
|
|
|
+ Endpoint_Write_8(idle_duration);
|
|
|
+ Endpoint_ClearIN();
|
|
|
Endpoint_ClearStatusStage();
|
|
|
}
|
|
|
|
|
@@ -329,23 +341,17 @@ static void send_mouse(report_mouse_t *report)
|
|
|
/* Finalize the stream transfer to send the last packet */
|
|
|
Endpoint_ClearIN();
|
|
|
}
|
|
|
- mouse_report_sent = *report;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-typedef struct {
|
|
|
- uint8_t report_id;
|
|
|
- uint16_t usage;
|
|
|
-} __attribute__ ((packed)) report_extra_t;
|
|
|
-
|
|
|
static void send_system(uint16_t data)
|
|
|
{
|
|
|
+ report_extra_t r = {
|
|
|
+ .report_id = REPORT_ID_SYSTEM,
|
|
|
+ .usage = data
|
|
|
+ };
|
|
|
Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
|
|
|
if (Endpoint_IsReadWriteAllowed()) {
|
|
|
- report_extra_t r = {
|
|
|
- .report_id = REPORT_ID_SYSTEM,
|
|
|
- .usage = data
|
|
|
- };
|
|
|
Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
|
|
|
Endpoint_ClearIN();
|
|
|
}
|
|
@@ -353,12 +359,12 @@ static void send_system(uint16_t data)
|
|
|
|
|
|
static void send_consumer(uint16_t data)
|
|
|
{
|
|
|
+ report_extra_t r = {
|
|
|
+ .report_id = REPORT_ID_CONSUMER,
|
|
|
+ .usage = data
|
|
|
+ };
|
|
|
Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
|
|
|
if (Endpoint_IsReadWriteAllowed()) {
|
|
|
- report_extra_t r = {
|
|
|
- .report_id = REPORT_ID_CONSUMER,
|
|
|
- .usage = data
|
|
|
- };
|
|
|
Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
|
|
|
Endpoint_ClearIN();
|
|
|
}
|