commit
adbb86b1ec
@ -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 "matrix.h" |
||||||
#include "action.h" |
#include "action.h" |
||||||
#include "backlight.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) |
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,42 @@ |
|||||||
|
/*
|
||||||
|
Copyright 2011 Jun Wako <wakojun@gmail.com> |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 2 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef TIMER_AVR_H |
||||||
|
#define TIMER_AVR_H 1 |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
#ifndef TIMER_PRESCALER |
||||||
|
# if F_CPU > 16000000 |
||||||
|
# define TIMER_PRESCALER 256 |
||||||
|
# elif F_CPU > 2000000 |
||||||
|
# define TIMER_PRESCALER 64 |
||||||
|
# elif F_CPU > 250000 |
||||||
|
# define TIMER_PRESCALER 8 |
||||||
|
# else |
||||||
|
# define TIMER_PRESCALER 1 |
||||||
|
# endif |
||||||
|
#endif |
||||||
|
#define TIMER_RAW_FREQ (F_CPU/TIMER_PRESCALER) |
||||||
|
#define TIMER_RAW TCNT0 |
||||||
|
#define TIMER_RAW_TOP (TIMER_RAW_FREQ/1000) |
||||||
|
|
||||||
|
#if (TIMER_RAW_TOP > 255) |
||||||
|
# error "Timer0 can't count 1ms at this clock freq. Use larger prescaler." |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif |
@ -1,51 +0,0 @@ |
|||||||
/*
|
|
||||||
Copyright 2013 Jun Wako <wakojun@gmail.com> |
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify |
|
||||||
it under the terms of the GNU General Public License as published by |
|
||||||
the Free Software Foundation, either version 2 of the License, or |
|
||||||
(at your option) any later version. |
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, |
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
GNU General Public License for more details. |
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License |
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef DEBUG_CONFIG_H |
|
||||||
#define DEBUG_CONFIG_H 1 |
|
||||||
|
|
||||||
#include <stdbool.h> |
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
extern "C" { |
|
||||||
#endif |
|
||||||
|
|
||||||
/* NOTE: Not portable. Bit field order depends on implementation */ |
|
||||||
typedef union { |
|
||||||
uint8_t raw; |
|
||||||
struct { |
|
||||||
bool enable:1; |
|
||||||
bool matrix:1; |
|
||||||
bool keyboard:1; |
|
||||||
bool mouse:1; |
|
||||||
uint8_t reserved:4; |
|
||||||
}; |
|
||||||
} debug_config_t; |
|
||||||
debug_config_t debug_config; |
|
||||||
|
|
||||||
/* for backward compatibility */ |
|
||||||
#define debug_enable (debug_config.enable) |
|
||||||
#define debug_matrix (debug_config.matrix) |
|
||||||
#define debug_keyboard (debug_config.keyboard) |
|
||||||
#define debug_mouse (debug_config.mouse) |
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
} |
|
||||||
#endif |
|
||||||
|
|
||||||
#endif |
|
@ -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,41 @@ |
|||||||
|
#include "cmsis.h" |
||||||
|
#include "timer.h" |
||||||
|
|
||||||
|
/* Mill second tick count */ |
||||||
|
volatile uint32_t timer_count = 0; |
||||||
|
|
||||||
|
/* Timer interrupt handler */ |
||||||
|
void SysTick_Handler(void) { |
||||||
|
timer_count++; |
||||||
|
} |
||||||
|
|
||||||
|
void timer_init(void) |
||||||
|
{ |
||||||
|
timer_count = 0; |
||||||
|
SysTick_Config(SystemCoreClock / 1000); /* 1ms tick */ |
||||||
|
} |
||||||
|
|
||||||
|
void timer_clear(void) |
||||||
|
{ |
||||||
|
timer_count = 0; |
||||||
|
} |
||||||
|
|
||||||
|
uint16_t timer_read(void) |
||||||
|
{ |
||||||
|
return (uint16_t)(timer_count & 0xFFFF); |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t timer_read32(void) |
||||||
|
{ |
||||||
|
return timer_count; |
||||||
|
} |
||||||
|
|
||||||
|
uint16_t timer_elapsed(uint16_t last) |
||||||
|
{ |
||||||
|
return TIMER_DIFF_16(timer_read(), last); |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t timer_elapsed32(uint32_t last) |
||||||
|
{ |
||||||
|
return TIMER_DIFF_32(timer_read32(), last); |
||||||
|
} |
@ -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,12 @@ |
|||||||
|
#ifndef PROGMEM_H |
||||||
|
#define PROGMEM_H 1 |
||||||
|
|
||||||
|
#if defined(__AVR__) |
||||||
|
# include <avr/pgmspace.h> |
||||||
|
#elif defined(__arm__) |
||||||
|
# define PROGMEM |
||||||
|
# define pgm_read_byte(p) *(p) |
||||||
|
# define pgm_read_word(p) *(p) |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,20 @@ |
|||||||
|
#ifndef WAIT_H |
||||||
|
#define WAIT_H |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(__AVR__) |
||||||
|
# include <util/delay.h> |
||||||
|
# define wait_ms(ms) _delay_ms(ms) |
||||||
|
# define wait_us(us) _delay_us(us) |
||||||
|
#elif defined(__arm__) |
||||||
|
# include "wait_api.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif |
@ -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 |
@ -0,0 +1,60 @@ |
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com> |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 2 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef CONFIG_MBED_H |
||||||
|
#define CONFIG_MBED_H |
||||||
|
|
||||||
|
|
||||||
|
#if 0 |
||||||
|
// duplicated name against mbed USBDeivce
|
||||||
|
#define VENDOR_ID 0xFEED |
||||||
|
#define PRODUCT_ID 0x6512 |
||||||
|
#endif |
||||||
|
#define DEVICE_VER 0x0001 |
||||||
|
#define MANUFACTURER t.m.k. |
||||||
|
#define PRODUCT PS/2 keyboard converter |
||||||
|
#define DESCRIPTION convert PS/2 keyboard to USB |
||||||
|
|
||||||
|
|
||||||
|
/* matrix size */ |
||||||
|
#define MATRIX_ROWS 32 // keycode bit: 3-0
|
||||||
|
#define MATRIX_COLS 8 // keycode bit: 6-4
|
||||||
|
|
||||||
|
|
||||||
|
/* key combination for command */ |
||||||
|
#define IS_COMMAND() ( \ |
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PS/2 Busywait |
||||||
|
*/ |
||||||
|
#ifdef PS2_USE_BUSYWAIT |
||||||
|
# define PS2_CLOCK_PORT PORTD |
||||||
|
# define PS2_CLOCK_PIN PIND |
||||||
|
# define PS2_CLOCK_DDR DDRD |
||||||
|
# define PS2_CLOCK_BIT 5 |
||||||
|
# define PS2_DATA_PORT PORTD |
||||||
|
# define PS2_DATA_PIN PIND |
||||||
|
# define PS2_DATA_DDR DDRD |
||||||
|
# define PS2_DATA_BIT 2 |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
#endif |
@ -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);
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
PROJECT = mbed_onekey
|
||||||
|
|
||||||
|
TMK_DIR = ../..
|
||||||
|
MBED_DIR = $(TMK_DIR)/mbed-sdk
|
||||||
|
|
||||||
|
#VPATH += $(MBED_DIR):$(TMK_DIR)
|
||||||
|
vpath %.s .:$(MBED_DIR):$(TMK_DIR) |
||||||
|
vpath %.c .:$(MBED_DIR):$(TMK_DIR) |
||||||
|
vpath %.cpp .:$(MBED_DIR):$(TMK_DIR) |
||||||
|
|
||||||
|
OBJDIR = ./build
|
||||||
|
|
||||||
|
OBJECTS = \
|
||||||
|
$(OBJDIR)/./main.o
|
||||||
|
|
||||||
|
CONFIG_H = config.h
|
||||||
|
|
||||||
|
SYS_OBJECTS =
|
||||||
|
|
||||||
|
INCLUDE_PATHS = -I.
|
||||||
|
|
||||||
|
LIBRARY_PATHS =
|
||||||
|
LIBRARIES =
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# Comment out to disable
|
||||||
|
#BOOTMAGIC_ENABLE = yes
|
||||||
|
MOUSEKEY_ENABLE = yes
|
||||||
|
|
||||||
|
|
||||||
|
include $(TMK_DIR)/tool/mbed/mbed.mk |
||||||
|
include $(TMK_DIR)/tool/mbed/common.mk |
||||||
|
include $(TMK_DIR)/tool/mbed/gcc.mk |
@ -0,0 +1,7 @@ |
|||||||
|
#ifndef CONFIG_H |
||||||
|
#define CONFIG_H |
||||||
|
|
||||||
|
#define MATRIX_ROWS 1 |
||||||
|
#define MATRIX_COLS 1 |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,43 @@ |
|||||||
|
#include "mbed.h" |
||||||
|
#include "debug.h" |
||||||
|
#include "timer.h" |
||||||
|
#include "action.h" |
||||||
|
#include "keycode.h" |
||||||
|
#include "host.h" |
||||||
|
#include "host_driver.h" |
||||||
|
#include "mbed_driver.h" |
||||||
|
|
||||||
|
|
||||||
|
// Button and LEDs of LPC11U35 board
|
||||||
|
DigitalIn isp(P0_1); // ISP button
|
||||||
|
DigitalOut led_red(P0_20); |
||||||
|
DigitalOut led_green(P0_21); |
||||||
|
|
||||||
|
|
||||||
|
int main(void) { |
||||||
|
isp.mode(PullUp); |
||||||
|
led_red = 1; |
||||||
|
led_green = 0; |
||||||
|
|
||||||
|
timer_init(); |
||||||
|
host_set_driver(&mbed_driver); |
||||||
|
|
||||||
|
//debug_enable = true;
|
||||||
|
xprintf("mbed_onekey ver.eee:\r\n"); |
||||||
|
|
||||||
|
|
||||||
|
bool last_isp = isp; |
||||||
|
while (1) { |
||||||
|
//led_green = !led_green;
|
||||||
|
if (last_isp == isp) continue; |
||||||
|
last_isp = isp; |
||||||
|
if (last_isp == 0) { |
||||||
|
led_red = 0; // on
|
||||||
|
dprintf("timer: %i\r\n", timer_read()); |
||||||
|
register_code(KC_A); |
||||||
|
} else { |
||||||
|
led_red = 1; // off
|
||||||
|
unregister_code(KC_A); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,271 @@ |
|||||||
|
#include <stdint.h> |
||||||
|
#include "USBHID.h" |
||||||
|
#include "USBHID_Types.h" |
||||||
|
#include "USBDescriptor.h" |
||||||
|
#include "HIDKeyboard.h" |
||||||
|
|
||||||
|
#define DEFAULT_CONFIGURATION (1) |
||||||
|
|
||||||
|
|
||||||
|
HIDKeyboard::HIDKeyboard(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) |
||||||
|
{ |
||||||
|
USBDevice::connect(); |
||||||
|
} |
||||||
|
|
||||||
|
bool HIDKeyboard::sendReport(report_keyboard_t report) { |
||||||
|
USBDevice::write(EP1IN, report.raw, sizeof(report), MAX_PACKET_SIZE_EP1); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t HIDKeyboard::leds() { |
||||||
|
return led_state; |
||||||
|
} |
||||||
|
|
||||||
|
bool HIDKeyboard::USBCallback_setConfiguration(uint8_t configuration) { |
||||||
|
if (configuration != DEFAULT_CONFIGURATION) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// Configure endpoints > 0
|
||||||
|
addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT); |
||||||
|
//addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
|
||||||
|
|
||||||
|
// We activate the endpoint to be able to recceive data
|
||||||
|
//readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
uint8_t * HIDKeyboard::stringImanufacturerDesc() { |
||||||
|
static uint8_t stringImanufacturerDescriptor[] = { |
||||||
|
0x18, /*bLength*/ |
||||||
|
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
||||||
|
't',0,'m',0,'k',0,'-',0,'k',0,'b',0,'d',0,'.',0,'c',0,'o',0,'m',0 /*bString iManufacturer*/ |
||||||
|
}; |
||||||
|
return stringImanufacturerDescriptor; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t * HIDKeyboard::stringIproductDesc() { |
||||||
|
static uint8_t stringIproductDescriptor[] = { |
||||||
|
0x0a, /*bLength*/ |
||||||
|
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
||||||
|
'm',0,'b',0,'e',0,'d',0 /*bString iProduct*/ |
||||||
|
}; |
||||||
|
return stringIproductDescriptor; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t * HIDKeyboard::stringIserialDesc() { |
||||||
|
static uint8_t stringIserialDescriptor[] = { |
||||||
|
0x04, /*bLength*/ |
||||||
|
STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
||||||
|
'0',0 /*bString iSerial*/ |
||||||
|
}; |
||||||
|
return stringIserialDescriptor; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t * HIDKeyboard::reportDesc() { |
||||||
|
static uint8_t reportDescriptor[] = { |
||||||
|
USAGE_PAGE(1), 0x01, // Generic Desktop
|
||||||
|
USAGE(1), 0x06, // Keyboard
|
||||||
|
COLLECTION(1), 0x01, // Application
|
||||||
|
|
||||||
|
USAGE_PAGE(1), 0x07, // Key Codes
|
||||||
|
USAGE_MINIMUM(1), 0xE0, |
||||||
|
USAGE_MAXIMUM(1), 0xE7, |
||||||
|
LOGICAL_MINIMUM(1), 0x00, |
||||||
|
LOGICAL_MAXIMUM(1), 0x01, |
||||||
|
REPORT_SIZE(1), 0x01, |
||||||
|
REPORT_COUNT(1), 0x08, |
||||||
|
INPUT(1), 0x02, // Data, Variable, Absolute
|
||||||
|
|
||||||
|
REPORT_COUNT(1), 0x01, |
||||||
|
REPORT_SIZE(1), 0x08, |
||||||
|
INPUT(1), 0x01, // Constant
|
||||||
|
|
||||||
|
REPORT_COUNT(1), 0x05, |
||||||
|
REPORT_SIZE(1), 0x01, |
||||||
|
USAGE_PAGE(1), 0x08, // LEDs
|
||||||
|
USAGE_MINIMUM(1), 0x01, |
||||||
|
USAGE_MAXIMUM(1), 0x05, |
||||||
|
OUTPUT(1), 0x02, // Data, Variable, Absolute
|
||||||
|
|
||||||
|
REPORT_COUNT(1), 0x01, |
||||||
|
REPORT_SIZE(1), 0x03, |
||||||
|
OUTPUT(1), 0x01, // Constant
|
||||||
|
|
||||||
|
|
||||||
|
REPORT_COUNT(1), 0x06, |
||||||
|
REPORT_SIZE(1), 0x08, |
||||||
|
LOGICAL_MINIMUM(1), 0x00, |
||||||
|
LOGICAL_MAXIMUM(1), 0xFF, |
||||||
|
USAGE_PAGE(1), 0x07, // Key Codes
|
||||||
|
USAGE_MINIMUM(1), 0x00, |
||||||
|
USAGE_MAXIMUM(1), 0xFF, |
||||||
|
INPUT(1), 0x00, // Data, Array
|
||||||
|
END_COLLECTION(0), |
||||||
|
}; |
||||||
|
reportLength = sizeof(reportDescriptor); |
||||||
|
return reportDescriptor; |
||||||
|
} |
||||||
|
|
||||||
|
uint16_t HIDKeyboard::reportDescLength() { |
||||||
|
reportDesc(); |
||||||
|
return reportLength; |
||||||
|
} |
||||||
|
|
||||||
|
#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \ |
||||||
|
+ (1 * INTERFACE_DESCRIPTOR_LENGTH) \
|
||||||
|
+ (1 * HID_DESCRIPTOR_LENGTH) \
|
||||||
|
+ (1 * ENDPOINT_DESCRIPTOR_LENGTH)) |
||||||
|
uint8_t * HIDKeyboard::configurationDesc() { |
||||||
|
static uint8_t configurationDescriptor[] = { |
||||||
|
CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
|
||||||
|
CONFIGURATION_DESCRIPTOR, // bDescriptorType
|
||||||
|
LSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (LSB)
|
||||||
|
MSB(TOTAL_DESCRIPTOR_LENGTH), // wTotalLength (MSB)
|
||||||
|
0x01, // bNumInterfaces
|
||||||
|
DEFAULT_CONFIGURATION, // bConfigurationValue
|
||||||
|
0x00, // iConfiguration
|
||||||
|
C_RESERVED | C_REMOTE_WAKEUP, // bmAttributes
|
||||||
|
C_POWER(100), // bMaxPowerHello World from Mbed
|
||||||
|
|
||||||
|
INTERFACE_DESCRIPTOR_LENGTH, // bLength
|
||||||
|
INTERFACE_DESCRIPTOR, // bDescriptorType
|
||||||
|
0x00, // bInterfaceNumber
|
||||||
|
0x00, // bAlternateSetting
|
||||||
|
0x01, // bNumEndpoints
|
||||||
|
HID_CLASS, // bInterfaceClass
|
||||||
|
1, // bInterfaceSubClass (boot)
|
||||||
|
1, // bInterfaceProtocol (keyboard)
|
||||||
|
0x00, // iInterface
|
||||||
|
|
||||||
|
HID_DESCRIPTOR_LENGTH, // bLength
|
||||||
|
HID_DESCRIPTOR, // bDescriptorType
|
||||||
|
LSB(HID_VERSION_1_11), // bcdHID (LSB)
|
||||||
|
MSB(HID_VERSION_1_11), // bcdHID (MSB)
|
||||||
|
0x00, // bCountryCode
|
||||||
|
0x01, // bNumDescriptors
|
||||||
|
REPORT_DESCRIPTOR, // bDescriptorType
|
||||||
|
(uint8_t)(LSB(reportDescLength())), // wDescriptorLength (LSB)
|
||||||
|
(uint8_t)(MSB(reportDescLength())), // wDescriptorLength (MSB)
|
||||||
|
|
||||||
|
ENDPOINT_DESCRIPTOR_LENGTH, // bLength
|
||||||
|
ENDPOINT_DESCRIPTOR, // bDescriptorType
|
||||||
|
PHY_TO_DESC(EP1IN), // bEndpointAddress
|
||||||
|
E_INTERRUPT, // bmAttributes
|
||||||
|
LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
|
||||||
|
MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
|
||||||
|
1, // bInterval (milliseconds)
|
||||||
|
}; |
||||||
|
return configurationDescriptor; |
||||||
|
} |
||||||
|
|
||||||
|
#if 0 |
||||||
|
uint8_t * HIDKeyboard::deviceDesc() { |
||||||
|
static uint8_t deviceDescriptor[] = { |
||||||
|
DEVICE_DESCRIPTOR_LENGTH, /* bLength */ |
||||||
|
DEVICE_DESCRIPTOR, /* bDescriptorType */ |
||||||
|
LSB(USB_VERSION_2_0), /* bcdUSB (LSB) */ |
||||||
|
MSB(USB_VERSION_2_0), /* bcdUSB (MSB) */ |
||||||
|
0x00, /* bDeviceClass */ |
||||||
|
0x00, /* bDeviceSubClass */ |
||||||
|
0x00, /* bDeviceprotocol */ |
||||||
|
MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */ |
||||||
|
(uint8_t)(LSB(0xfeed)), /* idVendor (LSB) */ |
||||||
|
(uint8_t)(MSB(0xfeed)), /* idVendor (MSB) */ |
||||||
|
(uint8_t)(LSB(0x1bed)), /* idProduct (LSB) */ |
||||||
|
(uint8_t)(MSB(0x1bed)), /* idProduct (MSB) */ |
||||||
|
(uint8_t)(LSB(0x0002)), /* bcdDevice (LSB) */ |
||||||
|
(uint8_t)(MSB(0x0002)), /* bcdDevice (MSB) */ |
||||||
|
0, /* iManufacturer */ |
||||||
|
0, /* iProduct */ |
||||||
|
0, /* iSerialNumber */ |
||||||
|
0x01 /* bNumConfigurations */ |
||||||
|
}; |
||||||
|
return deviceDescriptor; |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
bool HIDKeyboard::USBCallback_request() { |
||||||
|
bool success = false; |
||||||
|
CONTROL_TRANSFER * transfer = getTransferPtr(); |
||||||
|
uint8_t *hidDescriptor; |
||||||
|
|
||||||
|
// Process additional standard requests
|
||||||
|
|
||||||
|
if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE)) |
||||||
|
{ |
||||||
|
switch (transfer->setup.bRequest) |
||||||
|
{ |
||||||
|
case GET_DESCRIPTOR: |
||||||
|
switch (DESCRIPTOR_TYPE(transfer->setup.wValue)) |
||||||
|
{ |
||||||
|
case REPORT_DESCRIPTOR: |
||||||
|
if ((reportDesc() != NULL) \
|
||||||
|
&& (reportDescLength() != 0)) |
||||||
|
{ |
||||||
|
transfer->remaining = reportDescLength(); |
||||||
|
transfer->ptr = reportDesc(); |
||||||
|
transfer->direction = DEVICE_TO_HOST; |
||||||
|
success = true; |
||||||
|
} |
||||||
|
break; |
||||||
|
case HID_DESCRIPTOR: |
||||||
|
// Find the HID descriptor, after the configuration descriptor
|
||||||
|
hidDescriptor = findDescriptor(HID_DESCRIPTOR); |
||||||
|
if (hidDescriptor != NULL) |
||||||
|
{ |
||||||
|
transfer->remaining = HID_DESCRIPTOR_LENGTH; |
||||||
|
transfer->ptr = hidDescriptor; |
||||||
|
transfer->direction = DEVICE_TO_HOST; |
||||||
|
success = true; |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Process class-specific requests
|
||||||
|
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) |
||||||
|
{ |
||||||
|
switch (transfer->setup.bRequest) { |
||||||
|
case SET_REPORT: |
||||||
|
// LED indicator
|
||||||
|
// TODO: check Interface and Report length?
|
||||||
|
// if (transfer->setup.wIndex == INTERFACE_KEYBOAD) { }
|
||||||
|
// if (transfer->setup.wLength == 1)
|
||||||
|
|
||||||
|
transfer->remaining = 1; |
||||||
|
//transfer->ptr = ?? what ptr should be set when OUT(not used?)
|
||||||
|
transfer->direction = HOST_TO_DEVICE; |
||||||
|
transfer->notify = true; /* notify with USBCallback_requestCompleted */ |
||||||
|
success = true; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return success; |
||||||
|
} |
||||||
|
|
||||||
|
void HIDKeyboard::USBCallback_requestCompleted(uint8_t * buf, uint32_t length) |
||||||
|
{ |
||||||
|
if (length > 0) { |
||||||
|
CONTROL_TRANSFER *transfer = getTransferPtr(); |
||||||
|
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) { |
||||||
|
switch (transfer->setup.bRequest) { |
||||||
|
case SET_REPORT: |
||||||
|
led_state = buf[0]; |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
#ifndef HIDKEYBOARD_H |
||||||
|
|
||||||
|
#include "stdint.h" |
||||||
|
#include "stdbool.h" |
||||||
|
#include "USBHID.h" |
||||||
|
#include "report.h" |
||||||
|
|
||||||
|
|
||||||
|
class HIDKeyboard : public USBDevice { |
||||||
|
public: |
||||||
|
HIDKeyboard(uint16_t vendor_id = 0xFEED, uint16_t product_id = 0xabed, uint16_t product_release = 0x0001); |
||||||
|
|
||||||
|
bool sendReport(report_keyboard_t report); |
||||||
|
uint8_t leds(void); |
||||||
|
protected: |
||||||
|
uint16_t reportLength; |
||||||
|
virtual bool USBCallback_setConfiguration(uint8_t configuration); |
||||||
|
virtual uint8_t * stringImanufacturerDesc(); |
||||||
|
virtual uint8_t * stringIproductDesc(); |
||||||
|
virtual uint8_t * stringIserialDesc(); |
||||||
|
virtual uint16_t reportDescLength(); |
||||||
|
virtual uint8_t * reportDesc(); |
||||||
|
virtual uint8_t * configurationDesc(); |
||||||
|
//virtual uint8_t * deviceDesc();
|
||||||
|
virtual bool USBCallback_request(); |
||||||
|
virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length); |
||||||
|
private: |
||||||
|
uint8_t led_state; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,41 @@ |
|||||||
|
#include "HIDKeyboard.h" |
||||||
|
#include "host.h" |
||||||
|
#include "host_driver.h" |
||||||
|
#include "mbed_driver.h" |
||||||
|
|
||||||
|
HIDKeyboard keyboard; |
||||||
|
|
||||||
|
|
||||||
|
/* Host driver */ |
||||||
|
static uint8_t keyboard_leds(void); |
||||||
|
static void send_keyboard(report_keyboard_t *report); |
||||||
|
static void send_mouse(report_mouse_t *report); |
||||||
|
static void send_system(uint16_t data); |
||||||
|
static void send_consumer(uint16_t data); |
||||||
|
|
||||||
|
host_driver_t mbed_driver = { |
||||||
|
keyboard_leds, |
||||||
|
send_keyboard, |
||||||
|
send_mouse, |
||||||
|
send_system, |
||||||
|
send_consumer |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
static uint8_t keyboard_leds(void) |
||||||
|
{ |
||||||
|
return keyboard.leds(); |
||||||
|
} |
||||||
|
static void send_keyboard(report_keyboard_t *report) |
||||||
|
{ |
||||||
|
keyboard.sendReport(*report); |
||||||
|
} |
||||||
|
static void send_mouse(report_mouse_t *report) |
||||||
|
{ |
||||||
|
} |
||||||
|
static void send_system(uint16_t data) |
||||||
|
{ |
||||||
|
} |
||||||
|
static void send_consumer(uint16_t data) |
||||||
|
{ |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
#include "host_driver.h" |
||||||
|
|
||||||
|
extern host_driver_t mbed_driver; |
@ -0,0 +1,15 @@ |
|||||||
|
#ifndef PS2_IO_H |
||||||
|
#define PS2_IO_H |
||||||
|
|
||||||
|
|
||||||
|
void clock_init(void); |
||||||
|
void clock_lo(void); |
||||||
|
void clock_hi(void); |
||||||
|
bool clock_in(void); |
||||||
|
|
||||||
|
void data_init(void); |
||||||
|
void data_lo(void); |
||||||
|
void data_hi(void); |
||||||
|
bool data_in(void); |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,74 @@ |
|||||||
|
#include <stdbool.h> |
||||||
|
#include <util/delay.h> |
||||||
|
|
||||||
|
/* Check port settings for clock and data line */ |
||||||
|
#if !(defined(PS2_CLOCK_PORT) && \ |
||||||
|
defined(PS2_CLOCK_PIN) && \
|
||||||
|
defined(PS2_CLOCK_DDR) && \
|
||||||
|
defined(PS2_CLOCK_BIT)) |
||||||
|
# error "PS/2 clock port setting is required in config.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
#if !(defined(PS2_DATA_PORT) && \ |
||||||
|
defined(PS2_DATA_PIN) && \
|
||||||
|
defined(PS2_DATA_DDR) && \
|
||||||
|
defined(PS2_DATA_BIT)) |
||||||
|
# error "PS/2 data port setting is required in config.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clock |
||||||
|
*/ |
||||||
|
void clock_init(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void clock_lo(void) |
||||||
|
{ |
||||||
|
PS2_CLOCK_PORT &= ~(1<<PS2_CLOCK_BIT); |
||||||
|
PS2_CLOCK_DDR |= (1<<PS2_CLOCK_BIT); |
||||||
|
} |
||||||
|
|
||||||
|
void clock_hi(void) |
||||||
|
{ |
||||||
|
/* input with pull up */ |
||||||
|
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); |
||||||
|
PS2_CLOCK_PORT |= (1<<PS2_CLOCK_BIT); |
||||||
|
} |
||||||
|
|
||||||
|
bool clock_in(void) |
||||||
|
{ |
||||||
|
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); |
||||||
|
PS2_CLOCK_PORT |= (1<<PS2_CLOCK_BIT); |
||||||
|
_delay_us(1); |
||||||
|
return PS2_CLOCK_PIN&(1<<PS2_CLOCK_BIT); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* Data |
||||||
|
*/ |
||||||
|
void data_init(void) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void data_lo(void) |
||||||
|
{ |
||||||
|
PS2_DATA_PORT &= ~(1<<PS2_DATA_BIT); |
||||||
|
PS2_DATA_DDR |= (1<<PS2_DATA_BIT); |
||||||
|
} |
||||||
|
|
||||||
|
void data_hi(void) |
||||||
|
{ |
||||||
|
/* input with pull up */ |
||||||
|
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); |
||||||
|
PS2_DATA_PORT |= (1<<PS2_DATA_BIT); |
||||||
|
} |
||||||
|
|
||||||
|
bool data_in(void) |
||||||
|
{ |
||||||
|
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); |
||||||
|
PS2_DATA_PORT |= (1<<PS2_DATA_BIT); |
||||||
|
_delay_us(1); |
||||||
|
return PS2_DATA_PIN&(1<<PS2_DATA_BIT); |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
#include <stdbool.h> |
||||||
|
#include "ps2_io.h" |
||||||
|
#include "gpio_api.h" |
||||||
|
|
||||||
|
|
||||||
|
static gpio_t clock; |
||||||
|
static gpio_t data; |
||||||
|
|
||||||
|
/*
|
||||||
|
* Clock |
||||||
|
*/ |
||||||
|
void clock_init(void) |
||||||
|
{ |
||||||
|
gpio_init(&clock, P0_9); |
||||||
|
gpio_mode(&clock, OpenDrain|PullNone); |
||||||
|
} |
||||||
|
|
||||||
|
void clock_lo(void) |
||||||
|
{ |
||||||
|
gpio_dir(&clock, PIN_OUTPUT); |
||||||
|
gpio_write(&clock, 0); |
||||||
|
} |
||||||
|
void clock_hi(void) |
||||||
|
{ |
||||||
|
gpio_dir(&clock, PIN_OUTPUT); |
||||||
|
gpio_write(&clock, 1); |
||||||
|
} |
||||||
|
|
||||||
|
bool clock_in(void) |
||||||
|
{ |
||||||
|
gpio_dir(&clock, PIN_INPUT); |
||||||
|
return gpio_read(&clock); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* Data |
||||||
|
*/ |
||||||
|
void data_init(void) |
||||||
|
{ |
||||||
|
gpio_init(&data, P0_8); |
||||||
|
gpio_mode(&data, OpenDrain|PullNone); |
||||||
|
} |
||||||
|
|
||||||
|
void data_lo(void) |
||||||
|
{ |
||||||
|
gpio_dir(&data, PIN_OUTPUT); |
||||||
|
gpio_write(&data, 0); |
||||||
|
} |
||||||
|
|
||||||
|
void data_hi(void) |
||||||
|
{ |
||||||
|
gpio_dir(&data, PIN_OUTPUT); |
||||||
|
gpio_write(&data, 1); |
||||||
|
} |
||||||
|
|
||||||
|
bool data_in(void) |
||||||
|
{ |
||||||
|
gpio_dir(&data, PIN_INPUT); |
||||||
|
return gpio_read(&data); |
||||||
|
} |
@ -0,0 +1,79 @@ |
|||||||
|
OBJECTS += \
|
||||||
|
$(OBJDIR)/common/action.o \
|
||||||
|
$(OBJDIR)/common/action_tapping.o \
|
||||||
|
$(OBJDIR)/common/action_macro.o \
|
||||||
|
$(OBJDIR)/common/action_layer.o \
|
||||||
|
$(OBJDIR)/common/action_util.o \
|
||||||
|
$(OBJDIR)/common/host.o \
|
||||||
|
$(OBJDIR)/common/keymap.o \
|
||||||
|
$(OBJDIR)/common/keyboard.o \
|
||||||
|
$(OBJDIR)/common/util.o \
|
||||||
|
$(OBJDIR)/common/mbed/suspend.o \
|
||||||
|
$(OBJDIR)/common/mbed/timer.o \
|
||||||
|
$(OBJDIR)/common/mbed/xprintf.o \
|
||||||
|
$(OBJDIR)/common/mbed/bootloader.o \
|
||||||
|
|
||||||
|
INCLUDE_PATHS += \
|
||||||
|
-I$(TMK_DIR)/common \
|
||||||
|
-I$(TMK_DIR)/protocol
|
||||||
|
|
||||||
|
CC_FLAGS += -include $(CONFIG_H)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Option modules
|
||||||
|
ifdef BOOTMAGIC_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
OBJECTS += $(OBJDIR)/common/bootmagic.o
|
||||||
|
OBJECTS += $(OBJDIR)/common/mbed/eeprom.o
|
||||||
|
OPT_DEFS += -DBOOTMAGIC_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef MOUSEKEY_ENABLE |
||||||
|
OBJECTS += $(OBJDIR)/common/mousekey.o
|
||||||
|
OPT_DEFS += -DMOUSEKEY_ENABLE
|
||||||
|
OPT_DEFS += -DMOUSE_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef EXTRAKEY_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
OPT_DEFS += -DEXTRAKEY_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef CONSOLE_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
OPT_DEFS += -DCONSOLE_ENABLE
|
||||||
|
else |
||||||
|
OPT_DEFS += -DNO_PRINT
|
||||||
|
OPT_DEFS += -DNO_DEBUG
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef COMMAND_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
SRC += common/command.c
|
||||||
|
OPT_DEFS += -DCOMMAND_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef NKRO_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
OPT_DEFS += -DNKRO_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef SLEEP_LED_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
SRC += common/sleep_led.c
|
||||||
|
OPT_DEFS += -DSLEEP_LED_ENABLE
|
||||||
|
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef BACKLIGHT_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
SRC += common/backlight.c
|
||||||
|
OPT_DEFS += -DBACKLIGHT_ENABLE
|
||||||
|
endif |
||||||
|
|
||||||
|
ifdef KEYMAP_SECTION_ENABLE |
||||||
|
$(error Not Supported)
|
||||||
|
OPT_DEFS += -DKEYMAP_SECTION_ENABLE
|
||||||
|
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
|
||||||
|
endif |
@ -0,0 +1,80 @@ |
|||||||
|
###############################################################################
|
||||||
|
GCC_BIN =
|
||||||
|
AS = $(GCC_BIN)arm-none-eabi-as
|
||||||
|
CC = $(GCC_BIN)arm-none-eabi-gcc
|
||||||
|
CPP = $(GCC_BIN)arm-none-eabi-g++
|
||||||
|
LD = $(GCC_BIN)arm-none-eabi-gcc
|
||||||
|
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
|
||||||
|
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
|
||||||
|
SIZE = $(GCC_BIN)arm-none-eabi-size
|
||||||
|
CHKSUM = $(TMK_DIR)/tool/mbed/lpc-vector-checksum
|
||||||
|
|
||||||
|
CPU = -mcpu=cortex-m0 -mthumb
|
||||||
|
|
||||||
|
CC_FLAGS += $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections
|
||||||
|
CC_FLAGS += -MMD -MP
|
||||||
|
CC_SYMBOLS = -DTARGET_LPC11U35_401 -DTARGET_M0 -DTARGET_NXP -DTARGET_LPC11UXX -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M0 -DARM_MATH_CM0 -DMBED_BUILD_TIMESTAMP=1399108688.49 -D__MBED__=1
|
||||||
|
|
||||||
|
LD_FLAGS = -mcpu=cortex-m0 -mthumb -Wl,--gc-sections --specs=nano.specs
|
||||||
|
LD_FLAGS += -Wl,-Map=$(OBJDIR)/$(PROJECT).map,--cref
|
||||||
|
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
|
||||||
|
|
||||||
|
ifeq ($(DEBUG), 1) |
||||||
|
CC_FLAGS += -DDEBUG -O0
|
||||||
|
else |
||||||
|
CC_FLAGS += -DNDEBUG -Os
|
||||||
|
endif |
||||||
|
|
||||||
|
all: $(OBJDIR)/$(PROJECT).bin $(OBJDIR)/$(PROJECT).hex size |
||||||
|
|
||||||
|
clean: |
||||||
|
rm -f $(OBJDIR)/$(PROJECT).bin $(OBJDIR)/$(PROJECT).elf $(OBJDIR)/$(PROJECT).hex $(OBJDIR)/$(PROJECT).map $(OBJDIR)/$(PROJECT).lst $(OBJECTS) $(DEPS)
|
||||||
|
rm -fr $(OBJDIR)
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.s |
||||||
|
mkdir -p $(@D)
|
||||||
|
$(AS) $(CPU) -o $@ $<
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.c |
||||||
|
mkdir -p $(@D)
|
||||||
|
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
$(OBJDIR)/%.o: %.cpp |
||||||
|
mkdir -p $(@D)
|
||||||
|
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
|
||||||
|
|
||||||
|
|
||||||
|
$(OBJDIR)/$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) |
||||||
|
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||||
|
@echo ""
|
||||||
|
@echo "*****"
|
||||||
|
@echo "***** You must modify vector checksum value in *.bin and *.hex files."
|
||||||
|
@echo "*****"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
$(OBJDIR)/$(PROJECT).bin: $(OBJDIR)/$(PROJECT).elf |
||||||
|
@$(OBJCOPY) -O binary $< $@
|
||||||
|
@echo "Writing vector checksum value into $@ ..."
|
||||||
|
@$(CHKSUM) $@
|
||||||
|
@echo
|
||||||
|
|
||||||
|
$(OBJDIR)/$(PROJECT).hex: $(OBJDIR)/$(PROJECT).elf |
||||||
|
@$(OBJCOPY) -O ihex $< $@
|
||||||
|
|
||||||
|
$(OBJDIR)/$(PROJECT).lst: $(OBJDIR)/$(PROJECT).elf |
||||||
|
@$(OBJDUMP) -Sdh $< > $@
|
||||||
|
|
||||||
|
lst: $(OBJDIR)/$(PROJECT).lst |
||||||
|
|
||||||
|
size: |
||||||
|
$(SIZE) $(OBJDIR)/$(PROJECT).elf
|
||||||
|
|
||||||
|
prog: $(OBJDIR)/$(PROJECT).bin |
||||||
|
@echo "Program..."
|
||||||
|
ifneq ($(shell mount | grep 'CRP DISABLD'),) |
||||||
|
umount /dev/nxpisp >/dev/null 2>&1
|
||||||
|
endif |
||||||
|
dd if=$< of=/dev/nxpisp seek=4
|
||||||
|
|
||||||
|
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
|
||||||
|
-include $(DEPS) |
@ -0,0 +1,99 @@ |
|||||||
|
/***************************************************************************
|
||||||
|
* https://github.com/dhylands/projects/blob/master/lpc/lpc-vector-checksum/lpc-vector-checksum.c
|
||||||
|
* |
||||||
|
* Copyright (c) 2012 by Dave Hylands |
||||||
|
* All Rights Reserved |
||||||
|
* |
||||||
|
* Permission is granted to any individual or institution to use, copy, |
||||||
|
* modify, or redistribute this file so long as it is not sold for profit, |
||||||
|
* and that this copyright notice is retained. |
||||||
|
* |
||||||
|
*************************************************************************** |
||||||
|
* |
||||||
|
* This program calculates the vector checksum used in LPC17xx binary |
||||||
|
* images. |
||||||
|
* |
||||||
|
* Usage: lpc-vector-checksum file |
||||||
|
* |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <stdint.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
/***************************************************************************/ |
||||||
|
/**
|
||||||
|
* update_vector_checksum |
||||||
|
*
|
||||||
|
* The algorithim is to write the checksum such that the checksum of the |
||||||
|
* first 8 words is equal to zero. |
||||||
|
*
|
||||||
|
* The LPC1768 uses little-endian, and this particular routine assumes |
||||||
|
* that it's running on a little-endian architecture. |
||||||
|
*/ |
||||||
|
static int update_vector_checksum( const char *filename ) |
||||||
|
{ |
||||||
|
uint32_t sum; |
||||||
|
uint32_t header[8]; |
||||||
|
FILE *fs; |
||||||
|
int i; |
||||||
|
|
||||||
|
if (( fs = fopen( filename, "r+b" )) == NULL ) |
||||||
|
{ |
||||||
|
fprintf( stderr, "Unable to open '%s' for reading/writing (%d): %s\n",
|
||||||
|
filename, errno, strerror( errno )); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
if ( fread( header, sizeof( header ), 1, fs ) != 1 ) |
||||||
|
{ |
||||||
|
fprintf( stderr, "Failed to read header from '%s' (perhaps the file is too small?)", |
||||||
|
filename ); |
||||||
|
fclose( fs ); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
sum = 0; |
||||||
|
for ( i = 0; i < 7; i++ ) |
||||||
|
{ |
||||||
|
sum += header[i]; |
||||||
|
} |
||||||
|
printf( "sum = 0x%08x, value to write = 0x%08x\n", sum, -sum ); |
||||||
|
|
||||||
|
/* write back the checksum to location 7
|
||||||
|
* http://sigalrm.blogspot.jp/2011/10/cortex-m3-exception-vector-checksum.html
|
||||||
|
*/ |
||||||
|
fseek(fs, 0x1c, SEEK_SET); |
||||||
|
sum = -sum; |
||||||
|
fwrite(&sum, 4, 1, fs); |
||||||
|
|
||||||
|
fclose( fs ); |
||||||
|
|
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
/***************************************************************************/ |
||||||
|
/**
|
||||||
|
* main |
||||||
|
*/ |
||||||
|
int main( int argc, char **argv ) |
||||||
|
{ |
||||||
|
int arg; |
||||||
|
|
||||||
|
if ( argc < 2) |
||||||
|
{ |
||||||
|
fprintf( stderr, "Usage: lpc-vector-checksum file ...\n" ); |
||||||
|
exit( 1 ); |
||||||
|
} |
||||||
|
|
||||||
|
for ( arg = 1; arg < argc; arg++ ) |
||||||
|
{ |
||||||
|
update_vector_checksum( argv[ arg ]); |
||||||
|
} |
||||||
|
|
||||||
|
exit( 0 ); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,99 @@ |
|||||||
|
OBJECTS += \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/startup_LPC11xx.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/cmsis_nvic.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/system_LPC11Uxx.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/port_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/spi_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/analogin_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_irq_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/serial_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/i2c_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/pwmout_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/sleep.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/pinmap.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/us_ticker.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/board.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/mbed_interface.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/exit.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/rtc_time.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/us_ticker_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/pinmap_common.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/error.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/gpio.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/semihost_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/wait_api.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/RawSerial.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Ticker.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/FilePath.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/I2C.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/FileBase.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/retarget.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Serial.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Stream.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/FileSystemLike.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/CallChain.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/InterruptManager.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/SerialBase.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/BusInOut.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/SPISlave.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/I2CSlave.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/FunctionPointer.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Timer.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/SPI.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Timeout.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/Ethernet.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/TimerEvent.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/CAN.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/BusOut.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/FileLike.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/BusIn.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/InterruptIn.o \
|
||||||
|
$(OBJDIR)/libraries/mbed/common/LocalFileSystem.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBHID/USBMouse.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBHID/USBHID.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBHID/USBMouseKeyboard.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBHID/USBKeyboard.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_KL25Z.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBDevice.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC17.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC40.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_LPC11U.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBDevice/USBHAL_STM32F4.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBAudio/USBAudio.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBSerial/USBSerial.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBSerial/USBCDC.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBMSD/USBMSD.o \
|
||||||
|
$(OBJDIR)/libraries/USBDevice/USBMIDI/USBMIDI.o
|
||||||
|
|
||||||
|
INCLUDE_PATHS += \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/hal \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/TARGET_LPC11U35_401 \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/cmsis \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/TARGET_LPC11U35_401 \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/hal \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/api \
|
||||||
|
-I$(MBED_DIR)/libraries/mbed/common \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBHID \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBDevice \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBAudio \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBSerial \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBMSD \
|
||||||
|
-I$(MBED_DIR)/libraries/USBDevice/USBMIDI
|
||||||
|
|
||||||
|
OBJECTS += \
|
||||||
|
$(OBJDIR)/protocol/mbed/mbed_driver.o \
|
||||||
|
$(OBJDIR)/protocol/mbed/HIDKeyboard.o \
|
||||||
|
|
||||||
|
INCLUDE_PATHS += \
|
||||||
|
-I$(TMK_DIR)/protocol/mbed
|
||||||
|
|
||||||
|
LINKER_SCRIPT = $(MBED_DIR)/libraries/mbed/targets/cmsis/TARGET_NXP/TARGET_LPC11UXX/TOOLCHAIN_GCC_ARM/TARGET_LPC11U35_401/LPC11U35.ld
|
Loading…
Reference in new issue