]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge branch 'lufa'
authortmk <nobody@nowhere>
Sat, 30 Jun 2012 05:56:24 +0000 (14:56 +0900)
committertmk <nobody@nowhere>
Sat, 30 Jun 2012 05:56:24 +0000 (14:56 +0900)
43 files changed:
common.mk
common/bootloader.c
common/command.c
common/host.c
common/keyboard.c
common/mousekey.c
common/report.h
converter/adb_usb/Makefile
converter/m0110_usb/Makefile
converter/news_usb/Makefile.pjrc
converter/ps2_usb/Makefile
converter/ps2_usb/Makefile.pjrc_usart
converter/ps2_usb/Makefile.vusb
converter/terminal_usb/Makefile.102_pjrc
converter/terminal_usb/Makefile.122_pjrc
converter/x68k_usb/Makefile
keyboard/hbkb/Makefile [changed from file to symlink]
keyboard/hbkb/Makefile.lufa [new file with mode: 0644]
keyboard/hbkb/Makefile.pjrc [new file with mode: 0644]
keyboard/hbkb/config.h
keyboard/hhkb/Makefile.lufa [new file with mode: 0644]
keyboard/hhkb/Makefile.pjrc
keyboard/hhkb/config.h [new file with mode: 0644]
keyboard/hhkb/config_pjrc.h [deleted file]
keyboard/hhkb/keymap.c
keyboard/hhkb/matrix.c
keyboard/macway/Makefile [deleted file]
keyboard/macway/Makefile.lufa [new file with mode: 0644]
keyboard/macway/Makefile.pjrc [new file with mode: 0644]
keyboard/macway/config.h
keyboard/macway/keymap.c
protocol/lufa.mk [new file with mode: 0644]
protocol/lufa/descriptor.c [new file with mode: 0644]
protocol/lufa/descriptor.h [new file with mode: 0644]
protocol/lufa/lufa.c [new file with mode: 0644]
protocol/lufa/lufa.h [new file with mode: 0644]
protocol/pjrc.mk
protocol/pjrc/bootloader_teensy.c [deleted file]
protocol/vusb.mk
protocol/vusb/bootloader_usbasp.c [deleted file]
protocol/vusb/main.c
protocol/vusb/vusb.c
rules.mk

index d0e04df862fdc13c0e3b05dd4d844948d273d056..9bf34f2b8e4b2560fe966c1863c10097bc870b16 100644 (file)
--- a/common.mk
+++ b/common.mk
@@ -1,22 +1,23 @@
-SRC += host.c \
-       keyboard.c \
-       command.c \
-       layer.c \
-       timer.c \
-       print.c \
-       bootloader.c \
-       util.c
+COMMON_DIR = common
+SRC += $(COMMON_DIR)/host.c \
+       $(COMMON_DIR)/keyboard.c \
+       $(COMMON_DIR)/command.c \
+       $(COMMON_DIR)/layer.c \
+       $(COMMON_DIR)/timer.c \
+       $(COMMON_DIR)/print.c \
+       $(COMMON_DIR)/bootloader.c \
+       $(COMMON_DIR)/util.c
 
 
 # Option modules
 ifdef MOUSEKEY_ENABLE
-    SRC += mousekey.c
+    SRC += $(COMMON_DIR)/mousekey.c
     OPT_DEFS += -DMOUSEKEY_ENABLE
 endif
 
 ifdef PS2_MOUSE_ENABLE
-    SRC += ps2.c \
-          ps2_mouse.c
+    SRC += $(COMMON_DIR)/ps2.c \
+           $(COMMON_DIR)/ps2_mouse.c
     OPT_DEFS += -DPS2_MOUSE_ENABLE
 endif
 
index 5cbfc72e5b9bce076ca5ed91523247934a6eb3aa..612b949648a1d583b8207df73558f88d22954f4f 100644 (file)
@@ -1,22 +1,87 @@
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "bootloader.h"
 
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
+/* Start Bootloader from Application
+ * See 
+ * http://www.pjrc.com/teensy/jump_to_bootloader.html
+ * http://www.fourwalledcubicle.com/files/LUFA/Doc/120219/html/_page__software_bootloader_start.html
+ */
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+// TODO: support usbasp
+/* Boot Section Size in bytes
+ * Teensy halfKay   512
+ * Atmel DFU loader 4096
+ * LUFA bootloader  4096
+ */
+#ifndef BOOT_SIZE
+#define BOOT_SIZE 512
+#endif
 
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
+#define FLASH_SIZE          (FLASHEND + 1)
+#define BOOTLOADER_START    (FLASHEND - BOOT_SIZE)
 
-#include "bootloader.h"
+void bootloader_jump(void) {
+    cli();
+
+    //
+    //Teensy
+    //
+#if defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
+    // disable watchdog, if enabled
+    // disable all peripherals
+    UDCON = 1;
+    USBCON = (1<<FRZCLK);  // disable USB
+    UCSR1B = 0;
+    _delay_ms(5);
+#else
+    // This makes custom USBasploader come up.
+    MCUSR = 0;
+#endif
+
+#if defined(__AVR_AT90USB162__)
+    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0;
+    TIMSK0 = 0; TIMSK1 = 0; UCSR1B = 0;
+    DDRB = 0; DDRC = 0; DDRD = 0;
+    PORTB = 0; PORTC = 0; PORTD = 0;
+#elif defined(__AVR_ATmega32U4__)
+    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
+    TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0; UCSR1B = 0; TWCR = 0;
+    DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; TWCR = 0;
+    PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
+#elif defined(__AVR_AT90USB646__)
+    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
+    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0;
+    DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
+    PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
+#elif defined(__AVR_AT90USB1286__)
+    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
+    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0;
+    DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
+    PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
+#endif
+
+
+    //
+    //USBasp
+    //
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P)
+    // This makes custom USBasploader come up.
+    MCUSR = 0;
+
+    // initialize ports
+    PORTB = 0; PORTC= 0; PORTD = 0;
+    DDRB = 0; DDRC= 0; DDRD = 0;
+
+    // disable interrupts
+    EIMSK = 0; EECR = 0; SPCR = 0;
+    ACSR = 0; SPMCSR = 0; WDTCSR = 0; PCICR = 0;
+    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0;
+    ADCSRA = 0; TWCR = 0; UCSR0B = 0;
+#endif
 
 
-void bootloader_jump(void) __attribute__ ((weak));
-void bootloader_jump(void) {}
+    // start Bootloader
+    ((void (*)(void))BOOTLOADER_START)();
+}
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 5c2643c951e53ee3a5869b50d792b8878091fc5f..25f32eb02f52a615adf4c44e016afb03a488ff4f 100644 (file)
@@ -49,6 +49,7 @@ void keyboard_proc(void)
     uint8_t fn_bits = 0;
 #ifdef EXTRAKEY_ENABLE
     uint16_t consumer_code = 0;
+    uint16_t system_code = 0;
 #endif
 
     matrix_scan();
@@ -89,22 +90,13 @@ void keyboard_proc(void)
 #ifdef HOST_PJRC
                 if (suspend && remote_wakeup) {
                     usb_remote_wakeup();
-                } else {
-                    host_system_send(SYSTEM_POWER_DOWN);
                 }
-#else
-                host_system_send(SYSTEM_POWER_DOWN);
 #endif
