2012-08-27 06:18:01 +00:00
# include <avr/io.h>
# include <avr/wdt.h>
# include <avr/power.h>
# include <util/delay.h>
// USB HID host
# include "Usb.h"
# include "hid.h"
# include "hidboot.h"
# include "parser.h"
// LUFA
# include "lufa.h"
2012-09-04 04:29:21 +00:00
# include "timer.h"
2012-08-27 06:18:01 +00:00
# include "debug.h"
# include "keyboard.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 ( )
{
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 ( ) ;
2012-09-04 04:29:21 +00:00
uint8_t ret ;
2012-08-27 06:18:01 +00:00
// wait for startup of sendchar routine
while ( USB_DeviceState ! = DEVICE_STATE_Configured ) ;
if ( debug_enable ) {
_delay_ms ( 1000 ) ;
}
2012-09-04 04:29:21 +00:00
debug ( " init: start \n " ) ;
2012-08-27 06:18:01 +00:00
HID_setup ( ) ;
debug ( " init: done \n " ) ;
2012-09-04 04:29:21 +00:00
uint16_t timer ;
// to see loop pulse with oscillo scope
DDRF = ( 1 < < 7 ) ;
2012-08-27 06:18:01 +00:00
for ( ; ; ) {
2012-09-04 04:29:21 +00:00
PORTF ^ = ( 1 < < 7 ) ;
2012-10-07 02:09:40 +00:00
keyboard_task ( ) ;
2012-08-27 06:18:01 +00:00
2012-09-04 04:29:21 +00:00
timer = timer_read ( ) ;
2012-08-27 06:18:01 +00:00
usb_host . Task ( ) ;
2012-09-04 04:29:21 +00:00
timer = timer_elapsed ( timer ) ;
if ( timer > 100 ) {
debug ( " host.Task: " ) ; debug_hex16 ( timer ) ; debug ( " \n " ) ;
}
2012-08-27 06:18:01 +00:00
# if !defined(INTERRUPT_CONTROL_ENDPOINT)
// LUFA Task for control request
USB_USBTask ( ) ;
# endif
}
return 0 ;
}