/****************************************************************************** | |
* | |
* 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__ */ |