diff options
Diffstat (limited to 'cpukit/libmisc/shell/main_rtc.c')
-rw-r--r-- | cpukit/libmisc/shell/main_rtc.c | 173 |
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 +}; |