]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Merge branch 'lufa_nkro'
authortmk <nobody@nowhere>
Sun, 28 Jul 2013 15:55:49 +0000 (00:55 +0900)
committertmk <nobody@nowhere>
Sun, 28 Jul 2013 15:55:49 +0000 (00:55 +0900)
12 files changed:
common/host.c
common/report.h
keyboard/hhkb/Makefile [new file with mode: 0644]
keyboard/hhkb/Makefile.lufa [deleted file]
keyboard/hhkb/Makefile.pjrc
keyboard/hhkb/Makefile.tmk [deleted file]
keyboard/hhkb/README.md
keyboard/hhkb/config.h
protocol/lufa/descriptor.c
protocol/lufa/descriptor.h
protocol/lufa/lufa.c
protocol/pjrc/usb_keyboard.c

index 2c2279aa4e072dec4d52f03931e907d66c888b86..5694516527168c9fa7fee1fe935c0a3a916548b7 100644 (file)
@@ -37,8 +37,10 @@ static uint16_t last_consumer_report = 0;
 
 static inline void add_key_byte(uint8_t code);
 static inline void del_key_byte(uint8_t code);
+#ifdef NKRO_ENABLE
 static inline void add_key_bit(uint8_t code);
 static inline void del_key_bit(uint8_t code);
+#endif
 
 
 void host_set_driver(host_driver_t *d)
@@ -63,11 +65,11 @@ void host_keyboard_send(report_keyboard_t *report)
     (*driver->send_keyboard)(report);
 
     if (debug_keyboard) {
-        dprint("keys: ");
-        for (int i = 0; i < REPORT_KEYS; i++) {
-            dprintf("%02X ", keyboard_report->keys[i]);
+        dprint("keyboard_report: ");
+        for (uint8_t i = 0; i < REPORT_SIZE; i++) {
+            dprintf("%02X ", keyboard_report->raw[i]);
         }
-        dprintf(" mods: %02X\n", keyboard_report->mods);
+        dprint("\n");
     }
 }
 
