* 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.
This commit is contained in:
Joel Sherrill
2009-05-27 14:23:23 +00:00
parent 72fe60735b
commit 22ed4172f7
5 changed files with 267 additions and 8 deletions

View File

@@ -1,3 +1,9 @@
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.
2009-05-21 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1413/cpukit

View File

@@ -1,9 +1,7 @@
/**
* @file rtems/rtc.h
* @file
*
* This file describes the Real-Time Clock driver for all boards.
* This driver provides support for the standard RTEMS routines
* that set the tod based on an RTC.
* Real-time clock driver interface.
*/
/*
@@ -20,22 +18,99 @@
#ifndef _RTEMS_RTC_H
#define _RTEMS_RTC_H
#include <rtems.h>
#ifdef __cplusplus
extern "C" {
#endif
#define RTC_DRIVER_TABLE_ENTRY \
{ rtc_initialize, NULL, NULL, NULL, NULL, NULL }
/**
* @defgroup rtems_rtc Real-Time Clock Driver Interface
*
* This driver interface provides support to read and set the real-time clock
* and to initialize the time of day for the system.
*
* @{
*/
/**
* Device file name path.
*/
#define RTC_DEVICE_NAME "/dev/rtc"
/**
* Device driver table entry.
*/
#define RTC_DRIVER_TABLE_ENTRY \
{ rtc_initialize, rtc_open, rtc_close, \
rtc_read, rtc_write, rtc_control }
/**
* Initializes the real-time clock device and sets the time of day for the
* system.
*
* If the real-time clock provides an invalid time of day value the system time
* of day must remain untouched.
*/
rtems_device_driver rtc_initialize(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/**
* Opens the real-time clock device.
*/
rtems_device_driver rtc_open(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/**
* Closes the real-time clock device.
*/
rtems_device_driver rtc_close(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/**
* Reads the real-time clock value.
*
* The value will be returned in a @ref rtems_time_of_day structure.
*/
rtems_device_driver rtc_read(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/**
* Sets the real-time clock value.
*
* The value will be set from a @ref rtems_time_of_day structure.
*/
rtems_device_driver rtc_write(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/**
* Controls the real-time clock.
*/
rtems_device_driver rtc_control(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
/** @} */
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */

View File

@@ -86,7 +86,7 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \
shell/verrx.c shell/vwarn.c shell/vwarnx.c shell/warn.c shell/warnx.c \
shell/fts.c shell/print_heapinfo.c shell/main_wkspaceinfo.c \
shell/shell_script.c shell/login_prompt.c shell/login_check.c \
shell/fdisk.c
shell/fdisk.c shell/main_rtc.c
if LIBNETWORKING
libshell_a_SOURCES += shell/main_mount_ftp.c shell/main_mount_tftp.c \
shell/main_ifconfig.c shell/main_route.c shell/main_netstats.c \

View File

@@ -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
};

View File

@@ -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
*/