-                host_system_send(0);
-                _delay_ms(500);
+                system_code = SYSTEM_POWER_DOWN;
             } else if (code == KB_SYSTEM_SLEEP) {
-                host_system_send(SYSTEM_SLEEP);
-                host_system_send(0);
-                _delay_ms(500);
+                system_code = SYSTEM_SLEEP;
             } else if (code == KB_SYSTEM_WAKE) {
-                host_system_send(SYSTEM_WAKE_UP);
-                host_system_send(0);
-                _delay_ms(500);
+                system_code = SYSTEM_WAKE_UP;
             }
             // Consumer Page
             else if (code == KB_AUDIO_MUTE) {
@@ -173,6 +165,7 @@ void keyboard_proc(void)
         host_send_keyboard_report();
 #ifdef EXTRAKEY_ENABLE
         host_consumer_send(consumer_code);
+        host_system_send(system_code);
 #endif
 #ifdef DEBUG_LED
         // LED flash for debug
index 76bd0fd3630fcaa8d3744d3b88e60823e3605a01..1d35355b496fe919b65a9a3f49e97bceba65694f 100644 (file)
@@ -121,12 +121,12 @@ void mousekey_clear_report(void)
 static void mousekey_debug(void)
 {
     if (!debug_mouse) return;
-    print("mousekey[btn|x y v h]: ");
+    print("mousekey [btn|x y v h]rep: [");
     phex(report.buttons); print("|");
     phex(report.x); print(" ");
     phex(report.y); print(" ");
     phex(report.v); print(" ");
-    phex(report.h);
+    phex(report.h); print("]");
     phex(mousekey_repeat);
     print("\n");
 }
index b85b86c5f85dae6ca51024dce9751f5beb0f396c..45f5c0b8814eb81375ea029528b992fd0920d61a 100644 (file)
@@ -82,15 +82,14 @@ typedef struct {
     uint8_t mods;
     uint8_t rserved;
     uint8_t keys[REPORT_KEYS];
-} report_keyboard_t;
+} __attribute__ ((packed)) report_keyboard_t;
 
 typedef struct {
-    uint8_t report_id;
     uint8_t buttons;
     int8_t x;
     int8_t y;
     int8_t v;
     int8_t h;
-} report_mouse_t;
+} __attribute__ ((packed)) report_mouse_t;
 
 #endif
index 248261df0b4e480cb54c9b504ddaf79ecd5a8ac7..e9a90695b106860fe674aa125bedcbc85e47cdbf 100644 (file)
@@ -8,8 +8,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        adb.c
@@ -42,16 +41,11 @@ EXTRAKEY_ENABLE = yes       # Audio control and System control
 #NKRO_ENABLE = yes     # USB Nkey Rollover
 
 
-
-#---------------- Programming Options --------------------------
-PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-
-
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
 include $(TOP_DIR)/common.mk
 include $(TOP_DIR)/rules.mk
-
-dfu: PROGRAM_CMD = dfu-programmer atmega32u4 flash $(TARGET).hex
-dfu: program
index 4a687b93334e378c951e2eb3c001bf0d5de3027f..1fee258a6fbc12eb02e0b81520e9784728d6b6ff 100644 (file)
@@ -8,8 +8,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        m0110.c
@@ -47,6 +46,10 @@ EXTRAKEY_ENABLE = yes        # Audio control and System control
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index 376133ad5e32d7756c3dff3ca763f3715338b1f7..3233463d58422e74e5c19464ae79b55840639a51 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        news.c
@@ -51,6 +50,10 @@ NKRO_ENABLE = yes    # USB Nkey Rollover
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index 0bba191a38256fb417554430dc768d8be339b286..1278a74be700e56eb416f04f6be62f6749cf2891 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        ps2.c
@@ -51,6 +50,10 @@ NKRO_ENABLE = yes    # USB Nkey Rollover
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index 3dad7e2f8cc25d15de9d6a165c182ca37ce063bc..dd74712e4804bfeaf66ef4f20b7b8255db04b294 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =   keymap.c \
        matrix.c \
        led.c \
        ps2_usart.c
@@ -51,6 +50,10 @@ NKRO_ENABLE = yes    # USB Nkey Rollover
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index 4d5240c30948f44b20484d3b126945b1b85b0994..b08d30d574adfcdd965666719a32c3cb3bd56b77 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        ps2_usart.c
@@ -85,6 +84,18 @@ AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
 PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
 
 
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBasp           2048
+OPT_DEFS += -DBOOT_SIZE=2048
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/vusb.mk
 include $(TOP_DIR)/protocol.mk
index e9d14e7a05b243fb6b6b4922b49fcc96a0fa9c5f..e2d1a00a5bbb2727679a51dd24e13753370328dd 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap_102.c \
+SRC =  keymap_102.c \
        matrix.c \
        led.c \
        ps2.c
@@ -51,6 +50,10 @@ NKRO_ENABLE = yes    # USB Nkey Rollover
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index bec00510e58ccf220c4485cf2fdd0a67b0d7daf4..ee42dd7436ce6d37255b48ed5798967b4119c5c5 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap_122.c \
+SRC =  keymap_122.c \
        matrix.c \
        led.c \
        ps2.c
@@ -51,6 +50,10 @@ F_CPU = 16000000
 PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
index c3b5fa29f322c9f5526989cbcc6d122c8e328e5b..62b976c56f639812144866c7bea4a5745c60fdd4 100644 (file)
@@ -13,8 +13,7 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =  keymap.c \
        matrix.c \
        led.c \
        x68k.c
@@ -80,6 +79,10 @@ AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
 PROGRAM_CMD = dfu-programmer atmega32u4 flash $(TARGET).hex
 
 
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
 
 include $(TOP_DIR)/protocol/pjrc.mk
 include $(TOP_DIR)/protocol.mk
deleted file mode 100644 (file)
index 26be322e0155e9facd36c4b9086cf4694788c225..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,56 +0,0 @@
-# Target file name (without extension).
-TARGET = hbk
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# keyboard dependent files
-SRC =  main.c \
-       keymap.c \
-       matrix.c \
-       led.c
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-#MCU = at90usb162       # Teensy 1.0
-MCU = atmega32u4       # Teensy 2.0
-#MCU = at90usb646       # Teensy++ 1.0
-#MCU = at90usb1286      # Teensy++ 2.0
-
-
-# Processor frequency.
-#   Normally the first thing your program should do is set the clock prescaler,
-#   so your program will run at the correct speed.  You should also set this
-#   variable to same clock speed.  The _delay_ms() macro uses this, and many
-#   examples use this variable to calculate timings.  Do not add a "UL" here.
-F_CPU = 16000000
-
-
-# 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
-
-
-
-#---------------- Programming Options --------------------------
-#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-PROGRAM_CMD = /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) erase && \
-             /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) flash $(TARGET).hex && \
-             /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) start
-
-
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/protocol.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..f00d036da3b3c37005cae5cfaa8489be117b92e7
--- /dev/null
@@ -0,0 +1 @@
+Makefile.lufa
\ No newline at end of file
diff --git a/keyboard/hbkb/Makefile.lufa b/keyboard/hbkb/Makefile.lufa
new file mode 100644 (file)
index 0000000..c73a0ca
--- /dev/null
@@ -0,0 +1,119 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = hbkb_lufa
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC += keymap.c \
+       matrix.c \
+       led.c
+
+CONFIG_H = config.h
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+
+# Build Options
+#   comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes  # Mouse keys
+EXTRAKEY_ENABLE = yes  # Audio control and System control
+#NKRO_ENABLE = yes     # USB Nkey Rollover
+#PS2_MOUSE_ENABLE = yes        # PS/2 mouse(TrackPoint) support
+
+
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOT_SIZE=4096
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
diff --git a/keyboard/hbkb/Makefile.pjrc b/keyboard/hbkb/Makefile.pjrc
new file mode 100644 (file)
index 0000000..159f56b
--- /dev/null
@@ -0,0 +1,56 @@
+# Target file name (without extension).
+TARGET = hbkb
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC =  main.c \
+       keymap.c \
+       matrix.c \
+       led.c
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+#MCU = at90usb162       # Teensy 1.0
+MCU = atmega32u4       # Teensy 2.0
+#MCU = at90usb646       # Teensy++ 1.0
+#MCU = at90usb1286      # Teensy++ 2.0
+
+
+# Processor frequency.
+#   Normally the first thing your program should do is set the clock prescaler,
+#   so your program will run at the correct speed.  You should also set this
+#   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#   examples use this variable to calculate timings.  Do not add a "UL" here.
+F_CPU = 16000000
+
+
+# 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
+
+
+
+#---------------- Programming Options --------------------------
+#PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+PROGRAM_CMD = /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) erase && \
+             /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) flash $(TARGET).hex && \
+             /opt/dfu-programmer-0.5.2/bin/dfu-programmer $(MCU) start
+
+
+
+include $(TOP_DIR)/protocol/pjrc.mk
+include $(TOP_DIR)/protocol.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
index 5262399dc318357ae0e2bea69b72b9d4dfea3e5f..deaabb249508e769825dd2c6b780c2d63f063cb4 100644 (file)
@@ -24,7 +24,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0xBB00
 #define MANUFACTURER    t.m.k.
