X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=main.c;h=dd8b8e0983ffdc8f705fc4c729082f7dd017fbaf;hb=85dd7f5c52e73c98ac09478da504efbf44b1dcbb;hp=1533443cc2c4de2525702bd39ffa9987d844d33c;hpb=0c562995c71f3fe4d7e4c449f68b99af228c5387;p=kiibohd-controller.git diff --git a/main.c b/main.c index 1533443..dd8b8e0 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2011 by Jacob Alexander +/* Copyright (C) 2011-2013 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,14 +21,13 @@ // ----- Includes ----- -// AVR Includes -#include -#include +// Compiler Includes +#include // Project Includes #include #include -#include +#include #include #include @@ -43,7 +42,9 @@ // ----- Macros ----- +#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) +#endif @@ -63,6 +64,9 @@ volatile uint8_t sendKeypresses = 0; inline void pinSetup(void) { +// AVR +#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) + // For each pin, 0=input, 1=output #if defined(__AVR_AT90USB1286__) DDRA = 0x00; @@ -83,28 +87,66 @@ inline void pinSetup(void) PORTD = 0x00; PORTE = 0x00; PORTF = 0x00; + +// ARM +#elif defined(_mk20dx128_) + // TODO - Should be cleared, but not that necessary due to the pin layout +#endif } -int main(void) + +inline void usbTimerSetup(void) { +// AVR +#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) + // Setup with 16 MHz clock CPU_PRESCALE( 0 ); + // Setup ISR Timer for flagging a kepress send to USB + // Set to 256 * 1024 (8 bit timer with Clock/1024 prescalar) timer + TCCR0A = 0x00; + TCCR0B = 0x03; + TIMSK0 = (1 << TOIE0); + +// ARM +#elif defined(_mk20dx128_) + // 48 MHz clock by default + + // System Clock Gating Register Disable + SIM_SCGC6 |= SIM_SCGC6_PIT; + + // Enable Timers + PIT_MCR = 0x00; + + // Setup ISR Timer for flagging a kepress send to USB + // 1 ms / (1 / 48 MHz) - 1 = 47999 cycles -> 0xBB7F + PIT_LDVAL0 = 0x0000BB7F; + PIT_TCTRL0 = 0x3; // Enable Timer 0 interrupts, and Enable Timer 0 + + // Insert the required vector for Timer 0 + NVIC_ENABLE_IRQ( IRQ_PIT_CH0 ); +#endif +} + + +int main(void) +{ // Configuring Pins pinSetup(); init_errorLED(); - // Setup USB Module - usb_setup(); + // Setup Output Module + output_setup(); + + // Enable CLI + init_cli(); // Setup ISR Timer for flagging a kepress send to USB - // Set to 256 * 1024 (8 bit timer with Clock/1024 prescalar) timer - TCCR0A = 0x00; - TCCR0B = 0x03; - TIMSK0 = (1 << TOIE0); + usbTimerSetup(); // Main Detection Loop - uint8_t ledTimer = 15; // Enable LED for a short time + uint8_t ledTimer = F_CPU / 1000000; // Enable LED for a short time while ( 1 ) { // Setup the scanning module @@ -146,13 +188,25 @@ int main(void) } } + +// ----- Interrupts ----- + // USB Keyboard Data Send Counter Interrupt +#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR ISR( TIMER0_OVF_vect ) +#elif defined(_mk20dx128_) // ARM +void pit0_isr(void) +#endif { sendKeypressCounter++; if ( sendKeypressCounter > USB_TRANSFER_DIVIDER ) { sendKeypressCounter = 0; sendKeypresses = 1; } + +#if defined(_mk20dx128_) // ARM + // Clear the interrupt flag + PIT_TFLG0 = 1; +#endif }