/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup RTC
* @{
*
* @brief Provides standard real-time clock (RTC) APIs.
*
* These APIs allow you to perform operations such as reading or writing system time, reading or writing alarm time,
* setting alarm interrupts, registering alarm callbacks, setting the external frequency, resetting the RTC driver,
* and customizing RTC configurations. \n
* The RTC driver provides precise real time for the operating system (OS). If the OS is powered off, the RTC driver
* continues to keep track of the system time using an external battery.
*
* @since 1.0
*/
/**
* @file rtc_if.h
*
* @brief Declares the standard RTC APIs.
*
* @since 1.0
*/
#ifndef RTC_IF_H
#define RTC_IF_H
#include "platform_if.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief Enumerates alarm indexes.
*
* The alarm indexes will be used when you perform operations related to alarms.
*
* @since V1.0
*/
enum RtcAlarmIndex {
RTC_ALARM_INDEX_A = 0, /**< Index of alarm A */
RTC_ALARM_INDEX_B = 1, /**< Index of alarm B */
};
/**
* @brief Defines a callback that will be invoked when an alarm is generated at the specified time.
*
*/
typedef int32_t (*RtcAlarmCallback)(enum RtcAlarmIndex);
/**
* @brief Defines the RTC information.
*
* The RTC information includes the year, month, day, day of the week, hour, minute, second, and millisecond.
* The start time is 1970/01/01 Thursday 00:00:00 (UTC).
*/
struct RtcTime {
uint8_t second; /**< Second. The value ranges from 0 to 59. */
uint8_t minute; /**< Minute. The value ranges from 0 to 59. */
uint8_t hour; /**< Hour. The value ranges from 0 to 23. */
uint8_t day; /**< Day. The value ranges from 1 to 31. */
uint8_t weekday; /**< Day of the week. The value ranges from 1 to 7, representing Monday to Sunday. */
uint8_t month; /**< Month. The value ranges from 1 to 12. */
uint16_t year; /**< Year. The value is greater than or equal to 1970. */
uint16_t millisecond; /**< Millisecond. The value ranges from 0 to 990, with a precision of 10 milliseconds. */
};
/**
* @brief Enumerates RTC I/O commands.
*
* @since 1.0
*/
enum RtcIoCmd {
RTC_IO_READTIME = 0, /**< Read time. */
RTC_IO_WRITETIME, /**< Write format-compliant time. */
RTC_IO_READALARM, /**< Read the RTC alarm time. */
RTC_IO_WRITEALARM, /**< Write the RTC alarm time. */
RTC_IO_REGISTERALARMCALLBACK, /**< Registers that will be invoked when an alarm
is generated at the specified time. */
RTC_IO_ALARMINTERRUPTENABLE, /**< Enables or disables alarm interrupts. */
RTC_IO_GETFREQ, /**< Get the RTC external frequency. */
RTC_IO_SETFREQ, /**< Set the oscillation frequency of RTC external crystal. */
RTC_IO_RESET, /**< Reset the RTC device. */
RTC_IO_READREG, /**< Reads the configuration of a custom RTC register. */
RTC_IO_WRITEREG, /**< Writes the configuration of a custom RTC register. */
};
/**
* @brief Opens the RTC device to obtain its handle.
*
* The OS supports only one RTC device.
*
* @return Returns {@link DevHandle} if the operation is successful; returns NULL if the operation fails.
* @since 1.0
*/
DevHandle RtcOpen(void);
/**
* @brief Releases a specified handle of the RTC device.
*
* @param handle Indicates the pointer to the RTC device handle to release, which is created via {@link RtcGetHandle}.
*
* @since 1.0
*/
void RtcClose(DevHandle handle);
/**
* @brief Reads time from the RTC driver.
*
* The time information includes the year, month, day, day of the week, hour, minute, second, and millisecond.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param time Indicates the pointer to the time information read from the RTC driver.
* For details, see {@link RtcTime}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcReadTime(DevHandle handle, struct RtcTime *time);
/**
* @brief Writes format-compliant time to the RTC driver.
*
* Note that the RTC start time is 1970/01/01 Thursday 00:00:00 (UTC). Set the maximum value of year based on
* the requirements specified in the product manual of the in-use component.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param time Indicates the pointer to the time information to write. For details, see {@link RtcTime}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcWriteTime(DevHandle handle, const struct RtcTime *time);
/**
* @brief Reads the RTC alarm time that was set last time.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param alarmIndex Indicates the RTC alarm index. For details, see {@link RtcAlarmIndex}.
* @param time Indicates the pointer to the RTC alarm time information. For details, see {@link RtcTime}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcReadAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime *time);
/**
* @brief Writes the RTC alarm time based on the alarm index.
*
* Note that the RTC start time is 1970/01/01 Thursday 00:00:00 (UTC). Set the maximum value of year based on
* the requirements specified in the product manual of the in-use component.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param alarmIndex Indicates the RTC alarm index. For details, see {@link RtcAlarmIndex}.
* @param tm Indicates the pointer to the RTC alarm time information. For details, see {@link RtcTime}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcWriteAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, const struct RtcTime *time);
/**
* @brief Registers {@link RtcAlarmCallback} that will be invoked when an alarm is generated at the specified time.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param alarmIndex Indicates the RTC alarm index. For details, see {@link RtcAlarmIndex}.
* @param cb Indicates the callback to register. For details, see {@link RtcAlarmCallback}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcRegisterAlarmCallback(DevHandle handle, enum RtcAlarmIndex alarmIndex, RtcAlarmCallback cb);
/**
* @brief Enables or disables alarm interrupts.
*
* Before performing alarm operations, you need to call this function to enable alarm interrupts,
* so that the {@link RtcRegisterAlarmCallback} will be called when the alarm is not generated upon a timeout.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param alarmIndex Indicates the RTC alarm index. For details, see {@link RtcAlarmIndex}.
* @param enable Specifies whether to enable RTC alarm interrupts. The value 1 means to
* enable alarm interrupts and value 0 means to disable alarm interrupts.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcAlarmInterruptEnable(DevHandle handle, enum RtcAlarmIndex alarmIndex, uint8_t enable);
/**
* @brief Reads the RTC external frequency.
*
* This function reads the frequency of the external crystal oscillator connected to the RTC driver.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param freq Indicates the pointer to the frequency of the external crystal oscillator, in Hz.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcGetFreq(DevHandle handle, uint32_t *freq);
/**
* @brief Sets the frequency of the external crystal oscillator connected to the RTC driver.
*
* Note that the frequency must be configured in accordance with the requirements specified in the product manual of
* the in-use component.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param freq Indicates the frequency to set for the external crystal oscillator, in Hz.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcSetFreq(DevHandle handle, uint32_t freq);
/**
* @brief Resets the RTC driver.
*
* After the reset, the configuration registers are restored to the default values.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcReset(DevHandle handle);
/**
* @brief Reads the configuration of a custom RTC register based on the register index.
*
* One index corresponds to one byte of the configuration value.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param usrDefIndex Indicates the index of the custom register.
* @param value Indicates the pointer to the configuration value of the specified register index.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcReadReg(DevHandle handle, uint8_t usrDefIndex, uint8_t *value);
/**
* @brief Writes the configuration of a custom RTC register based on the register index.
*
* One index corresponds to one byte of the configuration value.
*
* @param handle Indicates the pointer to the RTC device handle, which is obtained via {@link RtcGetHandle}.
* @param usrDefIndex Indicates the index of the custom register.
* @param value Indicates the configuration value to write at the index of the register.
*
* @return Returns 0 if the operation is successful; returns a negative value if the operation fails.
* For details, see {@link HDF_STATUS}.
* @since 1.0
*/
int32_t RtcWriteReg(DevHandle handle, uint8_t usrDefIndex, uint8_t value);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* RTC_IF_H */
/** @} */