|
|
@@ -35,67 +35,8 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ----- Defines ----- |
|
|
|
|
|
|
|
// Verified Keypress Defines |
|
|
|
#define USB_TRANSFER_DIVIDER 10 // 1024 == 1 Send of keypresses per second, 1 == 1 Send of keypresses per ~1 millisecond |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ----- Macros ----- |
|
|
|
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) |
|
|
|
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ----- Variables ----- |
|
|
|
|
|
|
|
// Timer Interrupt for flagging a send of the sampled key detection data to the USB host |
|
|
|
uint16_t sendKeypressCounter = 0; |
|
|
|
|
|
|
|
// Flag generated by the timer interrupt |
|
|
|
volatile uint8_t sendKeypresses = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ----- Functions ----- |
|
|
|
|
|
|
|
inline void usbTimerSetup() |
|
|
|
{ |
|
|
|
// 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_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) |
|
|
|
// 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() |
|
|
|
{ |
|
|
|
// Enable CLI |
|
|
@@ -106,9 +47,6 @@ int main() |
|
|
|
Macro_setup(); |
|
|
|
Scan_setup(); |
|
|
|
|
|
|
|
// Setup ISR Timer for flagging a kepress send to USB |
|
|
|
usbTimerSetup(); |
|
|
|
|
|
|
|
// Main Detection Loop |
|
|
|
while ( 1 ) |
|
|
|
{ |
|
|
@@ -124,37 +62,8 @@ int main() |
|
|
|
// Run Macros over Key Indices and convert to USB Keys |
|
|
|
Macro_process(); |
|
|
|
|
|
|
|
// Send keypresses over USB if the ISR has signalled that it's time |
|
|
|
if ( !sendKeypresses ) |
|
|
|
continue; |
|
|
|
|
|
|
|
// Send USB Data |
|
|
|
// Sends USB data only if changed |
|
|
|
Output_send(); |
|
|
|
|
|
|
|
// Clear sendKeypresses Flag |
|
|
|
sendKeypresses = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ----- Interrupts ----- |
|
|
|
|
|
|
|
// USB Keyboard Data Send Counter Interrupt |
|
|
|
#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR |
|
|
|
ISR( TIMER0_OVF_vect ) |
|
|
|
#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM |
|
|
|
void pit0_isr() |
|
|
|
#endif |
|
|
|
{ |
|
|
|
sendKeypressCounter++; |
|
|
|
if ( sendKeypressCounter > USB_TRANSFER_DIVIDER ) { |
|
|
|
sendKeypressCounter = 0; |
|
|
|
sendKeypresses = 1; |
|
|
|
} |
|
|
|
|
|
|
|
#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) // ARM |
|
|
|
// Clear the interrupt flag |
|
|
|
PIT_TFLG0 = 1; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|