summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/shell/main_rtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libmisc/shell/main_rtc.c')
-rw-r--r--cpukit/libmisc/shell/main_rtc.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/cpukit/libmisc/shell/main_rtc.c b/cpukit/libmisc/shell/main_rtc.c
new file mode 100644
index 0000000000..139018eb13
--- /dev/null
+++ b/cpukit/libmisc/shell/main_rtc.c
@@ -0,0 +1,173 @@
+/**
+ * @file
+ *
+ * Real time clock shell command.
+ */
+
+/*
+ * Copyright (c) 2009
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * D-82178 Puchheim
+ * Germany
+ * <rtems@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.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <inttypes.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <rtems.h>
+#include <rtems/rtc.h>
+#include <rtems/error.h>
+#include <rtems/shell.h>
+
+#define RTEMS_RTC_SHELL_ERROR( fmt, ...) \
+ do { \
+ printf( "error: " fmt "\n", ##__VA_ARGS__); \
+ return -1; \
+ } while (0)
+
+#define RTEMS_RTC_SHELL_ERROR_SC( sc, fmt, ...) \
+ if ((sc) != RTEMS_SUCCESSFUL) { \
+ printf( "error: " fmt ": %s\n", ##__VA_ARGS__, rtems_status_text( sc)); \
+ return -1; \
+ }
+
+static const char rtems_rtc_shell_usage [] =
+ "real time clock read and set\n"
+ "\n"
+ "rtc\n"
+ "\tprints the current time of day\n"
+ "\n"
+ "rtc YYYY-MM-DD [HH:MM:SS [TICKS]]\n"
+ "\tsets the time of day and real time clock";
+
+static int rtems_rtc_shell_main( int argc, char **argv)
+{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ rtems_time_of_day tod = {
+ .year = 1988,
+ .month = 1,
+ .day = 1,
+ .hour = 0,
+ .minute = 0,
+ .second = 0,
+ .ticks = 0
+ };
+
+ if (argc == 1) {
+ sc = rtems_clock_get_tod( &tod);
+ RTEMS_RTC_SHELL_ERROR_SC( sc, "get time of day");
+
+ printf(
+ "%04" PRIu32 "-%02" PRIu32 "-%02" PRIu32
+ " %02" PRIu32 ":%02" PRIu32 ":%02" PRIu32
+ " %02" PRIu32 "\n",
+ tod.year,
+ tod.month,
+ tod.day,
+ tod.hour,
+ tod.minute,
+ tod.second,
+ tod.ticks
+ );
+ } else if (argc > 1 && argc < 5) {
+ int rv = 0;
+ int fd = 0;
+ ssize_t n = 0;
+ uint32_t v [3];
+
+ if (argc > 1) {
+ rv = sscanf(
+ argv [1],
+ "%04" PRIu32 "-%02" PRIu32 "-%02" PRIu32,
+ v,
+ v + 1,
+ v + 2
+ );
+
+ if (rv == 3) {
+ tod.year = v [0];
+ tod.month = v [1];
+ tod.day = v [2];
+ } else {
+ RTEMS_RTC_SHELL_ERROR( "unexpected YYYY-MM-DD input: %s", argv [1]);
+ }
+ }
+
+ if (argc > 2) {
+ rv = sscanf(
+ argv [2],
+ "%04" PRIu32 ":%02" PRIu32 ":%02" PRIu32,
+ v,
+ v + 1,
+ v + 2
+ );
+
+ if (rv == 3) {
+ tod.hour = v [0];
+ tod.minute = v [1];
+ tod.second = v [2];
+ } else {
+ RTEMS_RTC_SHELL_ERROR( "unexpected HH:MM:SS input: %s", argv [2]);
+ }
+ }
+
+ if (argc > 3) {
+ rv = sscanf( argv [3], "%5" PRIu32, v);
+
+ if (rv == 1) {
+ tod.ticks = v [0];
+ } else {
+ RTEMS_RTC_SHELL_ERROR( "unexpected TICKS input: %s", argv [3]);
+ }
+ }
+
+ sc = rtems_clock_set( &tod);
+ RTEMS_RTC_SHELL_ERROR_SC( sc, "set time of day");
+
+ fd = open( RTC_DEVICE_NAME, O_WRONLY);
+ if (fd < 0) {
+ perror( "error: open " RTC_DEVICE_NAME);
+ return -1;
+ }
+
+ n = write( fd, &tod, sizeof( tod));
+ if (n != (ssize_t) sizeof( tod)) {
+ perror( "error: write to " RTC_DEVICE_NAME);
+ close( fd);
+ return -1;
+ }
+
+ rv = close( fd);
+ if (rv != 0) {
+ perror( "error: close " RTC_DEVICE_NAME);
+ return -1;
+ }
+ } else {
+ puts( rtems_rtc_shell_usage);
+ return -1;
+ }
+
+ return 0;
+}
+
+struct rtems_shell_cmd_tt rtems_shell_RTC_Command = {
+ .name = "rtc",
+ .usage = rtems_rtc_shell_usage,
+ .topic = "misc",
+ .command = rtems_rtc_shell_main,
+ .alias = NULL,
+ .next = NULL
+};