summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2012-07-08 23:57:25 +0900
committertmk <nobody@nowhere>2012-07-08 23:57:25 +0900
commit8947029950ba19c16bedd3d4618d4227f4714564 (patch)
tree6a3ce9eb93040f8995a2d673ceec7b1dca471685
parentab89bfce03e7c792c92a2be1ccf0fbc1e379ed94 (diff)
Interrupt driven Control ep and Console task
-rw-r--r--keyboard/hhkb/Makefile.lufa3
-rw-r--r--protocol/lufa/descriptor.h2
-rw-r--r--protocol/lufa/lufa.c100
3 files changed, 65 insertions, 40 deletions
diff --git a/keyboard/hhkb/Makefile.lufa b/keyboard/hhkb/Makefile.lufa
index cdd68f40ab..0dc295e621 100644
--- a/keyboard/hhkb/Makefile.lufa
+++ b/keyboard/hhkb/Makefile.lufa
@@ -93,6 +93,9 @@ ARCH = AVR8
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
# Build Options
# comment out to disable the options.
diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h
index 001e072e6a..09fb24acc1 100644
--- a/protocol/lufa/descriptor.h
+++ b/protocol/lufa/descriptor.h
@@ -110,7 +110,7 @@ typedef struct
#define KEYBOARD_EPSIZE 8
#define MOUSE_EPSIZE 8
-#define CONSOLE_EPSIZE 8
+#define CONSOLE_EPSIZE 32
#define EXTRA_EPSIZE 8
diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c
index 8fa719bc95..10511ba67b 100644
--- a/protocol/lufa/lufa.c
+++ b/protocol/lufa/lufa.c
@@ -69,7 +69,7 @@ static host_driver_t lufa_driver = {
static void SetupHardware(void);
-static void Console_HID_Task(void);
+static void Console_Task(void);
int main(void)
{
@@ -90,8 +90,9 @@ int main(void)
while (1) {
keyboard_proc();
- Console_HID_Task();
+#if !defined(INTERRUPT_CONTROL_ENDPOINT)
USB_USBTask();
+#endif
}
}
@@ -105,42 +106,52 @@ void SetupHardware(void)
clock_prescale_set(clock_div_1);
USB_Init();
+
+ // for Console_Task
+ USB_Device_EnableSOFEvents();
}
-static void Console_HID_Task(void)
+static void Console_Task(void)
{
- /* Device must be connected and configured for the task to run */
- if (USB_DeviceState != DEVICE_STATE_Configured)
- return;
-
- // TODO: impl receivechar()/recvchar()
- Endpoint_SelectEndpoint(CONSOLE_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 ConsoleData[CONSOLE_EPSIZE];
-
- /* Read Console Report Data */
- Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
-
- /* Process Console Report Data */
- //ProcessConsoleHIDReport(ConsoleData);
- }
-
- /* Finalize the stream transfer to send the last packet */
- Endpoint_ClearOUT();
- }
-
- /* IN packet */
- Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
- // send IN packet
- if (Endpoint_IsINReady())
- Endpoint_ClearIN();
+ /* Device must be connected and configured for the task to run */
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return;
+
+ uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+#if 0
+ // TODO: impl receivechar()/recvchar()
+ Endpoint_SelectEndpoint(CONSOLE_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 ConsoleData[CONSOLE_EPSIZE];
+
+ /* Read Console Report Data */
+ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
+
+ /* Process Console Report Data */
+ //ProcessConsoleHIDReport(ConsoleData);
+ }
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearOUT();
+ }
+#endif
+
+ /* IN packet */
+ Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
+ // flash senchar packet
+ if (Endpoint_IsINReady()) {
+ Endpoint_ClearIN();
+ }
+
+ Endpoint_SelectEndpoint(ep);
}
@@ -157,6 +168,16 @@ void EVENT_USB_Device_Disconnect(void)
{
}
+#define CONSOLE_TASK_INTERVAL 50
+void EVENT_USB_Device_StartOfFrame(void)
+{
+ static uint8_t interval;
+ if (++interval == CONSOLE_TASK_INTERVAL) {
+ Console_Task();
+ interval = 0;
+ }
+}
+
/** Event handler for the USB_ConfigurationChanged event.
* This is fired when the host sets the current configuration of the USB device after enumeration.
*/
@@ -182,7 +203,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
/* Setup Console HID Report Endpoints */
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+ CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE);
ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
}
@@ -374,6 +395,7 @@ static void send_consumer(uint16_t data)
/*******************************************************************************
* sendchar
******************************************************************************/
+#define SEND_TIMEOUT 10
int8_t sendchar(uint8_t c)
{
if (USB_DeviceState != DEVICE_STATE_Configured)
@@ -381,9 +403,9 @@ int8_t sendchar(uint8_t c)
Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
- uint8_t timeout = 10;
+ uint8_t timeout = SEND_TIMEOUT;
uint16_t prevFN = USB_Device_GetFrameNumber();
- while (!Endpoint_IsINReady()) {
+ while (!Endpoint_IsReadWriteAllowed()) {
switch (USB_DeviceState) {
case DEVICE_STATE_Unattached:
case DEVICE_STATE_Suspended:
@@ -400,7 +422,7 @@ int8_t sendchar(uint8_t c)
Endpoint_Write_8(c);
- // send when packet is full
+ // send when bank is full
if (!Endpoint_IsReadWriteAllowed())
Endpoint_ClearIN();