+#define DEVICE_VER      0x0100
 #define PRODUCT         Happy Buckling Keyboard
+
+
 #define DESCRIPTION     mod version of IBM Model M keyboard
 
 
diff --git a/keyboard/hhkb/Makefile.lufa b/keyboard/hhkb/Makefile.lufa
new file mode 100644 (file)
index 0000000..cdd68f4
--- /dev/null
@@ -0,0 +1,119 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = hhkb_lufa
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC += keymap.c \
+       matrix.c \
+       led.c
+
+CONFIG_H = config.h
+
+
+# MCU name
+MCU = at90usb1286
+#MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+
+# Build Options
+#   comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes  # Mouse keys
+EXTRAKEY_ENABLE = yes  # Audio control and System control
+#NKRO_ENABLE = yes     # USB Nkey Rollover
+#PS2_MOUSE_ENABLE = yes        # PS/2 mouse(TrackPoint) support
+
+
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#OPT_DEFS += -DBOOT_SIZE=4096
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
index f6d133eae4c5402ee67137ce1f9537ab89c1b67a..f8836a2ca1191e4ba0f8e7e87cc7470770986203 100644 (file)
@@ -13,12 +13,11 @@ TOP_DIR = ../..
 TARGET_DIR = .
 
 # keyboard dependent files
-SRC =  main.c \
-       keymap.c \
+SRC =   keymap.c \
        matrix.c \
        led.c
 
-CONFIG_H = config_pjrc.h
+CONFIG_H = config.h
 
 
 # MCU name, you MUST set this to match the board you are using
@@ -53,8 +52,8 @@ PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
 
 # Search Path
 VPATH = $(TARGET_DIR)
+VPATH = $(TOP_DIR)
 
 include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/protocol.mk
 include $(TOP_DIR)/common.mk
 include $(TOP_DIR)/rules.mk
