@@ -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 
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 );
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