From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.41.60; helo=nam03-dm3-obe.outbound.protection.outlook.com; envelope-from=vabhav.sharma@nxp.com; receiver=edk2-devel@lists.01.org Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0060.outbound.protection.outlook.com [104.47.41.60]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 46AEF2194BB23 for ; Fri, 1 Dec 2017 08:11:38 -0800 (PST) Received: from MWHPR03CA0003.namprd03.prod.outlook.com (10.175.133.141) by DM5PR03MB2699.namprd03.prod.outlook.com (10.168.197.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.282.5; Fri, 1 Dec 2017 16:16:02 +0000 Received: from BY2FFO11FD048.protection.gbl (2a01:111:f400:7c0c::170) by MWHPR03CA0003.outlook.office365.com (2603:10b6:300:117::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.282.5 via Frontend Transport; Fri, 1 Dec 2017 16:16:02 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD048.mail.protection.outlook.com (10.1.15.176) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.239.4 via Frontend Transport; Fri, 1 Dec 2017 16:16:02 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net ([10.232.132.56]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vB1GFp1q007956; Fri, 1 Dec 2017 09:15:58 -0700 From: Vabhav To: , , , Date: Fri, 1 Dec 2017 09:44:18 +0530 Message-ID: <1512101660-11714-3-git-send-email-vabhav.sharma@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1512101660-11714-1-git-send-email-vabhav.sharma@nxp.com> References: <1512101660-11714-1-git-send-email-vabhav.sharma@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131566185626226458; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(7966004)(346002)(39380400002)(39860400002)(376002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(356003)(8676002)(305945005)(8936002)(81156014)(5660300001)(85426001)(54906003)(110136005)(68736007)(50226002)(48376002)(36756003)(16586007)(104016004)(47776003)(316002)(97736004)(76176011)(2906002)(2201001)(51416003)(81166006)(8656006)(498600001)(4326008)(50466002)(966005)(86362001)(189998001)(6306002)(77096006)(53376002)(53936002)(33646002)(106466001)(6666003)(2950100002)(105606002)(16799955002)(15188155005)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2699; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD048; 1:DRNfIn1LjWjA28RVI3WLgWSPPXz1QDZKpR6e6NDitl0RMXqV14l14t0H/zjoMsjvEaFByuOJOWU8CNsRP0JiJfYUw2cA7AZUteSDWwfNDvEjtmzeiPDM4yJ2zlHHFxx9 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7cb9b16c-0a16-4cee-edbd-08d538d6d128 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603286); SRVR:DM5PR03MB2699; X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2699; 3:JyXi8CWam8xS+3RPdmfkpJwRh2uSmGB+hVRKZe9OV0/IGYMYQ8IBtxbNKgrypmdJAPKSYFd/h5R+IP32YN3pxqphH52oEUCaoS/YFb0bKIosuW+N7kJtoYjOFKqtrpLeJvVqAOq2QGOc1YDH/Db8YjN4V8XunS6VmPMR+/D3BBmNpnjo2GLGPumOWuIo6BD9omG7TAXNNLERYrw5AJ++tJpaZPPEgts8tYfCadj2xSBSSGL5e4hhAiKiQRpdUBpLF5lLQ4uU7gfZ92RfWTqZqmSl7ndJD+cOCZ/akSq/MUuce1qEo6ws2++ZHPObfryd7ia7i+9XnM1KOGgaw5v8+uo5GhSdmAqX/k9j7eIpSWc=; 25:y3WKeFOonFMxQDUPN2o/n2g1+YdoVElRupSO2AUfUVhl/wCFJPWs1osYvmKAl2pCROVPZeupLuPMH99RNtqGo7iwmm43PKLPCPN8mUrDVRJbIZ4E5/WW9ikAXOsVzOKOHTgrz/vqPkpuLxUYpppgLPEiLY7v/SIFILkdPRQdSUioztCgcJH/DmPr59NqPHPUpCUSvmjRk766dQzj3nLooYvxSsdJn5BqwUHHUxL3W8DukPi/xZZIf6ygdS/pJV6ljjzjEaLAlKl4R+SOY/XFt2+9z4E65ypdDeK88LA2RLaJJ0dZw3CEf8h2CEtgxBLbFIZ9XlxljmGs0OKNDU/Wyw== X-MS-TrafficTypeDiagnostic: DM5PR03MB2699: X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2699; 31:S3ddpJxFBhogP12lgTwWzJKUrrGJ6SjDQ7fuT98UyM9FwKgCERyXzMsknPA0rhTyn1ZMeclnvEfCDWQaqHFrL7hM2W6Lx3w66mhRurNkkXizoPSq8Cn5V1wj8JUq5ezFEnsLTXIey3zDLhTMvHpdoxzDgScrmnYWkAh4jh092zer0vpzSweygoOahSG5NZpBGMct4adCxUo/o8s0ITAx4mORaYLmkTZBu7I9u9YGYic=; 4:5KifsGfPTZ5kvMftVri2gPKEFAWnLoRmRKZVjyzSad+29iNNdqBXpF0cvTbXgOl5JDfp3Qkmsbr8KRr2xNaZxr+eWdL5hXdmrmO/Hr9i8/2wiJlj/HtU5i1gXSONTtKfGnVe0xOkg3/zLrBS3B5VZmFYz+dF+Vm4KBcg7x6OppkNiYI2Y1ZMqXmVSJrtSvZoh27Zl6EAGnur/XYiMsqJcNYNKr8r0wRyatlPvwKISmR/birapImrTqBXKFpcBinvi7sMSF4Ds9EVe958qHS+G3Fbu8MLqebkeCSVca2dMaRYQxLJyBaAqvp2lKANaIx2sV9e3udGZBI17xLBNj2cAXdJw9a9MYsBy1DmbMcm32npHkdkMbURohKkKNpx05So X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(788757137089)(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(3231022)(6055026)(6096035)(20161123563025)(20161123561025)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(20161123565025)(20161123556025)(20161123559100)(201708071742011); SRVR:DM5PR03MB2699; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:DM5PR03MB2699; X-Forefront-PRVS: 05087F0C24 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR03MB2699; 23:X0TH1qQfLB5fkWfA9XM/VQgDwTJXEl/4JsLvLsM2N?= =?us-ascii?Q?1QLTLjYpFSUj9IzrerODsqhAq7y7yxNDc06646W+AB6lGs0zVw952jgRkwfn?= =?us-ascii?Q?mQwj0occBNB9kH2fnVSfY0gDPjBBVmXo2orH00LtdgOMtbD8OFx4cGhKKOPa?= =?us-ascii?Q?3NCoKJ3DW0CJAmh8rERHKHKjA84OC70fFLB8+2CxAW67oWWi475FG6vmAIXF?= =?us-ascii?Q?e04+oLP8UYp7+42kDAQGLRA0g53Hh4ZF1mKELONMxlGN6u87b+HdFFQIzViV?= =?us-ascii?Q?u2Uig6P+KyL6V45J4WSMtU2kSqybadg1ZqNfwAtDh1KfAGcJPTAZ6Fl7HKly?= =?us-ascii?Q?fdRDhJ6IblkjKxBLeE/0eJhn3G7/39r9Zn4Nypj7TSFD1GRbFZ3oTwEO6xtx?= =?us-ascii?Q?+p9sZ1va1yLOl6m5Ko5Rp7SsBM2adueu/Yq4odm9zVcb1/iB9kouaCVmgTZU?= =?us-ascii?Q?w0SAPBVqjmlGf654c36x4gAdRdU3OsC1Tj4Fx4L91ib46SPCa2HpmWV5vVmy?= =?us-ascii?Q?XYzT3l+gRrvJl69Aj+wgwesiT/0HFISxZa/taKXhTDoy5Au2NxUQTlJnGCWy?= =?us-ascii?Q?/AAvgB5I78XTsgBkllr4uwTQkaRnui+/4HHtmx2bxBQzihRsMa/v7mWTTnTR?= =?us-ascii?Q?aniNbXqnqqnVBO7EypR3InC5+Jg60dBO0GFDepS91ZzHhwa6JMkq42qOuh6T?= =?us-ascii?Q?ZcZzORdni0QfdJF7pUv+KeoJqcx2nM9XtIxn+kgNrvCM6zOYhEK/+iBDQIpQ?= =?us-ascii?Q?8JRfvKt9SVT8wV/4oGovK/D2Ag4rAV4xOc3SeTc9v2FcOs1KNupCC0iaOS7z?= =?us-ascii?Q?PfR+1Sh+CcIJimxffbYBQDgx7IPfmR/tBTv3PCWhAg0n/b0Bk3D+k10Jo77F?= =?us-ascii?Q?lU2pVAlrrzKoOlG2hRT+h1VCFxGg1Vv/U+ySJ289sZ8LufVkiJE19zE69xJc?= =?us-ascii?Q?XH8fdClw0kupaocDioCxQPS0NIzdUJiY70es+eludjMJIrbbQcJKyDPFc/R9?= =?us-ascii?Q?KjS42Cmn0qOWwWXZez2d0N9KQe4ZO4L29JBw5EHWktIIHqW3bcPFGZnEi5N2?= =?us-ascii?Q?7bEZCz9zkzhnuUTc3lQrzAL9TouOQ5O6x35IexI8jGv7Hu/8I9Rv2emo6ACt?= =?us-ascii?Q?mck8Nev9So648xnNjdqYSv8sC3m7Q0pbRnL8VXY8r3KFkq5xGAcIWa+AtJoo?= =?us-ascii?Q?z5ht1vCuU3gJiRdRFcUQTmxCdCwwytEFTpdbMo+j2a9ypVvqtEfARHiWqxrz?= =?us-ascii?Q?zf1Heo/BBP/lEMxaohf0okFOwoGsmwpqryR3KKBVNru/reBBu3AaQuzomSZc?= =?us-ascii?B?UT09?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2699; 6:L6XLLkshPT8YA0EJHh7zE9XSSDn8Y+Oa6GD1Hdo0VExYSVH6kB4tg/CNxB0DcQtaonYLxjFiS65rCVG7teMW2kVYgnjx9/O4AJI2ldw9uvNumAtlw0vRy5XvG8jsStEd3FzkJfFWm+dc2UhRL4jCmSy41jFT1yINRc+7zpozxZmRyAceJ3gMJii9nAD132Asz1Qx34viznE2OL7jyUm4wafZjVQ4sA7M+9nogjkuOi0YBcz+5Nh4XpS/EVDDk8N8SjlIBbxxWewcnWXFYeeWJW1fw0+mw9UdXYMgyQZQzIoR6cLI0RyRfHtRuU6G/cdaofyxD3X1a/oNGZerPNXRTlEObY0H5tKo97mxzXSLMm0=; 5:tNiZKrq4r+KmsjHQQTWC9gntiFfn5wtQa86Q2JpocVaQM7jSRvbfWTIlQ0iGFnmQC7/MxDRqxmw95h6AQVhYVTn+63yeU2JkmtHHw+fQsu4Cd4Qh/aOtpWEwESMeaq1x9Sm1dyZVcdnoJbA3Og8qeKYtDYxWoRRANaYnJy+ObEQ=; 24:9G4BGBaCiLi014PEQ5mvY4LPMhJQzwG1eAWCeKtl2lo3xPNPAS//koSm/4n6KgD8O0CX/NLJ6UpuC/Bd0MKRey43PdCVfux5+5t5oIjPY7A=; 7:d3qnummKlxWteKHixYoRh0SphqEtRklUGr21fknWlOGRHKP7mVMmZp2Et/N3hA/TPYTp624Hc3wbqn6uDeK6aMH+byxwi0Ivw6iLI4dIU7b7A0+4f4GFi0+S5kR+2TG2nzNBAH5+oXPGWRMJQ0555P68zbOZaOzON/sTLaS4IHmgZyZiyasEG3gs3oBf98/UG9ND7X7eJ5rL2FcaZwSNArZsAQbtZyq0VQIK1OjWpbHXaYUkiZgneoLsvsob4qdq SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Dec 2017 16:16:02.0142 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7cb9b16c-0a16-4cee-edbd-08d538d6d128 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR03MB2699 Subject: [PATCH 2/4] Silicon/NXP:Add support for PCF2129 Real Time Clock Library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Dec 2017 16:11:38 -0000 Content-Type: text/plain This patch add support for NXP pcf2129 real time clock library Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Vabhav --- Platform/NXP/Drivers/I2cDxe/I2cDxe.c | 17 +- Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129Rtc.h | 43 +++ Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.c | 375 +++++++++++++++++++++ .../NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.inf | 47 +++ 4 files changed, 474 insertions(+), 8 deletions(-) create mode 100644 Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129Rtc.h create mode 100644 Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.c create mode 100644 Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.inf diff --git a/Platform/NXP/Drivers/I2cDxe/I2cDxe.c b/Platform/NXP/Drivers/I2cDxe/I2cDxe.c index 30eb6f4..ffbee74 100644 --- a/Platform/NXP/Drivers/I2cDxe/I2cDxe.c +++ b/Platform/NXP/Drivers/I2cDxe/I2cDxe.c @@ -538,7 +538,8 @@ StartRequest ( UINT32 Length; UINT8 *Buffer; UINT32 Flag; - UINT8 RegAddress; + UINT32 RegAddress; + UINT32 OffsetLength; RegAddress = 0; @@ -548,7 +549,10 @@ StartRequest ( return EFI_INVALID_PARAMETER; } - for (Count = 0; Count < RequestPacket->OperationCount; Count++) { + OffsetLength = RequestPacket->Operation[0].LengthInBytes; + RegAddress = *RequestPacket->Operation[0].Buffer; + + for (Count = 1; Count < RequestPacket->OperationCount; Count++) { Flag = RequestPacket->Operation[Count].Flags; Length = RequestPacket->Operation[Count].LengthInBytes; Buffer = RequestPacket->Operation[Count].Buffer; @@ -559,12 +563,9 @@ StartRequest ( return EFI_INVALID_PARAMETER; } - if (Flag == I2C_FLAG_WRITE && Count == 0) { - RegAddress = *Buffer; - continue; - } else if (Flag == I2C_FLAG_READ) { + if (Flag == I2C_FLAG_READ) { Ret = I2cDataRead (PcdGet32 (PcdI2cBus), SlaveAddress, - RegAddress, sizeof(SlaveAddress)/8, Buffer, Length); + RegAddress, OffsetLength, Buffer, Length); if (Ret != EFI_SUCCESS) { DEBUG ((DEBUG_ERROR,"%a: I2c read operation failed (error %d)\n", __FUNCTION__, Ret)); @@ -572,7 +573,7 @@ StartRequest ( } } else if (Flag == I2C_FLAG_WRITE) { Ret = I2cDataWrite (PcdGet32 (PcdI2cBus), SlaveAddress, - RegAddress, sizeof(SlaveAddress)/8, Buffer, Length); + RegAddress, OffsetLength, Buffer, Length); if (Ret != EFI_SUCCESS) { DEBUG ((DEBUG_ERROR,"%a: I2c write operation failed (error %d)\n", __FUNCTION__, Ret)); diff --git a/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129Rtc.h b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129Rtc.h new file mode 100644 index 0000000..735f697 --- /dev/null +++ b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129Rtc.h @@ -0,0 +1,43 @@ +/** Pcf2129Rtc.h +* +* Copyright 2017 NXP +* +* 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 __PCF2129RTC_H__ +#define __PCF2129RTC_H__ + +/* + * RTC register addresses + */ +#define PCF2129_CTRL1_REG_ADDR 0x00 // Control Register 1 +#define PCF2129_CTRL2_REG_ADDR 0x01 // Control Register 2 +#define PCF2129_CTRL3_REG_ADDR 0x02 // Control Register 3 +#define PCF2129_SEC_REG_ADDR 0x03 +#define PCF2129_MIN_REG_ADDR 0x04 +#define PCF2129_HR_REG_ADDR 0x05 +#define PCF2129_DAY_REG_ADDR 0x06 +#define PCF2129_WEEKDAY_REG_ADDR 0x07 +#define PCF2129_MON_REG_ADDR 0x08 +#define PCF2129_YR_REG_ADDR 0x09 + +#define PCF2129_CTRL3_BIT_BLF BIT2 /* Battery Low Flag*/ + +// Define EPOCH (1998-JANUARY-01) in the Julian Date representation +#define EPOCH_JULIAN_DATE 2450815 + +typedef struct { + UINTN OperationCount; + EFI_I2C_OPERATION SetAddressOp; + EFI_I2C_OPERATION GetSetDateTimeOp; +} RTC_I2C_REQUEST; + +#endif // __PCF2129RTC_H__ diff --git a/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.c b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.c new file mode 100644 index 0000000..b4ee61f --- /dev/null +++ b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.c @@ -0,0 +1,375 @@ +/** @PCF2129RtcLib.c + Implement EFI RealTimeClock with runtime services via RTC Lib for PCF2129 RTC. + + Based on RTC implementation available in + EmbeddedPkg/Library/TemplateRealTimeClockLib/RealTimeClockLib.c + + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+ Copyright 2017 NXP + + 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 +#include + +#include "Pcf2129Rtc.h" + +STATIC VOID *mDriverEventRegistration; +STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster; + +/** + returns Day of the week [0-6] 0=Sunday + Don't try to provide a Year that's before 1998, please ! + **/ +UINTN +EfiTimeToWday ( + IN EFI_TIME *Time + ) +{ + UINTN a; + UINTN y; + UINTN m; + UINTN JulianDate; // Absolute Julian Date representation of the supplied Time + UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY + + a = (14 - Time->Month) / 12 ; + y = Time->Year + 4800 - a; + m = Time->Month + (12*a) - 3; + + JulianDate = Time->Day + ((153*m + 2)/5) + (365*y) + (y/4) - (y/100) + (y/400) - 32045; + + ASSERT (JulianDate >= EPOCH_JULIAN_DATE); + EpochDays = JulianDate - EPOCH_JULIAN_DATE; + + // 4=1/1/1998 was a Thursday + + return (EpochDays + 4) % 7; +} + +/** + Write RTC register. + + @param RtcRegAddr Register offset of RTC to write. + @param Val Value to be written + +**/ + +STATIC +VOID +RtcWrite ( + IN UINT8 RtcRegAddr, + IN UINT8 Val + ) +{ + RTC_I2C_REQUEST Req; + EFI_STATUS Status; + + Req.OperationCount = 2; + + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = 0; + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = 0; + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val); + Req.GetSetDateTimeOp.Buffer = &Val; + + Status = mI2cMaster->StartRequest (mI2cMaster, FixedPcdGet8 (PcdI2cSlaveAddress), + (VOID *)&Req, + NULL, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr)); + } + +} + +/** + Returns the current time and date information, and the time-keeping capabilities + of the hardware platform. + + @param Time A pointer to storage to receive a snapshot of the current time. + @param Capabilities An optional pointer to a buffer to receive the real time clock + device's capabilities. + + @retval EFI_SUCCESS The operation completed successfully. + @retval EFI_INVALID_PARAMETER Time is NULL. + @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error. + +**/ + +EFI_STATUS +EFIAPI +LibGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities + ) +{ + EFI_STATUS Status; + UINT8 Buffer[10]; + RTC_I2C_REQUEST Req; + UINT8 RtcRegAddr; + + Status = EFI_SUCCESS; + RtcRegAddr = PCF2129_CTRL1_REG_ADDR; + Buffer[0] = 0; + + if (mI2cMaster == NULL) { + return EFI_DEVICE_ERROR; + } + + RtcWrite (PCF2129_CTRL1_REG_ADDR, Buffer[0]); + + if (Time == NULL) { + return EFI_INVALID_PARAMETER; + } + + Req.OperationCount = 2; + + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = 0; + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = I2C_FLAG_READ; + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Buffer); + Req.GetSetDateTimeOp.Buffer = Buffer; + + Status = mI2cMaster->StartRequest (mI2cMaster, FixedPcdGet8 (PcdI2cSlaveAddress), + (VOID *)&Req, + NULL, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr)); + } + + if (Buffer[PCF2129_CTRL3_REG_ADDR] & PCF2129_CTRL3_BIT_BLF) { + DEBUG((DEBUG_INFO, "### Warning: RTC battery status low, check/replace RTC battery.\n")); + } + + Time->Nanosecond = 0; + Time->Second = BcdToDecimal8 (Buffer[PCF2129_SEC_REG_ADDR] & 0x7F); + Time->Minute = BcdToDecimal8 (Buffer[PCF2129_MIN_REG_ADDR] & 0x7F); + Time->Hour = BcdToDecimal8 (Buffer[PCF2129_HR_REG_ADDR] & 0x3F); + Time->Day = BcdToDecimal8 (Buffer[PCF2129_DAY_REG_ADDR] & 0x3F); + Time->Month = BcdToDecimal8 (Buffer[PCF2129_MON_REG_ADDR] & 0x1F); + Time->Year = BcdToDecimal8 (Buffer[PCF2129_YR_REG_ADDR]) + ( BcdToDecimal8 (Buffer[PCF2129_YR_REG_ADDR]) >= 98 ? 1900 : 2000); + + return Status; +} + +/** + Sets the current local time and date information. + + @param Time A pointer to the current time. + + @retval EFI_SUCCESS The operation completed successfully. + @retval EFI_INVALID_PARAMETER A time field is out of range. + @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error. + +**/ + +EFI_STATUS +EFIAPI +LibSetTime ( + IN EFI_TIME *Time + ) +{ + UINT8 Buffer[8]; + UINT8 Index; + EFI_STATUS Status; + RTC_I2C_REQUEST Req; + UINT8 RtcRegAddr; + + Index = 0; + Status = EFI_SUCCESS; + RtcRegAddr = PCF2129_CTRL1_REG_ADDR; + + if (mI2cMaster == NULL) { + return EFI_DEVICE_ERROR; + } + + // start register address + Buffer[Index++] = PCF2129_SEC_REG_ADDR; + + // hours, minutes and seconds + Buffer[Index++] = DecimalToBcd8 (Time->Second); + Buffer[Index++] = DecimalToBcd8 (Time->Minute); + Buffer[Index++] = DecimalToBcd8 (Time->Hour); + Buffer[Index++] = DecimalToBcd8 (Time->Day); + Buffer[Index++] = EfiTimeToWday (Time) & 0x07; + Buffer[Index++] = DecimalToBcd8 (Time->Month); + Buffer[Index++] = DecimalToBcd8 (Time->Year % 100); + + Req.OperationCount = 2; + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = 0; + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = 0; + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Buffer); + Req.GetSetDateTimeOp.Buffer = Buffer; + + Status = mI2cMaster->StartRequest (mI2cMaster, FixedPcdGet8 (PcdI2cSlaveAddress), + (VOID *)&Req, + NULL, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr)); + return Status; + } + + return Status; +} + + +/** + Returns the current wakeup alarm clock setting. + + @param Enabled Indicates if the alarm is currently enabled or disabled. + @param Pending Indicates if the alarm signal is pending and requires acknowledgement. + @param Time The current alarm setting. + + @retval EFI_SUCCESS The alarm settings were returned. + @retval EFI_INVALID_PARAMETER Any parameter is NULL. + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error. + +**/ +EFI_STATUS +EFIAPI +LibGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + + +/** + Sets the system wakeup alarm clock time. + + @param Enabled Enable or disable the wakeup alarm. + @param Time If Enable is TRUE, the time to set the wakeup alarm for. + + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If + Enable is FALSE, then the wakeup alarm was disabled. + @retval EFI_INVALID_PARAMETER A time field is out of range. + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error. + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform. + +**/ +EFI_STATUS +EFIAPI +LibSetWakeupTime ( + IN BOOLEAN Enabled, + OUT EFI_TIME *Time + ) +{ + // Not a required feature + return EFI_UNSUPPORTED; +} + +/** + Fixup internal data so that EFI can be call in virtual mode. + Call the passed in Child Notify event and convert any pointers in + lib to virtual mode. + + @param[in] Event The Event that is being processed + @param[in] Context Event Context +**/ +VOID +EFIAPI +LibRtcVirtualNotifyEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + // + // Only needed if you are going to support the OS calling RTC functions in virtual mode. + // You will need to call EfiConvertPointer (). To convert any stored physical addresses + // to virtual address. After the OS transistions to calling in virtual mode, all future + // runtime calls will be made in virtual mode. + // +// EfiConvertPointer (0x0, (VOID**)&mI2cBaseAddress); + return; +} + +STATIC +VOID +I2cDriverRegistrationEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EFI_I2C_MASTER_PROTOCOL *I2cMaster; + UINTN BusFrequency; + + Status = gBS->LocateProtocol (&gEfiI2cMasterProtocolGuid, NULL, (VOID **)&I2cMaster); + + gBS->CloseEvent (Event); + + ASSERT_EFI_ERROR (Status); + + Status = I2cMaster->Reset (I2cMaster); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: I2CMaster->Reset () failed - %r\n", + __FUNCTION__, Status)); + return; + } + + BusFrequency = FixedPcdGet16 (PcdI2cSpeed); + Status = I2cMaster->SetBusFrequency (I2cMaster, &BusFrequency); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: I2CMaster->SetBusFrequency () failed - %r\n", + __FUNCTION__, Status)); + return; + } + + mI2cMaster = I2cMaster; +} + +/** + This is the declaration of an EFI image entry point. This can be the entry point to an application + written to this specification, an EFI boot service driver, or an EFI runtime driver. + + @param ImageHandle Handle that identifies the loaded image. + @param SystemTable System Table for this image. + + @retval EFI_SUCCESS The operation completed successfully. + +**/ +EFI_STATUS +EFIAPI +LibRtcInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + // + // Register a protocol registration notification callback on the driver + // binding protocol so we can attempt to connect our I2C master to it + // as soon as it appears. + // + EfiCreateProtocolNotifyEvent ( + &gEfiI2cMasterProtocolGuid, + TPL_CALLBACK, + I2cDriverRegistrationEvent, + NULL, + &mDriverEventRegistration); + + return EFI_SUCCESS; +} diff --git a/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.inf b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.inf new file mode 100644 index 0000000..8edcc73 --- /dev/null +++ b/Silicon/NXP/Library/Pcf2129RtcLib/Pcf2129RtcLib.inf @@ -0,0 +1,47 @@ +#/** @Pcf2129RtcLib.inf +# +# Copyright 2017 NXP +# +# 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 = Pcf2129RtcLib + FILE_GUID = B661E02D-A90B-42AB-A5F9-CF841AAA43D9 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RealTimeClockLib + + +[Sources.common] + Pcf2129RtcLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Platform/NXP/NxpQoriqLs.dec + +[LibraryClasses] + DebugLib + UefiBootServicesTableLib + UefiLib + +[Protocols] + gEfiDriverBindingProtocolGuid ## CONSUMES + gEfiI2cMasterProtocolGuid ## CONSUMES + +[Pcd] + gNxpQoriqLsTokenSpaceGuid.PcdI2cBus + gNxpQoriqLsTokenSpaceGuid.PcdI2cSpeed + gNxpQoriqLsTokenSpaceGuid.PcdI2cSlaveAddress + +[Depex] + gEfiI2cMasterProtocolGuid -- 1.9.1