@@ -122,8 +124,9 @@ void host_del_key(uint8_t key)
 
 void host_clear_keys(void)
 {
-    for (int8_t i = 0; i < REPORT_KEYS; i++) {
-        keyboard_report->keys[i] = 0;
+    // not clea  mods
+    for (int8_t i = 1; i < REPORT_SIZE; i++) {
+        keyboard_report->raw[i] = 0;
     }
 }
 
@@ -155,8 +158,8 @@ void host_clear_mods(void)
 uint8_t host_has_anykey(void)
 {
     uint8_t cnt = 0;
-    for (int i = 0; i < REPORT_KEYS; i++) {
-        if (keyboard_report->keys[i])
+    for (uint8_t i = 1; i < REPORT_SIZE; i++) {
+        if (keyboard_report->raw[i])
             cnt++;
     }
     return cnt;
@@ -172,9 +175,9 @@ uint8_t host_get_first_key(void)
 #ifdef NKRO_ENABLE
     if (keyboard_nkro) {
         uint8_t i = 0;
-        for (; i < REPORT_KEYS && !keyboard_report->keys[i]; i++)
+        for (; i < REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
             ;
-        return i<<3 | biton(keyboard_report->keys[i]);
+        return i<<3 | biton(keyboard_report->nkro.bits[i]);
     }
 #endif
     return keyboard_report->keys[0];
@@ -222,18 +225,18 @@ static inline void add_key_byte(uint8_t code)
 
 static inline void del_key_byte(uint8_t code)
 {
-    int i = 0;
-    for (; i < REPORT_KEYS; i++) {
+    for (uint8_t i = 0; i < REPORT_KEYS; i++) {
         if (keyboard_report->keys[i] == code) {
             keyboard_report->keys[i] = 0;
         }
     }
 }
 
+#ifdef NKRO_ENABLE
 static inline void add_key_bit(uint8_t code)
 {
-    if ((code>>3) < REPORT_KEYS) {
-        keyboard_report->keys[code>>3] |= 1<<(code&7);
+    if ((code>>3) < REPORT_BITS) {
+        keyboard_report->nkro.bits[code>>3] |= 1<<(code&7);
     } else {
         dprintf("add_key_bit: can't add: %02X\n", code);
     }
@@ -241,9 +244,10 @@ static inline void add_key_bit(uint8_t code)
 
 static inline void del_key_bit(uint8_t code)
 {
-    if ((code>>3) < REPORT_KEYS) {
-        keyboard_report->keys[code>>3] &= ~(1<<(code&7));
+    if ((code>>3) < REPORT_BITS) {
+        keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7));
     } else {
         dprintf("del_key_bit: can't del: %02X\n", code);
     }
 }
+#endif
index 02deb7797e7ec6b224d94b53df56e1474ce57bae..91982840af441a775c88be4171c293ec1bbec1d5 100644 (file)
@@ -72,14 +72,20 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 /* key report size(NKRO or boot mode) */
-#if defined(PROTOCOL_PJRC)
+#if defined(PROTOCOL_PJRC) && defined(NKRO_ENABLE)
 #   include "usb.h"
-#   if defined(KBD2_REPORT_KEYS) && KBD2_REPORT_KEYS > KBD_REPORT_KEYS
-#       define REPORT_KEYS KBD2_REPORT_KEYS
-#   else
-#       define REPORT_KEYS KBD_REPORT_KEYS
-#   endif
+#   define REPORT_SIZE KBD2_SIZE
+#   define REPORT_KEYS (KBD2_SIZE - 2)
+#   define REPORT_BITS (KBD2_SIZE - 1)
+
+#elif defined(PROTOCOL_LUFA) && defined(NKRO_ENABLE)
+#   include "protocol/lufa/descriptor.h"
+#   define REPORT_SIZE NKRO_EPSIZE
+#   define REPORT_KEYS (NKRO_EPSIZE - 2)
+#   define REPORT_BITS (NKRO_EPSIZE - 1)
+
 #else
+#   define REPORT_SIZE 8
 #   define REPORT_KEYS 6
 #endif
 
@@ -88,11 +94,27 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 extern "C" {
 #endif
 
+typedef union {
+    uint8_t raw[REPORT_SIZE];
+    struct {
+        uint8_t mods;
+        uint8_t reserved;
+        uint8_t keys[REPORT_KEYS];
+    };
+#ifdef NKRO_ENABLE
+    struct {
+        uint8_t mods;
+        uint8_t bits[REPORT_BITS];
+    } nkro;
+#endif
+} __attribute__ ((packed)) report_keyboard_t;
+/*
 typedef struct {
     uint8_t mods;
-    uint8_t rserved;
+    uint8_t reserved;
     uint8_t keys[REPORT_KEYS];
 } __attribute__ ((packed)) report_keyboard_t;
+*/
 
 typedef struct {
     uint8_t buttons;
diff --git a/keyboard/hhkb/Makefile b/keyboard/hhkb/Makefile
new file mode 100644 (file)
index 0000000..1ef0a01
--- /dev/null
@@ -0,0 +1,131 @@
+#----------------------------------------------------------------------------
+# 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
+# PJRC Teensy++ 2.0
+#MCU = at90usb1286
+# TMK Alt Controller or PJRC Teensy 2.0
+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)
+
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096      (TMK Alt Controller)
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes  # Mouse keys
+EXTRAKEY_ENABLE = yes  # Audio control and System control
+CONSOLE_ENABLE = yes   # Console for debug
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+NKRO_ENABLE = yes      # USB Nkey Rollover
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
+
+debug-on: EXTRAFLAGS += -DDEBUG
+debug-on: all
diff --git a/keyboard/hhkb/Makefile.lufa b/keyboard/hhkb/Makefile.lufa
deleted file mode 100644 (file)
index 97b8faa..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-#----------------------------------------------------------------------------
-# 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)
-
-# Interrupt driven control endpoint task
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes  # Mouse keys
-EXTRAKEY_ENABLE = yes  # Audio control and System control
-CONSOLE_ENABLE = yes   # Console for debug
-COMMAND_ENABLE = yes    # Commands for debug and configuration
-#NKRO_ENABLE = yes     # USB Nkey Rollover
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TOP_DIR)
-
-include $(TOP_DIR)/protocol/lufa.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
-
-debug-on: EXTRAFLAGS += -DDEBUG
-debug-on: all
index f64cd9be4dd8dc701c084d9b29b36a58557eecc4..5a781dd23a6e403df58f82c93a2ab7bbe89bf409 100644 (file)
@@ -23,9 +23,9 @@ 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 = atmega32u4       # Teensy 2.0
 #MCU = at90usb646       # Teensy++ 1.0
-MCU = at90usb1286      # Teensy++ 2.0
+#MCU = at90usb1286      # Teensy++ 2.0
 
 
 # Processor frequency.
diff --git a/keyboard/hhkb/Makefile.tmk b/keyboard/hhkb/Makefile.tmk
deleted file mode 100644 (file)
index d373008..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-#----------------------------------------------------------------------------
-# 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_tmk
-
-# 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)
-
-# Interrupt driven control endpoint task
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-#BOOTMAGIC_ENABLE = yes        # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes  # Mouse keys
-EXTRAKEY_ENABLE = yes  # Audio control and System control
-CONSOLE_ENABLE = yes   # Console for debug
-COMMAND_ENABLE = yes    # Commands for debug and configuration
-#NKRO_ENABLE = yes     # USB Nkey Rollover
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TOP_DIR)
-
-include $(TOP_DIR)/protocol/lufa.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
-
-debug-on: EXTRAFLAGS += -DDEBUG
-debug-on: all
index b9e0b534a2128909abcf1faa294c87052865b0ea..3959ae85a8be6f9b1df8ccb1f4422b413826942a 100644 (file)
@@ -8,7 +8,6 @@ See [this thread][AltController] in geekhack.org.
 
 [HHKB]: http://www.pfu.fujitsu.com/hhkeyboard/
 [AltController]: http://geekhack.org/index.php?topic=12047.0
-[Teensy]: http://www.pjrc.com/teensy/
 
 
 ##Features
@@ -22,8 +21,8 @@ See README of [tmk_keyboard] for more.
 [tmk_keyboard]: http://github.com/tmk/tmk_keyboard
  
 ###Pros
-* No risk: Everything is all reversible
-* Without PCB trace cutting, case mod or any destructives
+* No risks: Everything is all reversible
+* No need for PCB trace patching, case cutting or any other destructive mod
 * Can keep original controller intact
 * Can change all HHKB behaviour as you like
 
@@ -41,61 +40,35 @@ See [doc/HHKB.txt](doc/HHKB.txt) and files under [doc/](doc/) for internal of HH
 
 
 ##Build Firmware & Program
-You can choose some combination of hardware and USB protocol stack([LUFA], [PJRC]).
+See [this document](../../doc/build.md) first.
 
-### Install Tools
-See [this document](../../doc/build.md).
+### Configuration
+Set `MCU`, `BOOTLOADER_SIZE` and other build options in `Makefile` and `config.h`.
 
-### TMK Alt Controller Board
-    $ make -f Makefile.tmk
+### Build 
+Just run make after intall tools.
 
-This programs the controller with [dfu-programmer] if the tool is intalled and configured properly.
+    $ make
 
-    $ make -f Makefile.tmk dfu
-
-Push reset button and program with [FLIP]. The tool should be intalled and configured properly.
-
-    $ make -f Makefile.tmk flip
-
-Or you can also program with FLIP GUI.
-
-[dfu-programmer]: http://dfu-programmer.sourceforge.net/
-[FLIP]: http://www.atmel.com/tools/FLIP.aspx
-
-
-### PJRC Teensy++
-Build with [LUFA] USB stack:
-
-    $ make -f Makefile.lufa
-
-or with [PJRC] USB stack:
+Use `Makefile.pjrc` if you want to use PJRC stack instead of LUFA.(LUFA is recommended.)
 
     $ make -f Makefile.pjrc
 
-Push reset button and program with [Teensy Loader(command line)]. The tool should be intalled and configured properly.
-
-    $  make -f Makefile.lufa teensy
-    $  make -f Makefile.pjrc teensy
-
-Or you can also program with [Teensy Loader(GUI)].
+Use `Makefile.vusb` for [V-USB] controller.(not supported actively any more.)
+    $ make -f Makefile.vusb
 
-[LUFA]: http://www.fourwalledcubicle.com/LUFA.php
-[PJRC]: http://www.pjrc.com/teensy/usb_keyboard.html
-[Teensy Loader(command line)]: http://www.pjrc.com/teensy/loader_cli.html
-[Teensy Loader(GUI)]: http://www.pjrc.com/teensy/loader.html
+### Program
+First, push reset button on board to start bootloader.
 
+This command programs the controller with [dfu-programmer] if the tool is intalled and configured properly.
 
-###AVR Mega with [V-USB]
-Build:
-    $ make -f Makefile.vusb
+    $ make dfu
 
-Program [USBaspLoader] on MCU with AVR programmer like [AVRISPmkII] and tool like [avrdude].
+Or you can also use [FLIP] command to program. Also the tool should be intalled and configured properly. FLIP GUI app is also available.
 
-You can programs with [avrdude] once you have programmed [USBaspLoader] on MCU.
-    $  make -f Makefile.vusb program
+    $ make flip
 
-[AVRISPmkII]: http://www.atmel.com/tools/AVRISPMKII.aspx
-[avrdude]: http://www.nongnu.org/avrdude/
+Use [Teensy Loader] if your controller is Teensy/Teensy++.
 
 
 ##How to Customize
@@ -103,7 +76,7 @@ See [tmk_keyboard] documents.
 
 
 ##Hardware
-You have some options for hardware. Development boards with USB AVR family(ATMega32U4, AT90USB1286) like Teensy will work while MegaAVR with V-USB library is also cheapear option for DIY.
+You have some options for hardware. Development boards with USB AVR family(ATMega32U4, AT90USB1286) like Teensy will work while MegaAVR with [V-USB] library is also cheapear option for DIY.
 
 ###1. TMK Alt Controller Board
 TMK designed [Keyboard Controller Board for HHKB Pro2(KiCad project)](https://github.com/tmk/HHKB_controller).
@@ -127,7 +100,6 @@ See [this post](http://geekhack.org/index.php?topic=12047.msg948923#msg948923).
     +---------------+
 
 - NOTE: PJRC [Teensy](http://www.pjrc.com/teensy/)
-[Teensy Loader]: http://www.pjrc.com/teensy/loader.html
 
 ###3. V-USB connection
                     +---+   +---------------+
@@ -156,5 +128,11 @@ See [this post](http://geekhack.org/index.php?topic=12047.msg948923#msg948923).
 - NOTE: See [V-USB] documentation for more detail of hardware and the USB stack.
 - NOTE: [USBaspLoader] is very useful for firmware update.
 
+
+[LUFA]: http://www.fourwalledcubicle.com/LUFA.php
+[PJRC]: http://www.pjrc.com/teensy/usb_keyboard.html
+[dfu-programmer]: http://dfu-programmer.sourceforge.net/
+[FLIP]: http://www.atmel.com/tools/FLIP.aspx
+[Teensy Loader]: http://www.pjrc.com/teensy/loader.html
 [V-USB]: http://www.obdev.at/products/vusb/index.html
 [USBaspLoader]: http://www.obdev.at/products/vusb/usbasploader.html
index 8c93f97da512eb2c0f88b8272faab024d6bdd2d1..83a911beab19be3d9c28679cc3469fe9f16b1a2a 100644 (file)
@@ -21,7 +21,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define VENDOR_ID       0xFEED
 #define PRODUCT_ID      0xCAFE
-#define DEVICE_VER      0x0103
+#define DEVICE_VER      0x0104
 #define MANUFACTURER    t.m.k.
 #define PRODUCT         HHKB mod
 #define DESCRIPTION     t.m.k. keyboard firmware for HHKB mod
@@ -31,27 +31,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_ROWS 8
 #define MATRIX_COLS 8
 
-/* 
- * Boot magic keys
- * call some function by pressing key when pluging cable or powering on.
- */
-/* key position on matrix(ROW:COL) */
-#define KEY_FN          0x54
-#define KEY_D           0x14
-#define KEY_IS_ON(key)  matrix_is_on((key)>>4, (key)&0xF)
-/* kick up bootloader */
-#define IS_BOOTMAGIC_BOOTLOADER()       KEY_IS_ON(KEY_FN)
-/* debug on */
-#define IS_BOOTMAGIC_DEBUG()            KEY_IS_ON(KEY_D)
-
 
 /* key combination for command */
 #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) 
 
-/* mouse keys */
-#ifdef MOUSEKEY_ENABLE
-#   define MOUSEKEY_DELAY_TIME 100
-#endif
 
 /* period of tapping(ms) */
 #define TAPPING_TERM    300
@@ -62,11 +45,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Boot Magic salt key: Space */
 #define BOOTMAGIC_KEY_SALT      KC_FN6
 
+
 /*
  * Feature disable options
  *  These options are also useful to firmware size reduction.
  */
-
 /* disable debug print */
 //#define NO_DEBUG
 
index d34ab1c5aa50cbeabd027da7ac3959185f5e8dd2..a46ba3ec6aab744b4d1309bc5dfe61a9ebf88363 100644 (file)
@@ -57,9 +57,11 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
         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_INPUT(8, HID_IOF_CONSTANT),  /* reserved */
+
         HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
         HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
         HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
@@ -69,6 +71,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
         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 */
@@ -210,11 +213,13 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] =
 
         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_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*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_COUNT(8, (NKRO_EPSIZE-1)*8),
         HID_RI_REPORT_SIZE(8, 0x01),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+    HID_RI_END_COLLECTION(0),
 };
 #endif
 
@@ -439,6 +444,48 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
             .PollingIntervalMS      = 0x01
         },
 #endif
+
+    /*
+     * NKRO
+     */
+#ifdef NKRO_ENABLE
+    .NKRO_Interface =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+            .InterfaceNumber        = NKRO_INTERFACE,
+            .AlternateSetting       = 0x00,
+
+            .TotalEndpoints         = 1,
+
+            .Class                  = HID_CSCP_HIDClass,
+            .SubClass               = HID_CSCP_NonBootSubclass,
+            .Protocol               = HID_CSCP_NonBootProtocol,
+
+            .InterfaceStrIndex      = NO_DESCRIPTOR
+        },
+
+    .NKRO_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(NKROReport)
+        },
+
+    .NKRO_INEndpoint =
+        {
+            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+            .EndpointAddress        = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM),
+            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+            .EndpointSize           = NKRO_EPSIZE,
+            .PollingIntervalMS      = 0x01
+        },
+#endif
 };
 
 
@@ -535,6 +582,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Address = &ConfigurationDescriptor.Console_HID;
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
+#endif
+#ifdef NKRO_ENABLE
+            case NKRO_INTERFACE:
+                Address = &ConfigurationDescriptor.NKRO_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
 #endif
             }
             break;
@@ -561,6 +614,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Address = &ConsoleReport;
                 Size    = sizeof(ConsoleReport);
                 break;
+#endif
+#ifdef NKRO_ENABLE
+            case NKRO_INTERFACE:
+                Address = &NKROReport;
+                Size    = sizeof(NKROReport);
+                break;
 #endif
             }
             break;
index 44f20d5a26b36855d24f7cbd59cacb007cc69428..9ee1c04d794c92e4e81fafd04bae28ca55307581 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
  * This file is based on:
  *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
  *     LUFA-120219/Demos/Device/Lowlevel/GenericHID
@@ -78,6 +78,13 @@ typedef struct
     USB_Descriptor_Endpoint_t             Console_INEndpoint;
     USB_Descriptor_Endpoint_t             Console_OUTEndpoint;
 #endif
+
+#ifdef NKRO_ENABLE
+    // NKRO HID Interface
+    USB_Descriptor_Interface_t            NKRO_Interface;
+    USB_HID_Descriptor_HID_t              NKRO_HID;
+    USB_Descriptor_Endpoint_t             NKRO_INEndpoint;
+#endif
 } USB_Descriptor_Configuration_t;
 
 
@@ -102,9 +109,15 @@ typedef struct
 #   define CONSOLE_INTERFACE        EXTRAKEY_INTERFACE
 #endif
 
+#ifdef NKRO_ENABLE
+#   define NKRO_INTERFACE           (CONSOLE_INTERFACE + 1)
+#else
+#   define NKRO_INTERFACE           CONSOLE_INTERFACE
+#endif
+
 
 /* nubmer of interfaces */
-#define TOTAL_INTERFACES            (CONSOLE_INTERFACE + 1)
+#define TOTAL_INTERFACES            (NKRO_INTERFACE + 1)
 
 
 // Endopoint number and size
