frenchdev.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "frenchdev.h"
  2. extern inline void frenchdev_board_led_on(void);
  3. extern inline void frenchdev_led_1_on(void);
  4. extern inline void frenchdev_led_2_on(void);
  5. extern inline void frenchdev_led_3_on(void);
  6. extern inline void frenchdev_led_on(uint8_t led);
  7. extern inline void frenchdev_board_led_off(void);
  8. extern inline void frenchdev_led_1_off(void);
  9. extern inline void frenchdev_led_2_off(void);
  10. extern inline void frenchdev_led_3_off(void);
  11. extern inline void frenchdev_led_off(uint8_t led);
  12. extern inline void frenchdev_led_all_on(void);
  13. extern inline void frenchdev_led_all_off(void);
  14. extern inline void frenchdev_led_1_set(uint8_t n);
  15. extern inline void frenchdev_led_2_set(uint8_t n);
  16. extern inline void frenchdev_led_3_set(uint8_t n);
  17. extern inline void frenchdev_led_set(uint8_t led, uint8_t n);
  18. extern inline void frenchdev_led_all_set(uint8_t n);
  19. bool i2c_initialized = 0;
  20. uint8_t mcp23018_status = 0x20;
  21. void matrix_init_kb(void) {
  22. // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
  23. TCCR1A = 0b10101001; // set and configure fast PWM
  24. TCCR1B = 0b00001001; // set and configure fast PWM
  25. // unused pins - D4, D5, D7, E6
  26. // set as input with internal pull-ip enabled
  27. DDRD &= ~(1<<5 | 1<<4);
  28. DDRE &= ~(1<<6);
  29. PORTD |= (1<<5 | 1<<4);
  30. PORTE |= (1<<6);
  31. frenchdev_blink_all_leds();
  32. frenchdev_blink_all_leds();
  33. frenchdev_blink_all_leds();
  34. frenchdev_blink_all_leds();
  35. matrix_init_user();
  36. }
  37. void frenchdev_blink_all_leds(void)
  38. {
  39. frenchdev_led_all_off();
  40. frenchdev_led_all_set(LED_BRIGHTNESS_HI);
  41. frenchdev_led_1_on();
  42. wait_ms(50);
  43. frenchdev_led_2_on();
  44. wait_ms(50);
  45. frenchdev_led_3_on();
  46. wait_ms(50);
  47. frenchdev_led_1_off();
  48. wait_ms(50);
  49. frenchdev_led_2_off();
  50. wait_ms(50);
  51. frenchdev_led_3_off();
  52. frenchdev_led_all_off();
  53. }
  54. uint8_t init_mcp23018(void) {
  55. mcp23018_status = 0x20;
  56. // I2C subsystem
  57. // uint8_t sreg_prev;
  58. // sreg_prev=SREG;
  59. // cli();
  60. if (i2c_initialized == 0) {
  61. i2c_init(); // on pins D(1,0)
  62. i2c_initialized = true;;
  63. wait_ms(1000);
  64. }
  65. // set pin direction
  66. // - unused : input : 1
  67. // - input : input : 1
  68. // - driving : output : 0
  69. mcp23018_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); if (mcp23018_status) goto out;
  70. mcp23018_status = i2c_write(IODIRA, I2C_TIMEOUT); if (mcp23018_status) goto out;
  71. mcp23018_status = i2c_write(0b00000000, I2C_TIMEOUT); if (mcp23018_status) goto out;
  72. mcp23018_status = i2c_write(0b00111111, I2C_TIMEOUT); if (mcp23018_status) goto out;
  73. i2c_stop();
  74. // set pull-up
  75. // - unused : on : 1
  76. // - input : on : 1
  77. // - driving : off : 0
  78. mcp23018_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT); if (mcp23018_status) goto out;
  79. mcp23018_status = i2c_write(GPPUA, I2C_TIMEOUT); if (mcp23018_status) goto out;
  80. mcp23018_status = i2c_write(0b00000000, I2C_TIMEOUT); if (mcp23018_status) goto out;
  81. mcp23018_status = i2c_write(0b00111111, I2C_TIMEOUT); if (mcp23018_status) goto out;
  82. out:
  83. i2c_stop();
  84. // SREG=sreg_prev;
  85. return mcp23018_status;
  86. }