@@ -127,8 +127,6 @@ bool rg_i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t value)
127127
128128
129129#ifdef RG_I2C_GPIO_DRIVER
130- static bool gpio_initialized = false;
131- static uint8_t gpio_address = 0x00 ;
132130
133131#if RG_I2C_GPIO_DRIVER == 1 // AW9523
134132
@@ -164,6 +162,9 @@ static const uint8_t gpio_deinit_sequence[][2] = {};
164162
165163#endif
166164
165+ static uint8_t gpio_address = RG_I2C_GPIO_ADDR ;
166+ static bool gpio_initialized = false;
167+
167168
168169bool rg_i2c_gpio_init (void )
169170{
@@ -173,20 +174,18 @@ bool rg_i2c_gpio_init(void)
173174 if (!i2c_initialized && !rg_i2c_init ())
174175 return false;
175176
176- gpio_address = RG_I2C_GPIO_ADDR ;
177- gpio_initialized = true;
178-
179177 // Configure extender-specific registers if needed (disable open-drain, interrupts, inversion, etc)
180178 for (size_t i = 0 ; i < RG_COUNT (gpio_init_sequence ); ++ i )
181179 rg_i2c_write_byte (gpio_address , gpio_init_sequence [i ][0 ], gpio_init_sequence [i ][1 ]);
182180
183181 // Now set all pins of all ports as inputs and clear output latches
184182 for (size_t i = 0 ; i < RG_COUNT (gpio_direction_regs ); ++ i )
185- rg_i2c_write_byte ( gpio_address , gpio_direction_regs [ i ] , 0xFF );
183+ rg_i2c_gpio_configure_port ( i , 0xFF , RG_GPIO_INPUT );
186184 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 );
188186
189187 RG_LOGI ("GPIO Extender ready (driver:%d, addr:0x%02X)." , RG_I2C_GPIO_DRIVER , gpio_address );
188+ gpio_initialized = true;
190189 return true;
191190}
192191
@@ -202,11 +201,13 @@ bool rg_i2c_gpio_deinit(void)
202201 return true;
203202}
204203
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 )
206205{
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 );
210211}
211212
212213uint8_t rg_i2c_gpio_read_port (int port )
@@ -219,6 +220,11 @@ bool rg_i2c_gpio_write_port(int port, uint8_t value)
219220 return rg_i2c_write_byte (gpio_address , gpio_output_regs [port & 1 ], value );
220221}
221222
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+
222228int rg_i2c_gpio_get_level (int pin )
223229{
224230 return (rg_i2c_gpio_read_port (pin >> 3 ) >> (pin & 7 )) & 1 ;
0 commit comments