/* SPDX-License-Identifier: Apache-2.0 */ /* * Copyright © 2023 Calian Ltd. All rights reserved. * * Driver for the Xilinx AXI IIC Bus Interface. * This is an FPGA logic core as described by Xilinx document PG090. */ #ifndef ZEPHYR_DRIVERS_I2C_I2C_XILINX_AXI_H_ #define ZEPHYR_DRIVERS_I2C_I2C_XILINX_AXI_H_ #include /* Register offsets */ enum xilinx_axi_i2c_register { REG_GIE = 0x01C, /* Global Interrupt Enable */ REG_ISR = 0x020, /* Interrupt Status */ REG_IER = 0x028, /* Interrupt Enable */ REG_SOFTR = 0x040, /* Soft Reset */ REG_CR = 0x100, /* Control */ REG_SR = 0x104, /* Status */ REG_TX_FIFO = 0x108, /* Transmit FIFO */ REG_RX_FIFO = 0x10C, /* Receive FIFO */ REG_ADR = 0x110, /* Target Address */ REG_TX_FIFO_OCY = 0x114, /* Transmit FIFO Occupancy */ REG_RX_FIFO_OCY = 0x118, /* Receive FIFO Occupancy */ REG_TEN_ADR = 0x11C, /* Target Ten Bit Address */ REG_RX_FIFO_PIRQ = 0x120, /* Receive FIFO Programmable Depth Interrupt */ REG_GPO = 0x124, /* General Purpose Output */ REG_TSUSTA = 0x128, /* Timing Parameter */ REG_TSUSTO = 0x12C, /* Timing Parameter */ REG_THDSTA = 0x130, /* Timing Parameter */ REG_TSUDAT = 0x134, /* Timing Parameter */ REG_TBUF = 0x138, /* Timing Parameter */ REG_THIGH = 0x13C, /* Timing Parameter */ REG_TLOW = 0x140, /* Timing Parameter */ REG_THDDAT = 0x144, /* Timing Parameter */ }; /* Register bits */ /* Global Interrupt Enable */ enum xilinx_axi_i2c_gie_bits { GIE_ENABLE = BIT(31), }; /* Interrupt Status/Interrupt Enable */ enum xilinx_axi_i2c_isr_bits { ISR_TX_HALF_EMPTY = BIT(7), /* Transmit FIFO Half Empty */ ISR_NOT_ADDR_TARGET = BIT(6), /* Not Addressed As Target */ ISR_ADDR_TARGET = BIT(5), /* Addressed As Target */ ISR_BUS_NOT_BUSY = BIT(4), /* IIC Bus is Not Busy */ ISR_RX_FIFO_FULL = BIT(3), /* Receive FIFO Full */ ISR_TX_FIFO_EMPTY = BIT(2), /* Transmit FIFO Empty */ ISR_TX_ERR_TARGET_COMP = BIT(1), /* Transmit Error/Target Transmit Complete */ ISR_ARB_LOST = BIT(0), /* Arbitration Lost */ }; /* Soft Reset */ enum xilinx_axi_i2c_softr_vals { SOFTR_KEY = 0xA, }; /* Control */ enum xilinx_axi_i2c_cr_bits { CR_GC_EN = BIT(6), /* General Call Enable */ CR_RSTA = BIT(5), /* Repeated Start */ CR_TXAK = BIT(4), /* Transmit Acknowledge Enable */ CR_TX = BIT(3), /* Transmit/Receive Mode Select */ CR_MSMS = BIT(2), /* Controller/Target Mode Select */ CR_TX_FIFO_RST = BIT(1), /* Transmit FIFO Reset */ CR_EN = BIT(0), /* AXI IIC Enable */ }; /* Status */ enum xilinx_axi_i2c_sr_bits { SR_TX_FIFO_EMPTY = BIT(7), /* Transmit FIFO empty */ SR_RX_FIFO_EMPTY = BIT(6), /* Receive FIFO empty */ SR_RX_FIFO_FULL = BIT(5), /* Receive FIFO full */ SR_TX_FIFO_FULL = BIT(4), /* Transmit FIFO full */ SR_SRW = BIT(3), /* Target Read/Write */ SR_BB = BIT(2), /* Bus Busy */ SR_AAS = BIT(1), /* Addressed As Target */ SR_ABGC = BIT(0), /* Addressed By a General Call */ }; /* TX FIFO */ enum xilinx_axi_i2c_tx_fifo_bits { TX_FIFO_STOP = BIT(9), TX_FIFO_START = BIT(8), }; /* RX FIFO */ enum xilinx_axi_i2c_rx_fifo_bits { RX_FIFO_DATA_MASK = 0xFF, }; /* TX_FIFO_OCY */ enum xilinx_axi_i2c_tx_fifo_ocy_bits { TX_FIFO_OCY_MASK = 0x0F, }; /* RX_FIFO_OCY */ enum xilinx_axi_i2c_rx_fifo_ocy_bits { RX_FIFO_OCY_MASK = 0x0F, }; /* other constants */ enum { /* Size of RX/TX FIFO */ FIFO_SIZE = 16, /* Maximum number of bytes that can be read in dynamic mode */ MAX_DYNAMIC_READ_LEN = 255, }; #endif