]> git.donarmstrong.com Git - tmk_firmware.git/commitdiff
Merge branch 'mbed' into dev
authortmk <nobody@nowhere>
Wed, 30 Jul 2014 05:37:05 +0000 (14:37 +0900)
committertmk <nobody@nowhere>
Wed, 30 Jul 2014 05:37:05 +0000 (14:37 +0900)
71 files changed:
.gitignore
common.mk
common/action.c
common/action.h
common/action_layer.c
common/action_layer.h
common/action_macro.c
common/action_macro.h
common/action_util.c
common/action_util.h
common/avr/bootloader.c [new file with mode: 0644]
common/avr/eeconfig.c [new file with mode: 0644]
common/avr/suspend.c [new file with mode: 0644]
common/avr/suspend_avr.h [new file with mode: 0644]
common/avr/timer.c [new file with mode: 0644]
common/avr/timer_avr.h [new file with mode: 0644]
common/avr/xprintf.S [new file with mode: 0644]
common/avr/xprintf.h [new file with mode: 0644]
common/bootloader.c [deleted file]
common/bootmagic.c
common/debug.h
common/debug_config.h [deleted file]
common/eeconfig.c [deleted file]
common/host.c
common/host.h
common/keyboard.c
common/keyboard.h
common/keymap.c
common/keymap.h
common/mbed/bootloader.c [new file with mode: 0644]
common/mbed/suspend.c [new file with mode: 0644]
common/mbed/timer.c [new file with mode: 0644]
common/mbed/xprintf.cpp [new file with mode: 0644]
common/mbed/xprintf.h [new file with mode: 0644]
common/mousekey.c
common/mousekey.h
common/nodebug.h
common/print.c
common/print.h
common/progmem.h [new file with mode: 0644]
common/report.h
common/suspend.c [deleted file]
common/suspend.h
common/timer.c [deleted file]
common/timer.h
common/wait.h [new file with mode: 0644]
common/xprintf.S [deleted file]
common/xprintf.h [deleted file]
converter/ps2_usb/Makefile.mbed [new file with mode: 0644]
converter/ps2_usb/config_mbed.h [new file with mode: 0644]
converter/ps2_usb/keymap_common.c
converter/ps2_usb/keymap_common.h
converter/ps2_usb/main.cpp [new file with mode: 0644]
converter/ps2_usb/matrix.c
keyboard/mbed_onekey/Makefile [new file with mode: 0644]
keyboard/mbed_onekey/config.h [new file with mode: 0644]
keyboard/mbed_onekey/main.cpp [new file with mode: 0644]
protocol.mk
protocol/mbed/HIDKeyboard.cpp [new file with mode: 0644]
protocol/mbed/HIDKeyboard.h [new file with mode: 0644]
protocol/mbed/mbed_driver.cpp [new file with mode: 0644]
protocol/mbed/mbed_driver.h [new file with mode: 0644]
protocol/ps2.h
protocol/ps2_busywait.c
protocol/ps2_io.h [new file with mode: 0644]
protocol/ps2_io_avr.c [new file with mode: 0644]
protocol/ps2_io_mbed.c [new file with mode: 0644]
tool/mbed/common.mk [new file with mode: 0644]
tool/mbed/gcc.mk [new file with mode: 0644]
tool/mbed/lpc-vector-checksum.c [new file with mode: 0644]
tool/mbed/mbed.mk [new file with mode: 0644]

index c25d41d2386b2d7b9977ca7321a15bed6aece68e..b79d72b7c7ae72142099d4e3b9efa6d3e54d7f99 100644 (file)
@@ -8,3 +8,5 @@
 *.map
 *.sym
 tags
+build/
+*.bak
index 62ac0ff787e9dba800cb8a0375b9bc69001de43e..04f036477115de2a1410d5e7fb517ec3f2d2ed2c 100644 (file)
--- a/common.mk
+++ b/common.mk
@@ -7,18 +7,18 @@ SRC +=        $(COMMON_DIR)/host.c \
        $(COMMON_DIR)/action_layer.c \
        $(COMMON_DIR)/action_util.c \
        $(COMMON_DIR)/keymap.c \
-       $(COMMON_DIR)/timer.c \
        $(COMMON_DIR)/print.c \
-       $(COMMON_DIR)/bootloader.c \
-       $(COMMON_DIR)/suspend.c \
-       $(COMMON_DIR)/xprintf.S \
-       $(COMMON_DIR)/util.c
+       $(COMMON_DIR)/util.c \
+       $(COMMON_DIR)/avr/suspend.c \
+       $(COMMON_DIR)/avr/xprintf.S \
+       $(COMMON_DIR)/avr/timer.c \
+       $(COMMON_DIR)/avr/bootloader.c
 
 
 # Option modules
 ifdef BOOTMAGIC_ENABLE
     SRC += $(COMMON_DIR)/bootmagic.c
-    SRC += $(COMMON_DIR)/eeconfig.c
+    SRC += $(COMMON_DIR)/avr/eeconfig.c
     OPT_DEFS += -DBOOTMAGIC_ENABLE
 endif
 
index fddb97c508dbd96865c73ef08bfd68cc1739b1ac..94498fe6cb33e456069537ab9feffc721016e52c 100644 (file)
@@ -499,7 +499,7 @@ void clear_keyboard_but_mods(void)
 #endif
 }
 
