From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: None (no SPF record) identity=mailfrom; client-ip=2a00:1450:4864:20::543; helo=mail-ed1-x543.google.com; envelope-from=pete@akeo.ie; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x543.google.com (mail-ed1-x543.google.com [IPv6:2a00:1450:4864:20::543]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 83F07211AE8A9 for ; Tue, 29 Jan 2019 08:27:15 -0800 (PST) Received: by mail-ed1-x543.google.com with SMTP id f23so16467576edb.3 for ; Tue, 29 Jan 2019 08:27:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mZsiZqmuxx20uBYFHgor4m41lTNbVpjVR06P+VrN6Qk=; b=b/kKH88TZA9hIJN7cEcvKIu7p/IVILiIdyqhm8Bc7YYKpVDAWvjVCu+QfPQg1L/1Zb DjFn0BESrK2LLWAM/IOIwcyInv+skJ8e96W46X25xPgq+W2KQSPOhAd0C4ZayqPwplqo c6mh9lHFFEVd5lkzpDbkpuckeUG0oaO3eomBdZ0kzkYyY+ELBtEAI3OxZOA+YBPWaJ/1 kadDgS1nt/GSv5eW34wX1WI7mIPyiD6ALLFOXtlrCWLguXfF8XOmiAON1KzjYPo5SDwc kQ5lnIDXr4C/BCZoqt/bF1KgyAhW15ACBN2uaW6jNMlcjcd/QQiwr1SHgMMDWb5VHmB1 D6rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mZsiZqmuxx20uBYFHgor4m41lTNbVpjVR06P+VrN6Qk=; b=GKbHPupePaxurtkRaFwJwVqjdjNkzDVpiYOvu7xjuwJhnO2cimVoTFyii9EzUZxa9Z i3q88ozxqTFioBocsLP+jhSxqBa6Zeg1SLEqxkZPxLX83wHFoNVXi3ziIHV++qa0d7Hh dc2LXAi5z/F7sW4X99/9EGTffkYabrOlk+yldy7VfWAWcSR0Vw+MoIzqyclYexhVqzl5 FZgYnfcq4zJSGJgc2reAjpn5DMVCHllP04AxATBymIZ49UDdhH4mzkTkf3cFDwMhUDL3 +hF+b+BRJJyWZlyKWlGLU/89kuAL7puGxqOGl7IiyikSu+eke/cz7es8rlaINPtDsa3+ 06gQ== X-Gm-Message-State: AJcUukcV0ZL8ZmTTZvqUe3JCh9r6ryych2pkOCuNL4d1ggghn4iBfPHt Em7NmOYm4ZsTWpBlf6jjOYuw2FaIfdc= X-Google-Smtp-Source: ALg8bN65U92ra50t9duGL7qltNwNlpQ3/WLSJPNxyLqX1AQ5QXw6mcrOFbmBI0Nc0LH8gK1GyQnwUg== X-Received: by 2002:a50:92e7:: with SMTP id l36mr25744611eda.182.1548779233646; Tue, 29 Jan 2019 08:27:13 -0800 (PST) Received: from localhost.localdomain ([84.203.95.186]) by smtp.gmail.com with ESMTPSA id p16-v6sm8303056eju.73.2019.01.29.08.27.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Jan 2019 08:27:11 -0800 (PST) From: Pete Batard To: edk2-devel@lists.01.org Date: Tue, 29 Jan 2019 16:26:34 +0000 Message-Id: <20190129162655.3800-3-pete@akeo.ie> X-Mailer: git-send-email 2.17.0.windows.1 In-Reply-To: <20190129162655.3800-1-pete@akeo.ie> References: <20190129162655.3800-1-pete@akeo.ie> Subject: [PATCH v4 edk2-platforms 02/23] Silicon/Broadcom/Bcm283x: Add GpioLib X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 X-List-Received-Date: Tue, 29 Jan 2019 16:27:16 -0000 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Pete Batard --- 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 + * 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 + * + * 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 + +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 + * + * 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 +#include +#include +#include +#include +#include +#include + +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 +# +# 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