@@ -125,6 +138,12 @@ typedef struct
 #ifdef CONSOLE_ENABLE
 #   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
 #   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#else
+#   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM
+#endif
+
+#ifdef NKRO_ENABLE
+#   define NKRO_IN_EPNUM            (CONSOLE_OUT_EPNUM + 1)
 #endif
 
 
@@ -132,6 +151,7 @@ typedef struct
 #define MOUSE_EPSIZE                8
 #define EXTRAKEY_EPSIZE             8
 #define CONSOLE_EPSIZE              32
+#define NKRO_EPSIZE                 16
 
 
 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
index a863b8d23cbb842e4b7a3f2bd9b28a88bf190ecb..c1617cd05ae26670475883770620987b70db7641 100644 (file)
@@ -220,6 +220,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
     ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
                                      CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
+
+#ifdef NKRO_ENABLE
+    /* Setup NKRO HID Report Endpoints */
+    ConfigSuccess &= ENDPOINT_CONFIG(NKRO_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                     NKRO_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
 }
 
 /*
@@ -350,15 +356,31 @@ static void send_keyboard(report_keyboard_t *report)
     if (USB_DeviceState != DEVICE_STATE_Configured)
         return;
 
-    // TODO: handle NKRO report
     /* Select the Keyboard Report Endpoint */
