include/drivers: Add RTC API header and handlers
This commit adds the rtc.h header file which contains API functions for real-time-clocks, which are low power devices which track and represent broken-down time. It also changes one line of doxygen documentation in the maxim_ds3132.h file to place it in its own group. The handlers for use of the API from userspace is also added with this commit. The API is split into one mandatory section, setting and getting time, and three optional sections, alarms, update event callback, and clock calibration. Signed-off-by: Bjarki Arge Andreasen <baa@trackunit.com>
This commit is contained in:
parent
24df09bf0a
commit
b557a1d711
9 changed files with 707 additions and 4 deletions
7
drivers/rtc/CMakeLists.txt
Normal file
7
drivers/rtc/CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Copyright (c) 2022 Bjarki Arge Andreasen
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
zephyr_library()
|
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_USERSPACE rtc_handlers.c)
|
||||
|
26
drivers/rtc/Kconfig
Normal file
26
drivers/rtc/Kconfig
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Copyright (c) 2022 Bjarki Arge Andreasen
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
menuconfig RTC
|
||||
bool "RTC driver support"
|
||||
|
||||
if RTC
|
||||
|
||||
config RTC_ALARM
|
||||
bool "RTC driver alarm support"
|
||||
help
|
||||
This is an option which enables driver support for RTC alarms.
|
||||
|
||||
config RTC_UPDATE
|
||||
bool "RTC driver update event callback support"
|
||||
help
|
||||
This is an option which enables driver support for the RTC
|
||||
update event callback.
|
||||
|
||||
config RTC_CALIBRATION
|
||||
bool "RTC driver clock calibration support"
|
||||
help
|
||||
This is an option which enables driver support for RTC clock
|
||||
calibration.
|
||||
|
||||
endif # RTC
|
79
drivers/rtc/rtc_handlers.c
Normal file
79
drivers/rtc/rtc_handlers.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Bjarki Arge Andreasen
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <zephyr/drivers/rtc.h>
|
||||
#include <zephyr/syscall_handler.h>
|
||||
|
||||
static inline int z_vrfy_rtc_set_time(const struct device *dev, const struct rtc_time *timeptr)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, set_time));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_READ(timeptr, sizeof(struct rtc_time)));
|
||||
return z_impl_rtc_set_time(dev, timeptr);
|
||||
}
|
||||
#include <syscalls/rtc_set_time_mrsh.c>
|
||||
|
||||
static inline int z_vrfy_rtc_get_time(const struct device *dev, struct rtc_time *timeptr)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, get_time));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(timeptr, sizeof(struct rtc_time)));
|
||||
return z_impl_rtc_get_time(dev, timeptr);
|
||||
}
|
||||
#include <syscalls/rtc_get_time_mrsh.c>
|
||||
|
||||
#ifdef CONFIG_RTC_ALARM
|
||||
static inline int z_vrfy_rtc_alarm_get_supported_fields(const struct device *dev, uint16_t id,
|
||||
uint16_t *mask)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, alarm_get_supported_fields));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(mask, sizeof(uint16_t)));
|
||||
return z_impl_rtc_alarm_get_supported_fields(dev, id, mask);
|
||||
}
|
||||
#include <syscalls/rtc_alarm_get_supported_fields_mrsh.c>
|
||||
|
||||
static inline int z_vrfy_rtc_alarm_set_time(const struct device *dev, uint16_t id, uint16_t mask,
|
||||
const struct rtc_time *timeptr)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, alarm_set_time));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_READ(timeptr, sizeof(struct rtc_time)));
|
||||
return z_impl_rtc_alarm_set_time(dev, id, mask, timeptr);
|
||||
}
|
||||
#include <syscalls/rtc_alarm_set_time_mrsh.c>
|
||||
|
||||
static inline int z_vrfy_rtc_alarm_get_time(const struct device *dev, uint16_t id, uint16_t *mask,
|
||||
struct rtc_time *timeptr)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, alarm_get_time));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(mask, sizeof(uint16_t)));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(timeptr, sizeof(struct rtc_time)));
|
||||
return z_impl_rtc_alarm_get_time(dev, id, mask, timeptr);
|
||||
}
|
||||
#include <syscalls/rtc_alarm_get_time_mrsh.c>
|
||||
|
||||
static inline int z_vrfy_rtc_alarm_is_pending(const struct device *dev, uint16_t id)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, alarm_is_pending));
|
||||
return z_impl_rtc_alarm_is_pending(dev, id);
|
||||
}
|
||||
#include <syscalls/rtc_alarm_is_pending_mrsh.c>
|
||||
#endif /* CONFIG_RTC_ALARM */
|
||||
|
||||
#ifdef CONFIG_RTC_CALIBRATION
|
||||
static inline int z_vrfy_rtc_set_calibration(const struct device *dev, int32_t calibration)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, set_calibration));
|
||||
return z_impl_rtc_set_calibration(dev, calibration);
|
||||
}
|
||||
|
||||
#include <syscalls/rtc_set_calibration_mrsh.c>
|
||||
|
||||
static inline int z_vrfy_rtc_get_calibration(const struct device *dev, int32_t *calibration)
|
||||
{
|
||||
Z_OOPS(Z_SYSCALL_DRIVER_RTC(dev, get_calibration));
|
||||
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(calibration, sizeof(int32_t)));
|
||||
return z_impl_rtc_get_calibration(dev, calibration);
|
||||
}
|
||||
#include <syscalls/rtc_get_calibration_mrsh.c>
|
||||
#endif /* CONFIG_RTC_CALIBRATION */
|
Loading…
Add table
Add a link
Reference in a new issue