From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.107.0.46; helo=eur02-am5-obe.outbound.protection.outlook.com; envelope-from=meenakshi.aggarwal@nxp.com; receiver=edk2-devel@lists.01.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00046.outbound.protection.outlook.com [40.107.0.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 CB828223230E1 for ; Fri, 16 Feb 2018 00:47:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=FtuwLng2xPZ0FzXku1zBTRm7qj89+BFYAMIwjaDvLbI=; b=w9XS2qtEuElSnJGBFrlZS1ky1egoAd2CPG31vwUSorkY7+E3Z3uLfFYtiBRa98E+QnikbLYMTIvNV2DQ4flUUDpRNNW1UQxnLod06jAz9+ZRYrytVVfrfpT+XOEK/dNM6kgBhI5IeUzKCxug5uJaLGqB/3Z89nzAq4QBzVifP9A= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=meenakshi.aggarwal@nxp.com; Received: from idcbfarm.ap.freescale.net (192.88.169.1) by VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.485.10; Fri, 16 Feb 2018 08:52:48 +0000 From: Meenakshi To: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, michael.d.kinney@intel.com, edk2-devel@lists.01.org Date: Fri, 16 Feb 2018 14:20:02 +0530 Message-Id: <1518771035-6733-7-git-send-email-meenakshi.aggarwal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.169.1] X-ClientProxiedBy: HK2PR02CA0172.apcprd02.prod.outlook.com (2603:1096:201:1f::32) To VI1PR04MB1008.eurprd04.prod.outlook.com (2a01:111:e400:5090::28) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 4535626e-3545-4a9b-3a1b-08d5751aa960 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:VI1PR04MB1008; X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 3:upHXsl8E3fSoLk91JJHM5IXbv8jXNIHxzN9aK/QzVdD2n198l0aJG4keV1OXTOW6VslcwoUsOVD7+ujf6fU1CddoJBgK4e47qoBKy3ocZUlZ0eoHIyuexRrPbB0HpsIYtrwdYbKgQe2kONAIp/6Y0QnIb4DFmLHbmVsjDIpd8GR8Pluk8zrS6R2j2aYE9ijqsQa+xncz/9oxq0yba3oPzko1Ufp5Q1gps9eSPc4ZchAlztXXbLGSSgAieDmjdRJb; 25:lSLx3LCDFY+pNB6XmCVzQrBXTnu3doDF9Z+Na+ASOV92bdZM2tHGJi6KoykEg8mU0kczD1hIuNf9z/X0mBuVw8gqxyHKN+6oOI4WhG8DQCx/oiLlNcpAnuDhiBf2W6yqxfnnIZaSYs/301pD4+XMSo1znaTz4jr40il+LPDR6NVMP0Eggd1HYPAmeKbf0YyTjcJ0R/vzef5xog/NPmQawI2tfRIWpbOPBDvx7NDGCPvAZ30i9RZRNxiCImhR47qkj96eq62qMpJvhHosfb1xRok9HMOQpo1KrpwrPpspjxEaGhhRtkHZ77i7ThZXJlowJQGrdMFAIN9Ru9XtgOV4ug==; 31:joJeS0tnBvitOmCyzB/k4sxd+2Wh7yr5zGUOh7yK8M0G7fOx1fGNDMywlBTr+C4v0aSJs07S/70lqpT7fjjTdT+aowHcRFueezx9aYGgxlnw4jnj2X62Acrati3+78bW68TrFAQkRbYmFqFKW+VAs/ok12O2PyU0CMeAt497EjSPDFsOL8f/YwBMfDSszOnVfOGNDns5w0y98m/n+juhNLKQ0k5YYjRnOvf3wfZ9szA= X-MS-TrafficTypeDiagnostic: VI1PR04MB1008: X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 20:Ngh54Nxr45Q56J4wA+ehAfWFOo2KTv/XJ32kKNn+u2a+36xv6E5SPqxPtWjMB9l7JhPlxgMcW++zMjzKBIoIJykougprQpIQH+2nwLWaxSORa0MXqKD1wcHxfx+hWGuPhKHOFRkWGQ3IVQfo9q9A0hm6+7u4aLrjM9D9bcCNmovZiNPjE2HFYWSNAjSk6q2iDv5cTCMMrdtUKixFR3lRhyj8ExkS2IzUDwSM1uCoigCumkWnexqNImBZpfZ58dCtfu8UP1KKSEGLeLvohS8Bz3ecTXfOCPftY12EFjIu8PxBR68hClFmLiBuvrztHoEkPciFf6av98H5PAtHrlJLUyZmOjVomqqjXxoYc1Ds9zITRxLNQrAU9KUV9NJomNXXQ4Uhh/58M6UWzPyPBlhMbJU2RaByajh+tjbuSxgjVlPJVRFtyiq8Yxov6VoVx4TulSNc5kVYc9xH8pBzMVKbnl8JJQghzTM/6EJt+dAoKcRFsIDR9H7V1P2cD38IXZha; 4:B5zknDd2O4g5uLaLCsvjYa73yjacCNfkRpzUyBlqhTDBkjUHSllsepfzH3BrRDRsIeqII0bkuzp3ImAO/LeIzrqgV6IreIWhaPMX2FoIH+aRvheLHxCcBFtcEO40iuG4gofKte0M0zCVo9ihCrfVFRWnvi/vKUnbcmb4GsEuor3hnfjDrcutbr1DTkvctTZcICh7gBc2tpHiTouoEZuhPZG6OONL/2rrQ9EudUoRlr92gQtfPpDdVYgIJm01+FTj2C4tZ6x3YG/4x2AntMzKqqnJcM+QsPK1teYHUg+HL9IASNpIrBo7NCMwsO5oRI/SUngDCi5cD9S+AwqqkRKANVQ379ZDkyaDYoOsFPvGFTQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(21532816269658); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231101)(944501161)(6055026)(6041288)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR04MB1008; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB1008; X-Forefront-PRVS: 0585417D7B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(376002)(39380400002)(396003)(39860400002)(366004)(199004)(189003)(86362001)(6486002)(8676002)(76176011)(36756003)(53376002)(966005)(4326008)(6116002)(15188155005)(16799955002)(7736002)(386003)(68736007)(186003)(26005)(53936002)(305945005)(16526019)(81156014)(3846002)(6506007)(478600001)(50226002)(16586007)(8936002)(2950100002)(316002)(2906002)(59450400001)(25786009)(97736004)(50466002)(48376002)(105586002)(52116002)(47776003)(81166006)(51416003)(5660300001)(6666003)(106356001)(66066001)(6306002)(6512007)(19627235001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB1008; H:idcbfarm.ap.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR04MB1008; 23:ejmLO4HFEkCe3z8VlzNBwBZvdpkN9EPLTpg9VrONA?= =?us-ascii?Q?V7vE9FyesPJ7obGERfUKqO/fruVmKQ0R8IROoFLw4js8jiCpJDQW9UW1HoDG?= =?us-ascii?Q?/ePwrzBqMJ7aWnOi3dZ22CUfWNCfHjfPrPfIBIgWHs6wnwK2vFyOJh+QAj1H?= =?us-ascii?Q?OIhcRidtN2GW95HCsevsPvDiXEkL1Zdlv5u1m5FH8NFRCIUYBywFQNmbnpt4?= =?us-ascii?Q?0/hSx6K0cdqa2TkLSgyqUpVUuGaqovxv2K8wLMfWdJ99RrDaNGNAgrNjZNxP?= =?us-ascii?Q?jR8Z9WLEc+d/TOBHbjmLLuL0ZCL34E6UFgyqXX/lGBjkCJesqYIlvXNvbGqo?= =?us-ascii?Q?54dI+IetdrOAXYoGAm/ltJnLdpJuHooibWZ1Jghuzj09Gt0hmT1XFTXzlwke?= =?us-ascii?Q?cJm9AcmKfIl83Hxt7Fz3ECGddkMS1TaCB5DRMlEmxFHVnmHWuqIiscAwZEOR?= =?us-ascii?Q?d6VYF5Cu1w9uM+l/SSmlK86lmFVU28z2ZdKjXIA6HPfpbxeW10cjGnedwjv7?= =?us-ascii?Q?PhltVkkhJkMWvygi+68nhh8RFOEZAYchy9BjsskCITuOndUkymS7l5L2Q2Ze?= =?us-ascii?Q?yg+BimO0PcjzvcZfg5DuyLd08Q70Br931KlyGp6WCBdbogsHGAGztHeKWcRy?= =?us-ascii?Q?woFGPPiqz3lOeEQVWuEZnj6Y3EO8rzgI7dou3Q5/YbLTJEVYpQN9Elpq9Ui3?= =?us-ascii?Q?tgdZNNsnDCNBXpMofwS7UFc4Vc/wl69/9EWmfqXdEUeUf8iNTTgS6maP9Yts?= =?us-ascii?Q?5a81cj3WYEtdUQHig3G40mhdYQdCq57jve71DrzGXV7fC1Vypv2PbYBB1ymy?= =?us-ascii?Q?+3aXjUBDuJUwM8B4c7AIU5LPTRL4mWk7lJFiJw6UfGNLkirJTSxUIRniF8uO?= =?us-ascii?Q?yO+7vHTt84HK8DVvHYRbsW2kajwOEUkG2qMKMsCj4gtqAh6+sDi3ajv2xnf9?= =?us-ascii?Q?oO+hj71e5R/lY9WNW+87h5nvdZDPg9qPFJjTMvrQC/eWHcZPs+uvmRKafWMg?= =?us-ascii?Q?pvkP7cfHHN4p2K2m3MQIKMD3tB/twwWDXkBAUvD+g5PGCy/Zkt9vy0w/2Ya7?= =?us-ascii?Q?xtP3nST/wexJpzri64Bz/La9N0if/J53w3suKIq0bDbA5OkrdngxBR+E219V?= =?us-ascii?Q?GoSyVsr3khpFAAHwd8JYFip4MqFzX5KpgEW0/FAxBVB4QEtaeSZ6NzFAqqOe?= =?us-ascii?Q?axSiMhcmuxgxubnUOKx6vcnb1BrPTVN30gG11Jl6xdp/I63XELA4CuRlU/Ya?= =?us-ascii?Q?0F4K8HdwJQy3AW7wlQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR04MB1008; 6:UGvwRaKUS3v8VKLjrY6+JBTKNsCcmj/dRngaZ+FPTUO7rsr5E/QfTsyWSGgT9m5PkDItpqNto7I5Vw67JyTIES5WVW7QNV+ugXlHHayGvjS5TpNjtIpBR3xPqONVzFGxIZ8SH807L6y/PzMBgJtYoke1HklaChSEa5fDY7sg7aYLyzeJrlcDz99TTrCJn/SFDHA/9FtPyUiqwnJOQt+BCm4cctTgamBHNCgi+Xfyx73cIEAlfyU8T3YaChx2G3DJNim3k5atdEqRrTrUrRjWnlTKZSQ0HUaHWgT2Zt7TlSyraQlZXwuBiGZ/H00eyGkhZhryzV/qxBfgZXXbsU69Yt8F+UWXcOYU0xsmGDAngyg=; 5:fWS0J57xZzU3Cgr++soJIlZzbtGH/x+VylZ+eg02ZqLhOx5oDXrxNTLI14rXqv9L3HFkwz/DOC6YAPYpLRTtTA6ZxXvMqubj3PaAs1ZkW3cL7rtywSoHliS/nLSxWQweGBECnneDjtiIy7SW3qJmK0cTf+o+k7ODWsWkaAnUNWI=; 24:TWQgswd3/GUethl3Sd3fQEu5+sfLEfYipY/QqEgHXndLwHyGL926c2XTuxWtQhe9XMwQkw0rot9PkxFv3jlasJNtbbkfzkwPKBhJjt1bqbI=; 7:mRKxWVyNwZolmJlp4QymFxtTrKy8RbY5VhtUwyfmx2KDjEznsRRzGANxF0ACijgSXYBobbn9gJhtBD7kZngG5i0lyh5DVPSiIh8USHUetOIgwEbsA/a/dljCmt1TzorsdqKlc5MBJ/rs7yaxWXreTFXEiqJxzK+oJnCvUyhRugMhjg03bzOj1W/B9OZP4pSN03aDntiCcTEJjwK5t6RYWYC1yJZqIU/oZ3HPquDduapS+E7jEzPEE0qyeL8RFfVv SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2018 08:52:48.4204 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4535626e-3545-4a9b-3a1b-08d5751aa960 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB1008 Subject: [PATCH edk2-platforms 06/39] Silicon/Maxim : Add support for DS1307 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, 16 Feb 2018 08:47:01 -0000 Content-Type: text/plain From: Meenakshi Aggarwal 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 | 329 +++++++++++++++++++++ .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.dec | 26 ++ .../Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.inf | 45 +++ 4 files changed, 459 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..cf45d49 --- /dev/null +++ b/Silicon/Maxim/Library/Ds1307RtcLib/Ds1307RtcLib.c @@ -0,0 +1,329 @@ +/** 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. + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this + platform. + +**/ +EFI_STATUS +EFIAPI +LibGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +{ + // The DS1307 does not support setting the alarm + 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 + ) +{ + // The DS1307 does not support setting the alarm + 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..268873b --- /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 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