logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

left.c (2055B)


  1. #include "action.h"
  2. #include "left.h"
  3. #include "print.h"
  4. #include "wait.h"
  5. bool i2c_initialized = false;
  6. void left_config(void);
  7. i2c_status_t left_write(uint8_t reg, uint8_t data);
  8. i2c_status_t left_read(uint8_t reg, uint8_t *data);
  9. uint8_t init_mcp23017(void)
  10. {
  11. i2c_initialized = false;
  12. if (i2c_initialized == 0)
  13. {
  14. i2c_init(); // on pins D(1,0)
  15. _delay_ms(1000);
  16. }
  17. return 0;
  18. }
  19. void left_init(void)
  20. {
  21. init_mcp23017();
  22. left_scan();
  23. #if 0
  24. while (1)
  25. {
  26. print("wait\n");
  27. wait_us(1000000);
  28. }
  29. #endif
  30. }
  31. void left_scan(void)
  32. {
  33. i2c_status_t ret = i2c_ping_address(I2C_ADDR, HOTDOX_I2C_TIMEOUT);
  34. if (ret == I2C_STATUS_SUCCESS)
  35. {
  36. if (!i2c_initialized)
  37. {
  38. i2c_initialized = true;
  39. left_config();
  40. clear_keyboard();
  41. print("mcp23017 attached!!!\n");
  42. }
  43. }
  44. else
  45. {
  46. if (i2c_initialized)
  47. {
  48. i2c_initialized = false;
  49. clear_keyboard();
  50. print("mcp23017 deattached!!!\n");
  51. }
  52. }
  53. return;
  54. }
  55. uint8_t left_read_cols(void)
  56. {
  57. uint8_t data = 0;
  58. left_read(MCP23017_B0_GPIOA, &data);
  59. return data;
  60. }
  61. void left_unselect_rows(void)
  62. {
  63. left_write(MCP23017_B0_IODIRB, 0x3F);
  64. }
  65. void left_select_row(uint8_t row)
  66. {
  67. left_write(MCP23017_B0_IODIRB, ~(1 << row));
  68. }
  69. void left_config(void)
  70. {
  71. left_write(MCP23017_B0_IODIRA, 0x7F);
  72. left_write(MCP23017_B0_IPOLA, 0x7F);
  73. left_write(MCP23017_B0_GPPUA, 0x7F);
  74. left_write(MCP23017_B0_IODIRB, 0xFF);
  75. left_write(MCP23017_B0_GPIOB, 0xC0);
  76. }
  77. i2c_status_t left_write(uint8_t reg, uint8_t data)
  78. {
  79. if (!i2c_initialized)
  80. {
  81. return 0;
  82. }
  83. i2c_status_t ret;
  84. ret = i2c_write_register(I2C_ADDR, reg, &data, sizeof(data), HOTDOX_I2C_TIMEOUT);
  85. return ret;
  86. }
  87. i2c_status_t left_read(uint8_t reg, uint8_t *data)
  88. {
  89. if (!i2c_initialized)
  90. {
  91. return 0;
  92. }
  93. i2c_status_t ret = 0;
  94. ret = i2c_read_register(I2C_ADDR, reg, data, 1, HOTDOX_I2C_TIMEOUT);
  95. return ret;
  96. }