-bool is_tap_key(key_t key)
+bool is_tap_key(keypos_t key)
 {
     action_t action = layer_switch_get_action(key);
 
index 077711c231a3fffb0640fa35784323724a555cf2..8a4736d7bc19cbb833481649b467cc4da109e1ac 100644 (file)
@@ -25,6 +25,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "action_macro.h"
 
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* tapping count and state */
 typedef struct {
     bool    interrupted :1;
@@ -42,12 +46,11 @@ typedef struct {
 #endif
 } keyrecord_t;
 
-
 /* Execute action per keyevent */
 void action_exec(keyevent_t event);
 
 /* action for key */
-action_t action_for_key(uint8_t layer, key_t key);
+action_t action_for_key(uint8_t layer, keypos_t key);
 
 /* macro */
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
@@ -65,11 +68,15 @@ void unregister_mods(uint8_t mods);
 void clear_keyboard(void);
 void clear_keyboard_but_mods(void);
 void layer_switch(uint8_t new_layer);
-bool is_tap_key(key_t key);
+bool is_tap_key(keypos_t key);
 
 /* debug */
 void debug_event(keyevent_t event);
 void debug_record(keyrecord_t record);
 void debug_action(action_t action);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif  /* ACTION_H */
index 526e24d5397aedf6e5e9d1eb4204ee92ca5cad2d..c535615f44d44a8fa669e1f86825142b9c56b616 100644 (file)
@@ -112,7 +112,7 @@ void layer_debug(void)
 
 
 
-action_t layer_switch_get_action(key_t key)
+action_t layer_switch_get_action(keypos_t key)
 {
     action_t action;
     action.code = ACTION_TRANSPARENT;
index 034e00027b3ee07586edd30f6004ec48d88a3e5b..b6da353cfdbe851d6bfb5689b6173135b8697d84 100644 (file)
@@ -72,6 +72,6 @@ void layer_xor(uint32_t state);
 
 
 /* return action depending on current layer status */
-action_t layer_switch_get_action(key_t key);
+action_t layer_switch_get_action(keypos_t key);
 
 #endif
index d85aee3796e58a85196fae6765f3025be53d84c7..ba93fc8b2324b7cb96e9a5744a21eee89c3f588d 100644 (file)
@@ -14,10 +14,10 @@ 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 <util/delay.h>
 #include "action.h"
 #include "action_util.h"
 #include "action_macro.h"
+#include "wait.h"
 
 #ifdef DEBUG_ACTION
 #include "debug.h"
@@ -28,7 +28,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #ifndef NO_ACTION_MACRO
 
-#define MACRO_READ()  (macro = pgm_read_byte(macro_p++))
+#define MACRO_READ()  (macro = MACRO_GET(macro_p++))
 void action_macro_play(const macro_t *macro_p)
 {
     macro_t macro = END;
@@ -58,7 +58,7 @@ void action_macro_play(const macro_t *macro_p)
             case WAIT:
                 MACRO_READ();
                 dprintf("WAIT(%u)\n", macro);
-                { uint8_t ms = macro; while (ms--) _delay_ms(1); }
+                { uint8_t ms = macro; while (ms--) wait_ms(1); }
                 break;
             case INTERVAL:
                 interval = MACRO_READ();
@@ -77,7 +77,7 @@ void action_macro_play(const macro_t *macro_p)
                 return;
         }
         // interval
-        { uint8_t ms = interval; while (ms--) _delay_ms(1); }
+        { uint8_t ms = interval; while (ms--) wait_ms(1); }
     }
 }
 #endif
index 621826308858c93b589013d25e4330a84683046d..aedc32ec6b2c428e53cd24d3d5c105eb1f1143eb 100644 (file)
@@ -17,12 +17,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef ACTION_MACRO_H
 #define ACTION_MACRO_H
 #include <stdint.h>
-#include <avr/pgmspace.h>
+#include "progmem.h"
 
 
-#define MACRO_NONE  0
-#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })
-
+#define MACRO_NONE      0
+#define MACRO(...)      ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })
+#define MACRO_GET(p)    pgm_read_byte(p)
 
 typedef uint8_t macro_t;
 
index 5f44b3812c00e232d3e8594e2deacf6faf62e6f0..dbee630d18175127e4d3aa333245ef2875d74dc9 100644 (file)
@@ -31,8 +31,8 @@ static uint8_t real_mods = 0;
 static uint8_t weak_mods = 0;
 
 #ifdef USB_6KRO_ENABLE
-#define RO_ADD(a, b) ((a + b) % REPORT_KEYS)
-#define RO_SUB(a, b) ((a - b + REPORT_KEYS) % REPORT_KEYS)
+#define RO_ADD(a, b) ((a + b) % KEYBOARD_REPORT_KEYS)
+#define RO_SUB(a, b) ((a - b + KEYBOARD_REPORT_KEYS) % KEYBOARD_REPORT_KEYS)
 #define RO_INC(a) RO_ADD(a, 1)
 #define RO_DEC(a) RO_SUB(a, 1)
 static int8_t cb_head = 0;
@@ -98,7 +98,7 @@ void del_key(uint8_t key)
 void clear_keys(void)
 {
     // not clear mods
-    for (int8_t i = 1; i < REPORT_SIZE; i++) {
+    for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
         keyboard_report->raw[i] = 0;
     }
 }
@@ -145,7 +145,7 @@ void clear_oneshot_mods(void)
 uint8_t has_anykey(void)
 {
     uint8_t cnt = 0;
-    for (uint8_t i = 1; i < REPORT_SIZE; i++) {
+    for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) {
         if (keyboard_report->raw[i])
             cnt++;
     }
@@ -162,7 +162,7 @@ uint8_t get_first_key(void)
 #ifdef NKRO_ENABLE
     if (keyboard_nkro) {
         uint8_t i = 0;
-        for (; i < REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
+        for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
             ;
         return i<<3 | biton(keyboard_report->nkro.bits[i]);
     }
@@ -234,7 +234,7 @@ static inline void add_key_byte(uint8_t code)
 #else
     int8_t i = 0;
     int8_t empty = -1;
-    for (; i < REPORT_KEYS; i++) {
+    for (; i < KEYBOARD_REPORT_KEYS; i++) {
         if (keyboard_report->keys[i] == code) {
             break;
         }
@@ -242,7 +242,7 @@ static inline void add_key_byte(uint8_t code)
             empty = i;
         }
     }
-    if (i == REPORT_KEYS) {
+    if (i == KEYBOARD_REPORT_KEYS) {
         if (empty != -1) {
             keyboard_report->keys[empty] = code;
         }
@@ -278,7 +278,7 @@ static inline void del_key_byte(uint8_t code)
         } while (i != cb_tail);
     }
 #else
-    for (uint8_t i = 0; i < REPORT_KEYS; i++) {
+    for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
         if (keyboard_report->keys[i] == code) {
             keyboard_report->keys[i] = 0;
         }
@@ -289,7 +289,7 @@ static inline void del_key_byte(uint8_t code)
 #ifdef NKRO_ENABLE
 static inline void add_key_bit(uint8_t code)
 {
-    if ((code>>3) < REPORT_BITS) {
+    if ((code>>3) < KEYBOARD_REPORT_BITS) {
         keyboard_report->nkro.bits[code>>3] |= 1<<(code&7);
     } else {
         dprintf("add_key_bit: can't add: %02X\n", code);
@@ -298,7 +298,7 @@ static inline void add_key_bit(uint8_t code)
 
 static inline void del_key_bit(uint8_t code)
 {
-    if ((code>>3) < REPORT_BITS) {
+    if ((code>>3) < KEYBOARD_REPORT_BITS) {
         keyboard_report->nkro.bits[code>>3] &= ~(1<<(code&7));
     } else {
         dprintf("del_key_bit: can't del: %02X\n", code);
index f9d3161a800200be9b808c2a799e4f930107e095..a955638b46d8ad84c45c297b2a5f431f506aa85a 100644 (file)
@@ -20,6 +20,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <stdint.h>
 #include "report.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 extern report_keyboard_t *keyboard_report;
 
 void send_keyboard_report(void);
@@ -54,4 +58,9 @@ void oneshot_disable(void);
 uint8_t has_anykey(void);
 uint8_t has_anymod(void);
 uint8_t get_first_key(void);
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/common/avr/bootloader.c b/common/avr/bootloader.c
new file mode 100644 (file)
index 0000000..cda295b
--- /dev/null
@@ -0,0 +1,148 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/wdt.h>
+#include <util/delay.h>
+#include "bootloader.h"
+
+#ifdef PROTOCOL_LUFA
+#include <LUFA/Drivers/USB/USB.h>
+#endif
+
+
+/* Boot Section Size in *BYTEs*
+ *   Teensy   halfKay    512
+ *   Teensy++ halfKay    1024
+ *   Atmel DFU loader    4096
+ *   LUFA bootloader     4096
+ *   USBaspLoader        2048
+ */
+#ifndef BOOTLOADER_SIZE
+#warning To use bootloader_jump() you need to define BOOTLOADER_SIZE in config.h.
+#define BOOTLOADER_SIZE     4096
+#endif
+
+#define FLASH_SIZE          (FLASHEND + 1L)
+#define BOOTLOADER_START    (FLASH_SIZE - BOOTLOADER_SIZE)
+
+
+/* 
+ * Entering the Bootloader via Software 
+ * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
+ */
+#define BOOTLOADER_RESET_KEY 0xB007B007
+uint32_t reset_key  __attribute__ ((section (".noinit")));
+
+/* initialize MCU status by watchdog reset */
+void bootloader_jump(void) {
+#ifdef PROTOCOL_LUFA
+    USB_Disable();
+    cli();
+    _delay_ms(2000);
+#endif
+
+#ifdef PROTOCOL_PJRC
+    cli();
+    UDCON = 1;
+    USBCON = (1<<FRZCLK);
+    UCSR1B = 0;
+    _delay_ms(5);
+#endif
+
+    // watchdog reset
+    reset_key = BOOTLOADER_RESET_KEY;
+    wdt_enable(WDTO_250MS);
+    for (;;);
+}
+
+
+/* this runs before main() */
+void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
+void bootloader_jump_after_watchdog_reset(void)
+{
+    if ((MCUSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
+        reset_key = 0;
+
+        // My custom USBasploader requires this to come up.
+        MCUSR = 0;
+
+        // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
+        MCUSR &= ~(1<<WDRF);
+        wdt_disable();
+
+        // This is compled into 'icall', address should be in word unit, not byte.
+        ((void (*)(void))(BOOTLOADER_START/2))();
+    }
+}
+
+
+#if 0
+/* Jumping To The Bootloader
+ * http://www.pjrc.com/teensy/jump_to_bootloader.html
+ * 
+ * This method doen't work when using LUFA. idk why.
+ * - needs to initialize more regisers or interrupt setting?
+ */
+void bootloader_jump(void) {
+#ifdef PROTOCOL_LUFA
+    USB_Disable();
+    cli();
+    _delay_ms(2000);
+#endif
+
+#ifdef PROTOCOL_PJRC
+    cli();
+    UDCON = 1;
+    USBCON = (1<<FRZCLK);
+    UCSR1B = 0;
+    _delay_ms(5);
+#endif
+
+    /*
+     * Initialize
+     */
+#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
+
+    /*
+     * USBaspLoader
+     */
+#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
+
+    // This is compled into 'icall', address should be in word unit, not byte.
+    ((void (*)(void))(BOOTLOADER_START/2))();
+}
+#endif
diff --git a/common/avr/eeconfig.c b/common/avr/eeconfig.c
new file mode 100644 (file)
index 0000000..5bd47dc
--- /dev/null
@@ -0,0 +1,45 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/eeprom.h>
+#include "eeconfig.h"
+
+void eeconfig_init(void)
+{
+    eeprom_write_word(EECONFIG_MAGIC,          EECONFIG_MAGIC_NUMBER);
+    eeprom_write_byte(EECONFIG_DEBUG,          0);
+    eeprom_write_byte(EECONFIG_DEFAULT_LAYER,  0);
+    eeprom_write_byte(EECONFIG_KEYMAP,         0);
+    eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0);
+#ifdef BACKLIGHT_ENABLE
+    eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
+#endif
+}
+
+void eeconfig_enable(void)
+{
+    eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
+}
+
+void eeconfig_disable(void)
+{
+    eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
+}
+
+bool eeconfig_is_enabled(void)
+{
+    return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
+}
+
+uint8_t eeconfig_read_debug(void)      { return eeprom_read_byte(EECONFIG_DEBUG); }
+void eeconfig_write_debug(uint8_t val) { eeprom_write_byte(EECONFIG_DEBUG, val); }
+
+uint8_t eeconfig_read_default_layer(void)      { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); }
+void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); }
+
+uint8_t eeconfig_read_keymap(void)      { return eeprom_read_byte(EECONFIG_KEYMAP); }
+void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); }
+
+#ifdef BACKLIGHT_ENABLE
+uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
+void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
+#endif
diff --git a/common/avr/suspend.c b/common/avr/suspend.c
new file mode 100644 (file)
index 0000000..f44a036
--- /dev/null
@@ -0,0 +1,98 @@
+#include <stdbool.h>
+#include <avr/sleep.h>
+#include <avr/wdt.h>
+#include <avr/interrupt.h>
+#include "matrix.h"
+#include "action.h"
+#include "backlight.h"
+#include "suspend_avr.h"
+#include "suspend.h"
+
+
+#define wdt_intr_enable(value)   \
+__asm__ __volatile__ (  \
+    "in __tmp_reg__,__SREG__" "\n\t"    \
+    "cli" "\n\t"    \
+    "wdr" "\n\t"    \
+    "sts %0,%1" "\n\t"  \
+    "out __SREG__,__tmp_reg__" "\n\t"   \
+    "sts %0,%2" "\n\t" \
+    : /* no outputs */  \
+    : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
+    "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
+    "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
+        _BV(WDIE) | (value & 0x07)) ) \
+    : "r0"  \
+)
+
+
+void suspend_power_down(void)
+{
+#ifdef BACKLIGHT_ENABLE
+    backlight_set(0);
+#endif
+#ifndef NO_SUSPEND_POWER_DOWN
+    // Enable watchdog to wake from MCU sleep
+    cli();
+    wdt_reset();
+
+    // Watchdog Interrupt and System Reset Mode
+    //wdt_enable(WDTO_1S);
+    //WDTCSR |= _BV(WDIE);
+    
+    // Watchdog Interrupt Mode
+    wdt_intr_enable(WDTO_120MS);
+    
+    // TODO: more power saving
+    // See PicoPower application note
+    // - I/O port input with pullup
+    // - prescale clock
+    // - BOD disable
+    // - Power Reduction Register PRR
+    // sleep in power down mode
+    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+    sleep_enable();
+    sei();
+    sleep_cpu();
+    sleep_disable();
+
+    // Disable watchdog after sleep
+    wdt_disable();
+#endif
+}
+
+bool suspend_wakeup_condition(void)
+{
+    matrix_scan();
+    for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
+        if (matrix_get_row(r)) return true;
+    }
+    return false;
+}
+
+// run immediately after wakeup
+void suspend_wakeup_init(void)
+{
+    // clear keyboard state
+    clear_keyboard();
+#ifdef BACKLIGHT_ENABLE
+    backlight_init();
+#endif
+}
+
+#ifndef NO_SUSPEND_POWER_DOWN
+/* watchdog timeout */
+ISR(WDT_vect)
+{
+    /* wakeup from MCU sleep mode */
+/*
+    // blink LED
+    static uint8_t led_state = 0;
+    static uint8_t led_count = 0;
+    led_count++;
+    if ((led_count & 0x07) == 0) {
+        led_set((led_state ^= (1<<USB_LED_CAPS_LOCK)));
+    }
+*/
+}
+#endif
diff --git a/common/avr/suspend_avr.h b/common/avr/suspend_avr.h
new file mode 100644 (file)
index 0000000..357102d
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef SUSPEND_AVR_H
+#define SUSPEND_AVR_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/sleep.h>
+#include <avr/wdt.h>
+#include <avr/interrupt.h>
+
+
+#define wdt_intr_enable(value)   \
+__asm__ __volatile__ (  \
+    "in __tmp_reg__,__SREG__" "\n\t"    \
+    "cli" "\n\t"    \
+    "wdr" "\n\t"    \
+    "sts %0,%1" "\n\t"  \
+    "out __SREG__,__tmp_reg__" "\n\t"   \
+    "sts %0,%2" "\n\t" \
+    : /* no outputs */  \
+    : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
+    "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
+    "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
+        _BV(WDIE) | (value & 0x07)) ) \
+    : "r0"  \
+)
+
+#endif
diff --git a/common/avr/timer.c b/common/avr/timer.c
new file mode 100644 (file)
index 0000000..292b41c
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+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 <stdint.h>
+#include "timer_avr.h"
+#include "timer.h"
+
+
+// counter resolution 1ms
+// NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
+volatile uint32_t timer_count = 0;
+
+void timer_init(void)
+{
+    // Timer0 CTC mode
+    TCCR0A = 0x02;
+
+#if TIMER_PRESCALER == 1
+    TCCR0B = 0x01;
+#elif TIMER_PRESCALER == 8
+    TCCR0B = 0x02;
+#elif TIMER_PRESCALER == 64
+    TCCR0B = 0x03;
+#elif TIMER_PRESCALER == 256
+    TCCR0B = 0x04;
+#elif TIMER_PRESCALER == 1024
+    TCCR0B = 0x05;
+#else
+#   error "Timer prescaler value is NOT vaild."
+#endif
+
+    OCR0A = TIMER_RAW_TOP;
+    TIMSK0 = (1<<OCIE0A);
+}
+
+inline
+void timer_clear(void)
+{
+    uint8_t sreg = SREG;
+    cli();
+    timer_count = 0;
+    SREG = sreg;
+}
+
+inline
+uint16_t timer_read(void)
+{
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return (t & 0xFFFF);
+}
+
+inline
+uint32_t timer_read32(void)
+{
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return t;
+}
+
+inline
+uint16_t timer_elapsed(uint16_t last)
+{
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return TIMER_DIFF_16((t & 0xFFFF), last);
+}
+
+inline
+uint32_t timer_elapsed32(uint32_t last)
+{
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return TIMER_DIFF_32(t, last);
+}
+
+// excecuted once per 1ms.(excess for just timer count?)
+ISR(TIMER0_COMPA_vect)
+{
+    timer_count++;
+}
diff --git a/common/avr/timer_avr.h b/common/avr/timer_avr.h
new file mode 100644 (file)
index 0000000..0e85eb1
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+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 TIMER_AVR_H
+#define TIMER_AVR_H 1
+
+#include <stdint.h>
+
+#ifndef TIMER_PRESCALER
+#   if F_CPU > 16000000
+#       define TIMER_PRESCALER      256
+#   elif F_CPU > 2000000
+#       define TIMER_PRESCALER      64
+#   elif F_CPU > 250000
+#       define TIMER_PRESCALER      8
+#   else
+#       define TIMER_PRESCALER      1
+#   endif
+#endif
+#define TIMER_RAW_FREQ      (F_CPU/TIMER_PRESCALER)
+#define TIMER_RAW           TCNT0
+#define TIMER_RAW_TOP       (TIMER_RAW_FREQ/1000)
+
+#if (TIMER_RAW_TOP > 255)
+#   error "Timer0 can't count 1ms at this clock freq. Use larger prescaler."
+#endif
+
+#endif
diff --git a/common/avr/xprintf.S b/common/avr/xprintf.S
new file mode 100644 (file)
index 0000000..0cec70c
--- /dev/null
@@ -0,0 +1,500 @@
+;---------------------------------------------------------------------------;\r
+; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011\r
+;---------------------------------------------------------------------------;\r
+\r
+                               // Base size is 152 bytes\r
+#define        CR_CRLF         0       // Convert \n to \r\n (+10 bytes)\r
+#define USE_XPRINTF    1       // Enable xprintf function (+194 bytes)\r
+#define USE_XSPRINTF   0       // Add xsprintf function (+78 bytes)\r
+#define USE_XFPRINTF   0       // Add xfprintf function (+54 bytes)\r
+#define USE_XATOI      0       // Enable xatoi function (+182 bytes)\r
+\r
+\r
+#if FLASHEND > 0x1FFFF\r
+#error xitoa module does not support 256K devices\r
+#endif\r
+\r
+.nolist\r
+#include <avr/io.h>    // Include device specific definitions.\r
+.list\r
+\r
+#ifdef SPM_PAGESIZE    // Recent devices have "lpm Rd,Z+" and "movw".\r
+.macro _LPMI   reg\r
+       lpm     \reg, Z+\r
+.endm\r
+.macro _MOVW   dh,dl, sh,sl\r
+       movw    \dl, \sl\r
+.endm\r
+#else                  // Earlier devices do not have "lpm Rd,Z+" nor "movw".\r
+.macro _LPMI   reg\r
+       lpm\r
+       mov     \reg, r0\r
+       adiw    ZL, 1\r
+.endm\r
+.macro _MOVW   dh,dl, sh,sl\r
+       mov     \dl, \sl\r
+       mov     \dh, \sh\r
+.endm\r
+#endif\r
+\r
+\r
+\r
+;---------------------------------------------------------------------------\r
+; Stub function to forward to user output function\r
+;\r
+;Prototype: void xputc (char chr       // a character to be output\r
+;                      );\r
+;Size: 12/12 words\r
+\r
+.section .bss\r
+.global xfunc_out      ; xfunc_out must be initialized before using this module.\r
+xfunc_out:     .ds.w   1\r
+.section .text\r
+\r
+\r
+.func xputc\r
+.global xputc\r
+xputc:\r
+#if CR_CRLF\r
+       cpi     r24, 10         ;LF --> CRLF\r
+       brne    1f              ;\r
+       ldi     r24, 13         ;\r
+       rcall   1f              ;\r
+       ldi     r24, 10         ;/\r
+1:\r
+#endif\r
+       push    ZH\r
+       push    ZL\r
+       lds     ZL, xfunc_out+0 ;Pointer to the registered output function.\r
+       lds     ZH, xfunc_out+1 ;/\r
+       sbiw    ZL, 0           ;Skip if null\r
+       breq    2f              ;/\r
+       icall\r
+2:     pop     ZL\r
+       pop     ZH\r
+       ret\r
+.endfunc\r
+\r
+\r
+\r
+;---------------------------------------------------------------------------\r
+; Direct ROM string output\r
+;\r
+;Prototype: void xputs (const char *str_p // rom string to be output\r
+;                      );\r
+\r
+.func xputs\r
+.global xputs\r
+xputs:\r
+       _MOVW   ZH,ZL, r25,r24  ; Z = pointer to rom string\r
+1:     _LPMI   r24\r
+       cpi     r24, 0\r
+       breq    2f\r
+       rcall   xputc\r
+       rjmp    1b\r
+2:     ret\r
+.endfunc\r
+\r
+\r
+;---------------------------------------------------------------------------\r
+; Extended direct numeral string output (32bit version)\r
+;\r
+;Prototype: void xitoa (long value,    // value to be output\r
+;                       char radix,    // radix\r
+;                       char width);   // minimum width\r
+;\r
+\r
+.func xitoa\r
+.global xitoa\r
+xitoa:\r
+                               ;r25:r22 = value, r20 = base, r18 = digits\r
+       clr     r31             ;r31 = stack level\r
+       ldi     r30, ' '        ;r30 = sign\r
+       ldi     r19, ' '        ;r19 = filler\r
+       sbrs    r20, 7          ;When base indicates signd format and the value\r
+       rjmp    0f              ;is minus, add a '-'.\r
+       neg     r20             ;\r
+       sbrs    r25, 7          ;\r
+       rjmp    0f              ;\r
+       ldi     r30, '-'        ;\r
+       com     r22             ;\r
+       com     r23             ;\r
+       com     r24             ;\r
+       com     r25             ;\r
+       adc     r22, r1         ;\r
+       adc     r23, r1         ;\r
+       adc     r24, r1         ;\r
+       adc     r25, r1         ;/\r
+0:     sbrs    r18, 7          ;When digits indicates zero filled,\r
+       rjmp    1f              ;filler is '0'.\r
+       neg     r18             ;\r
+       ldi     r19, '0'        ;/\r
+                               ;----- string conversion loop\r
+1:     ldi     r21, 32         ;r26 = r25:r22 % r20\r
+       clr     r26             ;r25:r22 /= r20\r
+2:     lsl     r22             ;\r
+       rol     r23             ;\r
+       rol     r24             ;\r
+       rol     r25             ;\r
+       rol     r26             ;\r
+       cp      r26, r20        ;\r
+       brcs    3f              ;\r
+       sub     r26, r20        ;\r
+       inc     r22             ;\r
+3:     dec     r21             ;\r
+       brne    2b              ;/\r
+       cpi     r26, 10         ;r26 is a numeral digit '0'-'F'\r
+       brcs    4f              ;\r
+       subi    r26, -7         ;\r
+4:     subi    r26, -'0'       ;/\r
+       push    r26             ;Stack it\r
+       inc     r31             ;/\r
+       cp      r22, r1         ;Repeat until r25:r22 gets zero\r
+       cpc     r23, r1         ;\r
+       cpc     r24, r1         ;\r
+       cpc     r25, r1         ;\r
+       brne    1b              ;/\r
+\r
+       cpi     r30, '-'        ;Minus sign if needed\r
+       brne    5f              ;\r
+       push    r30             ;\r
+       inc     r31             ;/\r
+5:     cp      r31, r18        ;Filler\r
+       brcc    6f              ;\r
+       push    r19             ;\r
+       inc     r31             ;\r
+       rjmp    5b              ;/\r
+\r
+6:     pop     r24             ;Flush stacked digits and exit\r
+       rcall   xputc           ;\r
+       dec     r31             ;\r
+       brne    6b              ;/\r
+\r
+       ret\r
+.endfunc\r
+\r
+\r
+\r
+;---------------------------------------------------------------------------;\r
+; Formatted string output (16/32bit version)\r
+;\r
+;Prototype:\r
+; void __xprintf (const char *format_p, ...);\r
+; void __xsprintf(char*, const char *format_p, ...);\r
+; void __xfprintf(void(*func)(char), const char *format_p, ...);\r
+;\r
+\r
+#if USE_XPRINTF\r
+\r
+.func xvprintf\r
+xvprintf:\r
+       ld      ZL, Y+          ;Z = pointer to format string\r
+       ld      ZH, Y+          ;/\r
+\r
+0:     _LPMI   r24             ;Get a format char\r
+       cpi     r24, 0          ;End of format string?\r
+       breq    90f             ;/\r
+       cpi     r24, '%'        ;Is format?\r
+       breq    20f             ;/\r
+1:     rcall   xputc           ;Put a normal character\r
+       rjmp    0b              ;/\r
+90:    ret\r
+\r
+20:    ldi     r18, 0          ;r18: digits\r
+       clt                     ;T: filler\r
+       _LPMI   r21             ;Get flags\r
+       cpi     r21, '%'        ;Is a %?\r
+       breq    1b              ;/\r
+       cpi     r21, '0'        ;Zero filled?\r
+       brne    23f             ;\r
+       set                     ;/\r
+22:    _LPMI   r21             ;Get width\r
+23:    cpi     r21, '9'+1      ;\r
+       brcc    24f             ;\r
+       subi    r21, '0'        ;\r
+       brcs    90b             ;\r
+       lsl     r18             ;\r
+       mov     r0, r18         ;\r
+       lsl     r18             ;\r
+       lsl     r18             ;\r
+       add     r18, r0         ;\r
+       add     r18, r21        ;\r
+       rjmp    22b             ;/\r
+\r
+24:    brtc    25f             ;get value (low word)\r
+       neg     r18             ;\r
+25:    ld      r24, Y+         ;\r
+       ld      r25, Y+         ;/\r
+       cpi     r21, 'c'        ;Is type character?\r
+       breq    1b              ;/\r
+       cpi     r21, 's'        ;Is type RAM string?\r
+       breq    50f             ;/\r
+       cpi     r21, 'S'        ;Is type ROM string?\r
+       breq    60f             ;/\r
+       _MOVW   r23,r22,r25,r24 ;r25:r22 = value\r
+       clr     r24             ;\r
+       clr     r25             ;\r
+       clt                     ;/\r
+       cpi     r21, 'l'        ;Is long int?\r
+       brne    26f             ;\r
+       ld      r24, Y+         ;get value (high word)\r
+       ld      r25, Y+         ;\r
+       set                     ;\r
+       _LPMI   r21             ;/\r
+26:    cpi     r21, 'd'        ;Is type signed decimal?\r
+       brne    27f             ;/\r
+       ldi     r20, -10        ;\r
+       brts    40f             ;\r
+       sbrs    r23, 7          ;\r
+       rjmp    40f             ;\r
+       ldi     r24, -1         ;\r
+       ldi     r25, -1         ;\r
+       rjmp    40f             ;/\r
+27:    cpi     r21, 'u'        ;Is type unsigned decimal?\r
+       ldi     r20, 10         ;\r
+       breq    40f             ;/\r
+       cpi     r21, 'X'        ;Is type hexdecimal?\r
+       ldi     r20, 16         ;\r
+       breq    40f             ;/\r
+       cpi     r21, 'b'        ;Is type binary?\r
+       ldi     r20, 2          ;\r
+       breq    40f             ;/\r
+       ret                     ;abort\r
+40:    push    ZH              ;Output the value\r
+       push    ZL              ;\r
+       rcall   xitoa           ;\r
+42:    pop     ZL              ;\r
+       pop     ZH              ;\r
+       rjmp    0b              ;/\r
+\r
+50:    push    ZH              ;Put a string on the RAM\r
+       push    ZL\r
+       _MOVW   ZH,ZL, r25,r24\r
+51:    ld      r24, Z+\r
+       cpi     r24, 0\r
+       breq    42b\r
+       rcall   xputc\r
+       rjmp    51b\r
+\r
+60:    push    ZH              ;Put a string on the ROM\r
+       push    ZL\r
+       rcall   xputs\r
+       rjmp    42b\r
+.endfunc\r
+\r
+\r
+.func __xprintf\r
+.global __xprintf\r
+__xprintf:\r
+       push    YH\r
+       push    YL\r
+       in      YL, _SFR_IO_ADDR(SPL)\r
+#ifdef SPH\r
+       in      YH, _SFR_IO_ADDR(SPH)\r
+#else\r
+       clr     YH\r
+#endif\r
+       adiw    YL, 5           ;Y = pointer to arguments\r
+       rcall   xvprintf\r
+       pop     YL\r
+       pop     YH\r
+       ret\r
+.endfunc\r
+\r
+\r
+#if USE_XSPRINTF\r
+\r
+.func __xsprintf\r
+putram:\r
+       _MOVW   ZH,ZL, r15,r14\r
+       st      Z+, r24\r
+       _MOVW   r15,r14, ZH,ZL\r
+       ret\r
+.global __xsprintf\r
+__xsprintf:\r
+       push    YH\r
+       push    YL\r
+       in      YL, _SFR_IO_ADDR(SPL)\r
+#ifdef SPH\r
+       in      YH, _SFR_IO_ADDR(SPH)\r
+#else\r
+       clr     YH\r
+#endif\r
+       adiw    YL, 5           ;Y = pointer to arguments\r
+       lds     ZL, xfunc_out+0 ;Save registered output function\r
+       lds     ZH, xfunc_out+1 ;\r
+       push    ZL              ;\r
+       push    ZH              ;/\r
+       ldi     ZL, lo8(pm(putram));Set local output function\r
+       ldi     ZH, hi8(pm(putram));\r
+       sts     xfunc_out+0, ZL ;\r
+       sts     xfunc_out+1, ZH ;/\r
+       push    r15             ;Initialize pointer to string buffer\r
+       push    r14             ;\r
+       ld      r14, Y+         ;\r
+       ld      r15, Y+         ;/\r
+       rcall   xvprintf\r
+       _MOVW   ZH,ZL, r15,r14  ;Terminate string\r
+       st      Z, r1           ;\r
+       pop     r14             ;\r
+       pop     r15             ;/\r
+       pop     ZH              ;Restore registered output function\r
+       pop     ZL              ;\r
+       sts     xfunc_out+0, ZL ;\r
+       sts     xfunc_out+1, ZH ;/\r
+       pop     YL\r
+       pop     YH\r
+       ret\r
+.endfunc\r
+#endif\r
+\r
+\r
+#if USE_XFPRINTF\r
+.func __xfprintf\r
+.global __xfprintf\r
+__xfprintf:\r
+       push    YH\r
+       push    YL\r
+       in      YL, _SFR_IO_ADDR(SPL)\r
+#ifdef SPH\r
+       in      YH, _SFR_IO_ADDR(SPH)\r
+#else\r
+       clr     YH\r
+#endif\r
+       adiw    YL, 5           ;Y = pointer to arguments\r
+       lds     ZL, xfunc_out+0 ;Save registered output function\r
+       lds     ZH, xfunc_out+1 ;\r
+       push    ZL              ;\r
+       push    ZH              ;/\r
+       ld      ZL, Y+          ;Set output function\r
+       ld      ZH, Y+          ;\r
+       sts     xfunc_out+0, ZL ;\r
+       sts     xfunc_out+1, ZH ;/\r
+       rcall   xvprintf\r
+       pop     ZH              ;Restore registered output function\r
+       pop     ZL              ;\r
+       sts     xfunc_out+0, ZL ;\r
+       sts     xfunc_out+1, ZH ;/\r
+       pop     YL\r
+       pop     YH\r
+       ret\r
+.endfunc\r
+#endif\r
+\r
+#endif\r
+\r
+\r
+\r
+;---------------------------------------------------------------------------\r
+; Extended numeral string input\r
+;\r
+;Prototype:\r
+; char xatoi (           /* 1: Successful, 0: Failed */\r
+;      const char **str, /* pointer to pointer to source string */\r
+;      long *res         /* result */\r
+; );\r
+;\r
+\r
+\r
+#if USE_XATOI\r
+.func xatoi\r
+.global xatoi\r
+xatoi:\r
+       _MOVW   r1, r0, r23, r22\r
+       _MOVW   XH, XL, r25, r24\r
+       ld      ZL, X+\r
+       ld      ZH, X+\r
+       clr     r18             ;r21:r18 = 0;\r
+       clr     r19             ;\r
+       clr     r20             ;\r
+       clr     r21             ;/\r
+       clt                     ;T = 0;\r
+\r
+       ldi     r25, 10         ;r25 = 10;\r
+       rjmp    41f             ;/\r
+40:    adiw    ZL, 1           ;Z++;\r
+41:    ld      r22, Z          ;r22 = *Z;\r
+       cpi     r22, ' '        ;if(r22 == ' ') continue\r
+       breq    40b             ;/\r
+       brcs    70f             ;if(r22 < ' ') error;\r
+       cpi     r22, '-'        ;if(r22 == '-') {\r
+       brne    42f             ; T = 1;\r
+       set                     ; continue;\r
+       rjmp    40b             ;}\r
+42:    cpi     r22, '9'+1      ;if(r22 > '9') error;\r
+       brcc    70f             ;/\r
+       cpi     r22, '0'        ;if(r22 < '0') error;\r
+       brcs    70f             ;/\r
+       brne    51f             ;if(r22 > '0') cv_start;\r
+       ldi     r25, 8          ;r25 = 8;\r
+       adiw    ZL, 1           ;r22 = *(++Z);\r
+       ld      r22, Z          ;/\r
+       cpi     r22, ' '+1      ;if(r22 <= ' ') exit;\r
+       brcs    80f             ;/\r
+       cpi     r22, 'b'        ;if(r22 == 'b') {\r
+       brne    43f             ; r25 = 2;\r
+       ldi     r25, 2          ; cv_start;\r
+       rjmp    50f             ;}\r
+43:    cpi     r22, 'x'        ;if(r22 != 'x') error;\r
+       brne    51f             ;/\r
+       ldi     r25, 16         ;r25 = 16;\r
+\r
+50:    adiw    ZL, 1           ;Z++;\r
+       ld      r22, Z          ;r22 = *Z;\r
+51:    cpi     r22, ' '+1      ;if(r22 <= ' ') break;\r
+       brcs    80f             ;/\r
+       cpi     r22, 'a'        ;if(r22 >= 'a') r22 =- 0x20;\r
+       brcs    52f             ;\r
+       subi    r22, 0x20       ;/\r
+52:    subi    r22, '0'        ;if((r22 -= '0') < 0) error;\r
+       brcs    70f             ;/\r
+       cpi     r22, 10         ;if(r22 >= 10) {\r
+       brcs    53f             ; r22 -= 7;\r
+       subi    r22, 7          ; if(r22 < 10) \r
+       cpi     r22, 10         ;\r
+       brcs    70f             ;}\r
+53:    cp      r22, r25        ;if(r22 >= r25) error;\r
+       brcc    70f             ;/\r
+60:    ldi     r24, 33         ;r21:r18 *= r25;\r
+       sub     r23, r23        ;\r
+61:    brcc    62f             ;\r
+       add     r23, r25        ;\r
+62:    lsr     r23             ;\r
+       ror     r21             ;\r
+       ror     r20             ;\r
+       ror     r19             ;\r
+       ror     r18             ;\r
+       dec     r24             ;\r
+       brne    61b             ;/\r
+       add     r18, r22        ;r21:r18 += r22;\r
+       adc     r19, r24        ;\r
+       adc     r20, r24        ;\r
+       adc     r21, r24        ;/\r
+       rjmp    50b             ;repeat\r
+\r
+70:    ldi     r24, 0\r
+       rjmp    81f\r
+80:    ldi     r24, 1\r
+81:    brtc    82f\r
+       clr     r22\r
+       com     r18\r
+       com     r19\r
+       com     r20\r
+       com     r21\r
+       adc     r18, r22\r
+       adc     r19, r22\r
+       adc     r20, r22\r
+       adc     r21, r22\r
+82:    st      -X, ZH\r
+       st      -X, ZL\r
+       _MOVW   XH, XL, r1, r0\r
+       st      X+, r18\r
+       st      X+, r19\r
+       st      X+, r20\r
+       st      X+, r21\r
+       clr     r1\r
+       ret\r
+.endfunc\r
+#endif\r
+\r
+\r
diff --git a/common/avr/xprintf.h b/common/avr/xprintf.h
new file mode 100644 (file)
index 0000000..f58bca8
--- /dev/null
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------\r
+   Extended itoa, puts and printf                    (C)ChaN, 2011\r
+-----------------------------------------------------------------------------*/\r
+\r
+#ifndef XPRINTF_H\r
+#define XPRINTF_H\r
+\r
+#include <inttypes.h>\r
+#include <avr/pgmspace.h>\r
+\r
+extern void (*xfunc_out)(uint8_t);\r
+#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)\r
+\r
+/* This is a pointer to user defined output function. It must be initialized\r
+   before using this modle.\r
+*/\r
+\r
+void xputc(char chr);\r
+\r
+/* This is a stub function to forward outputs to user defined output function.\r
+   All outputs from this module are output via this function.\r
+*/\r
+\r
+\r
+/*-----------------------------------------------------------------------------*/\r
+void xputs(const char *string_p);\r
+\r
+/*  The string placed in the ROM is forwarded to xputc() directly.\r
+*/\r
+\r
+\r
+/*-----------------------------------------------------------------------------*/\r
+void xitoa(long value, char radix, char width);\r
+\r
+/* Extended itoa().\r
+\r
+      value  radix  width   output\r
+        100     10      6   "   100"\r
+        100     10     -6   "000100"\r
+        100     10      0   "100"\r
+ 4294967295     10      0   "4294967295"\r
+ 4294967295    -10      0   "-1"\r
+     655360     16     -8   "000A0000"\r
+       1024     16      0   "400"\r
+       0x55      2     -8   "01010101"\r
+*/\r
+\r
+\r
+/*-----------------------------------------------------------------------------*/\r
+#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)\r
+#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)\r
+#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)\r
+\r
+void __xprintf(const char *format_p, ...);     /* Send formatted string to the registered device */\r
+void __xsprintf(char*, const char *format_p, ...);     /* Put formatted string to the memory */\r
+void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */\r
+\r
+/* Format string is placed in the ROM. The format flags is similar to printf().\r
+\r
+   %[flag][width][size]type\r
+\r
+   flag\r
+     A '0' means filled with '0' when output is shorter than width.\r
+     ' ' is used in default. This is effective only numeral type.\r
+   width\r
+     Minimum width in decimal number. This is effective only numeral type.\r
+     Default width is zero.\r
+   size\r
+     A 'l' means the argument is long(32bit). Default is short(16bit).\r
+     This is effective only numeral type.\r
+   type\r
+     'c' : Character, argument is the value\r
+     's' : String placed on the RAM, argument is the pointer\r
+     'S' : String placed on the ROM, argument is the pointer\r
+     'd' : Signed decimal, argument is the value\r
+     'u' : Unsigned decimal, argument is the value\r
+     'X' : Hexdecimal, argument is the value\r
+     'b' : Binary, argument is the value\r
+     '%' : '%'\r
+\r
+*/\r
+\r
+\r
+/*-----------------------------------------------------------------------------*/\r
+char xatoi(char **str, long *ret);\r
+\r
+/* Get value of the numeral string. \r
+\r
+  str\r
+    Pointer to pointer to source string\r
+\r
+    "0b11001010" binary\r
+    "0377" octal\r
+    "0xff800" hexdecimal\r
+    "1250000" decimal\r
+    "-25000" decimal\r
+\r
+  ret\r
+    Pointer to return value\r
+*/\r
+\r
+#endif\r
+\r
diff --git a/common/bootloader.c b/common/bootloader.c
deleted file mode 100644 (file)
index cda295b..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <avr/wdt.h>
-#include <util/delay.h>
-#include "bootloader.h"
-
-#ifdef PROTOCOL_LUFA
-#include <LUFA/Drivers/USB/USB.h>
-#endif
-
-
-/* Boot Section Size in *BYTEs*
- *   Teensy   halfKay    512
- *   Teensy++ halfKay    1024
- *   Atmel DFU loader    4096
- *   LUFA bootloader     4096
- *   USBaspLoader        2048
- */
-#ifndef BOOTLOADER_SIZE
-#warning To use bootloader_jump() you need to define BOOTLOADER_SIZE in config.h.
-#define BOOTLOADER_SIZE     4096
-#endif
-
-#define FLASH_SIZE          (FLASHEND + 1L)
-#define BOOTLOADER_START    (FLASH_SIZE - BOOTLOADER_SIZE)
-
-
-/* 
- * Entering the Bootloader via Software 
- * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
- */
-#define BOOTLOADER_RESET_KEY 0xB007B007
-uint32_t reset_key  __attribute__ ((section (".noinit")));
-
-/* initialize MCU status by watchdog reset */
-void bootloader_jump(void) {
-#ifdef PROTOCOL_LUFA
-    USB_Disable();
-    cli();
-    _delay_ms(2000);
-#endif
-
-#ifdef PROTOCOL_PJRC
-    cli();
-    UDCON = 1;
-    USBCON = (1<<FRZCLK);
-    UCSR1B = 0;
-    _delay_ms(5);
-#endif
-
-    // watchdog reset
-    reset_key = BOOTLOADER_RESET_KEY;
-    wdt_enable(WDTO_250MS);
-    for (;;);
-}
-
-
-/* this runs before main() */
-void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
-void bootloader_jump_after_watchdog_reset(void)
-{
-    if ((MCUSR & (1<<WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
-        reset_key = 0;
-
-        // My custom USBasploader requires this to come up.
-        MCUSR = 0;
-
-        // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
-        MCUSR &= ~(1<<WDRF);
-        wdt_disable();
-
-        // This is compled into 'icall', address should be in word unit, not byte.
-        ((void (*)(void))(BOOTLOADER_START/2))();
-    }
-}
-
-
-#if 0
-/* Jumping To The Bootloader
- * http://www.pjrc.com/teensy/jump_to_bootloader.html
- * 
- * This method doen't work when using LUFA. idk why.
- * - needs to initialize more regisers or interrupt setting?
- */
-void bootloader_jump(void) {
-#ifdef PROTOCOL_LUFA
-    USB_Disable();
-    cli();
-    _delay_ms(2000);
-#endif
-
-#ifdef PROTOCOL_PJRC
-    cli();
-    UDCON = 1;
-    USBCON = (1<<FRZCLK);
-    UCSR1B = 0;
-    _delay_ms(5);
-#endif
-
-    /*
-     * Initialize
-     */
-#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
-
-    /*
-     * USBaspLoader
-     */
-#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
-
-    // This is compled into 'icall', address should be in word unit, not byte.
-    ((void (*)(void))(BOOTLOADER_START/2))();
-}
-#endif
index 642d5face42e18bcc79fc17ae172d4224a49f98d..b002a585622029f998a94adf8d95d2fa0ce7672b 100644 (file)
@@ -111,7 +111,7 @@ static bool scan_keycode(uint8_t keycode)
         matrix_row_t matrix_row = matrix_get_row(r);
         for (uint8_t c = 0; c < MATRIX_COLS; c++) {
             if (matrix_row & ((matrix_row_t)1<<c)) {
-                if (keycode == keymap_key_to_keycode(0, (key_t){ .row = r, .col = c })) {
+                if (keycode == keymap_key_to_keycode(0, (keypos_t){ .row = r, .col = c })) {
                     return true;
                 }
             }
index 8aaa5ed915e2b62a9ada6ff3b9e6b628cc21122c..26472c8fa3980725f8eea07e9568b3ee7eb749da 100644 (file)
@@ -19,44 +19,100 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define DEBUG_H 1
 
 #include "print.h"
-#include "debug_config.h"
 
 
+/* 
+ * Debug output control
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef union {
+    uint8_t raw;
+    struct {
+        bool enable:1;
+        bool matrix:1;
+        bool keyboard:1;
+        bool mouse:1;
+        uint8_t reserved:4;
+    };
+} debug_config_t;
+
+extern debug_config_t debug_config;
+debug_config_t debug_config  __attribute__ ((weak)) = {};
+
+#ifdef __cplusplus
+}
+#endif
+
+#define debug_enable    (debug_config.enable)
+#define debug_matrix    (debug_config.matrix)
+#define debug_keyboard  (debug_config.keyboard)
+#define debug_mouse     (debug_config.mouse)
+
+
+
+/*
+ * Debug print utils
+ */
 #ifndef NO_DEBUG
 
-#define dprint(s)           do { if (debug_enable) print(s); } while (0)
-#define dprintln()          do { if (debug_enable) print_crlf(); } while (0)
-#define dprintf(fmt, ...)   do { if (debug_enable) __xprintf(PSTR(fmt), ##__VA_ARGS__); } while (0)
-#define dmsg(s)             dprintf("%s at %s: %S\n", __FILE__, __LINE__, PSTR(s))
-
-/* DO NOT USE these anymore */
-#define debug(s)                  do { if (debug_enable) print(s); } while (0)
-#define debugln(s)                do { if (debug_enable) print_crlf(); } while (0)
-#define debug_S(s)                do { if (debug_enable) print_S(s); } while (0)
-#define debug_P(s)                do { if (debug_enable) print_P(s); } while (0)
-#define debug_msg(s)              do { \
+#define dprint(s)                   do { if (debug_enable) print(s); } while (0)
+#define dprintln(s)                 do { if (debug_enable) println(s); } while (0)
+#define dprintf(fmt, ...)           do { if (debug_enable) xprintf(fmt, ##__VA_ARGS__); } while (0)
+#define dmsg(s)                     dprintf("%s at %s: %S\n", __FILE__, __LINE__, PSTR(s))
+
+/* Deprecated. DO NOT USE these anymore, use dprintf instead. */
+#define debug(s)                    do { if (debug_enable) print(s); } while (0)
+#define debugln(s)                  do { if (debug_enable) println(s); } while (0)
+#define debug_msg(s)                do { \
     if (debug_enable) { \
         print(__FILE__); print(" at "); print_dec(__LINE__); print(" in "); print(": "); print(s); \
     } \
 } while (0)
-#define debug_dec(data)           do { if (debug_enable) print_dec(data); } while (0)
-#define debug_decs(data)          do { if (debug_enable) print_decs(data); } while (0)
-#define debug_hex4(data)          do { if (debug_enable) print_hex4(data); } while (0)
-#define debug_hex8(data)          do { if (debug_enable) print_hex8(data); } while (0)
-#define debug_hex16(data)         do { if (debug_enable) print_hex16(data); } while (0)
-#define debug_hex32(data)         do { if (debug_enable) print_hex32(data); } while (0)
-#define debug_bin8(data)          do { if (debug_enable) print_bin8(data); } while (0)
-#define debug_bin16(data)         do { if (debug_enable) print_bin16(data); } while (0)
-#define debug_bin32(data)         do { if (debug_enable) print_bin32(data); } while (0)
-#define debug_bin_reverse8(data)  do { if (debug_enable) print_bin_reverse8(data); } while (0)
-#define debug_bin_reverse16(data) do { if (debug_enable) print_bin_reverse16(data); } while (0)
-#define debug_bin_reverse32(data) do { if (debug_enable) print_bin_reverse32(data); } while (0)
-#define debug_hex(data)           debug_hex8(data)
-#define debug_bin(data)           debug_bin8(data)
-#define debug_bin_reverse(data)   debug_bin8(data)
+#define debug_dec(data)             do { if (debug_enable) print_dec(data); } while (0)
+#define debug_decs(data)            do { if (debug_enable) print_decs(data); } while (0)
+#define debug_hex4(data)            do { if (debug_enable) print_hex4(data); } while (0)
+#define debug_hex8(data)            do { if (debug_enable) print_hex8(data); } while (0)
+#define debug_hex16(data)           do { if (debug_enable) print_hex16(data); } while (0)
+#define debug_hex32(data)           do { if (debug_enable) print_hex32(data); } while (0)
+#define debug_bin8(data)            do { if (debug_enable) print_bin8(data); } while (0)
+#define debug_bin16(data)           do { if (debug_enable) print_bin16(data); } while (0)
+#define debug_bin32(data)           do { if (debug_enable) print_bin32(data); } while (0)
+#define debug_bin_reverse8(data)    do { if (debug_enable) print_bin_reverse8(data); } while (0)
+#define debug_bin_reverse16(data)   do { if (debug_enable) print_bin_reverse16(data); } while (0)
+#define debug_bin_reverse32(data)   do { if (debug_enable) print_bin_reverse32(data); } while (0)
+#define debug_hex(data)             debug_hex8(data)
+#define debug_bin(data)             debug_bin8(data)
+#define debug_bin_reverse(data)     debug_bin8(data)
 
 #else
-#include "nodebug.h"
+
+/* NO_DEBUG */
+#define dprint(s)
+#define dprintln(s)
+#define dprintf(fmt, ...)
+#define dmsg(s)
+#define debug(s)
+#define debugln(s)
+#define debug_msg(s)
+#define debug_dec(data)
+#define debug_decs(data)
+#define debug_hex4(data)
+#define debug_hex8(data)
+#define debug_hex16(data)
+#define debug_hex32(data)
+#define debug_bin8(data)
+#define debug_bin16(data)
+#define debug_bin32(data)
+#define debug_bin_reverse8(data)
+#define debug_bin_reverse16(data)
+#define debug_bin_reverse32(data)
+#define debug_hex(data)
+#define debug_bin(data)
+#define debug_bin_reverse(data)
+
 #endif
 
 #endif
diff --git a/common/debug_config.h b/common/debug_config.h
deleted file mode 100644 (file)
index e00fd10..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-Copyright 2013 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 DEBUG_CONFIG_H
-#define DEBUG_CONFIG_H 1
-
-#include <stdbool.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* NOTE: Not portable. Bit field order depends on implementation */
-typedef union {
-    uint8_t raw;
-    struct {
-        bool enable:1;
-        bool matrix:1;
-        bool keyboard:1;
-        bool mouse:1;
-        uint8_t reserved:4;
-    };
-} debug_config_t;
-debug_config_t debug_config;
-
-/* for backward compatibility */
-#define debug_enable    (debug_config.enable)
-#define debug_matrix    (debug_config.matrix)
-#define debug_keyboard  (debug_config.keyboard)
-#define debug_mouse     (debug_config.mouse)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/common/eeconfig.c b/common/eeconfig.c
deleted file mode 100644 (file)
index 5bd47dc..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/eeprom.h>
-#include "eeconfig.h"
-
-void eeconfig_init(void)
-{
-    eeprom_write_word(EECONFIG_MAGIC,          EECONFIG_MAGIC_NUMBER);
-    eeprom_write_byte(EECONFIG_DEBUG,          0);
-    eeprom_write_byte(EECONFIG_DEFAULT_LAYER,  0);
-    eeprom_write_byte(EECONFIG_KEYMAP,         0);
-    eeprom_write_byte(EECONFIG_MOUSEKEY_ACCEL, 0);
-#ifdef BACKLIGHT_ENABLE
-    eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
-#endif
-}
-
-void eeconfig_enable(void)
-{
-    eeprom_write_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
-}
-
-void eeconfig_disable(void)
-{
-    eeprom_write_word(EECONFIG_MAGIC, 0xFFFF);
-}
-
-bool eeconfig_is_enabled(void)
-{
-    return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
-}
-
-uint8_t eeconfig_read_debug(void)      { return eeprom_read_byte(EECONFIG_DEBUG); }
-void eeconfig_write_debug(uint8_t val) { eeprom_write_byte(EECONFIG_DEBUG, val); }
-
-uint8_t eeconfig_read_default_layer(void)      { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); }
-void eeconfig_write_default_layer(uint8_t val) { eeprom_write_byte(EECONFIG_DEFAULT_LAYER, val); }
-
-uint8_t eeconfig_read_keymap(void)      { return eeprom_read_byte(EECONFIG_KEYMAP); }
-void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val); }
-
-#ifdef BACKLIGHT_ENABLE
-uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
-void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
-#endif
index 2e56971bddb6a9abca480f3d7764a0b0585dc136..e9b791670670eed07b9956495c1fc38dde989bab 100644 (file)
@@ -16,7 +16,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <stdint.h>
-#include <avr/interrupt.h>
+//#include <avr/interrupt.h>
 #include "keycode.h"
 #include "host.h"
 #include "util.h"
