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