| /****************************************************************************** |
| * * |
| * License Agreement * |
| * * |
| * Copyright (c) 2016 Altera Corporation, San Jose, California, USA. * |
| * All rights reserved. * |
| * * |
| * Permission is hereby granted, free of charge, to any person obtaining a * |
| * copy of this software and associated documentation files (the "Software"), * |
| * to deal in the Software without restriction, including without limitation * |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, * |
| * and/or sell copies of the Software, and to permit persons to whom the * |
| * Software is furnished to do so, subject to the following conditions: * |
| * * |
| * The above copyright notice and this permission notice shall be included in * |
| * all copies or substantial portions of the Software. * |
| * * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * |
| * DEALINGS IN THE SOFTWARE. * |
| * * |
| * * |
| ******************************************************************************/ |
| |
| /*! \file |
| * Altera Avalon I2C Controller API |
| */ |
| |
| #ifndef __ALT_AVALON_I2C_H__ |
| #define __ALT_AVALON_I2C_H__ |
| |
| #include <stddef.h> |
| #include <errno.h> |
| |
| #include "sys/alt_dev.h" |
| #include "alt_types.h" |
| #include "altera_avalon_i2c_regs.h" |
| #include "os/alt_sem.h" |
| #include "os/alt_flag.h" |
| |
| #ifdef __cplusplus |
| extern "C" |
| { |
| #endif /* __cplusplus */ |
| |
| /* |
| * The function alt_find_dev() is used to search the device list "list" to |
| * locate a device named "name". If a match is found, then a pointer to the |
| * device is returned, otherwise NULL is returned. |
| */ |
| extern alt_dev* alt_find_dev (const char* name, alt_llist* list); |
| |
| /* Callback routine type definition */ |
| typedef void (*alt_avalon_i2c_callback)(void *context); |
| |
| /******************************************************************************/ |
| /*! \addtogroup ALT_AVALON_I2C I2C Controller API |
| * |
| * This document defines the API for configuring and managing the Avalon I2C controller. |
| * |
| * 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 Avalon (FPGA) I2C controller IP enables system |
| * software to communicate serially with I2C buses. Each I2C controller can |
| * operate in master mode only, and supports standard mode of up to 100 |
| * kilobits per second (Kbps) or fast mode of up to 400 Kbps. |
| * |
| * |
| * Features of the I2C Controller: |
| * * Supports both 100 KBps and 400 KBps modes |
| * * Supports I2C master mode |
| * * Support both 7-bit and 10-bit addressing modes |
| * * Mixed read and write combined-format transactions |
| * * Bulk transmit and receive |
| * * Interrupt support |
| * * CMD and RX Fifos |
| * |
| * For complete details on the configuration and operation of the I2C controller, |
| * consult the following references: |
| * * <em>Altera Avalon I2C Core Functional Description</em> |
| * |
| * @{ |
| */ |
| |
| |
| |
| /* Status Codes */ |
| typedef alt_u32 ALT_AVALON_I2C_STATUS_CODE; |
| #define ALT_AVALON_I2C_TRUE (1) |
| #define ALT_AVALON_I2C_FALSE (0) |
| #define ALT_AVALON_I2C_SUCCESS (0) |
| #define ALT_AVALON_I2C_ERROR (-1) |
| #define ALT_AVALON_I2C_TIMEOUT (-2) |
| #define ALT_AVALON_I2C_BAD_ARG (-3) |
| #define ALT_AVALON_I2C_RANGE (-4) |
| #define ALT_AVALON_I2C_NACK_ERR (-5) |
| #define ALT_AVALON_I2C_ARB_LOST_ERR (-6) |
| #define ALT_AVALON_I2C_BUSY (-7) |
| |
| /******************************************************************************/ |
| /*! \addtogroup INSTANCEFUNCTIONS I2C Instance Init Functions |
| * |
| * These functions are used by the system structure when initializing |
| * the I2C instance. These functions are not typically called by a |
| * user of the I2C IP except for the alt_avalon_i2c_open() |
| * function which is required to obtain a pointer to the desired I2C |
| * instance. |
| * |
| * @{ |
| */ |
| |
| /* constant used in the alt_avalon_i2c_send_address routine */ |
| #define TARGET_ADDR_MASK_10BIT 0x7800 |
| |
| /*! |
| * 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_AVALON_I2C_ADDR_MODE_e |
| { |
| ALT_AVALON_I2C_ADDR_MODE_7_BIT = 0, |
| /*!< 7-Bit Address Format */ |
| ALT_AVALON_I2C_ADDR_MODE_10_BIT = 1 |
| /*!< 10-Bit Address Format */ |
| } ALT_AVALON_I2C_ADDR_MODE_t; |
| |
| /*! |
| * A pointer or handle to the I2C controller device instance. The ALT_AVALON_I2C_DEV_t is |
| * initialized by a call to alt_avalon_i2c_init() and subsequently used by the other I2C |
| * controller API functions as a reference to a specific device. |
| * |
| */ |
| typedef struct ALT_AVALON_I2C_DEV_s |
| { |
| |
| alt_llist llist; |
| /*!< Device linked-list entry */ |
| const char *name; |
| /*!< Name of i2c in Qsys system */ |
| alt_u32 *i2c_base; |
| /*!< Base address of regs */ |
| alt_u32 irq_controller_ID; |
| /*!< device IRQ controller ID */ |
| alt_u32 irq_ID; |
| /*!< device IRQ ID */ |
| alt_avalon_i2c_callback callback; |
| /*!< Callback routine pointer */ |
| void *callback_context; |
| /*!< Callback context pointer */ |
| alt_u32 control; |
| /*!< user define control setting during interrupt registering*/ |
| alt_u32 master_target_address; |
| /*!< master target address */ |
| alt_u32 cmd_fifo_size; |
| /*!< cmd fifo */ |
| alt_u32 rx_fifo_size; |
| /*!< rx fifo */ |
| alt_u32 ip_freq_in_hz; |
| /*!< freq of clock to ip */ |
| ALT_AVALON_I2C_ADDR_MODE_t address_mode; |
| /*!< address mode 7 or 10 bit */ |
| ALT_SEM (regs_lock); |
| /*!< Semaphore used to control access registers |
| in multi-threaded mode */ |
| } ALT_AVALON_I2C_DEV_t; |
| |
| /*! |
| * The allocation of the ALT_AVALON_I2C_DEV_t structure memory |
| * and initial settings. |
| * |
| */ |
| #define ALTERA_AVALON_I2C_INSTANCE(name, dev) \ |
| static ALT_AVALON_I2C_DEV_t dev = \ |
| { \ |
| ALT_LLIST_ENTRY, \ |
| name##_NAME, \ |
| ((alt_u32 *)(name##_BASE)), \ |
| ((alt_u32)(name##_IRQ_INTERRUPT_CONTROLLER_ID)), \ |
| ((alt_u32)(name##_IRQ)), \ |
| ((void *) 0x0), \ |
| ((void *) 0x0), \ |
| ((alt_u32)(0)), \ |
| ((alt_u32)(0)), \ |
| ((alt_u32)(name##_FIFO_DEPTH)), \ |
| ((alt_u32)(name##_FIFO_DEPTH)), \ |
| ((alt_u32)(name##_FREQ)), \ |
| ((ALT_AVALON_I2C_ADDR_MODE_t)(0)), \ |
| }; |
| |
| /*! |
| * Initialize the specified I2C controller instance. This routine is called from the |
| * ALTERA_AVALON_I2C_INIT macro and is called automatically by alt_sys_init.c |
| * |
| * This routine disables interrupts, |
| * registers a specific instance of the device with the HAL, |
| * and installs an interrupt handler for the device. |
| * |
| * \param i2c_dev |
| * The Avalon FPGA I2C controller instance to initialize. |
| * |
| * |
| */ |
| void alt_avalon_i2c_init(ALT_AVALON_I2C_DEV_t *i2c_dev); |
| |
| /* |
| * The macro ALTERA_AVALON_I2C_INIT is called by the auto-generated function |
| * alt_sys_init() to initialize a given device instance. |
| */ |
| #define ALTERA_AVALON_I2C_INIT(name, dev) alt_avalon_i2c_init(&dev); |
| |
| /*! |
| * Retrieve a pointer to the i2c block instance |
| * Search the list of registered i2c instances for one with the supplied name. |
| * |
| * \retval NULL The return value will be NULL on failure |
| * \retval non-NULL Success, ptr to i2c device instance returned. |
| * |
| * \param *name Character pointer to name of i2c peripheral as registered |
| * with the HAL. For example, an i2c controller named "i2c_0" |
| * in Qsys would be opened by asking for "/dev/i2c_0". |
| * |
| */ |
| ALT_AVALON_I2C_DEV_t* alt_avalon_i2c_open(const char* name); |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup SPEEDANDTIMINGFUNCTIONS Speed and Timing Configuration Functions |
| * |
| * These functions are used to set the Speed and Timing parameters. |
| * The ALT_AVALON_I2C_MASTER_CONFIG_t structure |
| * is used to set or get the speed, address mode, and scl/sda timing counts of the instance. |
| * The timing parameters can be set or retrieved in terms of Hz by using the |
| * alt_avalon_i2c_master_config_speed_get and alt_avalon_i2c_master_config_speed_set functions. |
| * |
| * @{ |
| */ |
| |
| /*! |
| * 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. |
| * |
| */ |
| typedef enum ALT_AVALON_I2C_SPEED_e |
| { |
| ALT_AVALON_I2C_SPEED_STANDARD = 0, |
| /*!< Standard mode (0 to 100 Kbps) */ |
| ALT_AVALON_I2C_SPEED_FAST = 1 |
| /*!< Fast mode (<= 400 Kbps) */ |
| } ALT_AVALON_I2C_SPEED_t; |
| |
| /*! |
| * This type enumerates the I2C controller max min speeds in hz. |
| * |
| * 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). |
| * |
| */ |
| typedef enum ALT_AVALON_I2C_MAX_MIN_HZ_e |
| { |
| ALT_AVALON_I2C_FS_MAX_HZ = 400000, |
| /*!< Max speed is 400Khz */ |
| ALT_AVALON_I2C_FS_MIN_HZ = 100000, |
| /*!< Min speed is 100Khz */ |
| ALT_AVALON_I2C_SS_MAX_HZ = 100000, |
| /*!< Max speed is 100Khz */ |
| ALT_AVALON_I2C_SS_MIN_HZ = 1 |
| /*!< Min speed is 1hz */ |
| } ALT_AVALON_I2C_MAX_MIN_HZ_t; |
| |
| |
| #define ALT_AVALON_I2C_DIFF_LCNT_HCNT 60 |
| |
| /*! |
| * This type defines a structure for configuration of the SCL high and low counts |
| * to ensure proper I/O timing with the device interface. |
| * |
| * 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_AVALON_I2C_MASTER_CONFIG_s |
| { |
| ALT_AVALON_I2C_ADDR_MODE_t addr_mode; |
| /*!< The address mode (7 or 10 bit) when |
| * acting as a master. |
| */ |
| ALT_AVALON_I2C_SPEED_t speed_mode; |
| /*!< The speed mode of the I2C operation. |
| */ |
| alt_u16 scl_hcnt; |
| /*!< The SCL clock high-period count. |
| */ |
| alt_u16 scl_lcnt; |
| /*!< The SCL clock low-period count. |
| */ |
| alt_u16 sda_cnt; |
| /*!< The SDA clock hold count. |
| */ |
| } ALT_AVALON_I2C_MASTER_CONFIG_t; |
| |
| /*! |
| * Populates the master mode configuration structure (type ALT_AVALON_I2C_ADDR_MODE_t) from registers. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param cfg |
| * [out] Pointer to a ALT_AVALON_I2C_MASTER_CONFIG_t structure for holding |
| * the returned I2C master mode configuration parameters. |
| * |
| * |
| */ |
| void alt_avalon_i2c_master_config_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| ALT_AVALON_I2C_MASTER_CONFIG_t* cfg); |
| |
| /*! |
| * Sets the registers based on the master mode configuration structure (type ALT_AVALON_I2C_ADDR_MODE_t). |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param cfg |
| * Pointer to a ALT_AVALON_I2C_MASTER_CONFIG_t structure holding the desired |
| * I2C master mode operational parameters. |
| * |
| * |
| */ |
| void alt_avalon_i2c_master_config_set(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const ALT_AVALON_I2C_MASTER_CONFIG_t* cfg); |
| |
| /*! |
| * This utility function returns the speed in hz based on the contents of the passed in configuration structure. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param cfg |
| * A pointer to a master configuration structure. |
| * |
| * \param speed_in_hz |
| * [out] Speed (Hz) the I2C bus is currently configured at based on |
| * the cfg structure (not necessarily on the hardware settings). |
| * To get the hardware speed first populate the cfg structure |
| * with the alt_avalon_i2c_master_config_get() function. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_config_speed_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const ALT_AVALON_I2C_MASTER_CONFIG_t* cfg, |
| alt_u32 * speed_in_hz); |
| |
| /*! |
| * This is a utility function that computes parameters for the I2C master |
| * configuration that best matches the speed requested. Only the cfg |
| * structure passed in is modified. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param cfg |
| * A pointer to a master configuration structure. |
| * |
| * \param speed_in_hz |
| * Desired Speed (Hz) of the I2C bus. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_config_speed_set(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| ALT_AVALON_I2C_MASTER_CONFIG_t * cfg, |
| alt_u32 speed_in_hz); |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup HELPERFUNCTIONS Helper Functions |
| * |
| * These helper functions are used by the I2C transaction functions. |
| * |
| * @{ |
| */ |
| |
| /* Descriptive Constants */ |
| #define ALT_AVALON_I2C_READ (1) |
| #define ALT_AVALON_I2C_WRITE (0) |
| #define ALT_AVALON_I2C_NO_RESTART (0) |
| #define ALT_AVALON_I2C_NO_STOP (0) |
| #define ALT_AVALON_I2C_RESTART (1) |
| #define ALT_AVALON_I2C_STOP (1) |
| #define ALT_AVALON_I2C_USE_INTERRUPTS (1) |
| #define ALT_AVALON_I2C_NO_INTERRUPTS (0) |
| |
| /*! |
| * Disables the I2C controller. |
| * |
| * When the I2C controller is disabled, the TX_READY_EN interrupt is cleared. |
| * However, the IP is not designed to be able to disable the IP in the middle |
| * of a transaction so this should be avoided. This disable function must |
| * be done at the end of every START -> STOP sequence. |
| * Before doing this function, wait for the IP to not be busy using the |
| * alt_avalon_i2c_is_busy function. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * |
| */ |
| void alt_avalon_i2c_disable(ALT_AVALON_I2C_DEV_t *i2c_dev); |
| |
| /*! |
| * Enables the I2C controller. This function is done at the beginning of |
| * every START->STOP sequence. |
| * This function returns ALT_AVALON_I2C_BUSY status if the ip is already |
| * enabled. In that case nothing is done. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \retval ALT_AVALON_I2C_BUSY |
| * Indicates the I2C controller is already enabled. |
| * \retval ALT_AVALON_I2C_SUCCESS |
| * Indicates the I2C controller has been successfully enabled. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_enable(ALT_AVALON_I2C_DEV_t *i2c_dev); |
| |
| /*! |
| * Returns ALT_AVALON_I2C_TRUE if the I2C controller is busy. The I2C controller is busy if |
| * not in the IDLE state |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \retval ALT_AVALON_I2C_TRUE |
| * Indicates the I2C controller is busy. |
| * \retval ALT_AVALON_I2C_FALSE |
| * Indicates the I2C controller is not busy. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_is_busy(ALT_AVALON_I2C_DEV_t *i2c_dev); |
| |
| /*! |
| * This function reads all available bytes from the receive FIFO, up to max_bytes_to_read. |
| * If max_bytes_to_read is 0, then all available bytes are read. |
| * |
| * 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. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param buffer |
| * [out]The buffer to receive the read data. |
| * |
| * \param max_bytes_to_read |
| * The maximum number of bytes to be read. If 0 then all available bytes are read. |
| * |
| * \param bytes_read |
| * [out] Pointer to variable indicating the number of bytes read. |
| */ |
| void alt_avalon_i2c_rx_read_available(ALT_AVALON_I2C_DEV_t *i2c_dev, alt_u8 *buffer, alt_u32 max_bytes_to_read, alt_u32 *bytes_read); |
| |
| /*! |
| * 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 checks for valid data in the receive FIFO |
| * before reading the byte. |
| * |
| * \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_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_rx_read(ALT_AVALON_I2C_DEV_t *i2c_dev, alt_u8 *val); |
| |
| /*! |
| * This function writes the Transfer Command FIFO. |
| * |
| * This function is used to perform low level writes of data to the |
| * Transfer Command FIFO for transmission by the I2C controller. |
| * The value written includes the Stop and Start bits. |
| * |
| * This function checks for there to be space in Transfer Command FIFO |
| * before writing the register. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param val |
| * The data to write to the Transfer Command FIFO. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_cmd_write(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u8 val, |
| alt_u8 issue_restart, |
| alt_u8 issue_stop); |
| |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup TARGETADDRESSFUNCTIONS Target Address Functions |
| * |
| * The I2C target address is the address the I2C device being accessed will respond to. |
| * This is a 7 or 10 bit value. alt_avalon_i2c_send_address() will update the |
| * transfer command register with a value containing the target, direction, and restart |
| * bits. |
| * |
| * The alt_avalon_i2c_master_target_set() and alt_avalon_i2c_master_target_get() functions |
| * will set or get the target address that will be used in future I2C transactions. |
| * |
| * The target address must be set before doing any I2C functions. Once set it does not have |
| * to be set again unless changing the device being accessed. |
| * |
| * @{ |
| */ |
| |
| /*! |
| * This function sends the address and write or read command with optional |
| * restart bit to the Transfer Command Fifo. If the command |
| * fifo is full the command will wait until space is available. The command |
| * sequence will be 7 or 10 bit depending on the address mode setting. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param rw_bit |
| * The I2C Read (1) or Write(0) bit. |
| * |
| * \param issue_restart |
| * If issue_restart is 1, a restart is issued. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_send_address(ALT_AVALON_I2C_DEV_t *i2c_dev,const alt_u32 rw_bit,const alt_u8 issue_restart); |
| |
| /*! |
| * This function returns the current target address. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param target_addr |
| * [out] The 7 or 10 bit slave target address. |
| * |
| */ |
| void alt_avalon_i2c_master_target_get(ALT_AVALON_I2C_DEV_t * i2c_dev, alt_u32 * target_addr); |
| |
| /*! |
| * This function updates the target address for any future I2C bus IO. |
| * |
| * This function does not wait for a bus idle state before changing the address. |
| * So is not suitable for being called from an interrupt routine. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param target_addr |
| * The 7 or 10 bit slave target address. |
| * |
| */ |
| void alt_avalon_i2c_master_target_set(ALT_AVALON_I2C_DEV_t * i2c_dev, alt_u32 target_addr); |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup Avalon I2C Transmit and Receive Functions |
| * |
| * The functions alt_avalon_i2c_master_transmit() and alt_avalon_i2c_master_receive() |
| * are the main functions for performing i2c transactions. These functions can be |
| * combined to create any combination of read-write operations within an I2C |
| * START to STOP sequence. |
| * There are also interrupt versions of the above functions, |
| * alt_avalon_i2c_master_transmit_using_interrupts() and alt_avalon_i2c_master_receive_using_interrupts(). |
| * Though the provided interrupt irq callback is functional and tested, it is mainly provided as an example |
| * starting point for a user to develop their own irq callback routine and to show how the |
| * user callback is registered and used. |
| * |
| * The above functions will return an ALT_AVALON_I2C_BUSY status if the ip is already enabled, |
| * and the function is being called with a START request (ie, restart parameter is not set). |
| * |
| * The functions alt_avalon_i2c_master_tx(), alt_avalon_i2c_master_rx(), and alt_avalon_i2c_master_tx_rx() |
| * are complete START to STOP sequence commands to simplify typical write and read operations and are |
| * basically wrappers for the alt_avalon_i2c_master_transmit() and alt_avalon_i2c_master_receive() functions. |
| * These wrapper functions will do automatic retry if the device is busy. |
| * |
| * @{ |
| */ |
| |
| |
| /*! |
| * This function transmits START followed by the I2C command |
| * byte(s). Then write requests are sent to fulfill the write request. The final |
| * transaction will issue a STOP. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If an ALT_AVALON_I2C_ARB_LOST_ERR, ALT_AVALON_I2C_NACK_ERR, or ALT_AVALON_I2C_BUSY occurs the |
| * command will be retried. ALT_AVALON_I2C_NACK_ERR will occur when the slave |
| * device is not yet ready to accept more data. |
| * |
| * If the use_interrupts parameter is 1, then as soon as all bytes have been |
| * written to the command fifo this function will return. The interrupt handler |
| * will then handle waiting for the device to accept the data and will then complete the |
| * i2c transaction. To use this option the provided optional user interrupt handler |
| * callback must have been registered by calling the alt_avalon_i2c_register_optional_irq_handler |
| * function. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param buffer |
| * The data buffer to be sent. |
| * |
| * \param size |
| * The size of the data buffer to write to the I2C bus. |
| * |
| * \param use_interrupts |
| * The optional user interrupt handler callback will be used to handle |
| * sending the data. |
| * |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_tx(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const alt_u8 * buffer, |
| const alt_u32 size, |
| const alt_u8 use_interrupts); |
| |
| |
| /*! |
| * This function transmits START followed by the I2C command |
| * byte(s). Then read requests are sent to fulfill the read request. The final |
| * transaction will issue a STOP. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If an ALT_AVALON_I2C_ARB_LOST_ERR, ALT_AVALON_I2C_NACK_ERR, ALT_AVALON_I2C_BUSY occurs the |
| * command will be retried. ALT_AVALON_I2C_NACK_ERR will occur when the slave |
| * device is not yet ready to accept more data. |
| * |
| * If the use_interrupts parameter is 1, then as soon as all cmd bytes have been |
| * written to the command fifo this function will return. The interrupt handler |
| * will then handle waiting for the device to send the rx data and will then complete the |
| * i2c transaction. To use this option the provided optional user interrupt handler |
| * callback must have been registered by calling the alt_avalon_i2c_register_optional_irq_handler |
| * function. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param buffer |
| * [out] The data buffer to be receive the i2c data. |
| * |
| * \param size |
| * The size of the data buffer to write to the I2C bus. |
| * |
| * \param use_interrupts |
| * The optional user interrupt handler callback will be used to handle |
| * receiving the data. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_rx(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u8 * buffer, |
| const alt_u32 size, |
| const alt_u8 use_interrupts); |
| |
| |
| /*! |
| * This function transmits START followed by the I2C command |
| * byte(s). Then write requests are sent to fulfill the write request. |
| * Then a RESTART is issued and read requests are sent until the read |
| * request is fulfilled. The final transaction will issue a STOP. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If an ALT_AVALON_I2C_ARB_LOST_ERR, ALT_AVALON_I2C_NACK_ERR, or ALT_AVALON_I2C_BUSY occurs the |
| * command will be retried. ALT_AVALON_I2C_NACK_ERR will occur when the slave |
| * device is not yet ready to accept or send more data. |
| * |
| * This command will allow easy access of a device requiring an internal register |
| * address to be set before doing a read, for example an eeprom device. |
| * |
| * Example: If an eeprom requires a 2 byte address to be sent before doing a |
| * memory read, the tx buffer would contain the 2 byte address and the txsize |
| * would be set to 2. Then the rxbuffer will recieve the rxsize number of |
| * bytes to read from the eeprom as follows: |
| * To Read 0x10 bytes from eeprom at i2c address 0x51 into buffer: |
| * buffer[0]=2;buffer[1]=0; //set eeprom address 0x200 |
| * alt_avalon_i2c_master_tx_rx(i2c_ptr,buffer,2,buffer,0x10,0); |
| * |
| * Notice the tx and rx buffer can be the same buffer if desired. |
| * |
| * If the use_interrupts parameter is 1, then as soon as all cmd bytes have been |
| * written to the command fifo this function will return. The interrupt handler |
| * will then handle waiting for the device to send the rx data and will then complete the |
| * i2c transaction. To use this option the provided optional user interrupt handler |
| * callback must have been registered by calling the alt_avalon_i2c_register_optional_irq_handler |
| * function. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param txdata |
| * The send data buffer. |
| * |
| * \param txsize |
| * The size of the send data buffer to write to the I2C bus. |
| * |
| * \param rxdata |
| * [out] The receive data buffer. |
| * |
| * \param rxsize |
| * The size of the receive data buffer. |
| * |
| * \param use_interrupts |
| * The optional user interrupt handler callback will be used to handle |
| * sending and receiving the data. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_tx_rx(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const alt_u8 * txbuffer, |
| const alt_u32 txsize, |
| alt_u8 * rxbuffer, |
| const alt_u32 rxsize, |
| const alt_u8 use_interrupts); |
| |
| /*! |
| * This function transmits either a START or RESTART followed by the I2C command |
| * byte(s). Then write requests are sent to fulfill the write request. The final |
| * transaction may issue a STOP depending on the issue_stop parameter. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If the command returns ALT_AVALON_I2C_ARB_LOST_ERR, ALT_AVALON_I2C_NACK_ERR, or |
| * ALT_AVALON_I2C_BUSY, |
| * the caller is responsible to do a retry (if desired) by calling the function again. |
| * To automatically do a complete write sequence with retry use the |
| * alt_avalon_i2c_master_tx() function. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param data |
| * The data buffer to be sent. |
| * |
| * \param size |
| * The size of the data buffer to write to the I2C bus. |
| * |
| * \param issue_restart |
| * This parameter controls whether a RESTART or START is issued before |
| * the command byte is sent. If: |
| * * \b true \e a RESTART is issued before the command byte is sent. |
| * * \b false \e a START command is issued before the command byte(s) is sent. |
| * |
| * \param issue_stop |
| * This parameter controls whether a STOP is issued after the cmd data is |
| * sent. If: |
| * * \b true - STOP is issued after the final cmd byte is transmitted. |
| * * \b false - STOP is not issued. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_transmit(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const alt_u8 * data, |
| alt_u32 size, |
| const alt_u8 issue_restart, |
| const alt_u8 issue_stop); |
| |
| |
| /*! |
| * This function transmits either a START or RESTART followed by the I2C command |
| * byte(s). Then write requests are sent to fulfill the write request. The final |
| * transaction may issue a STOP depending on the issue_stop parameter. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If the command returns ALT_AVALON_I2C_ARB_LOST_ERR or ALT_AVALON_I2C_NACK_ERR or ALT_AVALON_I2C_BUSY, |
| * the caller is responsible to do a retry (if desired) by calling the function again. |
| * To automatically do a complete write sequence with retry use the |
| * alt_avalon_i2c_master_tx() function with the retry option set. |
| * |
| * As soon as all cmd bytes have been |
| * written to the command fifo this function will return. The interrupt handler |
| * will then handle waiting for the device to accept the data completing the |
| * i2c transaction. To use this option the provided optional user interrupt handler |
| * callback must have been registered by calling the alt_avalon_i2c_register_optional_irq_handler |
| * function. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param data |
| * The data buffer to be sent. |
| * |
| * \param size |
| * The size of the data buffer to write to the I2C bus. |
| * |
| * \param issue_restart |
| * This parameter controls whether a RESTART or START is issued before |
| * the command byte is sent. If: |
| * * \b true \e a RESTART is issued before the command byte is sent. |
| * * \b false \e a START command is issued before the command byte(s) is sent. |
| * |
| * \param issue_stop |
| * This parameter controls whether a STOP is issued after the cmd data is |
| * sent. If: |
| * * \b true - STOP is issued after the final cmd byte is transmitted. |
| * * \b false - STOP is not issued. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_transmit_using_interrupts(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const alt_u8 * buffer, |
| alt_u32 size, |
| const alt_u8 issue_restart, |
| const alt_u8 issue_stop); |
| |
| /*! |
| * This function transmits either a START or RESTART followed by the I2C command |
| * byte(s). Then read requests are sent to fulfill the read request. The final |
| * transaction may issue a STOP depending on the issue_stop parameter. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If the command returns ALT_AVALON_I2C_ARB_LOST_ERR, ALT_AVALON_I2C_NACK_ERR, |
| * or ALT_AVALON_I2C_BUSY |
| * the caller is responsible to do a retry (if desired) by repeating the i2c |
| * transaction from the call that issued the START, which may not be this one. |
| * To automatically do a complete write-read sequence with retry use the |
| * alt_avalon_i2c_master_tx_rx() function with the retry option set. |
| * |
| * |
| * \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 or START is issued before |
| * the command byte is sent. If: |
| * * \b true \e a RESTART is issued before the command byte is sent. |
| * * \b false \e a START command is issued before the command byte(s) is sent. |
| * |
| * \param issue_stop |
| * This parameter controls whether a STOP is issued after the cmd data is |
| * sent. If: |
| * * \b true - STOP is issued after the final cmd byte is transmitted. |
| * * \b false - STOP is not issued. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_receive(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u8 * data, |
| const alt_u32 size, |
| const alt_u8 issue_restart, |
| const alt_u8 issue_stop); |
| |
| |
| /*! |
| * This function transmits either a START or RESTART followed by the I2C command |
| * byte(s). Then read requests are sent to fulfill the read request. The final |
| * transaction may issue a STOP depending on the issue_stop parameter. |
| * |
| * This API is not suitable for being called in an interrupt context as it may |
| * wait for certain controller states before completing. |
| * |
| * The target address must have been set before using this function. |
| * |
| * If the command returns ALT_AVALON_I2C_ARB_LOST_ERR or ALT_AVALON_I2C_NACK_ERR or ALT_AVALON_I2C_BUSY |
| * the caller is responsible to do a retry (if desired) by repeating the i2c |
| * transaction from the call that issued the START, which may not be this one. |
| * To automatically do a complete write-read sequence with retry use the |
| * alt_avalon_i2c_master_tx_rx() function with the retry option set. |
| * |
| * As soon as all cmd bytes have been |
| * written to the command fifo this function will return. The interrupt handler |
| * will then handle waiting for the device to send the rx data and will then complete the |
| * i2c transaction. To use this option the provided optional user interrupt handler |
| * callback must have been registered by calling the alt_avalon_i2c_register_optional_irq_handler |
| * 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 or START is issued before |
| * the command byte is sent. If: |
| * * \b true \e a RESTART is issued before the command byte is sent. |
| * * \b false \e a START command is issued before the command byte(s) is sent. |
| * |
| * \param issue_stop |
| * This parameter controls whether a STOP is issued after the cmd data is |
| * sent. If: |
| * * \b true - STOP is issued after the final cmd byte is transmitted. |
| * * \b false - STOP is not issued. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates successful status |
| * otherwise one of the ALT_AVALON_I2C_* status codes |
| * is returned. All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_master_receive_using_interrupts(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u8 * buffer, |
| const alt_u32 size, |
| const alt_u8 issue_restart, |
| const alt_u8 issue_stop); |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup ALT_AVALON_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. |
| * The following events can generate an interrupt: |
| * * Arbitation lost |
| * * NACK Detected |
| * * Transmit Buffer Empty |
| * * Receive Buffer Full |
| * * Receive Overflow |
| * |
| * These interrupt status conditions may be monitored either by polling their |
| * status or by configuring interrupt handlers. |
| * |
| * 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. |
| * |
| * @{ |
| */ |
| |
| /*! |
| * This type enumerates interrupt status conditions for the I2C controller. |
| */ |
| typedef enum ALT_AVALON_I2C_ISR_e |
| { |
| ALT_AVALON_I2C_STATUS_RX_OVER = 1UL << 4, |
| /*!< 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. Writing 1 to this field clears the |
| * contents to 0. |
| */ |
| ALT_AVALON_I2C_STATUS_ARBLOST_DET = 1UL << 3, |
| /*!< This bit is set to 1 when the i2c controller |
| * has lost the bus arbitration. Writing 1 to |
| * this field clears the contents to 0. |
| */ |
| ALT_AVALON_I2C_NACK_DET = 1UL << 2, |
| /*!< This bit is set to 1 when no acknowledgement |
| * (NACK) is recieved by the i2c controller. The |
| * MACK can be during the address or data transmission |
| * phase. Writing 1 to |
| * this field clears the contents to 0. |
| */ |
| ALT_AVALON_I2C_RX_READY = 1UL << 1, |
| /*!< This bit indicates the RX_DATA fifo level is |
| * equal or more than the RX_DATA fifo threshold. |
| * It is automatically cleared when the RX_DATA fifo |
| * level is less than the RX_DATA fifo threshold. |
| */ |
| ALT_AVALON_I2C_TX_READY = 1UL << 0, |
| /*!< This bit indicates the Transfer Command FIFO is ready |
| * for data transmission. This bit is asserted when the |
| * Transfer Command FIFO level is equal to or less than the |
| * Transfer Command FIFO threshold. |
| */ |
| } ALT_AVALON_I2C_STATUS_t; |
| |
| /* A structure to be used with the optional provided irq callback function*/ |
| typedef struct IRQ_DATA_s |
| { |
| alt_u8 * buffer; |
| alt_u32 size; |
| alt_u32 irq_busy; |
| } IRQ_DATA_t; |
| |
| /*! |
| * Associate a user-specific routine with the i2c interrupt handler. |
| * If a callback is registered, all enabled ISR's will cause the callback to be executed. |
| * The callback runs as part of the interrupt service routine. |
| * |
| * An optional user callback routine is provided in this code and, if used, enables use |
| * of the alt_avalon_i2c_master_receive_using_interrupts and alt_avalon_i2c_master_transmit_using_interrupts |
| * functions. To register the optionally provided user callback use the alt_avalon_i2c_register_optional_irq_handler |
| * function. |
| * |
| * \param dev Pointer to i2c device (instance) structure. |
| * \param callback Pointer to callback routine to execute at interrupt level |
| * \param control For masking the source interruption and setting configuration |
| * \param context callback context |
| * |
| */ |
| void alt_avalon_i2c_register_callback( |
| ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_avalon_i2c_callback callback, |
| alt_u32 control, |
| void *context); |
| |
| /*! |
| * Associate the optional provided user interrupt callback routine with the i2c handler. |
| * This is a simple IRQ callback which allows I2C transaction functions to immedietly return |
| * while the optional callback handles receiving or transmitting the data to the device |
| * and completing the transaction. This optional callback uses a IRQ_DATA_t structure for |
| * irq data. The function alt_avalon_i2c_interrupt_transaction_status can be used to check |
| * for irq transaction complete, or for an transaction error. |
| * These optionally provided interrupt routines are functional, but are provided |
| * mainly for the purpose as working examples of using interrupts with the avalon i2c ip. |
| * A user may want to develop a more detailed irq callback routine tailored for specific |
| * device hardware. In that case, the user callback would be registered with the |
| * alt_avalon_i2c_register_callback function. |
| * |
| * Using this optionally provided user callback routine enables use |
| * of the alt_avalon_i2c_master_receive_using_interrupts and alt_avalon_i2c_master_transmit_using_interrupts |
| * functions. |
| * |
| * \param dev Pointer to i2c device (instance) structure. |
| * |
| * \param irq_data A structure used for interrupt handler data. |
| * Nothing needs to be set in this structure by the |
| * user. The storage merely has to be provided. |
| * The irq_busy variable can be used to check if the |
| * transaction is complete. In that case it will be 0. |
| */ |
| void alt_avalon_i2c_register_optional_irq_handler(ALT_AVALON_I2C_DEV_t *i2c_dev,IRQ_DATA_t * irq_data); |
| |
| /*! |
| * When an interrupt transaction has been initiated using the alt_avalon_i2c_master_tx, |
| * alt_avalon_i2c_master_rx, or alt_avalon_i2c_master_tx_rx function with the interrupt |
| * option set, or if using the alt_avalon_i2c_master_transmit_using_interrupts or |
| * alt_avalon_i2c_master_receive_using_interrupts functions, then this function can be |
| * used to check the status of that transaction. The only way to ensure error free |
| * back to back transactions is to use this function after every interrupt transaction |
| * to ensure the transaction had no errors and is complete, before starting the next transaction. |
| * Also, if an error is returned from this function, then the user must retry the i2c transaction. |
| * One reason an error may be returned is if the device is busy, which is likely to occur |
| * occasionally if doing back to back transactions. |
| * |
| * \param dev Pointer to i2c device (instance) structure. |
| * |
| * \retval ALT_AVALON_I2C_STATUS_CODE |
| * ALT_AVALON_I2C_SUCCESS indicates interrupt transaction is |
| * successfully completed. Another transaction can now be |
| * started. |
| * |
| * ALT_AVALON_I2C_BUSY indicates the interrupt transaction is still |
| * busy. |
| * |
| * ALT_AVALON_NACK_ERROR indicates the device did not ack. This is |
| * most likely because the device is busy with the previous transaction. |
| * The transaction must be retried. |
| * |
| * otherwise one of the other ALT_AVALON_I2C_* status codes |
| * is returned. The transaction must be retried. |
| * |
| * All failing return values are < 0. |
| * |
| */ |
| ALT_AVALON_I2C_STATUS_CODE alt_avalon_i2c_interrupt_transaction_status(ALT_AVALON_I2C_DEV_t *i2c_dev); |
| |
| /*! |
| * This reads the raw NACK status bit regardless of whether or not the corresponding |
| * interrupt is enabled. The function will update status if the NACK bit is set in the ISR reg/ |
| * Otherwise nothing is done. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param status |
| * [in][out] Set to ALT_AVALON_I2C_NACK_ERR if the NACK bit |
| * in the ISR is set. Otherwise status is not modified. |
| * |
| */ |
| void alt_avalon_i2c_check_nack(ALT_AVALON_I2C_DEV_t *i2c_dev,ALT_AVALON_I2C_STATUS_CODE * status); |
| |
| /*! |
| * This reads the raw ARBLOST status bit regardless of whether or not the corresponding |
| * interrupt is enabled. This function will update status if the ARBLOST bit is set in the ISR reg |
| * Otherwise nothing is done. |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param status |
| * [in][out] Set to ALT_AVALON_I2C_ARB_LOST_ERR if the ARBLOST bit |
| * in the ISR is set. Otherwise, status is not modified. |
| * |
| */ |
| void alt_avalon_i2c_check_arblost(ALT_AVALON_I2C_DEV_t *i2c_dev,ALT_AVALON_I2C_STATUS_CODE * status); |
| |
| /*! |
| * 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_AVALON_I2C_STATUS_t |
| * interrupt and status conditions. |
| * |
| */ |
| void alt_avalon_i2c_int_status_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u32 *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_AVALON_I2C_STATUS_t |
| * interrupt and status conditions. |
| * |
| * |
| */ |
| void alt_avalon_i2c_int_raw_status_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| alt_u32 *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 IRQ interrupt signal state. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param mask |
| * Specifies the interrupt status conditions to clear. \e mask |
| * is a mask of logically OR'ed \ref ALT_AVALON_I2C_STATUS_t values that |
| * designate the status conditions to clear. |
| * |
| */ |
| void alt_avalon_i2c_int_clear(ALT_AVALON_I2C_DEV_t *i2c_dev, const alt_u32 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 IRQ interrupt signal state. |
| * The function alt_avalon_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_AVALON_I2C_STATUS_t values that designate the status conditions to |
| * disable. |
| * |
| * |
| */ |
| void alt_avalon_i2c_int_disable(ALT_AVALON_I2C_DEV_t *i2c_dev, const alt_u32 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 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 IRQ interrupt signal state. |
| * The function alt_avalon_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_AVALON_I2C_STATUS_t values that designate the status conditions to |
| * enable. |
| * |
| * |
| */ |
| void alt_avalon_i2c_int_enable(ALT_AVALON_I2C_DEV_t *i2c_dev, const alt_u32 mask); |
| |
| /*! |
| * Gets the Enabled Interrupts (reads the ISER register) |
| * |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param enabled_ints |
| * [out] A pointer to the variable to recieve the data. |
| * |
| * |
| */ |
| void alt_avalon_i2c_enabled_ints_get(ALT_AVALON_I2C_DEV_t *i2c_dev, alt_u32 * enabled_ints); |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup ALT_AVALON_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_READY status condition and triggers an |
| * interrupt. The valid ranges are 1, 1/4 full, 1/2 full, or full. |
| * |
| * @{ |
| */ |
| |
| /*! |
| * This type enumerates the RX_DATA_FIFO_THRESHOLD for the I2C controller. |
| */ |
| typedef enum ALT_AVALON_I2C_RX_DATA_FIFO_THRESHOLD_e |
| { |
| ALT_AVALON_I2C_RX_DATA_FIFO_1_ENTRY = 0, |
| ALT_AVALON_I2C_RX_DATA_FIFO_1_4_FULL = 1, |
| ALT_AVALON_I2C_RX_DATA_FIFO_1_2_FULL = 2, |
| ALT_AVALON_I2C_RX_DATA_FIFO_FULL = 3, |
| } ALT_AVALON_I2C_RX_DATA_FIFO_THRESHOLD_t; |
| |
| /*! |
| * 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. |
| * |
| * |
| */ |
| void alt_avalon_i2c_rx_fifo_threshold_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| ALT_AVALON_I2C_RX_DATA_FIFO_THRESHOLD_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. |
| * |
| * |
| */ |
| void alt_avalon_i2c_rx_fifo_threshold_set(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const ALT_AVALON_I2C_RX_DATA_FIFO_THRESHOLD_t threshold); |
| |
| /*! @} */ |
| |
| /******************************************************************************/ |
| /*! \addtogroup ALT_AVALON_I2C_TFR_CMD Transfer Command FIFO Management |
| * |
| * The Transfer Command FIFO has a configurable threshold value that controls the level of |
| * entries (or below) that sets the TX_READY status condition and triggers an |
| * interrupt. The valid range is empty, 1/4 full, 1/2 full, and not full (at least 1 empty entry) |
| * |
| * @{ |
| */ |
| |
| /*! |
| * This type enumerates the TFR_CMD_FIFO_THRESHOLD for the I2C controller. |
| */ |
| typedef enum ALT_AVALON_I2C_TFR_CMD_FIFO_THRESHOLD_e |
| { |
| ALT_AVALON_I2C_TFR_CMD_FIFO_EMPTY = 0, |
| ALT_AVALON_I2C_TFR_CMD_FIFO_1_4_FULL = 1, |
| ALT_AVALON_I2C_TFR_CMD_FIFO_1_2_FULL = 2, |
| ALT_AVALON_I2C_TFR_CMD_FIFO_NOT_FULL = 3, |
| } ALT_AVALON_I2C_TFR_CMD_FIFO_THRESHOLD_t; |
| |
| /*! |
| * Gets the current Transfer Command FIFO threshold level value. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param threshold |
| * [out] The current threshold value. |
| * |
| * |
| */ |
| void alt_avalon_i2c_tfr_cmd_fifo_threshold_get(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| ALT_AVALON_I2C_TFR_CMD_FIFO_THRESHOLD_t *threshold); |
| |
| |
| /*! |
| * Sets the current Transfer Command FIFO threshold level value. |
| * |
| * \param i2c_dev |
| * A pointer to the I2C controller device block instance. |
| * |
| * \param threshold |
| * The threshold value. |
| * |
| * |
| */ |
| void alt_avalon_i2c_tfr_cmd_fifo_threshold_set(ALT_AVALON_I2C_DEV_t *i2c_dev, |
| const ALT_AVALON_I2C_TFR_CMD_FIFO_THRESHOLD_t threshold); |
| |
| |
| /*! @} */ |
| |
| /*! @} */ |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* __ALTERA_AVALON_I2C_H__ */ |