-    Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
+#ifdef NKRO_ENABLE
+    if (keyboard_nkro) {
+        Endpoint_SelectEndpoint(NKRO_IN_EPNUM);
+    }
+    else
+#endif
+    {
+        Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
+    }
 
     /* Check if Keyboard Endpoint Ready for Read/Write */
     while (--timeout && !Endpoint_IsReadWriteAllowed()) ;
 
     /* Write Keyboard Report Data */
-    Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL);
+#ifdef NKRO_ENABLE
+    if (keyboard_nkro) {
+        Endpoint_Write_Stream_LE(report, NKRO_EPSIZE, NULL);
+    }
+    else
+#endif
+    {
+        /* boot mode */
+        Endpoint_Write_Stream_LE(report, KEYBOARD_EPSIZE, NULL);
+    }
 
     /* Finalize the stream transfer to send the last packet */
     Endpoint_ClearIN();
index 49b85c179fb968f50f9a068e9b1c7ffcbe472c6b..de798fcc229a72ad47ef9e7f7a5a7e51f4c4dadb 100644 (file)
@@ -57,12 +57,12 @@ int8_t usb_keyboard_send_report(report_keyboard_t *report)
 
 #ifdef NKRO_ENABLE
     if (keyboard_nkro)
-        result = send_report(report, KBD2_ENDPOINT, 0, KBD2_REPORT_KEYS);
+        result = send_report(report, KBD2_ENDPOINT, 0, KBD2_SIZE);
     else
 #endif
     {
         if (usb_keyboard_protocol)
-            result = send_report(report, KBD_ENDPOINT, 0, KBD_REPORT_KEYS);
+            result = send_report(report, KBD_ENDPOINT, 0, KBD_SIZE);
         else
             result = send_report(report, KBD_ENDPOINT, 0, 6);
     }
@@ -104,15 +104,8 @@ static inline int8_t send_report(report_keyboard_t *report, uint8_t endpoint, ui
             cli();
             UENUM = endpoint;
     }
-    UEDATX = report->mods;
-#ifdef NKRO_ENABLE
-    if (!keyboard_nkro)
-        UEDATX = 0;
-#else
-    UEDATX = 0;
-#endif
     for (uint8_t i = keys_start; i < keys_end; i++) {
-            UEDATX = report->keys[i];
+            UEDATX = report->raw[i];
     }
     UEINTX = 0x3A;
     SREG = intr_state;