@@ -55,7 +55,7 @@ void host_keyboard_send(report_keyboard_t *report)
 
     if (debug_keyboard) {
         dprint("keyboard_report: ");
-        for (uint8_t i = 0; i < REPORT_SIZE; i++) {
+        for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
             dprintf("%02X ", report->raw[i]);
         }
         dprint("\n");
index a56e6c3b04f05d115eb8d408213c7fbc86f6b445..918af69e8f41242083912519d9486b16f758572a 100644 (file)
@@ -32,8 +32,8 @@ extern "C" {
 extern bool keyboard_nkro;
 #endif
 
-uint8_t keyboard_idle;
-uint8_t keyboard_protocol;
+extern uint8_t keyboard_idle;
+extern uint8_t keyboard_protocol;
 
 
 /* host driver */
index 2b66f20a013e4c0389d74b422d00c870b41336ab..9a809ff4a153dbfca52f1a248cb9e001e26cfd06 100644 (file)
@@ -15,7 +15,6 @@ 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 <stdint.h>
-#include <util/delay.h>
 #include "keyboard.h"
 #include "matrix.h"
 #include "keymap.h"
@@ -100,7 +99,7 @@ void keyboard_task(void)
             for (uint8_t c = 0; c < MATRIX_COLS; c++) {
                 if (matrix_change & ((matrix_row_t)1<<c)) {
                     action_exec((keyevent_t){
-                        .key = (key_t){ .row = r, .col = c },
+                        .key = (keypos_t){ .row = r, .col = c },
                         .pressed = (matrix_row & ((matrix_row_t)1<<c)),
                         .time = (timer_read() | 1) /* time should not be 0 */
                     });
index d1a922420b8483e01c6f50eedfcae4c83e96b711..60f8a89d1d3a5703fe686286aaed8b3cc6d50338 100644 (file)
@@ -30,16 +30,16 @@ extern "C" {
 typedef struct {
     uint8_t col;
     uint8_t row;
-} key_t;
+} keypos_t;
 
 /* key event */
 typedef struct {
-    key_t    key;
+    keypos_t key;
     bool     pressed;
     uint16_t time;
 } keyevent_t;
 
-/* equivalent test of key_t */
+/* equivalent test of keypos_t */
 #define KEYEQ(keya, keyb)       ((keya).row == (keyb).row && (keya).col == (keyb).col)
 
 /* Rules for No Event:
@@ -52,7 +52,7 @@ static inline bool IS_RELEASED(keyevent_t event) { return (!IS_NOEVENT(event) &&
 
 /* Tick event */
 #define TICK                    (keyevent_t){           \
-    .key = (key_t){ .row = 255, .col = 255 },           \
+    .key = (keypos_t){ .row = 255, .col = 255 },           \
     .pressed = false,                                   \
     .time = (timer_read() | 1)                          \
 }
index bfb8ffac1a593b1cd06a6364db4ce3c2f151df31..4c0b61b8c118cb17d719e82f2149ee158720bc79 100644 (file)
@@ -14,7 +14,6 @@ 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/pgmspace.h>
 #include "keymap.h"
 #include "report.h"
 #include "keycode.h"
@@ -28,7 +27,7 @@ static action_t keycode_to_action(uint8_t keycode);
 
 
 /* converts key to action */
-action_t action_for_key(uint8_t layer, key_t key)
+action_t action_for_key(uint8_t layer, keypos_t key)
 {
     uint8_t keycode = keymap_key_to_keycode(layer, key);
     switch (keycode) {
@@ -156,7 +155,7 @@ static action_t keycode_to_action(uint8_t keycode)
  *      Consider using new keymap API instead.
  */
 __attribute__ ((weak))
-uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
+uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
 {
     return keymap_get_keycode(layer, key.row, key.col);
 }
index 4c3019a364c2dfad5b6194409bf1bacfb71c3a64..e1a6f992e64cf47e0201790ddce1b8f069c6c06a 100644 (file)
@@ -43,7 +43,7 @@ keymap_config_t keymap_config;
 
 
 /* translates key to keycode */
-uint8_t keymap_key_to_keycode(uint8_t layer, key_t key);
+uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
 
 /* translates Fn keycode to action */
 action_t keymap_fn_to_action(uint8_t keycode);
diff --git a/common/mbed/bootloader.c b/common/mbed/bootloader.c
new file mode 100644 (file)
index 0000000..b51e839
--- /dev/null
@@ -0,0 +1,4 @@
+#include "bootloader.h"
+
+
+void bootloader_jump(void) {}
diff --git a/common/mbed/suspend.c b/common/mbed/suspend.c
new file mode 100644 (file)
index 0000000..3265157
--- /dev/null
@@ -0,0 +1,6 @@
+#include <stdbool.h>
+
+
+void suspend_power_down(void) {}
+bool suspend_wakeup_condition(void) { return true; }
+void suspend_wakeup_init(void) {}
diff --git a/common/mbed/timer.c b/common/mbed/timer.c
new file mode 100644 (file)
index 0000000..c357ceb
--- /dev/null
@@ -0,0 +1,41 @@
+#include "cmsis.h"
+#include "timer.h"
+
+/* Mill second tick count */
+volatile uint32_t timer_count = 0;
+
+/* Timer interrupt handler */
+void SysTick_Handler(void)  {
+    timer_count++;
+}
+
+void timer_init(void)
+{
+    timer_count = 0;
+    SysTick_Config(SystemCoreClock / 1000); /* 1ms tick */
+}
+
+void timer_clear(void)
+{
+    timer_count = 0;
+}
+
+uint16_t timer_read(void)
+{
+    return (uint16_t)(timer_count & 0xFFFF);
+}
+
+uint32_t timer_read32(void)
+{
+    return timer_count;
+}
+
+uint16_t timer_elapsed(uint16_t last)
+{
+    return TIMER_DIFF_16(timer_read(), last);
+}
+
+uint32_t timer_elapsed32(uint32_t last)
+{
+    return TIMER_DIFF_32(timer_read32(), last);
+}
diff --git a/common/mbed/xprintf.cpp b/common/mbed/xprintf.cpp
new file mode 100644 (file)
index 0000000..4342b79
--- /dev/null
@@ -0,0 +1,46 @@
+#include <cstdarg>
+//#include <stdarg.h>
+#include "mbed.h"
+#include "mbed/xprintf.h"
+
+
+#define STRING_STACK_LIMIT    120
+
+/* mbed Serial */
+Serial ser(UART_TX, UART_RX);
+
+/* TODO: Need small implementation for embedded */
+int xprintf(const char* format, ...)
+{
+    /* copy from mbed/common/RawSerial.cpp */
+    std::va_list arg;
+    va_start(arg, format);
+    int len = vsnprintf(NULL, 0, format, arg);
+    if (len < STRING_STACK_LIMIT) {
+        char temp[STRING_STACK_LIMIT];
+        vsprintf(temp, format, arg);
+        ser.puts(temp);
+    } else {
+        char *temp = new char[len + 1];
+        vsprintf(temp, format, arg);
+        ser.puts(temp);
+        delete[] temp;
+    }
+    va_end(arg);
+    return len;
+
+/* Fail: __builtin_va_arg_pack?
+ * https://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Constructing-Calls.html#Constructing-Calls
+    void *arg = __builtin_apply_args();
+    void *ret = __builtin_apply((void*)(&(ser.printf)), arg, 100);
+    __builtin_return(ret)
+*/
+/* Fail: varargs can not be passed to printf
+    //int r = ser.printf("test %i\r\n", 123);
+    va_list arg;
+    va_start(arg, format);
+    int r = ser.printf(format, arg);
+    va_end(arg);
+    return r;
+*/
+}
diff --git a/common/mbed/xprintf.h b/common/mbed/xprintf.h
new file mode 100644 (file)
index 0000000..26bc529
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef XPRINTF_H
+#define XPRINTF_H
+
+//#define xprintf(format, ...)            __xprintf(format, ##__VA_ARGS__)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int xprintf(const char *format, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
index 017be94116f3792cf67561b884d7f3566f9e397f..23469476e264fd8bacdc56682dcf2e23c5a84c2b 100644 (file)
@@ -16,7 +16,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <stdint.h>
-#include <util/delay.h>
 #include "keycode.h"
 #include "host.h"
 #include "timer.h"
index d8d7beaaa3a5f4eda23c386f40be8c22fde62eaf..6eede06b442eccdcb2d5ff21002ac3410e4fc2e2 100644 (file)
@@ -52,12 +52,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #endif
 
 
-uint8_t mk_delay;
-uint8_t mk_interval;
-uint8_t mk_max_speed;
-uint8_t mk_time_to_max;
-uint8_t mk_wheel_max_speed;
-uint8_t mk_wheel_time_to_max;
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern uint8_t mk_delay;
+extern uint8_t mk_interval;
+extern uint8_t mk_max_speed;
+extern uint8_t mk_time_to_max;
+extern uint8_t mk_wheel_max_speed;
+extern uint8_t mk_wheel_time_to_max;
 
 
 void mousekey_task(void);
@@ -66,4 +70,8 @@ void mousekey_off(uint8_t code);
 void mousekey_clear(void);
 void mousekey_send(void);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
index aec790bbc15c5f4f5f3cdff3c8ddcc17e88fc787..93309ada4761f356ee82b7bba2b3871ad7a236dc 100644 (file)
@@ -18,32 +18,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef NODEBUG_H
 #define NODEBUG_H 1
 
-#include "debug_config.h"
-
-#define dprint(s)
-#define dprintln(s)
-#define dprintf(fmt, ...)
-#define dmsg(s)
-
-#define debug(s)
-#define debugln(s)
-#define debug_S(s)
-#define debug_P(s)
-#define debug_msg(s)
-#define debug_dec(data)
-#define debug_decs(data)
-#define debug_hex4(data)
-#define debug_hex8(data)
-#define debug_hex16(data)
-#define debug_hex32(data)
-#define debug_bin8(data)
-#define debug_bin16(data)
-#define debug_bin32(data)
-#define debug_bin_reverse8(data)
-#define debug_bin_reverse16(data)
-#define debug_bin_reverse32(data)
-#define debug_hex(data)
-#define debug_bin(data)
-#define debug_bin_reverse(data)
+#define NO_DEBUG
+#include "debug.h"
+#undef NO_DEBUG
 
 #endif
index 783bb4e9bb676a39b979be1405988b2e99991ce6..c13a29f3170d57799bf594c3511ee02b4f924217 100644 (file)
@@ -37,26 +37,4 @@ void print_set_sendchar(int8_t (*sendchar_func)(uint8_t))
     xdev_out(sendchar_func);
 }
 
-void print_S(const char *s)
-{
-    uint8_t c;
-    while (1) {
-        c = *s++;
-        if (!c) break;
-        if (c == '\n') sendchar('\r');
-        sendchar(c);
-    }
-}
-
-void print_lf(void)
-{
-    sendchar('\n');
-}
-
-void print_crlf(void)
-{
-    sendchar('\r');
-    sendchar('\n');
-}
-
 #endif
index 930e84be99d555871aec946f27cf2c49f909eb76..a8dbbc020abc5610bc769b4dfb5e1123f6b57f93 100644 (file)
 
 #include <stdint.h>
 #include <stdbool.h>
-#include <avr/pgmspace.h>
-#include "xprintf.h"
 #include "util.h"
 
 
-// this macro allows you to write print("some text") and
-// the string is automatically placed into flash memory :)
-// TODO: avoid collision with arduino/Print.h
-#ifndef __cplusplus
-#define print(s)                print_P(PSTR(s))
-#endif
-#define println(s)              print_P(PSTR(s "\n"))
 
-/* for old name */
-#define pdec(data)              print_dec(data)
-#define pdec16(data)            print_dec(data)
-#define phex(data)              print_hex8(data)
-#define phex16(data)            print_hex16(data)
-#define pbin(data)              print_bin8(data)
-#define pbin16(data)            print_bin16(data)
-#define pbin_reverse(data)      print_bin_reverse8(data)
-#define pbin_reverse16(data)    print_bin_reverse16(data)
 
-/* print value utility */
-#define print_val_dec(v)           xprintf(#v ": %u\n", v)
-#define print_val_decs(v)          xprintf(#v ": %d\n", v)
-#define print_val_hex8(v)          xprintf(#v ": %X\n", v)
-#define print_val_hex16(v)         xprintf(#v ": %02X\n", v)
-#define print_val_hex32(v)         xprintf(#v ": %04lX\n", v)
-#define print_val_bin8(v)          xprintf(#v ": %08b\n", v)
-#define print_val_bin16(v)         xprintf(#v ": %016b\n", v)
-#define print_val_bin32(v)         xprintf(#v ": %032lb\n", v)
-#define print_val_bin_reverse8(v)  xprintf(#v ": %08b\n", bitrev(v))
-#define print_val_bin_reverse16(v) xprintf(#v ": %016b\n", bitrev16(v))
-#define print_val_bin_reverse32(v) xprintf(#v ": %032lb\n", bitrev32(v))
+#ifndef NO_PRINT
 
 
+#if defined(__AVR__)
 
-#ifndef NO_PRINT
+#include "avr/xprintf.h"
 
-#ifdef __cplusplus
-extern "C" {
+
+// TODO: avoid collision with arduino/Print.h
+#ifndef __cplusplus
+#define print(s)    xputs(PSTR(s))
 #endif
+#define println(s)  xputs(PSTR(s "\r\n"))
 
+#ifdef __cplusplus
+extern "C"
+#endif
 /* function pointer of sendchar to be used by print utility */
 void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 
-/* print string stored in data memory(SRAM)
- *     print_S("hello world");
- * This consumes precious SRAM memory space for string.
- */
-void print_S(const char *s);
+#elif defined(__arm__)
 
-void print_lf(void);
-void print_crlf(void);
+#include "mbed/xprintf.h"
 
+#define print(s)    xprintf(s)
+#define println(s)  xprintf(s "\r\n")
 
-/* print string stored in program memory(FLASH)
- *     print_P(PSTR("hello world");
- * This consumes relatively abundant FLASH memory area not SRAM.
- */
-#define print_P(s)          xputs(s)
+/* TODO: to select output destinations: UART/USBSerial */
+#define print_set_sendchar(func)
 
-/* decimal */
-#define print_dec(i)        xprintf("%u", i)
-#define print_decs(i)       xprintf("%d", i)
+#endif /* __AVR__ */
 
-/* hex */
-#define print_hex4(i)       xprintf("%X", i)
-#define print_hex8(i)       xprintf("%02X", i)
-#define print_hex16(i)      xprintf("%04X", i)
-#define print_hex32(i)      xprintf("%08lX", i)
 
+/* decimal */
+#define print_dec(i)                xprintf("%u", i)
+#define print_decs(i)               xprintf("%d", i)
+/* hex */
+#define print_hex4(i)               xprintf("%X", i)
+#define print_hex8(i)               xprintf("%02X", i)
+#define print_hex16(i)              xprintf("%04X", i)
+#define print_hex32(i)              xprintf("%08lX", i)
 /* binary */
-#define print_bin4(i)       xprintf("%04b", i)
-#define print_bin8(i)       xprintf("%08b", i)
-#define print_bin16(i)      xprintf("%016b", i)
-#define print_bin32(i)      xprintf("%032lb", i)
-
-#define print_bin_reverse8(i)   xprintf("%08b", bitrev(i))
-#define print_bin_reverse16(i)  xprintf("%016b", bitrev16(i))
-#define print_bin_reverse32(i)  xprintf("%032lb", bitrev32(i))
-
-#ifdef __cplusplus
-}
-#endif
-
-#else
-
+#define print_bin4(i)               xprintf("%04b", i)
+#define print_bin8(i)               xprintf("%08b", i)
+#define print_bin16(i)              xprintf("%016b", i)
+#define print_bin32(i)              xprintf("%032lb", i)
+#define print_bin_reverse8(i)       xprintf("%08b", bitrev(i))
+#define print_bin_reverse16(i)      xprintf("%016b", bitrev16(i))
+#define print_bin_reverse32(i)      xprintf("%032lb", bitrev32(i))
+/* print value utility */
+#define print_val_dec(v)            xprintf(#v ": %u\n", v)
+#define print_val_decs(v)           xprintf(#v ": %d\n", v)
+#define print_val_hex8(v)           xprintf(#v ": %X\n", v)
+#define print_val_hex16(v)          xprintf(#v ": %02X\n", v)
+#define print_val_hex32(v)          xprintf(#v ": %04lX\n", v)
+#define print_val_bin8(v)           xprintf(#v ": %08b\n", v)
+#define print_val_bin16(v)          xprintf(#v ": %016b\n", v)
+#define print_val_bin32(v)          xprintf(#v ": %032lb\n", v)
+#define print_val_bin_reverse8(v)   xprintf(#v ": %08b\n", bitrev(v))
+#define print_val_bin_reverse16(v)  xprintf(#v ": %016b\n", bitrev16(v))
+#define print_val_bin_reverse32(v)  xprintf(#v ": %032lb\n", bitrev32(v))
+
+#else   /* NO_PRINT */
+
+#define xprintf
+#define print
+#define println
 #define print_set_sendchar(func)
-#define print_S(s)
-#define print_P(s)
 #define print_dec(data)
 #define print_decs(data)
 #define print_hex4(data)
@@ -132,8 +113,30 @@ void print_crlf(void);
 #define print_bin_reverse8(data)
 #define print_bin_reverse16(data)
 #define print_bin_reverse32(data)
-
-#endif
+#define print_val_dec(v)
+#define print_val_decs(v)
+#define print_val_hex8(v)
+#define print_val_hex16(v)
+#define print_val_hex32(v)
+#define print_val_bin8(v)
+#define print_val_bin16(v)
+#define print_val_bin32(v)
+#define print_val_bin_reverse8(v)
+#define print_val_bin_reverse16(v)
+#define print_val_bin_reverse32(v)
+
+#endif  /* NO_PRINT */
+
+
+/* Backward compatiblitly for old name */
+#define pdec(data)              print_dec(data)
+#define pdec16(data)            print_dec(data)
+#define phex(data)              print_hex8(data)
+#define phex16(data)            print_hex16(data)
+#define pbin(data)              print_bin8(data)
+#define pbin16(data)            print_bin16(data)
+#define pbin_reverse(data)      print_bin_reverse8(data)
+#define pbin_reverse16(data)    print_bin_reverse16(data)
 
 
 #endif
diff --git a/common/progmem.h b/common/progmem.h
new file mode 100644 (file)
index 0000000..199b1be
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef PROGMEM_H
+#define PROGMEM_H 1
+
+#if defined(__AVR__)
+#   include <avr/pgmspace.h>
+#elif defined(__arm__)
+#   define PROGMEM
+#   define pgm_read_byte(p)     *(p)
+#   define pgm_read_word(p)     *(p)
+#endif
+
+#endif
index 71543cc23fa341ad77c2453913e6d0f9b4b34224..62190469a42bbd10d1c2ee82a26c4fb6a84d8293 100644 (file)
@@ -74,19 +74,19 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* key report size(NKRO or boot mode) */
 #if defined(PROTOCOL_PJRC) && defined(NKRO_ENABLE)
 #   include "usb.h"
-#   define REPORT_SIZE KBD2_SIZE
-#   define REPORT_KEYS (KBD2_SIZE - 2)
-#   define REPORT_BITS (KBD2_SIZE - 1)
+#   define KEYBOARD_REPORT_SIZE KBD2_SIZE
+#   define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2)
+#   define KEYBOARD_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)
+#   define KEYBOARD_REPORT_SIZE NKRO_EPSIZE
+#   define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2)
+#   define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1)
 
 #else
-#   define REPORT_SIZE 8
-#   define REPORT_KEYS 6
+#   define KEYBOARD_REPORT_SIZE 8
+#   define KEYBOARD_REPORT_KEYS 6
 #endif
 
 
@@ -115,16 +115,16 @@ extern "C" {
  *
  */
 typedef union {
-    uint8_t raw[REPORT_SIZE];
+    uint8_t raw[KEYBOARD_REPORT_SIZE];
     struct {
         uint8_t mods;
         uint8_t reserved;
-        uint8_t keys[REPORT_KEYS];
+        uint8_t keys[KEYBOARD_REPORT_KEYS];
     };
 #ifdef NKRO_ENABLE
     struct {
         uint8_t mods;
-        uint8_t bits[REPORT_BITS];
+        uint8_t bits[KEYBOARD_REPORT_BITS];
     } nkro;
 #endif
 } __attribute__ ((packed)) report_keyboard_t;
diff --git a/common/suspend.c b/common/suspend.c
deleted file mode 100644 (file)
index 5b37889..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "suspend.h"
-#include "matrix.h"
-#include "action.h"
-#include "backlight.h"
-
-
-void suspend_power_down(void)
-{
-#ifdef BACKLIGHT_ENABLE
-    backlight_set(0);
-#endif
-#ifndef NO_SUSPEND_POWER_DOWN
-    // Enable watchdog to wake from MCU sleep
-    cli();
-    wdt_reset();
-
-    // Watchdog Interrupt and System Reset Mode
-    //wdt_enable(WDTO_1S);
-    //WDTCSR |= _BV(WDIE);
-    
-    // Watchdog Interrupt Mode
-    wdt_intr_enable(WDTO_120MS);
-    
-    // TODO: more power saving
-    // See PicoPower application note
-    // - I/O port input with pullup
-    // - prescale clock
-    // - BOD disable
-    // - Power Reduction Register PRR
-    // sleep in power down mode
-    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
-    sleep_enable();
-    sei();
-    sleep_cpu();
-    sleep_disable();
-
-    // Disable watchdog after sleep
-    wdt_disable();
-#endif
-}
-
-bool suspend_wakeup_condition(void)
-{
-    matrix_scan();
-    for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
-        if (matrix_get_row(r)) return true;
-    }
-    return false;
-}
-
-// run immediately after wakeup
-void suspend_wakeup_init(void)
-{
-    // clear keyboard state
-    clear_keyboard();
-#ifdef BACKLIGHT_ENABLE
-    backlight_init();
-#endif
-}
-
-#ifndef NO_SUSPEND_POWER_DOWN
-/* watchdog timeout */
-ISR(WDT_vect)
-{
-    /* wakeup from MCU sleep mode */
-/*
-    // blink LED
-    static uint8_t led_state = 0;
-    static uint8_t led_count = 0;
-    led_count++;
-    if ((led_count & 0x07) == 0) {
-        led_set((led_state ^= (1<<USB_LED_CAPS_LOCK)));
-    }
-*/
-}
-#endif
index 1c1e41ac3e2e57fa42f660e5e587295584656c65..9b76f280d1f182f9c649fd2df07731fb70b3b2cd 100644 (file)
@@ -3,26 +3,6 @@
 
 #include <stdint.h>
 #include <stdbool.h>
-#include <avr/sleep.h>
-#include <avr/wdt.h>
-#include <avr/interrupt.h>
-
-
-#define wdt_intr_enable(value)   \
-__asm__ __volatile__ (  \
-    "in __tmp_reg__,__SREG__" "\n\t"    \
-    "cli" "\n\t"    \
-    "wdr" "\n\t"    \
-    "sts %0,%1" "\n\t"  \
-    "out __SREG__,__tmp_reg__" "\n\t"   \
-    "sts %0,%2" "\n\t" \
-    : /* no outputs */  \
-    : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
-    "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
-    "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
-        _BV(WDIE) | (value & 0x07)) ) \
-    : "r0"  \
-)
 
 
 void suspend_power_down(void);
diff --git a/common/timer.c b/common/timer.c
deleted file mode 100644 (file)
index e0dec6c..0000000
+++ /dev/null
@@ -1,116 +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 <stdint.h>
-#include "timer.h"
-
-
-// counter resolution 1ms
-// NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
-volatile uint32_t timer_count = 0;
-
-void timer_init(void)
-{
-    // Timer0 CTC mode
-    TCCR0A = 0x02;
-
-#if TIMER_PRESCALER == 1
-    TCCR0B = 0x01;
-#elif TIMER_PRESCALER == 8
-    TCCR0B = 0x02;
-#elif TIMER_PRESCALER == 64
-    TCCR0B = 0x03;
-#elif TIMER_PRESCALER == 256
-    TCCR0B = 0x04;
-#elif TIMER_PRESCALER == 1024
-    TCCR0B = 0x05;
-#else
-#   error "Timer prescaler value is NOT vaild."
-#endif
-
-    OCR0A = TIMER_RAW_TOP;
-    TIMSK0 = (1<<OCIE0A);
-}
-
-inline
-void timer_clear(void)
-{
-    uint8_t sreg = SREG;
-    cli();
-    timer_count = 0;
-    SREG = sreg;
-}
-
-inline
-uint16_t timer_read(void)
-{
-    uint32_t t;
-
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
-
-    return (t & 0xFFFF);
-}
-
-inline
-uint32_t timer_read32(void)
-{
-    uint32_t t;
-
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
-
-    return t;
-}
-
-inline
-uint16_t timer_elapsed(uint16_t last)
-{
-    uint32_t t;
-
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
-
-    return TIMER_DIFF_16((t & 0xFFFF), last);
-}
-
-inline
-uint32_t timer_elapsed32(uint32_t last)
-{
-    uint32_t t;
-
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
-
-    return TIMER_DIFF_32(t, last);
-}
-
-// excecuted once per 1ms.(excess for just timer count?)
-ISR(TIMER0_COMPA_vect)
-{
-    timer_count++;
-}
index 6437473ff772051ab3f5208bbb319e43d493b9f2..f0c5ffc98ae6a4ebbf8995aa69ff5f84076e2b65 100644 (file)
@@ -20,25 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdint.h>
 
-#ifndef TIMER_PRESCALER
-#   if F_CPU > 16000000
-#       define TIMER_PRESCALER      256
-#   elif F_CPU > 2000000
-#       define TIMER_PRESCALER      64
-#   elif F_CPU > 250000
-#       define TIMER_PRESCALER      8
-#   else
-#       define TIMER_PRESCALER      1
-#   endif
-#endif
-#define TIMER_RAW_FREQ      (F_CPU/TIMER_PRESCALER)
-#define TIMER_RAW           TCNT0
-#define TIMER_RAW_TOP       (TIMER_RAW_FREQ/1000)
-
-#if (TIMER_RAW_TOP > 255)
-#   error "Timer0 can't count 1ms at this clock freq. Use larger prescaler."
-#endif
-
 #define TIMER_DIFF(a, b, max)   ((a) >= (b) ?  (a) - (b) : (max) - (b) + (a))
 #define TIMER_DIFF_8(a, b)      TIMER_DIFF(a, b, UINT8_MAX)
 #define TIMER_DIFF_16(a, b)     TIMER_DIFF(a, b, UINT16_MAX)
diff --git a/common/wait.h b/common/wait.h
new file mode 100644 (file)
index 0000000..40d00b0
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef WAIT_H
+#define WAIT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__AVR__)
+#   include <util/delay.h>
+#   define wait_ms(ms)  _delay_ms(ms)
+#   define wait_us(us)  _delay_us(us)
+#elif defined(__arm__)
+#   include "wait_api.h"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/common/xprintf.S b/common/xprintf.S
deleted file mode 100644 (file)
index 0cec70c..0000000
+++ /dev/null
@@ -1,500 +0,0 @@
-;---------------------------------------------------------------------------;\r
-; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011\r
-;---------------------------------------------------------------------------;\r
-\r
-                               // Base size is 152 bytes\r
-#define        CR_CRLF         0       // Convert \n to \r\n (+10 bytes)\r
-#define USE_XPRINTF    1       // Enable xprintf function (+194 bytes)\r
-#define USE_XSPRINTF   0       // Add xsprintf function (+78 bytes)\r
-#define USE_XFPRINTF   0       // Add xfprintf function (+54 bytes)\r
-#define USE_XATOI      0       // Enable xatoi function (+182 bytes)\r
-\r
-\r
-#if FLASHEND > 0x1FFFF\r
-#error xitoa module does not support 256K devices\r
-#endif\r
-\r
-.nolist\r
-#include <avr/io.h>    // Include device specific definitions.\r
-.list\r
-\r
-#ifdef SPM_PAGESIZE    // Recent devices have "lpm Rd,Z+" and "movw".\r
-.macro _LPMI   reg\r
-       lpm     \reg, Z+\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       movw    \dl, \sl\r
-.endm\r
-#else                  // Earlier devices do not have "lpm Rd,Z+" nor "movw".\r
-.macro _LPMI   reg\r
-       lpm\r
-       mov     \reg, r0\r
-       adiw    ZL, 1\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       mov     \dl, \sl\r
-       mov     \dh, \sh\r
-.endm\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Stub function to forward to user output function\r
-;\r
-;Prototype: void xputc (char chr       // a character to be output\r
-;                      );\r
-;Size: 12/12 words\r
-\r
-.section .bss\r
-.global xfunc_out      ; xfunc_out must be initialized before using this module.\r
-xfunc_out:     .ds.w   1\r
-.section .text\r
-\r
-\r
-.func xputc\r
-.global xputc\r
-xputc:\r
-#if CR_CRLF\r
-       cpi     r24, 10         ;LF --> CRLF\r
-       brne    1f              ;\r
-       ldi     r24, 13         ;\r
-       rcall   1f              ;\r
-       ldi     r24, 10         ;/\r
-1:\r
-#endif\r
-       push    ZH\r
-       push    ZL\r
-       lds     ZL, xfunc_out+0 ;Pointer to the registered output function.\r
-       lds     ZH, xfunc_out+1 ;/\r
-       sbiw    ZL, 0           ;Skip if null\r
-       breq    2f              ;/\r
-       icall\r
-2:     pop     ZL\r
-       pop     ZH\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Direct ROM string output\r
-;\r
-;Prototype: void xputs (const char *str_p // rom string to be output\r
-;                      );\r
-\r
-.func xputs\r
-.global xputs\r
-xputs:\r
-       _MOVW   ZH,ZL, r25,r24  ; Z = pointer to rom string\r
-1:     _LPMI   r24\r
-       cpi     r24, 0\r
-       breq    2f\r
-       rcall   xputc\r
-       rjmp    1b\r
-2:     ret\r
-.endfunc\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Extended direct numeral string output (32bit version)\r
-;\r
-;Prototype: void xitoa (long value,    // value to be output\r
-;                       char radix,    // radix\r
-;                       char width);   // minimum width\r
-;\r
-\r
-.func xitoa\r
-.global xitoa\r
-xitoa:\r
-                               ;r25:r22 = value, r20 = base, r18 = digits\r
-       clr     r31             ;r31 = stack level\r
-       ldi     r30, ' '        ;r30 = sign\r
-       ldi     r19, ' '        ;r19 = filler\r
-       sbrs    r20, 7          ;When base indicates signd format and the value\r
-       rjmp    0f              ;is minus, add a '-'.\r
-       neg     r20             ;\r
-       sbrs    r25, 7          ;\r
-       rjmp    0f              ;\r
-       ldi     r30, '-'        ;\r
-       com     r22             ;\r
-       com     r23             ;\r
-       com     r24             ;\r
-       com     r25             ;\r
-       adc     r22, r1         ;\r
-       adc     r23, r1         ;\r
-       adc     r24, r1         ;\r
-       adc     r25, r1         ;/\r
-0:     sbrs    r18, 7          ;When digits indicates zero filled,\r
-       rjmp    1f              ;filler is '0'.\r
-       neg     r18             ;\r
-       ldi     r19, '0'        ;/\r
-                               ;----- string conversion loop\r
-1:     ldi     r21, 32         ;r26 = r25:r22 % r20\r
-       clr     r26             ;r25:r22 /= r20\r
-2:     lsl     r22             ;\r
-       rol     r23             ;\r
-       rol     r24             ;\r
-       rol     r25             ;\r
-       rol     r26             ;\r
-       cp      r26, r20        ;\r
-       brcs    3f              ;\r
-       sub     r26, r20        ;\r
-       inc     r22             ;\r
-3:     dec     r21             ;\r
-       brne    2b              ;/\r
-       cpi     r26, 10         ;r26 is a numeral digit '0'-'F'\r
-       brcs    4f              ;\r
-       subi    r26, -7         ;\r
-4:     subi    r26, -'0'       ;/\r
-       push    r26             ;Stack it\r
-       inc     r31             ;/\r
-       cp      r22, r1         ;Repeat until r25:r22 gets zero\r
-       cpc     r23, r1         ;\r
-       cpc     r24, r1         ;\r
-       cpc     r25, r1         ;\r
-       brne    1b              ;/\r
-\r
-       cpi     r30, '-'        ;Minus sign if needed\r
-       brne    5f              ;\r
-       push    r30             ;\r
-       inc     r31             ;/\r
-5:     cp      r31, r18        ;Filler\r
-       brcc    6f              ;\r
-       push    r19             ;\r
-       inc     r31             ;\r
-       rjmp    5b              ;/\r
-\r
-6:     pop     r24             ;Flush stacked digits and exit\r
-       rcall   xputc           ;\r
-       dec     r31             ;\r
-       brne    6b              ;/\r
-\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Formatted string output (16/32bit version)\r
-;\r
-;Prototype:\r
-; void __xprintf (const char *format_p, ...);\r
-; void __xsprintf(char*, const char *format_p, ...);\r
-; void __xfprintf(void(*func)(char), const char *format_p, ...);\r
-;\r
-\r
-#if USE_XPRINTF\r
-\r
-.func xvprintf\r
-xvprintf:\r
-       ld      ZL, Y+          ;Z = pointer to format string\r
-       ld      ZH, Y+          ;/\r
-\r
-0:     _LPMI   r24             ;Get a format char\r
-       cpi     r24, 0          ;End of format string?\r
-       breq    90f             ;/\r
-       cpi     r24, '%'        ;Is format?\r
-       breq    20f             ;/\r
-1:     rcall   xputc           ;Put a normal character\r
-       rjmp    0b              ;/\r
-90:    ret\r
-\r
-20:    ldi     r18, 0          ;r18: digits\r
-       clt                     ;T: filler\r
-       _LPMI   r21             ;Get flags\r
-       cpi     r21, '%'        ;Is a %?\r
-       breq    1b              ;/\r
-       cpi     r21, '0'        ;Zero filled?\r
-       brne    23f             ;\r
-       set                     ;/\r
-22:    _LPMI   r21             ;Get width\r
-23:    cpi     r21, '9'+1      ;\r
-       brcc    24f             ;\r
-       subi    r21, '0'        ;\r
-       brcs    90b             ;\r
-       lsl     r18             ;\r
-       mov     r0, r18         ;\r
-       lsl     r18             ;\r
-       lsl     r18             ;\r
-       add     r18, r0         ;\r
-       add     r18, r21        ;\r
-       rjmp    22b             ;/\r
-\r
-24:    brtc    25f             ;get value (low word)\r
-       neg     r18             ;\r
-25:    ld      r24, Y+         ;\r
-       ld      r25, Y+         ;/\r
-       cpi     r21, 'c'        ;Is type character?\r
-       breq    1b              ;/\r
-       cpi     r21, 's'        ;Is type RAM string?\r
-       breq    50f             ;/\r
-       cpi     r21, 'S'        ;Is type ROM string?\r
-       breq    60f             ;/\r
-       _MOVW   r23,r22,r25,r24 ;r25:r22 = value\r
-       clr     r24             ;\r
-       clr     r25             ;\r
-       clt                     ;/\r
-       cpi     r21, 'l'        ;Is long int?\r
-       brne    26f             ;\r
-       ld      r24, Y+         ;get value (high word)\r
-       ld      r25, Y+         ;\r
-       set                     ;\r
-       _LPMI   r21             ;/\r
-26:    cpi     r21, 'd'        ;Is type signed decimal?\r
-       brne    27f             ;/\r
-       ldi     r20, -10        ;\r
-       brts    40f             ;\r
-       sbrs    r23, 7          ;\r
-       rjmp    40f             ;\r
-       ldi     r24, -1         ;\r
-       ldi     r25, -1         ;\r
-       rjmp    40f             ;/\r
-27:    cpi     r21, 'u'        ;Is type unsigned decimal?\r
-       ldi     r20, 10         ;\r
-       breq    40f             ;/\r
-       cpi     r21, 'X'        ;Is type hexdecimal?\r
-       ldi     r20, 16         ;\r
-       breq    40f             ;/\r
-       cpi     r21, 'b'        ;Is type binary?\r
-       ldi     r20, 2          ;\r
-       breq    40f             ;/\r
-       ret                     ;abort\r
-40:    push    ZH              ;Output the value\r
-       push    ZL              ;\r
-       rcall   xitoa           ;\r
-42:    pop     ZL              ;\r
-       pop     ZH              ;\r
-       rjmp    0b              ;/\r
-\r
-50:    push    ZH              ;Put a string on the RAM\r
-       push    ZL\r
-       _MOVW   ZH,ZL, r25,r24\r
-51:    ld      r24, Z+\r
-       cpi     r24, 0\r
-       breq    42b\r
-       rcall   xputc\r
-       rjmp    51b\r
-\r
-60:    push    ZH              ;Put a string on the ROM\r
-       push    ZL\r
-       rcall   xputs\r
-       rjmp    42b\r
-.endfunc\r
-\r
-\r
-.func __xprintf\r
-.global __xprintf\r
-__xprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       rcall   xvprintf\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-\r
-\r
-#if USE_XSPRINTF\r
-\r
-.func __xsprintf\r
-putram:\r
-       _MOVW   ZH,ZL, r15,r14\r
-       st      Z+, r24\r
-       _MOVW   r15,r14, ZH,ZL\r
-       ret\r
-.global __xsprintf\r
-__xsprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       lds     ZL, xfunc_out+0 ;Save registered output function\r
-       lds     ZH, xfunc_out+1 ;\r
-       push    ZL              ;\r
-       push    ZH              ;/\r
-       ldi     ZL, lo8(pm(putram));Set local output function\r
-       ldi     ZH, hi8(pm(putram));\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       push    r15             ;Initialize pointer to string buffer\r
-       push    r14             ;\r
-       ld      r14, Y+         ;\r
-       ld      r15, Y+         ;/\r
-       rcall   xvprintf\r
-       _MOVW   ZH,ZL, r15,r14  ;Terminate string\r
-       st      Z, r1           ;\r
-       pop     r14             ;\r
-       pop     r15             ;/\r
-       pop     ZH              ;Restore registered output function\r
-       pop     ZL              ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-\r
-#if USE_XFPRINTF\r
-.func __xfprintf\r
-.global __xfprintf\r
-__xfprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       lds     ZL, xfunc_out+0 ;Save registered output function\r
-       lds     ZH, xfunc_out+1 ;\r
-       push    ZL              ;\r
-       push    ZH              ;/\r
-       ld      ZL, Y+          ;Set output function\r
-       ld      ZH, Y+          ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       rcall   xvprintf\r
-       pop     ZH              ;Restore registered output function\r
-       pop     ZL              ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Extended numeral string input\r
-;\r
-;Prototype:\r
-; char xatoi (           /* 1: Successful, 0: Failed */\r
-;      const char **str, /* pointer to pointer to source string */\r
-;      long *res         /* result */\r
-; );\r
-;\r
-\r
-\r
-#if USE_XATOI\r
-.func xatoi\r
-.global xatoi\r
-xatoi:\r
-       _MOVW   r1, r0, r23, r22\r
-       _MOVW   XH, XL, r25, r24\r
-       ld      ZL, X+\r
-       ld      ZH, X+\r
-       clr     r18             ;r21:r18 = 0;\r
-       clr     r19             ;\r
-       clr     r20             ;\r
-       clr     r21             ;/\r
-       clt                     ;T = 0;\r
-\r
-       ldi     r25, 10         ;r25 = 10;\r
-       rjmp    41f             ;/\r
-40:    adiw    ZL, 1           ;Z++;\r
-41:    ld      r22, Z          ;r22 = *Z;\r
-       cpi     r22, ' '        ;if(r22 == ' ') continue\r
-       breq    40b             ;/\r
-       brcs    70f             ;if(r22 < ' ') error;\r
-       cpi     r22, '-'        ;if(r22 == '-') {\r
-       brne    42f             ; T = 1;\r
-       set                     ; continue;\r
-       rjmp    40b             ;}\r
-42:    cpi     r22, '9'+1      ;if(r22 > '9') error;\r
-       brcc    70f             ;/\r
-       cpi     r22, '0'        ;if(r22 < '0') error;\r
-       brcs    70f             ;/\r
-       brne    51f             ;if(r22 > '0') cv_start;\r
-       ldi     r25, 8          ;r25 = 8;\r
-       adiw    ZL, 1           ;r22 = *(++Z);\r
-       ld      r22, Z          ;/\r
-       cpi     r22, ' '+1      ;if(r22 <= ' ') exit;\r
-       brcs    80f             ;/\r
-       cpi     r22, 'b'        ;if(r22 == 'b') {\r
-       brne    43f             ; r25 = 2;\r
-       ldi     r25, 2          ; cv_start;\r
-       rjmp    50f             ;}\r
-43:    cpi     r22, 'x'        ;if(r22 != 'x') error;\r
-       brne    51f             ;/\r
-       ldi     r25, 16         ;r25 = 16;\r
-\r
-50:    adiw    ZL, 1           ;Z++;\r
-       ld      r22, Z          ;r22 = *Z;\r
-51:    cpi     r22, ' '+1      ;if(r22 <= ' ') break;\r
-       brcs    80f             ;/\r
-       cpi     r22, 'a'        ;if(r22 >= 'a') r22 =- 0x20;\r
-       brcs    52f             ;\r
-       subi    r22, 0x20       ;/\r
-52:    subi    r22, '0'        ;if((r22 -= '0') < 0) error;\r
-       brcs    70f             ;/\r
-       cpi     r22, 10         ;if(r22 >= 10) {\r
-       brcs    53f             ; r22 -= 7;\r
-       subi    r22, 7          ; if(r22 < 10) \r
-       cpi     r22, 10         ;\r
-       brcs    70f             ;}\r
-53:    cp      r22, r25        ;if(r22 >= r25) error;\r
-       brcc    70f             ;/\r
-60:    ldi     r24, 33         ;r21:r18 *= r25;\r
-       sub     r23, r23        ;\r
-61:    brcc    62f             ;\r
-       add     r23, r25        ;\r
-62:    lsr     r23             ;\r
-       ror     r21             ;\r
-       ror     r20             ;\r
-       ror     r19             ;\r
-       ror     r18             ;\r
-       dec     r24             ;\r
-       brne    61b             ;/\r
-       add     r18, r22        ;r21:r18 += r22;\r
-       adc     r19, r24        ;\r
-       adc     r20, r24        ;\r
-       adc     r21, r24        ;/\r
-       rjmp    50b             ;repeat\r
-\r
-70:    ldi     r24, 0\r
-       rjmp    81f\r
-80:    ldi     r24, 1\r
-81:    brtc    82f\r
-       clr     r22\r
-       com     r18\r
-       com     r19\r
-       com     r20\r
-       com     r21\r
-       adc     r18, r22\r
-       adc     r19, r22\r
-       adc     r20, r22\r
-       adc     r21, r22\r
-82:    st      -X, ZH\r
-       st      -X, ZL\r
-       _MOVW   XH, XL, r1, r0\r
-       st      X+, r18\r
-       st      X+, r19\r
-       st      X+, r20\r
-       st      X+, r21\r
-       clr     r1\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-\r
diff --git a/common/xprintf.h b/common/xprintf.h
deleted file mode 100644 (file)
index f58bca8..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*---------------------------------------------------------------------------\r
-   Extended itoa, puts and printf                    (C)ChaN, 2011\r
------------------------------------------------------------------------------*/\r
-\r
-#ifndef XPRINTF_H\r
-#define XPRINTF_H\r
-\r
-#include <inttypes.h>\r
-#include <avr/pgmspace.h>\r
-\r
-extern void (*xfunc_out)(uint8_t);\r
-#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)\r
-\r
-/* This is a pointer to user defined output function. It must be initialized\r
-   before using this modle.\r
-*/\r
-\r
-void xputc(char chr);\r
-\r
-/* This is a stub function to forward outputs to user defined output function.\r
-   All outputs from this module are output via this function.\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-void xputs(const char *string_p);\r
-\r
-/*  The string placed in the ROM is forwarded to xputc() directly.\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-void xitoa(long value, char radix, char width);\r
-\r
-/* Extended itoa().\r
-\r
-      value  radix  width   output\r
-        100     10      6   "   100"\r
-        100     10     -6   "000100"\r
-        100     10      0   "100"\r
- 4294967295     10      0   "4294967295"\r
- 4294967295    -10      0   "-1"\r
-     655360     16     -8   "000A0000"\r
-       1024     16      0   "400"\r
-       0x55      2     -8   "01010101"\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)\r
-#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)\r
-#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)\r
-\r
-void __xprintf(const char *format_p, ...);     /* Send formatted string to the registered device */\r
-void __xsprintf(char*, const char *format_p, ...);     /* Put formatted string to the memory */\r
-void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */\r
-\r
-/* Format string is placed in the ROM. The format flags is similar to printf().\r
-\r
-   %[flag][width][size]type\r
-\r
-   flag\r
-     A '0' means filled with '0' when output is shorter than width.\r
-     ' ' is used in default. This is effective only numeral type.\r
-   width\r
-     Minimum width in decimal number. This is effective only numeral type.\r
-     Default width is zero.\r
-   size\r
-     A 'l' means the argument is long(32bit). Default is short(16bit).\r
-     This is effective only numeral type.\r
-   type\r
-     'c' : Character, argument is the value\r
-     's' : String placed on the RAM, argument is the pointer\r
-     'S' : String placed on the ROM, argument is the pointer\r
-     'd' : Signed decimal, argument is the value\r
-     'u' : Unsigned decimal, argument is the value\r
-     'X' : Hexdecimal, argument is the value\r
-     'b' : Binary, argument is the value\r
-     '%' : '%'\r
-\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-char xatoi(char **str, long *ret);\r
-\r
-/* Get value of the numeral string. \r
-\r
-  str\r
-    Pointer to pointer to source string\r
-\r
-    "0b11001010" binary\r
-    "0377" octal\r
-    "0xff800" hexdecimal\r
-    "1250000" decimal\r
-    "-25000" decimal\r
-\r
-  ret\r
-    Pointer to return value\r
-*/\r
-\r
-#endif\r
-\r
diff --git a/converter/ps2_usb/Makefile.mbed b/converter/ps2_usb/Makefile.mbed
new file mode 100644 (file)
index 0000000..631f270
--- /dev/null
@@ -0,0 +1,44 @@
+PROJECT = ps2_usb
+
+TMK_DIR = ../..
+MBED_DIR = $(TMK_DIR)/mbed-sdk
+
+#VPATH += $(MBED_DIR):$(TMK_DIR)
+vpath %.s .:$(MBED_DIR):$(TMK_DIR)
+vpath %.c .:$(MBED_DIR):$(TMK_DIR)
+vpath %.cpp .:$(MBED_DIR):$(TMK_DIR)
+
+OBJDIR = ./build
+
+OBJECTS = \
+       $(OBJDIR)/protocol/ps2_busywait.o \
+       $(OBJDIR)/protocol/ps2_io_mbed.o \
+       $(OBJDIR)/./keymap_common.o \
+       $(OBJDIR)/./matrix.o \
+       $(OBJDIR)/./led.o \
+       $(OBJDIR)/./main.o
+
+ifdef KEYMAP
+    OBJECTS := $(OBJDIR)/keymap_$(KEYMAP).o $(OBJECTS)
+else
+    OBJECTS := $(OBJDIR)/keymap_plain.o $(OBJECTS)
+endif
+
+CONFIG_H = config_mbed.h
+
+SYS_OBJECTS = 
+
+INCLUDE_PATHS = -I.
+
+LIBRARY_PATHS = 
+LIBRARIES = 
+
+# Build Options
+#   Comment out to disable
+#BOOTMAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+
+
+include $(TMK_DIR)/tool/mbed/mbed.mk
+include $(TMK_DIR)/tool/mbed/common.mk
+include $(TMK_DIR)/tool/mbed/gcc.mk
diff --git a/converter/ps2_usb/config_mbed.h b/converter/ps2_usb/config_mbed.h
new file mode 100644 (file)
index 0000000..5819763
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+Copyright 2012 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_MBED_H
+#define CONFIG_MBED_H
+
+
+#if 0
+// duplicated name against mbed USBDeivce
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6512
+#endif
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    t.m.k.
+#define PRODUCT         PS/2 keyboard converter
+#define DESCRIPTION     convert PS/2 keyboard to USB
+
+
+/* matrix size */
+#define MATRIX_ROWS 32  // keycode bit: 3-0
+#define MATRIX_COLS 8   // keycode bit: 6-4
+
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \
+    keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \
+)
+
+
+/*
+ * PS/2 Busywait
+ */
+#ifdef PS2_USE_BUSYWAIT
+#   define PS2_CLOCK_PORT  PORTD
+#   define PS2_CLOCK_PIN   PIND
+#   define PS2_CLOCK_DDR   DDRD
+#   define PS2_CLOCK_BIT   5
+#   define PS2_DATA_PORT   PORTD
+#   define PS2_DATA_PIN    PIND
+#   define PS2_DATA_DDR    DDRD
+#   define PS2_DATA_BIT    2
+#endif
+
+
+#endif
index 241d2e33b1607d99b32a5efe3606927642366606..e344fb41670f7bfca29f03337d47ad7695c815ea 100644 (file)
@@ -15,10 +15,11 @@ 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 "keymap_common.h"
+#include "progmem.h"
 
 
 /* translates key to keycode */
-uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
+uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
 {
     return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
 }
index 216a8dc020c317582517b80bd70bce36ef9c631b..d783e01dedd8a28a38d8d12dbed2f1500072ce93 100644 (file)
@@ -19,7 +19,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdint.h>
 #include <stdbool.h>
-#include <avr/pgmspace.h>
 #include "keycode.h"
 #include "action.h"
 #include "action_macro.h"
diff --git a/converter/ps2_usb/main.cpp b/converter/ps2_usb/main.cpp
new file mode 100644 (file)
index 0000000..860af14
--- /dev/null
@@ -0,0 +1,46 @@
+#include "mbed.h"
+#include "debug.h"
+#include "timer.h"
+#include "action.h"
+#include "keycode.h"
+#include "host.h"
+#include "host_driver.h"
+#include "mbed_driver.h"
+
+// Button and LEDs of LPC11U35 board
+DigitalIn isp(P0_1);            // ISP button
+DigitalOut led_red(P0_20);
+DigitalOut led_green(P0_21);
+
+
+int main(void) {
+    isp.mode(PullUp);
+    led_red = 1;
+    led_green = 0;
+
+    timer_init();
+    host_set_driver(&mbed_driver);
+    keyboard_init();
+
+    //debug_enable = true;
+    xprintf("mbed_onekey ver.eee:\r\n");
+
+
+    bool last_isp = isp;
+    while (1) {
+        keyboard_task();
+
+        //led_green = !led_green;
+        if (last_isp == isp) continue;
+        last_isp = isp;
+        if (last_isp == 0) {
+            led_red = 0;    // on
+            dprintf("timer: %i\r\n", timer_read());
+            //register_code(KC_A);
+        } else {
+            led_red = 1;    // off
+            //unregister_code(KC_A);
+        }
+    }
+}
index 45344c0f759c20aa3491bd7972bce228efddbe6b..45cf2a4a90fa87e2305bf5622e26a4d2f6bba5b0 100644 (file)
@@ -17,8 +17,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdint.h>
 #include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
 #include "action.h"
 #include "print.h"
 #include "util.h"
@@ -189,6 +187,7 @@ uint8_t matrix_scan(void)
     }
 
     uint8_t code = ps2_host_recv();