diff --git a/keyboard/hhkb/config.h b/keyboard/hhkb/config.h
new file mode 100644 (file)
index 0000000..9144646
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* controller configuration */
+#include "controller_teensy.h"
+
+
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0xCAFF
+#define DEVICE_VER      0x0101
+#define MANUFACTURER    t.m.k.
+#define PRODUCT         HHKB mod
+
+
+#define DESCRIPTION     t.m.k. keyboard firmware for HHKB mod
+
+
+/* matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 8
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+
+/* key combination for command */
+#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) 
+
+/* mouse keys */
+#ifdef MOUSEKEY_ENABLE
+#   define MOUSEKEY_DELAY_TIME 192
+#endif
+
+
+/* PS/2 mouse */
+#ifdef PS2_MOUSE_ENABLE
+/*
+#   define PS2_CLOCK_PORT  PORTF
+#   define PS2_CLOCK_PIN   PINF
+#   define PS2_CLOCK_DDR   DDRF
+#   define PS2_CLOCK_BIT   0
+#   define PS2_DATA_PORT   PORTF
+#   define PS2_DATA_PIN    PINF
+#   define PS2_DATA_DDR    DDRF
+#   define PS2_DATA_BIT    1
+*/
+#endif
+
+#endif
diff --git a/keyboard/hhkb/config_pjrc.h b/keyboard/hhkb/config_pjrc.h
deleted file mode 100644 (file)
index fffe352..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-/* controller configuration */
-#include "controller_teensy.h"
-
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0xCAFE
-#define DEVICE_VER      0x0101
-#define MANUFACTURER    t.m.k.
-#define PRODUCT         HHKB mod
-#define DESCRIPTION     t.m.k. keyboard firmware for HHKB mod
-
-
-/* matrix size */
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 8
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-
-/* key combination for command */
-#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) 
-
-/* mouse keys */
-#ifdef MOUSEKEY_ENABLE
-#   define MOUSEKEY_DELAY_TIME 192
-#endif
-
-
-/* PS/2 mouse */
-#ifdef PS2_MOUSE_ENABLE
-/*
-#   define PS2_CLOCK_PORT  PORTF
-#   define PS2_CLOCK_PIN   PINF
-#   define PS2_CLOCK_DDR   DDRF
-#   define PS2_CLOCK_BIT   0
-#   define PS2_DATA_PORT   PORTF
-#   define PS2_DATA_PIN    PINF
-#   define PS2_DATA_DDR    DDRF
-#   define PS2_DATA_BIT    1
-*/
-#endif
-
-#endif
index 85a7c31b7ef94862abd9bd542219a8de6a28aab1..88a6737ba24cc65aa26d20aaa181a3252e564166 100644 (file)
@@ -110,7 +110,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      *      |Gui |Alt  |Space                  |Alt  |xxx|
      *      `--------------------------------------------'
      */ 
-    KEYMAP(ESC, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL, \
+    KEYMAP(PWR, F1,  F2,  F3,  F4,  F5,  F6,  F7,  F8,  F9,  F10, F11, F12, INS, DEL, \
            CAPS,NO,  NO,  NO,  NO,  NO,  NO,  NO,  PSCR,SLCK,BRK, UP,  NO,  BSPC, \
            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, \
index 350066b9040ece0a3f89c678f3d15f50575d0b04..79d2d9873157a9db7b304b95114f493bc59846cc 100644 (file)
@@ -68,8 +68,8 @@ static bool matrix_has_ghost_in_row(uint8_t row);
 // key:     on: 0/off: 1
 // prev:    unknown: output previous key state(negated)?
 
-#ifdef HOST_PJRC
-// Ports for Teensy
+#if defined(__AVR_AT90USB1286__)
+// Ports for Teensy++
 // row:     PB0-2
 // col:     PB3-5,6
 // key:     PE6(pull-uped)
@@ -90,7 +90,8 @@ static bool matrix_has_ghost_in_row(uint8_t row);
 #define KEY_PREV_OFF()          (PORTE &= ~(1<<7))
 #define KEY_POWER_ON()
 #define KEY_POWER_OFF()
-#else
+
+#elif defined(__AVR_ATmega328P__)
 // Ports for V-USB
 // key:     PB0(pull-uped)
 // prev:    PB1
@@ -126,6 +127,9 @@ static bool matrix_has_ghost_in_row(uint8_t row);
     DDRC  &= ~0x0F;                     \
     PORTC &= ~0x0F;                     \
 } while (0)
+
+#else
+#   error "define code for matrix scan"
 #endif
 
 
diff --git a/keyboard/macway/Makefile b/keyboard/macway/Makefile
deleted file mode 100644 (file)
index afee38b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-# Target file name (without extension).
-TARGET = macway
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# keyboard dependent files
-SRC =  main.c \
-       keymap.c \
-       matrix.c \
-       led.c
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-#MCU = at90usb162       # Teensy 1.0
-MCU = atmega32u4       # Teensy 2.0
-#MCU = at90usb646       # Teensy++ 1.0
-#MCU = at90usb1286      # Teensy++ 2.0
-
-
-# Processor frequency.
-#   Normally the first thing your program should do is set the clock prescaler,
-#   so your program will run at the correct speed.  You should also set this
-#   variable to same clock speed.  The _delay_ms() macro uses this, and many
-#   examples use this variable to calculate timings.  Do not add a "UL" here.
-F_CPU = 16000000
-
-
-# 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
-
-
-
-#---------------- Programming Options --------------------------
-PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-
-
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/protocol.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
diff --git a/keyboard/macway/Makefile.lufa b/keyboard/macway/Makefile.lufa
new file mode 100644 (file)
index 0000000..9c9388e
--- /dev/null
@@ -0,0 +1,119 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = macway_lufa
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC += keymap.c \
+       matrix.c \
+       led.c
+
+CONFIG_H = config.h
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+
+# Build Options
+#   comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes  # Mouse keys
+EXTRAKEY_ENABLE = yes  # Audio control and System control
+#NKRO_ENABLE = yes     # USB Nkey Rollover
+#PS2_MOUSE_ENABLE = yes        # PS/2 mouse(TrackPoint) support
+
+
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#OPT_DEFS += -DBOOT_SIZE=4096
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
diff --git a/keyboard/macway/Makefile.pjrc b/keyboard/macway/Makefile.pjrc
new file mode 100644 (file)
index 0000000..ecc236e
--- /dev/null
@@ -0,0 +1,95 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = macway_pjrc
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC =  keymap.c \
+       matrix.c \
+       led.c
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+#MCU = at90usb162       # Teensy 1.0
+MCU = atmega32u4       # Teensy 2.0
+#MCU = at90usb646       # Teensy++ 1.0
+#MCU = at90usb1286      # Teensy++ 2.0
+
+
+# Processor frequency.
+#   Normally the first thing your program should do is set the clock prescaler,
+#   so your program will run at the correct speed.  You should also set this
+#   variable to same clock speed.  The _delay_ms() macro uses this, and many
+#   examples use this variable to calculate timings.  Do not add a "UL" here.
+F_CPU = 16000000
+
+
+# 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
+
+
+
+#---------------- Programming Options --------------------------
+PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/pjrc.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
index b68ea20dcf2ecbbd285148c5671386b14ad1af4e..5503c77e3ad2a6a773a9e8c392ff914e65e72fe1 100644 (file)
@@ -21,10 +21,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* controller configuration */
 #include "controller_teensy.h"
 
+
+/* USB Device descriptor parameter */
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0xBEE0
+#define DEVICE_VER      0x0202
 #define MANUFACTURER    t.m.k.
 #define PRODUCT         Macway mod
+
+
+/* message strings */
 #define DESCRIPTION     t.m.k. keyboard firmware for Macway mod
 
 
index 89634e2f4122699c621435fabe2391abf1ef4396..76c0d8b724fbd8351bcd2f8092ac1a81b51b01cd 100644 (file)
@@ -59,7 +59,7 @@ static const uint8_t PROGMEM fn_layer[] = {
     3,              // Fn3
     4,              // Fn4
     0,              // Fn5
-    2,              // Fn6
+    3,              // Fn6
     3               // Fn7
 };
 
@@ -94,7 +94,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
            TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSLS, \
            LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN3, QUOT,ENT, \
            LSFT,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2, RSFT,FN1, \
-           FN7, LGUI,LALT,FN4, RALT,BSLS,GRV, FN6, RCTL),
+           FN7, LGUI,LALT,FN4, RALT,GRV, FN6, FN6, RCTL),
 
 
     /* Layer 1: HHKB mode (HHKB Fn)
@@ -110,8 +110,8 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * |   |Gui |Alt  |                      |Alt  |Gui|   |   |Ctr|
      * `-----------------------------------------------------------'
      */ 
-    KEYMAP(ESC, 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,  \
+    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,  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),
@@ -155,7 +155,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
            BSLS,WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO,  NO,  NO,  NO,  \
            LCTL,NO,  MS_L,MS_D,MS_R,NO,  MS_L,MS_D,MS_U,MS_R,FN3, NO,  BSLS, \
            LSFT,NO,  NO,  BTN1,BTN2,BTN3,BTN2,BTN1,NO,  NO,  NO,  RSFT,NO, \
