]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/hotdox/left.c
[Keyboard] fixed pins for numpad_5x4 layout (#6311)
[qmk_firmware.git] / keyboards / hotdox / left.c
1 #include "action.h"
2 #include "left.h"
3 #include "wait.h"
4
5 bool i2c_initialized = false;
6
7 void left_config(void);
8 uint8_t left_write(uint8_t reg, uint8_t data);
9 uint8_t left_read(uint8_t reg, uint8_t *data);
10
11 uint8_t init_mcp23017(void)
12 {
13     i2c_initialized = false;
14
15     if (i2c_initialized == 0)
16     {
17         i2c_init();  // on pins D(1,0)
18         _delay_ms(1000);
19     }
20
21     return 0;
22 }
23 void left_init(void)
24 {
25     init_mcp23017();
26     left_scan();
27 #if 0
28     while (1)
29     {
30         print("wait\n");
31         wait_us(1000000);
32     }
33 #endif
34 }
35
36 void left_scan(void)
37 {
38     uint8_t ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT);
39
40     if (ret == 0)
41     {
42         i2c_stop();
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 uint8_t left_write(uint8_t reg, uint8_t data)
95 {
96   if (!i2c_initialized)
97   {
98     return 0;
99   }
100
101   uint8_t ret;
102
103   ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT);     if (ret) goto out;
104   ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT);                if (ret) goto out;
105   ret = i2c_write(data, HOTDOX_I2C_TIMEOUT);
106
107 out:
108   i2c_stop();
109   return ret;
110 }
111
112 uint8_t left_read(uint8_t reg, uint8_t *data)
113 {
114   if (!i2c_initialized)
115   {
116     return 0;
117   }
118
119   uint8_t ret = 0;
120
121   ret = i2c_start(I2C_ADDR_WRITE, HOTDOX_I2C_TIMEOUT);     if (ret) goto out;
122   ret = i2c_write(reg, HOTDOX_I2C_TIMEOUT);                if (ret) goto out;
123   ret = i2c_start(I2C_ADDR_READ, HOTDOX_I2C_TIMEOUT);      if (ret) goto out;
124
125   *data = i2c_read_nack(HOTDOX_I2C_TIMEOUT);
126
127 out:
128   i2c_stop();
129   return ret;
130 }