@@ -127,8 +127,6 @@ bool rg_i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t value)
127
127
128
128
129
129
#ifdef RG_I2C_GPIO_DRIVER
130
- static bool gpio_initialized = false;
131
- static uint8_t gpio_address = 0x00 ;
132
130
133
131
#if RG_I2C_GPIO_DRIVER == 1 // AW9523
134
132
@@ -164,6 +162,9 @@ static const uint8_t gpio_deinit_sequence[][2] = {};
164
162
165
163
#endif
166
164
165
+ static uint8_t gpio_address = RG_I2C_GPIO_ADDR ;
166
+ static bool gpio_initialized = false;
167
+
167
168
168
169
bool rg_i2c_gpio_init (void )
169
170
{
@@ -173,20 +174,18 @@ bool rg_i2c_gpio_init(void)
173
174
if (!i2c_initialized && !rg_i2c_init ())
174
175
return false;
175
176
176
- gpio_address = RG_I2C_GPIO_ADDR ;
177
- gpio_initialized = true;
178
-
179
177
// Configure extender-specific registers if needed (disable open-drain, interrupts, inversion, etc)
180
178
for (size_t i = 0 ; i < RG_COUNT (gpio_init_sequence ); ++ i )
181
179
rg_i2c_write_byte (gpio_address , gpio_init_sequence [i ][0 ], gpio_init_sequence [i ][1 ]);
182
180
183
181
// Now set all pins of all ports as inputs and clear output latches
184
- for (size_t i = 0 ; i < RG_COUNT (gpio_direction_regs ); ++ i )
185
- rg_i2c_write_byte ( gpio_address , gpio_direction_regs [ i ] , 0xFF );
182
+ for (size_t i = 0 ; i < RG_COUNT (gpio_input_regs ); ++ i )
183
+ rg_i2c_gpio_configure_port ( i , 0xFF , RG_GPIO_INPUT );
186
184
for (size_t i = 0 ; i < RG_COUNT (gpio_output_regs ); ++ i )
187
- rg_i2c_write_byte ( gpio_address , gpio_output_regs [ i ] , 0x00 );
185
+ rg_i2c_gpio_write_port ( i , 0x00 );
188
186
189
187
RG_LOGI ("GPIO Extender ready (driver:%d, addr:0x%02X)." , RG_I2C_GPIO_DRIVER , gpio_address );
188
+ gpio_initialized = true;
190
189
return true;
191
190
}
192
191
@@ -202,11 +201,13 @@ bool rg_i2c_gpio_deinit(void)
202
201
return true;
203
202
}
204
203
205
- bool rg_i2c_gpio_set_direction (int pin , rg_gpio_mode_t mode )
204
+ bool rg_i2c_gpio_configure_port (int port , uint8_t mask , rg_gpio_mode_t mode )
206
205
{
207
- uint8_t reg = gpio_direction_regs [(pin >> 3 ) & 1 ], mask = 1 << (pin & 7 );
208
- uint8_t val = rg_i2c_read_byte (gpio_address , reg );
209
- return rg_i2c_write_byte (gpio_address , reg , mode ? (val | mask ) : (val & ~mask ));
206
+ uint8_t reg = gpio_direction_regs [port & 1 ];
207
+ uint8_t value = rg_i2c_read_byte (gpio_address , reg ) & ~mask ;
208
+ if (mode == RG_GPIO_INPUT )
209
+ value |= mask ;
210
+ return rg_i2c_write_byte (gpio_address , reg , value );
210
211
}
211
212
212
213
uint8_t rg_i2c_gpio_read_port (int port )
@@ -219,6 +220,11 @@ bool rg_i2c_gpio_write_port(int port, uint8_t value)
219
220
return rg_i2c_write_byte (gpio_address , gpio_output_regs [port & 1 ], value );
220
221
}
221
222
223
+ bool rg_i2c_gpio_set_direction (int pin , rg_gpio_mode_t mode )
224
+ {
225
+ return rg_i2c_gpio_configure_port (pin >> 3 , 1 << (pin & 7 ), mode );
226
+ }
227
+
222
228
int rg_i2c_gpio_get_level (int pin )
223
229
{
224
230
return (rg_i2c_gpio_read_port (pin >> 3 ) >> (pin & 7 )) & 1 ;
0 commit comments