282 lines
12 KiB
C
282 lines
12 KiB
C
/*
|
|
* Copyright (c) 2020, Texas Instruments Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* * Neither the name of Texas Instruments Incorporated nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS 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.
|
|
*/
|
|
|
|
#include <ti/driverlib/dl_rtc_common.h>
|
|
|
|
#if defined __MSPM0_HAS_RTC_A__ || defined __MSPM0_HAS_RTC_B__ || \
|
|
defined __MSPM0_HAS_RTC__
|
|
|
|
void DL_RTC_Common_initCalendar(RTC_Regs *rtc_common,
|
|
DL_RTC_Common_Calendar calendarTime, DL_RTC_COMMON_FORMAT formatSelect)
|
|
{
|
|
DL_RTC_Common_setClockFormat(rtc_common, formatSelect);
|
|
|
|
if (formatSelect == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_setCalendarSecondsBinary(
|
|
rtc_common, calendarTime.seconds);
|
|
DL_RTC_Common_setCalendarMinutesBinary(
|
|
rtc_common, calendarTime.minutes);
|
|
DL_RTC_Common_setCalendarHoursBinary(rtc_common, calendarTime.hours);
|
|
/*
|
|
* Back to back writes to counter/calendar registers such as
|
|
* SEC, MIN, HOUR, DAY, MON, YEAR need to be avoided since writes
|
|
* to calendar registers take 2 to 3 RTCCLK cycles to take effect.
|
|
*/
|
|
DL_Common_updateReg(&rtc_common->DAY,
|
|
(uint32_t) calendarTime.dayOfWeek |
|
|
((uint32_t) calendarTime.dayOfMonth << RTC_DAY_DOMBIN_OFS),
|
|
RTC_DAY_DOW_MASK | RTC_DAY_DOMBIN_MASK);
|
|
DL_RTC_Common_setCalendarMonthBinary(rtc_common, calendarTime.month);
|
|
DL_RTC_Common_setCalendarYearBinary(rtc_common, calendarTime.year);
|
|
} else {
|
|
DL_RTC_Common_setCalendarSecondsBCD(rtc_common, calendarTime.seconds);
|
|
DL_RTC_Common_setCalendarMinutesBCD(rtc_common, calendarTime.minutes);
|
|
DL_RTC_Common_setCalendarHoursBCD(rtc_common, calendarTime.hours);
|
|
DL_Common_updateReg(&rtc_common->DAY,
|
|
(uint32_t) calendarTime.dayOfWeek |
|
|
((uint32_t) calendarTime.dayOfMonth << RTC_DAY_DOMLOWBCD_OFS),
|
|
RTC_DAY_DOW_MASK | RTC_DAY_DOMLOWBCD_MASK |
|
|
RTC_DAY_DOMHIGHBCD_MASK);
|
|
DL_RTC_Common_setCalendarMonthBCD(rtc_common, calendarTime.month);
|
|
DL_RTC_Common_setCalendarYearBCD(rtc_common, calendarTime.year);
|
|
}
|
|
}
|
|
|
|
DL_RTC_Common_Calendar DL_RTC_Common_getCalendarTime(
|
|
const RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_Common_Calendar calendarTime;
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
calendarTime.seconds =
|
|
DL_RTC_Common_getCalendarSecondsBinary(rtc_common);
|
|
calendarTime.minutes =
|
|
DL_RTC_Common_getCalendarMinutesBinary(rtc_common);
|
|
calendarTime.hours = DL_RTC_Common_getCalendarHoursBinary(rtc_common);
|
|
calendarTime.dayOfWeek =
|
|
DL_RTC_Common_getCalendarDayOfWeekBinary(rtc_common);
|
|
calendarTime.dayOfMonth =
|
|
DL_RTC_Common_getCalendarDayOfMonthBinary(rtc_common);
|
|
calendarTime.month = DL_RTC_Common_getCalendarMonthBinary(rtc_common);
|
|
calendarTime.year = DL_RTC_Common_getCalendarYearBinary(rtc_common);
|
|
} else {
|
|
calendarTime.seconds = DL_RTC_Common_getCalendarSecondsBCD(rtc_common);
|
|
calendarTime.minutes = DL_RTC_Common_getCalendarMinutesBCD(rtc_common);
|
|
calendarTime.hours = DL_RTC_Common_getCalendarHoursBCD(rtc_common);
|
|
calendarTime.dayOfWeek =
|
|
DL_RTC_Common_getCalendarDayOfWeekBCD(rtc_common);
|
|
calendarTime.dayOfMonth =
|
|
DL_RTC_Common_getCalendarDayOfMonthBCD(rtc_common);
|
|
calendarTime.month = DL_RTC_Common_getCalendarMonthBCD(rtc_common);
|
|
calendarTime.year = DL_RTC_Common_getCalendarYearBCD(rtc_common);
|
|
}
|
|
|
|
return calendarTime;
|
|
}
|
|
|
|
void DL_RTC_Common_setCalendarAlarm1(
|
|
RTC_Regs *rtc_common, DL_RTC_Common_CalendarAlarm alarmTime)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_setAlarm1MinutesBinary(rtc_common, alarmTime.minutes);
|
|
DL_RTC_Common_setAlarm1HoursBinary(rtc_common, alarmTime.hours);
|
|
DL_RTC_Common_setAlarm1DayOfWeekBinary(
|
|
rtc_common, alarmTime.dayOfWeek);
|
|
DL_RTC_Common_setAlarm1DayOfMonthBinary(
|
|
rtc_common, alarmTime.dayOfMonth);
|
|
} else {
|
|
DL_RTC_Common_setAlarm1MinutesBCD(rtc_common, alarmTime.minutes);
|
|
DL_RTC_Common_setAlarm1HoursBCD(rtc_common, alarmTime.hours);
|
|
DL_RTC_Common_setAlarm1DayOfWeekBCD(rtc_common, alarmTime.dayOfWeek);
|
|
DL_RTC_Common_setAlarm1DayOfMonthBCD(rtc_common, alarmTime.dayOfMonth);
|
|
}
|
|
}
|
|
|
|
DL_RTC_Common_CalendarAlarm DL_RTC_Common_getCalendarAlarm1(
|
|
const RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_Common_CalendarAlarm alarmTime;
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
alarmTime.minutes = DL_RTC_Common_getAlarm1MinutesBinary(rtc_common);
|
|
alarmTime.hours = DL_RTC_Common_getAlarm1HoursBinary(rtc_common);
|
|
alarmTime.dayOfWeek =
|
|
DL_RTC_Common_getAlarm1DayOfWeekBinary(rtc_common);
|
|
alarmTime.dayOfMonth =
|
|
DL_RTC_Common_getAlarm1DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
alarmTime.minutes = DL_RTC_Common_getAlarm1MinutesBCD(rtc_common);
|
|
alarmTime.hours = DL_RTC_Common_getAlarm1HoursBCD(rtc_common);
|
|
alarmTime.dayOfWeek = DL_RTC_Common_getAlarm1DayOfWeekBCD(rtc_common);
|
|
alarmTime.dayOfMonth =
|
|
DL_RTC_Common_getAlarm1DayOfMonthBCD(rtc_common);
|
|
}
|
|
|
|
return alarmTime;
|
|
}
|
|
|
|
void DL_RTC_Common_enableCalendarAlarm1(RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_enableAlarm1MinutesBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm1HoursBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm1DayOfWeekBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm1DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
DL_RTC_Common_enableAlarm1MinutesBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm1HoursBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm1DayOfWeekBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm1DayOfMonthBCD(rtc_common);
|
|
}
|
|
}
|
|
|
|
void DL_RTC_Common_disableCalendarAlarm1(RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_disableAlarm1MinutesBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm1HoursBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm1DayOfWeekBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm1DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
DL_RTC_Common_disableAlarm1MinutesBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm1HoursBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm1DayOfWeekBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm1DayOfMonthBCD(rtc_common);
|
|
}
|
|
}
|
|
|
|
void DL_RTC_Common_setCalendarAlarm2(
|
|
RTC_Regs *rtc_common, DL_RTC_Common_CalendarAlarm alarmTime)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_setAlarm2MinutesBinary(rtc_common, alarmTime.minutes);
|
|
DL_RTC_Common_setAlarm2HoursBinary(rtc_common, alarmTime.hours);
|
|
DL_RTC_Common_setAlarm2DayOfWeekBinary(
|
|
rtc_common, alarmTime.dayOfWeek);
|
|
DL_RTC_Common_setAlarm2DayOfMonthBinary(
|
|
rtc_common, alarmTime.dayOfMonth);
|
|
} else {
|
|
DL_RTC_Common_setAlarm2MinutesBCD(rtc_common, alarmTime.minutes);
|
|
DL_RTC_Common_setAlarm2HoursBCD(rtc_common, alarmTime.hours);
|
|
DL_RTC_Common_setAlarm2DayOfWeekBCD(rtc_common, alarmTime.dayOfWeek);
|
|
DL_RTC_Common_setAlarm2DayOfMonthBCD(rtc_common, alarmTime.dayOfMonth);
|
|
}
|
|
}
|
|
|
|
DL_RTC_Common_CalendarAlarm DL_RTC_Common_getCalendarAlarm2(
|
|
const RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_Common_CalendarAlarm alarmTime;
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
alarmTime.minutes = DL_RTC_Common_getAlarm2MinutesBinary(rtc_common);
|
|
alarmTime.hours = DL_RTC_Common_getAlarm2HoursBinary(rtc_common);
|
|
alarmTime.dayOfWeek =
|
|
DL_RTC_Common_getAlarm2DayOfWeekBinary(rtc_common);
|
|
alarmTime.dayOfMonth =
|
|
DL_RTC_Common_getAlarm2DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
alarmTime.minutes = DL_RTC_Common_getAlarm2MinutesBCD(rtc_common);
|
|
alarmTime.hours = DL_RTC_Common_getAlarm2HoursBCD(rtc_common);
|
|
alarmTime.dayOfWeek = DL_RTC_Common_getAlarm2DayOfWeekBCD(rtc_common);
|
|
alarmTime.dayOfMonth =
|
|
DL_RTC_Common_getAlarm2DayOfMonthBCD(rtc_common);
|
|
}
|
|
|
|
return alarmTime;
|
|
}
|
|
|
|
void DL_RTC_Common_enableCalendarAlarm2(RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_enableAlarm2MinutesBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm2HoursBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm2DayOfWeekBinary(rtc_common);
|
|
DL_RTC_Common_enableAlarm2DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
DL_RTC_Common_enableAlarm2MinutesBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm2HoursBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm2DayOfWeekBCD(rtc_common);
|
|
DL_RTC_Common_enableAlarm2DayOfMonthBCD(rtc_common);
|
|
}
|
|
}
|
|
|
|
void DL_RTC_Common_disableCalendarAlarm2(RTC_Regs *rtc_common)
|
|
{
|
|
DL_RTC_COMMON_FORMAT format;
|
|
|
|
format = DL_RTC_Common_getClockFormat(rtc_common);
|
|
|
|
if (format == DL_RTC_COMMON_FORMAT_BINARY) {
|
|
DL_RTC_Common_disableAlarm2MinutesBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm2HoursBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm2DayOfWeekBinary(rtc_common);
|
|
DL_RTC_Common_disableAlarm2DayOfMonthBinary(rtc_common);
|
|
} else {
|
|
DL_RTC_Common_disableAlarm2MinutesBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm2HoursBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm2DayOfWeekBCD(rtc_common);
|
|
DL_RTC_Common_disableAlarm2DayOfMonthBCD(rtc_common);
|
|
}
|
|
}
|
|
|
|
#endif /* __MSPM0_HAS_RTC_A__ || __MSPM0_HAS_RTC_B__ || defined __MSPM0_HAS_RTC__ */
|