From 35ba25214fcac43a3ef6faacbb9d6b1fbe49fd96 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Sat, 10 Apr 2021 13:09:33 +0200 Subject: i2c refactor --- fw/fe310/eos/i2c.c | 53 ++++++++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 35 deletions(-) (limited to 'fw/fe310') diff --git a/fw/fe310/eos/i2c.c b/fw/fe310/eos/i2c.c index 72e53ae..122a1b2 100644 --- a/fw/fe310/eos/i2c.c +++ b/fw/fe310/eos/i2c.c @@ -10,20 +10,11 @@ void eos_i2c_start(uint32_t baud_rate) { eos_i2c_set_baud_rate(baud_rate); - - GPIO_REG(GPIO_PULLUP_EN) &= ~(1 << IOF_I2C0_SCL); - GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << IOF_I2C0_SCL); - - GPIO_REG(GPIO_PULLUP_EN) &= ~(1 << IOF_I2C0_SDA); - GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << IOF_I2C0_SDA); - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_I2C0_MASK; GPIO_REG(GPIO_IOF_EN) |= IOF0_I2C0_MASK; } void eos_i2c_stop(void) { - GPIO_REG(GPIO_PULLUP_EN) |= (1 << IOF_I2C0_SCL); - GPIO_REG(GPIO_PULLUP_EN) |= (1 << IOF_I2C0_SDA); GPIO_REG(GPIO_IOF_EN) &= ~IOF0_I2C0_MASK; } @@ -38,70 +29,62 @@ void eos_i2c_set_baud_rate(uint32_t baud_rate) { } -static int i2c_addr(uint8_t addr, uint8_t rw_flag) { - I2C0_REGB(I2C_TRANSMIT) = ((addr & 0x7F) << 1) | (rw_flag & 0x1); - I2C0_REGB(I2C_COMMAND) = I2C_CMD_START | I2C_CMD_WRITE; +static int i2c_read(uint8_t cmd) { + I2C0_REGB(I2C_COMMAND) = I2C_CMD_READ | cmd; while (I2C0_REGB(I2C_STATUS) & I2C_STATUS_TIP); - if (I2C0_REGB(I2C_STATUS) & I2C_STATUS_RXACK) return EOS_ERR; - return EOS_OK; + return I2C0_REGB(I2C_RECEIVE); } -static int i2c_reg(uint8_t reg) { - I2C0_REGB(I2C_TRANSMIT) = reg; - I2C0_REGB(I2C_COMMAND) = I2C_CMD_WRITE; +static int i2c_write(uint8_t cmd, uint8_t b) { + I2C0_REGB(I2C_TRANSMIT) = b; + I2C0_REGB(I2C_COMMAND) = I2C_CMD_WRITE | cmd; while (I2C0_REGB(I2C_STATUS) & I2C_STATUS_TIP); if (I2C0_REGB(I2C_STATUS) & I2C_STATUS_RXACK) return EOS_ERR; return EOS_OK; } +static int i2c_addr(uint8_t addr, uint8_t rw_flag) { + return i2c_write(I2C_CMD_START, ((addr & 0x7F) << 1) | (rw_flag & 0x1)); +} + int eos_i2c_read(uint8_t addr, uint8_t reg, uint8_t *buffer, uint16_t len) { - uint8_t cmd; int rv; int i; rv = i2c_addr(addr, I2C_WRITE); if (rv) return rv; - rv = i2c_reg(reg); + rv = i2c_write(0, reg); if (rv) return rv; rv = i2c_addr(addr, I2C_READ); if (rv) return rv; - cmd = I2C_CMD_READ; - for (i=0; i