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::541; helo=mail-ed1-x541.google.com; envelope-from=pete@akeo.ie; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) (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 718E82194D387 for ; Tue, 5 Feb 2019 08:25:54 -0800 (PST) Received: by mail-ed1-x541.google.com with SMTP id f9so3327078eds.10 for ; Tue, 05 Feb 2019 08:25:54 -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=1eUR6MfyyYe6XHT/o7/q/AELp5DfUWu/sH8uBJDl0KA=; b=gVoaWK+1N3iJwlwe/oMItxT7v8QoA/0kSWSZ1xfVqzhq+U/R1tFGeD1n2uRFotRu6i W2Ucyr0527igd5LaPhwgtIpz6eI1OhnMv/zx8U0pNd54sDDBfz+U6iz9kd5DFm2J7i+7 wZ5joUD+BbDf/p3DS6Q2CEpm1Io9+zsokG457ybNZksCBSXHL2CCWTzkGCRe0zD0Oc+s G6ytuxAIvrvVQlZRvdN71YzMqsVvHT3k60pwJV9CX+hYmQtRJ1AyHmVYG6xxJJyGIbKc PP4lrQR3RwvDfzbmtgz4mDosrd0DAbkeZwesc6PtWf9VcLihoVXYD9kD1k1ASr9VUjWc WMZQ== 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=1eUR6MfyyYe6XHT/o7/q/AELp5DfUWu/sH8uBJDl0KA=; b=resyzCJEgCX4rL9CGD8zcj/ff/Kk35Hm9CarkSwovAq7oFPFprbIZUG6+fx0qmX6NQ OvOUW2PTxYb+rtHA7qqavRVWRNhqSaro8wZjhp7SRYehY/IvIf8+kRZS0D5FXLNiG4cK cmAxgXr8OSVroxaUgeb5Dn95YEXR2i7rfkt6CXYxzO5VNQ2q0Dsh6SJI6UjpMw+mtYwZ 0dcEU3bAOGAloywJTynUMIHiFEHviRrzd9bdDUJdNT5BubSBlwrHuQ5YzNHXrfttD7n5 u92Cd/ZoWBGVGnk1mdg3JTr30+eiLp3IwU0376/dG29dRQg0hjX0FGXrXUsVnLP3xR0W sQEQ== X-Gm-Message-State: AHQUAuYmgfnZHSW8uesNPYHNm0tFaDl+fLpYX8yfLhYtqWg3mJfHSssH DIPRKieOCdTV04F4Onqte0AcjhKsAIA= X-Google-Smtp-Source: AHgI3IasXVFYs0m+3iSGy4hd9ayNi4J9pwAGXcm6uKmD92PoQJGGKLjEyjsgrp2ZPKyqtYYSHhu2ng== X-Received: by 2002:a50:9106:: with SMTP id e6mr4440873eda.148.1549383952659; Tue, 05 Feb 2019 08:25:52 -0800 (PST) Received: from localhost.localdomain ([84.203.58.139]) by smtp.gmail.com with ESMTPSA id j16sm3191430ejq.59.2019.02.05.08.25.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Feb 2019 08:25:51 -0800 (PST) From: Pete Batard To: edk2-devel@lists.01.org Date: Tue, 5 Feb 2019 16:25:17 +0000 Message-Id: <20190205162537.6472-3-pete@akeo.ie> X-Mailer: git-send-email 2.17.0.windows.1 In-Reply-To: <20190205162537.6472-1-pete@akeo.ie> References: <20190205162537.6472-1-pete@akeo.ie> Subject: [PATCH v5 edk2-platforms 02/22] 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, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 X-List-Received-Date: Tue, 05 Feb 2019 16:25:55 -0000 This library is meant to be used by Bcm283x-based platforms, such as the Raspberry Pi, to control the GPIO port pins on said platform. 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