Kiibohd Controller
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
Tento repozitář je archivovaný. Můžete prohlížet soubory, klonovat, ale nemůžete nahrávat a vytvářet nové úkoly a požadavky na natažení.

před 13 roky
před 13 roky
před 13 roky
před 13 roky
před 13 roky
před 13 roky
před 13 roky
před 13 roky
před 13 roky
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /* Copyright (C) 2011-2013 by Jacob Alexander
  2. *
  3. * Permission is hereby granted, free of charge, to any person obtaining a copy
  4. * of this software and associated documentation files (the "Software"), to deal
  5. * in the Software without restriction, including without limitation the rights
  6. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. * copies of the Software, and to permit persons to whom the Software is
  8. * furnished to do so, subject to the following conditions:
  9. *
  10. * The above copyright notice and this permission notice shall be included in
  11. * all copies or substantial portions of the Software.
  12. *
  13. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. * THE SOFTWARE.
  20. */
  21. // ----- Includes -----
  22. // Compiler Includes
  23. #include <Lib/MainLib.h>
  24. // Project Includes
  25. #include <macro.h>
  26. #include <scan_loop.h>
  27. #include <output_com.h>
  28. #include <led.h>
  29. #include <print.h>
  30. // ----- Defines -----
  31. // Verified Keypress Defines
  32. #define USB_TRANSFER_DIVIDER 10 // 1024 == 1 Send of keypresses per second, 1 == 1 Send of keypresses per ~1 millisecond
  33. // ----- Macros -----
  34. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  35. #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
  36. #endif
  37. // ----- Variables -----
  38. // Timer Interrupt for flagging a send of the sampled key detection data to the USB host
  39. uint16_t sendKeypressCounter = 0;
  40. // Flag generated by the timer interrupt
  41. volatile uint8_t sendKeypresses = 0;
  42. // ----- Functions -----
  43. // Initial Pin Setup, make sure they are sane
  44. inline void pinSetup(void)
  45. {
  46. // AVR
  47. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  48. // For each pin, 0=input, 1=output
  49. #if defined(__AVR_AT90USB1286__)
  50. DDRA = 0x00;
  51. #endif
  52. DDRB = 0x00;
  53. DDRC = 0x00;
  54. DDRD = 0x00;
  55. DDRE = 0x00;
  56. DDRF = 0x00;
  57. // Setting pins to either high or pull-up resistor
  58. #if defined(__AVR_AT90USB1286__)
  59. PORTA = 0x00;
  60. #endif
  61. PORTB = 0x00;
  62. PORTC = 0x00;
  63. PORTD = 0x00;
  64. PORTE = 0x00;
  65. PORTF = 0x00;
  66. // ARM
  67. #elif defined(_mk20dx128_)
  68. // TODO - Should be cleared, but not that necessary due to the pin layout
  69. #endif
  70. }
  71. inline void usbTimerSetup(void)
  72. {
  73. // AVR
  74. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  75. // Setup with 16 MHz clock
  76. CPU_PRESCALE( 0 );
  77. // Setup ISR Timer for flagging a kepress send to USB
  78. // Set to 256 * 1024 (8 bit timer with Clock/1024 prescalar) timer
  79. TCCR0A = 0x00;
  80. TCCR0B = 0x03;
  81. TIMSK0 = (1 << TOIE0);
  82. // ARM
  83. #elif defined(_mk20dx128_)
  84. // 48 MHz clock by default
  85. // System Clock Gating Register Disable
  86. SIM_SCGC6 |= SIM_SCGC6_PIT;
  87. // Enable Timers
  88. PIT_MCR = 0x00;
  89. // Setup ISR Timer for flagging a kepress send to USB
  90. // 1 ms / (1 / 48 MHz) - 1 = 47999 cycles -> 0xBB7F
  91. PIT_LDVAL0 = 0x0000BB7F;
  92. PIT_TCTRL0 = 0x3; // Enable Timer 0 interrupts, and Enable Timer 0
  93. // Insert the required vector for Timer 0
  94. NVIC_ENABLE_IRQ( IRQ_PIT_CH0 );
  95. #endif
  96. }
  97. int main(void)
  98. {
  99. // Configuring Pins
  100. pinSetup();
  101. init_errorLED();
  102. // Setup Output Module
  103. output_setup();
  104. // Enable CLI
  105. init_cli();
  106. // Setup ISR Timer for flagging a kepress send to USB
  107. usbTimerSetup();
  108. // Main Detection Loop
  109. uint8_t ledTimer = F_CPU / 1000000; // Enable LED for a short time
  110. while ( 1 )
  111. {
  112. // Setup the scanning module
  113. scan_setup();
  114. while ( 1 )
  115. {
  116. // Acquire Key Indices
  117. // Loop continuously until scan_loop returns 0
  118. cli();
  119. while ( scan_loop() );
  120. sei();
  121. // Run Macros over Key Indices and convert to USB Keys
  122. process_macros();
  123. // Send keypresses over USB if the ISR has signalled that it's time
  124. if ( !sendKeypresses )
  125. continue;
  126. // Send USB Data
  127. usb_send();
  128. // Clear sendKeypresses Flag
  129. sendKeypresses = 0;
  130. // Indicate Error, if valid
  131. errorLED( ledTimer );
  132. if ( ledTimer > 0 )
  133. ledTimer--;
  134. }
  135. // Loop should never get here (indicate error)
  136. ledTimer = 255;
  137. // HID Debug Error message
  138. erro_print("Detection loop error, this is very bad...bug report!");
  139. }
  140. }
  141. // ----- Interrupts -----
  142. // USB Keyboard Data Send Counter Interrupt
  143. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
  144. ISR( TIMER0_OVF_vect )
  145. #elif defined(_mk20dx128_) // ARM
  146. void pit0_isr(void)
  147. #endif
  148. {
  149. sendKeypressCounter++;
  150. if ( sendKeypressCounter > USB_TRANSFER_DIVIDER ) {
  151. sendKeypressCounter = 0;
  152. sendKeypresses = 1;
  153. }
  154. #if defined(_mk20dx128_) // ARM
  155. // Clear the interrupt flag
  156. PIT_TFLG0 = 1;
  157. #endif
  158. }