From 137bd3747e7abbb847325e145faf17237bdff16d Mon Sep 17 00:00:00 2001 From: Alexander Krutwig Date: Mon, 4 Jul 2016 11:11:06 +0200 Subject: bsp/atsam: Add RTC driver --- c/src/lib/libbsp/arm/atsam/Makefile.am | 6 +- c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c | 99 +++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am index 9965177c81..68bc07520d 100644 --- a/c/src/lib/libbsp/arm/atsam/Makefile.am +++ b/c/src/lib/libbsp/arm/atsam/Makefile.am @@ -428,10 +428,14 @@ if HAS_NETWORKING libbsp_a_SOURCES += network/if_atsam.c endif -# i2c +# I2C libbsp_a_SOURCES += i2c/atsam_i2c_bus.c libbsp_a_SOURCES += i2c/atsam_i2c_init.c +# RTC +libbsp_a_SOURCES += ../../shared/tod.c +libbsp_a_SOURCES += rtc/rtc-config.c + # Includes libbsp_a_CPPFLAGS += -I$(srcdir)/../shared/CMSIS/Include libbsp_a_CPPFLAGS += -I$(srcdir)/libraries/libboard diff --git a/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c b/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c new file mode 100644 index 0000000000..0ea8d4817a --- /dev/null +++ b/c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2016 embedded brains GmbH + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include +#include + +#include + +#define ARBITRARY_DAY_OF_WEEK 1 + +static void atsam_rtc_initialize(int minor) +{ + Rtc *rtc = RTC; + + RTC_DisableIt(rtc, 0x1F); +} + +static int atsam_rtc_get_time(int minor, rtems_time_of_day *tod) +{ + Rtc *rtc = RTC; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t week; + + RTC_GetDate(rtc, &year, &month, &day, &week); + RTC_GetTime(rtc, &hour, &minute, &second); + + tod->ticks = 0; + tod->second = second; + tod->minute = minute; + tod->hour = hour; + tod->day = day; + tod->month = month; + tod->year = year; + + return 0; +} + +static int atsam_rtc_set_time(int minor, const rtems_time_of_day *tod) +{ + Rtc *rtc = RTC; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t week; + + second = (uint8_t) tod->second; + minute = (uint8_t) tod->minute; + hour = (uint8_t) tod->hour; + day = (uint8_t) tod->day; + month = (uint8_t) tod->month; + week = ARBITRARY_DAY_OF_WEEK; + year = (uint16_t) tod->year; + + RTC_SetDate(rtc, year, month, day, week); + RTC_SetTime(rtc, hour, minute, second); + + return 0; +} + +static bool atsam_rtc_probe(int minor) +{ + return true; +} + +const rtc_fns atsam_rtc_ops = { + .deviceInitialize = atsam_rtc_initialize, + .deviceGetTime = atsam_rtc_get_time, + .deviceSetTime = atsam_rtc_set_time +}; + +rtc_tbl RTC_Table[] = { + { + .sDeviceName = "/dev/rtc", + .deviceType = RTC_CUSTOM, + .pDeviceFns = &atsam_rtc_ops, + .deviceProbe = atsam_rtc_probe + } +}; + +size_t RTC_Count = RTEMS_ARRAY_SIZE(RTC_Table); -- cgit v1.2.3