transport.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include "transport.h"
  2. #include "config.h"
  3. #include "matrix.h"
  4. #include "quantum.h"
  5. #include "orbit.h"
  6. #define ROWS_PER_HAND (MATRIX_ROWS/2)
  7. #ifdef RGBLIGHT_ENABLE
  8. # include "rgblight.h"
  9. #endif
  10. #ifdef BACKLIGHT_ENABLE
  11. # include "backlight.h"
  12. extern backlight_config_t backlight_config;
  13. #endif
  14. #if defined(USE_I2C)
  15. #include "i2c.h"
  16. #ifndef SLAVE_I2C_ADDRESS
  17. # define SLAVE_I2C_ADDRESS 0x32
  18. #endif
  19. #if (MATRIX_COLS > 8)
  20. # error "Currently only supports 8 COLS"
  21. #endif
  22. // Get rows from other half over i2c
  23. bool transport_master(matrix_row_t matrix[]) {
  24. int err = 0;
  25. // write backlight info
  26. #ifdef BACKLIGHT_ENABLE
  27. if (BACKLIT_DIRTY) {
  28. err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
  29. if (err) { goto i2c_error; }
  30. // Backlight location
  31. err = i2c_master_write(I2C_BACKLIT_START);
  32. if (err) { goto i2c_error; }
  33. // Write backlight
  34. i2c_master_write(get_backlight_level());
  35. BACKLIT_DIRTY = false;
  36. }
  37. #endif
  38. err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
  39. if (err) { goto i2c_error; }
  40. // start of matrix stored at I2C_KEYMAP_START
  41. err = i2c_master_write(I2C_KEYMAP_START);
  42. if (err) { goto i2c_error; }
  43. // Start read
  44. err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
  45. if (err) { goto i2c_error; }
  46. if (!err) {
  47. int i;
  48. for (i = 0; i < ROWS_PER_HAND-1; ++i) {
  49. matrix[i] = i2c_master_read(I2C_ACK);
  50. }
  51. matrix[i] = i2c_master_read(I2C_NACK);
  52. i2c_master_stop();
  53. } else {
  54. i2c_error: // the cable is disconnceted, or something else went wrong
  55. i2c_reset_state();
  56. return false;
  57. }
  58. #ifdef RGBLIGHT_ENABLE
  59. if (RGB_DIRTY) {
  60. err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
  61. if (err) { goto i2c_error; }
  62. // RGB Location
  63. err = i2c_master_write(I2C_RGB_START);
  64. if (err) { goto i2c_error; }
  65. uint32_t dword = eeconfig_read_rgblight();
  66. // Write RGB
  67. err = i2c_master_write_data(&dword, 4);
  68. if (err) { goto i2c_error; }
  69. RGB_DIRTY = false;
  70. i2c_master_stop();
  71. }
  72. #endif
  73. return true;
  74. }
  75. void transport_slave(matrix_row_t matrix[]) {
  76. for (int i = 0; i < ROWS_PER_HAND; ++i)
  77. {
  78. i2c_slave_buffer[I2C_KEYMAP_START + i] = matrix[i];
  79. }
  80. // Read Backlight Info
  81. #ifdef BACKLIGHT_ENABLE
  82. if (BACKLIT_DIRTY)
  83. {
  84. backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]);
  85. BACKLIT_DIRTY = false;
  86. }
  87. #endif
  88. #ifdef RGBLIGHT_ENABLE
  89. if (RGB_DIRTY)
  90. {
  91. // Disable interupts (RGB data is big)
  92. cli();
  93. // Create new DWORD for RGB data
  94. uint32_t dword;
  95. // Fill the new DWORD with the data that was sent over
  96. uint8_t * dword_dat = (uint8_t *)(&dword);
  97. for (int i = 0; i < 4; i++)
  98. {
  99. dword_dat[i] = i2c_slave_buffer[I2C_RGB_START + i];
  100. }
  101. // Update the RGB now with the new data and set RGB_DIRTY to false
  102. rgblight_update_dword(dword);
  103. RGB_DIRTY = false;
  104. // Re-enable interupts now that RGB is set
  105. sei();
  106. }
  107. #endif
  108. }
  109. void transport_master_init(void) {
  110. i2c_master_init();
  111. }
  112. void transport_slave_init(void) {
  113. i2c_slave_init(SLAVE_I2C_ADDRESS);
  114. }
  115. #else // USE_SERIAL
  116. #include "serial.h"
  117. volatile Serial_s2m_buffer_t serial_s2m_buffer = {};
  118. volatile Serial_m2s_buffer_t serial_m2s_buffer = {};
  119. uint8_t volatile status0 = 0;
  120. SSTD_t transactions[] = {
  121. { (uint8_t *)&status0,
  122. sizeof(serial_m2s_buffer), (uint8_t *)&serial_m2s_buffer,
  123. sizeof(serial_s2m_buffer), (uint8_t *)&serial_s2m_buffer
  124. }
  125. };
  126. uint8_t slave_layer_cache;
  127. uint8_t slave_nlock_cache;
  128. uint8_t slave_clock_cache;
  129. uint8_t slave_slock_cache;
  130. void transport_master_init(void)
  131. { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
  132. void transport_slave_init(void)
  133. {
  134. soft_serial_target_init(transactions, TID_LIMIT(transactions));
  135. slave_layer_cache = 255;
  136. slave_nlock_cache = 255;
  137. slave_clock_cache = 255;
  138. slave_slock_cache = 255;
  139. }
  140. bool transport_master(matrix_row_t matrix[]) {
  141. if (soft_serial_transaction()) {
  142. return false;
  143. }
  144. // TODO: if MATRIX_COLS > 8 change to unpack()
  145. for (int i = 0; i < ROWS_PER_HAND; ++i) {
  146. matrix[i] = serial_s2m_buffer.smatrix[i];
  147. }
  148. #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
  149. // Code to send RGB over serial goes here (not implemented yet)
  150. #endif
  151. #ifdef BACKLIGHT_ENABLE
  152. // Write backlight level for slave to read
  153. serial_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0;
  154. #endif
  155. return true;
  156. }
  157. void transport_slave(matrix_row_t matrix[]) {
  158. // TODO: if MATRIX_COLS > 8 change to pack()
  159. for (int i = 0; i < ROWS_PER_HAND; ++i)
  160. {
  161. serial_s2m_buffer.smatrix[i] = matrix[i];
  162. }
  163. #ifdef BACKLIGHT_ENABLE
  164. backlight_set(serial_m2s_buffer.backlight_level);
  165. #endif
  166. #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
  167. // Add serial implementation for RGB here
  168. #endif
  169. if (slave_layer_cache != serial_m2s_buffer.current_layer) {
  170. slave_layer_cache = serial_m2s_buffer.current_layer;
  171. set_layer_indicators(slave_layer_cache);
  172. }
  173. if (slave_nlock_cache != serial_m2s_buffer.nlock_led) {
  174. slave_nlock_cache = serial_m2s_buffer.nlock_led;
  175. led_toggle(3, slave_nlock_cache);
  176. }
  177. if (slave_clock_cache != serial_m2s_buffer.clock_led) {
  178. slave_clock_cache = serial_m2s_buffer.clock_led;
  179. led_toggle(4, slave_clock_cache);
  180. }
  181. if (slave_slock_cache != serial_m2s_buffer.slock_led) {
  182. slave_slock_cache = serial_m2s_buffer.slock_led;
  183. led_toggle(5, slave_slock_cache);
  184. }
  185. }
  186. #endif