/* * Copyright (c) 2020, Seagate Technology LLC * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_DRIVERS_I2C_I2C_LPC11U6X_H_ #define ZEPHYR_DRIVERS_I2C_I2C_LPC11U6X_H_ #define LPC11U6X_I2C_CONTROL_AA (1 << 2) #define LPC11U6X_I2C_CONTROL_SI (1 << 3) #define LPC11U6X_I2C_CONTROL_STOP (1 << 4) #define LPC11U6X_I2C_CONTROL_START (1 << 5) #define LPC11U6X_I2C_CONTROL_I2C_EN (1 << 6) /* I2C controller states */ #define LPC11U6X_I2C_MASTER_TX_START 0x08 #define LPC11U6X_I2C_MASTER_TX_RESTART 0x10 #define LPC11U6X_I2C_MASTER_TX_ADR_ACK 0x18 #define LPC11U6X_I2C_MASTER_TX_ADR_NACK 0x20 #define LPC11U6X_I2C_MASTER_TX_DAT_ACK 0x28 #define LPC11U6X_I2C_MASTER_TX_DAT_NACK 0x30 #define LPC11U6X_I2C_MASTER_TX_ARB_LOST 0x38 #define LPC11U6X_I2C_MASTER_RX_ADR_ACK 0x40 #define LPC11U6X_I2C_MASTER_RX_ADR_NACK 0x48 #define LPC11U6X_I2C_MASTER_RX_DAT_ACK 0x50 #define LPC11U6X_I2C_MASTER_RX_DAT_NACK 0x58 #define LPC11U6X_I2C_SLAVE_RX_ADR_ACK 0x60 #define LPC11U6X_I2C_SLAVE_RX_ARB_LOST_ADR_ACK 0x68 #define LPC11U6X_I2C_SLAVE_RX_GC_ACK 0x70 #define LPC11U6X_I2C_SLAVE_RX_ARB_LOST_GC_ACK 0x78 #define LPC11U6X_I2C_SLAVE_RX_DAT_ACK 0x80 #define LPC11U6X_I2C_SLAVE_RX_DAT_NACK 0x88 #define LPC11U6X_I2C_SLAVE_RX_GC_DAT_ACK 0x90 #define LPC11U6X_I2C_SLAVE_RX_GC_DAT_NACK 0x98 #define LPC11U6X_I2C_SLAVE_RX_STOP 0xA0 #define LPC11U6X_I2C_SLAVE_TX_ADR_ACK 0xA8 #define LPC11U6X_I2C_SLAVE_TX_ARB_LOST_ADR_ACK 0xB0 #define LPC11U6X_I2C_SLAVE_TX_DAT_ACK 0xB8 #define LPC11U6X_I2C_SLAVE_TX_DAT_NACK 0xC0 #define LPC11U6X_I2C_SLAVE_TX_LAST_BYTE 0xC8 /* Transfer Status */ #define LPC11U6X_I2C_STATUS_BUSY 0x01 #define LPC11U6X_I2C_STATUS_OK 0x02 #define LPC11U6X_I2C_STATUS_FAIL 0x03 #define LPC11U6X_I2C_STATUS_INACTIVE 0x04 struct lpc11u6x_i2c_regs { volatile uint32_t con_set; /* Control set */ volatile const uint32_t stat; /* Status */ volatile uint32_t dat; /* Data */ volatile uint32_t addr0; /* Slave address 0 */ volatile uint32_t sclh; /* SCL Duty Cycle */ volatile uint32_t scll; /* SCL Duty Cycle */ volatile uint32_t con_clr; /* Control clear */ volatile uint32_t mm_ctrl; /* Monitor mode control */ volatile uint32_t addr[3]; /* Slave address {1,2,3} */ volatile const uint32_t data_buffer; /* Data buffer */ volatile uint32_t mask[4]; /* Slave address mask */ }; struct lpc11u6x_i2c_config { struct lpc11u6x_i2c_regs *base; char *clock_drv; char *scl_pinmux_drv; char *sda_pinmux_drv; void (*irq_config_func)(const struct device *dev); uint32_t clkid; uint32_t scl_flags; uint32_t sda_flags; uint8_t scl_pin; uint8_t sda_pin; }; struct lpc11u6x_i2c_current_transfer { struct i2c_msg *msgs; uint8_t *curr_buf; uint8_t curr_len; uint8_t nr_msgs; uint8_t addr; uint8_t status; }; struct lpc11u6x_i2c_data { struct lpc11u6x_i2c_current_transfer transfer; struct i2c_slave_config *slave; struct k_sem completion; struct k_mutex mutex; }; #endif /* ZEPHYR_DRIVERS_I2C_I2C_LPC11U6X_H_ */