1010#endif
1111
1212static bool i2c_initialized = false;
13- static bool gpio_extender_initialized = false;
14- static uint8_t gpio_extender_address = 0x00 ;
1513
1614#define TRY (x ) \
1715 if ((err = (x)) != ESP_OK) \
@@ -127,14 +125,12 @@ bool rg_i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t value)
127125 return rg_i2c_write (addr , reg , & value , 1 );
128126}
129127
130- #if RG_I2C_DRIVER == 1
131128
132- #define AW9523_REG_INPUT0 0x00 ///< Register for reading input values
133- #define AW9523_REG_OUTPUT0 0x02 ///< Register for writing output values
134- #define AW9523_REG_POLARITY0 0x04 ///< Register for polarity inversion of inputs
135- #define AW9523_REG_CONFIG0 0x06 ///< Register for configuring direction
129+ #ifdef RG_I2C_GPIO_DRIVER
130+ static bool gpio_extender_initialized = false;
131+ static uint8_t gpio_extender_address = 0x00 ;
136132
137- #else
133+ #if RG_I2C_GPIO_DRIVER == 1 // AW9523
138134
139135#define AW9523_REG_CHIPID 0x10 ///< Register for hardcode chip ID
140136#define AW9523_REG_SOFTRESET 0x7F ///< Register for soft resetting
@@ -145,6 +141,13 @@ bool rg_i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t value)
145141#define AW9523_REG_GCR 0x11 ///< Register for general configuration
146142#define AW9523_REG_LEDMODE 0x12 ///< Register for configuring const current
147143
144+ #elif RG_I2C_GPIO_DRIVER == 2 // PCF9539
145+
146+ #define AW9523_REG_INPUT0 0x00 ///< Register for reading input values
147+ #define AW9523_REG_OUTPUT0 0x02 ///< Register for writing output values
148+ #define AW9523_REG_POLARITY0 0x04 ///< Register for polarity inversion of inputs
149+ #define AW9523_REG_CONFIG0 0x06 ///< Register for configuring direction
150+
148151#endif
149152
150153
@@ -156,36 +159,45 @@ bool rg_i2c_gpio_init(void)
156159 if (!i2c_initialized && !rg_i2c_init ())
157160 return false;
158161
159- gpio_extender_initialized = true;
160- #if RG_I2C_DRIVER == 1
161- gpio_extender_address = 0x74 ;
162-
163- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_OUTPUT0 , 0xFF );
164- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_OUTPUT0 + 1 , 0xFF );
165- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_POLARITY0 , 0x00 );
166- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_POLARITY0 + 1 , 0x00 );
167- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 , 0xFF );
168- rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 + 1 , 0xFF );
169- #else
170- gpio_extender_address = 0x58 ;
162+ #if RG_I2C_GPIO_DRIVER == 1 // AW9523
171163
164+ gpio_extender_address = RG_I2C_GPIO_ADDR ;
172165 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_SOFTRESET , 0 );
173166 rg_usleep (10 * 1000 );
174-
175167 uint8_t id = rg_i2c_read_byte (gpio_extender_address , AW9523_REG_CHIPID );
176168 if (id != 0x23 )
177169 {
178170 RG_LOGE ("AW9523 invalid ID 0x%x found" , id );
179171 return false;
180172 }
181-
182173 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 , 0xFF );
183174 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 + 1 , 0xFF );
184175 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_LEDMODE , 0xFF );
185176 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_LEDMODE + 1 , 0xFF );
186177 rg_i2c_write_byte (gpio_extender_address , AW9523_REG_GCR , 1 << 4 );
187- #endif
178+
179+ gpio_extender_initialized = true;
188180 return true;
181+
182+ #elif RG_I2C_GPIO_DRIVER == 2 // PCF9539
183+
184+ gpio_extender_address = RG_I2C_GPIO_ADDR ;
185+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_OUTPUT0 , 0xFF );
186+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_OUTPUT0 + 1 , 0xFF );
187+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_POLARITY0 , 0x00 );
188+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_POLARITY0 + 1 , 0x00 );
189+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 , 0xFF );
190+ rg_i2c_write_byte (gpio_extender_address , AW9523_REG_CONFIG0 + 1 , 0xFF );
191+
192+ gpio_extender_initialized = true;
193+ return true;
194+
195+ #else
196+
197+ RG_LOGE ("Unknown driver type" );
198+ return false;
199+
200+ #endif
189201}
190202
191203bool rg_i2c_gpio_deinit (void )
@@ -223,3 +235,4 @@ bool rg_i2c_gpio_set_level(int pin, int level)
223235 uint8_t val = rg_i2c_read_byte (gpio_extender_address , reg );
224236 return rg_i2c_write_byte (gpio_extender_address , reg , level ? (val | mask ) : (val & ~mask ));
225237}
238+ #endif
0 commit comments