Signed-off-by: Pramod Kumar <pramod.kuma...@nxp.com> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com> --- Silicon/NXP/Library/GpioLib/GpioLib.inf | 39 +++++ Silicon/NXP/Include/Library/GpioLib.h | 110 +++++++++++++++ Silicon/NXP/Library/GpioLib/GpioLib.c | 242 ++++++++++++++++++++++++++++++++ 3 files changed, 391 insertions(+) create mode 100644 Silicon/NXP/Library/GpioLib/GpioLib.inf create mode 100644 Silicon/NXP/Include/Library/GpioLib.h create mode 100644 Silicon/NXP/Library/GpioLib/GpioLib.c
diff --git a/Silicon/NXP/Library/GpioLib/GpioLib.inf b/Silicon/NXP/Library/GpioLib/GpioLib.inf new file mode 100644 index 000000000000..7878d1d03db2 --- /dev/null +++ b/Silicon/NXP/Library/GpioLib/GpioLib.inf @@ -0,0 +1,39 @@ +/** @file + + Copyright 2020 NXP + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = GpioLib + FILE_GUID = addec2b8-d2e0-43c0-a277-41a8d42f3f4f + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = GpioLib + +[Sources.common] + GpioLib.c + +[LibraryClasses] + ArmLib + BaseMemoryLib + BaseLib + IoAccessLib + IoLib + +[Packages] + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/NXP/NxpQoriqLs.dec + +[Pcd] + gNxpQoriqLsTokenSpaceGuid.PcdNumGpioController + gNxpQoriqLsTokenSpaceGuid.PcdGpioModuleBaseAddress + gNxpQoriqLsTokenSpaceGuid.PcdGpioControllerOffset + +[FeaturePcd] + gNxpQoriqLsTokenSpaceGuid.PcdGpioControllerBigEndian diff --git a/Silicon/NXP/Include/Library/GpioLib.h b/Silicon/NXP/Include/Library/GpioLib.h new file mode 100644 index 000000000000..5821806226ee --- /dev/null +++ b/Silicon/NXP/Include/Library/GpioLib.h @@ -0,0 +1,110 @@ +/** @file + + Copyright 2020 NXP + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef GPIO_H__ +#define GPIO_H__ + +#include <Uefi.h> + +/* enum for GPIO number */ +typedef enum _GPIO_BLOCK { + GPIO1, + GPIO2, + GPIO3, + GPIO4, + GPIO_MAX +} GPIO_BLOCK; + +/* enum for GPIO direction */ +typedef enum _GPIO_DIRECTION { + INPUT, + OUTPUT +} GPIO_DIRECTION; + +/* enum for GPIO state */ +typedef enum _GPIO_STATE { + LOW, + HIGH +} GPIO_VAL; + +/** + SetDir Set GPIO direction as INPUT or OUTPUT + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] Dir GPIO Direction as INPUT or OUTPUT + + @retval EFI_SUCCESS + **/ +EFI_STATUS +SetDir ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN Dir + ); + +/** + GetDir Retrieve GPIO direction + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + + @retval GPIO Direction as INPUT or OUTPUT + **/ +UINT32 +GetDir ( + IN UINT8 Id, + IN UINT32 Bit + ); + + /** + GetData Retrieve GPIO Value + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + + @retval GPIO value as HIGH or LOW + **/ +UINT32 +GetData ( + IN UINT8 Id, + IN UINT32 Bit + ); + +/** + SetData Set GPIO data Value + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] Data GPIO data value to set + + @retval GPIO value as HIGH or LOW + **/ +EFI_STATUS +SetData ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN Data + ); + +/** + SetOpenDrain Set GPIO as Open drain + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] OpenDrain Set as open drain + + @retval EFI_SUCCESS + **/ +EFI_STATUS +SetOpenDrain ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN OpenDrain + ); + +#endif diff --git a/Silicon/NXP/Library/GpioLib/GpioLib.c b/Silicon/NXP/Library/GpioLib/GpioLib.c new file mode 100644 index 000000000000..33cc45c2152b --- /dev/null +++ b/Silicon/NXP/Library/GpioLib/GpioLib.c @@ -0,0 +1,242 @@ +/** @file + + Copyright 2020 NXP + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Library/GpioLib.h> +#include <Library/IoAccessLib.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseLib.h> + +STATIC MMIO_OPERATIONS *mGpioOps; + +/* Structure for GPIO Regsters */ +typedef struct GpioRegs { + UINT32 GpDir; + UINT32 GpOdr; + UINT32 GpData; + UINT32 GpIer; + UINT32 GpImr; + UINT32 GpIcr; +} GPIO_REGS; + +/** + GetBaseAddr GPIO controller Base Address + + @param[in] Id GPIO controller number + + @retval GPIO controller Base Address, if found + @retval NULL, if not a valid controller number + + **/ +STATIC +VOID * +GetBaseAddr ( + IN UINT8 Id + ) +{ + + UINTN GpioBaseAddr; + UINTN MaxGpioController; + + mGpioOps = GetMmioOperations (FeaturePcdGet (PcdGpioControllerBigEndian)); + + MaxGpioController = PcdGet32 (PcdNumGpioController); + + if (Id < MaxGpioController) { + GpioBaseAddr = PcdGet64 (PcdGpioModuleBaseAddress) + + (Id * PcdGet64 (PcdGpioControllerOffset)); + return (VOID *) GpioBaseAddr; + } + else { + DEBUG((DEBUG_ERROR, "Invalid Gpio Controller Id %d, Allowed Ids are %d-%d", + Id, GPIO1, MaxGpioController)); + return NULL; + } +} + +/** + GetBitMask: Return Bit Mask + + @param[in] Bit Bit to create bitmask + @retval Bitmask + + **/ + +STATIC +UINT32 +GetBitMask ( + IN UINT32 Bit + ) +{ + + if (!FeaturePcdGet (PcdGpioControllerBigEndian)) { + return (1 << Bit); + } else { + return (1 << (31 - Bit)); + } +} + + +/** + SetDir Set GPIO direction as INPUT or OUTPUT + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] Dir GPIO Direction as INPUT or OUTPUT + + @retval EFI_SUCCESS + **/ +EFI_STATUS +SetDir ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN Dir + ) +{ + GPIO_REGS *Regs; + UINT32 BitMask; + UINT32 Value; + + Regs = GetBaseAddr(Id); + BitMask = GetBitMask(Bit); + + Value = mGpioOps->Read32 ((UINTN)&Regs->GpDir); + + if (Dir) { + mGpioOps->Write32 ((UINTN)&Regs->GpDir, (Value | BitMask)); + } + else { + mGpioOps->Write32 ((UINTN)&Regs->GpDir, (Value & (~BitMask))); + } + + return EFI_SUCCESS; +} + +/** + GetDir Retrieve GPIO direction + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + + @retval GPIO Direction as INPUT or OUTPUT + **/ +UINT32 +GetDir ( + IN UINT8 Id, + IN UINT32 Bit + ) +{ + GPIO_REGS *Regs; + UINT32 Value; + UINT32 BitMask; + + Regs = GetBaseAddr (Id); + BitMask = GetBitMask(Bit); + + Value = mGpioOps->Read32 ((UINTN)&Regs->GpDir); + + return (Value & BitMask); +} + +/** + GetData Retrieve GPIO Value + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + + @retval GPIO value as HIGH or LOW + **/ +UINT32 +GetData ( + IN UINT8 Id, + IN UINT32 Bit + ) +{ + GPIO_REGS *Regs; + UINT32 Value; + UINT32 BitMask; + + Regs = (VOID *)GetBaseAddr (Id); + BitMask = GetBitMask(Bit); + + + Value = mGpioOps->Read32 ((UINTN)&Regs->GpData); + + if (Value & BitMask) { + return 1; + } else { + return 0; + } +} + +/** + SetData Set GPIO data Value + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] Data GPIO data value to set + + @retval GPIO value as HIGH or LOW + **/ +EFI_STATUS +SetData ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN Data + ) +{ + GPIO_REGS *Regs; + UINT32 BitMask; + UINT32 Value; + + Regs = GetBaseAddr (Id); + BitMask = GetBitMask(Bit); + + Value = mGpioOps->Read32 ((UINTN)&Regs->GpData); + + if (Data) { + mGpioOps->Write32 ((UINTN)&Regs->GpData, (Value | BitMask)); + } else { + mGpioOps->Write32 ((UINTN)&Regs->GpData, (Value & (~BitMask))); + } + + return EFI_SUCCESS; +} + +/** + SetOpenDrain Set GPIO as Open drain + + @param[in] Id GPIO controller number + @param[in] Bit GPIO number + @param[in] OpenDrain Set as open drain + + @retval EFI_SUCCESS + **/ +EFI_STATUS +SetOpenDrain ( + IN UINT8 Id, + IN UINT32 Bit, + IN BOOLEAN OpenDrain + ) +{ + GPIO_REGS *Regs; + UINT32 BitMask; + UINT32 Value; + + Regs = GetBaseAddr (Id); + BitMask = GetBitMask(Bit); + + Value = mGpioOps->Read32 ((UINTN)&Regs->GpOdr); + if (OpenDrain) { + mGpioOps->Write32 ((UINTN)&Regs->GpOdr, (Value | BitMask)); + } + else { + mGpioOps->Write32 ((UINTN)&Regs->GpOdr, (Value & (~BitMask))); + } + + return EFI_SUCCESS; +} -- 1.9.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#65266): https://edk2.groups.io/g/devel/message/65266 Mute This Topic: https://groups.io/mt/76861996/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-