-           FN7, LGUI,LALT,BTN1,RALT,NO,  NO,  NO,  NO),
+           FN7, LGUI,LALT,BTN1,RALT,NO,  FN6, FN6, NO),
 
 
     /* Layer 4: Matias half keyboard style (Space)
diff --git a/protocol/lufa.mk b/protocol/lufa.mk
new file mode 100644 (file)
index 0000000..ad6cab6
--- /dev/null
@@ -0,0 +1,34 @@
+LUFA_DIR = protocol/lufa
+
+# Path to the LUFA library
+LUFA_PATH = $(TOP_DIR)/protocol/lufa/LUFA-120219
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+LUFA_SRC = $(LUFA_DIR)/lufa.c \
+          $(LUFA_DIR)/descriptor.c \
+          $(LUFA_SRC_USB)
+SRC += $(subst $(LUFA_PATH)/,,$(LUFA_SRC))
+
+# Search Path
+VPATH += $(LUFA_PATH)
+
+# Option modules
+#ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
+#endif
+
+#ifdef EXTRAKEY_ENABLE
+#endif
+
+# LUFA library compile-time options and predefined tokens
+LUFA_OPTS  = -D USB_DEVICE_ONLY
+LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
+LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
+LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+
+OPT_DEFS += -DF_USB=$(F_USB)UL
+OPT_DEFS += -DARCH=ARCH_$(ARCH)
+OPT_DEFS += $(LUFA_OPTS)
+OPT_DEFS += -DHOST_LUFA
diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c
new file mode 100644 (file)
index 0000000..d3f740b
--- /dev/null
@@ -0,0 +1,558 @@
+/* 
+ * 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.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "util.h"
+#include "report.h"
+#include "descriptor.h"
+
+
+/*******************************************************************************
+ * HID Report Descriptors
+ ******************************************************************************/
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x06), /* Keyboard */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
+        HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
+        HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+        HID_RI_REPORT_COUNT(8, 0x08),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_REPORT_COUNT(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_CONSTANT),
+        HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
+        HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
+        HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
+        HID_RI_REPORT_COUNT(8, 0x05),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+        HID_RI_REPORT_COUNT(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x03),
+        HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
+        HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
+        HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
+        HID_RI_USAGE_MAXIMUM(8, 0xFF), /* Keyboard Application */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+        HID_RI_REPORT_COUNT(8, 0x06),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x02), /* Mouse */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x01), /* Pointer */
+        HID_RI_COLLECTION(8, 0x00), /* Physical */
+
+            HID_RI_USAGE_PAGE(8, 0x09), /* Button */
+            HID_RI_USAGE_MINIMUM(8, 0x01),  /* Button 1 */
+            HID_RI_USAGE_MAXIMUM(8, 0x05),  /* Button 5 */
+            HID_RI_LOGICAL_MINIMUM(8, 0x00),
+            HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+            HID_RI_REPORT_COUNT(8, 0x05),
+            HID_RI_REPORT_SIZE(8, 0x01),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x03),
+            HID_RI_INPUT(8, HID_IOF_CONSTANT),
+
+            HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+            HID_RI_USAGE(8, 0x30), /* Usage X */
+            HID_RI_USAGE(8, 0x31), /* Usage Y */
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
+            HID_RI_REPORT_COUNT(8, 0x02),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+            HID_RI_USAGE(8, 0x38), /* Wheel */
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+            HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+            HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
+            HID_RI_LOGICAL_MINIMUM(8, -127),
+            HID_RI_LOGICAL_MAXIMUM(8, 127),
+            HID_RI_REPORT_COUNT(8, 0x01),
+            HID_RI_REPORT_SIZE(8, 0x08),
+            HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+        HID_RI_END_COLLECTION(0),
+    HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
+{
+    HID_RI_USAGE_PAGE(16, 0xFF31), /* Vendor Page(PJRC Teensy compatible) */
+    HID_RI_USAGE(8, 0x74), /* Vendor Usage(PJRC Teensy compatible) */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x75), /* Vendor Usage 0x75 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_USAGE(8, 0x76), /* Vendor Usage 0x76 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+        HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+    HID_RI_END_COLLECTION(0),
+};
+
+#ifdef EXTRAKEY_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x80), /* System Control */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
+        HID_RI_LOGICAL_MINIMUM(16, 0x0081),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
+        HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
+        HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
+        HID_RI_REPORT_SIZE(8, 16),
+        HID_RI_REPORT_COUNT(8, 1),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+
+    HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+    HID_RI_USAGE(8, 0x01), /* Consumer Control */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
+        HID_RI_LOGICAL_MINIMUM(16, 0x0010),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
+        HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */
+        HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
+        HID_RI_REPORT_SIZE(8, 16),
+        HID_RI_REPORT_COUNT(8, 1),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
+};
+#endif
+
+#ifdef NKRO_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] =
+{
+    HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+    HID_RI_USAGE(8, 0x06), /* Keyboard */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
+        HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
+        HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+        HID_RI_REPORT_COUNT(8, 0x08),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+
+        HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
+        HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
+        HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
+        HID_RI_REPORT_COUNT(8, 0x05),
+        HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+        HID_RI_REPORT_COUNT(8, 0x01),
+        HID_RI_REPORT_SIZE(8, 0x03),
+        HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
+
+        HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
+        HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */
+        HID_RI_USAGE_MAXIMUM(8, NKRO_SIZE*8-1), /* Keyboard Right GUI */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+        HID_RI_REPORT_COUNT(8, NKRO_SIZE*8),
+        HID_RI_REPORT_SIZE(8, 0x01),
+};
+#endif
+
+/*******************************************************************************
+ * Device Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
+{
+    .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
+
+    .USBSpecification       = VERSION_BCD(01.10),
+    .Class                  = USB_CSCP_NoDeviceClass,
+    .SubClass               = USB_CSCP_NoDeviceSubclass,
+    .Protocol               = USB_CSCP_NoDeviceProtocol,
+
+    .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
+
+    .VendorID               = VENDOR_ID,
+    .ProductID              = PRODUCT_ID,
+    .ReleaseNumber          = DEVICE_VER,
+
+    .ManufacturerStrIndex   = 0x01,
+    .ProductStrIndex        = 0x02,
+    .SerialNumStrIndex      = NO_DESCRIPTOR,
+
+    .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
+};
+
+/*******************************************************************************
+ * Configuration Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
+{
+    .Config =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
+
+            .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
+            .TotalInterfaces        = TOTAL_INTERFACES,
+
+            .ConfigurationNumber    = 1,
+            .ConfigurationStrIndex  = NO_DESCRIPTOR,
+
+            .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
+
+            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
+        },
+
+    /*
+     * Keyboard
+     */
+    .Keyboard_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = KEYBOARD_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_BootSubclass,
+            .Protocol               = HID_CSCP_KeyboardBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .Keyboard_HID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(KeyboardReport)
+        },
+
+    .Keyboard_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = KEYBOARD_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    /*
+     * Mouse
+     */
+#ifdef MOUSE_ENABLE
+    .Mouse_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = MOUSE_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_BootSubclass,
+            .Protocol               = HID_CSCP_MouseBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .Mouse_HID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(MouseReport)
+        },
+
+    .Mouse_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = MOUSE_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+#endif
+
+    /*
+     * Console
+     */
+    .Console_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = CONSOLE_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 2,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_NonBootSubclass,
+            .Protocol               = HID_CSCP_NonBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .Console_HID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(ConsoleReport)
+        },
+
+    .Console_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = CONSOLE_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    .Console_OUTEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = CONSOLE_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+
+    /*
+     * Extra
+     */
+#ifdef EXTRAKEY_ENABLE
+    .Extra_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = EXTRA_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_NonBootSubclass,
+            .Protocol               = HID_CSCP_NonBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .Extra_HID =
+        {
+            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+            .HIDSpec                = VERSION_BCD(01.11),
+            .CountryCode            = 0x00,
+            .TotalReportDescriptors = 1,
+            .HIDReportType          = HID_DTYPE_Report,
+            .HIDReportLength        = sizeof(ExtraReport)
+        },
+
+    .Extra_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = EXTRA_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+#endif
+};
+
+
+/*******************************************************************************
+ * String Descriptors
+ ******************************************************************************/
+const USB_Descriptor_String_t PROGMEM LanguageString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
+
+    .UnicodeString          = {LANGUAGE_ID_ENG}
+};
+
+const USB_Descriptor_String_t PROGMEM ManufacturerString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
+
+    .UnicodeString          = LSTR(MANUFACTURER)
+};
+
+const USB_Descriptor_String_t PROGMEM ProductString =
+{
+    .Header                 = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
+
+    .UnicodeString          = LSTR(PRODUCT)
+};
+
+
+/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
+ *  documentation) by the application code so that the address and size of a requested descriptor can be given
+ *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
+ *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
+ *  USB host.
+ */
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+                                    const uint8_t wIndex,
+                                    const void** const DescriptorAddress)
+{
+    const uint8_t  DescriptorType   = (wValue >> 8);
+    const uint8_t  DescriptorIndex  = (wValue & 0xFF);
+
+    const void* Address = NULL;
+    uint16_t    Size    = NO_DESCRIPTOR;
+
+    switch (DescriptorType)
+    {
+        case DTYPE_Device:
+            Address = &DeviceDescriptor;
+            Size    = sizeof(USB_Descriptor_Device_t);
+            break;
+        case DTYPE_Configuration:
+            Address = &ConfigurationDescriptor;
+            Size    = sizeof(USB_Descriptor_Configuration_t);
+            break;
+        case DTYPE_String:
+            switch (DescriptorIndex )
+            {
+                case 0x00:
+                    Address = &LanguageString;
+                    Size    = pgm_read_byte(&LanguageString.Header.Size);
+                    break;
+                case 0x01:
+                    Address = &ManufacturerString;
+                    Size    = pgm_read_byte(&ManufacturerString.Header.Size);
+                    break;
+                case 0x02:
+                    Address = &ProductString;
+                    Size    = pgm_read_byte(&ProductString.Header.Size);
+                    break;
+            }
+            break;
+        case HID_DTYPE_HID:
+            switch (wIndex) {
+            case KEYBOARD_INTERFACE:
+                Address = &ConfigurationDescriptor.Keyboard_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#ifdef MOUSE_ENABLE
+            case MOUSE_INTERFACE:
+                Address = &ConfigurationDescriptor.Mouse_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#endif
+            case CONSOLE_INTERFACE:
+                Address = &ConfigurationDescriptor.Console_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#ifdef EXTRAKEY_ENABLE
+            case EXTRA_INTERFACE:
+                Address = &ConfigurationDescriptor.Extra_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#endif
+            }
+            break;
+        case HID_DTYPE_Report:
+            switch (wIndex) {
+            case KEYBOARD_INTERFACE:
+                Address = &KeyboardReport;
+                Size    = sizeof(KeyboardReport);
+                break;
+#ifdef MOUSE_ENABLE
+            case MOUSE_INTERFACE:
+                Address = &MouseReport;
+                Size    = sizeof(MouseReport);
+                break;
+#endif
+            case CONSOLE_INTERFACE:
+                Address = &ConsoleReport;
+                Size    = sizeof(ConsoleReport);
+                break;
+#ifdef EXTRAKEY_ENABLE
+            case EXTRA_INTERFACE:
+                Address = &ExtraReport;
+                Size    = sizeof(ExtraReport);
+                break;
+#endif
+            }
+            break;
+    }
+
+    *DescriptorAddress = Address;
+    return Size;
+}
diff --git a/protocol/lufa/descriptor.h b/protocol/lufa/descriptor.h
new file mode 100644 (file)
index 0000000..001e072
--- /dev/null
@@ -0,0 +1,122 @@
+/* 
+ * 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.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *
+ *  Header file for Descriptors.c.
+ */
+
+#ifndef _DESCRIPTORS_H_
+#define _DESCRIPTORS_H_
+
+#include <LUFA/Drivers/USB/USB.h>
+#include <avr/pgmspace.h>
+
+
+typedef struct
+{
+    USB_Descriptor_Configuration_Header_t Config;
+
+    // Keyboard HID Interface
+    USB_Descriptor_Interface_t            Keyboard_Interface;
+    USB_HID_Descriptor_HID_t              Keyboard_HID;
+    USB_Descriptor_Endpoint_t             Keyboard_INEndpoint;
+
+    // Mouse HID Interface
+#ifdef MOUSE_ENABLE
+    USB_Descriptor_Interface_t            Mouse_Interface;
+    USB_HID_Descriptor_HID_t              Mouse_HID;
+    USB_Descriptor_Endpoint_t             Mouse_INEndpoint;
+#endif
+
+    // Console HID Interface
+    USB_Descriptor_Interface_t            Console_Interface;
+    USB_HID_Descriptor_HID_t              Console_HID;
+    USB_Descriptor_Endpoint_t             Console_INEndpoint;
+    USB_Descriptor_Endpoint_t             Console_OUTEndpoint;
+
+    // Extra HID Interface
+#ifdef EXTRAKEY_ENABLE
+    USB_Descriptor_Interface_t            Extra_Interface;
+    USB_HID_Descriptor_HID_t              Extra_HID;
+    USB_Descriptor_Endpoint_t             Extra_INEndpoint;
+#endif
+} USB_Descriptor_Configuration_t;
+
+
+/* index of interface */
+#define KEYBOARD_INTERFACE          0
+
+#ifdef MOUSE_ENABLE
+#   define MOUSE_INTERFACE          (KEYBOARD_INTERFACE + 1)
+#else
+#   define MOUSE_INTERFACE          KEYBOARD_INTERFACE
+#endif 
+
+#ifdef EXTRAKEY_ENABLE
+#   define EXTRA_INTERFACE          (MOUSE_INTERFACE + 1)
+#else
+#   define EXTRA_INTERFACE          MOUSE_INTERFACE
+#endif 
+
+#define CONSOLE_INTERFACE           (EXTRA_INTERFACE + 1)
+
+
+/* nubmer of interfaces */
+#define TOTAL_INTERFACES            (CONSOLE_INTERFACE + 1)
+
+
+// Endopoint number and size
+#define KEYBOARD_IN_EPNUM           1
+#define MOUSE_IN_EPNUM              2
+#define CONSOLE_IN_EPNUM            3
+#define CONSOLE_OUT_EPNUM           4
+#define EXTRA_IN_EPNUM              5
+
+#define KEYBOARD_EPSIZE             8
+#define MOUSE_EPSIZE                8
+#define CONSOLE_EPSIZE              8
+#define EXTRA_EPSIZE                8
+
+
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+                                    const uint8_t wIndex,
+                                    const void** const DescriptorAddress)
+                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+#endif
diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c
new file mode 100644 (file)
index 0000000..8fa719b
--- /dev/null
@@ -0,0 +1,408 @@
+/* 
+ * 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.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "report.h"
+#include "host.h"
+#include "host_driver.h"
+#include "keyboard.h"
+#include "sendchar.h"
+#include "debug.h"
+
+#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;
+
+static report_keyboard_t keyboard_report_sent;
+
+
+/* Host driver */
+static uint8_t keyboard_leds(void);
+static void send_keyboard(report_keyboard_t *report);
+static void send_mouse(report_mouse_t *report);
+static void send_system(uint16_t data);
+static void send_consumer(uint16_t data);
+static host_driver_t lufa_driver = {
+    keyboard_leds,
+    send_keyboard,
+    send_mouse,
+    send_system,
+    send_consumer
+};
+
+
+static void SetupHardware(void);
+static void Console_HID_Task(void);
+
+int main(void)
+{
+    SetupHardware();
+    sei();
+
+    print_enable = true;
+    debug_enable = true;
+    debug_matrix = true;
+    debug_keyboard = true;
+    debug_mouse = true;
+
+    // TODO: can't print here
+    debug("LUFA init\n");
+
+    keyboard_init();
+    host_set_driver(&lufa_driver);
+    while (1) {
+        keyboard_proc();
+
+        Console_HID_Task();
+        USB_USBTask();
+    }
+}
+
+void SetupHardware(void)
+{
+    /* Disable watchdog if enabled by bootloader/fuses */
+    MCUSR &= ~(1 << WDRF);
+    wdt_disable();
+
+    /* Disable clock division */
+    clock_prescale_set(clock_div_1);
+
+    USB_Init();
+}
+
+static void Console_HID_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();
+}
+
+
+/*******************************************************************************
+ * USB Events
+ ******************************************************************************/
+/** Event handler for the USB_Connect event. */
+void EVENT_USB_Device_Connect(void)
+{
+}
+
+/** Event handler for the USB_Disconnect event. */
+void EVENT_USB_Device_Disconnect(void)
+{
+}
+
+/** Event handler for the USB_ConfigurationChanged event.
+ * This is fired when the host sets the current configuration of the USB device after enumeration.
+ */
+void EVENT_USB_Device_ConfigurationChanged(void)
+{
+    bool ConfigSuccess = true;
+
+    /* Setup Keyboard HID Report Endpoints */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+#ifdef MOUSE_ENABLE
+    /* Setup Mouse HID Report Endpoint */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
+
+#ifdef EXTRAKEY_ENABLE
+    /* Setup Extra HID Report Endpoint */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
+
+    /* Setup Console HID Report Endpoints */
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+                                                CONSOLE_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.
+ *  This is fired before passing along unhandled control requests to the library for processing internally.
+ */
+void EVENT_USB_Device_ControlRequest(void)
+{
+    uint8_t* ReportData = NULL;
+    uint8_t  ReportSize = 0;
+
+    /* Handle HID Class specific requests */
+    switch (USB_ControlRequest.bRequest)
+    {
+        case HID_REQ_GetReport:
+            if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+            {
+                Endpoint_ClearSETUP();
+
+                // Interface
+                switch (USB_ControlRequest.wIndex) {
+                case KEYBOARD_INTERFACE:
+                    // TODO: test/check
+                    ReportData = (uint8_t*)&keyboard_report_sent;
+                    ReportSize = sizeof(keyboard_report_sent);
+                    break;
+                }
+
+                /* Write the report data to the control endpoint */
+                Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
+                Endpoint_ClearOUT();
+            }
+
+            break;
+        case HID_REQ_SetReport:
+            if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+            {
+
+                // Interface
+                switch (USB_ControlRequest.wIndex) {
+                case KEYBOARD_INTERFACE:
+                    Endpoint_ClearSETUP();
+
+                    while (!(Endpoint_IsOUTReceived())) {
+                        if (USB_DeviceState == DEVICE_STATE_Unattached)
+                          return;
+                    }
+                    keyboard_led_stats = Endpoint_Read_8();
+
+                    Endpoint_ClearOUT();
+                    Endpoint_ClearStatusStage();
+                    break;
+                }
+
+            }
+
+            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();
+            }
+
+            break;
+    }
+}
+
+/*******************************************************************************
+ * Host driver 
+ ******************************************************************************/
+static uint8_t keyboard_leds(void)
+{
+    return keyboard_led_stats;
+}
+
+static void send_keyboard(report_keyboard_t *report)
+{
+    // TODO: handle NKRO report
+    /* Select the Keyboard Report Endpoint */
+    Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
+
+    /* Check if Keyboard Endpoint Ready for Read/Write */
+    if (Endpoint_IsReadWriteAllowed())
+    {
+        /* Write Keyboard Report Data */
+        Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL);
+
+        /* Finalize the stream transfer to send the last packet */
+        Endpoint_ClearIN();
+    }
+    keyboard_report_sent = *report;
+}
+
+static void send_mouse(report_mouse_t *report)
+{
+#ifdef MOUSE_ENABLE
+    /* Select the Mouse Report Endpoint */
+    Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
+
+    /* Check if Mouse Endpoint Ready for Read/Write */
+    if (Endpoint_IsReadWriteAllowed())
+    {
+        /* Write Mouse Report Data */
+        Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
+
+        /* Finalize the stream transfer to send the last packet */
+        Endpoint_ClearIN();
+    }
+#endif
+}
+
+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()) {
+        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+        Endpoint_ClearIN();
+    }
+}
+
+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()) {
+        Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+        Endpoint_ClearIN();
+    }
+}
+
+
+/*******************************************************************************
+ * sendchar
+ ******************************************************************************/
+int8_t sendchar(uint8_t c)
+{
+    if (USB_DeviceState != DEVICE_STATE_Configured)
+      return -1;
+
+    Endpoint_SelectEndpoint(CONSOLE_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;
+        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;
+}
diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h
new file mode 100644 (file)
index 0000000..71c279b
--- /dev/null
@@ -0,0 +1,58 @@
+/* 
+ * 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.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#ifndef _LUFA_H_
+#define _LUFA_H_
+
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/power.h>
+#include <avr/interrupt.h>
+#include <stdbool.h>
+#include <string.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
index 1ee45e9ec9d30ba5bd112ed53488be3e05981e6f..cccdf6204286ab73417fe6122078a985c0eacac2 100644 (file)
@@ -1,21 +1,21 @@
-OPT_DEFS += -DHOST_PJRC
-
-SRC += pjrc.c \
-       usb_keyboard.c \
-       usb_debug.c \
-       usb.c \
-       bootloader_teensy.c
+PJRC_DIR = protocol/pjrc
 
+OPT_DEFS += -DHOST_PJRC
 
-# Search Path
-VPATH += $(TOP_DIR)/protocol/pjrc
-
+SRC += $(PJRC_DIR)/main.c \
+       $(PJRC_DIR)/pjrc.c \
+       $(PJRC_DIR)/usb_keyboard.c \
+       $(PJRC_DIR)/usb_debug.c \
+       $(PJRC_DIR)/usb.c
 
 # Option modules
 ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
-    SRC += usb_mouse.c
+    SRC += $(PJRC_DIR)/usb_mouse.c
 endif
 
 ifdef EXTRAKEY_ENABLE
-    SRC += usb_extra.c
+    SRC += $(PJRC_DIR)/usb_extra.c
 endif
+
+# Search Path
+VPATH += $(TOP_DIR)/$(PJRC_DIR)
diff --git a/protocol/pjrc/bootloader_teensy.c b/protocol/pjrc/bootloader_teensy.c
deleted file mode 100644 (file)
index 9d34852..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* See  http://www.pjrc.com/teensy/jump_to_bootloader.html */
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "bootloader.h"
-
-void bootloader_jump(void) {
-    cli();
-    // disable watchdog, if enabled
-    // disable all peripherals
-    UDCON = 1;
-    USBCON = (1<<FRZCLK);  // disable USB
-    UCSR1B = 0;
-    _delay_ms(5);
-#if defined(__AVR_AT90USB162__)                // Teensy 1.0
-    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0;
-    TIMSK0 = 0; TIMSK1 = 0; UCSR1B = 0;
-    DDRB = 0; DDRC = 0; DDRD = 0;
-    PORTB = 0; PORTC = 0; PORTD = 0;
-    asm volatile("jmp 0x3E00");
-#elif defined(__AVR_ATmega32U4__)              // Teensy 2.0
-    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
-    TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0; UCSR1B = 0; TWCR = 0;
-    DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; TWCR = 0;
-    PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
-    asm volatile("jmp 0x7E00");
-#elif defined(__AVR_AT90USB646__)              // Teensy++ 1.0
-    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
-    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0;
-    DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
-    PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
-    asm volatile("jmp 0xFC00");
-#elif defined(__AVR_AT90USB1286__)             // Teensy++ 2.0
-    EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0;
-    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0;
-    DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0;
-    PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
-    asm volatile("jmp 0x1FC00");
-#endif
-}
index 9e8e1fb39e3dbf30bd85869205f354366d0dc41f..4c5058115b00878a4d96f819f12958f67c891c3c 100644 (file)
@@ -1,10 +1,12 @@
+VUSB_DIR = protocol/vusb
+
 OPT_DEFS += -DHOST_VUSB
 
-SRC += vusb.c \
-       usbdrv.c \
-       usbdrvasm.S \
-       oddebug.c \
-       bootloader_usbasp.c \
+SRC += $(VUSB_DIR)/main.c \
+       $(VUSB_DIR)/vusb.c \
+       $(VUSB_DIR)/usbdrv/usbdrv.c \
+       $(VUSB_DIR)/usbdrv/usbdrvasm.S \
+       $(VUSB_DIR)/usbdrv/oddebug.c
 
 
 ifdef NO_UART
diff --git a/protocol/vusb/bootloader_usbasp.c b/protocol/vusb/bootloader_usbasp.c
deleted file mode 100644 (file)
index 6ec99cb..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include "bootloader.h"
-
-
-void bootloader_jump(void) {
-    cli();
-    // This makes custom USBasploader come up.
-    MCUSR = 0;
-
-    // ATmega168PA
-    // initialize ports
-    PORTB = 0; PORTC= 0; PORTD = 0;
-    DDRB = 0; DDRC= 0; DDRD = 0;
-
-    // disable interrupts
-    EIMSK = 0; EECR = 0; SPCR = 0;
-    ACSR = 0; SPMCSR = 0; WDTCSR = 0; PCICR = 0;
-    TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0;
-    ADCSRA = 0; TWCR = 0; UCSR0B = 0;
-    
-    // Boot Loader Section Start Address:
-    // BOOTSZ       Size        Address
-    // (lock bit)   (word)      (word)      (byte)
-    // '11'         128         0x1F80      0x3F00
-    // '10'         256         0x1F00      0x3E00
-    // '01'         512         0x1E00      0x3C00
-    // '00'         1024        0x1C00      0x3800
-    asm volatile("jmp 0x3800");
-}
index 1bf9035b39723fd2b751ab412f4e0a6b58ad884a..3deb82238ac25ea486879e58fd04e5b1e664729d 100644 (file)
@@ -90,10 +90,15 @@ int main(void)
             }
         }
 #endif
