diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/altera-cyclone-v/hwlib/include/alt_i2c.h')
-rw-r--r-- | c/src/lib/libbsp/arm/altera-cyclone-v/hwlib/include/alt_i2c.h | 2024 |
1 files changed, 0 insertions, 2024 deletions
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/hwlib/include/alt_i2c.h b/c/src/lib/libbsp/arm/altera-cyclone-v/hwlib/include/alt_i2c.h deleted file mode 100644 index 7af55cf4ac..0000000000 --- a/c/src/lib/libbsp/arm/altera-cyclone-v/hwlib/include/alt_i2c.h +++ /dev/null @@ -1,2024 +0,0 @@ -/****************************************************************************** -* -* Copyright 2013 Altera Corporation. All Rights Reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* -* 3. The name of the author may not be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR -* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO -* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -* OF SUCH DAMAGE. -* -******************************************************************************/ - -/*! \file - * Altera - I2C Controller API - */ - -#ifndef __ALT_I2C_H__ -#define __ALT_I2C_H__ - -#include "hwlib.h" -#include "alt_clock_manager.h" -#include "socal/alt_i2c.h" -#include "socal/alt_rstmgr.h" -#include "socal/hps.h" -#include "socal/socal.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/******************************************************************************/ -/*! \addtogroup ALT_I2C I2C Controller API - * - * This module defines an API for configuring and managing the HPS I2C controllers. - * - * The I2C controller provides support for a communication link between integrated - * circuits on a board. It is a simple two-wire bus which consists of a serial - * data line (SDA) and a serial clock (SCL) for use in applications such as - * temperature sensors and voltage level translators to EEPROMs, A/D and D/A - * converters, CODECs, and many types of microprocessors. - * - * The Hard Processor System (HPS) provides four I2C controllers to enable system - * software to communicate serially with I2C buses. Each I2C controller can - * operate in master or slave mode, and support standard mode of up to 100 - * kilobits per second (Kbps) or fast mode of up to 400 Kbps. These I2C - * controllers are instances of the Synopsys DesignWare APB I2C (DW_apb_i2c) - * controller. - * - * NOTE: Each I2C controller must be programmed to operate in either master or - * slave mode only. Operating as a master and slave simultaneously is not - * supported. - * - * Features of the I2C Controller: - * * Support both 100 KBps and 400 KBps modes - * * One of the following I2C operations: master or slave - * * Support both 7-bit and 10-bit addressing modes - * * Mixed read and write combined-format transactions - * * Bulk transmit mode - * * DMA handshaking interface - * - * For a complete details on the configuration and operation of I2C controller, - * consult the following references: - * * <em>Cyclone V Device Handbook Volume 3: Hard Processor System Technical - * Reference Manual, Chapter 20. I2C Controller (cv_54020-1.2)</em> - * * <em>Synopsys DesignWare DW_apb_i2c Databook DW_apb_i2c, Version 1.15a</em> - * * <em>The I2C-Bus Specification Version 2.1</em> - * - * @{ - */ - -/******************************************************************************/ -/*! - * This type definition enumerates the operational state of I2C by - * transfer operation. - */ -typedef enum ALT_I2C_TRANSFER_TYPE_e -{ - ALT_I2C_TRANSFER_NONE = 0, /*!< No transfer operation */ - ALT_I2C_TRANSFER_START = 1, /*!< Start detect */ - ALT_I2C_TRANSFER_COMPLETE = 2, /*!< All operations done */ - ALT_I2C_TRANSFER_READ = 3, /*!< Read operation is active */ - ALT_I2C_TRANSFER_WRITE = 4, /*!< Write operation is active */ -} -ALT_I2C_TRANSFER_TYPE_t; - - -/* - * A pointer or handle to the I2C controller device instance. The ALT_I2C_DEV_t is - * initialized by a call to alt_i2c_init() and subsequently used by the other I2C - * controller API functions as a reference to a specific device. - * - * \internal - * ALT_I2C_DEV_t may be a struct or reference to an opaque data - * structure. Whatever "internal" type is suited to the needs of the - * implementation. - * \endinternal - */ -typedef struct ALT_I2C_DEV_s -{ - void * location; /*!< HPS address of I2C instance. */ - alt_freq_t clock_freq; /*!< Input clock frequency. */ - uint32_t last_target; /*!< Last issued target address. */ -} -ALT_I2C_DEV_t; - -/*! - * This type enumerates the HPS I2C controller instances. - */ -typedef enum ALT_I2C_CTLR_e -{ - ALT_I2C_I2C0 = (int)ALT_I2C0_OFST, /*!< I2C0 instance. */ - ALT_I2C_I2C1 = (int)ALT_I2C1_OFST, /*!< I2C1 instance. */ - ALT_I2C_I2C2 = (int)ALT_I2C2_OFST, /*!< I2C2 instance. */ - ALT_I2C_I2C3 = (int)ALT_I2C3_OFST, /*!< I2C3 instance. */ -} ALT_I2C_CTLR_t; - -/*! - * This type enumerates the modes that the I2C controller may operate in. - * - * NOTE: Each I2C controller must be programmed to operate in either master or - * slave mode only. Operating as a master and slave simultaneously is not - * supported. - */ -typedef enum ALT_I2C_MODE_e -{ - ALT_I2C_MODE_SLAVE = ALT_I2C_CON_MST_MOD_E_DIS, /*!< Slave Mode */ - ALT_I2C_MODE_MASTER = ALT_I2C_CON_MST_MOD_E_EN /*!< Master Mode */ -} ALT_I2C_MODE_t; - -/*! - * This type enumerates the I2C controller operational speed modes. - * - * The I2C controller can operate in standard mode (with data rates 0 to 100 Kbps) - * or fast mode (with data rates less than or equal to 400 Kbps). Additionally, - * fast mode devices are downward compatible. For instance, fast mode devices can - * communicate with standard mode devices in 0 to 100 Kbps I2C bus - * system. However, standard mode devices are not upward compatible and should not - * be incorporated in a fast-mode I2C bus system as they cannot follow the higher - * transfer rate and therefore unpredictable states would occur. - * - * This setting is relevant only if one is operating the I2C in master mode. - */ -typedef enum ALT_I2C_SPEED_e -{ - ALT_I2C_SPEED_STANDARD = ALT_I2C_CON_SPEED_E_STANDARD, - /*!< Standard mode (0 to 100 Kbps) */ - ALT_I2C_SPEED_FAST = ALT_I2C_CON_SPEED_E_FAST - /*!< Fast mode (<= 400 Kbps) */ -} ALT_I2C_SPEED_t; - -/*! - * This type enumerates the two addressing modes formats supported by the I2C - * controller. - * - * The I2C controller does not support mixed address format - that is, a 7-bit - * address transaction followed by a 10-bit address transaction or vice versa - - * combined format transactions. - */ -typedef enum ALT_I2C_ADDR_MODE_e -{ - ALT_I2C_ADDR_MODE_7_BIT = ALT_I2C_TAR_IC_10BITADDR_MST_E_START7, - /*!< 7-Bit Address Format */ - ALT_I2C_ADDR_MODE_10_BIT = ALT_I2C_TAR_IC_10BITADDR_MST_E_START10 - /*!< 10-Bit Address Format */ -} ALT_I2C_ADDR_MODE_t; - -/*! - * This type enumerates interrupt status conditions for the I2C controller. - */ -typedef enum ALT_I2C_STATUS_e -{ - ALT_I2C_STATUS_RX_UNDER = 1UL << 0, - /*!< Set if the processor attempts to read the - * receive buffer when it is empty. If the I2C - * controller is disabled, this status keeps - * maintains its state until the master or slave - * state machines go into idle, then this - * interrupt is cleared. - */ - ALT_I2C_STATUS_RX_OVER = 1UL << 1, - /*!< Set if the receive buffer is completely - * filled to capacity and an additional byte is - * received from an external I2C device. The I2C - * controller acknowledges this, but any data - * bytes received after the FIFO is full are - * discarded. If the I2C controller is disabled, - * this status maintains its statue until the - * master or slave state machines go into idle, - * then this interrupt is cleared. - */ - ALT_I2C_STATUS_RX_FULL = 1UL << 2, - /*!< Set when the receive buffer reaches or goes - * above the RX_TL threshold. It is - * automatically cleared by hardware when buffer - * level goes below the threshold. If the I2C - * controller is disabled, the RX FIFO is - * flushed and held in reset; therefore the RX - * FIFO is not full. So this bit is cleared once - * the I2C controller is disabled, regardless of - * the activity that continues. - */ - ALT_I2C_STATUS_TX_OVER = 1UL << 3, - /*!< Set during transmit if the transmit buffer is - * filled to capacity and the processor attempts - * to issue another I2C command. When the I2C - * controller is disabled, this bit maintains - * its state until the master or slave state - * machines go into idle, then this interrupt is - * cleared. - */ - ALT_I2C_STATUS_TX_EMPTY = 1UL << 4, - /*!< This bit is set to 1 when the transmit buffer - * is at or below the configured threshold - * value. It is automatically cleared by - * hardware when the buffer level goes above the - * threshold. When the I2C controller is - * disabled, the TX FIFO is flushed and held in - * reset. The TX FIFO appears as if it has no - * data in it, so this bit is set to 1, provided - * there is activity in the master or slave - * state machines. When there is no longer - * activity, then this bit is set to 0. - * - */ - ALT_I2C_STATUS_RD_REQ = 1UL << 5, - /*!< This bit is set to 1 when I2C is acting as a - * slave and another I2C master is attempting to - * read data from the I2C. The I2C holds the bus - * in a wait state until this interrupt is - * serviced, which means that the slave has been - * addressed by a remote master that is asking - * for data to be transferred. The processor - * must respond to this interrupt and then write - * the requested data. This bit is set to 0 just - * after the processor by calling - * alt_i2c_int_clear() with - * ALT_I2C_STATUS_RD_REQ in the mask.. - */ - ALT_I2C_STATUS_TX_ABORT = 1UL << 6, - /*!< This bit indicates if I2C, as an I2C - * transmitter, is unable to complete the - * intended actions on the contents of the - * transmit FIFO. This situation can occur both - * as an I2C master or an I2C slave, and is - * referred to as a 'transmit abort'. When this - * bit is set to 1, the IC_TX_ABRT_SOURCE - * register indicates the reason why the - * transmit abort takes places. - * - * NOTE: The I2C flushes/resets/empties the TX - * FIFO whenever this bit is set. The TX FIFO - * remains in this flushed state until the - * register alt_i2c_int_clear() with - * ALT_I2C_STATUS_TX_ABORT in the mask is - * called. Once this happens, the TX FIFO is - * then ready to accept more data bytes from the - * APB interface. - */ - ALT_I2C_STATUS_RX_DONE = 1UL << 7, - /*!< When the I2C is acting as a - * slave-transmitter, this bit is set to 1 if - * the master does not acknowledge a transmitted - * byte. This occurs on the last byte of the - * transmission, indicating that the - * transmission is done. - */ - ALT_I2C_STATUS_ACTIVITY = 1UL << 8, - /*!< This bit captures I2C activity and stays set - * until it is cleared. There are four ways to - * clear it: - * * Disabling the I2C controller - * * Calling alt_i2c_int_clear() with - * ALT_I2C_STATUS_ACTIVITY in the mask. - * * Calling alt_i2c_int_clear() with - * ALT_I2C_STATUS_ALL in the mask. - * * System reset - * - * Once this bit is set, it stays set unless one - * of the four methods is used to clear it. Even - * if the I2C module is idle, this bit remains - * set until cleared, indicating that there was - * activity on the bus. - */ - ALT_I2C_STATUS_STOP_DET = 1UL << 9, - /*!< Indicates whether a STOP condition has - * occurred on the I2C interface regardless of - * whether I2C is operating in slave or master - * mode. - */ - ALT_I2C_STATUS_START_DET = 1UL << 10, - /*!< Indicates whether a START or RESTART - * condition has occurred on the I2C interface - * regardless of whether I2C is operating in - * slave or master mode. - */ - ALT_I2C_STATUS_INT_CALL = 1UL << 11, - /*!< Set only when a General Call address is - * received and it is acknowledged. It stays set - * until it is cleared either by disabling I2C - * or when alt_i2c_int_clear() with - * ALT_I2C_STATUS_CALL in the mask is - * called. I2C stores the received data in the - * Rx buffer. - */ - ALT_I2C_STATUS_INT_ALL = 0xFFF, - /*!< All Combined and Individual Interrupts. This - * enumeration value can be used to clear, - * disable, and enable the combined interrupt - * and all individual interrupt status - * conditions. As a side effect, when passed to - * alt_i2c_int_clear(), clears the source causes - * (\ref ALT_I2C_TX_ABORT_CAUSE_t) of the - * ALT_I2C_STATUS_TX_ABORT condition. - */ -} ALT_I2C_STATUS_t; - -/*! - * This type enumerates the source causes of a ALT_I2C_STATUS_TX_ABORT condition. - * - * The active ALT_I2C_TX_ABORT_CAUSE_t source conditions are cleared when - * alt_i2c_int_clear() with is called ALT_I2C_STATUS_TX_ABORT in the mask or - * alt_i2c_int_clear() is called with ALT_I2C_STATUS_ALL in the mask. - * - * \internal - * Discuss special handling of abrt_sbyte_norstrt TX_ABRT source required in ???() function. - * \endinternal - */ -typedef enum ALT_I2C_TX_ABORT_CAUSE_e -{ - ALT_I2C_TX_ABORT_CAUSE_7B_ADDR_NOACK = 1UL << 0, - /*!< Master Abort 7 Bit Address - If set (1), - * Master is in 7-bit addressing mode and the - * address sent was not acknowledged by any - * slave. - * - * Role of I2C: Master-Transmitter or - * Master-Receiver - */ - ALT_I2C_TX_ABORT_CAUSE_10ADDR1_NOACK = 1UL << 1, - /*!< Master Abort 10 Bit Address Byte 1 - If set - * (1), Master is in 10-bit address mode and the - * first 10-bit address byte was not - * acknowledged by any slave. - * - * Role of I2C: Master-Transmitter or - * Master-Receiver - */ - ALT_I2C_TX_ABORT_CAUSE_10ADDR2_NOACK = 1UL << 2, - /*!< Master Abort 10 Bit Address Byte 2 - If set - * (1), Master is in 10-bit address mode and the - * second address byte of the 10-bit address was - * not acknowledged by any slave - * - * Role of I2C: Master-Transmitter or - * Master-Receiver - */ - ALT_I2C_TX_ABORT_CAUSE_TXDATA_NOACK = 1UL << 3, - /*!< Master Abort TX NOACK Bit - If set (1), - * Master has received an acknowledgement for - * the address, but when it sent data byte(s) - * following the address, it did not receive an - * acknowledge from the remote slave(s). This is - * a master-mode only bit. - * - * Role of I2C: Master-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_GCALL_NOACK = 1UL << 4, - /*!< Master Abort GC Noack Bit - If set (1), I2C - * controller in master mode sent a General Call - * and no slave on the bus acknowledged the - * General Call. - * - * Role of I2C: Master-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_GCALL_RD = 1UL << 5, - /*!< Master Abort GC Read Bit - If set (1), I2C - * controller in master mode sent a General Call - * but the user programmed the byte following - * the General Call to be a read from the bus - * (IC_DATA_CMD[9] is set to 1). - * - * Role of I2C: Master-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_HS_ACKDET = 1UL << 6, - /*!< Master HS MC Ack - If set (1), Master is in - * High Speed mode and the High Speed Master - * code was acknowledged (wrong behavior). - * - * Role of I2C: Master. - */ - ALT_I2C_TX_ABORT_CAUSE_SBYTE_ACKDET = 1UL << 7, - /*!< Master Abort START Byte - If set (1), Master - * has sent a START Byte and the START Byte was - * acknowledged (wrong behavior). - * - * Role of I2C: Master. - */ - ALT_I2C_TX_ABORT_CAUSE_HS_NORSTRT = 1UL << 8, - /*!< Master HS Restart Disabled - If set (1), the - * restart is disabled (IC_RESTART_EN bit - * (IC_CON[5]) = 0) and the user is trying to - * use the master to transfer data in High Speed - * mode. - * - * Role of I2C: Master-Transmitter or - * Master-Receiver - */ - ALT_I2C_TX_ABORT_CAUSE_SBYTE_NORSTRT = 1UL << 9, - /*!< Master Abort START No Restart - To clear, the - * source of the ABRT_SBYTE_NORSTRT must be - * fixed first; restart must be enabled - * (IC_CON[5]=1), the SPECIAL bit must be - * cleared (IC_TAR[11]), or the GC_OR_START bit - * must be cleared (IC_TAR[10]). Once the source - * of the ABRT_SBYTE_NORSTRT is fixed, then this - * bit can be cleared in the same manner as - * other bits in this register. If the source of - * the ABRT_SBYTE_NORSTRT is not fixed before - * attempting to clear this bit, bit 9 clears - * for one cycle and then gets re-asserted. - * - * If set (1), the restart is disabled - * (IC_RESTART_EN bit (IC_CON[5]) = 0) and the - * user is trying to send a START Byte. - * - * Role of I2C: Master. - */ - ALT_I2C_TX_ABORT_CAUSE_10B_RD_NORSTRT = 1UL << 10, - /*!< Master Abort 10 Bit No Restart - If set (1), - * the restart is disabled (IC_RESTART_EN bit - * (IC_CON[5]) = 0) and the master sends a read - * command in 10-bit addressing mode. - * - * Role of I2C: Master Receiver. - */ - ALT_I2C_TX_ABORT_CAUSE_MST_DIS = 1UL << 11, - /*!< Master Operation with Master Disabled - If set - * (1), user tries to initiate a Master - * operation with the Master mode disabled. - * - * Role of I2C: Master or Slave-Receiver. - */ - ALT_I2C_TX_ABORT_CAUSE_ARB_LOST = 1UL << 12, - /*!< Master Abort Arbitration Lost - If set (1), - * master has lost arbitration, or if - * IC_TX_ABRT_SOURCE[14] is also set, then the - * slave transmitter has lost arbitration. Note: - * I2C can be both master and slave at the same - * time. - * - * Role of I2C: Master or Slave-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_SLVFLUSH_TXFIFO = 1UL << 13, - /*!< Slave Abort Flush TXFIFO - If set (1), Slave - * has received a read command and some data - * exists in the TX FIFO so the slave issues a - * TX_ABRT interrupt to flush old data in TX - * FIFO. - * - * Role of I2C: Slave-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_SLV_ARBLOST = 1UL << 14, - /*!< Slave Abort Arbitration Lost - If set (1), - * Slave lost the bus while transmitting data to - * a remote master. IC_TX_ABRT_SOURCE[12] is set - * at the same time. - * - * Note: Even though the slave never owns the - * bus, something could go wrong on the - * bus. This is a fail safe check. For instance, - * during a data transmission at the low-to-high - * transition of SCL, if what is on the data bus - * is not what is supposed to be transmitted, - * then DW_apb_i2c no longer own the bus. - * - * Role of I2C: Slave-Transmitter. - */ - ALT_I2C_TX_ABORT_CAUSE_SLVRD_INTX = 1UL << 15 - /*!< Slave Abort Read TX - If set (1), - * when the processor side responds to a - * slave mode request for data to be transmitted - * to a remote master and user writes a 1 in CMD - * (bit 8) of IC_DATA_CMD register. - * - * Role of I2C: Slave-Transmitter. - */ -} ALT_I2C_TX_ABORT_CAUSE_t; - -/*! - * This type defines a structure for configuration of the SCL high and low counts - * to ensure proper I/O timing with the device interface. - * - * The SCL count values are only relevant if the I2C controller is enabled to as - * an I2C master. The SCL count values are ignored when the I2C controller is - * enabled as an I2C slave. - * - * See: Clock Frequency Configuration section of <em>Chapter 20. I2C - * Controller</em> in the <em>Cyclone V Device Handbook Volume 3: Hard - * Processor System Technical Reference Manual</em> for a complete discussion - * of calculation of the proper SCL clock high and low times. - */ -typedef struct ALT_I2C_MASTER_CONFIG_s -{ - ALT_I2C_ADDR_MODE_t addr_mode; - /*!< The address mode (7 or 10 bit) when - * acting as a master. - */ - bool restart_enable; - /*!< This setting determines whether RESTART - * conditions may be sent when acting as a - * master. When the \e restart_enable is - * false, the I2C controller master is - * incapable of performing the following - * functions: - * * Sending a START BYTE - * * Performing any high-speed mode - * operation - * * Performing direction changes in - * combined format mode - * * Performing a read operation with a - * 10-bit address - */ - ALT_I2C_SPEED_t speed_mode; - /*!< The speed mode of the I2C operation. - */ - uint16_t ss_scl_hcnt; - /*!< The SCL clock high-period count for - * standard speed. - */ - uint16_t ss_scl_lcnt; - /*!< The SCL clock low-period count for - * standard speed. - */ - uint16_t fs_scl_hcnt; - /*!< The SCL clock high-period count for fast - * speed. - */ - uint16_t fs_scl_lcnt; - /*!< The SCL clock low-period count for fast - * speed. - */ - uint8_t fs_spklen; - /*!< The duration, measured in ic_clk cycles, - * of the longest spike that is filtered out - * by the spike suppression logic when the - * component is operating in SS or FS modes. - */ -} ALT_I2C_MASTER_CONFIG_t; - -/*! - * This type defines a structure for configuration of the I2C controller when it - * is operating in slave mode. - */ -typedef struct ALT_I2C_SLAVE_CONFIG_s -{ - ALT_I2C_ADDR_MODE_t addr_mode; /*!< The address mode (7 or 10 bit) when - * acting as a slave. - */ - uint32_t addr; /*!< The slave address to which the I2C - * controller responds when acting as a - * slave. - */ - bool nack_enable; /*!< Enable generation of a NACK. when the - * I2C controller is a - * slave-receiver. If \b true, it can - * only generate a NACK after a data - * byte is received; hence, the data - * transfer is aborted and the data - * received is not pushed onto the - * receive buffer. When \b false, it - * generates NACK/ACK, depending on - * normal criteria. - * * \b true = generate NACK after data - * byte received - * * \b false = generate NACK/ACK normally - */ -} ALT_I2C_SLAVE_CONFIG_t; - -/*! - * Initialize the specified I2C controller instance for use and return a device - * handle referencing it. - * - * \param i2c - * The HPS I2C controller instance to initialize. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * Initialization process: - * * Initialize internal driver state - * * Check clock setup (ALT_CLK_L4_SP) - * * Take I2C instance out of reset (System Manager) - * * Disable and clear all interrupts and status conditions - * * Setup and initialize any expected initial I2C controller state - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_init(const ALT_I2C_CTLR_t i2c, ALT_I2C_DEV_t *i2c_dev); - -/*! - * Reset the specified I2C controller instance for use. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * Reset process: - * * Disable controller - * * Initialize internal driver state - * * Check clock setup (ALT_CLK_L4_SP) - * * Take I2C instance out of reset (System Manager) - * * Disable and clear all interrupts and status conditions - * * Setup and initialize any expected initial I2C controller state - * * Enable controller - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_reset(ALT_I2C_DEV_t * i2c_dev); - -/*! - * Uninitialize the I2C controller referenced by the \e i2c_dev handle. - * - * This function attempts to gracefully shutdown the I2C controller by waiting for - * any inpcomplete transactions to finish and then putting the I2C controller into - * reset. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_uninit(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Disables the I2C controller. - * - * When the I2C controller is disabled, the following occurs: - * * The TX FIFO and RX FIFO get flushed. - * * The I2C interrupt status conditions remain active until the I2C controller - * goes into IDLE state. - * - * If the controller is transmitting, it stops as well as deletes the contents of - * the transmit buffer after the current transfer is complete. If the module is - * receiving, the controller stops the current transfer at the end of the current - * byte and does not acknowledge the transfer. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ENABLE.ENABLE = 0 - * Follow the procedure in section 3.8.3 Disabling DW_apb_i2c of the DW Databook. - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_disable(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Enables the I2C controller. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ENABLE.ENABLE = 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_enable(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns ALT_E_TRUE if the I2C controller is enabled. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ENABLE.ENABLE == 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_is_enabled(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Gets the current configuration of the I2C controller when operating in master - * mode. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * [out] Pointer to a ALT_I2C_MASTER_CONFIG_t structure for holding - * the returned I2C master mode configuration parameters. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_config_get(ALT_I2C_DEV_t *i2c_dev, - ALT_I2C_MASTER_CONFIG_t* cfg); - -/*! - * Sets the configuration of the I2C controller with operational parameters for - * operating in master mode. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * Pointer to a ALT_I2C_MASTER_CONFIG_t structure holding the desired - * I2C master mode operational parameters. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_config_set(ALT_I2C_DEV_t *i2c_dev, - const ALT_I2C_MASTER_CONFIG_t* cfg); - -/*! - * This is a utility function that returns the speed based on parameters of the - * I2C master configuration. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * A pointer to the master confugurations. - * - * \param speed_in_hz - * [out] Speed (Hz) of the I2C bus currently configured at. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - */ -ALT_STATUS_CODE alt_i2c_master_config_speed_get(ALT_I2C_DEV_t *i2c_dev, - const ALT_I2C_MASTER_CONFIG_t* cfg, - uint32_t * speed_in_hz); - -/*! - * This is a utility function that computes parameters for the I2C master - * configuration that best matches the speed requested. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * A pointer to the master confugurations. - * - * \param speed_in_hz - * Speed (Hz) of the I2C bus to configure. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_config_speed_set(ALT_I2C_DEV_t *i2c_dev, - ALT_I2C_MASTER_CONFIG_t * cfg, - uint32_t speed_in_hz); - -/*! - * Definition included for backwards compatibility. - */ -#define alt_i2c_cfg_to_speed(i2c_dev, speed_in_hz, cfg) alt_i2c_master_config_speed_get((i2c_dev), (cfg), (speed_in_hz)) - -/*! - * Definition included for backwards compatibility. - */ -#define alt_i2c_speed_to_cfg(i2c_dev, speed_in_hz, cfg) alt_i2c_master_config_speed_set((i2c_dev), (cfg), (speed_in_hz)) - -/*! - * Gets the current configuration of the I2C controller when operating in slave - * mode. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * [out] Pointer to a ALT_I2C_SLAVE_CONFIG_t structure for holding - * the returned I2C slave mode configuration parameters. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_slave_config_get(ALT_I2C_DEV_t *i2c_dev, - ALT_I2C_SLAVE_CONFIG_t* cfg); - -/*! - * Sets the configuration of the I2C controller with operational parameters for - * operating in slave mode. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cfg - * Pointer to a ALT_I2C_SLAVE_CONFIG_t structure holding the desired - * I2C slave mode operational parameters. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_slave_config_set(ALT_I2C_DEV_t *i2c_dev, - const ALT_I2C_SLAVE_CONFIG_t* cfg); - -/*! \addtogroup ALT_I2C_SDA_HOLD SDA Hold Time Configuration - * - * The I2C protocol specification requires 300ns of hold time on the SDA signal in - * standard and fast speed modes. Board delays on the SCL and SDA signals can mean - * that the hold-time requirement is met at the I2C master, but not at the I2C - * slave (or vice-versa). Because each system may encounter differing board signal - * delays, the I2C controller provides the capability to adjust of the SDA - * hold-time. - * - * The functions in this section provide software configuration of SDA hold time - * for the I2C controller. - * - * @{ - */ - -/*! - * Gets the currently configured value for the SDA hold time in I2C controller - * clock (\ref ALT_CLK_L4_SP) clock ticks. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param hold_time - * [out] The configured SDA hold time in \ref ALT_CLK_L4_SP clock - * ticks. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_sda_hold_time_get(ALT_I2C_DEV_t *i2c_dev, - uint16_t *hold_time); - -/*! - * Sets the configured value for the SDA hold time in terms of I2C controller - * clock (\ref ALT_CLK_L4_SP) clock ticks. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param hold_time - * The SDA hold time in \ref ALT_CLK_L4_SP clock ticks. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_SDA_HOLD is 16 bits wide. hold_time must be in range 0..65535. - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_sda_hold_time_set(ALT_I2C_DEV_t *i2c_dev, - const uint16_t hold_time); - -/*! @} */ - -/*! - * Gets the current operational mode of the I2C controller. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param mode - * [out] The current operational mode enabled for the I2C - * controller. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_op_mode_get(ALT_I2C_DEV_t *i2c_dev, - ALT_I2C_MODE_t* mode); - -/*! - * Sets the operational mode of the I2C controller. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param mode - * The operational mode to enable for the I2C controller. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_op_mode_set(ALT_I2C_DEV_t *i2c_dev, - const ALT_I2C_MODE_t mode); - -/*! - * Returns ALT_E_TRUE if the I2C controller is busy. The I2C controller is busy if - * either the Slave Finite State Machine (FSM) is not in the IDLE state or the - * Master Finite State Machine (FSM) is not in the IDLE state. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_STATUS.ACTIVITY == 1 - * NOTE: IC_STATUS[0] that is, the ACTIVITY bit is the OR of SLV_ACTIVITY and - * MST_ACTIVITY bits. - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_is_busy(ALT_I2C_DEV_t *i2c_dev); - -/*! - * This function reads a single data byte from the receive FIFO. - * - * This function is used to perform low level access to the data bytes - * received by the I2C controller and buffered in the receive FIFO. It - * may be used by master-receivers or slave receivers. - * - * This function does not check for valid data in the receive FIFO - * beforehand and may cause an underflow if improperly used. It is - * meant to be called from a context where preconditions have been - * previously asserted such as in the implementation of the - * alt_i2c_slave_receive() or alt_i2c_master_receive() function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param val - * [out] The single data byte read from the receive FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_read(ALT_I2C_DEV_t *i2c_dev, uint8_t *val); - -/*! - * This function writes a single data byte to the transmit FIFO. - * - * This function is used to perform low level writes of data to the - * transmit FIFO for transmission by the I2C controller. It may be - * used by slave receivers. - * - * This function does not check whether the transmit FIFO is full or - * not beforehand and may cause an overflow if improperly used. It is - * meant to be called from a context where preconditions have been - * previously asserted such as in the implementation of the - * alt_i2c_slave_transmit() function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param val - * The data byte to write to the transmission FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_write(ALT_I2C_DEV_t *i2c_dev, const uint8_t val); - -/*! - * This function acts in the role of a slave-receiver by receiving a single data - * byte from the I2C bus in response to a write command from the master. - * - * This API is suitable for being called during an interrupt context. It is the - * programmer's responsibility to ensure that there is data in the RX FIFO to - * accomodate the request made. - * - * The I2C controller must be in slave mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * [out] A pointer to a buffer to contain the received data byte. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_slave_receive(ALT_I2C_DEV_t *i2c_dev, - uint8_t *data); - -/*! - * This function acts in the role of a slave-transmitter by transmitting a single - * data byte to the I2C bus in response to a read request from the master. - * - * This API is suitable for being called during an interrupt context. It is the - * programmer's responsibility to ensure that there is enough space in the TX - * FIFO to accomodate the request made. - * - * The I2C controller must be in slave mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * The data byte to transmit. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_slave_transmit(ALT_I2C_DEV_t *i2c_dev, - const uint8_t data); - -/*! - * This function acts in the role of a slave-transmitter by transmitting data in - * bulk to the I2C bus in response to a series of read requests from a master. - * - * In the standard I2C protocol, all transactions are single byte transactions and - * the slave responds to a remote master read request by writing one byte into the - * slave's TX FIFO. When a slave (slave-transmitter) is issued with a read request - * from the remote master (master-receiver), at a minimum there should be at least - * one entry placed into the slave-transmitter's TX FIFO. The I2C controller is - * capable of handling more data in the TX FIFO so that subsequent read requests - * can receive that data without raising an interrupt or software having to poll - * to request more data. This eliminates overhead latencies from being incurred by - * servicing the interrupt or polling for data requests each time had there been a - * restriction of having only one entry placed in the TX FIFO. - * - * If the remote master acknowledges the data sent by the slave-transmitter and - * there is no data in the slave's TX FIFO, the I2C controller raises the read - * request interrupt and waits for data to be written into the TX FIFO before it - * can be sent to the remote master. - * - * If the programmer knows in advance that the master is requesting a packet of \e - * n bytes, then when another master request for data is received, the TX FIFO - * could be written with \e n number bytes and the master receives it as a - * continuous stream of data. For example, the slave continues to send data to the - * master as long as the master is acknowledging the data sent and there is data - * available in the TX FIFO. There is no need to hold the SCL line low or to issue - * READ request again. - * - * If the remote master is to receive \e n bytes from the slave but the programmer - * wrote a number of bytes larger than \e n to the TX FIFO, then when the slave - * finishes sending the requested \e n bytes, it clears the TX FIFO and ignores - * any excess bytes. - * - * This API is suitable for being called during an interrupt context. It is the - * programmer's responsibility to ensure that there is enough space in the TX - * FIFO to accomodate the request made. - * - * The I2C controller must be in slave mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * A pointer to the data buffer to transmit. - * - * \param size - * The size of the data buffer in bytes to place in the TX FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * See: Section <em>Slave-Transfer Operation for Bulk Transfers</em> of the DW - * Databook for details of implementation and error conditions that may occur. - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_slave_bulk_transmit(ALT_I2C_DEV_t *i2c_dev, - const void * data, - const size_t size); - -/*! - * This function returns the current target address. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param target_addr - * [out] The 7 or 10 bit slave target address. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code. - */ -ALT_STATUS_CODE alt_i2c_master_target_get(ALT_I2C_DEV_t * i2c_dev, uint32_t * target_addr); - -/*! - * This function updates the target slave address for any upcoming I2C bus IO. - * - * This API is not suitlabe for being called in an interrupt context as it - * will wait for the TX FIFO to flush before applying the changes. If the TX - * FIFO is known to be empty and the controller idle, then it can be safely - * called. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param target_addr - * The 7 or 10 bit slave target address. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code. - */ -ALT_STATUS_CODE alt_i2c_master_target_set(ALT_I2C_DEV_t * i2c_dev, uint32_t target_addr); - -/*! - * This function acts in the role of a master-transmitter by issuing a write - * command and transmitting data to the I2C bus. - * - * This API is not suitable for being called in an interrupt context as it may - * wait for certain controller states before completing. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * A pointer to a data buffer to transmit - * - * \param size - * The size of the data buffer in bytes to place in the TX FIFO. - * - * \param issue_restart - * This parameter controls whether a RESTART is issued before the - * byte is sent or received. If: - * * \b true - if \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued before the data is sent/received - * (according to the value of CMD), regardless of whether or not - * the transfer direction is changing from the previous command; if - * \e restart_enabled is \b false, a STOP followed by a START is - * issued instead. - * * \b false - If \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued only if the transfer direction - * is changing from the previous command; if \e restart_enabled is - * \b false, a STOP followed by a START is issued instead. - * - * \param issue_stop - * This parameter controls whether a STOP is issued after the byte is - * sent or received. If: - * * \b true - STOP is issued after this byte, regardless of whether or - * not the Tx FIFO is empty. If the Tx FIFO is not empty, the - * master immediately tries to start a new transfer by issuing a - * START and arbitrating for the bus. - * * \b false - STOP is not issued after this byte, regardless of - * whether or not the Tx FIFO is empty. If the Tx FIFO is not - * empty, the master continues the current transfer by - * sending/receiving data bytes according to the value of the CMD - * bit. If the Tx FIFO is empty, the master holds the SCL line low - * and stalls the bus until a new command is available in the Tx - * FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_transmit(ALT_I2C_DEV_t *i2c_dev, - const void * data, - const size_t size, - const bool issue_restart, - const bool issue_stop); - -/*! - * This function acts in the role of a master-receiver by receiving one or more - * data bytes transmitted from a slave in response to read requests issued from - * this master. - * - * This function causes the master to issue the required number of read requests - * to the slave and read the received data bytes from the Rx FIFO. - * - * The \e issue_restart and \e issue_stop parameters apply to the final read - * request transaction in the \e num_data_entries sequence required to fulfill the - * aggregate receive request. - * - * This API is not suitable for being called in an interrupt context as it may - * wait for certain controller states before completing. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * [out] The data buffer to receive the requested \e size bytes. - * - * \param size - * The size of the data buffer to read from the RX FIFO. - * - * \param issue_restart - * This parameter controls whether a RESTART is issued before the - * byte is sent or received. If: - * * \b true - if \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued before the data is sent/received - * (according to the value of CMD), regardless of whether or not - * the transfer direction is changing from the previous command; if - * \e restart_enabled is \b false, a STOP followed by a START is - * issued instead. - * * \b false - If \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued only if the transfer direction - * is changing from the previous command; if \e restart_enabled is - * \b false, a STOP followed by a START is issued instead. - * - * \param issue_stop - * This parameter controls whether a STOP is issued after the byte is - * sent or received. If: - * * \b true - STOP is issued after this byte, regardless of whether or - * not the Tx FIFO is empty. If the Tx FIFO is not empty, the - * master immediately tries to start a new transfer by issuing a - * START and arbitrating for the bus. - * * \b false - STOP is not issued after this byte, regardless of - * whether or not the Tx FIFO is empty. If the Tx FIFO is not - * empty, the master continues the current transfer by - * sending/receiving data bytes according to the value of the CMD - * bit. If the Tx FIFO is empty, the master holds the SCL line low - * and stalls the bus until a new command is available in the Tx - * FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_receive(ALT_I2C_DEV_t *i2c_dev, - void * data, - const size_t size, - const bool issue_restart, - const bool issue_stop); - -/*! - * This function causes the I2C controller master to issue a READ request on the - * bus. This function is typically used during master-receiver transfers. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param issue_restart - * This parameter controls whether a RESTART is issued before the - * byte is sent or received. If: - * * \b true - if \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued before the data is sent/received - * (according to the value of CMD), regardless of whether or not - * the transfer direction is changing from the previous command; if - * \e restart_enabled is \b false, a STOP followed by a START is - * issued instead. - * * \b false - If \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued only if the transfer direction - * is changing from the previous command; if \e restart_enabled is - * \b false, a STOP followed by a START is issued instead. - * - * \param issue_stop - * This parameter controls whether a STOP is issued after the byte is - * sent or received. If: - * * \b true - STOP is issued after this byte, regardless of whether or - * not the Tx FIFO is empty. If the Tx FIFO is not empty, the - * master immediately tries to start a new transfer by issuing a - * START and arbitrating for the bus. - * * \b false - STOP is not issued after this byte, regardless of - * whether or not the Tx FIFO is empty. If the Tx FIFO is not - * empty, the master continues the current transfer by - * sending/receiving data bytes according to the value of the CMD - * bit. If the Tx FIFO is empty, the master holds the SCL line low - * and stalls the bus until a new command is available in the Tx - * FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * Write IC_DATA_CMD.CMD = 1 (read request). IC_DATA_CMD.DAT is - * written with "don't care" values as these bits are ignored by the - * I2C controller . - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_issue_read(ALT_I2C_DEV_t *i2c_dev, - const bool issue_restart, - const bool issue_stop); - -/*! - * This function causes the I2C controller master to issue a send byte on the - * bus. This function is typically used during master-transmitter/slave-transmitter - * transfers. - * - * The I2C controller must be in master mode before calling this function. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param value - * The data item to be transmitted. - * - * \param issue_restart - * This parameter controls whether a RESTART is issued before the - * byte is sent or received. If: - * * \b true - if \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued before the data is sent/received - * (according to the value of CMD), regardless of whether or not - * the transfer direction is changing from the previous command; if - * \e restart_enabled is \b false, a STOP followed by a START is - * issued instead. - * * \b false - If \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued only if the transfer direction - * is changing from the previous command; if \e restart_enabled is - * \b false, a STOP followed by a START is issued instead. - * - * \param issue_stop - * This parameter controls whether a STOP is issued after the byte is - * sent or received. If: - * * \b true - STOP is issued after this byte, regardless of whether or - * not the Tx FIFO is empty. If the Tx FIFO is not empty, the - * master immediately tries to start a new transfer by issuing a - * START and arbitrating for the bus. - * * \b false - STOP is not issued after this byte, regardless of - * whether or not the Tx FIFO is empty. If the Tx FIFO is not - * empty, the master continues the current transfer by - * sending/receiving data bytes according to the value of the CMD - * bit. If the Tx FIFO is empty, the master holds the SCL line low - * and stalls the bus until a new command is available in the Tx - * FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * Write IC_DATA_CMD.CMD = 0 (write request). - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_issue_write(ALT_I2C_DEV_t *i2c_dev, - const uint8_t value, - const bool issue_restart, - const bool issue_stop); - -/******************************************************************************/ -/*! \addtogroup ALT_I2C_GEN_CALL General Call - * - * The functions in this group support General Call addresses. - * - * The general call address is for addressing every device connected to the I2C - * bus at the same time. However, if a device does not need any of the data - * supplied within the general call structure, it can ignore this address by not - * issuing an acknowledgment. If a device does require data from a general call - * address, it acknowledges this address and behaves as a slave-receiver. The - * master does not actually know how many devices acknowledged if one or more - * devices respond. The second and following bytes are acknowledged by every - * slave-receiver capable of handling this data. A slave who cannot process one of - * these bytes must ignore it by not-acknowledging. If one or more slaves - * acknowledge, the not-acknowledge will not be seen by the master. - * - * The functions in this group do not provide any general call functional command - * interpretation or implementation (e.g. software reset). - * - * @{ - */ - -/*! - * This function acts in the role of a master-transmitter by issuing a general - * call command to all devices connected to the I2C bus. - * - * The \e issue_restart and \e issue_stop parameters apply to the final write - * transaction in the \e num_data_entries byte transmission sequence. - * - * The I2C controller must be in master mode before calling this function. - * - * The target slave address will be modified by this function. Call - * alt_i2c_master_target_set() to reset the slave target address for - * subsequent IO. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param data - * An array of data byte(s) to transmit. - * - * \param num_data_entries - * The number of entries (bytes) in \e data to place in the TX FIFO. - * - * \param issue_restart - * This parameter controls whether a RESTART is issued before the - * byte is sent or received. If: - * * \b true - if \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued before the data is sent/received - * (according to the value of CMD), regardless of whether or not - * the transfer direction is changing from the previous command; if - * \e restart_enabled is \b false, a STOP followed by a START is - * issued instead. - * * \b false - If \e restart_enabled in \ref ALT_I2C_MASTER_CONFIG_t - * is \b true, a RESTART is issued only if the transfer direction - * is changing from the previous command; if \e restart_enabled is - * \b false, a STOP followed by a START is issued instead. - * - * \param issue_stop - * This parameter controls whether a STOP is issued after the byte is - * sent or received. If: - * * \b true - STOP is issued after this byte, regardless of whether or - * not the Tx FIFO is empty. If the Tx FIFO is not empty, the - * master immediately tries to start a new transfer by issuing a - * START and arbitrating for the bus. - * * \b false - STOP is not issued after this byte, regardless of - * whether or not the Tx FIFO is empty. If the Tx FIFO is not - * empty, the master continues the current transfer by - * sending/receiving data bytes according to the value of the CMD - * bit. If the Tx FIFO is empty, the master holds the SCL line low - * and stalls the bus until a new command is available in the Tx - * FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_master_general_call(ALT_I2C_DEV_t *i2c_dev, - const void * data, - const size_t size, - const bool issue_restart, - const bool issue_stop); - -/*! - * Disables the I2C controller from responding to a General Call address. The - * controller will respond with a NACK and no General Call status conditions or - * interrupts are generated. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ACK_GENERAL_CALL.ACK_GEN_CALL = 0 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_general_call_ack_disable(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Enables the I2C controller to respond with an ACK when it receives a General - * Call address. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ACK_GENERAL_CALL.ACK_GEN_CALL = 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_general_call_ack_enable(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns ALT_E_TRUE if the I2C controller is enabled to respond to General Call - * addresses. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_ACK_GENERAL_CALL.ACK_GEN_CALL == 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_general_call_ack_is_enabled(ALT_I2C_DEV_t *i2c_dev); - -/*! @} */ - -/******************************************************************************/ -/*! \addtogroup ALT_I2C_INT Interrupt and Status Conditions - * - * The functions in this group provide management for the I2C controller status - * conditions and interrupts. - * - * Each I2C controller has a single combined interrupt output (\b - * ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ). The following events can generate an - * interrupt: - * * General Call Address Received - * * Start or Restart Condition Occurred - * * Stop Condition Occurred - * * I2C Controller Activity - * * Receive Done - * * Transmit Abort - * * Read Request - * * Transmit Buffer Empty - * * Transmit Overflow - * * Receive Buffer Full - * * Receive Overflow - * * Receive Underflow - * - * These interrupt status conditions may be monitored either by polling their - * status or by configuring interrupt handlers using the HWLIB Interrupt - * Controller API. - * - * Functions to get the current status, enable or disable (i.e. mass or unmask), - * and clear interrupt status conditions for the I2C controller are defined in - * this section. - * - * @{ - */ - -/*! - * Returns the current I2C controller interrupt status conditions. - * - * This function returns the current value of the I2C controller interrupt status - * register value which reflects the current I2C controller status conditions that - * are not disabled (i.e. masked). - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param status - * [out] A pointer to a bit mask of the active \ref ALT_I2C_STATUS_t - * interrupt and status conditions. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_INTR_STAT - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_int_status_get(ALT_I2C_DEV_t *i2c_dev, - uint32_t *status); - -/*! - * Returns the I2C controller raw interrupt status conditions irrespective of - * the interrupt status condition enablement state. - * - * This function returns the current value of the I2C controller raw interrupt - * status register value which reflects the current I2C controller status - * conditions regardless of whether they are disabled (i.e. masked) or not. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param status - * [out] A pointer to a bit mask of the active \ref ALT_I2C_STATUS_t - * interrupt and status conditions. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_INTR_STAT - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_int_raw_status_get(ALT_I2C_DEV_t *i2c_dev, - uint32_t *status); - -/*! - * Clears the specified I2C controller interrupt status conditions identified - * in the mask. - * - * This function clears one or more of the status conditions as contributors to - * the \b ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ interrupt signal state. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param mask - * Specifies the QSPI interrupt status conditions to clear. \e mask - * is a mask of logically OR'ed \ref ALT_I2C_STATUS_t values that - * designate the status conditions to clear. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_int_clear(ALT_I2C_DEV_t *i2c_dev, const uint32_t mask); - -/*! - * Disable the specified I2C controller interrupt status conditions identified in - * the mask. - * - * This function disables one or more of the status conditions as contributors to - * the \b ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ interrupt signal state. - * - * NOTE: A cleared bit for any status condition in the mask value does not have - * the effect of enabling it as a contributor to the \b - * ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ interrupt signal state. The function - * alt_i2c_int_enable() is used to enable status source conditions. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param mask - * Specifies the status conditions to disable as interrupt source - * contributors. \e mask is a mask of logically OR'ed \ref - * ALT_I2C_STATUS_t values that designate the status conditions to - * disable. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_int_disable(ALT_I2C_DEV_t *i2c_dev, const uint32_t mask); - -/*! - * Enable the specified I2C controller interrupt status conditions identified in - * the mask. - * - * This function enables one or more of the status conditions as contributors to - * the \b ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ interrupt signal state. - * - * NOTE: A cleared bit for any status condition in the mask value does not have - * the effect of disabling it as a contributor to the \b - * ALT_INT_INTERRUPT_I2C<em>n</em>_IRQ interrupt signal state. The function - * alt_i2c_int_disable() is used to disable status source conditions. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param mask - * Specifies the status conditions to enable as interrupt source - * contributors. \e mask is a mask of logically OR'ed \ref - * ALT_I2C_STATUS_t values that designate the status conditions to - * enable. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_int_enable(ALT_I2C_DEV_t *i2c_dev, const uint32_t mask); - -/*! - * Gets the cause of I2C transmission abort. A I2C transmission abort indicates - * that the I2C transmitter is unable to complete the intended actions on the - * contents of the transmit FIFO. This situation can occur both as an I2C master - * or an I2C slave, and is referred to as a "transmit abort". - * - * The returned value of this function is the value of the IC_TX_ABRT_SOURCE - * register which indicates the cause why the transmit abort occurred. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param cause - * [out] A pointer to a bit mask of the \ref ALT_I2C_TX_ABORT_CAUSE_t - * causes of the transmission abort. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_TX_ABRT_SOURCE - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_abort_cause_get(ALT_I2C_DEV_t *i2c_dev, - ALT_I2C_TX_ABORT_CAUSE_t *cause); - -/*! @} */ - -/******************************************************************************/ -/*! \addtogroup ALT_I2C_RX_FIFO RX FIFO Management - * - * The receive FIFO has a configurable threshold value that controls the level of - * entries (or above) that sets the RX_FULL status condition and triggers an - * interrupt. The valid range is 0 - (ALT_I2C_RX_FIFO_NUM_ENTRIES-1), with the - * additional restriction that I2C controller does not allow this value to be set - * to a value larger than the depth of the buffer. If an attempt is made to do - * that, the actual value set will be the maximum depth of the buffer. A value of - * 0 sets the threshold for 1 entry, and a value of (ALT_I2C_RX_FIFO_NUM_ENTRIES-1) - * sets the threshold for ALT_I2C_RX_FIFO_NUM_ENTRIES entries. - * - * @{ - */ - -/*! - * The number of entries (depth) of the I2C controller receive FIFO. - */ -#define ALT_I2C_RX_FIFO_NUM_ENTRIES 64 - -/*! - * Returns ALT_E_TRUE when the receive FIFO is empty. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_STATUS.RFNE == 0 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_rx_fifo_is_empty(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns ALT_E_TRUE when the receive FIFO is completely full. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_STATUS.RFF == 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_rx_fifo_is_full(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns the number of valid entries in the receive FIFO. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param num_entries - * [out] The number of entries in the receive FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_RXFLR.RXFLR - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_rx_fifo_level_get(ALT_I2C_DEV_t *i2c_dev, - uint32_t *num_entries); - -/*! - * Gets the current receive FIFO threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * [out] The current threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_RX_TL.RX_TL - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_rx_fifo_threshold_get(ALT_I2C_DEV_t *i2c_dev, - uint8_t *threshold); - -/*! - * Sets the current receive FIFO threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_RX_TL.RX_TL = threshold - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_rx_fifo_threshold_set(ALT_I2C_DEV_t *i2c_dev, - const uint8_t threshold); - -/*! @} */ - -/******************************************************************************/ -/*! \addtogroup ALT_I2C_TX_FIFO TX FIFO Management - * - * The transmit FIFO has a configurable threshold value that controls the level of - * entries (or below) that sets the TX_EMPTY status condition and triggers an - * interrupt. The valid range is 0 - (ALT_I2C_TX_FIFO_NUM_ENTRIES-1), with the - * additional restriction that I2C controller does not allow this value to be set - * to a value larger than the depth of the buffer. If an attempt is made to do - * that, the actual value set will be the maximum depth of the buffer. A value of - * 0 sets the threshold for 0 entries, and a value of (ALT_I2C_TX_FIFO_NUM_ENTRIES-1) - * sets the threshold for (ALT_I2C_TX_FIFO_NUM_ENTRIES-1) entries. - * - * @{ - */ - -/*! - * The number of entries (depth) of the I2C controller transmit FIFO. - */ -#define ALT_I2C_TX_FIFO_NUM_ENTRIES 64 - -/*! - * Returns ALT_E_TRUE when the transmit FIFO is empty. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_STATUS.TFE == 1 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_fifo_is_empty(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns ALT_E_TRUE when the transmit FIFO is completely full. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_STATUS.TFNF == 0 - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_fifo_is_full(ALT_I2C_DEV_t *i2c_dev); - -/*! - * Returns the number of valid entries in the transmit FIFO. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param num_entries - * [out] The number of entries in the transmit FIFO. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_TXFLR.TXFLR - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_fifo_level_get(ALT_I2C_DEV_t *i2c_dev, - uint32_t *num_entries); - -/*! - * Gets the current transmit FIFO threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * [out] The current threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_TX_TL.TX_TL - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_fifo_threshold_get(ALT_I2C_DEV_t *i2c_dev, - uint8_t *threshold); - -/*! - * Sets the current transmit FIFO threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - * - * \internal - * IC_TX_TL.TX_TL = threshold - * \endinternal - */ -ALT_STATUS_CODE alt_i2c_tx_fifo_threshold_set(ALT_I2C_DEV_t *i2c_dev, - const uint8_t threshold); - -/*! @} */ - -/******************************************************************************/ -/*! \addtogroup ALT_I2C_DMA DMA Interface - * - * The DMA interface has a configurable threshold value that controls the - * level of entries that triggers the burst handshaking request used for DMA - * integration. - * - * For the TX threshold, if the number of entries in the TX FIFO is at or - * below the set threshold, a DMA handshaking request will be made. The valid - * range for the TX threshold is 0 - (ALT_I2C_TX_FIFO_NUM_ENTRIES - 1). - * - * For the RX threshold, if the number of entries in the RX FIFO is above the - * set threshold, a DMA handshaking request will be made. The valid range for - * the RX treshold is 0 - (ALT_I2C_TX_FIFO_NUM_ENTRIES - 1). - * - * Having a higher threshold can improve the AXI bus utilization at the - * expense of the likelyhoold of overflow / underflow conditions. - * @{ - */ - -/*! - * Gets the current RX DMA threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * [out] The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - */ -ALT_STATUS_CODE alt_i2c_rx_dma_threshold_get(ALT_I2C_DEV_t * i2c_dev, uint8_t * threshold); - -/*! - * Sets the current RX DMA threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - */ -ALT_STATUS_CODE alt_i2c_rx_dma_threshold_set(ALT_I2C_DEV_t * i2c_dev, uint8_t threshold); - -/*! - * Gets the current TX DMA threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * [out] The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - */ -ALT_STATUS_CODE alt_i2c_tx_dma_threshold_get(ALT_I2C_DEV_t * i2c_dev, uint8_t * threshold); - -/*! - * Sets the current TX DMA threshold level value. - * - * \param i2c_dev - * A pointer to the I2C controller device block instance. - * - * \param threshold - * The threshold value. - * - * \retval ALT_E_SUCCESS Successful status. - * \retval ALT_E_ERROR Details about error status code - */ -ALT_STATUS_CODE alt_i2c_tx_dma_threshold_set(ALT_I2C_DEV_t * i2c_dev, uint8_t threshold); - -/*! @} */ - -/*! @} */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* __ALT_I2C_H__ */ |