parent
							
								
									ee70fe59ee
								
							
						
					
					
						commit
						e81c70149e
					
				@ -1,7 +1,29 @@
 | 
				
			||||
#include "suspend.h"
 | 
				
			||||
#include <stdbool.h>
 | 
				
			||||
#include <avr/sleep.h>
 | 
				
			||||
#include <avr/wdt.h>
 | 
				
			||||
#include <avr/interrupt.h>
 | 
				
			||||
#include "matrix.h"
 | 
				
			||||
#include "action.h"
 | 
				
			||||
#include "backlight.h"
 | 
				
			||||
#include "suspend_avr.h"
 | 
				
			||||
#include "suspend.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define wdt_intr_enable(value)   \
 | 
				
			||||
__asm__ __volatile__ (  \
 | 
				
			||||
    "in __tmp_reg__,__SREG__" "\n\t"    \
 | 
				
			||||
    "cli" "\n\t"    \
 | 
				
			||||
    "wdr" "\n\t"    \
 | 
				
			||||
    "sts %0,%1" "\n\t"  \
 | 
				
			||||
    "out __SREG__,__tmp_reg__" "\n\t"   \
 | 
				
			||||
    "sts %0,%2" "\n\t" \
 | 
				
			||||
    : /* no outputs */  \
 | 
				
			||||
    : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
 | 
				
			||||
    "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
 | 
				
			||||
    "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
 | 
				
			||||
        _BV(WDIE) | (value & 0x07)) ) \
 | 
				
			||||
    : "r0"  \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void suspend_power_down(void)
 | 
				
			||||
@ -0,0 +1,27 @@
 | 
				
			||||
#ifndef SUSPEND_AVR_H
 | 
				
			||||
#define SUSPEND_AVR_H
 | 
				
			||||
 | 
				
			||||
#include <stdint.h>
 | 
				
			||||
#include <stdbool.h>
 | 
				
			||||
#include <avr/sleep.h>
 | 
				
			||||
#include <avr/wdt.h>
 | 
				
			||||
#include <avr/interrupt.h>
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define wdt_intr_enable(value)   \
 | 
				
			||||
__asm__ __volatile__ (  \
 | 
				
			||||
    "in __tmp_reg__,__SREG__" "\n\t"    \
 | 
				
			||||
    "cli" "\n\t"    \
 | 
				
			||||
    "wdr" "\n\t"    \
 | 
				
			||||
    "sts %0,%1" "\n\t"  \
 | 
				
			||||
    "out __SREG__,__tmp_reg__" "\n\t"   \
 | 
				
			||||
    "sts %0,%2" "\n\t" \
 | 
				
			||||
    : /* no outputs */  \
 | 
				
			||||
    : "M" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), \
 | 
				
			||||
    "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \
 | 
				
			||||
    "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \
 | 
				
			||||
        _BV(WDIE) | (value & 0x07)) ) \
 | 
				
			||||
    : "r0"  \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
#include "bootloader.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void bootloader_jump(void) {}
 | 
				
			||||
@ -0,0 +1,6 @@
 | 
				
			||||
#include <stdbool.h>
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void suspend_power_down(void) {}
 | 
				
			||||
bool suspend_wakeup_condition(void) { return true; }
 | 
				
			||||
void suspend_wakeup_init(void) {}
 | 
				
			||||
@ -0,0 +1,46 @@
 | 
				
			||||
#include <cstdarg>
 | 
				
			||||
//#include <stdarg.h>
 | 
				
			||||
#include "mbed.h"
 | 
				
			||||
#include "mbed/xprintf.h"
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define STRING_STACK_LIMIT    120
 | 
				
			||||
 | 
				
			||||
/* mbed Serial */
 | 
				
			||||
Serial ser(UART_TX, UART_RX);
 | 
				
			||||
 | 
				
			||||
/* TODO: Need small implementation for embedded */
 | 
				
			||||
int xprintf(const char* format, ...)
 | 
				
			||||
{
 | 
				
			||||
    /* copy from mbed/common/RawSerial.cpp */
 | 
				
			||||
    std::va_list arg;
 | 
				
			||||
    va_start(arg, format);
 | 
				
			||||
    int len = vsnprintf(NULL, 0, format, arg);
 | 
				
			||||
    if (len < STRING_STACK_LIMIT) {
 | 
				
			||||
        char temp[STRING_STACK_LIMIT];
 | 
				
			||||
        vsprintf(temp, format, arg);
 | 
				
			||||
        ser.puts(temp);
 | 
				
			||||
    } else {
 | 
				
			||||
        char *temp = new char[len + 1];
 | 
				
			||||
        vsprintf(temp, format, arg);
 | 
				
			||||
        ser.puts(temp);
 | 
				
			||||
        delete[] temp;
 | 
				
			||||
    }
 | 
				
			||||
    va_end(arg);
 | 
				
			||||
    return len;
 | 
				
			||||
 | 
				
			||||
/* Fail: __builtin_va_arg_pack?
 | 
				
			||||
 * https://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Constructing-Calls.html#Constructing-Calls
 | 
				
			||||
    void *arg = __builtin_apply_args();
 | 
				
			||||
    void *ret = __builtin_apply((void*)(&(ser.printf)), arg, 100);
 | 
				
			||||
    __builtin_return(ret)
 | 
				
			||||
*/
 | 
				
			||||
/* Fail: varargs can not be passed to printf
 | 
				
			||||
    //int r = ser.printf("test %i\r\n", 123);
 | 
				
			||||
    va_list arg;
 | 
				
			||||
    va_start(arg, format);
 | 
				
			||||
    int r = ser.printf(format, arg);
 | 
				
			||||
    va_end(arg);
 | 
				
			||||
    return r;
 | 
				
			||||
*/
 | 
				
			||||
}
 | 
				
			||||
@ -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
 | 
				
			||||
@ -0,0 +1,11 @@
 | 
				
			||||
#ifndef PROGMEM_H
 | 
				
			||||
#define PROGMEM_H 1
 | 
				
			||||
 | 
				
			||||
#if defined(__AVR__)
 | 
				
			||||
#   include <avr/pgmspace.h>
 | 
				
			||||
#elif defined(__arm__)
 | 
				
			||||
#   define PROGMEM
 | 
				
			||||
#   define pgm_read_byte(p)     *(p)
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -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
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,7 @@
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#define MATRIX_ROWS 1
 | 
				
			||||
#define MATRIX_COLS 1
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -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);
 | 
				
			||||
        }
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
@ -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)
 | 
				
			||||
{
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
#include "host_driver.h"
 | 
				
			||||
 | 
				
			||||
extern host_driver_t mbed_driver;
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue