Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include <util/delay.h>
  4. #include "matrix.h"
  5. #include "bootloader.h"
  6. #include "debug.h"
  7. #include "keymap.h"
  8. #include "eeconfig.h"
  9. #include "bootmagic.h"
  10. void bootmagic(void)
  11. {
  12. /* check signature */
  13. if (!eeconfig_is_enabled()) {
  14. eeconfig_init();
  15. }
  16. /* do scans in case of bounce */
  17. uint8_t scan = 100;
  18. while (scan--) { matrix_scan(); _delay_ms(10); }
  19. /* bootmagic skip */
  20. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SKIP)) {
  21. return;
  22. }
  23. /* eeconfig clear */
  24. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
  25. eeconfig_init();
  26. }
  27. /* bootloader */
  28. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_BOOTLOADER)) {
  29. bootloader_jump();
  30. }
  31. /* debug enable */
  32. debug_config.raw = eeconfig_read_debug();
  33. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
  34. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MATRIX)) {
  35. debug_config.matrix = !debug_config.matrix;
  36. } else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) {
  37. debug_config.keyboard = !debug_config.keyboard;
  38. } else if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEBUG_MOUSE)) {
  39. debug_config.mouse = !debug_config.mouse;
  40. } else {
  41. debug_config.enable = !debug_config.enable;
  42. }
  43. }
  44. eeconfig_write_debug(debug_config.raw);
  45. /* keymap config */
  46. keymap_config.raw = eeconfig_read_keymap();
  47. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_CONTROL_CPASLOCK)) {
  48. keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
  49. }
  50. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) {
  51. keymap_config.capslock_to_control = !keymap_config.capslock_to_control;
  52. }
  53. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) {
  54. keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
  55. }
  56. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) {
  57. keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
  58. }
  59. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_NO_GUI)) {
  60. keymap_config.no_gui = !keymap_config.no_gui;
  61. }
  62. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) {
  63. keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc;
  64. }
  65. if (bootmagic_scan_keycode(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
  66. keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
  67. }
  68. eeconfig_write_keymap(keymap_config.raw);
  69. }
  70. bool bootmagic_scan_keycode(uint8_t keycode)
  71. {
  72. for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
  73. matrix_row_t matrix_row = matrix_get_row(r);
  74. for (uint8_t c = 0; c < MATRIX_COLS; c++) {
  75. if (matrix_row & ((matrix_row_t)1<<c)) {
  76. if (keycode == keymap_key_to_keycode(0, (key_t){ .row = r, .col = c })) {
  77. return true;
  78. }
  79. }
  80. }
  81. }
  82. return false;
  83. }