remove unused ASF code
This commit is contained in:
		
							parent
							
								
									a65dcf1ec8
								
							
						
					
					
						commit
						b353e47506
					
				
							
								
								
									
										7
									
								
								make.mk
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								make.mk
									
									
									
									
									
								
							| @ -31,8 +31,6 @@ LDFLAGS += -mcpu=cortex-m0plus -mthumb | |||||||
| LDFLAGS += -Wl,--gc-sections | LDFLAGS += -Wl,--gc-sections | ||||||
| LDFLAGS += -Wl,--script=$(TOP)//watch-library/linker/saml22j18.ld | LDFLAGS += -Wl,--script=$(TOP)//watch-library/linker/saml22j18.ld | ||||||
| 
 | 
 | ||||||
| # If you add any additional directories with headers, add them to this list, e.g.
 |  | ||||||
| # ../drivers/
 |  | ||||||
| INCLUDES += \
 | INCLUDES += \
 | ||||||
|   -I$(TOP)/tinyusb/src \
 |   -I$(TOP)/tinyusb/src \
 | ||||||
|   -I$(TOP)/boards/$(BOARD) \
 |   -I$(TOP)/boards/$(BOARD) \
 | ||||||
| @ -54,7 +52,6 @@ INCLUDES += \ | |||||||
|   -I$(TOP)/watch-library/hpl/oscctrl/ \
 |   -I$(TOP)/watch-library/hpl/oscctrl/ \
 | ||||||
|   -I$(TOP)/watch-library/hpl/pm/ \
 |   -I$(TOP)/watch-library/hpl/pm/ \
 | ||||||
|   -I$(TOP)/watch-library/hpl/port/ \
 |   -I$(TOP)/watch-library/hpl/port/ \
 | ||||||
|   -I$(TOP)/watch-library/hpl/rtc/ \
 |  | ||||||
|   -I$(TOP)/watch-library/hpl/sercom/ \
 |   -I$(TOP)/watch-library/hpl/sercom/ \
 | ||||||
|   -I$(TOP)/watch-library/hpl/slcd/ \
 |   -I$(TOP)/watch-library/hpl/slcd/ \
 | ||||||
|   -I$(TOP)/watch-library/hpl/systick/ \
 |   -I$(TOP)/watch-library/hpl/systick/ \
 | ||||||
| @ -64,8 +61,6 @@ INCLUDES += \ | |||||||
|   -I$(TOP)/watch-library/watch/ \
 |   -I$(TOP)/watch-library/watch/ \
 | ||||||
|   -I$(TOP)/watch-library |   -I$(TOP)/watch-library | ||||||
| 
 | 
 | ||||||
| # If you add any additional C files to your project, add them each to this list, e.g.
 |  | ||||||
| # ../drivers/st25dv.c
 |  | ||||||
| SRCS += \
 | SRCS += \
 | ||||||
|   $(TOP)/tinyusb/src/tusb.c \
 |   $(TOP)/tinyusb/src/tusb.c \
 | ||||||
|   $(TOP)/tinyusb/src/common/tusb_fifo.c \
 |   $(TOP)/tinyusb/src/common/tusb_fifo.c \
 | ||||||
| @ -78,7 +73,6 @@ SRCS += \ | |||||||
|   $(TOP)/watch-library/hw/driver_init.c \
 |   $(TOP)/watch-library/hw/driver_init.c \
 | ||||||
|   $(TOP)/watch-library/watch/watch.c \
 |   $(TOP)/watch-library/watch/watch.c \
 | ||||||
|   $(TOP)/watch-library/hal/src/hal_atomic.c \
 |   $(TOP)/watch-library/hal/src/hal_atomic.c \
 | ||||||
|   $(TOP)/watch-library/hal/src/hal_calendar.c \
 |  | ||||||
|   $(TOP)/watch-library/hal/src/hal_delay.c \
 |   $(TOP)/watch-library/hal/src/hal_delay.c \
 | ||||||
|   $(TOP)/watch-library/hal/src/hal_ext_irq.c \
 |   $(TOP)/watch-library/hal/src/hal_ext_irq.c \
 | ||||||
|   $(TOP)/watch-library/hal/src/hal_gpio.c \
 |   $(TOP)/watch-library/hal/src/hal_gpio.c \
 | ||||||
| @ -100,7 +94,6 @@ SRCS += \ | |||||||
|   $(TOP)/watch-library/hpl/osc32kctrl/hpl_osc32kctrl.c \
 |   $(TOP)/watch-library/hpl/osc32kctrl/hpl_osc32kctrl.c \
 | ||||||
|   $(TOP)/watch-library/hpl/oscctrl/hpl_oscctrl.c \
 |   $(TOP)/watch-library/hpl/oscctrl/hpl_oscctrl.c \
 | ||||||
|   $(TOP)/watch-library/hpl/pm/hpl_pm.c \
 |   $(TOP)/watch-library/hpl/pm/hpl_pm.c \
 | ||||||
|   $(TOP)/watch-library/hpl/rtc/hpl_rtc.c \
 |  | ||||||
|   $(TOP)/watch-library/hpl/sercom/hpl_sercom.c \
 |   $(TOP)/watch-library/hpl/sercom/hpl_sercom.c \
 | ||||||
|   $(TOP)/watch-library/hpl/slcd/hpl_slcd.c \
 |   $(TOP)/watch-library/hpl/slcd/hpl_slcd.c \
 | ||||||
|   $(TOP)/watch-library/hpl/systick/hpl_systick.c \
 |   $(TOP)/watch-library/hpl/systick/hpl_systick.c \
 | ||||||
|  | |||||||
| @ -1,72 +0,0 @@ | |||||||
| =============================== |  | ||||||
| The Calendar driver (bare-bone) |  | ||||||
| =============================== |  | ||||||
| 
 |  | ||||||
| The Calendar driver provides means to set and get current date and time. |  | ||||||
| After enabling, an instance of the driver starts counting time from the base date with |  | ||||||
| the resolution of one second. The default base date is 00:00:00 1st of January 1970. |  | ||||||
| Only the base year of the base date can be changed via the driver API. |  | ||||||
| 
 |  | ||||||
| The current date and time is kept internally in a relative form as the difference between |  | ||||||
| current date and time and the base date and time. This means that changing the base year changes |  | ||||||
| current date. |  | ||||||
| 
 |  | ||||||
| The base date and time defines time "zero" or the earliest possible point in time that the calender driver can describe, |  | ||||||
| this means that current time and alarms can not be set to anything earlier than this time. |  | ||||||
| 
 |  | ||||||
| The Calendar driver provides alarm functionality. |  | ||||||
| An alarm is a software trigger which fires on particular date and time with particular periodicity. |  | ||||||
| Upon firing the given callback function is called. |  | ||||||
| 
 |  | ||||||
| An alarm can be in single-shot mode, firing only once at matching time; or in repeating mode, meaning that it will |  | ||||||
| reschedule a new alarm automatically based on repeating mode configuration. |  | ||||||
| In single-shot mode an alarm is removed from the alarm queue before its callback is called. It allows an application to |  | ||||||
| reuse the memory of expired alarm in the callback. |  | ||||||
| 
 |  | ||||||
| An alarm can be triggered on the following events: match on second, minute, hour, day, month or year. |  | ||||||
| Matching on second means that the alarm is triggered when the value of seconds of the current time is equal to |  | ||||||
| the alarm's value of seconds. This means repeating alarm with match on seconds is triggered with the period of a minute. |  | ||||||
| Matching on minute means that the calendars minute and seconds values has to match the alarms, the rest of the date-time |  | ||||||
| value is ignored. In repeating mode this means a new alarm every hour. |  | ||||||
| The same logic is applied to match on hour, day, month and year. |  | ||||||
| 
 |  | ||||||
| Each instance of the Calendar driver supports infinite amount of software alarms, only limited by the amount of RAM available. |  | ||||||
| 
 |  | ||||||
| Features |  | ||||||
| -------- |  | ||||||
| * Initialization and de-initialization |  | ||||||
| * Enabling and disabling |  | ||||||
| * Date and time operations |  | ||||||
| * Software alarms |  | ||||||
| 
 |  | ||||||
