mirror of
https://github.com/Keychron/qmk_firmware.git
synced 2024-11-28 11:47:32 +06:00
120 lines
2.0 KiB
C
120 lines
2.0 KiB
C
#include "action.h"
|
|
#include "left.h"
|
|
#include "print.h"
|
|
#include "wait.h"
|
|
|
|
bool i2c_initialized = false;
|
|
|
|
void left_config(void);
|
|
i2c_status_t left_write(uint8_t reg, uint8_t data);
|
|
i2c_status_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)
|
|
{
|
|
|
|
i2c_status_t ret = i2c_ping_address(I2C_ADDR, HOTDOX_I2C_TIMEOUT);
|
|
|
|
if (ret == I2C_STATUS_SUCCESS)
|
|
{
|
|
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);
|
|
}
|
|
|
|
i2c_status_t left_write(uint8_t reg, uint8_t data)
|
|
{
|
|
if (!i2c_initialized)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
i2c_status_t ret;
|
|
|
|
ret = i2c_write_register(I2C_ADDR, reg, &data, sizeof(data), HOTDOX_I2C_TIMEOUT);
|
|
|
|
return ret;
|
|
}
|
|
|
|
i2c_status_t left_read(uint8_t reg, uint8_t *data)
|
|
{
|
|
if (!i2c_initialized)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
i2c_status_t ret = 0;
|
|
ret = i2c_read_register(I2C_ADDR, reg, data, 1, HOTDOX_I2C_TIMEOUT);
|
|
|
|
return ret;
|
|
}
|