+    if (code) xprintf("%i\r\n", code);
     if (!ps2_error) {
         switch (state) {
             case INIT:
diff --git a/keyboard/mbed_onekey/Makefile b/keyboard/mbed_onekey/Makefile
new file mode 100644 (file)
index 0000000..2f7399b
--- /dev/null
@@ -0,0 +1,33 @@
+PROJECT = mbed_onekey
+
+TMK_DIR = ../..
+MBED_DIR = $(TMK_DIR)/mbed-sdk
+
+#VPATH += $(MBED_DIR):$(TMK_DIR)
+vpath %.s .:$(MBED_DIR):$(TMK_DIR)
+vpath %.c .:$(MBED_DIR):$(TMK_DIR)
+vpath %.cpp .:$(MBED_DIR):$(TMK_DIR)
+
+OBJDIR = ./build
+
+OBJECTS = \
+       $(OBJDIR)/./main.o
+
+CONFIG_H = config.h
+
+SYS_OBJECTS = 
+
+INCLUDE_PATHS = -I.
+
+LIBRARY_PATHS = 
+LIBRARIES = 
+
+# Build Options
+#   Comment out to disable
+#BOOTMAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+
+
+include $(TMK_DIR)/tool/mbed/mbed.mk
+include $(TMK_DIR)/tool/mbed/common.mk
+include $(TMK_DIR)/tool/mbed/gcc.mk
diff --git a/keyboard/mbed_onekey/config.h b/keyboard/mbed_onekey/config.h
new file mode 100644 (file)
index 0000000..a3aadd0
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#define MATRIX_ROWS 1
+#define MATRIX_COLS 1
+
+#endif
diff --git a/keyboard/mbed_onekey/main.cpp b/keyboard/mbed_onekey/main.cpp
new file mode 100644 (file)
index 0000000..b2f7243
--- /dev/null
@@ -0,0 +1,43 @@
+#include "mbed.h"
+#include "debug.h"
+#include "timer.h"
+#include "action.h"
+#include "keycode.h"
+#include "host.h"
+#include "host_driver.h"
+#include "mbed_driver.h"
+
+// Button and LEDs of LPC11U35 board
+DigitalIn isp(P0_1);            // ISP button
+DigitalOut led_red(P0_20);
+DigitalOut led_green(P0_21);
+
+
+int main(void) {
+    isp.mode(PullUp);
+    led_red = 1;
+    led_green = 0;
+
+    timer_init();
+    host_set_driver(&mbed_driver);
+
+    //debug_enable = true;
+    xprintf("mbed_onekey ver.eee:\r\n");
+
+
+    bool last_isp = isp;
+    while (1) {
+        //led_green = !led_green;
+        if (last_isp == isp) continue;
+        last_isp = isp;
+        if (last_isp == 0) {
+            led_red = 0;    // on
+            dprintf("timer: %i\r\n", timer_read());
+            register_code(KC_A);
+        } else {
+            led_red = 1;    // off
+            unregister_code(KC_A);
+        }
+    }
+}
index 7f561e62d60dc0a5dc7c49ca0cb9a9fee25d781e..ca435ba43ca1acc2b7c3bb67705ea9eaccd851e0 100644 (file)
@@ -9,6 +9,7 @@ endif
 
 ifdef PS2_USE_BUSYWAIT
     SRC += protocol/ps2_busywait.c
+    SRC += protocol/ps2_io_avr.c
     OPT_DEFS += -DPS2_USE_BUSYWAIT
 endif
 
diff --git a/protocol/mbed/HIDKeyboard.cpp b/protocol/mbed/HIDKeyboard.cpp
new file mode 100644 (file)
index 0000000..947077c
--- /dev/null
@@ -0,0 +1,271 @@
+#include <stdint.h>
+#include "USBHID.h"
+#include "USBHID_Types.h"
+#include "USBDescriptor.h"
+#include "HIDKeyboard.h"
+
+#define DEFAULT_CONFIGURATION (1)
+
+
+HIDKeyboard::HIDKeyboard(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release)
+{
+    USBDevice::connect();
+}
+
+bool HIDKeyboard::sendReport(report_keyboard_t report) {
+    USBDevice::write(EP1IN, report.raw, sizeof(report), MAX_PACKET_SIZE_EP1);
+    return true;
+}
+
+uint8_t HIDKeyboard::leds() {
+    return led_state;
+}
+
+bool HIDKeyboard::USBCallback_setConfiguration(uint8_t configuration) {
+    if (configuration != DEFAULT_CONFIGURATION) {
+        return false;
+    }
+
+    // Configure endpoints > 0
+    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
+    //addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
+
+    // We activate the endpoint to be able to recceive data
+    //readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
+    return true;
+}
+
+
+uint8_t * HIDKeyboard::stringImanufacturerDesc() {
+    static uint8_t stringImanufacturerDescriptor[] = {
+        0x18,                                            /*bLength*/
+        STRING_DESCRIPTOR,                               /*bDescriptorType 0x03*/
+        't',0,'m',0,'k',0,'-',0,'k',0,'b',0,'d',0,'.',0,'c',0,'o',0,'m',0   /*bString iManufacturer*/
+    };
+    return stringImanufacturerDescriptor;
+}
+
+uint8_t * HIDKeyboard::stringIproductDesc() {
+    static uint8_t stringIproductDescriptor[] = {
+        0x0a,                                                       /*bLength*/
+        STRING_DESCRIPTOR,                                          /*bDescriptorType 0x03*/
+        'm',0,'b',0,'e',0,'d',0                                     /*bString iProduct*/
+    };
+    return stringIproductDescriptor;
+}
+
+uint8_t * HIDKeyboard::stringIserialDesc() {
+    static uint8_t stringIserialDescriptor[] = {
+        0x04,                                                           /*bLength*/
+        STRING_DESCRIPTOR,                                              /*bDescriptorType 0x03*/
+        '0',0                                                           /*bString iSerial*/
+    };
+    return stringIserialDescriptor;
+}
+
+uint8_t * HIDKeyboard::reportDesc() {
+    static uint8_t reportDescriptor[] = {
+        USAGE_PAGE(1), 0x01,                    // Generic Desktop
+        USAGE(1), 0x06,                         // Keyboard
+        COLLECTION(1), 0x01,                    // Application
+
+        USAGE_PAGE(1), 0x07,                    // Key Codes
+        USAGE_MINIMUM(1), 0xE0,
+        USAGE_MAXIMUM(1), 0xE7,
+        LOGICAL_MINIMUM(1), 0x00,
+        LOGICAL_MAXIMUM(1), 0x01,
+        REPORT_SIZE(1), 0x01,
+        REPORT_COUNT(1), 0x08,
+        INPUT(1), 0x02,                         // Data, Variable, Absolute
+
+        REPORT_COUNT(1), 0x01,
+        REPORT_SIZE(1), 0x08,
+        INPUT(1), 0x01,                         // Constant
+
+        REPORT_COUNT(1), 0x05,
+        REPORT_SIZE(1), 0x01,
+        USAGE_PAGE(1), 0x08,                    // LEDs
+        USAGE_MINIMUM(1), 0x01,
+        USAGE_MAXIMUM(1), 0x05,
+        OUTPUT(1), 0x02,                        // Data, Variable, Absolute
+
+        REPORT_COUNT(1), 0x01,
+        REPORT_SIZE(1), 0x03,
+        OUTPUT(1), 0x01,                        // Constant
+
+
+        REPORT_COUNT(1), 0x06,
+        REPORT_SIZE(1), 0x08,
+        LOGICAL_MINIMUM(1), 0x00,
+        LOGICAL_MAXIMUM(1), 0xFF,
+        USAGE_PAGE(1), 0x07,                    // Key Codes
+        USAGE_MINIMUM(1), 0x00,
+        USAGE_MAXIMUM(1), 0xFF,
+        INPUT(1), 0x00,                         // Data, Array
+        END_COLLECTION(0),
+    };
+    reportLength = sizeof(reportDescriptor);
+    return reportDescriptor;
+}
+
+uint16_t HIDKeyboard::reportDescLength() {
+    reportDesc();
+    return reportLength;
+}
+
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \
+                               + (1 * INTERFACE_DESCRIPTOR_LENGTH) \
+                               + (1 * HID_DESCRIPTOR_LENGTH) \
+                               + (1 * ENDPOINT_DESCRIPTOR_LENGTH))
+uint8_t * HIDKeyboard::configurationDesc() {
+    static uint8_t configurationDescriptor[] = {
+        CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
+        CONFIGURATION_DESCRIPTOR,       // bDescriptorType
+        LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)
+        MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)
+        0x01,                           // bNumInterfaces
+        DEFAULT_CONFIGURATION,          // bConfigurationValue
+        0x00,                           // iConfiguration
+        C_RESERVED | C_REMOTE_WAKEUP,   // bmAttributes
+        C_POWER(100),                   // bMaxPowerHello World from Mbed
+
+        INTERFACE_DESCRIPTOR_LENGTH,    // bLength
+        INTERFACE_DESCRIPTOR,           // bDescriptorType
+        0x00,                           // bInterfaceNumber
+        0x00,                           // bAlternateSetting
+        0x01,                           // bNumEndpoints
+        HID_CLASS,                      // bInterfaceClass
+        1,                              // bInterfaceSubClass (boot)
+        1,                              // bInterfaceProtocol (keyboard)
+        0x00,                           // iInterface
+
+        HID_DESCRIPTOR_LENGTH,          // bLength
+        HID_DESCRIPTOR,                 // bDescriptorType
+        LSB(HID_VERSION_1_11),          // bcdHID (LSB)
+        MSB(HID_VERSION_1_11),          // bcdHID (MSB)
+        0x00,                           // bCountryCode
+        0x01,                           // bNumDescriptors
+        REPORT_DESCRIPTOR,              // bDescriptorType
+        (uint8_t)(LSB(reportDescLength())),  // wDescriptorLength (LSB)
+        (uint8_t)(MSB(reportDescLength())),  // wDescriptorLength (MSB)
+
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType
+        PHY_TO_DESC(EP1IN),             // bEndpointAddress
+        E_INTERRUPT,                    // bmAttributes
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)
+        1,                           // bInterval (milliseconds)
+    };
+    return configurationDescriptor;
+}
+
+#if 0
+uint8_t * HIDKeyboard::deviceDesc() {
+    static uint8_t deviceDescriptor[] = {
+        DEVICE_DESCRIPTOR_LENGTH,       /* bLength */
+        DEVICE_DESCRIPTOR,              /* bDescriptorType */
+        LSB(USB_VERSION_2_0),           /* bcdUSB (LSB) */
+        MSB(USB_VERSION_2_0),           /* bcdUSB (MSB) */
+        0x00,                           /* bDeviceClass */
+        0x00,                           /* bDeviceSubClass */
+        0x00,                           /* bDeviceprotocol */
+        MAX_PACKET_SIZE_EP0,            /* bMaxPacketSize0 */
+        (uint8_t)(LSB(0xfeed)),                 /* idVendor (LSB) */
+        (uint8_t)(MSB(0xfeed)),                 /* idVendor (MSB) */
+        (uint8_t)(LSB(0x1bed)),                /* idProduct (LSB) */
+        (uint8_t)(MSB(0x1bed)),                /* idProduct (MSB) */
+        (uint8_t)(LSB(0x0002)),           /* bcdDevice (LSB) */
+        (uint8_t)(MSB(0x0002)),           /* bcdDevice (MSB) */
+        0,    /* iManufacturer */
+        0,         /* iProduct */
+        0,          /* iSerialNumber */
+        0x01                            /* bNumConfigurations */
+    };
+    return deviceDescriptor;
+}
+#endif
+
+bool HIDKeyboard::USBCallback_request() {
+    bool success = false;
+    CONTROL_TRANSFER * transfer = getTransferPtr();
+    uint8_t *hidDescriptor;
+
+    // Process additional standard requests
+
+    if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))
+    {
+        switch (transfer->setup.bRequest)
+        {
+            case GET_DESCRIPTOR:
+                switch (DESCRIPTOR_TYPE(transfer->setup.wValue))
+                {
+                    case REPORT_DESCRIPTOR:
+                        if ((reportDesc() != NULL) \
+                            && (reportDescLength() != 0))
+                        {
+                            transfer->remaining = reportDescLength();
+                            transfer->ptr = reportDesc();
+                            transfer->direction = DEVICE_TO_HOST;
+                            success = true;
+                        }
+                        break;
+                    case HID_DESCRIPTOR:
+                            // Find the HID descriptor, after the configuration descriptor
+                            hidDescriptor = findDescriptor(HID_DESCRIPTOR);
+                            if (hidDescriptor != NULL)
+                            {
+                                transfer->remaining = HID_DESCRIPTOR_LENGTH;
+                                transfer->ptr = hidDescriptor;
+                                transfer->direction = DEVICE_TO_HOST;
+                                success = true;
+                            }
+                            break;
+                     
+                    default:
+                        break;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    // Process class-specific requests
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE)
+    {
+        switch (transfer->setup.bRequest) {
+            case SET_REPORT:
+                // LED indicator
+                // TODO: check Interface and Report length?
+                // if (transfer->setup.wIndex == INTERFACE_KEYBOAD) { }
+                // if (transfer->setup.wLength == 1)
+
+                transfer->remaining = 1;
+                //transfer->ptr = ?? what ptr should be set when OUT(not used?)
+                transfer->direction = HOST_TO_DEVICE;
+                transfer->notify = true;    /* notify with USBCallback_requestCompleted */
+                success = true;
+            default:
+                break;
+        }
+    }
+
+    return success;
+}
+
+void HIDKeyboard::USBCallback_requestCompleted(uint8_t * buf, uint32_t length)
+{
+    if (length > 0) {
+        CONTROL_TRANSFER *transfer = getTransferPtr();
+        if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
+            switch (transfer->setup.bRequest) {
+                case SET_REPORT:
+                    led_state = buf[0];
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+}
diff --git a/protocol/mbed/HIDKeyboard.h b/protocol/mbed/HIDKeyboard.h
new file mode 100644 (file)
index 0000000..c537e5e
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef HIDKEYBOARD_H
+
+#include "stdint.h"
+#include "stdbool.h"
+#include "USBHID.h"
+#include "report.h"
+
+
+class HIDKeyboard : public USBDevice {
+public:
+    HIDKeyboard(uint16_t vendor_id = 0xFEED, uint16_t product_id = 0xabed, uint16_t product_release = 0x0001);
+
+    bool sendReport(report_keyboard_t report);
+    uint8_t leds(void);
+protected:
+    uint16_t reportLength;
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+    virtual uint8_t * stringImanufacturerDesc();
+    virtual uint8_t * stringIproductDesc();
+    virtual uint8_t * stringIserialDesc();
+    virtual uint16_t reportDescLength();
+    virtual uint8_t * reportDesc();
+    virtual uint8_t * configurationDesc();
+    //virtual uint8_t * deviceDesc();
+    virtual bool USBCallback_request();
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length);
+private:
+    uint8_t led_state;
+};
+
+#endif
diff --git a/protocol/mbed/mbed_driver.cpp b/protocol/mbed/mbed_driver.cpp
new file mode 100644 (file)
index 0000000..6c7b16e
--- /dev/null
@@ -0,0 +1,41 @@
+#include "HIDKeyboard.h"
+#include "host.h"
+#include "host_driver.h"
+#include "mbed_driver.h"
+
+HIDKeyboard keyboard;
+
+
+/* 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);
+
+host_driver_t mbed_driver = {
+    keyboard_leds,
+    send_keyboard,
+    send_mouse,
+    send_system,
+    send_consumer
+};
+
+
+static uint8_t keyboard_leds(void)
+{
+    return keyboard.leds();
+}
+static void send_keyboard(report_keyboard_t *report)
+{
+    keyboard.sendReport(*report);
+}
+static void send_mouse(report_mouse_t *report)
+{
+}
+static void send_system(uint16_t data)
+{
+}
+static void send_consumer(uint16_t data)
+{
+}
diff --git a/protocol/mbed/mbed_driver.h b/protocol/mbed/mbed_driver.h
new file mode 100644 (file)
index 0000000..dd1153b
--- /dev/null
@@ -0,0 +1,3 @@
+#include "host_driver.h"
+
+extern host_driver_t mbed_driver;
index 483eea7209a769d10790f19952728f974ab72ccf..acde679cf42352fc4c7750bfdbf33ae77c5b19d0 100644 (file)
@@ -39,8 +39,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #define PS2_H
 
 #include <stdbool.h>
-#include <util/delay.h>
-#include <avr/io.h>
+#include "wait.h"
+#include "ps2_io.h"
+#include "print.h"
 
 /*
  * Primitive PS/2 Library for AVR
@@ -92,79 +93,27 @@ uint8_t ps2_host_recv(void);
 void ps2_host_set_led(uint8_t usb_led);
 
 
-/* Check port settings for clock and data line */
-#if !(defined(PS2_CLOCK_PORT) && \
-      defined(PS2_CLOCK_PIN) && \
-      defined(PS2_CLOCK_DDR) && \
-      defined(PS2_CLOCK_BIT))
-#   error "PS/2 clock port setting is required in config.h"
-#endif
-
-#if !(defined(PS2_DATA_PORT) && \
-      defined(PS2_DATA_PIN) && \
-      defined(PS2_DATA_DDR) && \
-      defined(PS2_DATA_BIT))
-#   error "PS/2 data port setting is required in config.h"
-#endif
-
 /*--------------------------------------------------------------------
  * static functions
  *------------------------------------------------------------------*/
