ergodox_ez.c 2.3 KB

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