logo

qmk_firmware

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

mux.c (2533B)


  1. // Copyright 2023 Massdrop, Inc.
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "keyboard.h"
  4. #include "analog.h"
  5. #include "gpio.h"
  6. #include "wait.h"
  7. #define S_UP B12
  8. #define E_UP_N B13
  9. #define S_DN1 B14
  10. #define E_DN1_N B15
  11. #define E_VBUS_1 A8
  12. #define E_VBUS_2 A15
  13. #define SRC_1 B8
  14. #define SRC_2 B9
  15. #define HUB_RESET_N D2
  16. #define IRST B1
  17. #define SDB_N B2
  18. #define C1_A5_SENSE A4
  19. #define C1_B5_SENSE A7
  20. #define C2_A5_SENSE C4
  21. #define C2_B5_SENSE B0
  22. static inline void digital_write(pin_t pin, uint8_t level) {
  23. gpio_set_pin_output(pin);
  24. gpio_write_pin(pin, level);
  25. }
  26. uint16_t v_con_1 = 0;
  27. uint16_t v_con_2 = 0;
  28. uint16_t v_con_3 = 0;
  29. uint16_t v_con_4 = 0;
  30. void keyboard_USB_enable(void) {
  31. // initial state
  32. digital_write(S_UP, 0);
  33. digital_write(E_UP_N, 1);
  34. digital_write(S_DN1, 1);
  35. digital_write(E_DN1_N, 1);
  36. digital_write(E_VBUS_1, 0);
  37. digital_write(E_VBUS_2, 0);
  38. digital_write(SRC_1, 1);
  39. digital_write(SRC_2, 1);
  40. gpio_set_pin_input(C1_A5_SENSE);
  41. gpio_set_pin_input(C1_B5_SENSE);
  42. gpio_set_pin_input(C2_A5_SENSE);
  43. gpio_set_pin_input(C2_B5_SENSE);
  44. // reset hub
  45. digital_write(HUB_RESET_N, 0);
  46. wait_ms(100);
  47. digital_write(HUB_RESET_N, 1);
  48. wait_ms(500); // Allow power dissipation time on CC lines
  49. v_con_1 = analogReadPin(C1_A5_SENSE);
  50. v_con_2 = analogReadPin(C1_B5_SENSE);
  51. v_con_3 = analogReadPin(C2_A5_SENSE);
  52. v_con_4 = analogReadPin(C2_B5_SENSE);
  53. // TODO: dynamic port port configure logic?
  54. digital_write(E_UP_N, 0); // HOST enable
  55. digital_write(E_DN1_N, 0); // EXTRA enable
  56. digital_write(E_VBUS_1, 1); // USBC-1 enable full power I/O
  57. digital_write(E_VBUS_2, 1); // USBC-2 enable full power I/O
  58. if ((v_con_1 + v_con_2) > (v_con_3 + v_con_4)) {
  59. digital_write(S_UP, 0); // HOST to USBC-1
  60. digital_write(S_DN1, 1); // EXTRA to USBC-2
  61. digital_write(SRC_1, 1); // HOST on USBC-1
  62. digital_write(SRC_2, 0); // EXTRA available on USBC-2
  63. } else {
  64. digital_write(S_UP, 1); // EXTRA to USBC-1
  65. digital_write(S_DN1, 0); // HOST to USBC-2
  66. digital_write(SRC_1, 0); // EXTRA available on USBC-1
  67. digital_write(SRC_2, 1); // HOST on USBC-2
  68. }
  69. }
  70. void keyboard_ISSI_enable(void) {
  71. #ifdef RGB_MATRIX_ENABLE
  72. digital_write(IRST, 0);
  73. digital_write(SDB_N, 1);
  74. #endif
  75. }
  76. void keyboard_pre_init_kb(void) {
  77. keyboard_USB_enable();
  78. keyboard_ISSI_enable();
  79. keyboard_pre_init_user();
  80. }