-static inline void clock_lo(void)
-{
-    PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT);
-    PS2_CLOCK_DDR  |=  (1<<PS2_CLOCK_BIT);
-}
-static inline void clock_hi(void)
-{
-    /* input with pull up */
-    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
-    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
-}
-static inline bool clock_in(void)
-{
-    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
-    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
-    _delay_us(1);
-    return PS2_CLOCK_PIN&(1<<PS2_CLOCK_BIT);
-}
-static inline void data_lo(void)
-{
-    PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT);
-    PS2_DATA_DDR  |=  (1<<PS2_DATA_BIT);
-}
-static inline void data_hi(void)
-{
-    /* input with pull up */
-    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
-    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
-}
-static inline bool data_in(void)
-{
-    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
-    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
-    _delay_us(1);
-    return PS2_DATA_PIN&(1<<PS2_DATA_BIT);
-}
-
 static inline uint16_t wait_clock_lo(uint16_t us)
 {
-    while (clock_in()  && us) { asm(""); _delay_us(1); us--; }
+    while (clock_in()  && us) { asm(""); wait_us(1); us--; }
     return us;
 }
 static inline uint16_t wait_clock_hi(uint16_t us)
 {
-    while (!clock_in() && us) { asm(""); _delay_us(1); us--; }
+    while (!clock_in() && us) { asm(""); wait_us(1); us--; }
     return us;
 }
 static inline uint16_t wait_data_lo(uint16_t us)
 {
-    while (data_in() && us)  { asm(""); _delay_us(1); us--; }
+    while (data_in() && us)  { asm(""); wait_us(1); us--; }
     return us;
 }
 static inline uint16_t wait_data_hi(uint16_t us)
 {
-    while (!data_in() && us)  { asm(""); _delay_us(1); us--; }
+    while (!data_in() && us)  { asm(""); wait_us(1); us--; }
     return us;
 }
 
