From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.40.64; helo=nam03-co1-obe.outbound.protection.outlook.com; envelope-from=wasim.khan@nxp.com; receiver=edk2-devel@lists.01.org Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0064.outbound.protection.outlook.com [104.47.40.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A8547222CB31A for ; Fri, 22 Dec 2017 02:47:33 -0800 (PST) Received: from BN6PR03CA0008.namprd03.prod.outlook.com (10.168.230.146) by DM5PR03MB2700.namprd03.prod.outlook.com (10.168.197.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Fri, 22 Dec 2017 10:52:22 +0000 Received: from BL2FFO11FD022.protection.gbl (2a01:111:f400:7c09::161) by BN6PR03CA0008.outlook.office365.com (2603:10b6:404:23::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.345.14 via Frontend Transport; Fri, 22 Dec 2017 10:52:21 +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 BL2FFO11FD022.mail.protection.outlook.com (10.173.161.101) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.302.6 via Frontend Transport; Fri, 22 Dec 2017 10:52:06 +0000 Received: from wasimk-VirtualBox.ap.freescale.net (B48164-17.ap.freescale.net [10.232.40.31]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vBMAq18S014260; Fri, 22 Dec 2017 03:52:18 -0700 From: Wasim Khan To: , , , Date: Fri, 22 Dec 2017 16:21:55 +0530 Message-ID: <1513939917-19336-3-git-send-email-wasim.khan@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513939917-19336-1-git-send-email-wasim.khan@nxp.com> References: <1513939917-19336-1-git-send-email-wasim.khan@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131584135269699753; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(39860400002)(39380400002)(376002)(346002)(396003)(2980300002)(1109001)(1110001)(339900001)(199004)(189003)(4326008)(16799955002)(6306002)(6666003)(85426001)(2201001)(53936002)(15188155005)(48376002)(104016004)(53376002)(110136005)(5660300001)(77096006)(97736004)(81166006)(2950100002)(8936002)(50466002)(316002)(54906003)(16586007)(50226002)(575784001)(68736007)(8676002)(305945005)(59450400001)(76176011)(81156014)(86362001)(51416003)(2906002)(106466001)(356003)(966005)(105606002)(498600001)(36756003)(47776003)(8656006)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2700; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD022; 1:Hr0HAF5QNl+A8HaSkw/MUU9Y7dgrgcJboHA/+VmB4ABY8f+dxzqh3Tn6L7PPqlNEUGYQnhpHW2H/bK4PTgAM4ohR4dNOzp6Og63xGCb7LmndI6lme1PIUptR0acOhP5a MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 77571098-a256-4b16-d0a9-08d5492a0b4a X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603307); SRVR:DM5PR03MB2700; X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2700; 3:thdLimDtjKCKMCBAodLArxIIx/bAitKkDN9S81iquyPv1NN62gg8E+d09BfVZ9019WI70sh4LNPeP62hCtX/F8a+OB0kz1dNWtTYEjDZCiUkUtwtcCGYJxU41IXeVciZZwYwZUCJrxRdzBkJ/dRqMtJF6t6NUeKrOo4HlST5ZfvA0dAXaWk+v8NKhO/s2E0dfULV7ZSSmHLHijBsbFP+2KfWcsb2l97kdTvwVH6y8uBHoXPN8WXRK9SGeCV5i+8LYByBqPpw16SGlxqvyMY4EZ5aeIpQtRqASKSIj2TygFeOUey9WnhmXMMD+63x2R6mnoi2NJIK4TWpsDfVT6o/wuZGFTUH5Ni9fWKgI799Ykg=; 25:2KskvE8Hiw4Dx272StkSjjO/vFA9FaiM4o1Y0WgXL6n6b3vXybD+tDvOSpAhV7jovprBnG/Nh6Sx7fT1+QxB+6+W00l7poKs+pR7UXeGsDfqqeo0YDGbzOgRLkt2pOKlcVSeMZQvZNgGjaZJkHAAMINS1kWSleZoRJv/JEYWuoO/1hiiGNYqBDX9Gv1tPppen7Oyd4r+OE4SmbdyNP2L3bQV1aqJZhcLvoXikN3NrjgRTQbLcu7Oce2yEEdV73PptwJy1vy1uAGa47o5T7EhTO2PP8StDZX6YqXQxs6ai+kQLD/x4zh7BkTN35e3hC+LDLnpONsYbaR8wr08Ovee+mUBBoCzzHEYM2xtG08th3Y= X-MS-TrafficTypeDiagnostic: DM5PR03MB2700: X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2700; 31:ngZZtJUOMUqpDlaeZHz4K05WK+xsqqh/XOFvPMza4JS6CFlKsjBy23dZkLiXqvUAcJoq4f9jb0FFwLk/KWjcVe67+nAQOtjnBXMwn4xN3xG/vZMOr1RLzw+tRhfgp8TxjwuE8WqY/TgeFHTWdBgaVXZfAwO98ZMDuWK0uCgDvTl3H3TpExZlbcQa7tldPe2jgcpobw25ribPtzyjNEA8LbDObgXqNR5D4556v0TNHvQ=; 4:8M8V/mOqyJxRor0JcIz5UWrZbJP7xhCuC7Oltm/Z71/zJTTfiM0zJZ21dW7baMLzOkcR0CYIwucdYsmE9ZmTnXmTh5M3Ndd1gAIh4rnKNJUtAuRJQPYiuKEDnhUqMBXHv3tS2iOpLHEWJVDLgKVIOJRO+j9yBi7MT04nuZWGb53ktC3VpQwiOdOCurPbm0YkBGqslP2M9IRLIZNgzWJx8iV2jAbyTqsEwLi2Xco4yyKnnShPwJzWlAGKNC2j2mtOEWBj7mToOdJlfYe9TggFEi6LMGG1MGcmCPNkgdLsBGSvfo9CZfDB/y3YRU2sc+POjwaxZsmrDXJbgsNBJeqi1SSaOKk/xkXX2/a8CeqRxFU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(8121501046)(5005006)(3231023)(3002001)(10201501046)(93006095)(93001095)(6055026)(6096035)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123565025)(20161123559100)(20161123556025)(20161123563025)(20161123561025)(201708071742011); SRVR:DM5PR03MB2700; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:DM5PR03MB2700; X-Forefront-PRVS: 05299D545B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR03MB2700; 23:B69Fwn2PzQ+kBipSUDDtTDidRhlKq0Sqe+4GyGc8+?= =?us-ascii?Q?f8Z4XPfoxdEuHxXZDo5mb2HWxTf1zK3gbmVd2B1/trDGMWaIg0Rc0cEcQbgt?= =?us-ascii?Q?UTQxqprTduAL7FNNkozXIVvxJUDZMwLeCHDVjfxjikW5lFaXkMKwV2kDyUGL?= =?us-ascii?Q?xJfEyTF8NdQ3n08jeauInj1NTiRB1BS5iEpuzR7rU4WSweW2aidJj6G2ywZE?= =?us-ascii?Q?bmQSrExMOzTkPaB0E3Rm40d5ft0/Atyms3hpeGNYIiWiU1lLVckAcwOXpCV0?= =?us-ascii?Q?1qgTLCgqwARdb9rMSVWJC6DxLlNwej+KZge6cg2AsTcKExlMXWiSZC2YD1cP?= =?us-ascii?Q?sFCehq+MaN56KqHLIHOnxORdCox7CYaZM/C9/WKNBJ48ZNqlcKhnnwZhBQSP?= =?us-ascii?Q?n+hrcHNm+voQ4Y6rFfnOk/pBv3i0HiAwqS0hkeb4stAlJbnKXDJBby9p12BT?= =?us-ascii?Q?IlGEbnF4zlKLt835Ew+uYkpayyj7LFXTvRYB9q6V7nh3ZT2T3Dabxp3jRl/t?= =?us-ascii?Q?MytE0mkDNZhMCBuZTmxBsRKsT/wu5dUjhwZHRnFojdMWdqvZckhz5HX2LR1s?= =?us-ascii?Q?nc2Dgk4orkEQ4zIodR2k4kA9Ek3VXOewkYBFQdFFMfVV+vdQSA3lz774kpdv?= =?us-ascii?Q?d7m/SKVsjuUcmSYveelgGpfzzYjkvrOFj7fcgrMXbYgDU0jEZFUB7SsQK7Rk?= =?us-ascii?Q?IMWq8Y1qZ1tsuIVMdMqXFywWZKJLZkGTz9fbJghrNiaplZQWMJ9k8fewQVkA?= =?us-ascii?Q?EVe1Xs/R+uAzjaoto07M+vsaWYbcRzkDYiEYY/1Us7010NOJsZ3p/uuQmsUf?= =?us-ascii?Q?SUoTm6ZvKHnUCs5gswJqXN42wrdeyKApqNaylnZYDedr40S50y0OaPcsalcL?= =?us-ascii?Q?3PTy3UfwrtIfEEFn3kjMgPZnliOaX4G7o0s3i2LXSP6n15b8cOjpjJmgtcQy?= =?us-ascii?Q?GQZqnIld91FdUM/euwFuWhTCfPHislBJEq/5aPIBlgDXz4wvxRJfiw6jqoPI?= =?us-ascii?Q?5nkHZP8Gkw0pUkKflL5WfsQo8Eqx9gSFfMubo3ySMA31FWkvfw5FXTcA2Ik5?= =?us-ascii?Q?dZZ4bM2t6dr6F8TFtxDajtAXuOrgeSmu4rpPlOfjgVNcahPWtK2UMsKCeMVX?= =?us-ascii?Q?UayiEMBoIp+5FOPyDLHmWQtdutKhYOU4EjxWnhq9ca4DKI/gnUiUyfytV5Vw?= =?us-ascii?Q?3PneWSapBRdN7e3OFiyUS/YHlh+3EeBxdfTBLd+7zDCV/ce4xk4+qbj8ZDgr?= =?us-ascii?Q?O1e64j2ILO5s8FzFVC3frzahtsb1KOTNp3KeR6t?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2700; 6:V45xR1xyG7dscquWnJpD6832GhrgXzMkquMqG2ZDSPN/inA959xrbtAWyPH2hTgs3LhbAfDW3q+2mOvpuYkO/OfahrBQy6gWjnHbCCprUInUC7Zf1oqS1HKKdgq8IBkHvkHdaCkLliPS/XsmDFGC4qFKNdWde7c7XczmZ9ELav2ggBdxhICShmON2drb+9QVnh8byuwpZH+B9m+gxBYVVFAhd277wglJc8CyFoXGL5c9i23ZoJfDxghluJzZULw7xBZa1m/SyEpJsl2XtS3CUy3j+CLp6AD7lNgsIIQFOz5P0XlZ19ZC7bVPk44b9wJGHx55PSPIpg4NIa/B1PMJ2S4E2E03pxaNHYxiRyjoZ/M=; 5:F/zkewT6iNFKREbV4TfCUm6DcyMgAUaxWIDzKY2ngDlNy3oBrH9QbUyRy3VEgj6rovP7Wot09padZSqvUbY71vcIAMLwR5WWaV2g9TczAXbi9i/X9na4tp4sf6G3xXOyAGKmiUQNZF/fXMgP0L0hpJYo/8d8TTGt27+5MrRpBjQ=; 24:R1t4hEUpEH0xxgNVXOgYkzUL0jxKILv8wTRKM+7SAsnajx6tMceE4UCizyxwpxOR0cjt6/4JBUXK0/HhA0nDxjFgrs4hjUi6HhX+z/ds7lY=; 7:+9kHr/Lz8HVExWzF2KJbKARTnl/3AuRfam9TSVc6Tji9UvTa7z3dW38/XPOAaDd4Bq5WjHuOckF1sPNtfaRZOIFoPt/bl/j8mS0p9XsmM4jRlzcnsMTo2cxz7k5Zq1sdCwZ827nkRJ28/+lujQI7pAI5yZx1RitBU342jLdsyc6Wzz6dx+ofDATFxbmd5Y6JIRJcNQMcGeUoZ4LYdk5bUV/SC0uqo/8Tsd+YaFzu2Vkq8FqfDNOVOw1KbdcIz06u SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Dec 2017 10:52:06.7983 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 77571098-a256-4b16-d0a9-08d5492a0b4a 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: DM5PR03MB2700 Subject: [PATCH edk2-platforms 2/4] Silicon/Maxim: Added Support for DS3232 RTC Library X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Dec 2017 10:47:34 -0000 Content-Type: text/plain This patch adds support for DS3232 RTC Library Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Wasim Khan --- Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h | 49 +++ Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c | 370 +++++++++++++++++++++ .../Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec | 31 ++ .../Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf | 50 +++ 4 files changed, 500 insertions(+) create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec create mode 100644 Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h new file mode 100644 index 0000000..cd1a321 --- /dev/null +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232Rtc.h @@ -0,0 +1,49 @@ +/** Ds3232Rtc.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 __DS3232RTC_H__ +#define __DS3232RTC_H__ + +//RTC time register +#define DS3232_SEC_REG_ADDR 0x00 +#define DS3232_MIN_REG_ADDR 0x01 +#define DS3232_HR_REG_ADDR 0x02 +#define DS3232_DAY_REG_ADDR 0x03 +#define DS3232_DATE_REG_ADDR 0x04 +#define DS3232_MON_REG_ADDR 0x05 +#define DS3232_YR_REG_ADDR 0x06 + +#define DS3232_SEC_BIT_CH 0x80 // Clock Halt (in Register 0) + +//RTC control register +#define DS3232_CTL_REG_ADDR 0x0e +#define DS3232_STAT_REG_ADDR 0x0f + +#define START_YEAR 1970 +#define END_YEAR 2070 + +//TIME MASKS +#define MASK_SEC 0x7F +#define MASK_MIN 0x7F +#define MASK_HOUR 0x3F +#define MASK_DAY 0x3F +#define MASK_MONTH 0x1F + +typedef struct { + UINTN OperationCount; + EFI_I2C_OPERATION SetAddressOp; + EFI_I2C_OPERATION GetSetDateTimeOp; +} RTC_I2C_REQUEST; + +#endif // __DS3232RTC_H__ diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c new file mode 100644 index 0000000..a1f5226 --- /dev/null +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.c @@ -0,0 +1,370 @@ +/** Ds3232RtcLib.c +* Implement EFI RealTimeClock via RTC Lib for DS3232 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 "Ds3232Rtc.h" + +STATIC VOID *mDriverEventRegistration; +STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster; + +/** + Read RTC register. + + @param SlaveDeviceAddress Slave device address offset of RTC to be read. + @param RtcRegAddr Register offset of RTC to be read. + + @retval Register Value read + +**/ +STATIC +UINT8 +RtcRead ( + IN UINT8 SlaveDeviceAddress, + IN UINT8 RtcRegAddr + ) +{ + RTC_I2C_REQUEST Req; + EFI_STATUS Status; + UINT8 Val; + + Val = 0; + + Req.OperationCount = 2; + + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = 1; + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = I2C_FLAG_READ; + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val); + Req.GetSetDateTimeOp.Buffer = &Val; + + Status = mI2cMaster->StartRequest (mI2cMaster, SlaveDeviceAddress, + (VOID *)&Req, + NULL, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "RTC read error at Addr:0x%x\n", RtcRegAddr)); + } + + return Val; +} + +/** + Write RTC register. + + @param SlaveDeviceAddress Slave device address offset of RTC to be read. + @param RtcRegAddr Register offset of RTC to write. + @param Val Value to be written + +**/ +STATIC +VOID +RtcWrite ( + IN UINT8 SlaveDeviceAddress, + IN UINT8 RtcRegAddr, + IN UINT8 Val + ) +{ + RTC_I2C_REQUEST Req; + EFI_STATUS Status; + + Req.OperationCount = 2; + + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = 1; + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = 0; + Req.GetSetDateTimeOp.LengthInBytes = sizeof (Val); + Req.GetSetDateTimeOp.Buffer = &Val; + + Status = mI2cMaster->StartRequest (mI2cMaster, SlaveDeviceAddress, + (VOID *)&Req, + NULL, NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "RTC write error at Addr:0x%x\n", RtcRegAddr)); + } +} + +/** + Configure the MUX device connected to I2C. + + @param RegValue Value to write on mux device register address + +**/ +VOID +ConfigureMuxDevice ( + IN UINT8 RegValue + ) +{ + RtcWrite (FixedPcdGet8 (PcdMuxDeviceAddress), FixedPcdGet8 (PcdMuxControlRegOffset), RegValue); +} + +/** + 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 Second; + UINT8 Minute; + UINT8 Hour; + UINT8 Day; + UINT8 Month; + UINT8 Year; + + if (mI2cMaster == NULL) { + return EFI_DEVICE_ERROR; + } + + Status = EFI_SUCCESS; + + // + // Check if the I2C device is connected though a MUX device. + // + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { + // Switch to the channel connected to Ds3232 RTC + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxRtcChannelValue)); + } + + Second = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR); + Minute = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MIN_REG_ADDR); + Hour = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_HR_REG_ADDR); + Day = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_DATE_REG_ADDR); + Month = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MON_REG_ADDR); + Year = RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_YR_REG_ADDR); + + if (Second & DS3232_SEC_BIT_CH) { + DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n")); + /* clear the CH flag */ + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR, + RtcRead (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR) & ~DS3232_SEC_BIT_CH); + Status = EFI_DEVICE_ERROR; + goto EXIT; + } + + Time->Second = BcdToDecimal8 (Second & MASK_SEC); + Time->Minute = BcdToDecimal8 (Minute & MASK_MIN); + Time->Hour = BcdToDecimal8 (Hour & MASK_HOUR); + Time->Day = BcdToDecimal8 (Day & MASK_DAY); + Time->Month = BcdToDecimal8 (Month & MASK_MONTH); + + // + // RTC can save year 1970 to 2069 + // On writing Year, save year % 100 + // On Reading reversing the operation e.g. 2012 + // write = 12 (2012 % 100) + // read = 2012 (12 + 2000) + // + Time->Year = BcdToDecimal8 (Year) + + (BcdToDecimal8 (Year) >= 70 ? START_YEAR - 70 : END_YEAR -70); + +EXIT: + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { + // Switch to the default channel + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxDefaultChannelValue)); + } + + 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. + +**/ +EFI_STATUS +EFIAPI +LibSetTime ( + IN EFI_TIME *Time + ) +{ + if (mI2cMaster == NULL) { + return EFI_DEVICE_ERROR; + } + + if (Time->Year < START_YEAR || Time->Year >= END_YEAR){ + DEBUG ((DEBUG_ERROR, "WARNING: Year should be between 1970 and 2069!\n")); + return EFI_INVALID_PARAMETER; + } + + // + // Check if the I2C device is connected though a MUX device. + // + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { + // Switch to the channel connected to Ds3232 RTC + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxRtcChannelValue)); + } + + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_YR_REG_ADDR, DecimalToBcd8 (Time->Year % 100)); + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MON_REG_ADDR, DecimalToBcd8 (Time->Month)); + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_DATE_REG_ADDR, DecimalToBcd8 (Time->Day)); + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_HR_REG_ADDR, DecimalToBcd8 (Time->Hour)); + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_MIN_REG_ADDR, DecimalToBcd8 (Time->Minute)); + RtcWrite (FixedPcdGet8 (PcdI2cSlaveAddress), DS3232_SEC_REG_ADDR, DecimalToBcd8 (Time->Second)); + + if (FixedPcdGetBool (PcdIsRtcDeviceMuxed)) { + // Switch to the default channel + ConfigureMuxDevice (FixedPcdGet8 (PcdMuxDefaultChannelValue)); + } + + return EFI_SUCCESS; +} + +/** + 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; +} + +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 (PcdI2cBusFrequency); + 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. + + @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/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec new file mode 100644 index 0000000..4471d57 --- /dev/null +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec @@ -0,0 +1,31 @@ +#/** @file +# +# 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] + DEC_SPECIFICATION = 0x0001001A + PACKAGE_NAME = Ds3232RtcLib + PACKAGE_GUID = 0b4192f7-e404-4019-b2e5-1e6004da3313 + PACKAGE_VERSION = 0.1 + +[Guids] + gDs3232RtcLibTokenSpaceGuid = { 0x7960fc51, 0x0832, 0x4f0b, { 0xb4, 0x22, 0x53, 0x87, 0x03, 0xaa, 0x85, 0xda }} + +[PcdsFixedAtBuild] + gDs3232RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0|UINT8|0x00000001 + gDs3232RtcLibTokenSpaceGuid.PcdI2cBusFrequency|0|UINT32|0x00000002 + gDs3232RtcLibTokenSpaceGuid.PcdIsRtcDeviceMuxed|FALSE|BOOLEAN|0x00000003 + gDs3232RtcLibTokenSpaceGuid.PcdMuxDeviceAddress|0|UINT8|0x00000004 + gDs3232RtcLibTokenSpaceGuid.PcdMuxControlRegOffset|0|UINT8|0x00000005 + gDs3232RtcLibTokenSpaceGuid.PcdMuxRtcChannelValue|0|UINT8|0x00000006 + gDs3232RtcLibTokenSpaceGuid.PcdMuxDefaultChannelValue|0|UINT8|0x00000007 diff --git a/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf new file mode 100644 index 0000000..836fc64 --- /dev/null +++ b/Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.inf @@ -0,0 +1,50 @@ +# @Ds3232RtcLib.inf +# +# Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved. +# Copyright (c) 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 = Ds3232RtcLib + FILE_GUID = 97f1f2c2-51e1-47ad-9660-70b33da1fe71 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RealTimeClockLib + +[Sources.common] + Ds3232RtcLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Silicon/Maxim/Library/Ds3232RtcLib/Ds3232RtcLib.dec + +[LibraryClasses] + DebugLib + UefiBootServicesTableLib + UefiLib + +[Protocols] + gEfiDriverBindingProtocolGuid ## CONSUMES + gEfiI2cMasterProtocolGuid ## CONSUMES + +[FixedPcd] + gDs3232RtcLibTokenSpaceGuid.PcdI2cSlaveAddress + gDs3232RtcLibTokenSpaceGuid.PcdI2cBusFrequency + gDs3232RtcLibTokenSpaceGuid.PcdIsRtcDeviceMuxed + gDs3232RtcLibTokenSpaceGuid.PcdMuxDeviceAddress + gDs3232RtcLibTokenSpaceGuid.PcdMuxControlRegOffset + gDs3232RtcLibTokenSpaceGuid.PcdMuxRtcChannelValue + gDs3232RtcLibTokenSpaceGuid.PcdMuxDefaultChannelValue + +[Depex] + gEfiI2cMasterProtocolGuid -- 2.7.4