RTC: Extend interface by adding a method to set the alarm relative to the current time
This commit is contained in:
parent
1767b21d3c
commit
1135ce804d
2
arch
2
arch
@ -1 +1 @@
|
|||||||
Subproject commit 4a18471087626499f2f57a07238a32cfe803e6d0
|
Subproject commit 68a1918ab42332510feca0a2203b768c7bb0c792
|
@ -365,7 +365,7 @@ static int rtc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
DEBUGASSERT(alarminfo != NULL);
|
DEBUGASSERT(alarminfo != NULL);
|
||||||
alarmid = alarminfo->id;
|
alarmid = alarminfo->id;
|
||||||
DEBUGASSERT(alarminfo->id >= 0 && alarminfo->id < RTC_NALARMS);
|
DEBUGASSERT(alarmid >= 0 && alarmid < RTC_NALARMS);
|
||||||
|
|
||||||
/* Is the alarm active? */
|
/* Is the alarm active? */
|
||||||
|
|
||||||
@ -411,6 +411,69 @@ static int rtc_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* RTC_SET_RELATIVE sets the alarm time relative to the current time.
|
||||||
|
*
|
||||||
|
* Argument: A read-only reference to a struct rtc_setrelative_s containing the
|
||||||
|
* new relative alarm time to be set.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
case RTC_SET_RELATIVE:
|
||||||
|
{
|
||||||
|
FAR const struct rtc_setrelative_s *alarminfo =
|
||||||
|
(FAR const struct rtc_setrelative_s *)((uintptr_t)arg);
|
||||||
|
FAR struct rtc_alarminfo_s *upperinfo;
|
||||||
|
struct lower_setrelative_s lowerinfo;
|
||||||
|
int alarmid;
|
||||||
|
|
||||||
|
DEBUGASSERT(alarminfo != NULL);
|
||||||
|
alarmid = alarminfo->id;
|
||||||
|
DEBUGASSERT(alarmid >= 0 && alarmid < RTC_NALARMS);
|
||||||
|
|
||||||
|
/* Is the alarm active? */
|
||||||
|
|
||||||
|
upperinfo = &upper->alarminfo[alarmid];
|
||||||
|
if (upperinfo->active)
|
||||||
|
{
|
||||||
|
/* Yes, cancel the alarm */
|
||||||
|
|
||||||
|
if (ops->cancelalarm)
|
||||||
|
{
|
||||||
|
(void)ops->cancelalarm(upper->lower, alarmid);
|
||||||
|
}
|
||||||
|
|
||||||
|
upperinfo->active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ops->setrelative)
|
||||||
|
{
|
||||||
|
/* Save the signal info to be used to notify the caller when the
|
||||||
|
* alarm expires.
|
||||||
|
*/
|
||||||
|
|
||||||
|
upperinfo->active = true;
|
||||||
|
upperinfo->signo = alarminfo->signo;
|
||||||
|
upperinfo->pid = alarminfo->pid;
|
||||||
|
upperinfo->sigvalue = alarminfo->sigvalue;
|
||||||
|
|
||||||
|
/* Format the alarm info needed by the lower half driver */
|
||||||
|
|
||||||
|
lowerinfo.id = alarmid;
|
||||||
|
lowerinfo.cb = rtc_alarm_callback;
|
||||||
|
lowerinfo.priv = (FAR void *)upper;
|
||||||
|
lowerinfo.reltime = alarminfo->reltime;
|
||||||
|
|
||||||
|
/* Then set the alarm */
|
||||||
|
|
||||||
|
ret = ops->setrelative(upper->lower, &lowerinfo);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
upperinfo->active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
/* RTC_WKALRM_CANCEL cancel the alarm.
|
/* RTC_WKALRM_CANCEL cancel the alarm.
|
||||||
*
|
*
|
||||||
* Argument: An ALARM ID value that indicates which alarm should be
|
* Argument: An ALARM ID value that indicates which alarm should be
|
||||||
|
@ -151,12 +151,20 @@
|
|||||||
|
|
||||||
#define RTC_SET_ALARM _RTCIOC(0x0003)
|
#define RTC_SET_ALARM _RTCIOC(0x0003)
|
||||||
|
|
||||||
/* RTC_WKALRM_CANCEL cancel the alarm.
|
/* RTC_SET_RELATIVE sets the alarm time relative to the current time.
|
||||||
|
*
|
||||||
|
* Argument: A read-only reference to a struct rtc_setrelative_s containing the
|
||||||
|
* new relative alarm time to be set.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define RTC_SET_RELATIVE _RTCIOC(0x0004)
|
||||||
|
|
||||||
|
/* RTC_SET_RELATIVE cancel the alarm.
|
||||||
*
|
*
|
||||||
* Argument: An ALARM ID value that indicates which alarm should be canceled.
|
* Argument: An ALARM ID value that indicates which alarm should be canceled.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_CANCEL_ALARM _RTCIOC(0x004)
|
#define RTC_CANCEL_ALARM _RTCIOC(0x0005)
|
||||||
|
|
||||||
/* Architecture-specific RTC IOCTLS should begin at RTC_USER_IOCBASE. For
|
/* Architecture-specific RTC IOCTLS should begin at RTC_USER_IOCBASE. For
|
||||||
* example:
|
* example:
|
||||||
@ -166,7 +174,7 @@
|
|||||||
* etc.
|
* etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RTC_USER_IOCBASE 0x0005
|
#define RTC_USER_IOCBASE 0x0006
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
@ -207,7 +215,7 @@ struct rtc_rdalarm_s
|
|||||||
struct rtc_time time; /* Current RTC time (if enabled) */
|
struct rtc_time time; /* Current RTC time (if enabled) */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Structure used with the RTC_SETALARM IOCTL command. */
|
/* Structure used with the RTC_SET_ALARM IOCTL command. */
|
||||||
|
|
||||||
struct rtc_setalarm_s
|
struct rtc_setalarm_s
|
||||||
{
|
{
|
||||||
@ -218,6 +226,17 @@ struct rtc_setalarm_s
|
|||||||
struct rtc_time time; /* Alarm time */
|
struct rtc_time time; /* Alarm time */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Structure used with the RTC_SET_RELATIVE IOCTL command. */
|
||||||
|
|
||||||
|
struct rtc_setrelative_s
|
||||||
|
{
|
||||||
|
uint8_t id; /* Indicates the alarm to be set */
|
||||||
|
uint8_t signo; /* Signal number for alarm notification */
|
||||||
|
pid_t pid; /* Identifies task to be notified */
|
||||||
|
union sigval sigvalue; /* Data passed with notification */
|
||||||
|
time_t reltime; /* Relative time in seconds */
|
||||||
|
};
|
||||||
|
|
||||||
/* Callback type used by the RTC harware to notify the RTC driver when the
|
/* Callback type used by the RTC harware to notify the RTC driver when the
|
||||||
* alarm expires.
|
* alarm expires.
|
||||||
*/
|
*/
|
||||||
@ -233,6 +252,16 @@ struct lower_setalarm_s
|
|||||||
FAR void *priv; /* Private argurment to accompany callback */
|
FAR void *priv; /* Private argurment to accompany callback */
|
||||||
struct rtc_time time; /* Alarm time */
|
struct rtc_time time; /* Alarm time */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Structure used with the setrelative method */
|
||||||
|
|
||||||
|
struct lower_setrelative_s
|
||||||
|
{
|
||||||
|
uint8_t id; /* Indicates the alarm to be set */
|
||||||
|
rtc_alarm_callback_t cb; /* Callback when the alarm expires */
|
||||||
|
FAR void *priv; /* Private argurment to accompany callback */
|
||||||
|
time_t reltime; /* Relative time in seconds */
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The RTC driver is implemented as a common, upper-half character driver
|
/* The RTC driver is implemented as a common, upper-half character driver
|
||||||
@ -266,6 +295,11 @@ struct rtc_ops_s
|
|||||||
CODE int (*setalarm)(FAR struct rtc_lowerhalf_s *lower,
|
CODE int (*setalarm)(FAR struct rtc_lowerhalf_s *lower,
|
||||||
FAR const struct lower_setalarm_s *alarminfo);
|
FAR const struct lower_setalarm_s *alarminfo);
|
||||||
|
|
||||||
|
/* setalarm sets up a new alarm relative to the current time. */
|
||||||
|
|
||||||
|
CODE int (*setrelative)(FAR struct rtc_lowerhalf_s *lower,
|
||||||
|
FAR const struct lower_setrelative_s *alarminfo);
|
||||||
|
|
||||||
/* cancelalarm cancels the current alarm. */
|
/* cancelalarm cancels the current alarm. */
|
||||||
|
|
||||||
CODE int (*cancelalarm)(FAR struct rtc_lowerhalf_s *lower, int alarmid);
|
CODE int (*cancelalarm)(FAR struct rtc_lowerhalf_s *lower, int alarmid);
|
||||||
|
Loading…
Reference in New Issue
Block a user