ergodox_ez.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "ergodox_ez.h"
  2. #include "i2cmaster.h"
  3. bool i2c_initialized = 0;
  4. uint8_t mcp23018_status = 0x20;
  5. __attribute__ ((weak))
  6. void * matrix_init_user(void) {
  7. };
  8. __attribute__ ((weak))
  9. void * matrix_scan_user(void) {
  10. };
  11. void * matrix_init_kb(void) {
  12. // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
  13. TCCR1A = 0b10101001; // set and configure fast PWM
  14. TCCR1B = 0b00001001; // set and configure fast PWM
  15. // (tied to Vcc for hardware convenience)
  16. DDRB &= ~(1<<4); // set B(4) as input
  17. PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
  18. // unused pins - C7, D4, D5, D7, E6
  19. // set as input with internal pull-ip enabled
  20. DDRC &= ~(1<<7);
  21. DDRD &= ~(1<<7 | 1<<5 | 1<<4);
  22. DDRE &= ~(1<<6);
  23. PORTC |= (1<<7);
  24. PORTD |= (1<<7 | 1<<5 | 1<<4);
  25. PORTE |= (1<<6);
  26. ergodox_blink_all_leds();
  27. if (matrix_init_user) {
  28. (*matrix_init_user)();
  29. }
  30. };
  31. void * matrix_scan_kb(void) {
  32. if (matrix_scan_user) {
  33. (*matrix_scan_user)();
  34. }
  35. };
  36. void ergodox_blink_all_leds(void)
  37. {
  38. ergodox_led_all_off();
  39. ergodox_led_all_set(LED_BRIGHTNESS_HI);
  40. ergodox_led_all_on();
  41. _delay_ms(333);
  42. ergodox_led_all_off();
  43. }
  44. uint8_t init_mcp23018(void) {
  45. mcp23018_status = 0x20;
  46. // I2C subsystem
  47. if (i2c_initialized == 0) {
  48. i2c_init(); // on pins D(1,0)
  49. i2c_initialized++;
  50. _delay_ms(1000);
  51. }
  52. // set pin direction
  53. // - unused : input : 1
  54. // - input : input : 1
  55. // - driving : output : 0
  56. mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
  57. mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
  58. mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
  59. mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
  60. i2c_stop();
  61. // set pull-up
  62. // - unused : on : 1
  63. // - input : on : 1
  64. // - driving : off : 0
  65. mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
  66. mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
  67. mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
  68. mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
  69. out:
  70. i2c_stop();
  71. return mcp23018_status;
  72. }