|
| 1 | +/* |
| 2 | +* Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates |
| 3 | +* |
| 4 | +* SPDX-License-Identifier: BSD-3-Clause |
| 5 | +*/ |
| 6 | + |
| 7 | +#ifndef R_I2C_MASTER_API_H |
| 8 | +#define R_I2C_MASTER_API_H |
| 9 | + |
| 10 | +/*******************************************************************************************************************//** |
| 11 | + * @ingroup RENESAS_INTERFACES |
| 12 | + * @defgroup I2C_MASTER_API I2C Master Interface |
| 13 | + * @brief Interface for I2C master communication. |
| 14 | + * |
| 15 | + * @section I2C_MASTER_API_SUMMARY Summary |
| 16 | + * The I2C master interface provides a common API for I2C HAL drivers. The I2C master interface supports: |
| 17 | + * - Interrupt driven transmit/receive processing |
| 18 | + * - Callback function support which can return an event code |
| 19 | + * |
| 20 | + * Implemented by: |
| 21 | + * - @ref RIIC_MASTER |
| 22 | + * |
| 23 | + * @{ |
| 24 | + **********************************************************************************************************************/ |
| 25 | + |
| 26 | +/*********************************************************************************************************************** |
| 27 | + * Includes |
| 28 | + **********************************************************************************************************************/ |
| 29 | + |
| 30 | +/* Register definitions, common services and error codes. */ |
| 31 | +#include "bsp_api.h" |
| 32 | +#include "r_transfer_api.h" |
| 33 | + |
| 34 | +/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ |
| 35 | +FSP_HEADER |
| 36 | + |
| 37 | +/********************************************************************************************************************** |
| 38 | + * Macro definitions |
| 39 | + **********************************************************************************************************************/ |
| 40 | + |
| 41 | +/********************************************************************************************************************** |
| 42 | + * Typedef definitions |
| 43 | + **********************************************************************************************************************/ |
| 44 | + |
| 45 | +/** Communication speed options */ |
| 46 | +typedef enum e_i2c_master_rate |
| 47 | +{ |
| 48 | + I2C_MASTER_RATE_STANDARD = 100000, ///< 100 kHz |
| 49 | + I2C_MASTER_RATE_FAST = 400000, ///< 400 kHz |
| 50 | + I2C_MASTER_RATE_FASTPLUS = 1000000 ///< 1 MHz |
| 51 | +} i2c_master_rate_t; |
| 52 | + |
| 53 | +/** Addressing mode options */ |
| 54 | +typedef enum e_i2c_master_addr_mode |
| 55 | +{ |
| 56 | + I2C_MASTER_ADDR_MODE_7BIT = 1, ///< Use 7-bit addressing mode |
| 57 | + I2C_MASTER_ADDR_MODE_10BIT = 2, ///< Use 10-bit addressing mode |
| 58 | +} i2c_master_addr_mode_t; |
| 59 | + |
| 60 | +/** Callback events */ |
| 61 | +typedef enum e_i2c_master_event |
| 62 | +{ |
| 63 | + I2C_MASTER_EVENT_ABORTED = 1, ///< A transfer was aborted |
| 64 | + I2C_MASTER_EVENT_RX_COMPLETE = 2, ///< A receive operation was completed successfully |
| 65 | + I2C_MASTER_EVENT_TX_COMPLETE = 3 ///< A transmit operation was completed successfully |
| 66 | +} i2c_master_event_t; |
| 67 | + |
| 68 | +/** I2C callback parameter definition */ |
| 69 | +typedef struct st_i2c_master_callback_args |
| 70 | +{ |
| 71 | + void const * p_context; ///< Pointer to user-provided context |
| 72 | + i2c_master_event_t event; ///< Event code |
| 73 | +} i2c_master_callback_args_t; |
| 74 | + |
| 75 | +/** I2C status indicators */ |
| 76 | +typedef struct st_i2c_master_status |
| 77 | +{ |
| 78 | + bool open; ///< True if driver is open |
| 79 | +} i2c_master_status_t; |
| 80 | + |
| 81 | +/** I2C configuration block */ |
| 82 | +typedef struct st_i2c_master_cfg |
| 83 | +{ |
| 84 | + /** Generic configuration */ |
| 85 | + uint8_t channel; ///< Identifier recognizable by implementation |
| 86 | + i2c_master_rate_t rate; ///< Device's maximum clock rate from enum i2c_rate_t |
| 87 | + uint32_t slave; ///< The address of the slave device |
| 88 | + i2c_master_addr_mode_t addr_mode; ///< Indicates how slave fields should be interpreted |
| 89 | + uint8_t ipl; ///< Interrupt priority level. Same for RXI, TXI, TEI and ERI. |
| 90 | + IRQn_Type rxi_irq; ///< Receive IRQ number |
| 91 | + IRQn_Type txi_irq; ///< Transmit IRQ number |
| 92 | + IRQn_Type tei_irq; ///< Transmit end IRQ number |
| 93 | + IRQn_Type eri_irq; ///< Error IRQ number |
| 94 | + |
| 95 | + /** DTC support */ |
| 96 | + transfer_instance_t const * p_transfer_tx; ///< DTC instance for I2C transmit.Set to NULL if unused. |
| 97 | + transfer_instance_t const * p_transfer_rx; ///< DTC instance for I2C receive. Set to NULL if unused. |
| 98 | + |
| 99 | + /** Parameters to control software behavior */ |
| 100 | + void (* p_callback)(i2c_master_callback_args_t * p_args); ///< Pointer to callback function |
| 101 | + void const * p_context; ///< Pointer to the user-provided context |
| 102 | + |
| 103 | + /** Implementation-specific configuration */ |
| 104 | + void const * p_extend; ///< Any configuration data needed by the hardware |
| 105 | +} i2c_master_cfg_t; |
| 106 | + |
| 107 | +/** I2C control block. Allocate an instance specific control block to pass into the I2C API calls. |
| 108 | + * @par Implemented as |
| 109 | + * - iic_master_instance_ctrl_t |
| 110 | + */ |
| 111 | +typedef void i2c_master_ctrl_t; |
| 112 | + |
| 113 | +/** Interface definition for I2C access as master */ |
| 114 | +typedef struct st_i2c_master_api |
| 115 | +{ |
| 116 | + /** Opens the I2C Master driver and initializes the hardware. |
| 117 | + * @par Implemented as |
| 118 | + * - @ref R_RIIC_MASTER_Open() |
| 119 | + * |
| 120 | + * @param[in] p_ctrl Pointer to control block. Must be declared by user. Elements are set here. |
| 121 | + * @param[in] p_cfg Pointer to configuration structure. |
| 122 | + */ |
| 123 | + fsp_err_t (* open)(i2c_master_ctrl_t * const p_ctrl, i2c_master_cfg_t const * const p_cfg); |
| 124 | + |
| 125 | + /** Performs a read operation on an I2C Master device. |
| 126 | + * @par Implemented as |
| 127 | + * - @ref R_RIIC_MASTER_Read() |
| 128 | + * |
| 129 | + * @param[in] p_ctrl Pointer to control block set in i2c_api_master_t::open call. |
| 130 | + * @param[in] p_dest Pointer to the location to store read data. |
| 131 | + * @param[in] bytes Number of bytes to read. |
| 132 | + * @param[in] restart Specify if the restart condition should be issued after reading. |
| 133 | + */ |
| 134 | + fsp_err_t (* read)(i2c_master_ctrl_t * const p_ctrl, uint8_t * const p_dest, uint32_t const bytes, |
| 135 | + bool const restart); |
| 136 | + |
| 137 | + /** Performs a write operation on an I2C Master device. |
| 138 | + * @par Implemented as |
| 139 | + * - @ref R_RIIC_MASTER_Write() |
| 140 | + * |
| 141 | + * @param[in] p_ctrl Pointer to control block set in i2c_api_master_t::open call. |
| 142 | + * @param[in] p_src Pointer to the location to get write data from. |
| 143 | + * @param[in] bytes Number of bytes to write. |
| 144 | + * @param[in] restart Specify if the restart condition should be issued after writing. |
| 145 | + */ |
| 146 | + fsp_err_t (* write)(i2c_master_ctrl_t * const p_ctrl, uint8_t * const p_src, uint32_t const bytes, |
| 147 | + bool const restart); |
| 148 | + |
| 149 | + /** Performs a reset of the peripheral. |
| 150 | + * @par Implemented as |
| 151 | + * - @ref R_RIIC_MASTER_Abort() |
| 152 | + * |
| 153 | + * @param[in] p_ctrl Pointer to control block set in i2c_api_master_t::open call. |
| 154 | + */ |
| 155 | + fsp_err_t (* abort)(i2c_master_ctrl_t * const p_ctrl); |
| 156 | + |
| 157 | + /** Sets address of the slave device without reconfiguring the bus. |
| 158 | + * @par Implemented as |
| 159 | + * - @ref R_RIIC_MASTER_SlaveAddressSet() |
| 160 | + * |
| 161 | + * @param[in] p_ctrl Pointer to control block set in i2c_api_master_t::open call. |
| 162 | + * @param[in] slave_address Address of the slave device. |
| 163 | + * @param[in] address_mode Addressing mode. |
| 164 | + */ |
| 165 | + fsp_err_t (* slaveAddressSet)(i2c_master_ctrl_t * const p_ctrl, uint32_t const slave, |
| 166 | + i2c_master_addr_mode_t const addr_mode); |
| 167 | + |
| 168 | + /** |
| 169 | + * Specify callback function and optional context pointer and working memory pointer. |
| 170 | + * @par Implemented as |
| 171 | + * - @ref R_RIIC_MASTER_CallbackSet() |
| 172 | + * |
| 173 | + * @param[in] p_ctrl Pointer to the RIIC Master control block. |
| 174 | + * @param[in] p_callback Callback function |
| 175 | + * @param[in] p_context Pointer to send to callback function |
| 176 | + * @param[in] p_working_memory Pointer to volatile memory where callback structure can be allocated. |
| 177 | + * Callback arguments allocated here are only valid during the callback. |
| 178 | + */ |
| 179 | + fsp_err_t (* callbackSet)(i2c_master_ctrl_t * const p_api_ctrl, void (* p_callback)(i2c_master_callback_args_t *), |
| 180 | + void const * const p_context, i2c_master_callback_args_t * const p_callback_memory); |
| 181 | + |
| 182 | + /** Gets the status of the configured I2C device. |
| 183 | + * @par Implemented as |
| 184 | + * - @ref R_RIIC_MASTER_StatusGet() |
| 185 | + * |
| 186 | + * @param[in] p_ctrl Pointer to the RIIC Master control block. |
| 187 | + * @param[out] p_status Pointer to store current status. |
| 188 | + */ |
| 189 | + fsp_err_t (* statusGet)(i2c_master_ctrl_t * const p_api_ctrl, i2c_master_status_t * p_status); |
| 190 | + |
| 191 | + /** Closes the driver and releases the I2C Master device. |
| 192 | + * @par Implemented as |
| 193 | + * - @ref R_RIIC_MASTER_Close() |
| 194 | + * |
| 195 | + * @param[in] p_ctrl Pointer to control block set in i2c_api_master_t::open call. |
| 196 | + */ |
| 197 | + fsp_err_t (* close)(i2c_master_ctrl_t * const p_ctrl); |
| 198 | +} i2c_master_api_t; |
| 199 | + |
| 200 | +/** This structure encompasses everything that is needed to use an instance of this interface. */ |
| 201 | +typedef struct st_i2c_master_instance |
| 202 | +{ |
| 203 | + i2c_master_ctrl_t * p_ctrl; ///< Pointer to the control structure for this instance |
| 204 | + i2c_master_cfg_t const * p_cfg; ///< Pointer to the configuration structure for this instance |
| 205 | + i2c_master_api_t const * p_api; ///< Pointer to the API structure for this instance |
| 206 | +} i2c_master_instance_t; |
| 207 | + |
| 208 | +/******************************************************************************************************************//** |
| 209 | + * @} (end addtogroup I2C_MASTER_API) |
| 210 | + *********************************************************************************************************************/ |
| 211 | + |
| 212 | +/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ |
| 213 | +FSP_FOOTER |
| 214 | + |
| 215 | +#endif |
0 commit comments