From f15b2691c92e1d9b3c0e59363c803ec540303f37 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 15 Jun 2014 13:56:17 +0900 Subject: Add keyboard/mbed_onekey --- common/debug.h | 2 +- common/print.c | 22 --------- common/print.h | 145 +++++++++++++++++++++++++++++---------------------------- 3 files changed, 75 insertions(+), 94 deletions(-) (limited to 'common') diff --git a/common/debug.h b/common/debug.h index 8aaa5ed91..399b2d0a7 100644 --- a/common/debug.h +++ b/common/debug.h @@ -26,7 +26,7 @@ along with this program. If not, see . #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 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)) /* DO NOT USE these anymore */ diff --git a/common/print.c b/common/print.c index 783bb4e9b..c13a29f31 100644 --- a/common/print.c +++ b/common/print.c @@ -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 diff --git a/common/print.h b/common/print.h index 930e84be9..6a6771f71 100644 --- a/common/print.h +++ b/common/print.h @@ -27,98 +27,79 @@ #include #include -#include -#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 +#ifdef __AVR__ + +#include "xprintf.h" -#ifndef NO_PRINT + +// TODO: avoid collision with arduino/Print.h +#ifndef __cplusplus +#define print(s) xputs(PSTR(s)) +#endif +#define println(s) xputs(PSTR(s "\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 __arm__ -void print_lf(void); -void print_crlf(void); +#include "mbed.h" +Serial ser(UART_TX, UART_RX); +#define xprintf ser.printf +#define print(s) xprintf(s) +#define println(s) xprintf(s "\n") +/* TODO: to select output destinations: UART/USBSerial */ +#define print_set_sendchar(func) +#endif /* __AVR__ */ -/* 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) /* decimal */ -#define print_dec(i) xprintf("%u", i) -#define print_decs(i) xprintf("%d", i) - +#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) - +#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 -- cgit v1.2.3-70-g09d2 From 867f115bee190515aa195dc3e58f1c381ea9695b Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 16 Jun 2014 11:12:45 +0900 Subject: Port timer to mbed --- common.mk | 2 +- common/avr/timer.c | 117 +++++++++++++++++++++++++++++++++++++++++ common/mbed/timer.c | 40 ++++++++++++++ common/timer.c | 116 ---------------------------------------- common/timer.h | 19 ------- keyboard/mbed_onekey/common.mk | 29 +++++----- keyboard/mbed_onekey/main.cpp | 21 ++++++-- 7 files changed, 189 insertions(+), 155 deletions(-) create mode 100644 common/avr/timer.c create mode 100644 common/mbed/timer.c delete mode 100644 common/timer.c (limited to 'common') diff --git a/common.mk b/common.mk index 62ac0ff78..9d58fa214 100644 --- a/common.mk +++ b/common.mk @@ -7,7 +7,7 @@ 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)/avr/timer.c \ $(COMMON_DIR)/print.c \ $(COMMON_DIR)/bootloader.c \ $(COMMON_DIR)/suspend.c \ diff --git a/common/avr/timer.c b/common/avr/timer.c new file mode 100644 index 000000000..292b41c3a --- /dev/null +++ b/common/avr/timer.c @@ -0,0 +1,117 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#include +#include +#include +#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< - -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 . -*/ - -#include -#include -#include -#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<. #include -#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/keyboard/mbed_onekey/common.mk b/keyboard/mbed_onekey/common.mk index f21fce886..975ae9d0d 100644 --- a/keyboard/mbed_onekey/common.mk +++ b/keyboard/mbed_onekey/common.mk @@ -1,19 +1,20 @@ COMMON_DIR = common OBJECTS += \ -# $(COMMON_DIR)/host.o \ -# $(COMMON_DIR)/keyboard.o \ -# $(COMMON_DIR)/action.o \ -# $(COMMON_DIR)/action_tapping.o \ -# $(COMMON_DIR)/action_macro.o \ -# $(COMMON_DIR)/action_layer.o \ -# $(COMMON_DIR)/action_util.o \ -# $(COMMON_DIR)/keymap.o \ -# $(COMMON_DIR)/timer.o \ - $(COMMON_DIR)/print.o \ -# $(COMMON_DIR)/bootloader.o \ -# $(COMMON_DIR)/suspend.o \ - $(COMMON_DIR)/xprintf.o \ - $(COMMON_DIR)/util.o + $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ INCLUDE_PATHS += \ -I$(TMK_DIR)/$(COMMON_DIR) + + + + +# $(OBJDIR)/$(COMMON_DIR)/host.o \ +# $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ +# $(OBJDIR)/$(COMMON_DIR)/action.o \ +# $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ +# $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ +# $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ +# $(OBJDIR)/$(COMMON_DIR)/action_util.o \ +# $(OBJDIR)/$(COMMON_DIR)/keymap.o \ +# $(OBJDIR)/$(COMMON_DIR)/bootloader.o \ +# $(OBJDIR)/$(COMMON_DIR)/suspend.o \ diff --git a/keyboard/mbed_onekey/main.cpp b/keyboard/mbed_onekey/main.cpp index 581534e02..1df940aa9 100644 --- a/keyboard/mbed_onekey/main.cpp +++ b/keyboard/mbed_onekey/main.cpp @@ -1,6 +1,7 @@ #include "mbed.h" #include "HIDKeyboard.h" #include "debug.h" +#include "timer.h" /* //#define DEBUG @@ -27,11 +28,16 @@ int main(void) { //led_red = 0; //led_green = 0; debug_enable = true; - dprintf("HIDKeyboard:\n"); - print("aaa"); + dprintf("HIDKeyboard:\r\n"); + + timer_init(); + xprintf("timer: %i\r\n", timer_read()); report_keyboard_t report = { 2, 0, 4, }; //a report_keyboard_t report_off = { 0 }; + + bool last_isp = isp; + uint32_t last_timer; while (1) { //keyboard.mediaControl(KEY_VOLUME_DOWN); //keyboard.printf("Hello World from Mbed\r\n"); @@ -42,14 +48,19 @@ int main(void) { //leds = keyboard.lockStatus(); //ser.putc(ser.getc()); + if (last_isp == isp) continue; if (isp == 0) { led_red = 0; // on - keyboard.sendReport(report); + xprintf("timer: %i\r\n", timer_read32()); + xprintf("diff: %i\r\n", timer_elapsed32(last_timer)); + //keyboard.sendReport(report); } else { led_red = 1; // off - keyboard.sendReport(report_off); + //keyboard.sendReport(report_off); } - led_green = !led_green; + last_isp = isp; + last_timer = timer_read(); + //led_green = !led_green; //wait(0.5); } } -- cgit v1.2.3-70-g09d2 From 04fe78ee0a7fe9baed39f021799a3dbb24ebeb36 Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 16 Jun 2014 15:38:39 +0900 Subject: Fix print and timer --- common/avr/timer_avr.h | 42 ++++ common/avr/xprintf.S | 500 +++++++++++++++++++++++++++++++++++++++++ common/avr/xprintf.h | 103 +++++++++ common/debug.h | 4 +- common/debug_config.h | 9 +- common/mbed/timer.c | 1 + common/nodebug.h | 2 - common/print.h | 16 +- common/xprintf.S | 500 ----------------------------------------- common/xprintf.h | 103 --------- keyboard/mbed_onekey/common.mk | 3 +- 11 files changed, 663 insertions(+), 620 deletions(-) create mode 100644 common/avr/timer_avr.h create mode 100644 common/avr/xprintf.S create mode 100644 common/avr/xprintf.h delete mode 100644 common/xprintf.S delete mode 100644 common/xprintf.h (limited to 'common') diff --git a/common/avr/timer_avr.h b/common/avr/timer_avr.h new file mode 100644 index 000000000..0e85eb101 --- /dev/null +++ b/common/avr/timer_avr.h @@ -0,0 +1,42 @@ +/* +Copyright 2011 Jun Wako + +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 . +*/ + +#ifndef TIMER_AVR_H +#define TIMER_AVR_H 1 + +#include + +#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 index 000000000..0cec70ce2 --- /dev/null +++ b/common/avr/xprintf.S @@ -0,0 +1,500 @@ +;---------------------------------------------------------------------------; +; Extended itoa, puts, printf and atoi (C)ChaN, 2011 +;---------------------------------------------------------------------------; + + // Base size is 152 bytes +#define CR_CRLF 0 // Convert \n to \r\n (+10 bytes) +#define USE_XPRINTF 1 // Enable xprintf function (+194 bytes) +#define USE_XSPRINTF 0 // Add xsprintf function (+78 bytes) +#define USE_XFPRINTF 0 // Add xfprintf function (+54 bytes) +#define USE_XATOI 0 // Enable xatoi function (+182 bytes) + + +#if FLASHEND > 0x1FFFF +#error xitoa module does not support 256K devices +#endif + +.nolist +#include // Include device specific definitions. +.list + +#ifdef SPM_PAGESIZE // Recent devices have "lpm Rd,Z+" and "movw". +.macro _LPMI reg + lpm \reg, Z+ +.endm +.macro _MOVW dh,dl, sh,sl + movw \dl, \sl +.endm +#else // Earlier devices do not have "lpm Rd,Z+" nor "movw". +.macro _LPMI reg + lpm + mov \reg, r0 + adiw ZL, 1 +.endm +.macro _MOVW dh,dl, sh,sl + mov \dl, \sl + mov \dh, \sh +.endm +#endif + + + +;--------------------------------------------------------------------------- +; Stub function to forward to user output function +; +;Prototype: void xputc (char chr // a character to be output +; ); +;Size: 12/12 words + +.section .bss +.global xfunc_out ; xfunc_out must be initialized before using this module. +xfunc_out: .ds.w 1 +.section .text + + +.func xputc +.global xputc +xputc: +#if CR_CRLF + cpi r24, 10 ;LF --> CRLF + brne 1f ; + ldi r24, 13 ; + rcall 1f ; + ldi r24, 10 ;/ +1: +#endif + push ZH + push ZL + lds ZL, xfunc_out+0 ;Pointer to the registered output function. + lds ZH, xfunc_out+1 ;/ + sbiw ZL, 0 ;Skip if null + breq 2f ;/ + icall +2: pop ZL + pop ZH + ret +.endfunc + + + +;--------------------------------------------------------------------------- +; Direct ROM string output +; +;Prototype: void xputs (const char *str_p // rom string to be output +; ); + +.func xputs +.global xputs +xputs: + _MOVW ZH,ZL, r25,r24 ; Z = pointer to rom string +1: _LPMI r24 + cpi r24, 0 + breq 2f + rcall xputc + rjmp 1b +2: ret +.endfunc + + +;--------------------------------------------------------------------------- +; Extended direct numeral string output (32bit version) +; +;Prototype: void xitoa (long value, // value to be output +; char radix, // radix +; char width); // minimum width +; + +.func xitoa +.global xitoa +xitoa: + ;r25:r22 = value, r20 = base, r18 = digits + clr r31 ;r31 = stack level + ldi r30, ' ' ;r30 = sign + ldi r19, ' ' ;r19 = filler + sbrs r20, 7 ;When base indicates signd format and the value + rjmp 0f ;is minus, add a '-'. + neg r20 ; + sbrs r25, 7 ; + rjmp 0f ; + ldi r30, '-' ; + com r22 ; + com r23 ; + com r24 ; + com r25 ; + adc r22, r1 ; + adc r23, r1 ; + adc r24, r1 ; + adc r25, r1 ;/ +0: sbrs r18, 7 ;When digits indicates zero filled, + rjmp 1f ;filler is '0'. + neg r18 ; + ldi r19, '0' ;/ + ;----- string conversion loop +1: ldi r21, 32 ;r26 = r25:r22 % r20 + clr r26 ;r25:r22 /= r20 +2: lsl r22 ; + rol r23 ; + rol r24 ; + rol r25 ; + rol r26 ; + cp r26, r20 ; + brcs 3f ; + sub r26, r20 ; + inc r22 ; +3: dec r21 ; + brne 2b ;/ + cpi r26, 10 ;r26 is a numeral digit '0'-'F' + brcs 4f ; + subi r26, -7 ; +4: subi r26, -'0' ;/ + push r26 ;Stack it + inc r31 ;/ + cp r22, r1 ;Repeat until r25:r22 gets zero + cpc r23, r1 ; + cpc r24, r1 ; + cpc r25, r1 ; + brne 1b ;/ + + cpi r30, '-' ;Minus sign if needed + brne 5f ; + push r30 ; + inc r31 ;/ +5: cp r31, r18 ;Filler + brcc 6f ; + push r19 ; + inc r31 ; + rjmp 5b ;/ + +6: pop r24 ;Flush stacked digits and exit + rcall xputc ; + dec r31 ; + brne 6b ;/ + + ret +.endfunc + + + +;---------------------------------------------------------------------------; +; Formatted string output (16/32bit version) +; +;Prototype: +; void __xprintf (const char *format_p, ...); +; void __xsprintf(char*, const char *format_p, ...); +; void __xfprintf(void(*func)(char), const char *format_p, ...); +; + +#if USE_XPRINTF + +.func xvprintf +xvprintf: + ld ZL, Y+ ;Z = pointer to format string + ld ZH, Y+ ;/ + +0: _LPMI r24 ;Get a format char + cpi r24, 0 ;End of format string? + breq 90f ;/ + cpi r24, '%' ;Is format? + breq 20f ;/ +1: rcall xputc ;Put a normal character + rjmp 0b ;/ +90: ret + +20: ldi r18, 0 ;r18: digits + clt ;T: filler + _LPMI r21 ;Get flags + cpi r21, '%' ;Is a %? + breq 1b ;/ + cpi r21, '0' ;Zero filled? + brne 23f ; + set ;/ +22: _LPMI r21 ;Get width +23: cpi r21, '9'+1 ; + brcc 24f ; + subi r21, '0' ; + brcs 90b ; + lsl r18 ; + mov r0, r18 ; + lsl r18 ; + lsl r18 ; + add r18, r0 ; + add r18, r21 ; + rjmp 22b ;/ + +24: brtc 25f ;get value (low word) + neg r18 ; +25: ld r24, Y+ ; + ld r25, Y+ ;/ + cpi r21, 'c' ;Is type character? + breq 1b ;/ + cpi r21, 's' ;Is type RAM string? + breq 50f ;/ + cpi r21, 'S' ;Is type ROM string? + breq 60f ;/ + _MOVW r23,r22,r25,r24 ;r25:r22 = value + clr r24 ; + clr r25 ; + clt ;/ + cpi r21, 'l' ;Is long int? + brne 26f ; + ld r24, Y+ ;get value (high word) + ld r25, Y+ ; + set ; + _LPMI r21 ;/ +26: cpi r21, 'd' ;Is type signed decimal? + brne 27f ;/ + ldi r20, -10 ; + brts 40f ; + sbrs r23, 7 ; + rjmp 40f ; + ldi r24, -1 ; + ldi r25, -1 ; + rjmp 40f ;/ +27: cpi r21, 'u' ;Is type unsigned decimal? + ldi r20, 10 ; + breq 40f ;/ + cpi r21, 'X' ;Is type hexdecimal? + ldi r20, 16 ; + breq 40f ;/ + cpi r21, 'b' ;Is type binary? + ldi r20, 2 ; + breq 40f ;/ + ret ;abort +40: push ZH ;Output the value + push ZL ; + rcall xitoa ; +42: pop ZL ; + pop ZH ; + rjmp 0b ;/ + +50: push ZH ;Put a string on the RAM + push ZL + _MOVW ZH,ZL, r25,r24 +51: ld r24, Z+ + cpi r24, 0 + breq 42b + rcall xputc + rjmp 51b + +60: push ZH ;Put a string on the ROM + push ZL + rcall xputs + rjmp 42b +.endfunc + + +.func __xprintf +.global __xprintf +__xprintf: + push YH + push YL + in YL, _SFR_IO_ADDR(SPL) +#ifdef SPH + in YH, _SFR_IO_ADDR(SPH) +#else + clr YH +#endif + adiw YL, 5 ;Y = pointer to arguments + rcall xvprintf + pop YL + pop YH + ret +.endfunc + + +#if USE_XSPRINTF + +.func __xsprintf +putram: + _MOVW ZH,ZL, r15,r14 + st Z+, r24 + _MOVW r15,r14, ZH,ZL + ret +.global __xsprintf +__xsprintf: + push YH + push YL + in YL, _SFR_IO_ADDR(SPL) +#ifdef SPH + in YH, _SFR_IO_ADDR(SPH) +#else + clr YH +#endif + adiw YL, 5 ;Y = pointer to arguments + lds ZL, xfunc_out+0 ;Save registered output function + lds ZH, xfunc_out+1 ; + push ZL ; + push ZH ;/ + ldi ZL, lo8(pm(putram));Set local output function + ldi ZH, hi8(pm(putram)); + sts xfunc_out+0, ZL ; + sts xfunc_out+1, ZH ;/ + push r15 ;Initialize pointer to string buffer + push r14 ; + ld r14, Y+ ; + ld r15, Y+ ;/ + rcall xvprintf + _MOVW ZH,ZL, r15,r14 ;Terminate string + st Z, r1 ; + pop r14 ; + pop r15 ;/ + pop ZH ;Restore registered output function + pop ZL ; + sts xfunc_out+0, ZL ; + sts xfunc_out+1, ZH ;/ + pop YL + pop YH + ret +.endfunc +#endif + + +#if USE_XFPRINTF +.func __xfprintf +.global __xfprintf +__xfprintf: + push YH + push YL + in YL, _SFR_IO_ADDR(SPL) +#ifdef SPH + in YH, _SFR_IO_ADDR(SPH) +#else + clr YH +#endif + adiw YL, 5 ;Y = pointer to arguments + lds ZL, xfunc_out+0 ;Save registered output function + lds ZH, xfunc_out+1 ; + push ZL ; + push ZH ;/ + ld ZL, Y+ ;Set output function + ld ZH, Y+ ; + sts xfunc_out+0, ZL ; + sts xfunc_out+1, ZH ;/ + rcall xvprintf + pop ZH ;Restore registered output function + pop ZL ; + sts xfunc_out+0, ZL ; + sts xfunc_out+1, ZH ;/ + pop YL + pop YH + ret +.endfunc +#endif + +#endif + + + +;--------------------------------------------------------------------------- +; Extended numeral string input +; +;Prototype: +; char xatoi ( /* 1: Successful, 0: Failed */ +; const char **str, /* pointer to pointer to source string */ +; long *res /* result */ +; ); +; + + +#if USE_XATOI +.func xatoi +.global xatoi +xatoi: + _MOVW r1, r0, r23, r22 + _MOVW XH, XL, r25, r24 + ld ZL, X+ + ld ZH, X+ + clr r18 ;r21:r18 = 0; + clr r19 ; + clr r20 ; + clr r21 ;/ + clt ;T = 0; + + ldi r25, 10 ;r25 = 10; + rjmp 41f ;/ +40: adiw ZL, 1 ;Z++; +41: ld r22, Z ;r22 = *Z; + cpi r22, ' ' ;if(r22 == ' ') continue + breq 40b ;/ + brcs 70f ;if(r22 < ' ') error; + cpi r22, '-' ;if(r22 == '-') { + brne 42f ; T = 1; + set ; continue; + rjmp 40b ;} +42: cpi r22, '9'+1 ;if(r22 > '9') error; + brcc 70f ;/ + cpi r22, '0' ;if(r22 < '0') error; + brcs 70f ;/ + brne 51f ;if(r22 > '0') cv_start; + ldi r25, 8 ;r25 = 8; + adiw ZL, 1 ;r22 = *(++Z); + ld r22, Z ;/ + cpi r22, ' '+1 ;if(r22 <= ' ') exit; + brcs 80f ;/ + cpi r22, 'b' ;if(r22 == 'b') { + brne 43f ; r25 = 2; + ldi r25, 2 ; cv_start; + rjmp 50f ;} +43: cpi r22, 'x' ;if(r22 != 'x') error; + brne 51f ;/ + ldi r25, 16 ;r25 = 16; + +50: adiw ZL, 1 ;Z++; + ld r22, Z ;r22 = *Z; +51: cpi r22, ' '+1 ;if(r22 <= ' ') break; + brcs 80f ;/ + cpi r22, 'a' ;if(r22 >= 'a') r22 =- 0x20; + brcs 52f ; + subi r22, 0x20 ;/ +52: subi r22, '0' ;if((r22 -= '0') < 0) error; + brcs 70f ;/ + cpi r22, 10 ;if(r22 >= 10) { + brcs 53f ; r22 -= 7; + subi r22, 7 ; if(r22 < 10) + cpi r22, 10 ; + brcs 70f ;} +53: cp r22, r25 ;if(r22 >= r25) error; + brcc 70f ;/ +60: ldi r24, 33 ;r21:r18 *= r25; + sub r23, r23 ; +61: brcc 62f ; + add r23, r25 ; +62: lsr r23 ; + ror r21 ; + ror r20 ; + ror r19 ; + ror r18 ; + dec r24 ; + brne 61b ;/ + add r18, r22 ;r21:r18 += r22; + adc r19, r24 ; + adc r20, r24 ; + adc r21, r24 ;/ + rjmp 50b ;repeat + +70: ldi r24, 0 + rjmp 81f +80: ldi r24, 1 +81: brtc 82f + clr r22 + com r18 + com r19 + com r20 + com r21 + adc r18, r22 + adc r19, r22 + adc r20, r22 + adc r21, r22 +82: st -X, ZH + st -X, ZL + _MOVW XH, XL, r1, r0 + st X+, r18 + st X+, r19 + st X+, r20 + st X+, r21 + clr r1 + ret +.endfunc +#endif + + diff --git a/common/avr/xprintf.h b/common/avr/xprintf.h new file mode 100644 index 000000000..f58bca817 --- /dev/null +++ b/common/avr/xprintf.h @@ -0,0 +1,103 @@ +/*--------------------------------------------------------------------------- + Extended itoa, puts and printf (C)ChaN, 2011 +-----------------------------------------------------------------------------*/ + +#ifndef XPRINTF_H +#define XPRINTF_H + +#include +#include + +extern void (*xfunc_out)(uint8_t); +#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func) + +/* This is a pointer to user defined output function. It must be initialized + before using this modle. +*/ + +void xputc(char chr); + +/* This is a stub function to forward outputs to user defined output function. + All outputs from this module are output via this function. +*/ + + +/*-----------------------------------------------------------------------------*/ +void xputs(const char *string_p); + +/* The string placed in the ROM is forwarded to xputc() directly. +*/ + + +/*-----------------------------------------------------------------------------*/ +void xitoa(long value, char radix, char width); + +/* Extended itoa(). + + value radix width output + 100 10 6 " 100" + 100 10 -6 "000100" + 100 10 0 "100" + 4294967295 10 0 "4294967295" + 4294967295 -10 0 "-1" + 655360 16 -8 "000A0000" + 1024 16 0 "400" + 0x55 2 -8 "01010101" +*/ + + +/*-----------------------------------------------------------------------------*/ +#define xprintf(format, ...) __xprintf(PSTR(format), ##__VA_ARGS__) +#define xsprintf(str, format, ...) __xsprintf(str, PSTR(format), ##__VA_ARGS__) +#define xfprintf(func, format, ...) __xfprintf(func, PSTR(format), ##__VA_ARGS__) + +void __xprintf(const char *format_p, ...); /* Send formatted string to the registered device */ +void __xsprintf(char*, const char *format_p, ...); /* Put formatted string to the memory */ +void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */ + +/* Format string is placed in the ROM. The format flags is similar to printf(). + + %[flag][width][size]type + + flag + A '0' means filled with '0' when output is shorter than width. + ' ' is used in default. This is effective only numeral type. + width + Minimum width in decimal number. This is effective only numeral type. + Default width is zero. + size + A 'l' means the argument is long(32bit). Default is short(16bit). + This is effective only numeral type. + type + 'c' : Character, argument is the value + 's' : String placed on the RAM, argument is the pointer + 'S' : String placed on the ROM, argument is the pointer + 'd' : Signed decimal, argument is the value + 'u' : Unsigned decimal, argument is the value + 'X' : Hexdecimal, argument is the value + 'b' : Binary, argument is the value + '%' : '%' + +*/ + + +/*-----------------------------------------------------------------------------*/ +char xatoi(char **str, long *ret); + +/* Get value of the numeral string. + + str + Pointer to pointer to source string + + "0b11001010" binary + "0377" octal + "0xff800" hexdecimal + "1250000" decimal + "-25000" decimal + + ret + Pointer to return value +*/ + +#endif + diff --git a/common/debug.h b/common/debug.h index 399b2d0a7..8ca2569a4 100644 --- a/common/debug.h +++ b/common/debug.h @@ -25,13 +25,13 @@ along with this program. If not, see . #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 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)) /* 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 debugln(s) do { if (debug_enable) println(s); } 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 { \ diff --git a/common/debug_config.h b/common/debug_config.h index e00fd1033..0e67ee49f 100644 --- a/common/debug_config.h +++ b/common/debug_config.h @@ -38,14 +38,15 @@ typedef union { } debug_config_t; debug_config_t debug_config; +#ifdef __cplusplus +} +#endif + + /* 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/mbed/timer.c b/common/mbed/timer.c index a64a77239..c357ceb78 100644 --- a/common/mbed/timer.c +++ b/common/mbed/timer.c @@ -11,6 +11,7 @@ void SysTick_Handler(void) { void timer_init(void) { + timer_count = 0; SysTick_Config(SystemCoreClock / 1000); /* 1ms tick */ } diff --git a/common/nodebug.h b/common/nodebug.h index aec790bbc..8ef123f9f 100644 --- a/common/nodebug.h +++ b/common/nodebug.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef NODEBUG_H #define NODEBUG_H 1 -#include "debug_config.h" - #define dprint(s) #define dprintln(s) #define dprintf(fmt, ...) diff --git a/common/print.h b/common/print.h index 6a6771f71..4001bcf1b 100644 --- a/common/print.h +++ b/common/print.h @@ -35,7 +35,7 @@ #ifndef NO_PRINT -#ifdef __AVR__ +#if defined(__AVR__) #include "xprintf.h" @@ -44,21 +44,21 @@ #ifndef __cplusplus #define print(s) xputs(PSTR(s)) #endif -#define println(s) xputs(PSTR(s "\n")) +#define println(s) xputs(PSTR(s "\r\n")) #ifdef __cplusplus -extern "C" { +extern "C" #endif /* function pointer of sendchar to be used by print utility */ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); -#elif __arm__ +#elif defined(__arm__) + +#include "mbed/xprintf.h" -#include "mbed.h" -Serial ser(UART_TX, UART_RX); -#define xprintf ser.printf #define print(s) xprintf(s) -#define println(s) xprintf(s "\n") +#define println(s) xprintf(s "\r\n") + /* TODO: to select output destinations: UART/USBSerial */ #define print_set_sendchar(func) diff --git a/common/xprintf.S b/common/xprintf.S deleted file mode 100644 index 0cec70ce2..000000000 --- a/common/xprintf.S +++ /dev/null @@ -1,500 +0,0 @@ -;---------------------------------------------------------------------------; -; Extended itoa, puts, printf and atoi (C)ChaN, 2011 -;---------------------------------------------------------------------------; - - // Base size is 152 bytes -#define CR_CRLF 0 // Convert \n to \r\n (+10 bytes) -#define USE_XPRINTF 1 // Enable xprintf function (+194 bytes) -#define USE_XSPRINTF 0 // Add xsprintf function (+78 bytes) -#define USE_XFPRINTF 0 // Add xfprintf function (+54 bytes) -#define USE_XATOI 0 // Enable xatoi function (+182 bytes) - - -#if FLASHEND > 0x1FFFF -#error xitoa module does not support 256K devices -#endif - -.nolist -#include // Include device specific definitions. -.list - -#ifdef SPM_PAGESIZE // Recent devices have "lpm Rd,Z+" and "movw". -.macro _LPMI reg - lpm \reg, Z+ -.endm -.macro _MOVW dh,dl, sh,sl - movw \dl, \sl -.endm -#else // Earlier devices do not have "lpm Rd,Z+" nor "movw". -.macro _LPMI reg - lpm - mov \reg, r0 - adiw ZL, 1 -.endm -.macro _MOVW dh,dl, sh,sl - mov \dl, \sl - mov \dh, \sh -.endm -#endif - - - -;--------------------------------------------------------------------------- -; Stub function to forward to user output function -; -;Prototype: void xputc (char chr // a character to be output -; ); -;Size: 12/12 words - -.section .bss -.global xfunc_out ; xfunc_out must be initialized before using this module. -xfunc_out: .ds.w 1 -.section .text - - -.func xputc -.global xputc -xputc: -#if CR_CRLF - cpi r24, 10 ;LF --> CRLF - brne 1f ; - ldi r24, 13 ; - rcall 1f ; - ldi r24, 10 ;/ -1: -#endif - push ZH - push ZL - lds ZL, xfunc_out+0 ;Pointer to the registered output function. - lds ZH, xfunc_out+1 ;/ - sbiw ZL, 0 ;Skip if null - breq 2f ;/ - icall -2: pop ZL - pop ZH - ret -.endfunc - - - -;--------------------------------------------------------------------------- -; Direct ROM string output -; -;Prototype: void xputs (const char *str_p // rom string to be output -; ); - -.func xputs -.global xputs -xputs: - _MOVW ZH,ZL, r25,r24 ; Z = pointer to rom string -1: _LPMI r24 - cpi r24, 0 - breq 2f - rcall xputc - rjmp 1b -2: ret -.endfunc - - -;--------------------------------------------------------------------------- -; Extended direct numeral string output (32bit version) -; -;Prototype: void xitoa (long value, // value to be output -; char radix, // radix -; char width); // minimum width -; - -.func xitoa -.global xitoa -xitoa: - ;r25:r22 = value, r20 = base, r18 = digits - clr r31 ;r31 = stack level - ldi r30, ' ' ;r30 = sign - ldi r19, ' ' ;r19 = filler - sbrs r20, 7 ;When base indicates signd format and the value - rjmp 0f ;is minus, add a '-'. - neg r20 ; - sbrs r25, 7 ; - rjmp 0f ; - ldi r30, '-' ; - com r22 ; - com r23 ; - com r24 ; - com r25 ; - adc r22, r1 ; - adc r23, r1 ; - adc r24, r1 ; - adc r25, r1 ;/ -0: sbrs r18, 7 ;When digits indicates zero filled, - rjmp 1f ;filler is '0'. - neg r18 ; - ldi r19, '0' ;/ - ;----- string conversion loop -1: ldi r21, 32 ;r26 = r25:r22 % r20 - clr r26 ;r25:r22 /= r20 -2: lsl r22 ; - rol r23 ; - rol r24 ; - rol r25 ; - rol r26 ; - cp r26, r20 ; - brcs 3f ; - sub r26, r20 ; - inc r22 ; -3: dec r21 ; - brne 2b ;/ - cpi r26, 10 ;r26 is a numeral digit '0'-'F' - brcs 4f ; - subi r26, -7 ; -4: subi r26, -'0' ;/ - push r26 ;Stack it - inc r31 ;/ - cp r22, r1 ;Repeat until r25:r22 gets zero - cpc r23, r1 ; - cpc r24, r1 ; - cpc r25, r1 ; - brne 1b ;/ - - cpi r30, '-' ;Minus sign if needed - brne 5f ; - push r30 ; - inc r31 ;/ -5: cp r31, r18 ;Filler - brcc 6f ; - push r19 ; - inc r31 ; - rjmp 5b ;/ - -6: pop r24 ;Flush stacked digits and exit - rcall xputc ; - dec r31 ; - brne 6b ;/ - - ret -.endfunc - - - -;---------------------------------------------------------------------------; -; Formatted string output (16/32bit version) -; -;Prototype: -; void __xprintf (const char *format_p, ...); -; void __xsprintf(char*, const char *format_p, ...); -; void __xfprintf(void(*func)(char), const char *format_p, ...); -; - -#if USE_XPRINTF - -.func xvprintf -xvprintf: - ld ZL, Y+ ;Z = pointer to format string - ld ZH, Y+ ;/ - -0: _LPMI r24 ;Get a format char - cpi r24, 0 ;End of format string? - breq 90f ;/ - cpi r24, '%' ;Is format? - breq 20f ;/ -1: rcall xputc ;Put a normal character - rjmp 0b ;/ -90: ret - -20: ldi r18, 0 ;r18: digits - clt ;T: filler - _LPMI r21 ;Get flags - cpi r21, '%' ;Is a %? - breq 1b ;/ - cpi r21, '0' ;Zero filled? - brne 23f ; - set ;/ -22: _LPMI r21 ;Get width -23: cpi r21, '9'+1 ; - brcc 24f ; - subi r21, '0' ; - brcs 90b ; - lsl r18 ; - mov r0, r18 ; - lsl r18 ; - lsl r18 ; - add r18, r0 ; - add r18, r21 ; - rjmp 22b ;/ - -24: brtc 25f ;get value (low word) - neg r18 ; -25: ld r24, Y+ ; - ld r25, Y+ ;/ - cpi r21, 'c' ;Is type character? - breq 1b ;/ - cpi r21, 's' ;Is type RAM string? - breq 50f ;/ - cpi r21, 'S' ;Is type ROM string? - breq 60f ;/ - _MOVW r23,r22,r25,r24 ;r25:r22 = value - clr r24 ; - clr r25 ; - clt ;/ - cpi r21, 'l' ;Is long int? - brne 26f ; - ld r24, Y+ ;get value (high word) - ld r25, Y+ ; - set ; - _LPMI r21 ;/ -26: cpi r21, 'd' ;Is type signed decimal? - brne 27f ;/ - ldi r20, -10 ; - brts 40f ; - sbrs r23, 7 ; - rjmp 40f ; - ldi r24, -1 ; - ldi r25, -1 ; - rjmp 40f ;/ -27: cpi r21, 'u' ;Is type unsigned decimal? - ldi r20, 10 ; - breq 40f ;/ - cpi r21, 'X' ;Is type hexdecimal? - ldi r20, 16 ; - breq 40f ;/ - cpi r21, 'b' ;Is type binary? - ldi r20, 2 ; - breq 40f ;/ - ret ;abort -40: push ZH ;Output the value - push ZL ; - rcall xitoa ; -42: pop ZL ; - pop ZH ; - rjmp 0b ;/ - -50: push ZH ;Put a string on the RAM - push ZL - _MOVW ZH,ZL, r25,r24 -51: ld r24, Z+ - cpi r24, 0 - breq 42b - rcall xputc - rjmp 51b - -60: push ZH ;Put a string on the ROM - push ZL - rcall xputs - rjmp 42b -.endfunc - - -.func __xprintf -.global __xprintf -__xprintf: - push YH - push YL - in YL, _SFR_IO_ADDR(SPL) -#ifdef SPH - in YH, _SFR_IO_ADDR(SPH) -#else - clr YH -#endif - adiw YL, 5 ;Y = pointer to arguments - rcall xvprintf - pop YL - pop YH - ret -.endfunc - - -#if USE_XSPRINTF - -.func __xsprintf -putram: - _MOVW ZH,ZL, r15,r14 - st Z+, r24 - _MOVW r15,r14, ZH,ZL - ret -.global __xsprintf -__xsprintf: - push YH - push YL - in YL, _SFR_IO_ADDR(SPL) -#ifdef SPH - in YH, _SFR_IO_ADDR(SPH) -#else - clr YH -#endif - adiw YL, 5 ;Y = pointer to arguments - lds ZL, xfunc_out+0 ;Save registered output function - lds ZH, xfunc_out+1 ; - push ZL ; - push ZH ;/ - ldi ZL, lo8(pm(putram));Set local output function - ldi ZH, hi8(pm(putram)); - sts xfunc_out+0, ZL ; - sts xfunc_out+1, ZH ;/ - push r15 ;Initialize pointer to string buffer - push r14 ; - ld r14, Y+ ; - ld r15, Y+ ;/ - rcall xvprintf - _MOVW ZH,ZL, r15,r14 ;Terminate string - st Z, r1 ; - pop r14 ; - pop r15 ;/ - pop ZH ;Restore registered output function - pop ZL ; - sts xfunc_out+0, ZL ; - sts xfunc_out+1, ZH ;/ - pop YL - pop YH - ret -.endfunc -#endif - - -#if USE_XFPRINTF -.func __xfprintf -.global __xfprintf -__xfprintf: - push YH - push YL - in YL, _SFR_IO_ADDR(SPL) -#ifdef SPH - in YH, _SFR_IO_ADDR(SPH) -#else - clr YH -#endif - adiw YL, 5 ;Y = pointer to arguments - lds ZL, xfunc_out+0 ;Save registered output function - lds ZH, xfunc_out+1 ; - push ZL ; - push ZH ;/ - ld ZL, Y+ ;Set output function - ld ZH, Y+ ; - sts xfunc_out+0, ZL ; - sts xfunc_out+1, ZH ;/ - rcall xvprintf - pop ZH ;Restore registered output function - pop ZL ; - sts xfunc_out+0, ZL ; - sts xfunc_out+1, ZH ;/ - pop YL - pop YH - ret -.endfunc -#endif - -#endif - - - -;--------------------------------------------------------------------------- -; Extended numeral string input -; -;Prototype: -; char xatoi ( /* 1: Successful, 0: Failed */ -; const char **str, /* pointer to pointer to source string */ -; long *res /* result */ -; ); -; - - -#if USE_XATOI -.func xatoi -.global xatoi -xatoi: - _MOVW r1, r0, r23, r22 - _MOVW XH, XL, r25, r24 - ld ZL, X+ - ld ZH, X+ - clr r18 ;r21:r18 = 0; - clr r19 ; - clr r20 ; - clr r21 ;/ - clt ;T = 0; - - ldi r25, 10 ;r25 = 10; - rjmp 41f ;/ -40: adiw ZL, 1 ;Z++; -41: ld r22, Z ;r22 = *Z; - cpi r22, ' ' ;if(r22 == ' ') continue - breq 40b ;/ - brcs 70f ;if(r22 < ' ') error; - cpi r22, '-' ;if(r22 == '-') { - brne 42f ; T = 1; - set ; continue; - rjmp 40b ;} -42: cpi r22, '9'+1 ;if(r22 > '9') error; - brcc 70f ;/ - cpi r22, '0' ;if(r22 < '0') error; - brcs 70f ;/ - brne 51f ;if(r22 > '0') cv_start; - ldi r25, 8 ;r25 = 8; - adiw ZL, 1 ;r22 = *(++Z); - ld r22, Z ;/ - cpi r22, ' '+1 ;if(r22 <= ' ') exit; - brcs 80f ;/ - cpi r22, 'b' ;if(r22 == 'b') { - brne 43f ; r25 = 2; - ldi r25, 2 ; cv_start; - rjmp 50f ;} -43: cpi r22, 'x' ;if(r22 != 'x') error; - brne 51f ;/ - ldi r25, 16 ;r25 = 16; - -50: adiw ZL, 1 ;Z++; - ld r22, Z ;r22 = *Z; -51: cpi r22, ' '+1 ;if(r22 <= ' ') break; - brcs 80f ;/ - cpi r22, 'a' ;if(r22 >= 'a') r22 =- 0x20; - brcs 52f ; - subi r22, 0x20 ;/ -52: subi r22, '0' ;if((r22 -= '0') < 0) error; - brcs 70f ;/ - cpi r22, 10 ;if(r22 >= 10) { - brcs 53f ; r22 -= 7; - subi r22, 7 ; if(r22 < 10) - cpi r22, 10 ; - brcs 70f ;} -53: cp r22, r25 ;if(r22 >= r25) error; - brcc 70f ;/ -60: ldi r24, 33 ;r21:r18 *= r25; - sub r23, r23 ; -61: brcc 62f ; - add r23, r25 ; -62: lsr r23 ; - ror r21 ; - ror r20 ; - ror r19 ; - ror r18 ; - dec r24 ; - brne 61b ;/ - add r18, r22 ;r21:r18 += r22; - adc r19, r24 ; - adc r20, r24 ; - adc r21, r24 ;/ - rjmp 50b ;repeat - -70: ldi r24, 0 - rjmp 81f -80: ldi r24, 1 -81: brtc 82f - clr r22 - com r18 - com r19 - com r20 - com r21 - adc r18, r22 - adc r19, r22 - adc r20, r22 - adc r21, r22 -82: st -X, ZH - st -X, ZL - _MOVW XH, XL, r1, r0 - st X+, r18 - st X+, r19 - st X+, r20 - st X+, r21 - clr r1 - ret -.endfunc -#endif - - diff --git a/common/xprintf.h b/common/xprintf.h deleted file mode 100644 index f58bca817..000000000 --- a/common/xprintf.h +++ /dev/null @@ -1,103 +0,0 @@ -/*--------------------------------------------------------------------------- - Extended itoa, puts and printf (C)ChaN, 2011 ------------------------------------------------------------------------------*/ - -#ifndef XPRINTF_H -#define XPRINTF_H - -#include -#include - -extern void (*xfunc_out)(uint8_t); -#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func) - -/* This is a pointer to user defined output function. It must be initialized - before using this modle. -*/ - -void xputc(char chr); - -/* This is a stub function to forward outputs to user defined output function. - All outputs from this module are output via this function. -*/ - - -/*-----------------------------------------------------------------------------*/ -void xputs(const char *string_p); - -/* The string placed in the ROM is forwarded to xputc() directly. -*/ - - -/*-----------------------------------------------------------------------------*/ -void xitoa(long value, char radix, char width); - -/* Extended itoa(). - - value radix width output - 100 10 6 " 100" - 100 10 -6 "000100" - 100 10 0 "100" - 4294967295 10 0 "4294967295" - 4294967295 -10 0 "-1" - 655360 16 -8 "000A0000" - 1024 16 0 "400" - 0x55 2 -8 "01010101" -*/ - - -/*-----------------------------------------------------------------------------*/ -#define xprintf(format, ...) __xprintf(PSTR(format), ##__VA_ARGS__) -#define xsprintf(str, format, ...) __xsprintf(str, PSTR(format), ##__VA_ARGS__) -#define xfprintf(func, format, ...) __xfprintf(func, PSTR(format), ##__VA_ARGS__) - -void __xprintf(const char *format_p, ...); /* Send formatted string to the registered device */ -void __xsprintf(char*, const char *format_p, ...); /* Put formatted string to the memory */ -void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */ - -/* Format string is placed in the ROM. The format flags is similar to printf(). - - %[flag][width][size]type - - flag - A '0' means filled with '0' when output is shorter than width. - ' ' is used in default. This is effective only numeral type. - width - Minimum width in decimal number. This is effective only numeral type. - Default width is zero. - size - A 'l' means the argument is long(32bit). Default is short(16bit). - This is effective only numeral type. - type - 'c' : Character, argument is the value - 's' : String placed on the RAM, argument is the pointer - 'S' : String placed on the ROM, argument is the pointer - 'd' : Signed decimal, argument is the value - 'u' : Unsigned decimal, argument is the value - 'X' : Hexdecimal, argument is the value - 'b' : Binary, argument is the value - '%' : '%' - -*/ - - -/*-----------------------------------------------------------------------------*/ -char xatoi(char **str, long *ret); - -/* Get value of the numeral string. - - str - Pointer to pointer to source string - - "0b11001010" binary - "0377" octal - "0xff800" hexdecimal - "1250000" decimal - "-25000" decimal - - ret - Pointer to return value -*/ - -#endif - diff --git a/keyboard/mbed_onekey/common.mk b/keyboard/mbed_onekey/common.mk index 975ae9d0d..101a82205 100644 --- a/keyboard/mbed_onekey/common.mk +++ b/keyboard/mbed_onekey/common.mk @@ -1,16 +1,17 @@ COMMON_DIR = common OBJECTS += \ $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ + $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ INCLUDE_PATHS += \ -I$(TMK_DIR)/$(COMMON_DIR) +# $(OBJDIR)/$(COMMON_DIR)/action.o \ # $(OBJDIR)/$(COMMON_DIR)/host.o \ # $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ -# $(OBJDIR)/$(COMMON_DIR)/action.o \ # $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ # $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ # $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ -- cgit v1.2.3-70-g09d2 From c67ae2a6b546c822759352586c14cd9dccbbe0ff Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 17 Jun 2014 00:57:59 +0900 Subject: Port action_* to mbed --- common.mk | 2 +- common/action.c | 2 +- common/action.h | 13 ++++++++++--- common/action_layer.c | 2 +- common/action_layer.h | 2 +- common/action_macro.c | 8 ++++---- common/action_macro.h | 8 ++++---- common/action_util.c | 20 ++++++++++---------- common/action_util.h | 9 +++++++++ common/bootmagic.c | 2 +- common/host.c | 4 ++-- common/keyboard.c | 2 +- common/keyboard.h | 8 ++++---- common/keymap.c | 4 ++-- common/keymap.h | 2 +- common/print.h | 2 +- common/report.h | 22 +++++++++++----------- common/wait.h | 20 ++++++++++++++++++++ keyboard/mbed_onekey/HIDKeyboard.h | 11 +---------- keyboard/mbed_onekey/Makefile | 1 + keyboard/mbed_onekey/common.mk | 12 ++++++------ 21 files changed, 92 insertions(+), 64 deletions(-) create mode 100644 common/wait.h (limited to 'common') diff --git a/common.mk b/common.mk index 9d58fa214..9b5ef0ea8 100644 --- a/common.mk +++ b/common.mk @@ -11,7 +11,7 @@ SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/print.c \ $(COMMON_DIR)/bootloader.c \ $(COMMON_DIR)/suspend.c \ - $(COMMON_DIR)/xprintf.S \ + $(COMMON_DIR)/avr/xprintf.S \ $(COMMON_DIR)/util.c diff --git a/common/action.c b/common/action.c index fddb97c50..94498fe6c 100644 --- a/common/action.c +++ b/common/action.c @@ -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); diff --git a/common/action.h b/common/action.h index 077711c23..8a4736d7b 100644 --- a/common/action.h +++ b/common/action.h @@ -25,6 +25,10 @@ along with this program. If not, see . #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 */ diff --git a/common/action_layer.c b/common/action_layer.c index 526e24d53..c535615f4 100644 --- a/common/action_layer.c +++ b/common/action_layer.c @@ -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; diff --git a/common/action_layer.h b/common/action_layer.h index 034e00027..b6da353cf 100644 --- a/common/action_layer.h +++ b/common/action_layer.h @@ -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 diff --git a/common/action_macro.c b/common/action_macro.c index d85aee379..ba93fc8b2 100644 --- a/common/action_macro.c +++ b/common/action_macro.c @@ -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 . */ -#include #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 . #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 diff --git a/common/action_macro.h b/common/action_macro.h index 621826308..aedc32ec6 100644 --- a/common/action_macro.h +++ b/common/action_macro.h @@ -17,12 +17,12 @@ along with this program. If not, see . #ifndef ACTION_MACRO_H #define ACTION_MACRO_H #include -#include +#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; diff --git a/common/action_util.c b/common/action_util.c index 5f44b3812..dbee630d1 100644 --- a/common/action_util.c +++ b/common/action_util.c @@ -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); diff --git a/common/action_util.h b/common/action_util.h index f9d3161a8..a955638b4 100644 --- a/common/action_util.h +++ b/common/action_util.h @@ -20,6 +20,10 @@ along with this program. If not, see . #include #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/bootmagic.c b/common/bootmagic.c index 642d5face..b002a5856 100644 --- a/common/bootmagic.c +++ b/common/bootmagic.c @@ -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<. */ #include -#include +//#include #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"); diff --git a/common/keyboard.c b/common/keyboard.c index 2b66f20a0..b71d5bf13 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -100,7 +100,7 @@ void keyboard_task(void) for (uint8_t c = 0; c < MATRIX_COLS; c++) { if (matrix_change & ((matrix_row_t)1<. /* 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/wait.h b/common/wait.h new file mode 100644 index 000000000..40d00b0c7 --- /dev/null +++ b/common/wait.h @@ -0,0 +1,20 @@ +#ifndef WAIT_H +#define WAIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__AVR__) +# include +# 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/keyboard/mbed_onekey/HIDKeyboard.h b/keyboard/mbed_onekey/HIDKeyboard.h index b00c97b9b..4ebe610a6 100644 --- a/keyboard/mbed_onekey/HIDKeyboard.h +++ b/keyboard/mbed_onekey/HIDKeyboard.h @@ -3,16 +3,7 @@ #include "stdint.h" #include "stdbool.h" #include "USBHID.h" - - -typedef union { - uint8_t raw[8]; - struct { - uint8_t mods; - uint8_t reserved; - uint8_t keys[6]; - }; -} __attribute__ ((packed)) report_keyboard_t; +#include "report.h" class HIDKeyboard : public USBDevice { diff --git a/keyboard/mbed_onekey/Makefile b/keyboard/mbed_onekey/Makefile index e194052c1..1bc91bc7e 100644 --- a/keyboard/mbed_onekey/Makefile +++ b/keyboard/mbed_onekey/Makefile @@ -15,6 +15,7 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/./HIDKeyboard.o \ + $(OBJDIR)/./mbed_driver.o \ $(OBJDIR)/./main.o SYS_OBJECTS = diff --git a/keyboard/mbed_onekey/common.mk b/keyboard/mbed_onekey/common.mk index 101a82205..6eb7f7699 100644 --- a/keyboard/mbed_onekey/common.mk +++ b/keyboard/mbed_onekey/common.mk @@ -2,20 +2,20 @@ COMMON_DIR = common OBJECTS += \ $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ + $(OBJDIR)/$(COMMON_DIR)/action.o \ + $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ + $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ + $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ + $(OBJDIR)/$(COMMON_DIR)/action_util.o \ + $(OBJDIR)/$(COMMON_DIR)/host.o \ INCLUDE_PATHS += \ -I$(TMK_DIR)/$(COMMON_DIR) -# $(OBJDIR)/$(COMMON_DIR)/action.o \ -# $(OBJDIR)/$(COMMON_DIR)/host.o \ # $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ -# $(OBJDIR)/$(COMMON_DIR)/action_util.o \ # $(OBJDIR)/$(COMMON_DIR)/keymap.o \ # $(OBJDIR)/$(COMMON_DIR)/bootloader.o \ # $(OBJDIR)/$(COMMON_DIR)/suspend.o \ -- cgit v1.2.3-70-g09d2 From ee70fe59ee8ebc6dcbf55171b1a2dd72e1744ae6 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 17 Jun 2014 14:03:13 +0900 Subject: Fix debug.h and remove debug_config.h --- common/debug.h | 112 +++++++++++++++++++++++++++++++++++++------------- common/debug_config.h | 52 ----------------------- common/nodebug.h | 28 ++----------- 3 files changed, 87 insertions(+), 105 deletions(-) delete mode 100644 common/debug_config.h (limited to 'common') diff --git a/common/debug.h b/common/debug.h index 8ca2569a4..26472c8fa 100644 --- a/common/debug.h +++ b/common/debug.h @@ -19,44 +19,100 @@ along with this program. If not, see . #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(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)) - -/* DO NOT USE these anymore */ -#define debug(s) do { if (debug_enable) print(s); } while (0) -#define debugln(s) do { if (debug_enable) println(s); } 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 index 0e67ee49f..000000000 --- a/common/debug_config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2013 Jun Wako - -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 . -*/ - -#ifndef DEBUG_CONFIG_H -#define DEBUG_CONFIG_H 1 - -#include - - -#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; - -#ifdef __cplusplus -} -#endif - - -/* 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) - -#endif diff --git a/common/nodebug.h b/common/nodebug.h index 8ef123f9f..93309ada4 100644 --- a/common/nodebug.h +++ b/common/nodebug.h @@ -18,30 +18,8 @@ along with this program. If not, see . #ifndef NODEBUG_H #define NODEBUG_H 1 -#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 -- cgit v1.2.3-70-g09d2 From e81c70149ecf73256f8bb7d77cefc07f2b91d2be Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 17 Jun 2014 22:41:14 +0900 Subject: Fix common files for mbed --- common.mk | 10 +-- common/avr/bootloader.c | 148 +++++++++++++++++++++++++++++++++++ common/avr/eeconfig.c | 45 +++++++++++ common/avr/suspend.c | 98 +++++++++++++++++++++++ common/avr/suspend_avr.h | 27 +++++++ common/bootloader.c | 148 ----------------------------------- common/eeconfig.c | 45 ----------- common/host.h | 4 +- common/keyboard.c | 1 - common/keymap.c | 1 - common/mbed/bootloader.c | 4 + common/mbed/suspend.c | 6 ++ common/mbed/xprintf.cpp | 46 +++++++++++ common/mbed/xprintf.h | 17 ++++ common/mousekey.c | 1 - common/mousekey.h | 20 +++-- common/progmem.h | 11 +++ common/suspend.c | 76 ------------------ common/suspend.h | 20 ----- keyboard/mbed_onekey/Makefile | 8 ++ keyboard/mbed_onekey/common.mk | 70 +++++++++++++++-- keyboard/mbed_onekey/config.h | 7 ++ keyboard/mbed_onekey/gcc.mk | 3 +- keyboard/mbed_onekey/main.cpp | 109 ++++++++++---------------- keyboard/mbed_onekey/mbed_driver.cpp | 41 ++++++++++ keyboard/mbed_onekey/mbed_driver.h | 3 + 26 files changed, 591 insertions(+), 378 deletions(-) create mode 100644 common/avr/bootloader.c create mode 100644 common/avr/eeconfig.c create mode 100644 common/avr/suspend.c create mode 100644 common/avr/suspend_avr.h delete mode 100644 common/bootloader.c delete mode 100644 common/eeconfig.c create mode 100644 common/mbed/bootloader.c create mode 100644 common/mbed/suspend.c create mode 100644 common/mbed/xprintf.cpp create mode 100644 common/mbed/xprintf.h create mode 100644 common/progmem.h delete mode 100644 common/suspend.c create mode 100644 keyboard/mbed_onekey/config.h create mode 100644 keyboard/mbed_onekey/mbed_driver.cpp create mode 100644 keyboard/mbed_onekey/mbed_driver.h (limited to 'common') diff --git a/common.mk b/common.mk index 9b5ef0ea8..04f036477 100644 --- 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)/avr/timer.c \ $(COMMON_DIR)/print.c \ - $(COMMON_DIR)/bootloader.c \ - $(COMMON_DIR)/suspend.c \ + $(COMMON_DIR)/util.c \ + $(COMMON_DIR)/avr/suspend.c \ $(COMMON_DIR)/avr/xprintf.S \ - $(COMMON_DIR)/util.c + $(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 diff --git a/common/avr/bootloader.c b/common/avr/bootloader.c new file mode 100644 index 000000000..cda295b18 --- /dev/null +++ b/common/avr/bootloader.c @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include +#include +#include "bootloader.h" + +#ifdef PROTOCOL_LUFA +#include +#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< +#include +#include +#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 index 000000000..f44a036be --- /dev/null +++ b/common/avr/suspend.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include +#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< +#include +#include +#include +#include + + +#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/bootloader.c b/common/bootloader.c deleted file mode 100644 index cda295b18..000000000 --- a/common/bootloader.c +++ /dev/null @@ -1,148 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "bootloader.h" - -#ifdef PROTOCOL_LUFA -#include -#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< -#include -#include -#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/host.h b/common/host.h index a56e6c3b0..918af69e8 100644 --- a/common/host.h +++ b/common/host.h @@ -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 */ diff --git a/common/keyboard.c b/common/keyboard.c index b71d5bf13..9a809ff4a 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -15,7 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include -#include #include "keyboard.h" #include "matrix.h" #include "keymap.h" diff --git a/common/keymap.c b/common/keymap.c index 0df2e2edf..4c0b61b8c 100644 --- a/common/keymap.c +++ b/common/keymap.c @@ -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 . */ -#include #include "keymap.h" #include "report.h" #include "keycode.h" diff --git a/common/mbed/bootloader.c b/common/mbed/bootloader.c new file mode 100644 index 000000000..b51e83943 --- /dev/null +++ b/common/mbed/bootloader.c @@ -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 index 000000000..32651574f --- /dev/null +++ b/common/mbed/suspend.c @@ -0,0 +1,6 @@ +#include + + +void suspend_power_down(void) {} +bool suspend_wakeup_condition(void) { return true; } +void suspend_wakeup_init(void) {} diff --git a/common/mbed/xprintf.cpp b/common/mbed/xprintf.cpp new file mode 100644 index 000000000..4342b79f8 --- /dev/null +++ b/common/mbed/xprintf.cpp @@ -0,0 +1,46 @@ +#include +//#include +#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 index 000000000..26bc529e5 --- /dev/null +++ b/common/mbed/xprintf.h @@ -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 diff --git a/common/mousekey.c b/common/mousekey.c index 017be9411..23469476e 100644 --- a/common/mousekey.c +++ b/common/mousekey.c @@ -16,7 +16,6 @@ along with this program. If not, see . */ #include -#include #include "keycode.h" #include "host.h" #include "timer.h" diff --git a/common/mousekey.h b/common/mousekey.h index d8d7beaaa..6eede06b4 100644 --- a/common/mousekey.h +++ b/common/mousekey.h @@ -52,12 +52,16 @@ along with this program. If not, see . #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 diff --git a/common/progmem.h b/common/progmem.h new file mode 100644 index 000000000..09aeb8b7c --- /dev/null +++ b/common/progmem.h @@ -0,0 +1,11 @@ +#ifndef PROGMEM_H +#define PROGMEM_H 1 + +#if defined(__AVR__) +# include +#elif defined(__arm__) +# define PROGMEM +# define pgm_read_byte(p) *(p) +#endif + +#endif diff --git a/common/suspend.c b/common/suspend.c deleted file mode 100644 index 5b378892f..000000000 --- a/common/suspend.c +++ /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< #include -#include -#include -#include - - -#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/keyboard/mbed_onekey/Makefile b/keyboard/mbed_onekey/Makefile index 1bc91bc7e..e686f424e 100644 --- a/keyboard/mbed_onekey/Makefile +++ b/keyboard/mbed_onekey/Makefile @@ -18,6 +18,8 @@ OBJECTS = \ $(OBJDIR)/./mbed_driver.o \ $(OBJDIR)/./main.o +CONFIG_H = config.h + SYS_OBJECTS = INCLUDE_PATHS = -I. @@ -25,6 +27,12 @@ INCLUDE_PATHS = -I. LIBRARY_PATHS = LIBRARIES = +# Build Options +# Comment out to disable +#BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes + + include mbed.mk include common.mk include gcc.mk diff --git a/keyboard/mbed_onekey/common.mk b/keyboard/mbed_onekey/common.mk index 6eb7f7699..1bd7d6edb 100644 --- a/keyboard/mbed_onekey/common.mk +++ b/keyboard/mbed_onekey/common.mk @@ -1,21 +1,79 @@ COMMON_DIR = common OBJECTS += \ - $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ - $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ $(OBJDIR)/$(COMMON_DIR)/action.o \ $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ $(OBJDIR)/$(COMMON_DIR)/action_util.o \ $(OBJDIR)/$(COMMON_DIR)/host.o \ + $(OBJDIR)/$(COMMON_DIR)/keymap.o \ + $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ + $(OBJDIR)/$(COMMON_DIR)/util.o \ + $(OBJDIR)/$(COMMON_DIR)/mbed/suspend.o \ + $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ + $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ + $(OBJDIR)/$(COMMON_DIR)/mbed/bootloader.o \ INCLUDE_PATHS += \ -I$(TMK_DIR)/$(COMMON_DIR) +CC_FLAGS += -include $(CONFIG_H) + + + +# Option modules +ifdef BOOTMAGIC_ENABLE + $(error Not Supported) + OBJECTS += $(OBJDIR)/$(COMMON_DIR)/bootmagic.o + OBJECTS += $(OBJDIR)/$(COMMON_DIR)/mbed/eeprom.o + OPT_DEFS += -DBOOTMAGIC_ENABLE +endif + +ifdef MOUSEKEY_ENABLE + OBJECTS += $(OBJDIR)/$(COMMON_DIR)/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_DIR)/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_DIR)/sleep_led.c + OPT_DEFS += -DSLEEP_LED_ENABLE + OPT_DEFS += -DNO_SUSPEND_POWER_DOWN +endif +ifdef BACKLIGHT_ENABLE + $(error Not Supported) + SRC += $(COMMON_DIR)/backlight.c + OPT_DEFS += -DBACKLIGHT_ENABLE +endif -# $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ -# $(OBJDIR)/$(COMMON_DIR)/keymap.o \ -# $(OBJDIR)/$(COMMON_DIR)/bootloader.o \ -# $(OBJDIR)/$(COMMON_DIR)/suspend.o \ +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/keyboard/mbed_onekey/config.h b/keyboard/mbed_onekey/config.h new file mode 100644 index 000000000..a3aadd038 --- /dev/null +++ b/keyboard/mbed_onekey/config.h @@ -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/gcc.mk b/keyboard/mbed_onekey/gcc.mk index e31527bbc..0fc41fe27 100644 --- a/keyboard/mbed_onekey/gcc.mk +++ b/keyboard/mbed_onekey/gcc.mk @@ -10,7 +10,8 @@ SIZE = $(GCC_BIN)arm-none-eabi-size CHKSUM = ~/Dropbox/MBED/tool/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 += $(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 diff --git a/keyboard/mbed_onekey/main.cpp b/keyboard/mbed_onekey/main.cpp index 1df940aa9..b2f7243c8 100644 --- a/keyboard/mbed_onekey/main.cpp +++ b/keyboard/mbed_onekey/main.cpp @@ -1,66 +1,43 @@ -#include "mbed.h" -#include "HIDKeyboard.h" -#include "debug.h" -#include "timer.h" - -/* -//#define DEBUG -#ifdef DEBUG -Serial ser(UART_TX, UART_RX); -#define dprintf(fmt, ...) ser.printf(fmt, ## __VA_ARGS__) -#else -#define dprintf(fmt, ...) -#endif -*/ - - -// button and LEDs -DigitalIn isp(P0_1); -DigitalOut led_red(P0_20); -DigitalOut led_green(P0_21); - -//USBKeyboard -HIDKeyboard keyboard; - - -int main(void) { - //isp.mode(PullUp); - //led_red = 0; - //led_green = 0; - debug_enable = true; - dprintf("HIDKeyboard:\r\n"); - - timer_init(); - xprintf("timer: %i\r\n", timer_read()); - - report_keyboard_t report = { 2, 0, 4, }; //a - report_keyboard_t report_off = { 0 }; - - bool last_isp = isp; - uint32_t last_timer; - while (1) { - //keyboard.mediaControl(KEY_VOLUME_DOWN); - //keyboard.printf("Hello World from Mbed\r\n"); - //keyboard.keyCode('s', KEY_CTRL); - //keyboard.keyCode(KEY_CAPS_LOCK); - - //led_green = !led_green; - //leds = keyboard.lockStatus(); - //ser.putc(ser.getc()); - - if (last_isp == isp) continue; - if (isp == 0) { - led_red = 0; // on - xprintf("timer: %i\r\n", timer_read32()); - xprintf("diff: %i\r\n", timer_elapsed32(last_timer)); - //keyboard.sendReport(report); - } else { - led_red = 1; // off - //keyboard.sendReport(report_off); - } - last_isp = isp; - last_timer = timer_read(); - //led_green = !led_green; - //wait(0.5); - } -} +#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); + } + } +} diff --git a/keyboard/mbed_onekey/mbed_driver.cpp b/keyboard/mbed_onekey/mbed_driver.cpp new file mode 100644 index 000000000..333f8e378 --- /dev/null +++ b/keyboard/mbed_onekey/mbed_driver.cpp @@ -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 0; +} +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/keyboard/mbed_onekey/mbed_driver.h b/keyboard/mbed_onekey/mbed_driver.h new file mode 100644 index 000000000..dd1153b43 --- /dev/null +++ b/keyboard/mbed_onekey/mbed_driver.h @@ -0,0 +1,3 @@ +#include "host_driver.h" + +extern host_driver_t mbed_driver; -- cgit v1.2.3-70-g09d2 From 4c8e0fd0bd1712421f957ec5e0ca16fc6bbb3856 Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 19 Jun 2014 16:13:35 +0900 Subject: Port ps2_usb to mbed --- common/progmem.h | 1 + converter/ps2_usb/Makefile.mbed | 44 +++++++++++++++++++++++ converter/ps2_usb/config_mbed.h | 60 +++++++++++++++++++++++++++++++ converter/ps2_usb/keymap_common.c | 3 +- converter/ps2_usb/keymap_common.h | 1 - converter/ps2_usb/main.cpp | 46 ++++++++++++++++++++++++ converter/ps2_usb/matrix.c | 3 +- keyboard/mbed_onekey/Makefile | 2 +- protocol.mk | 1 + protocol/ps2.h | 65 ++++------------------------------ protocol/ps2_busywait.c | 16 +++++---- protocol/ps2_io.h | 15 ++++++++ protocol/ps2_io_avr.c | 74 +++++++++++++++++++++++++++++++++++++++ protocol/ps2_io_mbed.c | 60 +++++++++++++++++++++++++++++++ tool/mbed/common.mk | 42 +++++++++++----------- 15 files changed, 343 insertions(+), 90 deletions(-) create mode 100644 converter/ps2_usb/Makefile.mbed create mode 100644 converter/ps2_usb/config_mbed.h create mode 100644 converter/ps2_usb/main.cpp create mode 100644 protocol/ps2_io.h create mode 100644 protocol/ps2_io_avr.c create mode 100644 protocol/ps2_io_mbed.c (limited to 'common') diff --git a/common/progmem.h b/common/progmem.h index 09aeb8b7c..199b1bedf 100644 --- a/common/progmem.h +++ b/common/progmem.h @@ -6,6 +6,7 @@ #elif defined(__arm__) # define PROGMEM # define pgm_read_byte(p) *(p) +# define pgm_read_word(p) *(p) #endif #endif diff --git a/converter/ps2_usb/Makefile.mbed b/converter/ps2_usb/Makefile.mbed new file mode 100644 index 000000000..631f270f7 --- /dev/null +++ b/converter/ps2_usb/Makefile.mbed @@ -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 index 000000000..5819763e6 --- /dev/null +++ b/converter/ps2_usb/config_mbed.h @@ -0,0 +1,60 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#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 diff --git a/converter/ps2_usb/keymap_common.c b/converter/ps2_usb/keymap_common.c index 241d2e33b..e344fb416 100644 --- a/converter/ps2_usb/keymap_common.c +++ b/converter/ps2_usb/keymap_common.c @@ -15,10 +15,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #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)]); } diff --git a/converter/ps2_usb/keymap_common.h b/converter/ps2_usb/keymap_common.h index 216a8dc02..d783e01de 100644 --- a/converter/ps2_usb/keymap_common.h +++ b/converter/ps2_usb/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #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 index 000000000..860af149a --- /dev/null +++ b/converter/ps2_usb/main.cpp @@ -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); + } + } +} diff --git a/converter/ps2_usb/matrix.c b/converter/ps2_usb/matrix.c index 45344c0f7..45cf2a4a9 100644 --- a/converter/ps2_usb/matrix.c +++ b/converter/ps2_usb/matrix.c @@ -17,8 +17,6 @@ along with this program. If not, see . #include #include -#include -#include #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 index d0d1148ce..2f7399ba0 100644 --- a/keyboard/mbed_onekey/Makefile +++ b/keyboard/mbed_onekey/Makefile @@ -1,7 +1,7 @@ PROJECT = mbed_onekey TMK_DIR = ../.. -MBED_DIR = ./mbed-sdk +MBED_DIR = $(TMK_DIR)/mbed-sdk #VPATH += $(MBED_DIR):$(TMK_DIR) vpath %.s .:$(MBED_DIR):$(TMK_DIR) diff --git a/protocol.mk b/protocol.mk index 7f561e62d..ca435ba43 100644 --- a/protocol.mk +++ b/protocol.mk @@ -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/ps2.h b/protocol/ps2.h index 483eea720..acde679cf 100644 --- a/protocol/ps2.h +++ b/protocol/ps2.h @@ -39,8 +39,9 @@ POSSIBILITY OF SUCH DAMAGE. #define PS2_H #include -#include -#include +#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< -#include +#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< +#include + +/* 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< +#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 index 1bd7d6edb..93a927a3e 100644 --- a/tool/mbed/common.mk +++ b/tool/mbed/common.mk @@ -1,21 +1,21 @@ -COMMON_DIR = common OBJECTS += \ - $(OBJDIR)/$(COMMON_DIR)/action.o \ - $(OBJDIR)/$(COMMON_DIR)/action_tapping.o \ - $(OBJDIR)/$(COMMON_DIR)/action_macro.o \ - $(OBJDIR)/$(COMMON_DIR)/action_layer.o \ - $(OBJDIR)/$(COMMON_DIR)/action_util.o \ - $(OBJDIR)/$(COMMON_DIR)/host.o \ - $(OBJDIR)/$(COMMON_DIR)/keymap.o \ - $(OBJDIR)/$(COMMON_DIR)/keyboard.o \ - $(OBJDIR)/$(COMMON_DIR)/util.o \ - $(OBJDIR)/$(COMMON_DIR)/mbed/suspend.o \ - $(OBJDIR)/$(COMMON_DIR)/mbed/timer.o \ - $(OBJDIR)/$(COMMON_DIR)/mbed/xprintf.o \ - $(OBJDIR)/$(COMMON_DIR)/mbed/bootloader.o \ + $(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_DIR) + -I$(TMK_DIR)/common \ + -I$(TMK_DIR)/protocol CC_FLAGS += -include $(CONFIG_H) @@ -24,13 +24,13 @@ CC_FLAGS += -include $(CONFIG_H) # Option modules ifdef BOOTMAGIC_ENABLE $(error Not Supported) - OBJECTS += $(OBJDIR)/$(COMMON_DIR)/bootmagic.o - OBJECTS += $(OBJDIR)/$(COMMON_DIR)/mbed/eeprom.o + OBJECTS += $(OBJDIR)/common/bootmagic.o + OBJECTS += $(OBJDIR)/common/mbed/eeprom.o OPT_DEFS += -DBOOTMAGIC_ENABLE endif ifdef MOUSEKEY_ENABLE - OBJECTS += $(OBJDIR)/$(COMMON_DIR)/mousekey.o + OBJECTS += $(OBJDIR)/common/mousekey.o OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif @@ -50,7 +50,7 @@ endif ifdef COMMAND_ENABLE $(error Not Supported) - SRC += $(COMMON_DIR)/command.c + SRC += common/command.c OPT_DEFS += -DCOMMAND_ENABLE endif @@ -61,14 +61,14 @@ endif ifdef SLEEP_LED_ENABLE $(error Not Supported) - SRC += $(COMMON_DIR)/sleep_led.c + 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_DIR)/backlight.c + SRC += common/backlight.c OPT_DEFS += -DBACKLIGHT_ENABLE endif -- cgit v1.2.3-70-g09d2 From 54aee16a84eee27e816a89da5ca0dd3e9294cad9 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 25 Jun 2014 11:23:30 +0900 Subject: Fix timer.h to include AVR specific header --- common/timer.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'common') diff --git a/common/timer.h b/common/timer.h index f0c5ffc98..fe23f87ae 100644 --- a/common/timer.h +++ b/common/timer.h @@ -20,6 +20,11 @@ along with this program. If not, see . #include +#if defined(__AVR__) +#include "avr/timer_avr.h" +#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) -- cgit v1.2.3-70-g09d2 From 47bc3016d36cbfd83904fff5947acb6436dd37c3 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 1 Jul 2014 04:02:10 +0900 Subject: Ad hoc fix of command API --- common/command.c | 28 +++++++++++++++++++--------- common/command.h | 10 ++++++++-- 2 files changed, 27 insertions(+), 11 deletions(-) (limited to 'common') diff --git a/common/command.c b/common/command.c index 2c65f0da7..971ef7f0a 100644 --- a/common/command.c +++ b/common/command.c @@ -63,19 +63,22 @@ static uint8_t numkey2num(uint8_t code); static void switch_default_layer(uint8_t layer); -typedef enum { ONESHOT, CONSOLE, MOUSEKEY } cmdstate_t; -static cmdstate_t state = ONESHOT; +command_state_t command_state = ONESHOT; bool command_proc(uint8_t code) { - switch (state) { + switch (command_state) { case ONESHOT: if (!IS_COMMAND()) return false; return (command_extra(code) || command_common(code)); + break; case CONSOLE: - command_console(code); + if (IS_COMMAND()) + return (command_extra(code) || command_common(code)); + else + return (command_console_extra(code) || command_console(code)); break; #ifdef MOUSEKEY_ENABLE case MOUSEKEY: @@ -83,12 +86,13 @@ bool command_proc(uint8_t code) break; #endif default: - state = ONESHOT; + command_state = ONESHOT; return false; } return true; } +/* TODO: Refactoring is needed. */ /* This allows to define extra commands. return false when not processed. */ bool command_extra(uint8_t code) __attribute__ ((weak)); bool command_extra(uint8_t code) @@ -96,6 +100,12 @@ bool command_extra(uint8_t code) return false; } +bool command_console_extra(uint8_t code) __attribute__ ((weak)); +bool command_console_extra(uint8_t code) +{ + return false; +} + /*********************************************************** * Command common @@ -203,7 +213,7 @@ static bool command_common(uint8_t code) command_console_help(); print("\nEnter Console Mode\n"); print("C> "); - state = CONSOLE; + command_state = CONSOLE; break; case KC_PAUSE: clear_keyboard(); @@ -388,14 +398,14 @@ static bool command_console(uint8_t code) case KC_Q: case KC_ESC: print("\nQuit Console Mode\n"); - state = ONESHOT; + command_state = ONESHOT; return false; #ifdef MOUSEKEY_ENABLE case KC_M: mousekey_console_help(); print("\nEnter Mousekey Console\n"); print("M0>"); - state = MOUSEKEY; + command_state = MOUSEKEY; return true; #endif default: @@ -555,7 +565,7 @@ static bool mousekey_console(uint8_t code) mousekey_param = 0; print("\nQuit Mousekey Console\n"); print("C> "); - state = CONSOLE; + command_state = CONSOLE; return false; case KC_P: mousekey_param_print(); diff --git a/common/command.h b/common/command.h index be739fafe..b57a6c1ce 100644 --- a/common/command.h +++ b/common/command.h @@ -18,10 +18,16 @@ along with this program. If not, see . #ifndef COMMAND_H #define COMMAND +/* TODO: Refactoring */ +typedef enum { ONESHOT, CONSOLE, MOUSEKEY } command_state_t; +extern command_state_t command_state; + +/* This allows to extend commands. Return false when command is not processed. */ +bool command_extra(uint8_t code); +bool command_console_extra(uint8_t code); + #ifdef COMMAND_ENABLE bool command_proc(uint8_t code); -/* This allows to extend commands. Return 0 when command is not processed. */ -bool command_extra(uint8_t code); #else #define command_proc(code) false #endif -- cgit v1.2.3-70-g09d2 From c2d830c07c823c48a17c214b093ec1bab989fb6a Mon Sep 17 00:00:00 2001 From: tmk Date: Thu, 20 Nov 2014 17:06:46 +0900 Subject: USB initialize when plug-in during battery powered --- common/avr/suspend.c | 49 ++++++++++++++++++++++++++++++++++--------------- common/suspend.h | 3 ++- protocol/lufa/lufa.c | 15 ++++++++++++++- 3 files changed, 50 insertions(+), 17 deletions(-) (limited to 'common') diff --git a/common/avr/suspend.c b/common/avr/suspend.c index f44a036be..66a579fd7 100644 --- a/common/avr/suspend.c +++ b/common/avr/suspend.c @@ -7,6 +7,9 @@ #include "backlight.h" #include "suspend_avr.h" #include "suspend.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif #define wdt_intr_enable(value) \ @@ -26,30 +29,45 @@ __asm__ __volatile__ ( \ ) -void suspend_power_down(void) +void suspend_idle(uint8_t time) { -#ifdef BACKLIGHT_ENABLE - backlight_set(0); -#endif -#ifndef NO_SUSPEND_POWER_DOWN - // Enable watchdog to wake from MCU sleep cli(); - wdt_reset(); + set_sleep_mode(SLEEP_MODE_IDLE); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + +/* Power down MCU with watchdog timer + * wdto: watchdog timer timeout defined in + * WDTO_15MS + * WDTO_30MS + * WDTO_60MS + * WDTO_120MS + * WDTO_250MS + * WDTO_500MS + * WDTO_1S + * WDTO_2S + * WDTO_4S + * WDTO_8S + */ +void suspend_power_down(uint8_t wdto) +{ +#ifdef PROTOCOL_LUFA + if (USB_DeviceState == DEVICE_STATE_Configured) return; +#endif - // Watchdog Interrupt and System Reset Mode - //wdt_enable(WDTO_1S); - //WDTCSR |= _BV(WDIE); - // Watchdog Interrupt Mode - wdt_intr_enable(WDTO_120MS); - + wdt_intr_enable(wdto); + // 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(); @@ -58,12 +76,13 @@ void suspend_power_down(void) // Disable watchdog after sleep wdt_disable(); -#endif } bool suspend_wakeup_condition(void) { + matrix_power_up(); matrix_scan(); + matrix_power_down(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { if (matrix_get_row(r)) return true; } diff --git a/common/suspend.h b/common/suspend.h index 9b76f280d..f339c670a 100644 --- a/common/suspend.h +++ b/common/suspend.h @@ -5,7 +5,8 @@ #include -void suspend_power_down(void); +void suspend_idle(uint8_t timeout); +void suspend_power_down(uint8_t timeout); bool suspend_wakeup_condition(void); void suspend_wakeup_init(void); diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 16a602df1..6802f3b63 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -148,10 +148,23 @@ static void Console_Task(void) */ void EVENT_USB_Device_Connect(void) { + /* For battery powered device */ + if (!USB_IsInitialized) { + USB_Init(); + USB_Device_EnableSOFEvents(); + } } void EVENT_USB_Device_Disconnect(void) { + /* For battery powered device */ +/* TODO: This doesn't work. After several plug in/outs can not be enumerated. + if (USB_IsInitialized) { + USB_Disable(); // Disable all interrupts + USB_Controller_Enable(); + USB_INT_Enable(USB_INT_VBUSTI); + } +*/ } void EVENT_USB_Device_Reset(void) @@ -574,7 +587,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { - suspend_power_down(); + suspend_power_down(WDTO_120MS); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); } -- cgit v1.2.3-70-g09d2 From 608ebe2686bdb3fdbd0426731cabdf6082c57b53 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 23 Nov 2014 13:08:05 +0900 Subject: Matrix power saving --- common/keyboard.c | 23 +++++++++++++++++++++++ common/keyboard.h | 3 +++ common/matrix.h | 5 +++++ keyboard/hhkb_rn42/hhkb_avr.h | 5 ++--- keyboard/hhkb_rn42/matrix.c | 28 ++++++++++++++++++++++++++-- keyboard/hhkb_rn42/rn42/main.c | 2 +- 6 files changed, 60 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/keyboard.c b/common/keyboard.c index 9a809ff4a..dde91a296 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include +#include +#include #include "keyboard.h" #include "matrix.h" #include "keymap.h" @@ -30,12 +32,14 @@ along with this program. If not, see . #include "bootmagic.h" #include "eeconfig.h" #include "backlight.h" +#include "suspend.h" #ifdef MOUSEKEY_ENABLE # include "mousekey.h" #endif #ifdef PS2_MOUSE_ENABLE # include "ps2_mouse.h" #endif +#include "lufa.h" #ifdef MATRIX_HAS_GHOST @@ -83,7 +87,25 @@ void keyboard_task(void) static uint8_t led_status = 0; matrix_row_t matrix_row = 0; matrix_row_t matrix_change = 0; + static uint32_t last_key_time = 0; +/* +#define SLEEP_TIME_MS 10000 + // (USB_DeviceState == DEVICE_STATE_Suspended) { + //if (timer_elapsed32(last_key_time) > SLEEP_TIME_MS) { + // TODO: remove LUFA dependent code + if (!USB_IsInitialized && timer_elapsed32(last_key_time) > SLEEP_TIME_MS) { + matrix_power_down(); + // TODO: power down only when no USB connection + // Or it makes USB connection lost or suspended + suspend_power_down(WDTO_15MS); + matrix_power_up(); + } + else { + matrix_power_down(); + matrix_power_up(); + } +*/ matrix_scan(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { matrix_row = matrix_get_row(r); @@ -105,6 +127,7 @@ void keyboard_task(void) }); // record a processed key matrix_prev[r] ^= ((matrix_row_t)1<. #include "timer.h" #include "matrix.h" #include "hhkb_avr.h" +#include +#include "suspend.h" +#include "lufa.h" +// matrix power saving +#define MATRIX_POWER_SAVE 10000 +static uint32_t matrix_last_modified = 0; +static bool matrix_power = true; + // matrix state buffer(1:on, 0:off) static matrix_row_t *matrix; static matrix_row_t *matrix_prev; @@ -72,7 +80,7 @@ uint8_t matrix_scan(void) matrix_prev = matrix; matrix = tmp; - KEY_POWER_ON(); + matrix_power_up(); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { KEY_SELECT(row, col); @@ -126,8 +134,9 @@ uint8_t matrix_scan(void) // This takes 25us or more to make sure KEY_STATE returns to idle state. _delay_us(75); } + if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); } - KEY_POWER_OFF(); + matrix_power_down(); return 1; } @@ -165,3 +174,18 @@ void matrix_print(void) xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row))); } } + +void matrix_power_up(void) { + if (matrix_power) return; + KEY_POWER_ON(); + matrix_power = true; +} +void matrix_power_down(void) { + if (!matrix_power) return; + // doesn't power save while USB connection is active + if (USB_DeviceState == DEVICE_STATE_Configured) return; + if (timer_elapsed32(matrix_last_modified) <= MATRIX_POWER_SAVE) return; + KEY_POWER_OFF(); + suspend_power_down(WDTO_15MS); + matrix_power = false; +} diff --git a/keyboard/hhkb_rn42/rn42/main.c b/keyboard/hhkb_rn42/rn42/main.c index a3a37c074..43d887067 100644 --- a/keyboard/hhkb_rn42/rn42/main.c +++ b/keyboard/hhkb_rn42/rn42/main.c @@ -85,7 +85,7 @@ int main(void) print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { - suspend_power_down(); + suspend_power_down(WDTO_120MS); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { USB_Device_SendRemoteWakeup(); } -- cgit v1.2.3-70-g09d2 From 1f96edaed60def1f513ddd8adcdfa3e12b971006 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 23 Nov 2014 13:38:10 +0900 Subject: Remove MCU dependent code from common/keyboard.c --- common/keyboard.c | 23 ----------------------- 1 file changed, 23 deletions(-) (limited to 'common') diff --git a/common/keyboard.c b/common/keyboard.c index dde91a296..9a809ff4a 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -15,8 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include -#include -#include #include "keyboard.h" #include "matrix.h" #include "keymap.h" @@ -32,14 +30,12 @@ along with this program. If not, see . #include "bootmagic.h" #include "eeconfig.h" #include "backlight.h" -#include "suspend.h" #ifdef MOUSEKEY_ENABLE # include "mousekey.h" #endif #ifdef PS2_MOUSE_ENABLE # include "ps2_mouse.h" #endif -#include "lufa.h" #ifdef MATRIX_HAS_GHOST @@ -87,25 +83,7 @@ void keyboard_task(void) static uint8_t led_status = 0; matrix_row_t matrix_row = 0; matrix_row_t matrix_change = 0; - static uint32_t last_key_time = 0; -/* -#define SLEEP_TIME_MS 10000 - // (USB_DeviceState == DEVICE_STATE_Suspended) { - //if (timer_elapsed32(last_key_time) > SLEEP_TIME_MS) { - // TODO: remove LUFA dependent code - if (!USB_IsInitialized && timer_elapsed32(last_key_time) > SLEEP_TIME_MS) { - matrix_power_down(); - // TODO: power down only when no USB connection - // Or it makes USB connection lost or suspended - suspend_power_down(WDTO_15MS); - matrix_power_up(); - } - else { - matrix_power_down(); - matrix_power_up(); - } -*/ matrix_scan(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { matrix_row = matrix_get_row(r); @@ -127,7 +105,6 @@ void keyboard_task(void) }); // record a processed key matrix_prev[r] ^= ((matrix_row_t)1<