Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Pete Batard <p...@akeo.ie> --- Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Gpio.h | 49 +++++++++++ Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h | 33 ++++++++ Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c | 89 ++++++++++++++++++++ Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf | 39 +++++++++ 4 files changed, 210 insertions(+)
diff --git a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Gpio.h b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Gpio.h new file mode 100644 index 000000000000..5fc43ddaa27b --- /dev/null +++ b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Gpio.h @@ -0,0 +1,49 @@ +/** @file + * + * Copyright (c) 2018, Andrei Warkentin <andrey.warken...@gmail.com> + * Copyright (c) Microsoft Corporation. All rights reserved. + * + * 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 __BCM2836_GPIO_H__ +#define __BCM2836_GPIO_H__ + +#define GPIO_BASE_ADDRESS (BCM2836_SOC_REGISTERS + 0x00200000) + +#define GPIO_GPFSEL0 (GPIO_BASE_ADDRESS + 0x00) +#define GPIO_GPFSEL1 (GPIO_BASE_ADDRESS + 0x04) +#define GPIO_GPFSEL2 (GPIO_BASE_ADDRESS + 0x08) +#define GPIO_GPFSEL3 (GPIO_BASE_ADDRESS + 0x0C) +#define GPIO_GPFSEL4 (GPIO_BASE_ADDRESS + 0x10) +#define GPIO_GPFSEL5 (GPIO_BASE_ADDRESS + 0x14) + +#define GPIO_GPCLR0 (GPIO_BASE_ADDRESS + 0x28) +#define GPIO_GPCLR1 (GPIO_BASE_ADDRESS + 0x2C) + +#define GPIO_GPSET0 (GPIO_BASE_ADDRESS + 0x1C) +#define GPIO_GPSET1 (GPIO_BASE_ADDRESS + 0x20) + +#define GPIO_FSEL_INPUT 0x0 +#define GPIO_FSEL_OUTPUT 0x1 +#define GPIO_FSEL_ALT0 0x4 +#define GPIO_FSEL_ALT1 0x5 +#define GPIO_FSEL_ALT2 0x6 +#define GPIO_FSEL_ALT3 0x7 +#define GPIO_FSEL_ALT4 0x3 +#define GPIO_FSEL_ALT5 0x2 + +#define GPIO_FSEL_PINS_PER_REGISTER 10 +#define GPIO_FSEL_BITS_PER_PIN 3 +#define GPIO_FSEL_MASK ((1 << GPIO_FSEL_BITS_PER_PIN) - 1) + +#define GPIO_PINS 54 + +#endif /* __BCM2836_GPIO_H__ */ diff --git a/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h b/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h new file mode 100644 index 000000000000..c3e1fc21bf8d --- /dev/null +++ b/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h @@ -0,0 +1,33 @@ +/** @file + * + * GPIO manipulation. + * + * Copyright (c) 2018, Andrei Warkentin <andrey.warken...@gmail.com> + * + * 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 __GPIO_LIB__ +#define __GPIO_LIB__ + +#include <IndustryStandard/Bcm2836Gpio.h> + +VOID +GpioPinFuncSet ( + IN UINTN Pin, + IN UINTN Function + ); + +UINTN +GpioPinFuncGet ( + IN UINTN Pin + ); + +#endif /* __GPIO_LIB__ */ diff --git a/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c b/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c new file mode 100644 index 000000000000..8cf560e4fcc5 --- /dev/null +++ b/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c @@ -0,0 +1,89 @@ +/** @file + * + * GPIO manipulation. + * + * Copyright (c) 2018, Andrei Warkentin <andrey.warken...@gmail.com> + * + * 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. + * + **/ + +#include <Uefi.h> +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/GpioLib.h> +#include <IndustryStandard/Bcm2836.h> +#include <IndustryStandard/Bcm2836Gpio.h> + +STATIC +VOID +GpioFSELModify ( + IN UINTN RegIndex, + IN UINT32 ModifyMask, + IN UINT32 FunctionMask + ) +{ + UINT32 Val; + EFI_PHYSICAL_ADDRESS Reg; + + Reg = RegIndex * sizeof (UINT32) + GPIO_GPFSEL0; + + ASSERT (Reg <= GPIO_GPFSEL5); + ASSERT ((~ModifyMask & FunctionMask) == 0); + + Val = MmioRead32 (Reg); + Val &= ~ModifyMask; + Val |= FunctionMask; + MmioWrite32 (Reg, Val); +} + +VOID +GpioPinFuncSet ( + IN UINTN Pin, + IN UINTN Function + ) +{ + UINTN RegIndex; + UINTN SelIndex; + UINT32 ModifyMask; + UINT32 FunctionMask; + + ASSERT (Pin < GPIO_PINS); + ASSERT (Function <= GPIO_FSEL_MASK); + + RegIndex = Pin / 10; + SelIndex = Pin % 10; + + ModifyMask = GPIO_FSEL_MASK << (SelIndex * GPIO_FSEL_BITS_PER_PIN); + FunctionMask = Function << (SelIndex * GPIO_FSEL_BITS_PER_PIN); + GpioFSELModify (RegIndex, ModifyMask, FunctionMask); +} + +UINTN +GpioPinFuncGet ( + IN UINTN Pin + ) +{ + UINT32 Val; + UINTN RegIndex; + UINTN SelIndex; + EFI_PHYSICAL_ADDRESS Reg; + + ASSERT (Pin < GPIO_PINS); + + RegIndex = Pin / 10; + SelIndex = Pin % 10; + Reg = RegIndex * sizeof (UINT32) + GPIO_GPFSEL0; + + Val = MmioRead32 (Reg); + Val >>= SelIndex * GPIO_FSEL_BITS_PER_PIN; + Val &= GPIO_FSEL_MASK; + return Val; +} diff --git a/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf b/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf new file mode 100644 index 000000000000..68ebe44e3d1c --- /dev/null +++ b/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf @@ -0,0 +1,39 @@ +#/** @file +# +# Manipulate GPIOs. +# +# Copyright (c) 2018, Andrei Warkentin <andrey.warken...@gmail.com> +# +# 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. +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = GpioLib + FILE_GUID = B9F59B6B-B105-41C7-8F5A-2C60DD7FD7AB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = GpioLib + +[Sources] + GpioLib.c + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + Silicon/Broadcom/Bcm283x/Bcm283x.dec + +[LibraryClasses] + BaseLib + DebugLib + IoLib + +[Guids] -- 2.17.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel