#include "action.h" #include "left.h" #include "wait.h" bool i2c_initialized = false; void left_config(void); uint8_t left_write(uint8_t reg, uint8_t data); uint8_t left_read(uint8_t reg, uint8_t *data); uint8_t init_mcp23017(void) { i2c_initialized = false; if (i2c_initialized == 0) { i2c_init(); // on pins D(1,0) _delay_ms(1000); } return 0; } void left_init(void) { init_mcp23017(); left_scan(); #if 0 while (1) { print("wait\n"); wait_us(1000000); } #endif } void left_scan(void) { uint8_t ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT); if (ret == 0) { i2c_stop(); if (!i2c_initialized) { i2c_initialized = true; left_config(); clear_keyboard(); print("mcp23017 attached!!!\n"); } } else { if (i2c_initialized) { i2c_initialized = false; clear_keyboard(); print("mcp23017 deattached!!!\n"); } } return; } uint8_t left_read_cols(void) { uint8_t data = 0; left_read(MCP23017_B0_GPIOA, &data); return data; } void left_unselect_rows(void) { left_write(MCP23017_B0_IODIRB, 0x3F); } void left_select_row(uint8_t row) { left_write(MCP23017_B0_IODIRB, ~(1 << row)); } void left_config(void) { left_write(MCP23017_B0_IODIRA, 0x7F); left_write(MCP23017_B0_IPOLA, 0x7F); left_write(MCP23017_B0_GPPUA, 0x7F); left_write(MCP23017_B0_IODIRB, 0xFF); left_write(MCP23017_B0_GPIOB, 0xC0); } uint8_t left_write(uint8_t reg, uint8_t data) { if (!i2c_initialized) { return 0; } uint8_t ret; ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT); if (ret) goto out; ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT); if (ret) goto out; ret = i2c_write(data, HOTDOX_I2C_TIMEOUT); out: i2c_stop(); return ret; } uint8_t left_read(uint8_t reg, uint8_t *data) { if (!i2c_initialized) { return 0; } uint8_t ret = 0; ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT); if (ret) goto out; ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT); if (ret) goto out; ret = i2c_start(I2C_ADDR_READ, HOTDOX_I2C_TIMEOUT); if (ret) goto out; *data = i2c_read_nack(HOTDOX_I2C_TIMEOUT); out: i2c_stop(); return ret; }