- #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;
- }
|