/** @file I2c Lib to control I2c controller. Copyright 2020 NXP SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef I2C_LIB_H__ #define I2C_LIB_H__ #include #include /** software reset of the entire I2C module. The module is reset and disabled. Status register fields (IBSR) are cleared. @param[in] Base Base Address of I2c controller's registers @return EFI_SUCCESS successfuly reset the I2c module **/ EFI_STATUS I2cReset ( IN UINTN Base ); /** Configure I2c bus to operate at a given speed @param[in] Base Base Address of I2c controller's registers @param[in] I2cBusClock Input clock to I2c controller @param[in] Speed speed to be configured for I2c bus @return EFI_SUCCESS successfuly setup the i2c bus **/ EFI_STATUS I2cInitialize ( IN UINTN Base, IN UINT64 I2cBusClock, IN UINT64 Speed ); /** Transfer data to/from I2c slave device @param[in] Base Base Address of I2c controller's registers @param[in] SlaveAddress Slave Address from which data is to be read @param[in] RequestPacket Pointer to an EFI_I2C_REQUEST_PACKET structure describing the I2C transaction @return EFI_SUCCESS successfuly transfer the data @return EFI_DEVICE_ERROR There was an error while transferring data through I2c bus @return EFI_NO_RESPONSE There was no Ack from i2c device @return EFI_TIMEOUT I2c Bus is busy @return EFI_NOT_READY I2c Bus Arbitration lost **/ EFI_STATUS I2cBusXfer ( IN UINTN Base, IN UINT32 SlaveAddress, IN EFI_I2C_REQUEST_PACKET *RequestPacket ); /** Read a register from I2c slave device. This API is wrapper around I2cBusXfer @param[in] Base Base Address of I2c controller's registers @param[in] SlaveAddress Slave Address from which register value is to be read @param[in] RegAddress Register Address in Slave's memory map @param[in] RegAddressWidthInBytes Number of bytes in RegAddress to send to I2c Slave for simple reads without any register, make this value = 0 (RegAddress is don't care in that case) @param[out] RegValue Value to be read from I2c slave's regiser @param[in] RegValueNumBytes Number of bytes to read from I2c slave register @return EFI_SUCCESS successfuly read the registers @return EFI_DEVICE_ERROR There was an error while transferring data through I2c bus @return EFI_NO_RESPONSE There was no Ack from i2c device @return EFI_TIMEOUT I2c Bus is busy @return EFI_NOT_READY I2c Bus Arbitration lost **/ EFI_STATUS I2cBusReadReg ( IN UINTN Base, IN UINT32 SlaveAddress, IN UINT64 RegAddress, IN UINT8 RegAddressWidthInBytes, OUT UINT8 *RegValue, IN UINT32 RegValueNumBytes ); #endif // I2C_LIB_H__