summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Krutwig <alexander.krutwig@embedded-brains.de>2016-07-04 11:11:06 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-07-04 14:10:34 +0200
commit137bd3747e7abbb847325e145faf17237bdff16d (patch)
tree8f1645d91e34d38f91bce76a5dad14bbbf416c08
parentlibchip: Simplify RTC driver (diff)
downloadrtems-137bd3747e7abbb847325e145faf17237bdff16d.tar.bz2
bsp/atsam: Add RTC driver
-rw-r--r--c/src/lib/libbsp/arm/atsam/Makefile.am6
-rw-r--r--c/src/lib/libbsp/arm/atsam/rtc/rtc-config.c99
2 files changed, 104 insertions, 1 deletions
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
+ * <info@embedded-brains.de>
+ *
+ * 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 <libchip/chip.h>
+#include <libchip/rtc.h>
+
+#include <bsp.h>
+
+#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);