diff options
author | Jack Humbert <[email protected]> | 2017-08-23 22:29:07 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2017-08-23 22:29:07 -0400 |
commit | d2ff66a985b938e87fffe55c1d9f1dc55e356f91 (patch) | |
tree | 561b3e203033849573a17f5ac6248077ab687676 /keyboards/ergodone/expander.c | |
parent | 7260fc3eef98fb7b0e2ed24d3d0d14cf2e613000 (diff) | |
download | qmk_firmware-d2ff66a985b938e87fffe55c1d9f1dc55e356f91.tar.gz qmk_firmware-d2ff66a985b938e87fffe55c1d9f1dc55e356f91.zip |
Creates a layouts/ folder for keymaps shared between keyboards (#1609)
* include variables and .h files as pp directives
* start layout compilation
* split ergodoxes up
* don't compile all layouts for everything
* might seg fault
* reset layouts variable
* actually reset layouts
* include rules.mk instead
* remove includes from rules.mk
* update variable setting
* load visualizer from path
* adds some more examples
* adds more layouts
* more boards added
* more boards added
* adds documentation for layouts
* use lowercase names for LAYOUT_
* add layout.json files for each layout
* add community folder, default keymaps for layouts
* touch-up default layouts
* touch-up layouts, some keyboard rules.mk
* update documentation for layouts
* fix up serial/i2c switches
Diffstat (limited to 'keyboards/ergodone/expander.c')
-rw-r--r-- | keyboards/ergodone/expander.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/keyboards/ergodone/expander.c b/keyboards/ergodone/expander.c new file mode 100644 index 0000000000..0c8a2289c5 --- /dev/null +++ b/keyboards/ergodone/expander.c @@ -0,0 +1,120 @@ +#include <stdbool.h> +#include "action.h" +#include "i2cmaster.h" +#include "expander.h" +#include "debug.h" + +static uint8_t expander_status = 0; +static uint8_t expander_input = 0; + +void expander_config(void); +uint8_t expander_write(uint8_t reg, uint8_t data); +uint8_t expander_read(uint8_t reg, uint8_t *data); + +void expander_init(void) +{ + i2c_init(); + expander_scan(); +} + +void expander_scan(void) +{ + dprintf("expander status: %d ... ", expander_status); + uint8_t ret = i2c_start(EXPANDER_ADDR | I2C_WRITE); + if (ret == 0) { + i2c_stop(); + if (expander_status == 0) { + dprintf("attached\n"); + expander_status = 1; + expander_config(); + clear_keyboard(); + } + } + else { + if (expander_status == 1) { + dprintf("detached\n"); + expander_status = 0; + clear_keyboard(); + } + } + dprintf("%d\n", expander_status); +} + +void expander_read_cols(void) +{ + expander_read(EXPANDER_REG_GPIOA, &expander_input); +} + +uint8_t expander_get_col(uint8_t col) +{ + if (col > 4) { + col++; + } + return expander_input & (1<<col) ? 1 : 0; +} + +matrix_row_t expander_read_row(void) +{ + expander_read_cols(); + + /* make cols */ + matrix_row_t cols = 0; + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + if (expander_get_col(col)) { + cols |= (1UL << (MATRIX_COLS - 1 - col)); + } + } + + return cols; +} + +void expander_unselect_rows(void) +{ + expander_write(EXPANDER_REG_IODIRB, 0xFF); +} + +void expander_select_row(uint8_t row) +{ + expander_write(EXPANDER_REG_IODIRB, ~(1<<(row+1))); +} + +void expander_config(void) +{ + expander_write(EXPANDER_REG_IPOLA, 0xFF); + expander_write(EXPANDER_REG_GPPUA, 0xFF); + expander_write(EXPANDER_REG_IODIRB, 0xFF); +} + +uint8_t expander_write(uint8_t reg, uint8_t data) +{ + if (expander_status == 0) { + return 0; + } + uint8_t ret; + ret = i2c_start(EXPANDER_ADDR | I2C_WRITE); + if (ret) goto stop; + ret = i2c_write(reg); + if (ret) goto stop; + ret = i2c_write(data); + stop: + i2c_stop(); + return ret; +} + +uint8_t expander_read(uint8_t reg, uint8_t *data) +{ + if (expander_status == 0) { + return 0; + } + uint8_t ret; + ret = i2c_start(EXPANDER_ADDR | I2C_WRITE); + if (ret) goto stop; + ret = i2c_write(reg); + if (ret) goto stop; + ret = i2c_rep_start(EXPANDER_ADDR | I2C_READ); + if (ret) goto stop; + *data = i2c_readNak(); + stop: + i2c_stop(); + return ret; +} |