diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/atsam/libraries/libchip/source/rtc.c')
-rw-r--r-- | c/src/lib/libbsp/arm/atsam/libraries/libchip/source/rtc.c | 452 |
1 files changed, 0 insertions, 452 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/rtc.c b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/rtc.c deleted file mode 100644 index 9527585217..0000000000 --- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/rtc.c +++ /dev/null @@ -1,452 +0,0 @@ -/* ---------------------------------------------------------------------------- */ -/* Atmel Microcontroller Software Support */ -/* SAM Software Package License */ -/* ---------------------------------------------------------------------------- */ -/* Copyright (c) 2015, Atmel Corporation */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following condition is met: */ -/* */ -/* - Redistributions of source code must retain the above copyright notice, */ -/* this list of conditions and the disclaimer below. */ -/* */ -/* Atmel's name may not be used to endorse or promote products derived from */ -/* this software without specific prior written permission. */ -/* */ -/* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR */ -/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */ -/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, */ -/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */ -/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ -/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */ -/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ -/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */ -/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* ---------------------------------------------------------------------------- */ - -/** \addtogroup rtc_module Working with RTC - * \ingroup peripherals_module - * The RTC driver provides the interface to configure and use the RTC - * peripheral. - * - * It manages date, time, and alarms.\n - * This timer is clocked by the 32kHz system clock, and is not impacted by - * power management settings (PMC). To be accurate, it is better to use an - * external 32kHz crystal instead of the internal 32kHz RC.\n - * - * It uses BCD format, and time can be set in AM/PM or 24h mode through a - * configuration bit in the mode register.\n - * - * To update date or time, the user has to follow these few steps : - * <ul> - * <li>Set UPDTIM and/or UPDCAL bit(s) in RTC_CR,</li> - * <li>Polling or IRQ on the ACKUPD bit of RTC_CR,</li> - * <li>Clear ACKUPD bit in RTC_SCCR,</li> - * <li>Update Time and/or Calendar values in RTC_TIMR/RTC_CALR (BCD format),</li> - * <li>Clear UPDTIM and/or UPDCAL bit in RTC_CR.</li> - * </ul> - * An alarm can be set to happen on month, date, hours, minutes or seconds, - * by setting the proper "Enable" bit of each of these fields in the Time and - * Calendar registers. - * This allows a large number of configurations to be available for the user. - * Alarm occurrence can be detected even by polling or interrupt. - * - * A check of the validity of the date and time format and values written by - * the user is automatically done. - * Errors are reported through the Valid Entry Register. - * - * For more accurate information, please look at the RTC section of the - * Datasheet. - * - * Related files :\n - * \ref rtc.c\n - * \ref rtc.h.\n - */ -/*@{*/ -/*@}*/ - - -/** - * \file - * - * Implementation of Real Time Clock (RTC) controller. - * - */ - -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "chip.h" - -#include <stdint.h> -#include <assert.h> - -/*---------------------------------------------------------------------------- - * Exported functions - *----------------------------------------------------------------------------*/ - -/** - * \brief Sets the RTC in either 12 or 24 hour mode. - * - * \param mode Hour mode. - */ -extern void RTC_SetHourMode(Rtc *pRtc, uint32_t dwMode) -{ - assert((dwMode & 0xFFFFFFFE) == 0); - - pRtc->RTC_MR = dwMode; -} - -/** - * \brief Gets the RTC mode. - * - * \return Hour mode. - */ -extern uint32_t RTC_GetHourMode(Rtc *pRtc) -{ - uint32_t dwMode; - - TRACE_DEBUG("RTC_SetHourMode()\n\r"); - - dwMode = pRtc->RTC_MR; - dwMode &= 0xFFFFFFFE; - - return dwMode; -} - -/** - * \brief Enables the selected interrupt sources of the RTC. - * - * \param sources Interrupt sources to enable. - */ -extern void RTC_EnableIt(Rtc *pRtc, uint32_t dwSources) -{ - assert((dwSources & (uint32_t)(~0x1F)) == 0); - - TRACE_DEBUG("RTC_EnableIt()\n\r"); - - pRtc->RTC_IER = dwSources; -} - -/** - * \brief Disables the selected interrupt sources of the RTC. - * - * \param sources Interrupt sources to disable. - */ -extern void RTC_DisableIt(Rtc *pRtc, uint32_t dwSources) -{ - assert((dwSources & (uint32_t)(~0x1F)) == 0); - - TRACE_DEBUG("RTC_DisableIt()\n\r"); - - pRtc->RTC_IDR = dwSources; -} - -/** - * \brief Sets the current time in the RTC. - * - * \note In successive update operations, the user must wait at least one second - * after resetting the UPDTIM/UPDCAL bit in the RTC_CR before setting these - * bits again. Please look at the RTC section of the datasheet for detail. - * - * \param ucHour Current hour in 12 or 24 hour mode. - * \param ucMinute Current minute. - * \param ucSecond Current second. - * - * \return 0 success, 1 fail to set - */ -extern int RTC_SetTime(Rtc *pRtc, uint8_t ucHour, uint8_t ucMinute, - uint8_t ucSecond) -{ - uint32_t dwTime = 0; - uint8_t ucHour_bcd; - uint8_t ucMin_bcd; - uint8_t ucSec_bcd; - - TRACE_DEBUG("RTC_SetTime(%02d:%02d:%02d)\n\r", ucHour, ucMinute, ucSecond); - - /* if 12-hour mode, set AMPM bit */ - if ((pRtc->RTC_MR & RTC_MR_HRMOD) == RTC_MR_HRMOD) { - if (ucHour > 12) { - ucHour -= 12; - dwTime |= RTC_TIMR_AMPM; - } - } - - ucHour_bcd = (ucHour % 10) | ((ucHour / 10) << 4); - ucMin_bcd = (ucMinute % 10) | ((ucMinute / 10) << 4); - ucSec_bcd = (ucSecond % 10) | ((ucSecond / 10) << 4); - - /* value overflow */ - if ((ucHour_bcd & (uint8_t)(~RTC_HOUR_BIT_LEN_MASK)) | - (ucMin_bcd & (uint8_t)(~RTC_MIN_BIT_LEN_MASK)) | - (ucSec_bcd & (uint8_t)(~RTC_SEC_BIT_LEN_MASK))) - return 1; - - dwTime = ucSec_bcd | (ucMin_bcd << 8) | (ucHour_bcd << 16); - - pRtc->RTC_CR |= RTC_CR_UPDTIM; - - while ((pRtc->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD); - - pRtc->RTC_SCCR = RTC_SCCR_ACKCLR; - pRtc->RTC_TIMR = dwTime; - pRtc->RTC_CR &= (uint32_t)(~RTC_CR_UPDTIM); - pRtc->RTC_SCCR |= RTC_SCCR_SECCLR; - - return (int)(pRtc->RTC_VER & RTC_VER_NVTIM); -} - -/** - * \brief Retrieves the current time as stored in the RTC in several variables. - * - * \param pucHour If not null, current hour is stored in this variable. - * \param pucMinute If not null, current minute is stored in this variable. - * \param pucSecond If not null, current second is stored in this variable. - */ -extern void RTC_GetTime(Rtc *pRtc, uint8_t *pucHour, - uint8_t *pucMinute, uint8_t *pucSecond) -{ - uint32_t dwTime; - - TRACE_DEBUG("RTC_GetTime()\n\r"); - - /* Get current RTC time */ - dwTime = pRtc->RTC_TIMR; - - while (dwTime != pRtc->RTC_TIMR) - dwTime = pRtc->RTC_TIMR; - - /* Hour */ - if (pucHour) { - *pucHour = ((dwTime & 0x00300000) >> 20) * 10 - + ((dwTime & 0x000F0000) >> 16); - - if ((dwTime & RTC_TIMR_AMPM) == RTC_TIMR_AMPM) - *pucHour += 12; - } - - /* Minute */ - if (pucMinute) { - *pucMinute = ((dwTime & 0x00007000) >> 12) * 10 - + ((dwTime & 0x00000F00) >> 8); - } - - /* Second */ - if (pucSecond) { - *pucSecond = ((dwTime & 0x00000070) >> 4) * 10 - + (dwTime & 0x0000000F); - } -} - -/** - * \brief Sets a time alarm on the RTC. - * The match is performed only on the provided variables; - * Setting all pointers to 0 disables the time alarm. - * - * \note In AM/PM mode, the hour value must have bit #7 set for PM, cleared for - * AM (as expected in the time registers). - * - * \param pucHour If not null, the time alarm will hour-match this value. - * \param pucMinute If not null, the time alarm will minute-match this value. - * \param pucSecond If not null, the time alarm will second-match this value. - * - * \return 0 success, 1 fail to set - */ -extern int RTC_SetTimeAlarm(Rtc *pRtc, uint8_t *pucHour, - uint8_t *pucMinute, uint8_t *pucSecond) -{ - uint32_t dwAlarm = 0; - - TRACE_DEBUG("RTC_SetTimeAlarm()\n\r"); - - /* Hour */ - if (pucHour) - dwAlarm |= RTC_TIMALR_HOUREN | ((*pucHour / 10) << 20) | (( - *pucHour % 10) << 16); - - /* Minute */ - if (pucMinute) { - dwAlarm |= RTC_TIMALR_MINEN | ((*pucMinute / 10) << 12) - | ((*pucMinute % 10) << 8); - } - - /* Second */ - if (pucSecond) - dwAlarm |= RTC_TIMALR_SECEN | ((*pucSecond / 10) << 4) | (*pucSecond % 10); - - pRtc->RTC_TIMALR = dwAlarm; - - return (int)(pRtc->RTC_VER & RTC_VER_NVTIMALR); -} - -/** - * \brief Retrieves the current year, month and day from the RTC. - * Month, day and week values are numbered starting at 1. - * - * \param pYwear Current year (optional). - * \param pucMonth Current month (optional). - * \param pucDay Current day (optional). - * \param pucWeek Current day in current week (optional). - */ -extern void RTC_GetDate(Rtc *pRtc, uint16_t *pwYear, uint8_t *pucMonth, - uint8_t *pucDay, uint8_t *pucWeek) -{ - uint32_t dwDate; - - /* Get current date (multiple reads are necessary to insure a stable value) */ - do { - dwDate = pRtc->RTC_CALR; - } while (dwDate != pRtc->RTC_CALR); - - /* Retrieve year */ - if (pwYear) { - *pwYear = (((dwDate >> 4) & 0x7) * 1000) - + ((dwDate & 0xF) * 100) - + (((dwDate >> 12) & 0xF) * 10) - + ((dwDate >> 8) & 0xF); - } - - /* Retrieve month */ - if (pucMonth) - *pucMonth = (((dwDate >> 20) & 1) * 10) + ((dwDate >> 16) & 0xF); - - /* Retrieve day */ - if (pucDay) - *pucDay = (((dwDate >> 28) & 0x3) * 10) + ((dwDate >> 24) & 0xF); - - /* Retrieve week */ - if (pucWeek) - *pucWeek = ((dwDate >> 21) & 0x7); -} - -/** - * \brief Sets the current year, month and day in the RTC. - * Month, day and week values must be numbered starting from 1. - * - * \note In successive update operations, the user must wait at least one second - * after resetting the UPDTIM/UPDCAL bit in the RTC_CR before setting these - * bits again. Please look at the RTC section of the datasheet for detail. - * - * \param wYear Current year. - * \param ucMonth Current month. - * \param ucDay Current day. - * \param ucWeek Day number in current week. - * - * \return 0 success, 1 fail to set - */ -extern int RTC_SetDate(Rtc *pRtc, uint16_t wYear, uint8_t ucMonth, - uint8_t ucDay, uint8_t ucWeek) -{ - uint32_t wDate; - uint8_t ucCent_bcd; - uint8_t ucYear_bcd; - uint8_t ucMonth_bcd; - uint8_t ucDay_bcd; - uint8_t ucWeek_bcd; - - ucCent_bcd = ((wYear / 100) % 10) | ((wYear / 1000) << 4); - ucYear_bcd = (wYear % 10) | (((wYear / 10) % 10) << 4); - ucMonth_bcd = ((ucMonth % 10) | (ucMonth / 10) << 4); - ucDay_bcd = ((ucDay % 10) | (ucDay / 10) << 4); - ucWeek_bcd = ((ucWeek % 10) | (ucWeek / 10) << 4); - - /* value over flow */ - if ((ucCent_bcd & (uint8_t)(~RTC_CENT_BIT_LEN_MASK)) | - (ucYear_bcd & (uint8_t)(~RTC_YEAR_BIT_LEN_MASK)) | - (ucMonth_bcd & (uint8_t)(~RTC_MONTH_BIT_LEN_MASK)) | - (ucWeek_bcd & (uint8_t)(~RTC_WEEK_BIT_LEN_MASK)) | - (ucDay_bcd & (uint8_t)(~RTC_DATE_BIT_LEN_MASK)) - ) - return 1; - - - /* Convert values to date register value */ - wDate = ucCent_bcd | - (ucYear_bcd << 8) | - (ucMonth_bcd << 16) | - (ucWeek_bcd << 21) | - (ucDay_bcd << 24); - - /* Update calendar register */ - pRtc->RTC_CR |= RTC_CR_UPDCAL; - - while ((pRtc->RTC_SR & RTC_SR_ACKUPD) != RTC_SR_ACKUPD); - - pRtc->RTC_SCCR = RTC_SCCR_ACKCLR; - pRtc->RTC_CALR = wDate; - pRtc->RTC_CR &= (uint32_t)(~RTC_CR_UPDCAL); - pRtc->RTC_SCCR |= RTC_SCCR_SECCLR; /* clear SECENV in SCCR */ - - return (int)(pRtc->RTC_VER & RTC_VER_NVCAL); -} - -/** - * \brief Sets a date alarm in the RTC. - * The alarm will match only the provided values; - * Passing a null-pointer disables the corresponding field match. - * - * \param pucMonth If not null, the RTC alarm will month-match this value. - * \param pucDay If not null, the RTC alarm will day-match this value. - * - * \return 0 success, 1 fail to set - */ -extern int RTC_SetDateAlarm(Rtc *pRtc, uint8_t *pucMonth, uint8_t *pucDay) -{ - uint32_t dwAlarm; - - dwAlarm = ((pucMonth) || (pucDay)) ? (0) : (0x01010000); - - TRACE_DEBUG("RTC_SetDateAlarm()\n\r"); - - /* Compute alarm field value */ - if (pucMonth) { - dwAlarm |= RTC_CALALR_MTHEN | ((*pucMonth / 10) << 20) - | ((*pucMonth % 10) << 16); - } - - if (pucDay) { - dwAlarm |= RTC_CALALR_DATEEN | ((*pucDay / 10) << 28) - | ((*pucDay % 10) << 24); - } - - /* Set alarm */ - pRtc->RTC_CALALR = dwAlarm; - - return (int)(pRtc->RTC_VER & RTC_VER_NVCALALR); -} - -/** - * \brief Clear flag bits of status clear command register in the RTC. - * - * \param mask Bits mask of cleared events - */ -extern void RTC_ClearSCCR(Rtc *pRtc, uint32_t dwMask) -{ - /* Clear all flag bits in status clear command register */ - dwMask &= RTC_SCCR_ACKCLR | RTC_SCCR_ALRCLR | RTC_SCCR_SECCLR - | RTC_SCCR_TIMCLR | RTC_SCCR_CALCLR; - - pRtc->RTC_SCCR = dwMask; -} - -/** - * \brief Get flag bits of status register in the RTC. - * - * \param mask Bits mask of Status Register - * - * \return Status register & mask - */ -extern uint32_t RTC_GetSR(Rtc *pRtc, uint32_t dwMask) -{ - uint32_t dwEvent; - - dwEvent = pRtc->RTC_SR; - - return (dwEvent & dwMask); -} - |