#include <drv/timer.h>
#include <drv/i2c.h>
-#include <drv/vic_lpc2.h> /* vic_handler_t */
#include <io/lpc23xx.h>
-#include <stdarg.h>
-
-
struct I2cHardware
{
uint32_t base;
if (timer_clock() - start > ms_to_ticks(CONFIG_I2C_START_TIMEOUT)) \
{ \
LOG_ERR("Timeout SI assert\n"); \
+ LOG_ERR("[%08lx]\n", HWREG(i2c->hw->base + I2C_STAT_OFF)); \
break; \
} \
} \
HWREG(i2c->hw->base + I2C_CONCLR_OFF) = BV(I2CON_STAC) | BV(I2CON_SIC) | BV(I2CON_AAC);
}
-static void i2c_lpc2_put(I2c *i2c, uint8_t data)
+static void i2c_lpc2_putc(I2c *i2c, uint8_t data)
{
HWREG(i2c->hw->base + I2C_DAT_OFF) = data;
HWREG(i2c->hw->base + I2C_CONCLR_OFF) = BV(I2CON_SIC);
}
}
-static uint8_t i2c_lpc2_get(I2c *i2c)
+static uint8_t i2c_lpc2_getc(I2c *i2c)
{
/*
* Set ack bit if we want read more byte, otherwise
static const I2cVT i2c_lpc_vt =
{
.start = i2c_lpc2_start,
- .get = i2c_lpc2_get,
- .put = i2c_lpc2_put,
- .send = i2c_swSend,
- .recv = i2c_swRecv,
+ .getc = i2c_lpc2_getc,
+ .putc = i2c_lpc2_putc,
+ .write = i2c_genericWrite,
+ .read = i2c_genericRead,
};
struct I2cHardware i2c_lpc2_hw[] =
.pclk_mask = I2C0_PCLK_MASK,
.pclk_div = I2C0_PCLK_DIV8,
},
+ { /* I2C1 */
+ .base = I2C1_BASE_ADDR,
+ .pconp = BV(PCONP_PCI2C1),
+ .pinsel_port = PINSEL0_OFF,
+ .pinsel = I2C1_PINSEL,
+ .pinsel_mask = I2C1_PINSEL_MASK,
+ .pclksel = PCLKSEL1_OFF,
+ .pclk_mask = I2C1_PCLK_MASK,
+ .pclk_div = I2C1_PCLK_DIV8,
+ },
+ { /* I2C2 */
+ .base = I2C2_BASE_ADDR,
+ .pconp = BV(PCONP_PCI2C2),
+ .pinsel_port = PINSEL0_OFF,
+ .pinsel = I2C2_PINSEL,
+ .pinsel_mask = I2C2_PINSEL_MASK,
+ .pclksel = PCLKSEL1_OFF,
+ .pclk_mask = I2C2_PCLK_MASK,
+ .pclk_div = I2C2_PCLK_DIV8,
+ },
};
/**
i2c->hw = &i2c_lpc2_hw[dev];
i2c->vt = &i2c_lpc_vt;
-
/* Enable I2C clock */
PCONP |= i2c->hw->pconp;
ASSERT(HWREG(i2c->hw->base + I2C_SCLH_OFF) > 4);
ASSERT(HWREG(i2c->hw->base + I2C_SCLL_OFF) > 4);
- /* Assign pins to SCL and SDA (P0_27, P0_28) */
+ /* Assign pins to SCL and SDA */
HWREG(PINSEL_BASE_ADDR + i2c->hw->pinsel_port) &= ~i2c->hw->pinsel_mask;
HWREG(PINSEL_BASE_ADDR + i2c->hw->pinsel_port) |= i2c->hw->pinsel;
-
// Enable I2C
HWREG(i2c->hw->base + I2C_CONSET_OFF) = BV(I2CON_I2EN);