diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-05-27 14:23:23 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2009-05-27 14:23:23 +0000 |
commit | 22ed4172f7998db711f72f973fa75a469ed817e4 (patch) | |
tree | 61d390aaa96c5a92a2ffdac02325973c939e1e0e /cpukit/libmisc/shell | |
parent | 2009-05-27 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-22ed4172f7998db711f72f973fa75a469ed817e4.tar.bz2 |
2009-05-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libcsupport/include/rtc.h: New RTC driver interface.
* libmisc/Makefile.am, libmisc/shell/shellconfig.h: Added RTC command.
* libmisc/shell/main_rtc.c: New file.
Diffstat (limited to 'cpukit/libmisc/shell')
-rw-r--r-- | cpukit/libmisc/shell/main_rtc.c | 169 | ||||
-rw-r--r-- | cpukit/libmisc/shell/shellconfig.h | 9 |
2 files changed, 178 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..56a622dccc --- /dev/null +++ b/cpukit/libmisc/shell/main_rtc.c @@ -0,0 +1,169 @@ +/** + * @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. + */ + +#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], "%" 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 +}; diff --git a/cpukit/libmisc/shell/shellconfig.h b/cpukit/libmisc/shell/shellconfig.h index f3bc16ddc4..d7179b5629 100644 --- a/cpukit/libmisc/shell/shellconfig.h +++ b/cpukit/libmisc/shell/shellconfig.h @@ -55,6 +55,8 @@ extern rtems_shell_cmd_t rtems_shell_UNMOUNT_Command; extern rtems_shell_cmd_t rtems_shell_BLKSYNC_Command; extern rtems_shell_cmd_t rtems_shell_FDISK_Command; +extern rtems_shell_cmd_t rtems_shell_RTC_Command; + extern rtems_shell_cmd_t rtems_shell_HALT_Command; extern rtems_shell_cmd_t rtems_shell_CPUUSE_Command; extern rtems_shell_cmd_t rtems_shell_STACKUSE_Command; @@ -368,6 +370,13 @@ extern rtems_shell_filesystems_t *rtems_shell_Mount_filesystems[]; #endif #endif + /* Miscanellous shell commands */ + #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) \ + && !defined(CONFIGURE_SHELL_NO_COMMAND_RTC)) \ + || defined(CONFIGURE_SHELL_COMMAND_RTC) + &rtems_shell_RTC_Command, + #endif + /* * User defined shell commands */ |