| Applications |  | ||||||
| ------------ |  | ||||||
| * A source of current date and time for an embedded system. |  | ||||||
| * Periodical functionality in low-power applications since the driver is designed to use 1Hz clock. |  | ||||||
| * Periodical function calls in case if it is more convenient to operate with absolute time. |  | ||||||
| 
 |  | ||||||
| Dependencies |  | ||||||
| ------------ |  | ||||||
| * This driver expects a counter to be increased by one every second to count date and time correctly. |  | ||||||
| * Each instance of the driver requires separate hardware timer. |  | ||||||
| 
 |  | ||||||
| Concurrency |  | ||||||
| ----------- |  | ||||||
| The Calendar driver is an interrupt driven driver.This means that the interrupt that triggers an alarm may occur during |  | ||||||
| the process of adding or removing an alarm via the driver's API. In such case the interrupt processing is postponed |  | ||||||
| until the alarm adding or removing is complete. |  | ||||||
| 
 |  | ||||||
| The alarm queue is not protected from the access by interrupts not used by the driver. Due to this |  | ||||||
| it is not recommended to add or remove an alarm from such interrupts: in case if a higher priority interrupt supersedes |  | ||||||
| the driver's interrupt, adding or removing an alarm may cause unpredictable behavior of the driver. |  | ||||||
| 
 |  | ||||||
| Limitations |  | ||||||
| ----------- |  | ||||||
| * Only years divisible by 4 are deemed a leap year, this gives a correct result between the years 1901 to 2099. |  | ||||||
| * The driver is designed to work outside of an operating system environment, the software alarm queue is therefore processed in interrupt context which may delay execution of other interrupts. |  | ||||||
| * If there are a lot of frequently called interrupts with the priority higher than the driver's one, it may cause delay in alarm's triggering. |  | ||||||
| * Changing the base year or setting current date or time does not shift alarms' date and time accordingly or expires alarms. |  | ||||||
| 
 |  | ||||||
| Knows issues and workarounds |  | ||||||
| ---------------------------- |  | ||||||
| Not applicable |  | ||||||
| @ -1,159 +0,0 @@ | |||||||
| /**
 |  | ||||||
|  * \file |  | ||||||
|  * |  | ||||||
|  * \brief Generic CALENDAR functionality declaration. |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries. |  | ||||||
|  * |  | ||||||
|  * \asf_license_start |  | ||||||
|  * |  | ||||||
|  * \page License |  | ||||||
|  * |  | ||||||
|  * Subject to your compliance with these terms, you may use Microchip |  | ||||||
|  * software and any derivatives exclusively with Microchip products. |  | ||||||
|  * It is your responsibility to comply with third party license terms applicable |  | ||||||
|  * to your use of third party software (including open source software) that |  | ||||||
|  * may accompany Microchip software. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, |  | ||||||
|  * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, |  | ||||||
|  * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, |  | ||||||
|  * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE |  | ||||||
|  * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL |  | ||||||
|  * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE |  | ||||||
|  * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE |  | ||||||
|  * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT |  | ||||||
|  * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY |  | ||||||
|  * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, |  | ||||||
|  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. |  | ||||||
|  * |  | ||||||
|  * \asf_license_stop |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef _HAL_CALENDER_H_INCLUDED |  | ||||||
| #define _HAL_CALENDER_H_INCLUDED |  | ||||||
| 
 |  | ||||||
| #include "hpl_calendar.h" |  | ||||||
| #include <utils_list.h> |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \addtogroup doc_driver_hal_calendar_async |  | ||||||
|  * |  | ||||||
|  *@{ |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /** \brief Prototype of callback on alarm match
 |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  */ |  | ||||||
| typedef void (*calendar_cb_alarm_t)(struct calendar_descriptor *const calendar); |  | ||||||
| 
 |  | ||||||
