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