index 05dd7b27e695762cb50e0befadc60395e6a1ca3f..a64933219ec96e1b48d4f30edf5eb60191306a31 100644 (file)
@@ -40,8 +40,9 @@ POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include <stdbool.h>
-#include <util/delay.h>
+#include "wait.h"
 #include "ps2.h"
+#include "ps2_io.h"
 #include "debug.h"
 
 
@@ -58,8 +59,11 @@ uint8_t ps2_error = PS2_ERR_NONE;
 
 void ps2_host_init(void)
 {
+    clock_init();
+    data_init();
+
     // POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20)
-    _delay_ms(2500);
+    wait_ms(2500);
 
     inhibit();
 }
@@ -71,7 +75,7 @@ uint8_t ps2_host_send(uint8_t data)
 
     /* terminate a transmission if we have */
     inhibit();
-    _delay_us(100); // 100us [4]p.13, [5]p.50
+    wait_us(100); // 100us [4]p.13, [5]p.50
 
     /* 'Request to Send' and Start bit */
     data_lo();
@@ -80,7 +84,7 @@ uint8_t ps2_host_send(uint8_t data)
 
     /* Data bit */
     for (uint8_t i = 0; i < 8; i++) {
-        _delay_us(15);
+        wait_us(15);
         if (data&(1<<i)) {
             parity = !parity;
             data_hi();
@@ -92,13 +96,13 @@ uint8_t ps2_host_send(uint8_t data)
     }
 
     /* Parity bit */
-    _delay_us(15);
+    wait_us(15);
     if (parity) { data_hi(); } else { data_lo(); }
     WAIT(clock_hi, 50, 4);
     WAIT(clock_lo, 50, 5);
 
     /* Stop bit */
-    _delay_us(15);
+    wait_us(15);
     data_hi();
 
     /* Ack */
diff --git a/protocol/ps2_io.h b/protocol/ps2_io.h
new file mode 100644 (file)
index 0000000..a46a358
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef PS2_IO_H
+#define PS2_IO_H
+
+
+void clock_init(void);
+void clock_lo(void);
+void clock_hi(void);
+bool clock_in(void);
+
+void data_init(void);
+void data_lo(void);
+void data_hi(void);
+bool data_in(void);
+
+#endif
diff --git a/protocol/ps2_io_avr.c b/protocol/ps2_io_avr.c
new file mode 100644 (file)
index 0000000..be13d66
--- /dev/null
@@ -0,0 +1,74 @@
+#include <stdbool.h>
+#include <util/delay.h>
+
+/* Check port settings for clock and data line */
+#if !(defined(PS2_CLOCK_PORT) && \
+      defined(PS2_CLOCK_PIN) && \
+      defined(PS2_CLOCK_DDR) && \
+      defined(PS2_CLOCK_BIT))
+#   error "PS/2 clock port setting is required in config.h"
+#endif
+
+#if !(defined(PS2_DATA_PORT) && \
+      defined(PS2_DATA_PIN) && \
+      defined(PS2_DATA_DDR) && \
+      defined(PS2_DATA_BIT))
+#   error "PS/2 data port setting is required in config.h"
+#endif
+
+
+/*
+ * Clock
+ */
+void clock_init(void)
+{
+}
+
+void clock_lo(void)
+{
+    PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT);
+    PS2_CLOCK_DDR  |=  (1<<PS2_CLOCK_BIT);
+}
+
+void clock_hi(void)
+{
+    /* input with pull up */
+    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
+    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
+}
+
+bool clock_in(void)
+{
+    PS2_CLOCK_DDR  &= ~(1<<PS2_CLOCK_BIT);
+    PS2_CLOCK_PORT |=  (1<<PS2_CLOCK_BIT);
+    _delay_us(1);
+    return PS2_CLOCK_PIN&(1<<PS2_CLOCK_BIT);
+}
+
+/*
+ * Data
+ */
+void data_init(void)
+{
+}
+
+void data_lo(void)
+{
+    PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT);
+    PS2_DATA_DDR  |=  (1<<PS2_DATA_BIT);
+}
+
+void data_hi(void)
+{
+    /* input with pull up */
+    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
+    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
+}
+
+bool data_in(void)
+{
+    PS2_DATA_DDR  &= ~(1<<PS2_DATA_BIT);
+    PS2_DATA_PORT |=  (1<<PS2_DATA_BIT);
+    _delay_us(1);
+    return PS2_DATA_PIN&(1<<PS2_DATA_BIT);
+}
diff --git a/protocol/ps2_io_mbed.c b/protocol/ps2_io_mbed.c
new file mode 100644 (file)
index 0000000..83bdcef
--- /dev/null
@@ -0,0 +1,60 @@
+#include <stdbool.h>
+#include "ps2_io.h"
+#include "gpio_api.h"
+
+
+static gpio_t clock;
+static gpio_t data;
+
+/*
+ * Clock
+ */
+void clock_init(void)
+{
+    gpio_init(&clock, P0_9);
+    gpio_mode(&clock, OpenDrain|PullNone);
+}
+
+void clock_lo(void)
+{
+    gpio_dir(&clock, PIN_OUTPUT);
+    gpio_write(&clock, 0);
+}
+void clock_hi(void)
+{
+    gpio_dir(&clock, PIN_OUTPUT);
+    gpio_write(&clock, 1);
+}
+
+bool clock_in(void)
+{
+    gpio_dir(&clock, PIN_INPUT);
+    return gpio_read(&clock);
+}
+
+/*
+ * Data
+ */
+void data_init(void)
+{
+    gpio_init(&data, P0_8);
+    gpio_mode(&data, OpenDrain|PullNone);
+}
+
+void data_lo(void)
+{
+    gpio_dir(&data, PIN_OUTPUT);
+    gpio_write(&data, 0);
+}
+
+void data_hi(void)
+{
+    gpio_dir(&data, PIN_OUTPUT);
+    gpio_write(&data, 1);
+}
+
+bool data_in(void)
+{
+    gpio_dir(&data, PIN_INPUT);
+    return gpio_read(&data);
+}
diff --git a/tool/mbed/common.mk b/tool/mbed/common.mk
new file mode 100644 (file)
index 0000000..93a927a
--- /dev/null
@@ -0,0 +1,79 @@
+OBJECTS += \
+       $(OBJDIR)/common/action.o \
+       $(OBJDIR)/common/action_tapping.o \
+       $(OBJDIR)/common/action_macro.o \
+       $(OBJDIR)/common/action_layer.o \
+       $(OBJDIR)/common/action_util.o \
+       $(OBJDIR)/common/host.o \
+       $(OBJDIR)/common/keymap.o \
+       $(OBJDIR)/common/keyboard.o \
+       $(OBJDIR)/common/util.o \
+       $(OBJDIR)/common/mbed/suspend.o \
+       $(OBJDIR)/common/mbed/timer.o \
+       $(OBJDIR)/common/mbed/xprintf.o \
+       $(OBJDIR)/common/mbed/bootloader.o \
+
+INCLUDE_PATHS += \
+       -I$(TMK_DIR)/common \
+       -I$(TMK_DIR)/protocol
+
+CC_FLAGS += -include $(CONFIG_H)
+
+
+
+# Option modules
+ifdef BOOTMAGIC_ENABLE
+    $(error Not Supported)
+    OBJECTS += $(OBJDIR)/common/bootmagic.o
+    OBJECTS += $(OBJDIR)/common/mbed/eeprom.o
+    OPT_DEFS += -DBOOTMAGIC_ENABLE
+endif
+
+ifdef MOUSEKEY_ENABLE
+    OBJECTS += $(OBJDIR)/common/mousekey.o
+    OPT_DEFS += -DMOUSEKEY_ENABLE
+    OPT_DEFS += -DMOUSE_ENABLE
+endif
+
+ifdef EXTRAKEY_ENABLE
+    $(error Not Supported)
+    OPT_DEFS += -DEXTRAKEY_ENABLE
+endif
+
+ifdef CONSOLE_ENABLE
+    $(error Not Supported)
+    OPT_DEFS += -DCONSOLE_ENABLE
+else
+    OPT_DEFS += -DNO_PRINT
+    OPT_DEFS += -DNO_DEBUG
+endif
+
+ifdef COMMAND_ENABLE
+    $(error Not Supported)
+    SRC += common/command.c
+    OPT_DEFS += -DCOMMAND_ENABLE
+endif
+
+ifdef NKRO_ENABLE
+    $(error Not Supported)
+    OPT_DEFS += -DNKRO_ENABLE
+endif
+
+ifdef SLEEP_LED_ENABLE
+    $(error Not Supported)
+    SRC += common/sleep_led.c
+    OPT_DEFS += -DSLEEP_LED_ENABLE
+    OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
+endif
+
+ifdef BACKLIGHT_ENABLE
+    $(error Not Supported)
+    SRC += common/backlight.c
+    OPT_DEFS += -DBACKLIGHT_ENABLE
+endif
+
+ifdef KEYMAP_SECTION_ENABLE
+    $(error Not Supported)
+    OPT_DEFS += -DKEYMAP_SECTION_ENABLE
+    EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
+endif
diff --git a/tool/mbed/gcc.mk b/tool/mbed/gcc.mk
new file mode 100644 (file)
index 0000000..032f7c6
--- /dev/null
@@ -0,0 +1,80 @@
+############################################################################### 
+GCC_BIN = 
+AS      = $(GCC_BIN)arm-none-eabi-as
+CC      = $(GCC_BIN)arm-none-eabi-gcc
+CPP     = $(GCC_BIN)arm-none-eabi-g++
+LD      = $(GCC_BIN)arm-none-eabi-gcc
+OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
+OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
+SIZE   = $(GCC_BIN)arm-none-eabi-size
+CHKSUM  = $(TMK_DIR)/tool/mbed/lpc-vector-checksum
+
+CPU = -mcpu=cortex-m0 -mthumb
+
+CC_FLAGS += $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections
+CC_FLAGS += -MMD -MP
+CC_SYMBOLS = -DTARGET_LPC11U35_401 -DTARGET_M0 -DTARGET_NXP -DTARGET_LPC11UXX -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M0 -DARM_MATH_CM0 -DMBED_BUILD_TIMESTAMP=1399108688.49 -D__MBED__=1 
+
+LD_FLAGS = -mcpu=cortex-m0 -mthumb -Wl,--gc-sections --specs=nano.specs
+LD_FLAGS += -Wl,-Map=$(OBJDIR)/$(PROJECT).map,--cref
+LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
+
+ifeq ($(DEBUG), 1)
+  CC_FLAGS += -DDEBUG -O0
+else
+  CC_FLAGS += -DNDEBUG -Os
+endif
+
+all: $(OBJDIR)/$(PROJECT).bin $(OBJDIR)/$(PROJECT).hex size
+
+clean:
+       rm -f $(OBJDIR)/$(PROJECT).bin $(OBJDIR)/$(PROJECT).elf $(OBJDIR)/$(PROJECT).hex $(OBJDIR)/$(PROJECT).map $(OBJDIR)/$(PROJECT).lst $(OBJECTS) $(DEPS)
+       rm -fr $(OBJDIR)
+
+$(OBJDIR)/%.o: %.s
+       mkdir -p $(@D)
+       $(AS) $(CPU) -o $@ $<
+
+$(OBJDIR)/%.o: %.c
+       mkdir -p $(@D)
+       $(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99   $(INCLUDE_PATHS) -o $@ $<
+
+$(OBJDIR)/%.o: %.cpp
+       mkdir -p $(@D)
+       $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
+
+
+$(OBJDIR)/$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
+       $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
+       @echo ""
+       @echo "*****"
+       @echo "***** You must modify vector checksum value in *.bin and *.hex files."
+       @echo "*****"
+       @echo ""
+
+$(OBJDIR)/$(PROJECT).bin: $(OBJDIR)/$(PROJECT).elf
+       @$(OBJCOPY) -O binary $< $@
+       @echo "Writing vector checksum value into $@ ..."
+       @$(CHKSUM) $@
+       @echo
+
+$(OBJDIR)/$(PROJECT).hex: $(OBJDIR)/$(PROJECT).elf
+       @$(OBJCOPY) -O ihex $< $@
+
+$(OBJDIR)/$(PROJECT).lst: $(OBJDIR)/$(PROJECT).elf
+       @$(OBJDUMP) -Sdh $< > $@
+
+lst: $(OBJDIR)/$(PROJECT).lst
+
+size:
+       $(SIZE) $(OBJDIR)/$(PROJECT).elf
+
+prog:  $(OBJDIR)/$(PROJECT).bin
+       @echo "Program..."
+ifneq ($(shell mount | grep 'CRP DISABLD'),)
+       umount /dev/nxpisp >/dev/null 2>&1
+endif
+       dd if=$< of=/dev/nxpisp seek=4
+
+DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
+-include $(DEPS)
diff --git a/tool/mbed/lpc-vector-checksum.c b/tool/mbed/lpc-vector-checksum.c
new file mode 100644 (file)
index 0000000..316a125
--- /dev/null
@@ -0,0 +1,99 @@
+/***************************************************************************
+* https://github.com/dhylands/projects/blob/master/lpc/lpc-vector-checksum/lpc-vector-checksum.c
+*
+*     Copyright (c) 2012 by Dave Hylands
+*           All Rights Reserved
+*
+*      Permission is granted to any individual or institution to use, copy,
+*  modify, or redistribute this file so long as it is not sold for profit,
+*  and that this copyright notice is retained.
+*
+***************************************************************************
+*
+*  This program calculates the vector checksum used in LPC17xx binary
+*  images.
+*
+*  Usage:   lpc-vector-checksum file
+*
+***************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+#include <string.h>
+
+/***************************************************************************/
+/**
+*   update_vector_checksum
+*  
+*   The algorithim is to write the checksum such that the checksum of the
+*   first 8 words is equal to zero.
+*  
+*   The LPC1768 uses little-endian, and this particular routine assumes
+*   that it's running on a little-endian architecture.
+*/
+static int update_vector_checksum( const char *filename )
+{
+    uint32_t    sum;
+    uint32_t    header[8];
+    FILE       *fs;
+    int         i;
+
+    if (( fs = fopen( filename, "r+b" )) == NULL )
+    {
+        fprintf( stderr, "Unable to open '%s' for reading/writing (%d): %s\n", 
+                 filename, errno, strerror( errno ));
+        return 0;
+    }
+
+    if ( fread( header, sizeof( header ), 1, fs ) != 1 )
+    {
+        fprintf( stderr, "Failed to read header from '%s' (perhaps the file is too small?)",
+                 filename );
+        fclose( fs );
+        return 0;
+    }
+
+    sum = 0;
+    for ( i = 0; i < 7; i++ )
+    {
+        sum += header[i];
+    }
+    printf( "sum = 0x%08x, value to write = 0x%08x\n", sum, -sum );
+
+    /* write back the checksum to location 7
+     * http://sigalrm.blogspot.jp/2011/10/cortex-m3-exception-vector-checksum.html
+     */
+    fseek(fs, 0x1c, SEEK_SET);
+    sum = -sum;
+    fwrite(&sum, 4, 1, fs);
+
+    fclose( fs );
+
+    return 1;
+}
+
+/***************************************************************************/
+/**
+*   main
+*/
+int main( int argc, char **argv )
+{
+    int arg;
+
+    if ( argc < 2)
+    {
+        fprintf( stderr, "Usage: lpc-vector-checksum file ...\n" );
+        exit( 1 );
+    }
+
+    for ( arg = 1; arg < argc; arg++ )
+    {
+        update_vector_checksum( argv[ arg ]);
+    }
+
+    exit( 0 );
+    return 0;
+}
+
diff --git a/tool/mbed/mbed.mk b/tool/mbed/mbed.mk
new file mode 100644 (file)
index 0000000..0f12ee2
--- /dev/null
@@ -0,0 +1,99 @@
+OBJECTS += \
+       $(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/startup_LPC11xx.o \
+       $(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/cmsis_nvic.o \
+       $(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/system_LPC11Uxx.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/port_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/spi_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/analogin_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_irq_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/i2c_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/pwmout_api.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/sleep.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/pinmap.o \
+       $(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/us_ticker.o \
+       $(OBJDIR)/libraries/mbed/common/board.o \
+       $(OBJDIR)/libraries/mbed/common/mbed_interface.o \
+       $(OBJDIR)/libraries/mbed/common/exit.o \
+       $(OBJDIR)/libraries/mbed/common/rtc_time.o \
+       $(OBJDIR)/libraries/mbed/common/us_ticker_api.o \
+       $(OBJDIR)/libraries/mbed/common/pinmap_common.o \
+       $(OBJDIR)/libraries/mbed/common/error.o \
+       $(OBJDIR)/libraries/mbed/common/gpio.o \
+       $(OBJDIR)/libraries/mbed/common/semihost_api.o \
+       $(OBJDIR)/libraries/mbed/common/wait_api.o \
+       $(OBJDIR)/libraries/mbed/common/RawSerial.o \
+       $(OBJDIR)/libraries/mbed/common/Ticker.o \
+       $(OBJDIR)/libraries/mbed/common/FilePath.o \
+       $(OBJDIR)/libraries/mbed/common/I2C.o \
+       $(OBJDIR)/libraries/mbed/common/FileBase.o \
+       $(OBJDIR)/libraries/mbed/common/retarget.o \
+       $(OBJDIR)/libraries/mbed/common/Serial.o \
+       $(OBJDIR)/libraries/mbed/common/Stream.o \
+       $(OBJDIR)/libraries/mbed/common/FileSystemLike.o \
+       $(OBJDIR)/libraries/mbed/common/CallChain.o \
+       $(OBJDIR)/libraries/mbed/common/InterruptManager.o \
+       $(OBJDIR)/libraries/mbed/common/SerialBase.o \
+       $(OBJDIR)/libraries/mbed/common/BusInOut.o \
+       $(OBJDIR)/libraries/mbed/common/SPISlave.o \
+       $(OBJDIR)/libraries/mbed/common/I2CSlave.o \
+       $(OBJDIR)/libraries/mbed/common/FunctionPointer.o \
+       $(OBJDIR)/libraries/mbed/common/Timer.o \
+       $(OBJDIR)/libraries/mbed/common/SPI.o \
+       $(OBJDIR)/libraries/mbed/common/Timeout.o \
+       $(OBJDIR)/libraries/mbed/common/Ethernet.o \
+       $(OBJDIR)/libraries/mbed/common/TimerEvent.o \
+       $(OBJDIR)/libraries/mbed/common/CAN.o \
+       $(OBJDIR)/libraries/mbed/common/BusOut.o \
+       $(OBJDIR)/libraries/mbed/common/FileLike.o \
+       $(OBJDIR)/libraries/mbed/common/BusIn.o \
+       $(OBJDIR)/libraries/mbed/common/InterruptIn.o \
+       $(OBJDIR)/libraries/mbed/common/LocalFileSystem.o \
+       $(OBJDIR)/libraries/USBDevice/USBHID/USBMouse.o \
+       $(OBJDIR)/libraries/USBDevice/USBHID/USBHID.o \
+       $(OBJDIR)/libraries/USBDevice/USBHID/USBMouseKeyboard.o \
+       $(OBJDIR)/libraries/USBDevice/USBHID/USBKeyboard.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_KL25Z.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBDevice.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC17.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC40.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC11U.o \
+       $(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_STM32F4.o \
+       $(OBJDIR)/libraries/USBDevice/USBAudio/USBAudio.o \
+       $(OBJDIR)/libraries/USBDevice/USBSerial/USBSerial.o \
+       $(OBJDIR)/libraries/USBDevice/USBSerial/USBCDC.o \
+       $(OBJDIR)/libraries/USBDevice/USBMSD/USBMSD.o \
+       $(OBJDIR)/libraries/USBDevice/USBMIDI/USBMIDI.o
+
+INCLUDE_PATHS += \
+       -I$(MBED_DIR)/libraries/mbed/targets \
+       -I$(MBED_DIR)/libraries/mbed/targets/hal \
+       -I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP \
+       -I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX \
+       -I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U35_401 \
+       -I$(MBED_DIR)/libraries/mbed/targets/cmsis \
+       -I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP \
+       -I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX \
+       -I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM \
+       -I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/TARGET_LPC11U35_401 \
+       -I$(MBED_DIR)/libraries/mbed \
+       -I$(MBED_DIR)/libraries/mbed/hal \
+       -I$(MBED_DIR)/libraries/mbed/api \
+       -I$(MBED_DIR)/libraries/mbed/common \
+       -I$(MBED_DIR)/libraries/USBDevice \
+       -I$(MBED_DIR)/libraries/USBDevice/USBHID \
+       -I$(MBED_DIR)/libraries/USBDevice/USBDevice \
+       -I$(MBED_DIR)/libraries/USBDevice/USBAudio \
+       -I$(MBED_DIR)/libraries/USBDevice/USBSerial \
+       -I$(MBED_DIR)/libraries/USBDevice/USBMSD \
+       -I$(MBED_DIR)/libraries/USBDevice/USBMIDI
+
+OBJECTS += \
+       $(OBJDIR)/protocol/mbed/mbed_driver.o \
+       $(OBJDIR)/protocol/mbed/HIDKeyboard.o \
+
+INCLUDE_PATHS += \
+       -I$(TMK_DIR)/protocol/mbed
+
+LINKER_SCRIPT = $(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/TARGET_LPC11U35_401/LPC11U35.ld