Skip to content

Commit d35a386

Browse files
committed
rg_i2c: Added function rg_i2c_gpio_configure_port
1 parent 51e74f6 commit d35a386

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

components/retro-go/rg_i2c.c

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

168169
bool 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

212213
uint8_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+
222228
int rg_i2c_gpio_get_level(int pin)
223229
{
224230
return (rg_i2c_gpio_read_port(pin >> 3) >> (pin & 7)) & 1;

components/retro-go/rg_i2c.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ typedef enum
2323

2424
bool rg_i2c_gpio_init(void);
2525
bool rg_i2c_gpio_deinit(void);
26+
bool rg_i2c_gpio_configure_port(int port, uint8_t mask, rg_gpio_mode_t mode);
27+
uint8_t rg_i2c_gpio_read_port(int port);
28+
bool rg_i2c_gpio_write_port(int port, uint8_t value);
29+
// For the following functions `pin` is calculated as such: (port_num * 8) + port_pin_num
2630
bool rg_i2c_gpio_set_direction(int pin, rg_gpio_mode_t mode);
2731
int rg_i2c_gpio_get_level(int pin);
2832
bool rg_i2c_gpio_set_level(int pin, int level);
29-
uint8_t rg_i2c_gpio_read_port(int port);
30-
bool rg_i2c_gpio_write_port(int port, uint8_t value);

0 commit comments

Comments
 (0)