[rtems commit] bsp/atsam: Add RTC driver

Sebastian Huber sebh at rtems.org
Mon Jul 4 12:10:45 UTC 2016


Module:    rtems
Branch:    master
Commit:    137bd3747e7abbb847325e145faf17237bdff16d
Changeset: http://git.rtems.org/rtems/commit/?id=137bd3747e7abbb847325e145faf17237bdff16d

Author:    Alexander Krutwig <alexander.krutwig at embedded-brains.de>
Date:      Mon Jul  4 11:11:06 2016 +0200

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(-)

diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am
index 9965177..68bc075 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 0000000..0ea8d48
--- /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 at 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);



More information about the vc mailing list