| /** \brief Struct for alarm time
 |  | ||||||
|  */ |  | ||||||
| struct calendar_alarm { |  | ||||||
| 	struct list_element    elem; |  | ||||||
| 	struct _calendar_alarm cal_alarm; |  | ||||||
| 	calendar_cb_alarm_t    callback; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /** \brief Initialize the Calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param hw       Pointer to the hardware instance. |  | ||||||
|  *  \return Operation status of init |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_init(struct calendar_descriptor *const calendar, const void *hw); |  | ||||||
| 
 |  | ||||||
| /** \brief Reset the Calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  Reset Calendar instance to hardware defaults. |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \return Operation status of reset. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_deinit(struct calendar_descriptor *const calendar); |  | ||||||
| 
 |  | ||||||
| /** \brief Enable the Calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \return Operation status of init |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_enable(struct calendar_descriptor *const calendar); |  | ||||||
| 
 |  | ||||||
| /** \brief Disable the Calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  Disable Calendar instance to hardware defaults. |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \return Operation status of reset. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_disable(struct calendar_descriptor *const calendar); |  | ||||||
| 
 |  | ||||||
| /** \brief Configure the base year for calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param p_base_year The desired base year. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_baseyear(struct calendar_descriptor *const calendar, const uint32_t p_base_year); |  | ||||||
| 
 |  | ||||||
| /** \brief Configure the time for calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param p_calendar_time Pointer to the time configuration. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_time(struct calendar_descriptor *const calendar, struct calendar_time *const p_calendar_time); |  | ||||||
| 
 |  | ||||||
| /** \brief Configure the date for calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param p_calendar_date Pointer to the date configuration. |  | ||||||
|  *  \return Operation status of time set. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_date(struct calendar_descriptor *const calendar, struct calendar_date *const p_calendar_date); |  | ||||||
| 
 |  | ||||||
| /** \brief Get the time for calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param date_time Pointer to the value that will be filled with the current time. |  | ||||||
|  *  \return Operation status of time retrieve. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_get_date_time(struct calendar_descriptor *const calendar, struct calendar_date_time *const date_time); |  | ||||||
| 
 |  | ||||||
| /** \brief Config the alarm time for calendar HAL instance and hardware
 |  | ||||||
|  * |  | ||||||
|  *  Set the alarm time to calendar instance. If the callback is NULL, remove |  | ||||||
|  *  the alarm if the alarm is already added, otherwise, ignore the alarm. |  | ||||||
|  * |  | ||||||
|  *  \param calendar Pointer to the HAL Calendar instance. |  | ||||||
|  *  \param alarm Pointer to the configuration. |  | ||||||
|  *  \param callback Pointer to the callback function. |  | ||||||
|  *  \return Operation status of alarm time set. |  | ||||||
|  *  \retval 0       Completed successfully. |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_alarm(struct calendar_descriptor *const calendar, struct calendar_alarm *const alarm, |  | ||||||
|                            calendar_cb_alarm_t callback); |  | ||||||
| 
 |  | ||||||
| /** \brief Retrieve the current driver version
 |  | ||||||
|  *  \return Current driver version. |  | ||||||
|  */ |  | ||||||
| uint32_t calendar_get_version(void); |  | ||||||
| 
 |  | ||||||
| /**@}*/ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #endif /* _HAL_CALENDER_H_INCLUDED */ |  | ||||||
| @ -33,68 +33,10 @@ | |||||||
| #ifndef _HPL_CALENDER_H_INCLUDED | #ifndef _HPL_CALENDER_H_INCLUDED | ||||||
| #define _HPL_CALENDER_H_INCLUDED | #define _HPL_CALENDER_H_INCLUDED | ||||||
| 
 | 
 | ||||||
| #include <compiler.h> |  | ||||||
| #include <utils_list.h> |  | ||||||
| #include "hpl_irq.h" |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * \brief Calendar structure |  | ||||||
|  * |  | ||||||
|  * The Calendar structure forward declaration. |  | ||||||
|  */ |  | ||||||
| struct calendar_dev; |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Available mask options for alarms. |  | ||||||
|  * |  | ||||||
|  * Available mask options for alarms. |  | ||||||
|  */ |  | ||||||
| enum calendar_alarm_option { |  | ||||||
| 	/** Alarm disabled. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_DISABLED = 0, |  | ||||||
| 	/** Alarm match on second. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_SEC, |  | ||||||
| 	/** Alarm match on second and minute. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_MIN, |  | ||||||
| 	/** Alarm match on second, minute, and hour. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_HOUR, |  | ||||||
| 	/** Alarm match on second, minute, hour, and day. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_DAY, |  | ||||||
| 	/** Alarm match on second, minute, hour, day, and month. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_MONTH, |  | ||||||
| 	/** Alarm match on second, minute, hour, day, month and year. */ |  | ||||||
| 	CALENDAR_ALARM_MATCH_YEAR |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Available mode for alarms. |  | ||||||
|  */ |  | ||||||
| enum calendar_alarm_mode { ONESHOT = 1, REPEAT }; |  | ||||||
| /**
 |  | ||||||
|  * \brief Prototype of callback on alarm match |  | ||||||
|  */ |  | ||||||
| typedef void (*calendar_drv_cb_t)(); |  | ||||||
| typedef void (*calendar_drv_extwake_cb_t)(uint8_t reason); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Structure of Calendar instance |  | ||||||
|  */ |  | ||||||
| struct calendar_dev { |  | ||||||
| 	/** Pointer to the hardware base */ |  | ||||||
| 	void *hw; |  | ||||||
| 	/** Alarm match callback */ |  | ||||||
| 	calendar_drv_cb_t callback_alarm; |  | ||||||
| 	/** Tamper callback */ |  | ||||||
| 	calendar_drv_extwake_cb_t callback_tamper; |  | ||||||
| 	/** Tick callback */ |  | ||||||
| 	calendar_drv_cb_t callback_tick; |  | ||||||
| 	/** IRQ struct */ |  | ||||||
| 	struct _irq_descriptor irq; |  | ||||||
| }; |  | ||||||
| /**
 | /**
 | ||||||
|  * \brief Time struct for calendar |  * \brief Time struct for calendar | ||||||
|  */ |  */ | ||||||
| @ -119,17 +61,6 @@ struct calendar_date { | |||||||
| 	uint16_t year; | 	uint16_t year; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** \brief Calendar driver struct
 |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| struct calendar_descriptor { |  | ||||||
| 	struct calendar_dev    device; |  | ||||||
| 	struct list_descriptor alarms; |  | ||||||
| 	/*base date/time = base_year/1/1/0/0/0(year/month/day/hour/min/sec)*/ |  | ||||||
| 	uint32_t base_year; |  | ||||||
| 	uint8_t  flags; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /** \brief Date&Time struct for calendar
 | /** \brief Date&Time struct for calendar
 | ||||||
|  */ |  */ | ||||||
| struct calendar_date_time { | struct calendar_date_time { | ||||||
| @ -137,188 +68,6 @@ struct calendar_date_time { | |||||||
| 	struct calendar_date date; | 	struct calendar_date date; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** \brief struct for alarm time
 |  | ||||||
|  */ |  | ||||||
| struct _calendar_alarm { |  | ||||||
| 	struct calendar_date_time  datetime; |  | ||||||
| 	uint32_t                   timestamp; |  | ||||||
| 	enum calendar_alarm_option option; |  | ||||||
| 	enum calendar_alarm_mode   mode; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /** \enum for tamper detection mode
 |  | ||||||
|  */ |  | ||||||
| enum tamper_detection_mode { TAMPER_MODE_OFF = 0U, TAMPER_MODE_WAKE, TAMPER_MODE_CAPTURE, TAMPER_MODE_ACTL }; |  | ||||||
| 
 |  | ||||||
| /** \enum for tamper detection mode
 |  | ||||||
|  */ |  | ||||||
| enum tamper_id { TAMPID0 = 0U, TAMPID1, TAMPID2, TAMPID3, TAMPID4 }; |  | ||||||
| /**
 |  | ||||||
|  * \brief Initialize Calendar instance |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_init(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Deinitialize Calendar instance |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_deinit(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Calendar instance |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_enable(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Disable Calendar instance |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_disable(struct calendar_dev *const dev); |  | ||||||
| /**
 |  | ||||||
|  * \brief Set counter for calendar |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] counter The counter for set |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_set_counter(struct calendar_dev *const dev, const uint32_t counter); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Get counter for calendar |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return return current counter value |  | ||||||
|  */ |  | ||||||
| uint32_t _calendar_get_counter(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Set compare value for calendar |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] comp The compare value for set |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_set_comp(struct calendar_dev *const dev, const uint32_t comp); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Get compare value for calendar |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return return current compare value |  | ||||||
|  */ |  | ||||||
| uint32_t _calendar_get_comp(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Register callback for calendar alarm |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] callback The pointer to callback function |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_register_callback(struct calendar_dev *const dev, calendar_drv_cb_t callback); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Set calendar IRQ |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  */ |  | ||||||
| void _calendar_set_irq(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Register callback for 1Hz tick from prescaler |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] callback The pointer to callback function |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _prescaler_register_callback(struct calendar_dev *const dev, calendar_drv_cb_t callback); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Register callback for tamper detection |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] callback The pointer to callback function |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _extwake_register_callback(struct calendar_dev *const dev, calendar_drv_extwake_cb_t callback); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Find tamper is detected on specified pin |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] enum Tamper ID number |  | ||||||
|  * |  | ||||||
|  * \return true on detection success and false on failure. |  | ||||||
|  */ |  | ||||||
| bool _is_tamper_detected(struct calendar_dev *const dev, enum tamper_id tamper_id_pin); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief brief Clear the Tamper ID flag |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * \param[in] enum Tamper ID number |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_clear_tampid_flag(struct calendar_dev *const dev, enum tamper_id tamper_id_pin); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Debounce Asynchronous Feature |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_enable_debounce_asynchronous(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Disable Tamper Debounce Asynchronous Feature |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_disable_debounce_asynchronous(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Tamper Debounce Majority Feature |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_enable_debounce_majority(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Tamper Debounce Majority Feature |  | ||||||
|  * |  | ||||||
|  * \param[in] dev The pointer to calendar device struct |  | ||||||
|  * |  | ||||||
|  * \return ERR_NONE on success, or an error code on failure. |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_disable_debounce_majority(struct calendar_dev *const dev); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1,645 +0,0 @@ | |||||||
| /**
 |  | ||||||
|  * \file |  | ||||||
|  * |  | ||||||
|  * \brief Generic CALENDAR functionality implementation. |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries. |  | ||||||
|  * |  | ||||||
|  * \asf_license_start |  | ||||||
|  * |  | ||||||
|  * \page License |  | ||||||
|  * |  | ||||||
|  * Subject to your compliance with these terms, you may use Microchip |  | ||||||
|  * software and any derivatives exclusively with Microchip products. |  | ||||||
|  * It is your responsibility to comply with third party license terms applicable |  | ||||||
|  * to your use of third party software (including open source software) that |  | ||||||
|  * may accompany Microchip software. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, |  | ||||||
|  * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, |  | ||||||
|  * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, |  | ||||||
|  * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE |  | ||||||
|  * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL |  | ||||||
|  * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE |  | ||||||
|  * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE |  | ||||||
|  * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT |  | ||||||
|  * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY |  | ||||||
|  * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, |  | ||||||
|  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. |  | ||||||
|  * |  | ||||||
|  * \asf_license_stop |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include "hal_calendar.h" |  | ||||||
| #include <utils.h> |  | ||||||
| #include <utils_assert.h> |  | ||||||
| #include <hal_atomic.h> |  | ||||||
| 
 |  | ||||||
| #define CALENDAR_VERSION 0x00000001u |  | ||||||
| #define SECS_IN_LEAP_YEAR 31622400 |  | ||||||
| #define SECS_IN_NON_LEAP_YEAR 31536000 |  | ||||||
| #define SECS_IN_31DAYS 2678400 |  | ||||||
| #define SECS_IN_30DAYS 2592000 |  | ||||||
| #define SECS_IN_29DAYS 2505600 |  | ||||||
| #define SECS_IN_28DAYS 2419200 |  | ||||||
| #define SECS_IN_DAY 86400 |  | ||||||
| #define SECS_IN_HOUR 3600 |  | ||||||
| #define SECS_IN_MINUTE 60 |  | ||||||
| #define DEFAULT_BASE_YEAR 1970 |  | ||||||
| 
 |  | ||||||
| #define SET_ALARM_BUSY 1 |  | ||||||
| #define PROCESS_ALARM_BUSY 2 |  | ||||||
| 
 |  | ||||||
| /** \brief leap year check
 |  | ||||||
|  *  \retval false  not leap year. |  | ||||||
|  *  \retval true  leap year. |  | ||||||
|  */ |  | ||||||
| static bool leap_year(uint16_t year) |  | ||||||
| { |  | ||||||
| 	if (year & 3) { |  | ||||||
| 		return false; |  | ||||||
| 	} else { |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief calculate the seconds in specified year/month
 |  | ||||||
|  *  \retval 0  month error. |  | ||||||
|  */ |  | ||||||
| static uint32_t get_secs_in_month(uint32_t year, uint8_t month) |  | ||||||
| { |  | ||||||
| 	uint32_t sec_in_month = 0; |  | ||||||
| 
 |  | ||||||
| 	if (leap_year(year)) { |  | ||||||
| 		switch (month) { |  | ||||||
| 		case 1: |  | ||||||
| 		case 3: |  | ||||||
| 		case 5: |  | ||||||
| 		case 7: |  | ||||||
| 		case 8: |  | ||||||
| 		case 10: |  | ||||||
| 		case 12: |  | ||||||
| 			sec_in_month = SECS_IN_31DAYS; |  | ||||||
| 			break; |  | ||||||
| 		case 2: |  | ||||||
| 			sec_in_month = SECS_IN_29DAYS; |  | ||||||
| 			break; |  | ||||||
| 		case 4: |  | ||||||
| 		case 6: |  | ||||||
| 		case 9: |  | ||||||
| 		case 11: |  | ||||||
| 			sec_in_month = SECS_IN_30DAYS; |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		switch (month) { |  | ||||||
| 		case 1: |  | ||||||
| 		case 3: |  | ||||||
| 		case 5: |  | ||||||
| 		case 7: |  | ||||||
| 		case 8: |  | ||||||
| 		case 10: |  | ||||||
| 		case 12: |  | ||||||
| 			sec_in_month = SECS_IN_31DAYS; |  | ||||||
| 			break; |  | ||||||
| 		case 2: |  | ||||||
| 			sec_in_month = SECS_IN_28DAYS; |  | ||||||
| 			break; |  | ||||||
| 		case 4: |  | ||||||
| 		case 6: |  | ||||||
| 		case 9: |  | ||||||
| 		case 11: |  | ||||||
| 			sec_in_month = SECS_IN_30DAYS; |  | ||||||
| 			break; |  | ||||||
| 		default: |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return sec_in_month; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief convert timestamp to date/time
 |  | ||||||
|  */ |  | ||||||
| static int32_t convert_timestamp_to_datetime(struct calendar_descriptor *const calendar, uint32_t ts, |  | ||||||
|                                              struct calendar_date_time *dt) |  | ||||||
| { |  | ||||||
| 	uint32_t tmp, sec_in_year, sec_in_month; |  | ||||||
| 	uint32_t tmp_year    = calendar->base_year; |  | ||||||
| 	uint8_t  tmp_month   = 1; |  | ||||||
| 	uint8_t  tmp_day     = 1; |  | ||||||
| 	uint8_t  tmp_hour    = 0; |  | ||||||
| 	uint8_t  tmp_minutes = 0; |  | ||||||
| 
 |  | ||||||
| 	tmp = ts; |  | ||||||
| 
 |  | ||||||
| 	/* Find year */ |  | ||||||
| 	while (true) { |  | ||||||
| 		sec_in_year = leap_year(tmp_year) ? SECS_IN_LEAP_YEAR : SECS_IN_NON_LEAP_YEAR; |  | ||||||
| 
 |  | ||||||
| 		if (tmp >= sec_in_year) { |  | ||||||
| 			tmp -= sec_in_year; |  | ||||||
| 			tmp_year++; |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	/* Find month of year */ |  | ||||||
| 	while (true) { |  | ||||||
| 		sec_in_month = get_secs_in_month(tmp_year, tmp_month); |  | ||||||
| 
 |  | ||||||
| 		if (tmp >= sec_in_month) { |  | ||||||
| 			tmp -= sec_in_month; |  | ||||||
| 			tmp_month++; |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	/* Find day of month */ |  | ||||||
| 	while (true) { |  | ||||||
| 		if (tmp >= SECS_IN_DAY) { |  | ||||||
| 			tmp -= SECS_IN_DAY; |  | ||||||
| 			tmp_day++; |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	/* Find hour of day */ |  | ||||||
| 	while (true) { |  | ||||||
| 		if (tmp >= SECS_IN_HOUR) { |  | ||||||
| 			tmp -= SECS_IN_HOUR; |  | ||||||
| 			tmp_hour++; |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	/* Find minute in hour */ |  | ||||||
| 	while (true) { |  | ||||||
| 		if (tmp >= SECS_IN_MINUTE) { |  | ||||||
| 			tmp -= SECS_IN_MINUTE; |  | ||||||
| 			tmp_minutes++; |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	dt->date.year  = tmp_year; |  | ||||||
| 	dt->date.month = tmp_month; |  | ||||||
| 	dt->date.day   = tmp_day; |  | ||||||
| 	dt->time.hour  = tmp_hour; |  | ||||||
| 	dt->time.min   = tmp_minutes; |  | ||||||
| 	dt->time.sec   = tmp; |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief convert date/time to timestamp
 |  | ||||||
|  *  \return timestamp |  | ||||||
|  */ |  | ||||||
| static uint32_t convert_datetime_to_timestamp(struct calendar_descriptor *const calendar, struct calendar_date_time *dt) |  | ||||||
| { |  | ||||||
| 	uint32_t tmp = 0; |  | ||||||
| 	uint32_t i   = 0; |  | ||||||
| 	uint8_t  year, month, day, hour, minutes, seconds; |  | ||||||
| 
 |  | ||||||
| 	year    = dt->date.year - calendar->base_year; |  | ||||||
| 	month   = dt->date.month; |  | ||||||
| 	day     = dt->date.day; |  | ||||||
| 	hour    = dt->time.hour; |  | ||||||
| 	minutes = dt->time.min; |  | ||||||
| 	seconds = dt->time.sec; |  | ||||||
| 
 |  | ||||||
| 	/* tot up year field */ |  | ||||||
| 	for (i = 0; i < year; ++i) { |  | ||||||
| 		if (leap_year(calendar->base_year + i)) { |  | ||||||
| 			tmp += SECS_IN_LEAP_YEAR; |  | ||||||
| 		} else { |  | ||||||
| 			tmp += SECS_IN_NON_LEAP_YEAR; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* tot up month field */ |  | ||||||
| 	for (i = 1; i < month; ++i) { |  | ||||||
| 		tmp += get_secs_in_month(dt->date.year, i); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* tot up day/hour/minute/second fields */ |  | ||||||
| 	tmp += (day - 1) * SECS_IN_DAY; |  | ||||||
| 	tmp += hour * SECS_IN_HOUR; |  | ||||||
| 	tmp += minutes * SECS_IN_MINUTE; |  | ||||||
| 	tmp += seconds; |  | ||||||
| 
 |  | ||||||
| 	return tmp; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief calibrate timestamp to make desired timestamp ahead of current timestamp
 |  | ||||||
|  */ |  | ||||||
| static void calibrate_timestamp(struct calendar_descriptor *const calendar, struct calendar_alarm *alarm, |  | ||||||
|                                 struct calendar_alarm *current_dt) |  | ||||||
| { |  | ||||||
| 	uint32_t alarm_ts; |  | ||||||
| 	uint32_t current_ts = current_dt->cal_alarm.timestamp; |  | ||||||
| 
 |  | ||||||
| 	(void)calendar; |  | ||||||
| 
 |  | ||||||
| 	alarm_ts = alarm->cal_alarm.timestamp; |  | ||||||
| 
 |  | ||||||
| 	/* calibrate timestamp */ |  | ||||||
| 	switch (alarm->cal_alarm.option) { |  | ||||||
| 	case CALENDAR_ALARM_MATCH_SEC: |  | ||||||
| 
 |  | ||||||
| 		if (alarm_ts <= current_ts) { |  | ||||||
| 			alarm_ts += SECS_IN_MINUTE; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_MIN: |  | ||||||
| 
 |  | ||||||
| 		if (alarm_ts <= current_ts) { |  | ||||||
| 			alarm_ts += SECS_IN_HOUR; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_HOUR: |  | ||||||
| 
 |  | ||||||
| 		if (alarm_ts <= current_ts) { |  | ||||||
| 			alarm_ts += SECS_IN_DAY; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_DAY: |  | ||||||
| 
 |  | ||||||
| 		if (alarm_ts <= current_ts) { |  | ||||||
| 			alarm_ts += get_secs_in_month(current_dt->cal_alarm.datetime.date.year, |  | ||||||
| 			                              current_dt->cal_alarm.datetime.date.month); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_MONTH: |  | ||||||
| 
 |  | ||||||
| 		if (alarm_ts <= current_ts) { |  | ||||||
| 			if (leap_year(current_dt->cal_alarm.datetime.date.year)) { |  | ||||||
| 				alarm_ts += SECS_IN_LEAP_YEAR; |  | ||||||
| 			} else { |  | ||||||
| 				alarm_ts += SECS_IN_NON_LEAP_YEAR; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		break; |  | ||||||
| 	/* do nothing for year match */ |  | ||||||
| 	case CALENDAR_ALARM_MATCH_YEAR: |  | ||||||
| 	default: |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* desired timestamp after calibration */ |  | ||||||
| 	alarm->cal_alarm.timestamp = alarm_ts; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief complete alarm to absolute date/time, then fill up the timestamp
 |  | ||||||
|  */ |  | ||||||
| static void fill_alarm(struct calendar_descriptor *const calendar, struct calendar_alarm *alarm) |  | ||||||
| { |  | ||||||
| 	struct calendar_alarm current_dt; |  | ||||||
| 	uint32_t              tmp, current_ts; |  | ||||||
| 
 |  | ||||||
| 	/* get current date/time */ |  | ||||||
| 	current_ts = _calendar_get_counter(&calendar->device); |  | ||||||
| 	convert_timestamp_to_datetime(calendar, current_ts, ¤t_dt.cal_alarm.datetime); |  | ||||||
| 
 |  | ||||||
| 	current_dt.cal_alarm.timestamp = current_ts; |  | ||||||
| 
 |  | ||||||
| 	/* complete alarm */ |  | ||||||
| 	switch (alarm->cal_alarm.option) { |  | ||||||
| 	case CALENDAR_ALARM_MATCH_SEC: |  | ||||||
| 		alarm->cal_alarm.datetime.date.year  = current_dt.cal_alarm.datetime.date.year; |  | ||||||
| 		alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month; |  | ||||||
| 		alarm->cal_alarm.datetime.date.day   = current_dt.cal_alarm.datetime.date.day; |  | ||||||
| 		alarm->cal_alarm.datetime.time.hour  = current_dt.cal_alarm.datetime.time.hour; |  | ||||||
| 		alarm->cal_alarm.datetime.time.min   = current_dt.cal_alarm.datetime.time.min; |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_MIN: |  | ||||||
| 		alarm->cal_alarm.datetime.date.year  = current_dt.cal_alarm.datetime.date.year; |  | ||||||
| 		alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month; |  | ||||||
| 		alarm->cal_alarm.datetime.date.day   = current_dt.cal_alarm.datetime.date.day; |  | ||||||
| 		alarm->cal_alarm.datetime.time.hour  = current_dt.cal_alarm.datetime.time.hour; |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_HOUR: |  | ||||||
| 		alarm->cal_alarm.datetime.date.year  = current_dt.cal_alarm.datetime.date.year; |  | ||||||
| 		alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month; |  | ||||||
| 		alarm->cal_alarm.datetime.date.day   = current_dt.cal_alarm.datetime.date.day; |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_DAY: |  | ||||||
| 		alarm->cal_alarm.datetime.date.year  = current_dt.cal_alarm.datetime.date.year; |  | ||||||
| 		alarm->cal_alarm.datetime.date.month = current_dt.cal_alarm.datetime.date.month; |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_MONTH: |  | ||||||
| 		alarm->cal_alarm.datetime.date.year = current_dt.cal_alarm.datetime.date.year; |  | ||||||
| 		break; |  | ||||||
| 	case CALENDAR_ALARM_MATCH_YEAR: |  | ||||||
| 		break; |  | ||||||
| 	default: |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* fill up the timestamp */ |  | ||||||
| 	tmp                        = convert_datetime_to_timestamp(calendar, &alarm->cal_alarm.datetime); |  | ||||||
| 	alarm->cal_alarm.timestamp = tmp; |  | ||||||
| 
 |  | ||||||
| 	/* calibrate the timestamp */ |  | ||||||
| 	calibrate_timestamp(calendar, alarm, ¤t_dt); |  | ||||||
| 	convert_timestamp_to_datetime(calendar, alarm->cal_alarm.timestamp, &alarm->cal_alarm.datetime); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief add new alarm into the list in ascending order
 |  | ||||||
|  */ |  | ||||||
| static int32_t calendar_add_new_alarm(struct list_descriptor *list, struct calendar_alarm *alarm) |  | ||||||
| { |  | ||||||
| 	struct calendar_descriptor *calendar = CONTAINER_OF(list, struct calendar_descriptor, alarms); |  | ||||||
| 	struct calendar_alarm *     head, *it, *prev = NULL; |  | ||||||
| 
 |  | ||||||
| 	/*get the head of alarms list*/ |  | ||||||
| 	head = (struct calendar_alarm *)list_get_head(list); |  | ||||||
| 
 |  | ||||||
| 	/*if head is null, insert new alarm as head*/ |  | ||||||
| 	if (!head) { |  | ||||||
| 		list_insert_as_head(list, alarm); |  | ||||||
| 		_calendar_set_comp(&calendar->device, alarm->cal_alarm.timestamp); |  | ||||||
| 		return ERR_NONE; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*insert the new alarm in accending order, the head will be invoked firstly */ |  | ||||||
| 	for (it = head; it; it = (struct calendar_alarm *)list_get_next_element(it)) { |  | ||||||
| 		if (alarm->cal_alarm.timestamp <= it->cal_alarm.timestamp) { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		prev = it; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*insert new alarm into the list */ |  | ||||||
| 	if (it == head) { |  | ||||||
| 		list_insert_as_head(list, alarm); |  | ||||||
| 		/*get the head and set it into register*/ |  | ||||||
| 		_calendar_set_comp(&calendar->device, alarm->cal_alarm.timestamp); |  | ||||||
| 
 |  | ||||||
| 	} else { |  | ||||||
| 		list_insert_after(prev, alarm); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief callback for alarm
 |  | ||||||
|  */ |  | ||||||
| static void calendar_alarm(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	struct calendar_descriptor *calendar = CONTAINER_OF(dev, struct calendar_descriptor, device); |  | ||||||
| 
 |  | ||||||
| 	struct calendar_alarm *head, *it, current_dt; |  | ||||||
| 
 |  | ||||||
| 	if ((calendar->flags & SET_ALARM_BUSY) || (calendar->flags & PROCESS_ALARM_BUSY)) { |  | ||||||
| 		calendar->flags |= PROCESS_ALARM_BUSY; |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* get current timestamp */ |  | ||||||
| 	current_dt.cal_alarm.timestamp = _calendar_get_counter(dev); |  | ||||||
| 
 |  | ||||||
| 	/* get the head */ |  | ||||||
| 	head = (struct calendar_alarm *)list_get_head(&calendar->alarms); |  | ||||||
| 	ASSERT(head); |  | ||||||
| 
 |  | ||||||
| 	/* remove all alarms and invoke them*/ |  | ||||||
| 	for (it = head; it; it = (struct calendar_alarm *)list_get_head(&calendar->alarms)) { |  | ||||||
| 		/* check the timestamp with current timestamp*/ |  | ||||||
| 		if (it->cal_alarm.timestamp <= current_dt.cal_alarm.timestamp) { |  | ||||||
| 			list_remove_head(&calendar->alarms); |  | ||||||
| 			it->callback(calendar); |  | ||||||
| 
 |  | ||||||
| 			if (it->cal_alarm.mode == REPEAT) { |  | ||||||
| 				calibrate_timestamp(calendar, it, ¤t_dt); |  | ||||||
| 				convert_timestamp_to_datetime(calendar, it->cal_alarm.timestamp, &it->cal_alarm.datetime); |  | ||||||
| 				calendar_add_new_alarm(&calendar->alarms, it); |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*if no alarm in the list, register null */ |  | ||||||
| 	if (!it) { |  | ||||||
| 		_calendar_register_callback(&calendar->device, NULL); |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*put the new head into register */ |  | ||||||
| 	_calendar_set_comp(&calendar->device, it->cal_alarm.timestamp); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Initialize Calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_init(struct calendar_descriptor *const calendar, const void *hw) |  | ||||||
| { |  | ||||||
| 	int32_t ret = 0; |  | ||||||
| 
 |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	if (calendar->device.hw == hw) { |  | ||||||
| 		/* Already initialized with current configuration */ |  | ||||||
| 		return ERR_NONE; |  | ||||||
| 	} else if (calendar->device.hw != NULL) { |  | ||||||
| 		/* Initialized with another configuration */ |  | ||||||
| 		return ERR_ALREADY_INITIALIZED; |  | ||||||
| 	} |  | ||||||
| 	calendar->device.hw = (void *)hw; |  | ||||||
| 	ret                 = _calendar_init(&calendar->device); |  | ||||||
| 	calendar->base_year = DEFAULT_BASE_YEAR; |  | ||||||
| 
 |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Reset the Calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_deinit(struct calendar_descriptor *const calendar) |  | ||||||
| { |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	if (calendar->device.hw == NULL) { |  | ||||||
| 		return ERR_NOT_INITIALIZED; |  | ||||||
| 	} |  | ||||||
| 	_calendar_deinit(&calendar->device); |  | ||||||
| 	calendar->device.hw = NULL; |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Enable the Calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_enable(struct calendar_descriptor *const calendar) |  | ||||||
| { |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	_calendar_enable(&calendar->device); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Disable the Calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_disable(struct calendar_descriptor *const calendar) |  | ||||||
| { |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	_calendar_disable(&calendar->device); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Set base year for calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_baseyear(struct calendar_descriptor *const calendar, const uint32_t p_base_year) |  | ||||||
| { |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	calendar->base_year = p_base_year; |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Set time for calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_time(struct calendar_descriptor *const calendar, struct calendar_time *const p_calendar_time) |  | ||||||
| { |  | ||||||
| 	struct calendar_date_time dt; |  | ||||||
| 	uint32_t                  current_ts, new_ts; |  | ||||||
| 
 |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	/* convert time to timestamp */ |  | ||||||
| 	current_ts = _calendar_get_counter(&calendar->device); |  | ||||||
| 	convert_timestamp_to_datetime(calendar, current_ts, &dt); |  | ||||||
| 	dt.time.sec  = p_calendar_time->sec; |  | ||||||
| 	dt.time.min  = p_calendar_time->min; |  | ||||||
| 	dt.time.hour = p_calendar_time->hour; |  | ||||||
| 
 |  | ||||||
| 	new_ts = convert_datetime_to_timestamp(calendar, &dt); |  | ||||||
| 
 |  | ||||||
| 	_calendar_set_counter(&calendar->device, new_ts); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Set date for calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_date(struct calendar_descriptor *const calendar, struct calendar_date *const p_calendar_date) |  | ||||||
| { |  | ||||||
| 	struct calendar_date_time dt; |  | ||||||
| 	uint32_t                  current_ts, new_ts; |  | ||||||
| 
 |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	/* convert date to timestamp */ |  | ||||||
| 	current_ts = _calendar_get_counter(&calendar->device); |  | ||||||
| 	convert_timestamp_to_datetime(calendar, current_ts, &dt); |  | ||||||
| 	dt.date.day   = p_calendar_date->day; |  | ||||||
| 	dt.date.month = p_calendar_date->month; |  | ||||||
| 	dt.date.year  = p_calendar_date->year; |  | ||||||
| 
 |  | ||||||
| 	new_ts = convert_datetime_to_timestamp(calendar, &dt); |  | ||||||
| 
 |  | ||||||
| 	_calendar_set_counter(&calendar->device, new_ts); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Get date/time for calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_get_date_time(struct calendar_descriptor *const calendar, struct calendar_date_time *const date_time) |  | ||||||
| { |  | ||||||
| 	uint32_t current_ts; |  | ||||||
| 
 |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 
 |  | ||||||
| 	/* convert current timestamp to date/time */ |  | ||||||
| 	current_ts = _calendar_get_counter(&calendar->device); |  | ||||||
| 	convert_timestamp_to_datetime(calendar, current_ts, date_time); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Set alarm for calendar
 |  | ||||||
|  */ |  | ||||||
| int32_t calendar_set_alarm(struct calendar_descriptor *const calendar, struct calendar_alarm *const alarm, |  | ||||||
|                            calendar_cb_alarm_t callback) |  | ||||||
| { |  | ||||||
| 	struct calendar_alarm *head; |  | ||||||
| 
 |  | ||||||
| 	/* Sanity check arguments */ |  | ||||||
| 	ASSERT(calendar); |  | ||||||
| 	ASSERT(alarm); |  | ||||||
| 
 |  | ||||||
| 	alarm->callback = callback; |  | ||||||
| 
 |  | ||||||
| 	fill_alarm(calendar, alarm); |  | ||||||
| 
 |  | ||||||
| 	calendar->flags |= SET_ALARM_BUSY; |  | ||||||
| 
 |  | ||||||
| 	head = (struct calendar_alarm *)list_get_head(&calendar->alarms); |  | ||||||
| 
 |  | ||||||
| 	if (head != NULL) { |  | ||||||
| 		/* already added */ |  | ||||||
| 		if (is_list_element(&calendar->alarms, alarm)) { |  | ||||||
| 			if (callback == NULL) { |  | ||||||
| 				/* remove alarm */ |  | ||||||
| 				list_delete_element(&calendar->alarms, alarm); |  | ||||||
| 
 |  | ||||||
| 				if (!list_get_head(&calendar->alarms)) { |  | ||||||
| 					_calendar_register_callback(&calendar->device, NULL); |  | ||||||
| 				} |  | ||||||
| 			} else { |  | ||||||
| 				/* re-add */ |  | ||||||
| 				list_delete_element(&calendar->alarms, alarm); |  | ||||||
| 				calendar_add_new_alarm(&calendar->alarms, alarm); |  | ||||||
| 			} |  | ||||||
| 		} else if (callback != NULL) { |  | ||||||
| 			calendar_add_new_alarm(&calendar->alarms, alarm); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		calendar->flags &= ~SET_ALARM_BUSY; |  | ||||||
| 
 |  | ||||||
| 		if (calendar->flags & PROCESS_ALARM_BUSY) { |  | ||||||
| 			CRITICAL_SECTION_ENTER() |  | ||||||
| 			calendar->flags &= ~PROCESS_ALARM_BUSY; |  | ||||||
| 			_calendar_set_irq(&calendar->device); |  | ||||||
| 			CRITICAL_SECTION_LEAVE() |  | ||||||
| 		} |  | ||||||
| 	} else if (callback != NULL) { |  | ||||||
| 		/* if head is NULL, Register callback*/ |  | ||||||
| 		_calendar_register_callback(&calendar->device, calendar_alarm); |  | ||||||
| 		calendar_add_new_alarm(&calendar->alarms, alarm); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	calendar->flags &= ~SET_ALARM_BUSY; |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** \brief Retrieve driver version
 |  | ||||||
|  *  \return Current driver version |  | ||||||
|  */ |  | ||||||
| uint32_t calendar_get_version(void) |  | ||||||
| { |  | ||||||
| 	return CALENDAR_VERSION; |  | ||||||
| } |  | ||||||
| @ -1,383 +0,0 @@ | |||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \file |  | ||||||
|  * |  | ||||||
|  * \brief RTC Driver |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries. |  | ||||||
|  * |  | ||||||
|  * \asf_license_start |  | ||||||
|  * |  | ||||||
|  * \page License |  | ||||||
|  * |  | ||||||
|  * Subject to your compliance with these terms, you may use Microchip |  | ||||||
|  * software and any derivatives exclusively with Microchip products. |  | ||||||
|  * It is your responsibility to comply with third party license terms applicable |  | ||||||
|  * to your use of third party software (including open source software) that |  | ||||||
|  * may accompany Microchip software. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, |  | ||||||
|  * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, |  | ||||||
|  * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, |  | ||||||
|  * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE |  | ||||||
|  * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL |  | ||||||
|  * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE |  | ||||||
|  * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE |  | ||||||
|  * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT |  | ||||||
|  * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY |  | ||||||
|  * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, |  | ||||||
|  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. |  | ||||||
|  * |  | ||||||
|  * \asf_license_stop |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <hpl_calendar.h> |  | ||||||
| #include <utils_assert.h> |  | ||||||
| #include <hpl_rtc_config.h> |  | ||||||
| 
 |  | ||||||
| /*!< Pointer to hpl device */ |  | ||||||
| static struct calendar_dev *_rtc_dev = NULL; |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Initializes the RTC module with given configurations. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_init(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	_rtc_dev = dev; |  | ||||||
| 
 |  | ||||||
| 	if (hri_rtcmode0_get_CTRLA_ENABLE_bit(dev->hw)) { |  | ||||||
| #if !CONF_RTC_INIT_RESET |  | ||||||
| 		return ERR_DENIED; |  | ||||||
| #else |  | ||||||
| 		hri_rtcmode0_clear_CTRLA_ENABLE_bit(dev->hw); |  | ||||||
| 		hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_ENABLE); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 	hri_rtcmode0_set_CTRLA_SWRST_bit(dev->hw); |  | ||||||
| 	hri_rtcmode0_wait_for_sync(dev->hw, RTC_MODE0_SYNCBUSY_SWRST); |  | ||||||
| 
 |  | ||||||
| #if CONF_RTC_EVENT_CONTROL_ENABLE == 1 |  | ||||||
| 	hri_rtcmode0_write_EVCTRL_reg( |  | ||||||
| 	    dev->hw, |  | ||||||
| 	    (CONF_RTC_PEREO0 << RTC_MODE0_EVCTRL_PEREO0_Pos) | (CONF_RTC_PEREO1 << RTC_MODE0_EVCTRL_PEREO1_Pos) |  | ||||||
| 	        | (CONF_RTC_PEREO2 << RTC_MODE0_EVCTRL_PEREO2_Pos) | (CONF_RTC_PEREO3 << RTC_MODE0_EVCTRL_PEREO3_Pos) |  | ||||||
| 	        | (CONF_RTC_PEREO4 << RTC_MODE0_EVCTRL_PEREO4_Pos) | (CONF_RTC_PEREO5 << RTC_MODE0_EVCTRL_PEREO5_Pos) |  | ||||||
| 	        | (CONF_RTC_PEREO6 << RTC_MODE0_EVCTRL_PEREO6_Pos) | (CONF_RTC_PEREO7 << RTC_MODE0_EVCTRL_PEREO7_Pos) |  | ||||||
| 	        | (CONF_RTC_COMPE0 << RTC_MODE0_EVCTRL_CMPEO_Pos) | (CONF_RTC_OVFEO << RTC_MODE0_EVCTRL_OVFEO_Pos)); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_CTRLA_reg(dev->hw, RTC_MODE0_CTRLA_PRESCALER(CONF_RTC_PRESCALER) | RTC_MODE0_CTRLA_COUNTSYNC); |  | ||||||
| 
 |  | ||||||
| 	hri_rtc_write_TAMPCTRL_reg( |  | ||||||
| 	    dev->hw, |  | ||||||
| 	    (CONF_RTC_TAMPER_INACT_0 << RTC_TAMPCTRL_IN0ACT_Pos) | (CONF_RTC_TAMPER_INACT_1 << RTC_TAMPCTRL_IN1ACT_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMPER_INACT_2 << RTC_TAMPCTRL_IN2ACT_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMPER_INACT_3 << RTC_TAMPCTRL_IN3ACT_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMPER_INACT_4 << RTC_TAMPCTRL_IN4ACT_Pos) | (CONF_RTC_TAMP_LVL_0 << RTC_TAMPCTRL_TAMLVL0_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMP_LVL_1 << RTC_TAMPCTRL_TAMLVL1_Pos) | (CONF_RTC_TAMP_LVL_2 << RTC_TAMPCTRL_TAMLVL2_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMP_LVL_3 << RTC_TAMPCTRL_TAMLVL3_Pos) | (CONF_RTC_TAMP_LVL_4 << RTC_TAMPCTRL_TAMLVL4_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMP_DEBNC_0 << RTC_TAMPCTRL_DEBNC0_Pos) | (CONF_RTC_TAMP_DEBNC_1 << RTC_TAMPCTRL_DEBNC1_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMP_DEBNC_2 << RTC_TAMPCTRL_DEBNC2_Pos) | (CONF_RTC_TAMP_DEBNC_3 << RTC_TAMPCTRL_DEBNC3_Pos) |  | ||||||
| 	        | (CONF_RTC_TAMP_DEBNC_4 << RTC_TAMPCTRL_DEBNC4_Pos)); |  | ||||||
| 
 |  | ||||||
| 	if ((CONF_RTC_TAMPER_INACT_0 == TAMPER_MODE_ACTL) | (CONF_RTC_TAMPER_INACT_1 == TAMPER_MODE_ACTL) |  | ||||||
| 	    | (CONF_RTC_TAMPER_INACT_2 == TAMPER_MODE_ACTL) | (CONF_RTC_TAMPER_INACT_3 == TAMPER_MODE_ACTL) |  | ||||||
| 	    | (CONF_RTC_TAMPER_INACT_4 == TAMPER_MODE_ACTL)) { |  | ||||||
| 		hri_rtcmode0_set_CTRLB_RTCOUT_bit(dev->hw); |  | ||||||
| 	} |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Deinit the RTC module |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_deinit(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	NVIC_DisableIRQ(RTC_IRQn); |  | ||||||
| 	dev->callback_alarm = NULL; |  | ||||||
| 	dev->callback_tick = NULL; |  | ||||||
| 	dev->callback_tamper = NULL; |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_clear_CTRLA_ENABLE_bit(dev->hw); |  | ||||||
| 	hri_rtcmode0_set_CTRLA_SWRST_bit(dev->hw); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable the RTC module |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_enable(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_set_CTRLA_ENABLE_bit(dev->hw); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Disable the RTC module |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_disable(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_clear_CTRLA_ENABLE_bit(dev->hw); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Set the current calendar time to desired time. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_set_counter(struct calendar_dev *const dev, const uint32_t counter) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_COUNT_reg(dev->hw, counter); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Get current counter |  | ||||||
|  */ |  | ||||||
| uint32_t _calendar_get_counter(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	return hri_rtcmode0_read_COUNT_reg(dev->hw); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Set the compare for the specified value. |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_set_comp(struct calendar_dev *const dev, const uint32_t comp) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_COMP_reg(dev->hw, 0, comp); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Get the compare value |  | ||||||
|  */ |  | ||||||
| uint32_t _calendar_get_comp(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	return hri_rtcmode0_read_COMP_reg(dev->hw, 0); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Find tamper is detected on specified pin |  | ||||||
|  */ |  | ||||||
| bool _is_tamper_detected(struct calendar_dev *const dev, enum tamper_id tamper_id_pin) |  | ||||||
| { |  | ||||||
| 	bool value; |  | ||||||
| 
 |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	value = ((hri_rtc_read_TAMPID_reg(dev->hw) >> tamper_id_pin) & 0x01); |  | ||||||
| 	return value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Clear the Tamper ID flag |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_clear_tampid_flag(struct calendar_dev *const dev, enum tamper_id tamper_id_pin) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	hri_rtc_write_TAMPID_reg(dev->hw, (true << tamper_id_pin)); |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Tamper Debounce Asynchronous Feature |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_enable_debounce_asynchronous(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	int32_t return_value; |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, false); |  | ||||||
| 
 |  | ||||||
| 	while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (hri_rtcmode0_read_CTRLA_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		return_value = ERR_FAILURE; |  | ||||||
| 	} else { |  | ||||||
| 		hri_rtcmode0_write_CTRLB_DEBASYNC_bit(dev->hw, true); |  | ||||||
| 		return_value = ERR_NONE; |  | ||||||
| 		while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		} |  | ||||||
| 		hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, true); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return return_value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Disable Tamper Debounce Asynchronous Feature |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_disable_debounce_asynchronous(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	int32_t return_value; |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, false); |  | ||||||
| 
 |  | ||||||
| 	while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (hri_rtcmode0_read_CTRLA_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		return_value = ERR_FAILURE; |  | ||||||
| 	} else { |  | ||||||
| 		hri_rtcmode0_write_CTRLB_DEBASYNC_bit(dev->hw, false); |  | ||||||
| 		return_value = ERR_NONE; |  | ||||||
| 		while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		} |  | ||||||
| 		hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, true); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return return_value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Enable Tamper Debounce Majority Feature |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_enable_debounce_majority(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	int32_t return_value; |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, false); |  | ||||||
| 
 |  | ||||||
| 	while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (hri_rtcmode0_read_CTRLA_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		return_value = ERR_FAILURE; |  | ||||||
| 	} else { |  | ||||||
| 		hri_rtcmode0_write_CTRLB_DEBMAJ_bit(dev->hw, true); |  | ||||||
| 		return_value = ERR_NONE; |  | ||||||
| 
 |  | ||||||
| 		while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		} |  | ||||||
| 		hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, true); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return return_value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Disable Tamper Debounce Majority Feature |  | ||||||
|  */ |  | ||||||
| int32_t _tamper_disable_debounce_majority(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	int32_t return_value; |  | ||||||
| 
 |  | ||||||
| 	hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, false); |  | ||||||
| 
 |  | ||||||
| 	while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (hri_rtcmode0_read_CTRLA_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		return_value = ERR_FAILURE; |  | ||||||
| 	} else { |  | ||||||
| 		hri_rtcmode0_write_CTRLB_DEBMAJ_bit(dev->hw, false); |  | ||||||
| 		return_value = ERR_NONE; |  | ||||||
| 
 |  | ||||||
| 		while (hri_rtcmode0_read_SYNCBUSY_reg(dev->hw) & RTC_MODE2_CTRLA_ENABLE) { |  | ||||||
| 		} |  | ||||||
| 		hri_rtcmode0_write_CTRLA_ENABLE_bit(dev->hw, true); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return return_value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int32_t _prescaler_register_callback(struct calendar_dev *const dev, calendar_drv_cb_t callback) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	/* Check callback */ |  | ||||||
| 	if (callback != NULL) { |  | ||||||
| 		/* register the callback */ |  | ||||||
| 		dev->callback_tick = callback; |  | ||||||
| 
 |  | ||||||
| 		/* enable RTC_IRQn */ |  | ||||||
| 		NVIC_ClearPendingIRQ(RTC_IRQn); |  | ||||||
| 		NVIC_EnableIRQ(RTC_IRQn); |  | ||||||
| 
 |  | ||||||
| 		/* enable periodic interrupt */ |  | ||||||
| 		hri_rtcmode0_set_INTEN_PER7_bit(dev->hw); |  | ||||||
| 	} else { |  | ||||||
| 		/* disable periodic interrupt */ |  | ||||||
| 		hri_rtcmode0_clear_INTEN_PER7_bit(dev->hw); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int32_t _extwake_register_callback(struct calendar_dev *const dev, calendar_drv_extwake_cb_t callback) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	/* Check callback */ |  | ||||||
| 	if (callback != NULL) { |  | ||||||
| 		/* register the callback */ |  | ||||||
| 		dev->callback_tamper = callback; |  | ||||||
| 
 |  | ||||||
| 		/* enable RTC_IRQn */ |  | ||||||
| 		NVIC_ClearPendingIRQ(RTC_IRQn); |  | ||||||
| 		NVIC_EnableIRQ(RTC_IRQn); |  | ||||||
| 
 |  | ||||||
| 		hri_rtcmode0_clear_interrupt_TAMPER_bit(dev->hw); |  | ||||||
| 		/* enable tamper interrupt */ |  | ||||||
| 		hri_rtcmode0_set_INTEN_TAMPER_bit(dev->hw); |  | ||||||
| 	} else { |  | ||||||
| 		/* disable tamper interrupt */ |  | ||||||
| 		hri_rtcmode0_clear_INTEN_TAMPER_bit(dev->hw); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| /**
 |  | ||||||
|  * \brief Registers callback for the specified callback type |  | ||||||
|  */ |  | ||||||
| int32_t _calendar_register_callback(struct calendar_dev *const dev, calendar_drv_cb_t callback) |  | ||||||
| { |  | ||||||
| 	ASSERT(dev && dev->hw); |  | ||||||
| 
 |  | ||||||
| 	/* Check callback */ |  | ||||||
| 	if (callback != NULL) { |  | ||||||
| 		/* register the callback */ |  | ||||||
| 		dev->callback_alarm = callback; |  | ||||||
| 
 |  | ||||||
| 		/* enable RTC_IRQn */ |  | ||||||
| 		NVIC_ClearPendingIRQ(RTC_IRQn); |  | ||||||
| 		NVIC_EnableIRQ(RTC_IRQn); |  | ||||||
| 
 |  | ||||||
| 		/* enable cmp */ |  | ||||||
| 		hri_rtcmode0_set_INTEN_CMP0_bit(dev->hw); |  | ||||||
| 	} else { |  | ||||||
| 		/* disable cmp */ |  | ||||||
| 		hri_rtcmode0_clear_INTEN_CMP0_bit(dev->hw); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return ERR_NONE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void _calendar_set_irq(struct calendar_dev *const dev) |  | ||||||
| { |  | ||||||
| 	(void)dev; |  | ||||||
| 	NVIC_SetPendingIRQ(RTC_IRQn); |  | ||||||
| } |  | ||||||
| @ -1,52 +0,0 @@ | |||||||
| /**
 |  | ||||||
|  * \file |  | ||||||
|  * |  | ||||||
|  * \brief RTC |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. |  | ||||||
|  * |  | ||||||
|  * \asf_license_start |  | ||||||
|  * |  | ||||||
|  * \page License |  | ||||||
|  * |  | ||||||
|  * Subject to your compliance with these terms, you may use Microchip |  | ||||||
|  * software and any derivatives exclusively with Microchip products. |  | ||||||
|  * It is your responsibility to comply with third party license terms applicable |  | ||||||
|  * to your use of third party software (including open source software) that |  | ||||||
|  * may accompany Microchip software. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, |  | ||||||
|  * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, |  | ||||||
|  * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, |  | ||||||
|  * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE |  | ||||||
|  * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL |  | ||||||
|  * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE |  | ||||||
|  * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE |  | ||||||
|  * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT |  | ||||||
|  * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY |  | ||||||
|  * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, |  | ||||||
|  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. |  | ||||||
|  * |  | ||||||
|  * \asf_license_stop |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #ifndef _HPL_RTC2_V200_H_INCLUDED |  | ||||||
| #define _HPL_RTC2_V200_H_INCLUDED |  | ||||||
| 
 |  | ||||||
| #include <hpl_timer.h> |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * \brief Retrieve timer helper functions |  | ||||||
|  * |  | ||||||
|  * \return A pointer to set of timer helper functions |  | ||||||
|  */ |  | ||||||
| struct _timer_hpl_interface *_rtc_get_timer(void); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| #endif /* _HPL_RTC2_V200_H_INCLUDED */ |  | ||||||
| @ -31,7 +31,6 @@ extern "C" { | |||||||
| #include <hal_io.h> | #include <hal_io.h> | ||||||
| #include <hal_sleep.h> | #include <hal_sleep.h> | ||||||
| #include <hal_ext_irq.h> | #include <hal_ext_irq.h> | ||||||
| #include <hal_calendar.h> |  | ||||||
| #include <hal_i2c_m_sync.h> | #include <hal_i2c_m_sync.h> | ||||||
| #include <hal_delay.h> | #include <hal_delay.h> | ||||||
| #include <hal_slcd_sync.h> | #include <hal_slcd_sync.h> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user