aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2018-06-22 21:26:30 -0400
committerJack Humbert <jack.humb@gmail.com>2018-06-22 21:26:30 -0400
commit6380f8319057d33bb6d07c66789867e49c634504 (patch)
treee469a238792c60c3016e4f8fd4226497451da9e6
parent76e0d23887b8ddc70e9afb30bb7b91e9fec96c35 (diff)
downloadqmk_firmware-6380f8319057d33bb6d07c66789867e49c634504.tar.gz
qmk_firmware-6380f8319057d33bb6d07c66789867e49c634504.zip
refactor, non-working
-rwxr-xr-xdrivers/avr/i2c_master.c133
-rwxr-xr-xdrivers/avr/i2c_master.h25
-rw-r--r--drivers/avr/is31fl3731.c87
-rw-r--r--drivers/avr/is31fl3731.h10
-rw-r--r--keyboards/ergodox_ez/config.h2
-rw-r--r--keyboards/ergodox_ez/ergodox_ez.c36
-rw-r--r--keyboards/ergodox_ez/ergodox_ez.h2
-rw-r--r--keyboards/ergodox_ez/matrix.c20
-rw-r--r--quantum/rgb_matrix.c9
9 files changed, 178 insertions, 146 deletions
diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c
index caca2179e..30ea760c9 100755
--- a/drivers/avr/i2c_master.c
+++ b/drivers/avr/i2c_master.c
@@ -19,7 +19,7 @@ void i2c_init(void)
19 //TWBR = 10; 19 //TWBR = 10;
20} 20}
21 21
22i2c_status_t i2c_start(uint8_t address, uint8_t timeout) 22i2c_status_t i2c_start(uint8_t address, uint16_t timeout)
23{ 23{
24 // reset TWI control register 24 // reset TWI control register
25 TWCR = 0; 25 TWCR = 0;
@@ -28,13 +28,13 @@ i2c_status_t i2c_start(uint8_t address, uint8_t timeout)
28 28
29 uint16_t timeout_timer = timer_read(); 29 uint16_t timeout_timer = timer_read();
30 while( !(TWCR & (1<<TWINT)) ) { 30 while( !(TWCR & (1<<TWINT)) ) {
31 if (timeout && (timer_read() - timeout_timer) > timeout) { 31 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
32 return I2C_STATUS_TIMEOUT; 32 return I2C_STATUS_TIMEOUT;
33 } 33 }
34 } 34 }
35 35
36 // check if the start condition was successfully transmitted 36 // check if the start condition was successfully transmitted
37 if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return 1; } 37 if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return I2C_STATUS_ERROR; }
38 38
39 // load slave address into data register 39 // load slave address into data register
40 TWDR = address; 40 TWDR = address;
@@ -43,19 +43,19 @@ i2c_status_t i2c_start(uint8_t address, uint8_t timeout)
43 43
44 timeout_timer = timer_read(); 44 timeout_timer = timer_read();
45 while( !(TWCR & (1<<TWINT)) ) { 45 while( !(TWCR & (1<<TWINT)) ) {
46 if (timeout && (timer_read() - timeout_timer) > I2C_TIMEOUT) { 46 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
47 return I2C_STATUS_TIMEOUT; 47 return I2C_STATUS_TIMEOUT;
48 } 48 }
49 } 49 }
50 50
51 // check if the device has acknowledged the READ / WRITE mode 51 // check if the device has acknowledged the READ / WRITE mode
52 uint8_t twst = TW_STATUS & 0xF8; 52 uint8_t twst = TW_STATUS & 0xF8;
53 if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1; 53 if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return I2C_STATUS_ERROR;
54 54
55 return 0; 55 return I2C_STATUS_SUCCESS;
56} 56}
57 57
58i2c_status_t i2c_write(uint8_t data, uint8_t timeout) 58i2c_status_t i2c_write(uint8_t data, uint16_t timeout)
59{ 59{
60 // load data into data register 60 // load data into data register
61 TWDR = data; 61 TWDR = data;
@@ -64,17 +64,17 @@ i2c_status_t i2c_write(uint8_t data, uint8_t timeout)
64 64
65 uint16_t timeout_timer = timer_read(); 65 uint16_t timeout_timer = timer_read();
66 while( !(TWCR & (1<<TWINT)) ) { 66 while( !(TWCR & (1<<TWINT)) ) {
67 if (timeout && (timer_read() - timeout_timer) > I2C_TIMEOUT) { 67 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
68 return I2C_STATUS_TIMEOUT; 68 return I2C_STATUS_TIMEOUT;
69 } 69 }
70 } 70 }
71 71
72 if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return 1; } 72 if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return I2C_STATUS_ERROR; }
73 73
74 return 0; 74 return I2C_STATUS_SUCCESS;
75} 75}
76 76
77i2c_status_t i2c_read_ack(uint8_t timeout) 77int16_t i2c_read_ack(uint16_t timeout)
78{ 78{
79 79
80 // start TWI module and acknowledge data after reception 80 // start TWI module and acknowledge data after reception
@@ -82,7 +82,7 @@ i2c_status_t i2c_read_ack(uint8_t timeout)
82 82
83 uint16_t timeout_timer = timer_read(); 83 uint16_t timeout_timer = timer_read();
84 while( !(TWCR & (1<<TWINT)) ) { 84 while( !(TWCR & (1<<TWINT)) ) {
85 if (timeout && (timer_read() - timeout_timer) > I2C_TIMEOUT) { 85 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
86 return I2C_STATUS_TIMEOUT; 86 return I2C_STATUS_TIMEOUT;
87 } 87 }
88 } 88 }
@@ -91,7 +91,7 @@ i2c_status_t i2c_read_ack(uint8_t timeout)
91 return TWDR; 91 return TWDR;
92} 92}
93 93
94i2c_status_t i2c_read_nack(uint8_t timeout) 94int16_t i2c_read_nack(uint16_t timeout)
95{ 95{
96 96
97 // start receiving without acknowledging reception 97 // start receiving without acknowledging reception
@@ -99,7 +99,7 @@ i2c_status_t i2c_read_nack(uint8_t timeout)
99 99
100 uint16_t timeout_timer = timer_read(); 100 uint16_t timeout_timer = timer_read();
101 while( !(TWCR & (1<<TWINT)) ) { 101 while( !(TWCR & (1<<TWINT)) ) {
102 if (timeout && (timer_read() - timeout_timer) > I2C_TIMEOUT) { 102 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
103 return I2C_STATUS_TIMEOUT; 103 return I2C_STATUS_TIMEOUT;
104 } 104 }
105 } 105 }
@@ -108,81 +108,112 @@ i2c_status_t i2c_read_nack(uint8_t timeout)
108 return TWDR; 108 return TWDR;
109} 109}
110 110
111i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length) 111i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
112{ 112{
113 if (i2c_start(address | I2C_WRITE)) return 1; 113 i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
114 if (status) return status;
114 115
115 for (uint16_t i = 0; i < length; i++) 116 for (uint16_t i = 0; i < length; i++) {
116 { 117 status = i2c_write(data[i], timeout);
117 if (i2c_write(data[i])) return 1; 118 if (status) return status;
118 } 119 }
119 120
120 i2c_stop(); 121 status = i2c_stop(timeout);
122 if (status) return status;
121 123
122 return 0; 124 return I2C_STATUS_SUCCESS;
123} 125}
124 126
125uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length) 127i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
126{ 128{
127 if (i2c_start(address | I2C_READ)) return 1; 129 i2c_status_t status = i2c_start(address | I2C_READ, timeout);
128 130 if (status) return status;
129 for (uint16_t i = 0; i < (length-1); i++) 131
130 { 132 for (uint16_t i = 0; i < (length-1); i++) {
131 data[i] = i2c_read_ack(); 133 status = i2c_read_ack(timeout);
134 if (status >= 0) {
135 data[i] = status;
136 } else {
137 return status;
138 }
132 } 139 }
133 data[(length-1)] = i2c_read_nack();
134 140
135 i2c_stop(); 141 status = i2c_read_nack(timeout);
142 if (status >= 0 ) {
143 data[(length-1)] = status;
144 } else {
145 return status;
146 }
147
148 status = i2c_stop(timeout);
149 if (status) return status;
136 150
137 return 0; 151 return I2C_STATUS_SUCCESS;
138} 152}
139 153
140uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length) 154i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
141{ 155{
142 if (i2c_start(devaddr | 0x00)) return 1; 156 i2c_status_t status = i2c_start(devaddr | 0x00, timeout);
157 if (status) return status;
143 158
144 i2c_write(regaddr); 159 status = i2c_write(regaddr, timeout);
160 if (status) return status;
145 161
146 for (uint16_t i = 0; i < length; i++) 162 for (uint16_t i = 0; i < length; i++) {
147 { 163 status = i2c_write(data[i], timeout);
148 if (i2c_write(data[i])) return 1; 164 if (status) return status;
149 } 165 }
150 166
151 i2c_stop(); 167 status = i2c_stop(timeout);
168 if (status) return status;
152 169
153 return 0; 170 return I2C_STATUS_SUCCESS;
154} 171}
155 172
156uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length) 173i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
157{ 174{
158 if (i2c_start(devaddr)) return 1; 175 i2c_status_t status = i2c_start(devaddr, timeout);
176 if (status) return status;
159 177
160 i2c_write(regaddr); 178 status = i2c_write(regaddr, timeout);
179 if (status) return status;
161 180
162 if (i2c_start(devaddr | 0x01)) return 1; 181 status = i2c_start(devaddr | 0x01, timeout);
182 if (status) return status;
163 183
164 for (uint16_t i = 0; i < (length-1); i++) 184 for (uint16_t i = 0; i < (length-1); i++) {
165 { 185 status = i2c_read_ack(timeout);
166 data[i] = i2c_read_ack(); 186 if (status >= 0) {
187 data[i] = status;
188 } else {
189 return status;
190 }
167 } 191 }
168 data[(length-1)] = i2c_read_nack();
169 192
170 i2c_stop(); 193 status = i2c_read_nack(timeout);
194 if (status >= 0 ) {
195 data[(length-1)] = status;
196 } else {
197 return status;
198 }
199
200 status = i2c_stop(timeout);
201 if (status) return status;
171 202
172 return 0; 203 return I2C_STATUS_SUCCESS;
173} 204}
174 205
175i2c_status_t i2c_stop(uint8_t timeout) 206i2c_status_t i2c_stop(uint16_t timeout)
176{ 207{
177 // transmit STOP condition 208 // transmit STOP condition
178 TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); 209 TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
179 210
180 uint16_t timeout_timer = timer_read(); 211 uint16_t timeout_timer = timer_read();
181 while(TWCR & (1<<TWSTO)) { 212 while(TWCR & (1<<TWSTO)) {
182 if (timeout && (timer_read() - timeout_timer) > I2C_TIMEOUT) { 213 if (timeout && ((timer_read() - timeout_timer) > timeout)) {
183 return I2C_STATUS_TIMEOUT; 214 return I2C_STATUS_TIMEOUT;
184 } 215 }
185 } 216 }
186 217
187 return 0; 218 return I2C_STATUS_SUCCESS;
188} 219}
diff --git a/drivers/avr/i2c_master.h b/drivers/avr/i2c_master.h
index 3c7731e8d..0806d76aa 100755
--- a/drivers/avr/i2c_master.h
+++ b/drivers/avr/i2c_master.h
@@ -8,20 +8,21 @@
8#define I2C_READ 0x01 8#define I2C_READ 0x01
9#define I2C_WRITE 0x00 9#define I2C_WRITE 0x00
10 10
11typedef i2c_status_t int16_t 11typedef int16_t i2c_status_t;
12#define I2C_STATUS_TIMEOUT (-1)
13 12
14#define I2C_NO_TIMEOUT 0 13#define I2C_STATUS_SUCCESS (0)
14#define I2C_STATUS_ERROR (-1)
15#define I2C_STATUS_TIMEOUT (-2)
15 16
16void i2c_init(void); 17void i2c_init(void);
17i2c_status_t i2c_start(uint8_t address, uint8_t timeout); 18i2c_status_t i2c_start(uint8_t address, uint16_t timeout);
18i2c_status_t i2c_write(uint8_t data, uint8_t timeout); 19i2c_status_t i2c_write(uint8_t data, uint16_t timeout);
19i2c_status_t i2c_read_ack(uint8_t timeout); 20int16_t i2c_read_ack(uint16_t timeout);
20i2c_status_t i2c_read_nack(uint8_t timeout); 21int16_t i2c_read_nack(uint16_t timeout);
21uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length); 22i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
22uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length); 23i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
23uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length); 24i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
24uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length); 25i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
25i2c_status_t i2c_stop(uint8_t timeout); 26i2c_status_t i2c_stop(uint16_t timeout);
26 27
27#endif // I2C_MASTER_H 28#endif // I2C_MASTER_H
diff --git a/drivers/avr/is31fl3731.c b/drivers/avr/is31fl3731.c
index 158b77b7b..70813464b 100644
--- a/drivers/avr/is31fl3731.c
+++ b/drivers/avr/is31fl3731.c
@@ -49,6 +49,14 @@
49#define ISSI_COMMANDREGISTER 0xFD 49#define ISSI_COMMANDREGISTER 0xFD
50#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine' 50#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
51 51
52#ifndef ISSI_TIMEOUT
53 #define ISSI_TIMEOUT 100
54#endif
55
56#ifndef ISSI_PERSISTENCE
57 #define ISSI_PERSISTENCE 0
58#endif
59
52// Transfer buffer for TWITransmitData() 60// Transfer buffer for TWITransmitData()
53uint8_t g_twi_transfer_buffer[20]; 61uint8_t g_twi_transfer_buffer[20];
54 62
@@ -78,100 +86,104 @@ bool g_led_control_registers_update_required = false;
78// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09 86// 0x10 - R16,R15,R14,R13,R12,R11,R10,R09
79 87
80 88
81uint8_t IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) 89void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data )
82{ 90{
83 g_twi_transfer_buffer[0] = reg; 91 g_twi_transfer_buffer[0] = reg;
84 g_twi_transfer_buffer[1] = data; 92 g_twi_transfer_buffer[1] = data;
85 93
86 //Transmit data until succesful 94 #if ISSI_PERSISTENCE > 0
87 //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); 95 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
88 return i2c_transmit(addr << 1, g_twi_transfer_buffer,2); 96 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
97 break;
98 }
99 #else
100 i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
101 #endif
89} 102}
90 103
91uint8_t IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) 104void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
92{ 105{
93 uint8_t ret = 0;
94 // assumes bank is already selected 106 // assumes bank is already selected
95 107
96 // transmit PWM registers in 9 transfers of 16 bytes 108 // transmit PWM registers in 9 transfers of 16 bytes
97 // g_twi_transfer_buffer[] is 20 bytes 109 // g_twi_transfer_buffer[] is 20 bytes
98 110
99 // iterate over the pwm_buffer contents at 16 byte intervals 111 // iterate over the pwm_buffer contents at 16 byte intervals
100 for ( int i = 0; i < 144; i += 16 ) 112 for ( int i = 0; i < 144; i += 16 ) {
101 {
102 // set the first register, e.g. 0x24, 0x34, 0x44, etc. 113 // set the first register, e.g. 0x24, 0x34, 0x44, etc.
103 g_twi_transfer_buffer[0] = 0x24 + i; 114 g_twi_transfer_buffer[0] = 0x24 + i;
104 // copy the data from i to i+15 115 // copy the data from i to i+15
105 // device will auto-increment register for data after the first byte 116 // device will auto-increment register for data after the first byte
106 // thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer 117 // thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
107 for ( int j = 0; j < 16; j++ ) 118 for ( int j = 0; j < 16; j++ ) {
108 {
109 g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; 119 g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
110 } 120 }
111 121
112 //Transmit buffer until succesful 122 #if ISSI_PERSISTENCE > 0
113 //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); 123 for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
114 ret |= i2c_transmit(addr << 1, g_twi_transfer_buffer, 17); 124 if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
125 break;
126 }
127 #else
128 i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
129 #endif
115 } 130 }
116 return ret;
117} 131}
118 132
119uint8_t IS31FL3731_init( uint8_t addr ) 133void IS31FL3731_init( uint8_t addr )
120{ 134{
121 uint8_t ret = 0;
122 // In order to avoid the LEDs being driven with garbage data 135 // In order to avoid the LEDs being driven with garbage data
123 // in the LED driver's PWM registers, first enable software shutdown, 136 // in the LED driver's PWM registers, first enable software shutdown,
124 // then set up the mode and other settings, clear the PWM registers, 137 // then set up the mode and other settings, clear the PWM registers,
125 // then disable software shutdown. 138 // then disable software shutdown.
126 139
127 // select "function register" bank 140 // select "function register" bank
128 ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); 141 IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG );
129 142
130 // enable software shutdown 143 // enable software shutdown
131 ret |= IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 ); 144 IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x00 );
132 // this delay was copied from other drivers, might not be needed 145 // this delay was copied from other drivers, might not be needed
133 _delay_ms( 10 ); 146 _delay_ms( 10 );
134 147
135 // picture mode 148 // picture mode
136 ret |= IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE ); 149 IS31FL3731_write_register( addr, ISSI_REG_CONFIG, ISSI_REG_CONFIG_PICTUREMODE );
137 // display frame 0 150 // display frame 0
138 ret |= IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 ); 151 IS31FL3731_write_register( addr, ISSI_REG_PICTUREFRAME, 0x00 );
139 // audio sync off 152 // audio sync off
140 ret |= IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 ); 153 IS31FL3731_write_register( addr, ISSI_REG_AUDIOSYNC, 0x00 );
141 154
142 // select bank 0 155 // select bank 0
143 ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); 156 IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
144 157
145 // turn off all LEDs in the LED control register 158 // turn off all LEDs in the LED control register
146 for ( int i = 0x00; i <= 0x11; i++ ) 159 for ( int i = 0x00; i <= 0x11; i++ )
147 { 160 {
148 ret |= IS31FL3731_write_register( addr, i, 0x00 ); 161 IS31FL3731_write_register( addr, i, 0x00 );
149 } 162 }
150 163
151 // turn off all LEDs in the blink control register (not really needed) 164 // turn off all LEDs in the blink control register (not really needed)
152 for ( int i = 0x12; i <= 0x23; i++ ) 165 for ( int i = 0x12; i <= 0x23; i++ )
153 { 166 {
154 ret |= IS31FL3731_write_register( addr, i, 0x00 ); 167 IS31FL3731_write_register( addr, i, 0x00 );
155 } 168 }
156 169
157 // set PWM on all LEDs to 0 170 // set PWM on all LEDs to 0
158 for ( int i = 0x24; i <= 0xB3; i++ ) 171 for ( int i = 0x24; i <= 0xB3; i++ )
159 { 172 {
160 ret |= IS31FL3731_write_register( addr, i, 0x00 ); 173 IS31FL3731_write_register( addr, i, 0x00 );
161 } 174 }
162 175
163 // select "function register" bank 176 // select "function register" bank
164 ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG ); 177 IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, ISSI_BANK_FUNCTIONREG );
165 178
166 // disable software shutdown 179 // disable software shutdown
167 ret |= IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 ); 180 IS31FL3731_write_register( addr, ISSI_REG_SHUTDOWN, 0x01 );
168 181
169 // select bank 0 and leave it selected. 182 // select bank 0 and leave it selected.
170 // most usage after initialization is just writing PWM buffers in bank 0 183 // most usage after initialization is just writing PWM buffers in bank 0
171 // as there's not much point in double-buffering 184 // as there's not much point in double-buffering
172 ret |= IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 ); 185 IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
173 186
174 return ret;
175} 187}
176 188
177void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) 189void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
@@ -224,32 +236,27 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
224 236
225 g_led_control_registers_update_required = true; 237 g_led_control_registers_update_required = true;
226 238
227
228} 239}
229 240
230uint8_t IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) 241void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
231{ 242{
232 uint8_t ret = 0;
233 if ( g_pwm_buffer_update_required ) 243 if ( g_pwm_buffer_update_required )
234 { 244 {
235 ret |= IS31FL3731_write_pwm_buffer( addr1, g_pwm_buffer[0] ); 245 IS31FL3731_write_pwm_buffer( addr1, g_pwm_buffer[0] );
236 ret |= IS31FL3731_write_pwm_buffer( addr2, g_pwm_buffer[1] ); 246 IS31FL3731_write_pwm_buffer( addr2, g_pwm_buffer[1] );
237 } 247 }
238 g_pwm_buffer_update_required = false; 248 g_pwm_buffer_update_required = false;
239 return ret;
240} 249}
241 250
242uint8_t IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) 251void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 )
243{ 252{
244 uint8_t ret = 0;
245 if ( g_led_control_registers_update_required ) 253 if ( g_led_control_registers_update_required )
246 { 254 {
247 for ( int i=0; i<18; i++ ) 255 for ( int i=0; i<18; i++ )
248 { 256 {
249 ret |= IS31FL3731_write_register(addr1, i, g_led_control_registers[0][i] ); 257 IS31FL3731_write_register(addr1, i, g_led_control_registers[0][i] );
250 ret |= IS31FL3731_write_register(addr2, i, g_led_control_registers[1][i] ); 258 IS31FL3731_write_register(addr2, i, g_led_control_registers[1][i] );
251 } 259 }
252 } 260 }
253 return ret;
254} 261}
255 262
diff --git a/drivers/avr/is31fl3731.h b/drivers/avr/is31fl3731.h
index 62632e276..3d30fc67b 100644
--- a/drivers/avr/is31fl3731.h
+++ b/drivers/avr/is31fl3731.h
@@ -31,9 +31,9 @@ typedef struct is31_led {
31 31
32extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; 32extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
33 33
34uint8_t IS31FL3731_init( uint8_t addr ); 34void IS31FL3731_init( uint8_t addr );
35uint8_t IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ); 35void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data );
36uint8_t IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); 36void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer );
37 37
38void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); 38void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue );
39void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); 39void IS31FL3731_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
@@ -44,8 +44,8 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
44// (eg. from a timer interrupt). 44// (eg. from a timer interrupt).
45// Call this while idle (in between matrix scans). 45// Call this while idle (in between matrix scans).
46// If the buffer is dirty, it will update the driver with the buffer. 46// If the buffer is dirty, it will update the driver with the buffer.
47uint8_t IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ); 47void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 );
48uint8_t IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ); 48void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 );
49 49
50#define C1_1 0x24 50#define C1_1 0x24
51#define C1_2 0x25 51#define C1_2 0x25
diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h
index ec1620030..1285cbe1c 100644
--- a/keyboards/ergodox_ez/config.h
+++ b/keyboards/ergodox_ez/config.h
@@ -138,6 +138,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
138//#define NO_ACTION_FUNCTION 138//#define NO_ACTION_FUNCTION
139//#define DEBUG_MATRIX_SCAN_RATE 139//#define DEBUG_MATRIX_SCAN_RATE
140 140
141#define I2C_TIMEOUT 1000
142
143#endif 141#endif
diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c
index 3a2d1273f..65671b38f 100644
--- a/keyboards/ergodox_ez/ergodox_ez.c
+++ b/keyboards/ergodox_ez/ergodox_ez.c
@@ -24,7 +24,7 @@ extern inline void ergodox_led_all_set(uint8_t n);
24 24
25 25
26bool i2c_initialized = 0; 26bool i2c_initialized = 0;
27uint8_t mcp23018_status = 0x20; 27i2c_status_t mcp23018_status = 0x20;
28 28
29void matrix_init_kb(void) { 29void matrix_init_kb(void) {
30 // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md") 30 // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
@@ -125,23 +125,23 @@ uint8_t init_mcp23018(void) {
125 // - unused : input : 1 125 // - unused : input : 1
126 // - input : input : 1 126 // - input : input : 1
127 // - driving : output : 0 127 // - driving : output : 0
128 mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; 128 mcp23018_status = i2c_start(I2C_ADDR_WRITE, 0); if (mcp23018_status) goto out;
129 mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out; 129 mcp23018_status = i2c_write(IODIRA, 0); if (mcp23018_status) goto out;
130 mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; 130 mcp23018_status = i2c_write(0b00000000, 0); if (mcp23018_status) goto out;
131 mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; 131 mcp23018_status = i2c_write(0b00111111, 0); if (mcp23018_status) goto out;
132 i2c_stop(); 132 i2c_stop(0);
133 133
134 // set pull-up 134 // set pull-up
135 // - unused : on : 1 135 // - unused : on : 1
136 // - input : on : 1 136 // - input : on : 1
137 // - driving : off : 0 137 // - driving : off : 0
138 mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; 138 mcp23018_status = i2c_start(I2C_ADDR_WRITE, 0); if (mcp23018_status) goto out;
139 mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out; 139 mcp23018_status = i2c_write(GPPUA, 0); if (mcp23018_status) goto out;
140 mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; 140 mcp23018_status = i2c_write(0b00000000, 0); if (mcp23018_status) goto out;
141 mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; 141 mcp23018_status = i2c_write(0b00111111, 0); if (mcp23018_status) goto out;
142 142
143out: 143out:
144 i2c_stop(); 144 i2c_stop(0);
145 145
146#ifdef LEFT_LEDS 146#ifdef LEFT_LEDS
147 if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update(); 147 if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
@@ -165,22 +165,22 @@ uint8_t ergodox_left_leds_update(void) {
165 // - unused : hi-Z : 1 165 // - unused : hi-Z : 1
166 // - input : hi-Z : 1 166 // - input : hi-Z : 1
167 // - driving : hi-Z : 1 167 // - driving : hi-Z : 1
168 mcp23018_status = i2c_start(I2C_ADDR_WRITE); 168 mcp23018_status = i2c_start(I2C_ADDR_WRITE, 0);
169 if (mcp23018_status) goto out; 169 if (mcp23018_status) goto out;
170 mcp23018_status = i2c_write(OLATA); 170 mcp23018_status = i2c_write(OLATA, 0);
171 if (mcp23018_status) goto out; 171 if (mcp23018_status) goto out;
172 mcp23018_status = i2c_write(0b11111111 172 mcp23018_status = i2c_write(0b11111111
173 & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT) 173 & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT),
174 ); 174 0);
175 if (mcp23018_status) goto out; 175 if (mcp23018_status) goto out;
176 mcp23018_status = i2c_write(0b11111111 176 mcp23018_status = i2c_write(0b11111111
177 & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT) 177 & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
178 & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT) 178 & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT),
179 ); 179 0);
180 if (mcp23018_status) goto out; 180 if (mcp23018_status) goto out;
181 181
182 out: 182 out:
183 i2c_stop(); 183 i2c_stop(0);
184 return mcp23018_status; 184 return mcp23018_status;
185} 185}
186#endif 186#endif
diff --git a/keyboards/ergodox_ez/ergodox_ez.h b/keyboards/ergodox_ez/ergodox_ez.h
index 3ffc32553..9086db2fb 100644
--- a/keyboards/ergodox_ez/ergodox_ez.h
+++ b/keyboards/ergodox_ez/ergodox_ez.h
@@ -23,7 +23,7 @@
23#define OLATA 0x14 // output latch register 23#define OLATA 0x14 // output latch register
24#define OLATB 0x15 24#define OLATB 0x15
25 25
26extern uint8_t mcp23018_status; 26extern i2c_status_t mcp23018_status;
27 27
28void init_ergodox(void); 28void init_ergodox(void);
29void ergodox_blink_all_leds(void); 29void ergodox_blink_all_leds(void);
diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c
index 8b117166f..d8b708a16 100644
--- a/keyboards/ergodox_ez/matrix.c
+++ b/keyboards/ergodox_ez/matrix.c
@@ -295,13 +295,13 @@ static matrix_row_t read_cols(uint8_t row)
295 return 0; 295 return 0;
296 } else { 296 } else {
297 uint8_t data = 0; 297 uint8_t data = 0;
298 mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; 298 mcp23018_status = i2c_start(I2C_ADDR_WRITE, 0); if (mcp23018_status) goto out;
299 mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out; 299 mcp23018_status = i2c_write(GPIOB, 0); if (mcp23018_status) goto out;
300 mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out; 300 mcp23018_status = i2c_start(I2C_ADDR_READ, 0); if (mcp23018_status) goto out;
301 data = i2c_read_nack(); 301 mcp23018_status = i2c_read_nack(0); if (mcp23018_status < 0) goto out;
302 data = ~data; 302 data = ~((uint8_t)mcp23018_status);
303 out: 303 out:
304 i2c_stop(); 304 i2c_stop(0);
305 return data; 305 return data;
306 } 306 }
307 } else { 307 } else {
@@ -350,11 +350,11 @@ static void select_row(uint8_t row)
350 } else { 350 } else {
351 // set active row low : 0 351 // set active row low : 0
352 // set other rows hi-Z : 1 352 // set other rows hi-Z : 1
353 mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; 353 mcp23018_status = i2c_start(I2C_ADDR_WRITE, 0); if (mcp23018_status) goto out;
354 mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out; 354 mcp23018_status = i2c_write(GPIOA, 0); if (mcp23018_status) goto out;
355 mcp23018_status = i2c_write(0xFF & ~(1<<row)); if (mcp23018_status) goto out; 355 mcp23018_status = i2c_write(0xFF & ~(1<<row), 0); if (mcp23018_status) goto out;
356 out: 356 out:
357 i2c_stop(); 357 i2c_stop(0);
358 } 358 }
359 } else { 359 } else {
360 // select on teensy 360 // select on teensy
diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c
index d71283f7c..874573bb2 100644
--- a/quantum/rgb_matrix.c
+++ b/quantum/rgb_matrix.c
@@ -102,13 +102,8 @@ void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led_i, uint8_t
102} 102}
103 103
104void rgb_matrix_update_pwm_buffers(void) { 104void rgb_matrix_update_pwm_buffers(void) {
105 uint8_t ret = IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); 105 IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 );
106 ret |= IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); 106 IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 );
107 if (ret == 2) {
108 wait_ms(1000);
109 i2c_stop();
110 rgb_matrix_setup_drivers();
111 }
112} 107}
113 108
114void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) { 109void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) {