left.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "action.h"
  2. #include "left.h"
  3. #include "wait.h"
  4. bool i2c_initialized = false;
  5. void left_config(void);
  6. uint8_t left_write(uint8_t reg, uint8_t data);
  7. uint8_t left_read(uint8_t reg, uint8_t *data);
  8. uint8_t init_mcp23017(void)
  9. {
  10. i2c_initialized = false;
  11. if (i2c_initialized == 0)
  12. {
  13. i2c_init(); // on pins D(1,0)
  14. _delay_ms(1000);
  15. }
  16. return 0;
  17. }
  18. void left_init(void)
  19. {
  20. init_mcp23017();
  21. left_scan();
  22. #if 0
  23. while (1)
  24. {
  25. print("wait\n");
  26. wait_us(1000000);
  27. }
  28. #endif
  29. }
  30. void left_scan(void)
  31. {
  32. uint8_t ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT);
  33. if (ret == 0)
  34. {
  35. i2c_stop();
  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. uint8_t left_write(uint8_t reg, uint8_t data)
  78. {
  79. if (!i2c_initialized)
  80. {
  81. return 0;
  82. }
  83. uint8_t ret;
  84. ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT); if (ret) goto out;
  85. ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT); if (ret) goto out;
  86. ret = i2c_write(data, HOTDOX_I2C_TIMEOUT);
  87. out:
  88. i2c_stop();
  89. return ret;
  90. }
  91. uint8_t left_read(uint8_t reg, uint8_t *data)
  92. {
  93. if (!i2c_initialized)
  94. {
  95. return 0;
  96. }
  97. uint8_t ret = 0;
  98. ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT); if (ret) goto out;
  99. ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT); if (ret) goto out;
  100. ret = i2c_start(I2C_ADDR_READ, HOTDOX_I2C_TIMEOUT); if (ret) goto out;
  101. *data = i2c_read_nack(HOTDOX_I2C_TIMEOUT);
  102. out:
  103. i2c_stop();
  104. return ret;
  105. }