summaryrefslogtreecommitdiff
path: root/keyboard/lufa/lufa.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard/lufa/lufa.c')
-rw-r--r--keyboard/lufa/lufa.c129
1 files changed, 118 insertions, 11 deletions
diff --git a/keyboard/lufa/lufa.c b/keyboard/lufa/lufa.c
index d7e7c1654d..d841f45c6a 100644
--- a/keyboard/lufa/lufa.c
+++ b/keyboard/lufa/lufa.c
@@ -1,6 +1,8 @@
/*
* Copyright 2012 Jun Wako <wakojun@gmail.com>
- * This file is based on LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse.
+ * This file is based on:
+ * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ * LUFA-120219/Demos/Device/Lowlevel/GenericHID
*/
/*
@@ -38,6 +40,8 @@
#include "host.h"
#include "host_driver.h"
#include "keyboard.h"
+#include "sendchar.h"
+#include "debug.h"
#include "lufa.h"
static uint8_t keyboard_led_stats = 0;
@@ -64,11 +68,21 @@ int main(void)
SetupHardware();
sei();
+ print_enable = true;
+ debug_enable = true;
+ debug_matrix = true;
+ debug_keyboard = true;
+ debug_mouse = true;
+
+ _delay_ms(3000);
+ print("abcdefg\n");
+
keyboard_init();
host_set_driver(&lufa_driver);
while (1) {
keyboard_proc();
Keyboard_HID_Task();
+ Generic_HID_Task();
USB_USBTask();
}
}
@@ -112,6 +126,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
/* Setup Mouse HID Report Endpoint */
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
HID_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+ /* Setup Generic HID Report Endpoints */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+ GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
}
/** Event handler for the USB_ControlRequest event.
@@ -119,8 +139,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
*/
void EVENT_USB_Device_ControlRequest(void)
{
- uint8_t* ReportData;
- uint8_t ReportSize;
+ uint8_t* ReportData = NULL;
+ uint8_t ReportSize = 0;
/* Handle HID Class specific requests */
switch (USB_ControlRequest.bRequest)
@@ -130,16 +150,18 @@ void EVENT_USB_Device_ControlRequest(void)
{
Endpoint_ClearSETUP();
- /* Determine if it is the mouse or the keyboard data that is being requested */
- if (!(USB_ControlRequest.wIndex))
- {
+ // Interface
+ switch (USB_ControlRequest.wIndex) {
+ case 1: // Keyboard
ReportData = (uint8_t*)&keyboard_report_sent;
ReportSize = sizeof(keyboard_report_sent);
- }
- else
- {
+ break;
+ case 2: // Mouse
ReportData = (uint8_t*)&mouse_report_sent;
ReportSize = sizeof(mouse_report_sent);
+ break;
+ case 3: // Generic
+ break;
}
/* Write the report data to the control endpoint */
@@ -160,8 +182,17 @@ void EVENT_USB_Device_ControlRequest(void)
return;
}
- /* Read in the LED report from the host */
- keyboard_led_stats = Endpoint_Read_8();
+ // Interface
+ switch (USB_ControlRequest.wIndex) {
+ case 1: // Keyboard
+ /* Read in the LED report from the host */
+ keyboard_led_stats = Endpoint_Read_8();
+ break;
+ case 2: // Mouse
+ break;
+ case 3: // Generic
+ break;
+ }
Endpoint_ClearOUT();
Endpoint_ClearStatusStage();
@@ -176,6 +207,10 @@ void EVENT_USB_Device_ControlRequest(void)
*/
void Keyboard_HID_Task(void)
{
+ /* Device must be connected and configured for the task to run */
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return;
+
/* Select the Keyboard LED Report Endpoint */
Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM);
@@ -190,6 +225,40 @@ void Keyboard_HID_Task(void)
}
}
+void Generic_HID_Task(void)
+{
+ /* Device must be connected and configured for the task to run */
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return;
+
+ Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
+
+ /* Check to see if a packet has been sent from the host */
+ if (Endpoint_IsOUTReceived())
+ {
+ /* Check to see if the packet contains data */
+ if (Endpoint_IsReadWriteAllowed())
+ {
+ /* Create a temporary buffer to hold the read in report from the host */
+ uint8_t GenericData[GENERIC_REPORT_SIZE];
+
+ /* Read Generic Report Data */
+ Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
+
+ /* Process Generic Report Data */
+ //TODO: ProcessGenericHIDReport(GenericData);
+ }
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearOUT();
+ }
+
+ /* IN packet */
+ Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+ // send IN packet
+ if (Endpoint_IsINReady())
+ Endpoint_ClearIN();
+}
/*******************************************************************************
* Host driver
@@ -241,3 +310,41 @@ static void send_system(uint16_t data)
static void send_consumer(uint16_t data)
{
}
+
+
+/*******************************************************************************
+ * sendchar
+ ******************************************************************************/
+int8_t sendchar(uint8_t c)
+{
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return -1;
+
+ Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+
+ uint8_t timeout = 10;
+ uint16_t prevFN = USB_Device_GetFrameNumber();
+ while (!Endpoint_IsINReady()) {
+ switch (USB_DeviceState) {
+ case DEVICE_STATE_Unattached:
+ case DEVICE_STATE_Suspended:
+ return -1;
+ }
+ if (Endpoint_IsStalled())
+ return -1;
+ uint16_t currFN = USB_Device_GetFrameNumber();
+ if (prevFN != USB_Device_GetFrameNumber()) {
+ if (!(timeout--))
+ return -1;
+ prevFN = USB_Device_GetFrameNumber();
+ }
+ }
+
+ Endpoint_Write_8(c);
+
+ // send when packet is full
+ if (!Endpoint_IsReadWriteAllowed())
+ Endpoint_ClearIN();
+
+ return 0;
+}