diff options
Diffstat (limited to 'keyboards/ergodox_ez/ergodox_ez.c')
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c new file mode 100644 index 000000000..3609f6f81 --- /dev/null +++ b/keyboards/ergodox_ez/ergodox_ez.c | |||
@@ -0,0 +1,136 @@ | |||
1 | #include QMK_KEYBOARD_H | ||
2 | #include "i2cmaster.h" | ||
3 | |||
4 | |||
5 | extern inline void ergodox_board_led_on(void); | ||
6 | extern inline void ergodox_right_led_1_on(void); | ||
7 | extern inline void ergodox_right_led_2_on(void); | ||
8 | extern inline void ergodox_right_led_3_on(void); | ||
9 | extern inline void ergodox_right_led_on(uint8_t led); | ||
10 | |||
11 | extern inline void ergodox_board_led_off(void); | ||
12 | extern inline void ergodox_right_led_1_off(void); | ||
13 | extern inline void ergodox_right_led_2_off(void); | ||
14 | extern inline void ergodox_right_led_3_off(void); | ||
15 | extern inline void ergodox_right_led_off(uint8_t led); | ||
16 | |||
17 | extern inline void ergodox_led_all_on(void); | ||
18 | extern inline void ergodox_led_all_off(void); | ||
19 | |||
20 | extern inline void ergodox_right_led_1_set(uint8_t n); | ||
21 | extern inline void ergodox_right_led_2_set(uint8_t n); | ||
22 | extern inline void ergodox_right_led_3_set(uint8_t n); | ||
23 | extern inline void ergodox_right_led_set(uint8_t led, uint8_t n); | ||
24 | |||
25 | extern inline void ergodox_led_all_set(uint8_t n); | ||
26 | |||
27 | |||
28 | bool i2c_initialized = 0; | ||
29 | uint8_t mcp23018_status = 0x20; | ||
30 | |||
31 | void matrix_init_kb(void) { | ||
32 | // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md") | ||
33 | TCCR1A = 0b10101001; // set and configure fast PWM | ||
34 | TCCR1B = 0b00001001; // set and configure fast PWM | ||
35 | |||
36 | // (tied to Vcc for hardware convenience) | ||
37 | DDRB &= ~(1<<4); // set B(4) as input | ||
38 | PORTB &= ~(1<<4); // set B(4) internal pull-up disabled | ||
39 | |||
40 | // unused pins - C7, D4, D5, D7, E6 | ||
41 | // set as input with internal pull-ip enabled | ||
42 | DDRC &= ~(1<<7); | ||
43 | DDRD &= ~(1<<5 | 1<<4); | ||
44 | DDRE &= ~(1<<6); | ||
45 | PORTC |= (1<<7); | ||
46 | PORTD |= (1<<5 | 1<<4); | ||
47 | PORTE |= (1<<6); | ||
48 | |||
49 | ergodox_blink_all_leds(); | ||
50 | |||
51 | matrix_init_user(); | ||
52 | } | ||
53 | |||
54 | void ergodox_blink_all_leds(void) | ||
55 | { | ||
56 | ergodox_led_all_off(); | ||
57 | ergodox_led_all_set(LED_BRIGHTNESS_HI); | ||
58 | ergodox_right_led_1_on(); | ||
59 | _delay_ms(50); | ||
60 | ergodox_right_led_2_on(); | ||
61 | _delay_ms(50); | ||
62 | ergodox_right_led_3_on(); | ||
63 | _delay_ms(50); | ||
64 | ergodox_right_led_1_off(); | ||
65 | _delay_ms(50); | ||
66 | ergodox_right_led_2_off(); | ||
67 | _delay_ms(50); | ||
68 | ergodox_right_led_3_off(); | ||
69 | //ergodox_led_all_on(); | ||
70 | //_delay_ms(333); | ||
71 | ergodox_led_all_off(); | ||
72 | } | ||
73 | |||
74 | uint8_t init_mcp23018(void) { | ||
75 | mcp23018_status = 0x20; | ||
76 | |||
77 | // I2C subsystem | ||
78 | |||
79 | // uint8_t sreg_prev; | ||
80 | // sreg_prev=SREG; | ||
81 | // cli(); | ||
82 | if (i2c_initialized == 0) { | ||
83 | i2c_init(); // on pins D(1,0) | ||
84 | i2c_initialized = true; | ||
85 | _delay_ms(1000); | ||
86 | } | ||
87 | |||
88 | // set pin direction | ||
89 | // - unused : input : 1 | ||
90 | // - input : input : 1 | ||
91 | // - driving : output : 0 | ||
92 | mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; | ||
93 | mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out; | ||
94 | mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; | ||
95 | mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; | ||
96 | i2c_stop(); | ||
97 | |||
98 | // set pull-up | ||
99 | // - unused : on : 1 | ||
100 | // - input : on : 1 | ||
101 | // - driving : off : 0 | ||
102 | mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; | ||
103 | mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out; | ||
104 | mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; | ||
105 | mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; | ||
106 | |||
107 | out: | ||
108 | i2c_stop(); | ||
109 | |||
110 | // SREG=sreg_prev; | ||
111 | |||
112 | return mcp23018_status; | ||
113 | } | ||
114 | |||
115 | #ifdef ONEHAND_ENABLE | ||
116 | __attribute__ ((weak)) | ||
117 | // swap-hands action needs a matrix to define the swap | ||
118 | const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { | ||
119 | /* Left hand, matrix positions */ | ||
120 | {{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}}, | ||
121 | {{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}}, | ||
122 | {{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}}, | ||
123 | {{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}}, | ||
124 | {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}}, | ||
125 | {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}}, | ||
126 | {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}}, | ||
127 | /* Right hand, matrix positions */ | ||
128 | {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}}, | ||
129 | {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}}, | ||
130 | {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}}, | ||
131 | {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}}, | ||
132 | {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}}, | ||
133 | {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}}, | ||
134 | {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}}, | ||
135 | }; | ||
136 | #endif | ||