diff options
author | tmk <nobody@nowhere> | 2012-08-25 15:49:08 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2012-08-28 21:56:15 +0900 |
commit | c5060ea81942b0e3f8577536ff78402a19abe3d3 (patch) | |
tree | bcdd4cd269be3064982014b0afdc0aea628d7048 /protocol | |
parent | 9382bf2f765cfbb8f7a9a48157391cac2bb71780 (diff) |
test build of 'Host shield' in minimal env.
Diffstat (limited to 'protocol')
-rw-r--r-- | protocol/lufa.mk | 10 | ||||
-rw-r--r-- | protocol/lufa/lufa.c | 96 | ||||
-rw-r--r-- | protocol/lufa/lufa.h | 11 | ||||
-rw-r--r-- | protocol/usb_hid.mk | 67 | ||||
-rw-r--r-- | protocol/usb_hid/NullSerial.cpp | 44 | ||||
-rw-r--r-- | protocol/usb_hid/README | 19 | ||||
-rw-r--r-- | protocol/usb_hid/USBAPI.h | 22 | ||||
-rw-r--r-- | protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h | 4 | ||||
-rw-r--r-- | protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c | 2 | ||||
-rw-r--r-- | protocol/usb_hid/leonardo_led.h | 10 | ||||
-rw-r--r-- | protocol/usb_hid/main.cpp | 66 | ||||
-rw-r--r-- | protocol/usb_hid/override_Serial.cpp | 51 | ||||
-rw-r--r-- | protocol/usb_hid/override_wiring.c | 28 | ||||
-rw-r--r-- | protocol/usb_hid/parser.cpp | 15 | ||||
-rw-r--r-- | protocol/usb_hid/parser.h | 5 | ||||
-rw-r--r-- | protocol/usb_hid/test/Makefile (renamed from protocol/usb_hid/Makefile) | 119 | ||||
-rw-r--r-- | protocol/usb_hid/test/config.h | 40 | ||||
-rw-r--r-- | protocol/usb_hid/test/test.cpp | 92 |
18 files changed, 442 insertions, 259 deletions
diff --git a/protocol/lufa.mk b/protocol/lufa.mk index ad6cab6d3b..bf6fc97b8e 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 b7ecb8488d..81409ce9ed 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 71c279b0dc..bcee060d67 100644 --- a/protocol/lufa/lufa.h +++ b/protocol/lufa/lufa.h @@ -47,8 +47,19 @@ #include <string.h> #include <LUFA/Version.h> #include <LUFA/Drivers/USB/USB.h> +#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 0000000000..f3149f7f4b --- /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/NullSerial.cpp b/protocol/usb_hid/NullSerial.cpp deleted file mode 100644 index 6d85caf2d8..0000000000 --- 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 0acf677f8b..9750a1cc8d 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 e3390d49a8..0000000000 --- a/protocol/usb_hid/USBAPI.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Override original arduino USBAPI.h. - */ -#include <stdint.h> -#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 229a638c53..900713e0f9 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 b1a4ce4b0b..ac8bb6f9b4 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 0000000000..6f67a88f5b --- /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 c292d458e2..0000000000 --- a/protocol/usb_hid/main.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include <util/delay.h> -#include <Arduino.h> -#include "Usb.h" -#include "hid.h" -#include "hidboot.h" -#include "parser.h" - - -USB Usb; -HIDBoot<HID_PROTOCOL_KEYBOARD> kbd(&Usb); -KBDReportParser Prs; - -void usb_disable() -{ - USBCON &= ~(1<<VBUSTI); - UDIEN = 0; - USBINT = 0; - UDINT = 0; - UDCON |= (1<<DETACH); - USBCON &= ~(1<<USBE); - PLLCSR = 0; - UHWCON &= ~(1<<UVREGE); - USBCON &= ~(1<<OTGPADE); -} - -void setup() -{ - usb_disable(); - - // RX LED for debug - DDRB |= (1<<0); - - Serial.begin( 115200 ); - while (!Serial) ; - - delay( 1000 ); - - Serial.println("Start"); - - if (Usb.Init() == -1) { - Serial.println("OSC did not start."); - } - - delay( 200 ); - - kbd.SetReportParser(0, (HIDReportParser*)&Prs); -} - -void loop() -{ - Usb.Task(); -} - -int main(void) -{ - // arduino/wiring.c(Timer initialize) - init(); - - setup(); - - for (;;) { - loop(); - } - - return 0; -} diff --git a/protocol/usb_hid/override_Serial.cpp b/protocol/usb_hid/override_Serial.cpp new file mode 100644 index 0000000000..e1755a5dc7 --- /dev/null +++ b/protocol/usb_hid/override_Serial.cpp @@ -0,0 +1,51 @@ +/* + * Null implementation of Serial to dump debug print into blackhole + */ +#include "Arduino.h" +#include "sendchar.h" + +#include "USBAPI.h" + + +void Serial_::begin(uint16_t baud_count) +{ +} + +void Serial_::end(void) +{ +} + +void Serial_::accept(void) +{ +} + +int Serial_::available(void) +{ + return 0; +} + +int Serial_::peek(void) +{ + return -1; +} + +int Serial_::read(void) +{ + return -1; +} + +void Serial_::flush(void) +{ +} + +size_t Serial_::write(uint8_t c) +{ + sendchar(c); + return 1; +} + +Serial_::operator bool() { + return true; +} + +Serial_ Serial; diff --git a/protocol/usb_hid/override_wiring.c b/protocol/usb_hid/override_wiring.c new file mode 100644 index 0000000000..a8c28dd898 --- /dev/null +++ b/protocol/usb_hid/override_wiring.c @@ -0,0 +1,28 @@ +/* + * To keep Timer0 for common/timer.c override arduino/wiring.c. + */ +#include <util/delay.h> +#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 cf64322302..b03af8ae41 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<uint8_t>(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 dc14c82705..703eb1ed4c 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/Makefile b/protocol/usb_hid/test/Makefile index ed3d6518d8..39f5de4552 100644 --- a/protocol/usb_hid/Makefile +++ b/protocol/usb_hid/test/Makefile @@ -39,7 +39,9 @@ #---------------------------------------------------------------------------- # Target file name (without extension). -TARGET = usbkbd +TARGET = usb_hid_test + +TOP_DIR = ../../.. # Directory keyboard dependent files exist TARGET_DIR = . @@ -63,79 +65,62 @@ 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 + -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 +VPATH += $(TOP_DIR) +VPATH += $(TOP_DIR)/common -# 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 +PROGRAM_CMD = avrdude -p$(MCU) -cavr109 -P$(DEV) -b57600 -Uflash:w:$(TARGET).hex + -include ../../rules.mk +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 0000000000..c2230fb570 --- /dev/null +++ b/protocol/usb_hid/test/config.h @@ -0,0 +1,40 @@ +/* +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_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 0000000000..4958f0c619 --- /dev/null +++ b/protocol/usb_hid/test/test.cpp @@ -0,0 +1,92 @@ +#include <avr/io.h> +#include <avr/wdt.h> +#include <avr/power.h> +#include <util/delay.h> +#include <Arduino.h> + +// 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<HID_PROTOCOL_KEYBOARD> 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; +} |