103 lines
2.1 KiB
C
103 lines
2.1 KiB
C
|
#include <avr/io.h>
|
||
|
#include <avr/power.h>
|
||
|
#include <avr/wdt.h>
|
||
|
#include "lufa.h"
|
||
|
#include "print.h"
|
||
|
#include "sendchar.h"
|
||
|
#include "rn42.h"
|
||
|
#include "rn42_task.h"
|
||
|
#include "serial.h"
|
||
|
#include "keyboard.h"
|
||
|
#include "keycode.h"
|
||
|
#include "action.h"
|
||
|
#include "action_util.h"
|
||
|
#include "wait.h"
|
||
|
#include "suart.h"
|
||
|
#include "suspend.h"
|
||
|
|
||
|
static int8_t sendchar_func(uint8_t c)
|
||
|
{
|
||
|
sendchar(c); // LUFA
|
||
|
xmit(c); // SUART
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
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();
|
||
|
print_set_sendchar(sendchar_func);
|
||
|
|
||
|
// SUART PD0:output, PD1:input
|
||
|
DDRD |= (1<<0);
|
||
|
PORTD |= (1<<0);
|
||
|
DDRD &= ~(1<<1);
|
||
|
PORTD |= (1<<1);
|
||
|
}
|
||
|
|
||
|
int main(void) __attribute__ ((weak));
|
||
|
int main(void)
|
||
|
{
|
||
|
SetupHardware();
|
||
|
sei();
|
||
|
|
||
|
/* wait for USB startup to get ready for debug output */
|
||
|
uint8_t timeout = 255; // timeout when USB is not available(Bluetooth)
|
||
|
while (timeout-- && USB_DeviceState != DEVICE_STATE_Configured) {
|
||
|
wait_ms(4);
|
||
|
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||
|
;
|
||
|
#else
|
||
|
USB_USBTask();
|
||
|
#endif
|
||
|
}
|
||
|
print("USB configured.\n");
|
||
|
|
||
|
rn42_init();
|
||
|
rn42_task_init();
|
||
|
print("RN-42 init\n");
|
||
|
|
||
|
/* init modules */
|
||
|
keyboard_init();
|
||
|
|
||
|
if (!rn42_rts()) {
|
||
|
host_set_driver(&rn42_driver);
|
||
|
} else {
|
||
|
host_set_driver(&lufa_driver);
|
||
|
}
|
||
|
|
||
|
#ifdef SLEEP_LED_ENABLE
|
||
|
sleep_led_init();
|
||
|
#endif
|
||
|
|
||
|
print("Keyboard start.\n");
|
||
|
while (1) {
|
||
|
while (USB_DeviceState == DEVICE_STATE_Suspended) {
|
||
|
suspend_power_down();
|
||
|
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
|
||
|
USB_Device_SendRemoteWakeup();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
keyboard_task();
|
||
|
|
||
|
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||
|
USB_USBTask();
|
||
|
#endif
|
||
|
|
||
|
rn42_task();
|
||
|
}
|
||
|
}
|