-        if (!suspended)
+        if (!suspended) {
             usbPoll();
-        keyboard_proc();
-        if (!suspended)
+
+            // TODO: configuration process is incosistent. it sometime fails.
+            // To prevent failing to configure NOT scan keyboard during configuration
+            if (usbConfiguration && usbInterruptIsReady()) {
+                keyboard_proc();
+            }
             vusb_transfer_keyboard();
+        }
     }
 }
index 0bfe21e92e2a272f14c665f0d2aa3e0be78acf5a..4e11836e16f11b19ad0c32769968f048ac0afa10 100644 (file)
@@ -91,20 +91,38 @@ 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)
 {
-    report->report_id = REPORT_ID_MOUSE;
+    vusb_mouse_report_t r = {
+        .report_id = REPORT_ID_MOUSE,
+        .report = *report
+    };
     if (usbInterruptIsReady3()) {
-        usbSetInterrupt3((void *)report, sizeof(*report));
+        usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
     }
 }
 
+
+typedef struct {
+    uint8_t  report_id;
+    uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
 static void send_system(uint16_t data)
 {
-    // Not need static?
-    static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
-    report[1] = data&0xFF;
-    report[2] = (data>>8)&0xFF;
+    static uint16_t last_data = 0;
+    if (data == last_data) return;
+    last_data = data;
+
+    report_extra_t report = {
+        .report_id = REPORT_ID_SYSTEM,
+        .usage = data
+    };
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     }
@@ -116,10 +134,10 @@ static void send_consumer(uint16_t data)
     if (data == last_data) return;
     last_data = data;
 
-    // Not need static?
-    static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
-    report[1] = data&0xFF;
-    report[2] = (data>>8)&0xFF;
+    report_extra_t report = {
+        .report_id = REPORT_ID_CONSUMER,
+        .usage = data
+    };
     if (usbInterruptIsReady3()) {
         usbSetInterrupt3((void *)&report, sizeof(report));
     }
index 104031fbb27bc4568ecfd84213d2d10c817789fc..e561eae631f03bc5da6db252bc8a31dfe5e94937 100644 (file)
--- a/rules.mk
+++ b/rules.mk
 #
 # make extcoff = Convert ELF to AVR Extended COFF.
 #
-# make program = Download the hex file to the device, using avrdude.
-#                Please customize the avrdude settings below first!
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
 #
 # make debug = Start either simulavr or avarice as specified for debugging, 
 #              with avr-gdb or avr-insight as the front end for debugging.
@@ -109,8 +124,10 @@ CFLAGS += -O$(OPT)
 CFLAGS += -funsigned-char
 CFLAGS += -funsigned-bitfields
 CFLAGS += -ffunction-sections
+CFLAGS += -fno-inline-small-functions
 CFLAGS += -fpack-struct
 CFLAGS += -fshort-enums
+CFLAGS += -fno-strict-aliasing
 CFLAGS += -Wall
 CFLAGS += -Wstrict-prototypes
 #CFLAGS += -mshort-calls
@@ -230,7 +247,7 @@ EXTMEMOPTS =
 #      (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
 #
 LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
-#LDFLAGS += -Wl,--relax
+LDFLAGS += -Wl,--relax
 LDFLAGS += -Wl,--gc-sections
 LDFLAGS += $(EXTMEMOPTS)
 LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
@@ -387,6 +404,34 @@ gccversion :
 program: $(TARGET).hex $(TARGET).eep
        $(PROGRAM_CMD)
 
+teensy: $(TARGET).hex
+       teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+
+flip: $(TARGET).hex
+       batchisp -hardware usb -device $(MCU) -operation erase f
+       batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
+       batchisp -hardware usb -device $(MCU) -operation start reset 0
+
+dfu: $(TARGET).hex
+       dfu-programmer $(MCU) erase
+       dfu-programmer $(MCU) flash $(TARGET).hex
+       dfu-programmer $(MCU) reset
+       
+dfu-start:
+       dfu-programmer $(MCU) reset
+       dfu-programmer $(MCU) start
+
+flip-ee: $(TARGET).hex $(TARGET).eep
+       $(COPY) $(TARGET).eep $(TARGET)eep.hex
+       batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
+       batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
+       batchisp -hardware usb -device $(MCU) -operation start reset 0
+       $(REMOVE) $(TARGET)eep.hex
+
+dfu-ee: $(TARGET).hex $(TARGET).eep
+       dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
+       dfu-programmer $(MCU) reset
+
 
 # Generate avr-gdb config/init file which does the following:
 #     define the reset signal, load the target file, connect to target, and set 
@@ -488,6 +533,7 @@ extcoff: $(TARGET).elf
 # Compile: create object files from C source files.
 $(OBJDIR)/%.o : %.c
        @echo
+       mkdir -p $(@D)
        @echo $(MSG_COMPILING) $<
        $(CC) -c $(ALL_CFLAGS) $< -o $@ 
 
@@ -538,7 +584,11 @@ clean_list :
        $(REMOVE) $(OBJ:.o=.s)
        $(REMOVE) $(OBJ:.o=.i)
        $(REMOVE) -r .dep
-       $(REMOVEDIR) $(OBJDIR)
+       $(REMOVE) -r $(OBJDIR)
+
+show_path:
+       @echo VPATH=$(VPATH)
+       @echo SRC=$(SRC)
 
 
 # Create object files directory
@@ -552,5 +602,5 @@ $(shell mkdir $(OBJDIR) 2>/dev/null)
 # Listing of phony targets.
 .PHONY : all begin finish end sizebefore sizeafter gccversion \
 build elf hex eep lss sym coff extcoff \
-clean clean_list program debug gdb-config
-
+clean clean_list debug gdb-config show_path \
+program teensy dfu flip dfu-ee flip-ee dfu-start