Kiibohd Controller
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
Este repositório está arquivado. Você pode visualizar os arquivos e realizar clone, mas não poderá realizar push nem abrir issues e pull requests.

13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
13 anos atrás
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /* Copyright (C) 2011-2014 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 <cli.h>
  29. #include <led.h>
  30. #include <print.h>
  31. // ----- Defines -----
  32. // Verified Keypress Defines
  33. #define USB_TRANSFER_DIVIDER 10 // 1024 == 1 Send of keypresses per second, 1 == 1 Send of keypresses per ~1 millisecond
  34. // ----- Macros -----
  35. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  36. #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
  37. #endif
  38. // ----- Function Declarations -----
  39. // ----- Variables -----
  40. // Timer Interrupt for flagging a send of the sampled key detection data to the USB host
  41. uint16_t sendKeypressCounter = 0;
  42. // Flag generated by the timer interrupt
  43. volatile uint8_t sendKeypresses = 0;
  44. // ----- Functions -----
  45. // Initial Pin Setup, make sure they are sane
  46. inline void pinSetup(void)
  47. {
  48. // AVR
  49. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  50. // For each pin, 0=input, 1=output
  51. #if defined(__AVR_AT90USB1286__)
  52. DDRA = 0x00;
  53. #endif
  54. DDRB = 0x00;
  55. DDRC = 0x00;
  56. DDRD = 0x00;
  57. DDRE = 0x00;
  58. DDRF = 0x00;
  59. // Setting pins to either high or pull-up resistor
  60. #if defined(__AVR_AT90USB1286__)
  61. PORTA = 0x00;
  62. #endif
  63. PORTB = 0x00;
  64. PORTC = 0x00;
  65. PORTD = 0x00;
  66. PORTE = 0x00;
  67. PORTF = 0x00;
  68. // ARM
  69. #elif defined(_mk20dx128_)
  70. // TODO - Should be cleared, but not that necessary due to the pin layout
  71. #endif
  72. }
  73. inline void usbTimerSetup(void)
  74. {
  75. // AVR
  76. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_)
  77. // Setup with 16 MHz clock
  78. CPU_PRESCALE( 0 );
  79. // Setup ISR Timer for flagging a kepress send to USB
  80. // Set to 256 * 1024 (8 bit timer with Clock/1024 prescalar) timer
  81. TCCR0A = 0x00;
  82. TCCR0B = 0x03;
  83. TIMSK0 = (1 << TOIE0);
  84. // ARM
  85. #elif defined(_mk20dx128_)
  86. // 48 MHz clock by default
  87. // System Clock Gating Register Disable
  88. SIM_SCGC6 |= SIM_SCGC6_PIT;
  89. // Enable Timers
  90. PIT_MCR = 0x00;
  91. // Setup ISR Timer for flagging a kepress send to USB
  92. // 1 ms / (1 / 48 MHz) - 1 = 47999 cycles -> 0xBB7F
  93. PIT_LDVAL0 = 0x0000BB7F;
  94. PIT_TCTRL0 = 0x3; // Enable Timer 0 interrupts, and Enable Timer 0
  95. // Insert the required vector for Timer 0
  96. NVIC_ENABLE_IRQ( IRQ_PIT_CH0 );
  97. #endif
  98. }
  99. int main(void)
  100. {
  101. // Configuring Pins
  102. pinSetup();
  103. // Enable CLI
  104. CLI_init();
  105. // Setup Modules
  106. Output_setup();
  107. Macro_setup();
  108. Scan_setup();
  109. // Setup ISR Timer for flagging a kepress send to USB
  110. usbTimerSetup();
  111. // Main Detection Loop
  112. while ( 1 )
  113. {
  114. // Process CLI
  115. CLI_process();
  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. Macro_process();
  123. // Send keypresses over USB if the ISR has signalled that it's time
  124. if ( !sendKeypresses )
  125. continue;
  126. // Send USB Data
  127. Output_send();
  128. // Clear sendKeypresses Flag
  129. sendKeypresses = 0;
  130. }
  131. }
  132. // ----- Interrupts -----
  133. // USB Keyboard Data Send Counter Interrupt
  134. #if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
  135. ISR( TIMER0_OVF_vect )
  136. #elif defined(_mk20dx128_) || defined(_mk20dx256_) // ARM
  137. void pit0_isr(void)
  138. #endif
  139. {
  140. sendKeypressCounter++;
  141. if ( sendKeypressCounter > USB_TRANSFER_DIVIDER ) {
  142. sendKeypressCounter = 0;
  143. sendKeypresses = 1;
  144. }
  145. #if defined(_mk20dx128_) // ARM
  146. // Clear the interrupt flag
  147. PIT_TFLG0 = 1;
  148. #endif
  149. }
  150. // ----- CLI Command Functions -----