mirror of https://github.com/acidanthera/audk.git
221 lines
6.2 KiB
C
221 lines
6.2 KiB
C
|
/** @file
|
||
|
Provides definition of entry point to the common I2C module that produces
|
||
|
common I2C Controller functions used by I2C library services.
|
||
|
|
||
|
|
||
|
Copyright (c) 2013-2015 Intel Corporation.
|
||
|
|
||
|
This program and the accompanying materials
|
||
|
are licensed and made available under the terms and conditions of the BSD License
|
||
|
which accompanies this distribution. The full text of the license may be found at
|
||
|
http://opensource.org/licenses/bsd-license.php
|
||
|
|
||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||
|
|
||
|
**/
|
||
|
|
||
|
|
||
|
#ifndef _I2CCOMMON_H_
|
||
|
#define _I2CCOMMON_H_
|
||
|
|
||
|
#include <Uefi.h>
|
||
|
#include <Base.h>
|
||
|
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/TimerLib.h>
|
||
|
#include <Library/I2cLib.h>
|
||
|
#include <IohAccess.h>
|
||
|
#include <IohCommonDefinitions.h>
|
||
|
#include "I2cRegs.h"
|
||
|
|
||
|
//
|
||
|
// Constants that define I2C Controller timeout and max. polling time.
|
||
|
//
|
||
|
#define MAX_T_POLL_COUNT 100
|
||
|
#define TI2C_POLL 25 // microseconds
|
||
|
#define MAX_STOP_DET_POLL_COUNT ((1000 * 1000) / TI2C_POLL) // Extreme for expected Stop detect.
|
||
|
|
||
|
/**
|
||
|
The GetI2CIoPortBaseAddress() function gets IO port base address of I2C Controller.
|
||
|
|
||
|
Always reads PCI configuration space to get MMIO base address of I2C Controller.
|
||
|
|
||
|
@return The IO port base address of I2C controller.
|
||
|
|
||
|
**/
|
||
|
UINTN
|
||
|
GetI2CIoPortBaseAddress (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The EnableI2CMmioSpace() function enables access to I2C MMIO space.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
EnableI2CMmioSpace (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The DisableI2CController() functions disables I2C Controller.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
DisableI2CController (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The EnableI2CController() function enables the I2C Controller.
|
||
|
|
||
|
**/
|
||
|
VOID
|
||
|
EnableI2CController (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
The WaitForStopDet() function waits until I2C STOP Condition occurs,
|
||
|
indicating transfer completion.
|
||
|
|
||
|
@retval EFI_SUCCESS Stop detected.
|
||
|
@retval EFI_TIMEOUT Timeout while waiting for stop condition.
|
||
|
@retval EFI_ABORTED Tx abort signaled in HW status register.
|
||
|
@retval EFI_DEVICE_ERROR Tx or Rx overflow detected.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
WaitForStopDet (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
The InitializeInternal() function initialises internal I2C Controller
|
||
|
register values that are commonly required for I2C Write and Read transfers.
|
||
|
|
||
|
@param AddrMode I2C Addressing Mode: 7-bit or 10-bit address.
|
||
|
|
||
|
@retval EFI_SUCCESS I2C Operation completed successfully.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
InitializeInternal (
|
||
|
IN EFI_I2C_ADDR_MODE AddrMode
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
The WriteByte() function provides a standard way to execute a
|
||
|
standard single byte write to an IC2 device (without accessing
|
||
|
sub-addresses), as defined in the I2C Specification.
|
||
|
|
||
|
@param I2CAddress I2C Slave device address
|
||
|
@param Value The 8-bit value to write.
|
||
|
|
||
|
@retval EFI_SUCCESS Transfer success.
|
||
|
@retval EFI_UNSUPPORTED Unsupported input param.
|
||
|
@retval EFI_TIMEOUT Timeout while waiting xfer.
|
||
|
@retval EFI_ABORTED Controller aborted xfer.
|
||
|
@retval EFI_DEVICE_ERROR Device error detected by controller.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
WriteByte (
|
||
|
IN UINTN I2CAddress,
|
||
|
IN UINT8 Value
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
The ReadByte() function provides a standard way to execute a
|
||
|
standard single byte read to an IC2 device (without accessing
|
||
|
sub-addresses), as defined in the I2C Specification.
|
||
|
|
||
|
@param I2CAddress I2C Slave device address
|
||
|
@param ReturnDataPtr Pointer to location to receive read byte.
|
||
|
|
||
|
@retval EFI_SUCCESS Transfer success.
|
||
|
@retval EFI_UNSUPPORTED Unsupported input param.
|
||
|
@retval EFI_TIMEOUT Timeout while waiting xfer.
|
||
|
@retval EFI_ABORTED Controller aborted xfer.
|
||
|
@retval EFI_DEVICE_ERROR Device error detected by controller.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ReadByte (
|
||
|
IN UINTN I2CAddress,
|
||
|
OUT UINT8 *ReturnDataPtr
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
The WriteMultipleByte() function provides a standard way to execute
|
||
|
multiple byte writes to an IC2 device (e.g. when accessing sub-addresses or
|
||
|
when writing block of data), as defined in the I2C Specification.
|
||
|
|
||
|
@param I2CAddress The I2C slave address of the device
|
||
|
with which to communicate.
|
||
|
|
||
|
@param WriteBuffer Contains the value of byte to be written to the
|
||
|
I2C slave device.
|
||
|
|
||
|
@param Length No. of bytes to be written.
|
||
|
|
||
|
@retval EFI_SUCCESS Transfer success.
|
||
|
@retval EFI_UNSUPPORTED Unsupported input param.
|
||
|
@retval EFI_TIMEOUT Timeout while waiting xfer.
|
||
|
@retval EFI_ABORTED Tx abort signaled in HW status register.
|
||
|
@retval EFI_DEVICE_ERROR Tx overflow detected.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
WriteMultipleByte (
|
||
|
IN UINTN I2CAddress,
|
||
|
IN UINT8 *WriteBuffer,
|
||
|
IN UINTN Length
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
|
||
|
The ReadMultipleByte() function provides a standard way to execute
|
||
|
multiple byte writes to an IC2 device (e.g. when accessing sub-addresses or
|
||
|
when reading block of data), as defined in the I2C Specification (I2C combined
|
||
|
write/read protocol).
|
||
|
|
||
|
@param I2CAddress The I2C slave address of the device
|
||
|
with which to communicate.
|
||
|
|
||
|
@param Buffer Contains the value of byte data written or read from the
|
||
|
I2C slave device.
|
||
|
|
||
|
@param WriteLength No. of bytes to be written. In this case data
|
||
|
written typically contains sub-address or sub-addresses
|
||
|
in Hi-Lo format, that need to be read (I2C combined
|
||
|
write/read protocol).
|
||
|
|
||
|
@param ReadLength No. of bytes to be read from I2C slave device.
|
||
|
|
||
|
@retval EFI_SUCCESS Transfer success.
|
||
|
@retval EFI_UNSUPPORTED Unsupported input param.
|
||
|
@retval EFI_TIMEOUT Timeout while waiting xfer.
|
||
|
@retval EFI_ABORTED Tx abort signaled in HW status register.
|
||
|
@retval EFI_DEVICE_ERROR Rx underflow or Rx/Tx overflow detected.
|
||
|
|
||
|
**/
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ReadMultipleByte (
|
||
|
IN UINTN I2CAddress,
|
||
|
IN OUT UINT8 *Buffer,
|
||
|
IN UINTN WriteLength,
|
||
|
IN UINTN ReadLength
|
||
|
);
|
||
|
|
||
|
#endif
|