Refactor mcp23018_status and give possibility to re-attach left side
This commit is contained in:
parent
0a554052b4
commit
33c4f039d1
3 changed files with 40 additions and 20 deletions
|
|
@ -38,6 +38,7 @@ Most used files are located at
|
|||
#include "i2cmaster.h"
|
||||
|
||||
bool i2c_initialized = 0;
|
||||
uint8_t mcp23018_status = 0x20;
|
||||
|
||||
bool ergodox_left_led_1 = 0; // left top
|
||||
bool ergodox_left_led_2 = 0; // left middle
|
||||
|
|
@ -74,7 +75,7 @@ void ergodox_blink_all_leds(void)
|
|||
}
|
||||
|
||||
uint8_t init_mcp23018(void) {
|
||||
uint8_t err = 0x20;
|
||||
mcp23018_status = 0x20;
|
||||
|
||||
// I2C subsystem
|
||||
if (i2c_initialized == 0) {
|
||||
|
|
@ -87,48 +88,50 @@ uint8_t init_mcp23018(void) {
|
|||
// - unused : input : 1
|
||||
// - input : input : 1
|
||||
// - driving : output : 0
|
||||
err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
|
||||
err = i2c_write(IODIRA); if (err) goto out;
|
||||
err = i2c_write(0b00000000); if (err) goto out;
|
||||
err = i2c_write(0b00111111); if (err) goto out;
|
||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
|
||||
i2c_stop();
|
||||
|
||||
// set pull-up
|
||||
// - unused : on : 1
|
||||
// - input : on : 1
|
||||
// - driving : off : 0
|
||||
err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
|
||||
err = i2c_write(GPPUA); if (err) goto out;
|
||||
err = i2c_write(0b00000000); if (err) goto out;
|
||||
err = i2c_write(0b00111111); if (err) goto out;
|
||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
|
||||
|
||||
out:
|
||||
i2c_stop();
|
||||
|
||||
if (!err) err = ergodox_left_leds_update();
|
||||
if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
|
||||
|
||||
return err;
|
||||
return mcp23018_status;
|
||||
}
|
||||
|
||||
uint8_t ergodox_left_leds_update(void) {
|
||||
uint8_t err = 0x20;
|
||||
if (mcp23018_status) { // if there was an error
|
||||
return mcp23018_status;
|
||||
}
|
||||
|
||||
// set logical value (doesn't matter on inputs)
|
||||
// - unused : hi-Z : 1
|
||||
// - input : hi-Z : 1
|
||||
// - driving : hi-Z : 1
|
||||
err = i2c_start(I2C_ADDR_WRITE); if (err) goto out;
|
||||
err = i2c_write(OLATA); if (err) goto out;
|
||||
err = i2c_write(0b11111111
|
||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(OLATA); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b11111111
|
||||
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
|
||||
); if (err) goto out;
|
||||
err = i2c_write(0b11111111
|
||||
); if (mcp23018_status) goto out;
|
||||
mcp23018_status = i2c_write(0b11111111
|
||||
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
|
||||
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
|
||||
); if (err) goto out;
|
||||
); if (mcp23018_status) goto out;
|
||||
|
||||
out:
|
||||
i2c_stop();
|
||||
return err;
|
||||
return mcp23018_status;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ Most used files are located at
|
|||
#define OLATA 0x14 // output latch register
|
||||
#define OLATB 0x15
|
||||
|
||||
extern uint8_t mcp23018_status;
|
||||
|
||||
void init_ergodox(void);
|
||||
void ergodox_blink_all_leds(void);
|
||||
uint8_t init_mcp23018(void);
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ static void init_cols(void);
|
|||
static void unselect_rows();
|
||||
static void select_row(uint8_t row);
|
||||
|
||||
static uint8_t mcp23018_status;
|
||||
static uint8_t mcp23018_reset_loop;
|
||||
|
||||
#ifdef DEBUG_MATRIX_FREQ
|
||||
uint32_t matrix_timer;
|
||||
|
|
@ -89,6 +89,21 @@ void matrix_init(void)
|
|||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
if (mcp23018_status) { // if there was an error
|
||||
if (++mcp23018_reset_loop == 0) {
|
||||
// since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
|
||||
// this will be approx bit more frequent than once per second
|
||||
print("trying to reset mcp23018\n");
|
||||
mcp23018_status = init_mcp23018();
|
||||
if (mcp23018_status) {
|
||||
print("left side not responding\n");
|
||||
} else {
|
||||
print("left side attached\n");
|
||||
ergodox_blink_all_leds();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_MATRIX_FREQ
|
||||
matrix_scan_count++;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue