]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
confirm SetReport LED.
authortmk <nobody@nowhere>
Fri, 29 Jun 2012 07:48:36 +0000 (16:48 +0900)
committertmk <nobody@nowhere>
Fri, 29 Jun 2012 07:48:36 +0000 (16:48 +0900)
common/command.c
common/host.c
keyboard/macway/keymap.c
protocol/lufa/descriptor.h
protocol/lufa/lufa.c
protocol/lufa/lufa.h

index e325a5d847e144c3ba1c6d384f1b17fbb04ac2b6..13d37242d93c60d0440c5a76212991bdcff4980b 100644 (file)
@@ -138,6 +138,7 @@ static uint8_t command_common(void)
             }
             break;
         case KB_S:
+            print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n");
 #ifdef HOST_PJRC
             print("UDCON: "); phex(UDCON); print("\n");
             print("UDIEN: "); phex(UDIEN); print("\n");
index cc26d55c22b94b9d85f06503fad3160ccadafaf7..8dd2abbee8d86048ff21ad9c9cd4c0b42054695e 100644 (file)
@@ -168,13 +168,16 @@ void host_mouse_send(report_mouse_t *report)
 
 void host_system_send(uint16_t data)
 {
+    static uint16_t last_data = 0;
+    if (data == last_data) return;
+    last_data = data;
+
     if (!driver) return;
     (*driver->send_system)(data);
 }
 
 void host_consumer_send(uint16_t data)
 {
-    // TODO: this is needed?
     static uint16_t last_data = 0;
     if (data == last_data) return;
     last_data = data;
index 5ecea2569f1c8f9d8f3d15e3405cbc51642ae06c..76c0d8b724fbd8351bcd2f8092ac1a81b51b01cd 100644 (file)
@@ -111,7 +111,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * `-----------------------------------------------------------'
      */ 
     KEYMAP(PWR, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, DEL, \
-           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NO,  \
+           CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  NLCK,\
            LCTL,VOLD,VOLU,MUTE,NO,  NO,  PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
            LSFT,NO,  NO,  NO,  NO,  NO,  PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
            NO,  LGUI,LALT,SPC, RALT,NO,  NO,  NO,  RCTL),
index 19bce999f225964c9142850a17df37b7712c01b6..001e072e6ab50f7c59e06e54ff398ba4027690c1 100644 (file)
@@ -1,3 +1,10 @@
+/* 
+ * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * This file is based on:
+ *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
+ */
+
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2012.
index f485e24bf0228586b4dd82d0d18f0520ac042168..8fa719bc95a466f8d1530181cb325e23da30817a 100644 (file)
 #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();
     }
index efb8c383781845a56afbd3d6056347a0f71fa0a1..71c279b0dcb27570e810a3e91dd1c2ae31dea504 100644 (file)
@@ -1,3 +1,10 @@
+/* 
+ * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * This file is based on:
+ *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
+ */
+
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2012.
@@ -32,7 +39,6 @@
 #ifndef _LUFA_H_
 #define _LUFA_H_
 
-       /* Includes: */
 #include <avr/io.h>
 #include <avr/wdt.h>
 #include <avr/power.h>
 #include <LUFA/Version.h>
 #include <LUFA/Drivers/USB/USB.h>
 
+
+/* extra report structure */
+typedef struct {
+    uint8_t  report_id;
+    uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
 #endif