left.c (2055B)
1 #include "action.h" 2 #include "left.h" 3 #include "print.h" 4 #include "wait.h" 5 6 bool i2c_initialized = false; 7 8 void left_config(void); 9 i2c_status_t left_write(uint8_t reg, uint8_t data); 10 i2c_status_t left_read(uint8_t reg, uint8_t *data); 11 12 uint8_t init_mcp23017(void) 13 { 14 i2c_initialized = false; 15 16 if (i2c_initialized == 0) 17 { 18 i2c_init(); // on pins D(1,0) 19 _delay_ms(1000); 20 } 21 22 return 0; 23 } 24 void left_init(void) 25 { 26 init_mcp23017(); 27 left_scan(); 28 #if 0 29 while (1) 30 { 31 print("wait\n"); 32 wait_us(1000000); 33 } 34 #endif 35 } 36 37 void left_scan(void) 38 { 39 40 i2c_status_t ret = i2c_ping_address(I2C_ADDR, HOTDOX_I2C_TIMEOUT); 41 42 if (ret == I2C_STATUS_SUCCESS) 43 { 44 if (!i2c_initialized) 45 { 46 i2c_initialized = true; 47 left_config(); 48 clear_keyboard(); 49 print("mcp23017 attached!!!\n"); 50 } 51 } 52 else 53 { 54 if (i2c_initialized) 55 { 56 i2c_initialized = false; 57 clear_keyboard(); 58 print("mcp23017 deattached!!!\n"); 59 } 60 } 61 62 return; 63 } 64 65 uint8_t left_read_cols(void) 66 { 67 uint8_t data = 0; 68 69 left_read(MCP23017_B0_GPIOA, &data); 70 71 return data; 72 } 73 74 void left_unselect_rows(void) 75 { 76 left_write(MCP23017_B0_IODIRB, 0x3F); 77 } 78 79 void left_select_row(uint8_t row) 80 { 81 left_write(MCP23017_B0_IODIRB, ~(1 << row)); 82 } 83 84 void left_config(void) 85 { 86 left_write(MCP23017_B0_IODIRA, 0x7F); 87 left_write(MCP23017_B0_IPOLA, 0x7F); 88 left_write(MCP23017_B0_GPPUA, 0x7F); 89 90 left_write(MCP23017_B0_IODIRB, 0xFF); 91 left_write(MCP23017_B0_GPIOB, 0xC0); 92 } 93 94 i2c_status_t left_write(uint8_t reg, uint8_t data) 95 { 96 if (!i2c_initialized) 97 { 98 return 0; 99 } 100 101 i2c_status_t ret; 102 103 ret = i2c_write_register(I2C_ADDR, reg, &data, sizeof(data), HOTDOX_I2C_TIMEOUT); 104 105 return ret; 106 } 107 108 i2c_status_t left_read(uint8_t reg, uint8_t *data) 109 { 110 if (!i2c_initialized) 111 { 112 return 0; 113 } 114 115 i2c_status_t ret = 0; 116 ret = i2c_read_register(I2C_ADDR, reg, data, 1, HOTDOX_I2C_TIMEOUT); 117 118 return ret; 119 }