From 895cd4dfa29f0f3c623544f4868ac63e619c69d9 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 14 Aug 2012 00:17:31 +0900 Subject: Add USB HID(host) protocol.(not finished) --- protocol/usb_hid/parser.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 protocol/usb_hid/parser.cpp (limited to 'protocol/usb_hid/parser.cpp') diff --git a/protocol/usb_hid/parser.cpp b/protocol/usb_hid/parser.cpp new file mode 100644 index 000000000..cf6432230 --- /dev/null +++ b/protocol/usb_hid/parser.cpp @@ -0,0 +1,15 @@ +#include "parser.h" + +void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) +{ + PORTB ^= (1<<0); +/* + Serial.print("KBDReport: "); + for (uint8_t i = 0; i < len; i++) { + PrintHex(buf[i]); + Serial.print(" "); + } + Serial.print("\r\n"); +*/ + //PORTC &= ~(1<<7); +} -- cgit v1.2.3-70-g09d2 From c5060ea81942b0e3f8577536ff78402a19abe3d3 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 25 Aug 2012 15:49:08 +0900 Subject: test build of 'Host shield' in minimal env. --- common.mk | 1 + common/debug.h | 19 ++- common/host.h | 8 ++ common/keyboard.h | 6 + common/print.h | 13 +- common/sendchar.h | 8 ++ common/timer.h | 12 +- protocol/lufa.mk | 10 +- protocol/lufa/lufa.c | 96 +++++++------- protocol/lufa/lufa.h | 11 ++ protocol/usb_hid.mk | 67 ++++++++++ protocol/usb_hid/Makefile | 141 --------------------- protocol/usb_hid/NullSerial.cpp | 44 ------- protocol/usb_hid/README | 19 +++ protocol/usb_hid/USBAPI.h | 22 ---- .../usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h | 4 +- .../usb_hid/arduino-1.0.1/cores/arduino/wiring.c | 2 - protocol/usb_hid/leonardo_led.h | 10 ++ protocol/usb_hid/main.cpp | 66 ---------- protocol/usb_hid/override_Serial.cpp | 51 ++++++++ protocol/usb_hid/override_wiring.c | 28 ++++ protocol/usb_hid/parser.cpp | 15 +-- protocol/usb_hid/parser.h | 5 + protocol/usb_hid/test/Makefile | 126 ++++++++++++++++++ protocol/usb_hid/test/config.h | 40 ++++++ protocol/usb_hid/test/test.cpp | 92 ++++++++++++++ rules.mk | 9 +- 27 files changed, 579 insertions(+), 346 deletions(-) create mode 100644 protocol/usb_hid.mk delete mode 100644 protocol/usb_hid/Makefile delete mode 100644 protocol/usb_hid/NullSerial.cpp delete mode 100644 protocol/usb_hid/USBAPI.h create mode 100644 protocol/usb_hid/leonardo_led.h delete mode 100644 protocol/usb_hid/main.cpp create mode 100644 protocol/usb_hid/override_Serial.cpp create mode 100644 protocol/usb_hid/override_wiring.c create mode 100644 protocol/usb_hid/test/Makefile create mode 100644 protocol/usb_hid/test/config.h create mode 100644 protocol/usb_hid/test/test.cpp (limited to 'protocol/usb_hid/parser.cpp') diff --git a/common.mk b/common.mk index 580a8cf8f..26b4bb859 100644 --- a/common.mk +++ b/common.mk @@ -5,6 +5,7 @@ SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/layer.c \ $(COMMON_DIR)/timer.c \ $(COMMON_DIR)/print.c \ + $(COMMON_DIR)/debug.c \ $(COMMON_DIR)/bootloader.c \ $(COMMON_DIR)/util.c diff --git a/common/debug.h b/common/debug.h index 230d3b349..9cc8d882f 100644 --- a/common/debug.h +++ b/common/debug.h @@ -18,19 +18,28 @@ along with this program. If not, see . #ifndef DEBUG_H #define DEBUG_H 1 +#include #include "print.h" -#define debug(s) if(debug_enable) print(s) +#define debug(s) if(debug_enable) print_P(PSTR(s)) #define debug_hex(c) if(debug_enable) phex(c) #define debug_hex16(i) if(debug_enable) phex16(i) #define debug_bin(c) if(debug_enable) pbin(c) #define debug_bin_reverse(c) if(debug_enable) pbin_reverse(c) -bool debug_enable; -bool debug_matrix; -bool debug_keyboard; -bool debug_mouse; +#ifdef __cplusplus +extern "C" { +#endif + +extern bool debug_enable; +extern bool debug_matrix; +extern bool debug_keyboard; +extern bool debug_mouse; + +#ifdef __cplusplus +} +#endif #endif diff --git a/common/host.h b/common/host.h index 11b9aacd7..26bf3c362 100644 --- a/common/host.h +++ b/common/host.h @@ -23,6 +23,10 @@ along with this program. If not, see . #include "host_driver.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifdef NKRO_ENABLE extern bool keyboard_nkro; #endif @@ -54,4 +58,8 @@ void host_mouse_send(report_mouse_t *report); void host_system_send(uint16_t data); void host_consumer_send(uint16_t data); +#ifdef __cplusplus +} +#endif + #endif diff --git a/common/keyboard.h b/common/keyboard.h index 988dac36e..51bf67379 100644 --- a/common/keyboard.h +++ b/common/keyboard.h @@ -21,8 +21,14 @@ along with this program. If not, see . #include +#ifdef __cplusplus +extern "C" { +#endif void keyboard_init(void); void keyboard_proc(void); void keyboard_set_leds(uint8_t leds); +#ifdef __cplusplus +} +#endif #endif diff --git a/common/print.h b/common/print.h index 686fa89ac..d55f5695d 100644 --- a/common/print.h +++ b/common/print.h @@ -29,11 +29,17 @@ #include -extern bool print_enable; - +// avoid collision with arduino/Print.h +#ifndef __cplusplus // this macro allows you to write print("some text") and // the string is automatically placed into flash memory :) #define print(s) print_P(PSTR(s)) +#endif + +#ifdef __cplusplus +extern "C" { +#endif +extern bool print_enable; void print_S(const char *s); void print_P(const char *s); @@ -41,5 +47,8 @@ void phex(unsigned char c); void phex16(unsigned int i); void pbin(unsigned char c); void pbin_reverse(unsigned char c); +#ifdef __cplusplus +} +#endif #endif diff --git a/common/sendchar.h b/common/sendchar.h index 7c81303c7..7a64d00c7 100644 --- a/common/sendchar.h +++ b/common/sendchar.h @@ -21,7 +21,15 @@ along with this program. If not, see . #include +#ifdef __cplusplus +extern "C" { +#endif + /* transmit a character. return 0 on success, -1 on error. */ int8_t sendchar(uint8_t c); +#ifdef __cplusplus +} +#endif + #endif diff --git a/common/timer.h b/common/timer.h index f9e8181e6..d24d3eab6 100644 --- a/common/timer.h +++ b/common/timer.h @@ -23,10 +23,12 @@ along with this program. If not, see . #ifndef TIMER_PRESCALER # if F_CPU > 16000000 # define TIMER_PRESCALER 256 -# elif F_CPU >= 4000000 +# elif F_CPU > 2000000 # define TIMER_PRESCALER 64 -# else +# elif F_CPU > 250000 # define TIMER_PRESCALER 8 +# else +# define TIMER_PRESCALER 1 # endif #endif #define TIMER_RAW_FREQ (F_CPU/TIMER_PRESCALER) @@ -42,6 +44,9 @@ along with this program. If not, see . #define TIMER_DIFF_MS(a, b) TIMER_DIFF(a, b, UINT16_MAX) +#ifdef __cplusplus +extern "C" { +#endif extern volatile uint16_t timer_count; @@ -49,5 +54,8 @@ void timer_init(void); void timer_clear(void); uint16_t timer_read(void); uint16_t timer_elapsed(uint16_t last); +#ifdef __cplusplus +} +#endif #endif diff --git a/protocol/lufa.mk b/protocol/lufa.mk index ad6cab6d3..bf6fc97b8 100644 --- a/protocol/lufa.mk +++ b/protocol/lufa.mk @@ -1,18 +1,20 @@ LUFA_DIR = protocol/lufa # Path to the LUFA library -LUFA_PATH = $(TOP_DIR)/protocol/lufa/LUFA-120219 +LUFA_PATH = protocol/lufa/LUFA-120219 # Create the LUFA source path variables by including the LUFA root makefile -include $(LUFA_PATH)/LUFA/makefile +include $(TOP_DIR)/$(LUFA_PATH)/LUFA/makefile LUFA_SRC = $(LUFA_DIR)/lufa.c \ $(LUFA_DIR)/descriptor.c \ $(LUFA_SRC_USB) -SRC += $(subst $(LUFA_PATH)/,,$(LUFA_SRC)) + +SRC += $(LUFA_SRC) # Search Path -VPATH += $(LUFA_PATH) +VPATH += $(TOP_DIR)/$(LUFA_DIR) +VPATH += $(TOP_DIR)/$(LUFA_PATH) # Option modules #ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE) diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index b7ecb8488..81409ce9e 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -59,7 +59,7 @@ 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); -static host_driver_t lufa_driver = { +host_driver_t lufa_driver = { keyboard_leds, send_keyboard, send_mouse, @@ -68,49 +68,9 @@ static host_driver_t lufa_driver = { }; -static void SetupHardware(void); -static void Console_Task(void); - -int main(void) -{ - SetupHardware(); - sei(); - - print_enable = true; - debug_enable = true; - debug_matrix = true; - debug_keyboard = true; - debug_mouse = true; - - // TODO: can't print here - debug("LUFA init\n"); - - keyboard_init(); - host_set_driver(&lufa_driver); - while (1) { - keyboard_proc(); - -#if !defined(INTERRUPT_CONTROL_ENDPOINT) - USB_USBTask(); -#endif - } -} - -void SetupHardware(void) -{ - /* Disable watchdog if enabled by bootloader/fuses */ - MCUSR &= ~(1 << WDRF); - wdt_disable(); - - /* Disable clock division */ - clock_prescale_set(clock_div_1); - - USB_Init(); - - // for Console_Task - USB_Device_EnableSOFEvents(); -} - +/******************************************************************************* + * Console + ******************************************************************************/ #ifdef CONSOLE_ENABLE static void Console_Task(void) { @@ -446,3 +406,51 @@ int8_t sendchar(uint8_t c) return 0; } #endif + + +/******************************************************************************* + * main + ******************************************************************************/ +static void SetupHardware(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + // Leonardo needs. Without this USB device is not recognized. + USB_Disable(); + + USB_Init(); + + // for Console_Task + USB_Device_EnableSOFEvents(); +} + +int main(void) __attribute__ ((weak)); +int main(void) +{ + SetupHardware(); + sei(); + + print_enable = true; + debug_enable = true; + debug_matrix = true; + debug_keyboard = true; + debug_mouse = true; + + // TODO: can't print here + debug("LUFA init\n"); + + keyboard_init(); + host_set_driver(&lufa_driver); + while (1) { + keyboard_proc(); + +#if !defined(INTERRUPT_CONTROL_ENDPOINT) + USB_USBTask(); +#endif + } +} diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h index 71c279b0d..bcee060d6 100644 --- a/protocol/lufa/lufa.h +++ b/protocol/lufa/lufa.h @@ -47,8 +47,19 @@ #include #include #include +#include "host.h" +#ifdef __cplusplus +extern "C" { +#endif + +extern host_driver_t lufa_driver; + +#ifdef __cplusplus +} +#endif + /* extra report structure */ typedef struct { uint8_t report_id; diff --git a/protocol/usb_hid.mk b/protocol/usb_hid.mk new file mode 100644 index 000000000..f3149f7f4 --- /dev/null +++ b/protocol/usb_hid.mk @@ -0,0 +1,67 @@ +USB_HID_DIR = protocol/usb_hid + + +# +# USB Host Shield +# +USB_HOST_SHIELD_DIR = $(USB_HID_DIR)/USB_Host_Shield_2.0 +USB_HOST_SHIELD_SRC = \ + $(USB_HOST_SHIELD_DIR)/Usb.cpp \ + $(USB_HOST_SHIELD_DIR)/hid.cpp \ + $(USB_HOST_SHIELD_DIR)/parsetools.cpp \ + $(USB_HOST_SHIELD_DIR)/message.cpp + + + +# +# Arduino +# +ARDUINO_DIR = $(USB_HID_DIR)/arduino-1.0.1 +ARDUINO_CORES_DIR = $(ARDUINO_DIR)/cores/arduino +ARDUINO_CORES_SRC = \ + $(ARDUINO_CORES_DIR)/Print.cpp \ + $(ARDUINO_CORES_DIR)/Stream.cpp + +# replaced with override_Serial.c +# $(ARDUINO_CORES_DIR)/CDC.cpp \ +# $(ARDUINO_CORES_DIR)/HID.cpp \ +# $(ARDUINO_CORES_DIR)/USBCore.cpp \ + +# replaced with override_wiring.c and common/timer.c +# $(ARDUINO_CORES_DIR)/wiring.c \ + + + +# +# HID parser +# +SRC += $(USB_HID_DIR)/parser.cpp + +# replace arduino/CDC.cpp +SRC += $(USB_HID_DIR)/override_Serial.cpp + +# replace arduino/wiring.c +SRC += $(USB_HID_DIR)/override_wiring.c +SRC += common/timer.c + +SRC += $(USB_HOST_SHIELD_SRC) +SRC += $(ARDUINO_CORES_SRC) + + +OPT_DEFS += -DARDUINO=101 +# Arduino USBCore needs USB_VID and USB_PID. +#OPT_DEFS += -DARDUINO=101 -DUSB_VID=0x2341 -DUSB_PID=0x8036 + + + +# +# Search Path +# +VPATH += $(TOP_DIR)/$(USB_HID_DIR) +VPATH += $(TOP_DIR)/$(USB_HOST_SHIELD_DIR) + +# for #include "Arduino.h" +VPATH += $(TOP_DIR)/$(ARDUINO_CORES_DIR) + +# for #include "pins_arduino.h" +VPATH += $(TOP_DIR)/$(ARDUINO_DIR)/variants/leonardo diff --git a/protocol/usb_hid/Makefile b/protocol/usb_hid/Makefile deleted file mode 100644 index ed3d6518d..000000000 --- a/protocol/usb_hid/Makefile +++ /dev/null @@ -1,141 +0,0 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = usbkbd - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# MCU name -MCU = atmega32u4 - - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - - - -ARDUINO_DIR = arduino-1.0.1/cores -ARDUINO_SRC = \ - arduino/Print.cpp \ - arduino/Stream.cpp \ - arduino/wiring.c - -# arduino/main.cpp \ -# arduino/USBCore.cpp \ -# arduino/CDC.cpp \ -# arduino/HID.cpp \ -# arduino/HardwareSerial.cpp \ -# arduino/IPAddress.cpp \ -# arduino/Tone.cpp \ -# arduino/WMath.cpp \ -# arduino/WInterrupts.c \ -# arduino/wiring_analog.c \ -# arduino/wiring_pulse.c \ -# arduino/wiring_shift.c -# arduino/wiring_digital.c \ -# arduino/WString.cpp \ -# arduino/new.cpp \ - -USB_HOST_DIR = ./USB_Host_Shield_2.0 -USB_HOST_SRC = \ - Usb.cpp \ - cdcacm.cpp \ - cdcftdi.cpp \ - cdcprolific.cpp \ - hid.cpp \ - hidboot.cpp \ - hiduniversal.cpp \ - hidusagetitlearrays.cpp \ - hidescriptorparser.cpp \ - message.cpp \ - parsetools.cpp - - #PS3BT.cpp \ - #PS3USB.cpp \ - #RFCOMM.cpp \ - #XBOXUSB.cpp \ - #adk.cpp \ - #masstorage.cpp \ - #max_LCD.cpp \ - #usbhub.cpp - -#SRC = host_kbd.cpp -SRC = main.cpp -SRC += parser.cpp -SRC += NullSerial.cpp -SRC += $(USB_HOST_SRC) -SRC += $(ARDUINO_SRC) - -OPT_DEFS = -DARDUINO=101 -DUSB_VID=0x2341 -DUSB_PID=0x8036 - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(USB_HOST_DIR) -VPATH += $(ARDUINO_DIR) -# for Arduino.h -VPATH += arduino-1.0.1/cores/arduino -# for pins_arduino.h -VPATH += arduino-1.0.1/variants/leonardo - - -# Ad hoc workaround to override original arduino/USBAPI.h with our own USBAPI.h. -# Obsolete but needed in order to remove directory including the current input file from search list. -# Option -iquote can't replace -I- for this purpose. -EXTRAFLAGS += -I- - - -# program Leonardo -PROGRAM_CMD = avrdude -patmega32u4 -cavr109 -P$(DEV) -b57600 -Uflash:w:$(TARGET).hex - - -include ../../rules.mk diff --git a/protocol/usb_hid/NullSerial.cpp b/protocol/usb_hid/NullSerial.cpp deleted file mode 100644 index 6d85caf2d..000000000 --- a/protocol/usb_hid/NullSerial.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "USBAPI.h" - - -void NullSerial::begin(uint16_t baud_count) -{ -} - -void NullSerial::end(void) -{ -} - -void NullSerial::accept(void) -{ -} - -int NullSerial::available(void) -{ - return 0; -} - -int NullSerial::peek(void) -{ - return -1; -} - -int NullSerial::read(void) -{ - return -1; -} - -void NullSerial::flush(void) -{ -} - -size_t NullSerial::write(uint8_t c) -{ - return 1; -} - -NullSerial::operator bool() { - return true; -} - -NullSerial Serial; diff --git a/protocol/usb_hid/README b/protocol/usb_hid/README index 0acf677f8..9750a1cc8 100644 --- a/protocol/usb_hid/README +++ b/protocol/usb_hid/README @@ -1,3 +1,8 @@ +USB HID protocol +================ +Host side of USB HID keyboard protocol implementation. +Only standard HID Boot mode is supported at this time. This means most of normal keyboards are supported while proprietary >6KRO and NKRO is not. + Third party Libraries --------------------- USB_Host_Shield_2.0 @@ -7,3 +12,17 @@ USB_Host_Shield_2.0 arduino-1.0.1 Arduino files copied from: https://github.com/arduino/Arduino/hardware/arduino/{cores,variants} + + +Test build +---------- +In test directory; + $ make + $ DEV=/dev/ttyACM0 make program + +You can see HID keyboard reports on debug output. + + +Restriction and Bug +------------------- +Not statble yet. diff --git a/protocol/usb_hid/USBAPI.h b/protocol/usb_hid/USBAPI.h deleted file mode 100644 index e3390d49a..000000000 --- a/protocol/usb_hid/USBAPI.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Override original arduino USBAPI.h. - */ -#include -#include "Stream.h" - - -class NullSerial : public Stream -{ -public: - void begin(uint16_t baud_count); - void end(void); - - virtual int available(void); - virtual void accept(void); - virtual int peek(void); - virtual int read(void); - virtual void flush(void); - virtual size_t write(uint8_t); - operator bool(); -}; -extern NullSerial Serial; diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h index 229a638c5..900713e0f 100644 --- a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h @@ -16,8 +16,8 @@ ** SOFTWARE. */ -//#define CDC_ENABLED -//#define HID_ENABLED +#define CDC_ENABLED +#define HID_ENABLED #ifdef CDC_ENABLED diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c index b1a4ce4b0..ac8bb6f9b 100644 --- a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c @@ -108,7 +108,6 @@ unsigned long micros() { void delay(unsigned long ms) { -//PORTB &= ~(1<<0); uint16_t start = (uint16_t)micros(); while (ms > 0) { @@ -117,7 +116,6 @@ void delay(unsigned long ms) start += 1000; } } -//PORTB |= (1<<0); } /* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ diff --git a/protocol/usb_hid/leonardo_led.h b/protocol/usb_hid/leonardo_led.h new file mode 100644 index 000000000..6f67a88f5 --- /dev/null +++ b/protocol/usb_hid/leonardo_led.h @@ -0,0 +1,10 @@ +#ifndef LEONARDO_LED_H +#define LEONARDO_LED_H + +// Leonardo "TX" LED for debug +#define LED_TX_INIT (DDRD |= (1<<5)) +#define LED_TX_ON (PORTD &= ~(1<<5)) +#define LED_TX_OFF (PORTD |= (1<<5)) +#define LED_TX_TOGGLE (PORTD ^= (1<<5)) + +#endif diff --git a/protocol/usb_hid/main.cpp b/protocol/usb_hid/main.cpp deleted file mode 100644 index c292d458e..000000000 --- a/protocol/usb_hid/main.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include "Usb.h" -#include "hid.h" -#include "hidboot.h" -#include "parser.h" - - -USB Usb; -HIDBoot kbd(&Usb); -KBDReportParser Prs; - -void usb_disable() -{ - USBCON &= ~(1< +#include "common/timer.h" +#include "Arduino.h" + + +unsigned long millis() +{ + return timer_read(); +} +unsigned long micros() +{ + return timer_read() * 1000UL; +} +void delay(unsigned long ms) +{ + _delay_ms(ms); +} +void delayMicroseconds(unsigned int us) +{ + _delay_us(us); +} +void init() +{ + timer_init(); +} diff --git a/protocol/usb_hid/parser.cpp b/protocol/usb_hid/parser.cpp index cf6432230..b03af8ae4 100644 --- a/protocol/usb_hid/parser.cpp +++ b/protocol/usb_hid/parser.cpp @@ -1,15 +1,14 @@ #include "parser.h" +#include "leonardo_led.h" +#include "debug.h" void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) { - PORTB ^= (1<<0); -/* - Serial.print("KBDReport: "); + LED_TX_TOGGLE; + debug("KBDReport: "); for (uint8_t i = 0; i < len; i++) { - PrintHex(buf[i]); - Serial.print(" "); + debug_hex(buf[i]); + debug(" "); } - Serial.print("\r\n"); -*/ - //PORTC &= ~(1<<7); + debug("\r\n"); } diff --git a/protocol/usb_hid/parser.h b/protocol/usb_hid/parser.h index dc14c8270..703eb1ed4 100644 --- a/protocol/usb_hid/parser.h +++ b/protocol/usb_hid/parser.h @@ -1,3 +1,6 @@ +#ifndef PARSER_H +#define PARSER_H + #include "hid.h" class KBDReportParser : public HIDReportParser @@ -5,3 +8,5 @@ class KBDReportParser : public HIDReportParser public: virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); }; + +#endif diff --git a/protocol/usb_hid/test/Makefile b/protocol/usb_hid/test/Makefile new file mode 100644 index 000000000..39f5de455 --- /dev/null +++ b/protocol/usb_hid/test/Makefile @@ -0,0 +1,126 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = usb_hid_test + +TOP_DIR = ../../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# MCU name +MCU = atmega32u4 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) +# Interrupt driven control endpoint task +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + + +# Build Options +# comment out to disable the options. +# +# Console for debug +OPT_DEFS += -DCONSOLE_ENABLE + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +#OPT_DEFS += -DBOOT_SIZE=4096 + + + +SRC = test.cpp +SRC += common/debug.c +SRC += common/print.c + +CONFIG_H = config.h + + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) +VPATH += $(TOP_DIR)/common + + + +# program Leonardo +PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -P$(DEV) -b57600 -Uflash:w:$(TARGET).hex + + + +include $(TOP_DIR)/protocol/usb_hid.mk +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/rules.mk diff --git a/protocol/usb_hid/test/config.h b/protocol/usb_hid/test/config.h new file mode 100644 index 000000000..c2230fb57 --- /dev/null +++ b/protocol/usb_hid/test/config.h @@ -0,0 +1,40 @@ +/* +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_H +#define CONFIG_H + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCAFE +#define DEVICE_VER 0x0814 +#define MANUFACTURER t.m.k. +#define PRODUCT USB to USB keyboard converter + + +#define DESCRIPTION Product from t.m.k. keyboard firmware project + + +/* matrix size */ +#define MATRIX_ROWS 32 +#define MATRIX_COLS 8 + + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) + +#endif diff --git a/protocol/usb_hid/test/test.cpp b/protocol/usb_hid/test/test.cpp new file mode 100644 index 000000000..4958f0c61 --- /dev/null +++ b/protocol/usb_hid/test/test.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include + +// USB HID host +#include "Usb.h" +#include "hid.h" +#include "hidboot.h" +#include "parser.h" + +// LUFA +#include "lufa.h" + +#include "debug.h" + +#include "leonardo_led.h" + + +static USB usb_host; +static HIDBoot kbd(&usb_host); +static KBDReportParser kbd_parser; + +static void LUFA_setup(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + // Leonardo needs. Without this USB device is not recognized. + USB_Disable(); + + USB_Init(); + + // for Console_Task + USB_Device_EnableSOFEvents(); +} + +static void HID_setup() +{ + // Arduino Timer startup: wiring.c + init(); + + if (usb_host.Init() == -1) { + debug("HID init: failed\n"); + LED_TX_OFF; + } + + _delay_ms(200); + + kbd.SetReportParser(0, (HIDReportParser*)&kbd_parser); +} + +int main(void) +{ + // LED for debug + LED_TX_INIT; + LED_TX_ON; + + print_enable = true; + debug_enable = true; + debug_matrix = true; + debug_keyboard = true; + debug_mouse = true; + + LUFA_setup(); + sei(); + + // wait for startup of sendchar routine + while (USB_DeviceState != DEVICE_STATE_Configured) ; + if (debug_enable) { + _delay_ms(1000); + } + + HID_setup(); + + debug("init: done\n"); + for (;;) { + usb_host.Task(); + +#if !defined(INTERRUPT_CONTROL_ENDPOINT) + // LUFA Task for control request + USB_USBTask(); +#endif + } + + return 0; +} diff --git a/rules.mk b/rules.mk index 02f07fd6f..f53fe912a 100644 --- a/rules.mk +++ b/rules.mk @@ -187,6 +187,7 @@ endif # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. ASFLAGS = $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) endif @@ -345,9 +346,9 @@ GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar -ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) -ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) +ALL_CFLAGS = -mmcu=$(MCU) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_CPPFLAGS = -mmcu=$(MCU) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) @@ -569,7 +570,7 @@ $(OBJDIR)/%.o : %.S # Create preprocessed source for use in sending a bug report. %.i : %.c - $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@ # Target: clean project. -- cgit v1.2.3-70-g09d2 From e7c030375ac76907206db7f09cf9208b0c7c6e66 Mon Sep 17 00:00:00 2001 From: tmk Date: Mon, 27 Aug 2012 15:18:01 +0900 Subject: Add USB to USB converter. unmature. --- common/report.h | 9 ++ common/usb_keycodes.h | 1 + converter/usb_usb/Makefile | 131 +++++++++++++++++++++++ converter/usb_usb/config.h | 40 +++++++ converter/usb_usb/keymap.c | 251 ++++++++++++++++++++++++++++++++++++++++++++ converter/usb_usb/led.c | 24 +++++ converter/usb_usb/main.cpp | 95 +++++++++++++++++ converter/usb_usb/matrix.c | 133 +++++++++++++++++++++++ protocol/usb_hid/parser.cpp | 17 ++- 9 files changed, 699 insertions(+), 2 deletions(-) create mode 100644 converter/usb_usb/Makefile create mode 100644 converter/usb_usb/config.h create mode 100644 converter/usb_usb/keymap.c create mode 100644 converter/usb_usb/led.c create mode 100644 converter/usb_usb/main.cpp create mode 100644 converter/usb_usb/matrix.c (limited to 'protocol/usb_hid/parser.cpp') diff --git a/common/report.h b/common/report.h index 45f5c0b88..a73e0aba1 100644 --- a/common/report.h +++ b/common/report.h @@ -78,6 +78,11 @@ along with this program. If not, see . # define REPORT_KEYS 6 #endif + +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { uint8_t mods; uint8_t rserved; @@ -92,4 +97,8 @@ typedef struct { int8_t h; } __attribute__ ((packed)) report_mouse_t; +#ifdef __cplusplus +} +#endif + #endif diff --git a/common/usb_keycodes.h b/common/usb_keycodes.h index 9b6cce153..04b398fa2 100644 --- a/common/usb_keycodes.h +++ b/common/usb_keycodes.h @@ -24,6 +24,7 @@ along with this program. If not, see . #define IS_ERROR(code) (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED) +#define IS_ANY(code) (KB_A <= (code)) #define IS_KEY(code) (KB_A <= (code) && (code) <= KB_EXSEL) #define IS_MOD(code) (KB_LCTRL <= (code) && (code) <= KB_RGUI) #define IS_FN(code) (KB_FN0 <= (code) && (code) <= KB_FN7) diff --git a/converter/usb_usb/Makefile b/converter/usb_usb/Makefile new file mode 100644 index 000000000..4565ca508 --- /dev/null +++ b/converter/usb_usb/Makefile @@ -0,0 +1,131 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Target file name (without extension). +TARGET = usb_usb + +TOP_DIR = ../.. + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# MCU name +MCU = atmega32u4 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) +# Interrupt driven control endpoint task +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + + +# Build Options +# comment out to disable the options. +# +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Media control and System control +CONSOLE_ENABLE = yes # Console for debug +#NKRO_ENABLE = yes # USB Nkey Rollover + +# Boot Section Size in bytes +# Teensy halfKay 512 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +#OPT_DEFS += -DBOOT_SIZE=4096 + + + +SRC = \ + keymap.c \ + matrix.c \ + led.c \ + main.cpp + +CONFIG_H = config.h + + + +# Search Path +VPATH += $(TARGET_DIR) +VPATH += $(TOP_DIR) +#VPATH += $(TOP_DIR)/common + + + +# program Leonardo +PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -P$(DEV) -b57600 -Uflash:w:$(TARGET).hex + + + +include $(TOP_DIR)/protocol/usb_hid.mk +include $(TOP_DIR)/protocol/lufa.mk +include $(TOP_DIR)/common.mk +include $(TOP_DIR)/rules.mk diff --git a/converter/usb_usb/config.h b/converter/usb_usb/config.h new file mode 100644 index 000000000..c2230fb57 --- /dev/null +++ b/converter/usb_usb/config.h @@ -0,0 +1,40 @@ +/* +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_H +#define CONFIG_H + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCAFE +#define DEVICE_VER 0x0814 +#define MANUFACTURER t.m.k. +#define PRODUCT USB to USB keyboard converter + + +#define DESCRIPTION Product from t.m.k. keyboard firmware project + + +/* matrix size */ +#define MATRIX_ROWS 32 +#define MATRIX_COLS 8 + + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) + +#endif diff --git a/converter/usb_usb/keymap.c b/converter/usb_usb/keymap.c new file mode 100644 index 000000000..406197450 --- /dev/null +++ b/converter/usb_usb/keymap.c @@ -0,0 +1,251 @@ +/* +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 . +*/ + +#include +#include "usb_keycodes.h" +#include "util.h" +#include "keymap.h" + + +#define KEYMAP( \ + K29,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K31, K4C,K4D,K4E, K5F,K60,K61, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, K5C,K5D,K5E,K57, \ + KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B, \ + KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58 \ +) { \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_##K04, KB_##K05, KB_##K06, KB_##K07 }, /* 00-07 */ \ + { KB_##K08, KB_##K09, KB_##K0A, KB_##K0B, KB_##K0C, KB_##K0D, KB_##K0E, KB_##K0F }, /* 08-0F */ \ + { KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, /* 10-17 */ \ + { KB_##K18, KB_##K19, KB_##K1A, KB_##K1B, KB_##K1C, KB_##K1D, KB_##K1E, KB_##K1F }, /* 18-1F */ \ + { KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_##K25, KB_##K26, KB_##K27 }, /* 20-27 */ \ + { KB_##K28, KB_##K29, KB_##K2A, KB_##K2B, KB_##K2C, KB_##K2D, KB_##K2E, KB_##K2F }, /* 28-2F */ \ + { KB_##K30, KB_##K31, KB_NO, KB_##K33, KB_##K34, KB_##K35, KB_##K36, KB_##K37 }, /* 30-37 */ \ + { KB_##K38, KB_##K39, KB_##K3A, KB_##K3B, KB_##K3C, KB_##K3D, KB_##K3E, KB_##K3F }, /* 38-3F */ \ + { KB_##K40, KB_##K41, KB_##K42, KB_##K43, KB_##K44, KB_##K45, KB_##K46, KB_##K47 }, /* 40-47 */ \ + { KB_##K48, KB_##K49, KB_##K4A, KB_##K4B, KB_##K4C, KB_##K4D, KB_##K4E, KB_##K4F }, /* 48-4F */ \ + { KB_##K50, KB_##K51, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, /* 50-57 */ \ + { KB_##K58, KB_##K59, KB_##K5A, KB_##K5B, KB_##K5C, KB_##K5D, KB_##K5E, KB_##K5F }, /* 58-5F */ \ + { KB_##K60, KB_##K61, KB_##K62, KB_##K63, KB_NO, KB_##K65, KB_NO, KB_NO }, /* 60-67 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 68-6F */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 70-77 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 78-7F */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 80-87 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 88-8F */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 90-97 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* 98-9F */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* A0-A7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* A8-AF */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* B0-B7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* B8-BF */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* C0-C7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* C8-CF */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* D0-D7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* D8-DF */ \ + { KB_##KE0, KB_##KE1, KB_##KE2, KB_##KE3, KB_##KE4, KB_##KE5, KB_##KE6, KB_##KE7 }, /* E0-E7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* E8-EF */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* F0-F7 */ \ + { KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }, /* F8-FF */ \ +} + + +// Layers to switch by holding Fn key(0-7) +static const uint8_t PROGMEM fn_layer[] = { 5, 6, 0, 0, 0, 0, 0, 0 }; + +// Codes to register by clicking Fn key(0-7) +static const uint8_t PROGMEM fn_keycode[] = { KB_SCLN, KB_SLSH, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO }; + +static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: default + * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|Slp|Wak| + * `---' `---------------' `---------------' `---------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| | + * |-----------------------------------------------------------| `-----------' |-----------| +| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| | + * |-----------------------------------------------------------| ,---. |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| |Lef|Dow|Rig| | 0| .| | + * `-----------------------------------------------------------' `-----------' `---------------' + * ; = Fn0(to Layer 5) + * / = Fn1(to Layer 6) + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, + CAPS,A, S, D, F, G, H, J, K, L, FN0, QUOT, ENT, P4, P5, P6, PPLS, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 1: plain Qwerty without layer switching + * ,-----------------------------------------------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 2: Colemak http://colemak.com + * ,-----------------------------------------------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| + * |-----------------------------------------------------------| + * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| + * |-----------------------------------------------------------| + * |BackSp| A| R| S| T| D| H| N| E| I| O| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| K| M| ,| ,| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| + * `----------------------------------------------------------' + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, + BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, ENT, P4, P5, P6, PPLS, + LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 3: Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard + * ,-----------------------------------------------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backspa| + * |-----------------------------------------------------------| + * |Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| \| + * |-----------------------------------------------------------| + * |BackSp| A| O| E| U| I| D| H| T| N| S| -|Return | + * |-----------------------------------------------------------| + * |Shift | ;| Q| J| K| X| B| M| Wl V| Z|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, + CAPS,A, O, E, U, I, D, H, T, N, S, MINS, ENT, P4, P5, P6, PPLS, + LSFT,SCLN,Q, J, K, X, B, M, W, V, Z, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 4: Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ + * ,-----------------------------------------------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| + * |-----------------------------------------------------------| + * |Tab | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| + * |-----------------------------------------------------------| + * |CapsLo| A| S| H| T| G| Y| N| E| O| I| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| M| C| V| K| L| ,| ,| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, + BSPC,A, S, H, T, G, Y, N, E, O, I, QUOT, ENT, P4, P5, P6, PPLS, + LSFT,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 5: Mouse keys + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backspa| + * |-----------------------------------------------------------| + * |Tab |MwL|MwU|McU|WwU|WwR|MwL|MwD|MwU|MwR| | | | \| + * |-----------------------------------------------------------| + * |CapsLo| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return | + * |-----------------------------------------------------------| + * |Shift |VoD|VoU|Mut|Mb2|Mb3|Mb2|Mb1|VoD|VoU|Mut|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Mb1 |Alt |Gui |Menu|Ctrl| + * `-----------------------------------------------------------' + * Mc = mouse cursor, Mw = mouse wheel, Mb = mouse button + * Vo = Volume, Mut = Mute + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, + CAPS,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, P4, P5, P6, PPLS, + LSFT,VOLD,VOLU,MUTE,BTN2,BTN3,BTN2,BTN1,VOLD,VOLU,MUTE, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, BTN1, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + + /* 6: Cursor keys + * ,-----------------------------------------------------------. + * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backspa| + * |-----------------------------------------------------------| + * |Tab |Hom|PgU| Up|PgU|End|Hom|PgD|PgU|End| | | | \| + * |-----------------------------------------------------------| + * |CapsLo| |Lef|Dow|Rig| |Lef|Dow| Up|Rig| | |Return | + * |-----------------------------------------------------------| + * |Shift | | | | | |Hom|PgD|PgU|End|Fn1|Shift | + * |-----------------------------------------------------------| + * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| + * `-----------------------------------------------------------' + */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F8, F10, F11, F12, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, + CAPS,NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, + LSFT,VOLD,VOLU,MUTE,NO, NO, HOME,PGDN,PGUP,END, FN1, RSFT, UP, P1, P2, P3, + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), +}; + + + +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) +{ + return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); +} + +uint8_t keymap_fn_layer(uint8_t fn_bits) +{ + return pgm_read_byte(&fn_layer[biton(fn_bits)]); +} + +uint8_t keymap_fn_keycode(uint8_t fn_bits) +{ + return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); +} diff --git a/converter/usb_usb/led.c b/converter/usb_usb/led.c new file mode 100644 index 000000000..fc0eeb0ff --- /dev/null +++ b/converter/usb_usb/led.c @@ -0,0 +1,24 @@ +/* +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 . +*/ + +#include "stdint.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ +} diff --git a/converter/usb_usb/main.cpp b/converter/usb_usb/main.cpp new file mode 100644 index 000000000..00d2d59b6 --- /dev/null +++ b/converter/usb_usb/main.cpp @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include + +// USB HID host +#include "Usb.h" +#include "hid.h" +#include "hidboot.h" +#include "parser.h" + +// LUFA +#include "lufa.h" + +#include "debug.h" +#include "keyboard.h" + +#include "leonardo_led.h" + + +static USB usb_host; +static HIDBoot kbd(&usb_host); +static KBDReportParser kbd_parser; + +static void LUFA_setup(void) +{ + /* Disable watchdog if enabled by bootloader/fuses */ + MCUSR &= ~(1 << WDRF); + wdt_disable(); + + /* Disable clock division */ + clock_prescale_set(clock_div_1); + + // Leonardo needs. Without this USB device is not recognized. + USB_Disable(); + + USB_Init(); + + // for Console_Task + USB_Device_EnableSOFEvents(); +} + +static void HID_setup() +{ + if (usb_host.Init() == -1) { + debug("HID init: failed\n"); + LED_TX_OFF; + } + + _delay_ms(200); + + kbd.SetReportParser(0, (HIDReportParser*)&kbd_parser); +} + +int main(void) +{ + // LED for debug + LED_TX_INIT; + LED_TX_ON; + + print_enable = true; + debug_enable = true; + debug_matrix = true; + debug_keyboard = true; + debug_mouse = true; + + host_set_driver(&lufa_driver); + keyboard_init(); + + LUFA_setup(); + sei(); + + // wait for startup of sendchar routine + while (USB_DeviceState != DEVICE_STATE_Configured) ; + if (debug_enable) { + _delay_ms(1000); + } + + HID_setup(); + + debug("init: done\n"); + for (;;) { + keyboard_proc(); + + usb_host.Task(); + +#if !defined(INTERRUPT_CONTROL_ENDPOINT) + // LUFA Task for control request + USB_USBTask(); +#endif + } + + return 0; +} diff --git a/converter/usb_usb/matrix.c b/converter/usb_usb/matrix.c new file mode 100644 index 000000000..1cfecde20 --- /dev/null +++ b/converter/usb_usb/matrix.c @@ -0,0 +1,133 @@ +/* +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 "usb_hid.h" +#include "usb_keycodes.h" +#include "util.h" +#include "print.h" +#include "debug.h" +#include "matrix.h" + +/* KEY CODE to Matrix + * + * HID keycode(1 byte): + * Higher 5 bits indicates ROW and lower 3 bits COL. + * + * 7 6 5 4 3 2 1 0 + * +---------------+ + * | ROW | COL | + * +---------------+ + * + * Matrix space(32 * 8): + * 01234567 + * 0 +--------+ + * : | | + * : | | + * 31 +--------+ + */ +#define ROW_MASK 0xF8 +#define COL_MASK 0x07 +#define CODE(row, col) (((row) << 3) | (col)) +#define ROW(code) (((code) & ROW_MASK) >> 3) +#define COL(code) ((code) & COL_MASK) +#define ROW_BITS(code) (1 << COL(code)) + + +uint8_t matrix_rows(void) { return MATRIX_ROWS; } +uint8_t matrix_cols(void) { return MATRIX_COLS; } +void matrix_init(void) {} +bool matrix_has_ghost(void) { return false; } + +static bool matrix_is_mod =false; + +uint8_t matrix_scan(void) { + static uint16_t last_time_stamp = 0; + + if (last_time_stamp != usb_hid_time_stamp) { + last_time_stamp = usb_hid_time_stamp; + matrix_is_mod = true; + } else { + matrix_is_mod = false; + } + return 1; +} + +bool matrix_is_modified(void) { + + return matrix_is_mod; +} + +bool matrix_is_on(uint8_t row, uint8_t col) { + uint8_t code = CODE(row, col); + + if (IS_MOD(code)) { + if (usb_hid_keyboard_report.mods & ROW_BITS(code)) { + return true; + } + } + for (uint8_t i = 0; i < REPORT_KEYS; i++) { + if (usb_hid_keyboard_report.keys[i] == code) { + return true; + } + } + return false; +} + +uint8_t matrix_get_row(uint8_t row) { + uint8_t row_bits = 0; + + if (IS_MOD(CODE(row, 0)) && usb_hid_keyboard_report.mods) { + row_bits |= usb_hid_keyboard_report.mods; + } + + for (uint8_t i = 0; i < REPORT_KEYS; i++) { + if (IS_ANY(usb_hid_keyboard_report.keys[i])) { + if (row == ROW(usb_hid_keyboard_report.keys[i])) { + row_bits |= ROW_BITS(usb_hid_keyboard_report.keys[i]); + } + } + } + return row_bits; +} + +uint8_t matrix_key_count(void) { + uint8_t count = 0; + + count += bitpop(usb_hid_keyboard_report.mods); + for (uint8_t i = 0; i < REPORT_KEYS; i++) { + if (IS_ANY(usb_hid_keyboard_report.keys[i])) { + count++; + } + } + return count; +} + +void matrix_print(void) { + print("\nr/c 01234567\n"); + for (uint8_t row = 0; row < matrix_rows(); row++) { + phex(row); print(": "); + pbin_reverse(matrix_get_row(row)); +#ifdef MATRIX_HAS_GHOST + if (matrix_has_ghost_in_row(row)) { + print(" + #include "parser.h" +#include "usb_hid.h" + #include "leonardo_led.h" #include "debug.h" + +report_keyboard_t usb_hid_keyboard_report; +uint16_t usb_hid_time_stamp; + + void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) { + ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); + usb_hid_time_stamp = millis(); + LED_TX_TOGGLE; debug("KBDReport: "); - for (uint8_t i = 0; i < len; i++) { - debug_hex(buf[i]); + debug_hex(usb_hid_keyboard_report.mods); + for (uint8_t i = 0; i < 6; i++) { debug(" "); + debug_hex(usb_hid_keyboard_report.keys[i]); } debug("\r\n"); } -- cgit v1.2.3-70-g09d2 From c77c5043a121f195b3a552feb8283424a0652ce2 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 2 Sep 2012 23:47:18 +0900 Subject: usb_hid: Fix timer size uint16_t to uint32_t; --- common/debug.c | 9 +++++++++ common/timer.c | 34 ++++++++++++++++++++++++++++++---- common/timer.h | 9 ++++++--- protocol/pjrc/main.c | 6 ------ protocol/usb_hid/README | 8 ++++++++ protocol/usb_hid/override_wiring.c | 4 ++-- protocol/usb_hid/parser.cpp | 3 +-- protocol/usb_hid/usb_hid.h | 10 ++++++++++ 8 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 common/debug.c create mode 100644 protocol/usb_hid/usb_hid.h (limited to 'protocol/usb_hid/parser.cpp') diff --git a/common/debug.c b/common/debug.c new file mode 100644 index 000000000..41d566ee3 --- /dev/null +++ b/common/debug.c @@ -0,0 +1,9 @@ +#include +#include "debug.h" + + +bool debug_enable = false; +bool debug_matrix = false; +bool debug_keyboard = false; +bool debug_mouse = false; + diff --git a/common/timer.c b/common/timer.c index 48a38c9b6..8b8d37e8b 100644 --- a/common/timer.c +++ b/common/timer.c @@ -22,7 +22,7 @@ along with this program. If not, see . // counter resolution 1ms -volatile uint16_t timer_count = 0; +volatile uint32_t timer_count = 0; void timer_init(void) { @@ -59,7 +59,20 @@ void timer_clear(void) inline uint16_t timer_read(void) { - uint16_t t; + uint32_t t; + + uint8_t sreg = SREG; + cli(); + t = timer_count; + SREG = sreg; + + return (t & 0xFFFF); +} + +inline +uint32_t timer_read32(void) +{ + uint32_t t; uint8_t sreg = SREG; cli(); @@ -72,14 +85,27 @@ uint16_t timer_read(void) inline uint16_t timer_elapsed(uint16_t last) { - uint16_t t; + uint32_t t; + + uint8_t sreg = SREG; + cli(); + t = timer_count; + SREG = sreg; + + return TIMER_DIFF_16((t & 0xFFFF), last); +} + +inline +uint32_t timer_elapsed32(uint32_t last) +{ + uint32_t t; uint8_t sreg = SREG; cli(); t = timer_count; SREG = sreg; - return TIMER_DIFF_MS(t, last); + return TIMER_DIFF_32(t, last); } // excecuted once per 1ms.(excess for just timer count?) diff --git a/common/timer.h b/common/timer.h index d24d3eab6..70b008e6c 100644 --- a/common/timer.h +++ b/common/timer.h @@ -40,20 +40,23 @@ along with this program. If not, see . #endif #define TIMER_DIFF(a, b, max) ((a) >= (b) ? (a) - (b) : (max) - (b) + (a)) -#define TIMER_DIFF_RAW(a, b) TIMER_DIFF(a, b, UINT8_MAX) -#define TIMER_DIFF_MS(a, b) TIMER_DIFF(a, b, UINT16_MAX) +#define TIMER_DIFF_8(a, b) TIMER_DIFF(a, b, UINT8_MAX) +#define TIMER_DIFF_16(a, b) TIMER_DIFF(a, b, UINT16_MAX) +#define TIMER_DIFF_32(a, b) TIMER_DIFF(a, b, UINT32_MAX) #ifdef __cplusplus extern "C" { #endif -extern volatile uint16_t timer_count; +extern volatile uint32_t timer_count; void timer_init(void); void timer_clear(void); uint16_t timer_read(void); +uint32_t timer_read32(void); uint16_t timer_elapsed(uint16_t last); +uint32_t timer_elapsed32(uint32_t last); #ifdef __cplusplus } #endif diff --git a/protocol/pjrc/main.c b/protocol/pjrc/main.c index 15f14920b..0b0a44028 100644 --- a/protocol/pjrc/main.c +++ b/protocol/pjrc/main.c @@ -42,12 +42,6 @@ #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) -bool debug_enable = false; -bool debug_matrix = false; -bool debug_keyboard = false; -bool debug_mouse = false; - - int main(void) { DEBUG_LED_CONFIG; diff --git a/protocol/usb_hid/README b/protocol/usb_hid/README index 9750a1cc8..5d49cc8d2 100644 --- a/protocol/usb_hid/README +++ b/protocol/usb_hid/README @@ -26,3 +26,11 @@ You can see HID keyboard reports on debug output. Restriction and Bug ------------------- Not statble yet. + +Can't bus-reset a keyboard which already attached on bus properly. + Slow start up of Leonardo's bootloader causes this? + Need to unplug/plug a keyboard after firmware starts up. + MAX3421E doesn't work SAMPLEBUS well to know whether device connected or not. + +Keyboard with other endpoints than boot keyboard may go wrong. + On my keyboard with mouse key the converter locks up when using mouse key function. diff --git a/protocol/usb_hid/override_wiring.c b/protocol/usb_hid/override_wiring.c index a8c28dd89..3b3f5e302 100644 --- a/protocol/usb_hid/override_wiring.c +++ b/protocol/usb_hid/override_wiring.c @@ -8,11 +8,11 @@ unsigned long millis() { - return timer_read(); + return timer_read32(); } unsigned long micros() { - return timer_read() * 1000UL; + return timer_read32() * 1000UL; } void delay(unsigned long ms) { diff --git a/protocol/usb_hid/parser.cpp b/protocol/usb_hid/parser.cpp index 4077444b7..66e949518 100644 --- a/protocol/usb_hid/parser.cpp +++ b/protocol/usb_hid/parser.cpp @@ -3,7 +3,6 @@ #include "parser.h" #include "usb_hid.h" -#include "leonardo_led.h" #include "debug.h" @@ -16,9 +15,9 @@ void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); usb_hid_time_stamp = millis(); - LED_TX_TOGGLE; debug("KBDReport: "); debug_hex(usb_hid_keyboard_report.mods); + debug(" --"); for (uint8_t i = 0; i < 6; i++) { debug(" "); debug_hex(usb_hid_keyboard_report.keys[i]); diff --git a/protocol/usb_hid/usb_hid.h b/protocol/usb_hid/usb_hid.h new file mode 100644 index 000000000..083b68d1f --- /dev/null +++ b/protocol/usb_hid/usb_hid.h @@ -0,0 +1,10 @@ +#ifndef USB_HID_H +#define USB_HID_H + +#include "report.h" + + +extern report_keyboard_t usb_hid_keyboard_report; +extern uint16_t usb_hid_time_stamp; + +#endif -- cgit v1.2.3-70-g09d2