/* * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ /** * @addtogroup I2C * @{ * * @brief Provides standard Inter-Integrated Circuit (I2C) interfaces. * * This module allows a driver to perform operations on an I2C controller for accessing devices on the I2C bus, * including creating and destroying I2C controller handles as well as reading and writing data. * * @since 1.0 */ /** * @file i2c_if.h * * @brief Declares the standard I2C interface functions. * * @since 1.0 */ #ifndef I2C_IF_H #define I2C_IF_H #include "platform_if.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ /** * @brief Defines the I2C transfer message used during custom transfers. * * @attention This structure does not limit the data transfer length specified by len. * The specific I2C controller determines the maximum length allowed. \n * The device address addr indicates the original device address and does not need to * contain the read/write flag bit. * * @since 1.0 */ struct I2cMsg { /** Address of the I2C device */ uint16_t addr; /** Address of the buffer for storing transferred data */ uint8_t *buf; /** Length of the transferred data */ uint16_t len; /** * Transfer Mode Flag | Description * ------------| ----------------------- * I2C_FLAG_READ | Read flag * I2C_FLAG_ADDR_10BIT | 10-bit addressing flag * I2C_FLAG_READ_NO_ACK | No-ACK read flag * I2C_FLAG_IGNORE_NO_ACK | Ignoring no-ACK flag * I2C_FLAG_NO_START | No START condition flag * I2C_FLAG_STOP | STOP condition flag */ uint16_t flags; }; /** * @brief Enumerates flags used for transferring I2C messages. * * Multiple flags can be used to jointly control a single I2C message transfer. * If a bit is set to 1, the corresponding feature is enabled. If a bit is set to 0, * the corresponding feature is disabled. * * @since 1.0 */ enum I2cFlag { /** Read flag. The value 1 indicates the read operation, and 0 indicates the write operation. */ I2C_FLAG_READ = (0x1 << 0), /** 10-bit addressing flag. The value 1 indicates that a 10-bit address is used. */ I2C_FLAG_ADDR_10BIT = (0x1 << 4), /** Non-ACK read flag. The value 1 indicates that no ACK signal is sent during the read process. */ I2C_FLAG_READ_NO_ACK = (0x1 << 11), /** Ignoring no-ACK flag. The value 1 indicates that the non-ACK signal is ignored. */ I2C_FLAG_IGNORE_NO_ACK = (0x1 << 12), /** * No START condition flag. The value 1 indicates that there is no START condition for the message * transfer. */ I2C_FLAG_NO_START = (0x1 << 14), /** STOP condition flag. The value 1 indicates that the current transfer ends with a STOP condition. */ I2C_FLAG_STOP = (0x1 << 15), }; /** * @brief Obtains the handle of an I2C controller. * * You must call this function before accessing the I2C bus. * * @param number Indicates the I2C controller ID. * * @return Returns the pointer to the {@link DevHandle} of the I2C controller if the operation is successful; * returns NULL otherwise. * @since 1.0 */ DevHandle I2cOpen(int16_t number); /** * @brief Releases the handle of an I2C controller. * * If you no longer need to access the I2C controller, you should call this function to close its handle so as * to release unused memory resources. * * @param handle Indicates the pointer to the device handle of the I2C controller. * * @since 1.0 */ void I2cClose(DevHandle handle); /** * @brief Launches a custom transfer to an I2C device. * * @param handle Indicates the pointer to the device handle of the I2C controller obtained via {@link I2cOpen}. * @param msgs Indicates the pointer to the I2C transfer message structure array. * @param count Indicates the length of the message structure array. * * @return Returns the number of transferred message structures if the operation is successful; * returns a negative value otherwise. * @see I2cMsg * @attention This function does not limit the number of message structures specified by count or the data * length of each message structure. The specific I2C controller determines the maximum number and data length allowed. * * @since 1.0 */ int32_t I2cTransfer(DevHandle handle, struct I2cMsg *msgs, int16_t count); /** * @brief Enumerates I2C I/O commands. * * @since 1.0 */ enum I2cIoCmd { I2C_IO_TRANSFER = 0, /**< Execute one or more I2C messages. */ I2C_IO_OPEN = 1, /**< Open the I2C device. */ I2C_IO_CLOSE = 2, /**< Close the I2C device. */ }; #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* I2C_IF_H */ /** @} */