mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-04 07:12:33 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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;
 | 
						|
}
 |