From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.34.46; helo=nam01-by2-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0046.outbound.protection.outlook.com [104.47.34.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 81E9A2034A7A2 for ; Wed, 22 Nov 2017 01:57:11 -0800 (PST) Received: from CY1PR03CA0007.namprd03.prod.outlook.com (10.174.128.17) by CY1PR03MB2363.namprd03.prod.outlook.com (10.166.207.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.4; Wed, 22 Nov 2017 10:01:26 +0000 Received: from BN1AFFO11FD032.protection.gbl (2a01:111:f400:7c10::186) by CY1PR03CA0007.outlook.office365.com (2603:10b6:600::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.239.5 via Frontend Transport; Wed, 22 Nov 2017 10:01:26 +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 BN1AFFO11FD032.mail.protection.outlook.com (10.58.52.186) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.218.12 via Frontend Transport; Wed, 22 Nov 2017 10:01:26 +0000 Received: from uefi-OptiPlex-790.ap.freescale.net (uefi-OptiPlex-790.ap.freescale.net [10.232.132.78]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id vAMA0nI9030922; Wed, 22 Nov 2017 03:01:23 -0700 From: Meenakshi Aggarwal To: , , , Date: Wed, 22 Nov 2017 21:18:57 +0530 Message-ID: <1511365740-1157-6-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1511365740-1157-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1510065736-9394-1-git-send-email-meenakshi.aggarwal@nxp.com> <1511365740-1157-1-git-send-email-meenakshi.aggarwal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131558184862320020; (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)(7966004)(336005)(376002)(39860400002)(346002)(39380400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(36756003)(104016004)(106466001)(966005)(105606002)(86362001)(50226002)(189998001)(5660300001)(48376002)(50986999)(498600001)(76176999)(8656006)(50466002)(6306002)(77096006)(47776003)(2201001)(5003940100001)(2906002)(53376002)(81156014)(356003)(33646002)(85426001)(68736007)(53936002)(316002)(16586007)(8936002)(2950100002)(97736004)(8676002)(110136005)(4326008)(54906003)(16799955002)(305945005)(6666003)(15188155005)(81166006)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR03MB2363; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD032; 1:gNiNclBC8WuREYxmzjb8jizYRDpkrVW+9o8rBr1rndGZPy7TTlVe+UIlzIEMRwQ/KZjZhG2tWzD6Ae679lihADYzRgdZw1Mq2RSrfa/v+tQtL5d2bD5BPAFbist3kpBQ MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: c9b61b74-c1bc-43af-8594-08d5318ffe7a X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4628075)(201703131517081)(2017052603199); SRVR:CY1PR03MB2363; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2363; 3:YCExNIY1vfNah0DsIOEwo95sFiBDZgtg47kV3urV42BmULQKceDaIhltcR9An3naX89d7iDrIOLpRi0e3CeqVa+F8p4ThAyZpRZLUZjFaAcQIoqyON2wZyf7LBojV/SRJnuJZcvVtdgBl9HQy2XV6+s+FXaDAObsM1IwgJ9UzUUfowVgIo6LBzR0ISfM3W5zo68Mhuwjf1bBdf19to+ticpgYLm2+xeJRnTyLUOfMvtwOM+aEGpdx8yE3P17CoP55T0HUKEfDj7NHcnjh8OHIqn7xFPEfT3NcC8jEbWvrQnxm7s+K5ARAZHoT6/hJDv0BVTYnisjtOX33GKtumbcC/82zN9mxc9GFvWIHxnAuqk=; 25:tzvVVLiZRNWhD16b5Oh1UobhFjl+k5KDEUPVCseuMV0yBN+Jz7en+pxBUIKQeShRn5tf9hUeOhi7cDsDF+Qm4hCBHukT7JbenxzQ8zAL1f71LVPnnfjtYjBISUq62DLT4LWca8Mh/gXPn/4n0qtDPafkZ/rhwc3rA84kuPITm3AgU0aFh9Bmg0kVQBWBb6VRmx/y7Fi+aC9ietQvqy/iLiXdQLKlbEkvgb/P35uweOdbEWp2WQUfreOEQqcZkjzPVN2sx5/OarLRw3l3KXynHJcZ9dWflLIthviX82fyzjdyyde+Eam8XCi2XJ65hPyhNKSZrdu2UGxhIJ21uajkP3p9Q7Jovc0MnwP6zOzYLZA= X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY1PR03MB2363: X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2363; 31:ni4ORUaqRrrq4Qg0FQMkiOHXX6l9E0iDDWhblMj2whzSR14eY4uep4TYWJY0p57nZ2VYZLrxOXJ6P2F0m5X+XUwFDTsvMvjrRW8406QZF6B8ElVp20GTha//bJgtIPCl7lP6Gmh3+PsM9t84OSM2nO0RDU+kp9TVg+Sd98hOIfbKSaaUo3CnCoOhkiurwdzomrgmJTDLIzNSfIhjPUYIhRh9cszj4DA1JGDJDn76JjI=; 4:7lgIOyxJbLJFKZEIkTwN1yQhHCSkB5YJsUaOVMcGiRuUWtSox9Rh/Ow37AJsLysy21T24IqtawfOjCNp3VmbPL+QsIIv3LG0atFeg0j5VA2nI0zA7GCeV/JP2gWJis9MkNkuHnkRzR1ZmH+1F0ubsHPGwVe2ErSI7YkJsrjVZal4pcn2nZw5GagTqlIhToxnBudy01/yez593VvnMcAlsNya+G9NCNoX5vfvoUeGlBVoywyK4WMFbAm9+EXHDBlTTVvLkWNalF/RyOp1ohh8UysFPIaOsYCR+udtPrgYLUjgEEZL6BL1NUytcytfEQ7S9R+z3ZiO2gq6ga7jVKV9QnbPtlFoSZnaIasBAki4MaA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(8121501046)(5005006)(3231022)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(3002001)(6055026)(6096035)(20161123565025)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123563025)(20161123559100)(20161123561025)(20161123556025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY1PR03MB2363; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1PR03MB2363; X-Forefront-PRVS: 0499DAF22A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR03MB2363; 23:7wwrKOKjP5adXpIFDwUye/1pr8rk74HC+aCbD/PRE?= =?us-ascii?Q?LtJgbF2fYbGUecqq3jSCRn2i7hzmiVL3IyoH7C8PK8a5/tXrCpEdRxrvdmrx?= =?us-ascii?Q?tjzkktx7D1bSA5GcmeEDb0uA+Ja1hpnn4IfzumiGJh/R7jm3wFI7xUUqu63g?= =?us-ascii?Q?NDlogoanQR4/tiEzMg3Qxv884RDdUrftnyahttTYOqx/ip7PtEq5j0+s8jcq?= =?us-ascii?Q?ygV3HdnKF9bIs6i3EhUt272Cda5saqGGmWyW4VNxW/Kb567muNJ3UYcHmG1A?= =?us-ascii?Q?QrEqvUiAROAfp18JPuBSjdrSPqfyhr06zlCJi0vkpEKJoNbrCoLUQPGc2CpT?= =?us-ascii?Q?+ihPbAVNiFqP/KXaf0lQSM36HzzoNRHi5rQwEq6eAKWnyUwmeswI3QVbHY7O?= =?us-ascii?Q?h1/7UsMLnq+vE8Adnz2bpfCFVpFd7mJC0TaXob+uvJwxbh1Ipt0ixdJCBZWQ?= =?us-ascii?Q?UsXtoXV4xXdLLnUD9Pfll2Z21saPBRkHEa/b9v5hbqzIambGH5AsDMJJaOsE?= =?us-ascii?Q?DbI8F323De+tqX6dK9LfRlWSIv4/TeYxjSHJ/MblhgWRVlF6c9hLodzx5fgD?= =?us-ascii?Q?Q0JSmQT9Mv5Uu/3+3koV1GIazjONsWTJd2glvDoCi/AIYweKnoqdl1xBTwGX?= =?us-ascii?Q?E+rZjT3g9fFnMTJEmKRpoPxN9V2jFmQaAh98zGHU2RJAG8zy64II7FqO0ZI0?= =?us-ascii?Q?paAlbDL0wEDOIN5ZUN37n/pjR4+a8HVsaWZT/6BG//LDuPbE6DUPPApuEcTQ?= =?us-ascii?Q?hgorrigRYoaO9ynFebDwdRb+pthhL7hb7vA3MOlTdykHB5lZqGuE6qV9c2UZ?= =?us-ascii?Q?KoajZMGRN/61diyjgN+6XkXjnu3EsCmyX8QvMoNlK7nUBeZ0eIp/5dTC5fcu?= =?us-ascii?Q?AmnYmBS71KB2vBfJDuYIBS2QtAFv/SCPizTlAY/sYNDydQFV4dhKtmD+thxG?= =?us-ascii?Q?kEz8bkLHYACkmOC2vpxgwL9HoJLdxqsEMbiXZq+rFgxR1YwSsJ/OOrxjHj8S?= =?us-ascii?Q?nPY/yTgyNEBY2iKvtTtJ28yb0HlVjDh+wJrYNuLTJvouiGN5SHqUQakiF1ys?= =?us-ascii?Q?BM4Xq7nueRB+bb5M6k6lOsn8K9kfOdHNAL35yBYOOMDTpeVlte1IJaGOZYGS?= =?us-ascii?Q?h8a95SJunJDNQU8MFZjpxSnZaVQEl3+zAkGjwKODIEA2tBkHqkaxIsgE1JMN?= =?us-ascii?Q?DG6F38e1/bQSQMN965YtppKKRWvJa0SocvDExzzsRCq1ZQb4Avhf66K45diM?= =?us-ascii?Q?oonKLsxkEdlfvdxO5vLGbFw2N9dDjHuzaDYABi3cZ2AQZvEFVEZ8m6ExlAal?= =?us-ascii?Q?6RrXpmpXS8gOO9aqeD3nko=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB2363; 6:0xpxq7jlYKYD61Kym0D94RKKiNfmeLKJ5Gmj7yJAue5HO5T1kk+viwnO2wMnk1mPqhpu1q2t/BX25lDa6NMxk2M5qH1MUP35SVovXMXxwi5UFTsrGqAW17ravW3ERhcWQMzVo9DdCNoI/YpL82BXbMY5DgYywqk3Od5tcsici+zbknaqy6uHw6UwKU8zU6muT8dap+DFU4WKlKnL7tj9iaqU6qTb2UMUvlM6lxgGzfPTtPM3uy9o/uK+hlPKCaRCQP95e3sWbutwbMs80c1FbYJLVgdVd8tcnKFhN4bbXeMDLATBppbtzrEZ0qNNQAC6M7LzAhw75XDRanUFYqqKsHO+xdrxXcw4qO+K0y0SiUg=; 5:03dVEWmqfIhPdpBk0kaUMUA0qkPS5coWW4lcYD98Xbpf1tJtkCF/qOMNejb3vqiVyfYn+yalBJ2Y2AQD8+qiIWGS/BN9rC9y4xYgsTOXp868pRw3oI4qppVpefnG9DCHO2Vkd015vwv9gfddSBatK98RrTI6aiAqibZqVX5aeCs=; 24:AW0gScvT28TIUw2IfmhFjE1L4fuZo6ooY3D5uN77I8q0d9EXNyvNroN/dhB0nkl84h3JD2TVgcf4WMT7f6UB/2yBv617u43+LvHwuH45rzc=; 7:dQ5j/NpPFSgcbECBMifPWPHJCaRCjyTqB4asRc0n4/wEwzD2yDMRyF4jc2gR9TgOtkhWXKJFvK3rb41Czlqk/AcqRe62bjlmS3jdn6+wM4d5V5IxK7lgwunvlXAghKmTAwcdOZrHxv13OvUg7wpYzUG1PTDVa7ARVVOL7iJsP3WLQGZcvPekVnTGoxd/iFYm/9fKfG5JBZanJXTLH+ZKXMgTnnKAWn+pTEZVP85woWvrVlLfa9n85MBDGV3HMipy SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2017 10:01:26.0604 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c9b61b74-c1bc-43af-8594-08d5318ffe7a 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: CY1PR03MB2363 Subject: [PATCH v2 6/9] Silicon/Maxim : Add support for DS1307 RTC 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: Wed, 22 Nov 2017 09:57:11 -0000 Content-Type: text/plain Real time clock Apis on top of I2C Apis Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Meenakshi Aggarwal --- Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h | 59 ++++ Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c | 327 +++++++++++++++++++++ .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec | 26 ++ .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 45 +++ 4 files changed, 457 insertions(+) create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec create mode 100644 Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h new file mode 100644 index 0000000..96271f8 --- /dev/null +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307Rtc.h @@ -0,0 +1,59 @@ +/** Ds1307Rtc.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 __DS1307RTC_H__ +#define __DS1307RTC_H__ + +/* + * RTC time register + */ +#define DS1307_SEC_REG_ADDR 0x00 +#define DS1307_MIN_REG_ADDR 0x01 +#define DS1307_HR_REG_ADDR 0x02 +#define DS1307_DAY_REG_ADDR 0x03 +#define DS1307_DATE_REG_ADDR 0x04 +#define DS1307_MON_REG_ADDR 0x05 +#define DS1307_YR_REG_ADDR 0x06 + +#define DS1307_SEC_BIT_CH 0x80 /* Clock Halt (in Register 0) */ + +/* + * RTC control register + */ +#define DS1307_CTL_REG_ADDR 0x07 + +#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 + +/* + * I2C FLAGS + */ +#define I2C_REG_ADDRESS 0x2 + +typedef struct { + UINTN OperationCount; + EFI_I2C_OPERATION SetAddressOp; + EFI_I2C_OPERATION GetSetDateTimeOp; +} RTC_I2C_REQUEST; + +#endif // __DS1307RTC_H__ diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c new file mode 100644 index 0000000..e362f2b --- /dev/null +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c @@ -0,0 +1,327 @@ +/** Ds1307RtcLib.c + Implement EFI RealTimeClock via RTC Lib for DS1307 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 "Ds1307Rtc.h" + +STATIC VOID *mDriverEventRegistration; +STATIC EFI_I2C_MASTER_PROTOCOL *mI2cMaster; + +/** + Read RTC register. + + @param RtcRegAddr Register offset of RTC to be read. + + @retval Register Value read + +**/ + +STATIC +UINT8 +RtcRead ( + IN UINT8 RtcRegAddr + ) +{ + RTC_I2C_REQUEST Req; + EFI_STATUS Status; + UINT8 Val; + + Val = 0; + + Req.OperationCount = 2; + + Req.SetAddressOp.Flags = 0; + Req.SetAddressOp.LengthInBytes = sizeof (RtcRegAddr); + Req.SetAddressOp.Buffer = &RtcRegAddr; + + Req.GetSetDateTimeOp.Flags = I2C_FLAG_READ; + 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 read error at Addr:0x%x\n", RtcRegAddr)); + } + + return Val; +} + +/** + 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 = sizeof (RtcRegAddr); + 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 Second; + UINT8 Minute; + UINT8 Hour; + UINT8 Day; + UINT8 Month; + UINT8 Year; + + if (mI2cMaster == NULL) { + return EFI_DEVICE_ERROR; + } + + Status = EFI_SUCCESS; + + Second = RtcRead (DS1307_SEC_REG_ADDR); + Minute = RtcRead (DS1307_MIN_REG_ADDR); + Hour = RtcRead (DS1307_HR_REG_ADDR); + Day = RtcRead (DS1307_DATE_REG_ADDR); + Month = RtcRead (DS1307_MON_REG_ADDR); + Year = RtcRead (DS1307_YR_REG_ADDR); + + if (Second & DS1307_SEC_BIT_CH) { + DEBUG ((DEBUG_ERROR, "### Warning: RTC oscillator has stopped\n")); + /* clear the CH flag */ + RtcWrite (DS1307_SEC_REG_ADDR, + RtcRead (DS1307_SEC_REG_ADDR) & ~DS1307_SEC_BIT_CH); + Status = EFI_DEVICE_ERROR; + } + + 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); + + 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; + } + + RtcWrite (DS1307_YR_REG_ADDR, DecimalToBcd8 (Time->Year % 100)); + RtcWrite (DS1307_MON_REG_ADDR, DecimalToBcd8 (Time->Month)); + RtcWrite (DS1307_DATE_REG_ADDR, DecimalToBcd8 (Time->Day)); + RtcWrite (DS1307_HR_REG_ADDR, DecimalToBcd8 (Time->Hour)); + RtcWrite (DS1307_MIN_REG_ADDR, DecimalToBcd8 (Time->Minute)); + RtcWrite (DS1307_SEC_REG_ADDR, DecimalToBcd8 (Time->Second)); + + 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/Ds1307RtcLib/Ds1307RtcLib.dec b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec new file mode 100644 index 0000000..1aaf897 --- /dev/null +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec @@ -0,0 +1,26 @@ +#/** @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 = Ds1307RtcLib + PACKAGE_GUID = 0c095cf6-834d-4fa2-a5a0-31ac35591ad2 + PACKAGE_VERSION = 0.1 + +[Guids] + gDs1307RtcLibTokenSpaceGuid = { 0xd939eb84, 0xa95a, 0x46a0, { 0xa8, 0x2b, 0xb9, 0x64, 0x30, 0xcf, 0xf5, 0x99 }} + +[PcdsFixedAtBuild] + gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress|0|UINT8|0x00000001 + gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency|0|UINT32|0x00000002 diff --git a/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf new file mode 100644 index 0000000..1182211 --- /dev/null +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf @@ -0,0 +1,45 @@ +# @Ds1307RtcLib.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 = Ds1307RtcLib + FILE_GUID = 7112fb46-8dda-4a41-ac40-bf212fedfc08 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = RealTimeClockLib + +[Sources.common] + Ds1307RtcLib.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec + +[LibraryClasses] + DebugLib + UefiBootServicesTableLib + UefiLib + +[Protocols] + gEfiDriverBindingProtocolGuid ## CONSUMES + gEfiI2cMasterProtocolGuid ## CONSUMES + +[FixedPcd] + gDs1307RtcLibTokenSpaceGuid.PcdI2cSlaveAddress + gDs1307RtcLibTokenSpaceGuid.PcdI2cBusFrequency + +[Depex] + gEfiI2cMasterProtocolGuid -- 1.9.1