Index: bin/rsim_params =================================================================== RCS file: /res/impulse/users/map/cvsroot/ml-rsim/bin/rsim_params,v retrieving revision 1.4 retrieving revision 1.5 diff --context -r1.4 -r1.5 *** bin/rsim_params 2003/01/22 20:44:59 1.4 --- bin/rsim_params 2003/02/24 18:27:08 1.5 *************** *** 131,140 **** --- 131,147 ---- bus_io_requests 4 # number of outstanding I/O requests (per I/O) + ##### General I/O Parameters ##### io_latency 1 # latency of I/O device bus interface # including PCI bridge and bus + + + ##### Realtime Clock Parameters #### + + rtc_start_date 9/10/2000 # initial date of realtime clock + rtc_start_time 13:58:29 # initial time of realtime clock Index: src/IO/realtime_clock.c =================================================================== RCS file: /res/impulse/users/map/cvsroot/ml-rsim/src/IO/realtime_clock.c,v retrieving revision 1.3 retrieving revision 1.4 diff --context -r1.3 -r1.4 *** src/IO/realtime_clock.c 2002/10/25 20:25:11 1.3 --- src/IO/realtime_clock.c 2003/02/24 18:27:12 1.4 *************** *** 110,115 **** --- 110,116 ---- #include #include #include + #include #include "sim_main/simsys.h" #include "sim_main/util.h" *************** *** 134,140 **** --- 135,146 ---- void RTC_set(int); void RTC_interrupt(int, unsigned*, unsigned char); + time_t rtc_start_time; + struct tm *localtime_r(const time_t*, struct tm*); + + + /*===========================================================================*/ /* Initialize Realtime Clock */ /* Init bus interface, read clock period and calculate 1ms interval */ *************** *** 144,152 **** void RTC_init(void) { ! int i; REALTIME_CLOCK *prtc; ! IOGeneric_init(RTC_read, RTC_write, NULL); RTC_TICK = 1e9 / CPU_CLK_PERIOD; /* clk_period comes in ps */ --- 150,161 ---- void RTC_init(void) { ! int i, v0, v1, v2; REALTIME_CLOCK *prtc; ! char date_str[50], time_str[50]; ! struct tm start; ! ! IOGeneric_init(RTC_read, RTC_write, NULL); RTC_TICK = 1e9 / CPU_CLK_PERIOD; /* clk_period comes in ps */ *************** *** 155,160 **** --- 164,208 ---- if (!RTCs) YS__errmsg(0, "malloc failed at %s:%i", __FILE__, __LINE__); + /* get local time to initialize start time */ + tzset(); + rtc_start_time = time(NULL); + localtime_r(&rtc_start_time, &start); + start.tm_isdst = -1; + + /* check configuration file entries */ + strcpy(time_str, ""); + get_parameter("RTC_start_time", time_str, PARAM_STRING); + strcpy(date_str, ""); + get_parameter("RTC_start_date", date_str, PARAM_STRING); + + /* convert start time */ + if ((strcasecmp(time_str, "current") != 0) && + (sscanf(time_str, "%i:%i:%i", &v0, &v1, &v2) == 3)) + { + start.tm_hour = v0; + start.tm_min = v1; + start.tm_sec = v2; + } + + /* convert start date */ + if ((strcasecmp(date_str, "current") != 0) && + (sscanf(date_str, "%i/%i/%i", &v0, &v1, &v2) == 3)) + { + start.tm_mon = v0-1; + start.tm_mday = v1; + start.tm_year = v2-1900; + } + + /* no start data and time: use old initial time for backwards compatability*/ + if ((strcasecmp(time_str, "") == 0) && + (strcasecmp(date_str, "") == 0)) + rtc_start_time = 0x39BBD9D5; + /* otherwise use time and date specified, or current */ + else + rtc_start_time = mktime(&start); + + /*-------------------------------------------------------------------------*/ for (i = 0; i < ARCH_numnodes; i++) *************** *** 167,176 **** prtc->old_write_bit = 0; prtc->old_status = 0; prtc->clock = 0; - prtc->rt = time(NULL); - prtc->rt = 0x39BBD9D5; - YS__logmsg(i, "Start Time: 0x%08X\n", prtc->rt); AddrMap_insert(i, RTC_BASE_ADDR, RTC_BASE_ADDR + 0x0F, ARCH_cpus + ARCH_ios); PageTable_insert_alloc(i, RTC_BASE_ADDR); --- 215,223 ---- prtc->old_write_bit = 0; prtc->old_status = 0; prtc->clock = 0; + prtc->rt = rtc_start_time; + AddrMap_insert(i, RTC_BASE_ADDR, RTC_BASE_ADDR + 0x0F, ARCH_cpus + ARCH_ios); PageTable_insert_alloc(i, RTC_BASE_ADDR); *************** *** 461,472 **** void RTC_print_params(int nid) { REALTIME_CLOCK *prtc = &RTCs[nid]; ! int target, vector, mask; ! char str[40]; YS__statmsg(nid, "Realtime Clock Configuration\n"); --- 508,522 ---- + /*****************************************************************************/ + /*****************************************************************************/ void RTC_print_params(int nid) { REALTIME_CLOCK *prtc = &RTCs[nid]; ! int target, vector, mask; ! char str[40]; ! struct tm *start; YS__statmsg(nid, "Realtime Clock Configuration\n"); *************** *** 517,522 **** --- 567,577 ---- YS__statmsg(nid, " %s every 1 ms on IRQ %i\n", str, vector); } + + start = localtime(&rtc_start_time); + YS__statmsg(nid, " Initial time/date: %d:%02d:%02d %i/%02d/%04d\n", + start->tm_hour, start->tm_min, start->tm_sec, + start->tm_mon+1, start->tm_mday, start->tm_year + 1900); YS__statmsg(nid, "\n"); }