X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Farm%2Fdrv%2Fi2c_lpc2.c;h=a687e1a92c0f7b72bfb0cebbeddea8a96c13a51d;hb=f062d0cd413c738978ac8781da89a12301615754;hp=0a02e4fec7bc03762db76841d3a2c11fbe351065;hpb=4f6668bfce256b0ed442d586d537c2442a4e3d84;p=bertos.git diff --git a/bertos/cpu/arm/drv/i2c_lpc2.c b/bertos/cpu/arm/drv/i2c_lpc2.c index 0a02e4fe..a687e1a9 100644 --- a/bertos/cpu/arm/drv/i2c_lpc2.c +++ b/bertos/cpu/arm/drv/i2c_lpc2.c @@ -50,13 +50,9 @@ #include #include -#include /* vic_handler_t */ #include -#include - - struct I2cHardware { uint32_t base; @@ -84,6 +80,7 @@ struct I2cHardware 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; \ } \ } \ @@ -109,7 +106,7 @@ static void i2c_hw_stop(I2c *i2c) 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); @@ -140,7 +137,7 @@ static void i2c_lpc2_put(I2c *i2c, uint8_t data) } } -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 @@ -262,10 +259,10 @@ static void i2c_lpc2_start(struct I2c *i2c, uint16_t slave_addr) 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[] = @@ -280,6 +277,26 @@ 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, + }, }; /** @@ -290,7 +307,6 @@ void i2c_hw_init(I2c *i2c, int dev, uint32_t clock) i2c->hw = &i2c_lpc2_hw[dev]; i2c->vt = &i2c_lpc_vt; - /* Enable I2C clock */ PCONP |= i2c->hw->pconp; @@ -311,11 +327,10 @@ void i2c_hw_init(I2c *i2c, int dev, uint32_t clock) 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);