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"
2015-07-15 06:13:15 +00:00
# include "usbhub.h"
2012-08-27 06:18:01 +00:00
# include "hid.h"
# include "hidboot.h"
# include "parser.h"
// LUFA
# include "lufa.h"
2012-09-04 04:29:21 +00:00
# include "timer.h"
2014-12-10 06:10:25 +00:00
# include "sendchar.h"
2012-08-27 06:18:01 +00:00
# include "debug.h"
# include "keyboard.h"
2015-07-15 06:13:15 +00:00
# include "led.h"
2012-08-27 06:18:01 +00:00
2015-05-13 06:59:49 +00:00
/* LED ping configuration */
# define TMK_LED
//#define LEONARDO_LED
# if defined(TMK_LED)
// For TMK converter and Teensy
# define LED_TX_INIT (DDRD |= (1<<6))
# define LED_TX_ON (PORTD |= (1<<6))
# define LED_TX_OFF (PORTD &= ~(1<<6))
# define LED_TX_TOGGLE (PORTD ^= (1<<6))
# elif defined(LEONARDO_LED)
// For Leonardo(TX LED)
# 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))
# else
# define LED_TX_INIT
# define LED_TX_ON
# define LED_TX_OFF
# define LED_TX_TOGGLE
# endif
2012-08-27 06:18:01 +00:00
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 ( ) ;
2014-12-10 06:10:25 +00:00
print_set_sendchar ( sendchar ) ;
2012-08-27 06:18:01 +00:00
}
2015-05-13 04:55:11 +00:00
2015-07-15 06:13:15 +00:00
/*
* USB Host Shield HID keyboard
*/
USB usb_host ;
USBHub hub1 ( & usb_host ) ;
HIDBoot < HID_PROTOCOL_KEYBOARD > kbd ( & usb_host ) ;
KBDReportParser kbd_parser ;
void led_set ( uint8_t usb_led )
{
kbd . SetReport ( 0 , 0 , 2 , 0 , 1 , & usb_led ) ;
2012-08-27 06:18:01 +00:00
}
2015-07-15 06:13:15 +00:00
2012-08-27 06:18:01 +00:00
int main ( void )
{
// LED for debug
LED_TX_INIT ;
LED_TX_ON ;
debug_enable = true ;
2015-07-15 06:13:15 +00:00
debug_keyboard = true ;
2012-08-27 06:18:01 +00:00
host_set_driver ( & lufa_driver ) ;
keyboard_init ( ) ;
LUFA_setup ( ) ;
2015-07-15 06:13:15 +00:00
// USB Host Shield setup
usb_host . Init ( ) ;
kbd . SetReportParser ( 0 , ( HIDReportParser * ) & kbd_parser ) ;
2015-05-13 04:55:11 +00:00
/* NOTE: Don't insert time consuming job here.
* It ' ll cause unclear initialization failure when DFU reset ( worm start ) .
*/
2012-08-27 06:18:01 +00:00
sei ( ) ;
// wait for startup of sendchar routine
while ( USB_DeviceState ! = DEVICE_STATE_Configured ) ;
if ( debug_enable ) {
_delay_ms ( 1000 ) ;
}
debug ( " init: done \n " ) ;
2012-09-04 04:29:21 +00:00
uint16_t timer ;
2012-08-27 06:18:01 +00:00
for ( ; ; ) {
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
}
2015-05-13 04:55:11 +00:00
2012-08-27 06:18:01 +00:00
return 0 ;
}