[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Date and time



You could use or take a look at the hwtestrtc program as well,
apps/hwtest/rtc
/Johan

----- Original Message -----
From: Bjorn Wesen <bjornw@xxxxxxx.com>
To: Lukas <ii.ss@xxxxxxx.pl>
Cc: axis <dev-etrax@xxxxxxx.com>
Sent: Thursday, September 27, 2001 03:32
Subject: Re: Date and time


> On Wed, 26 Sep 2001, Lukas wrote:
> >   Hi ,
> >   Please help me if you can . How can I set date and time on Etrax100LX
> >   from within C programm . What commands should I use ?
>
> There are two clocks here - first you have the battery-backed realtime
> clock (I assume that's on the LX dev board, if not, ignore this :), the
> RTC. It is read at boot by the kernel, and from then on the kernel keeps
> it own clock in software. Actually, if the RTC drifts, the kernel keeps it
> in sync, but not the other way around (the assumption is made that the
> kernel can know the time better than the RTC generally, since it can use
> an NTP server).
>
> So if you want to set the clock, you can either just set the kernel clock
> with settimeofday(), but it will be ignored after the next reboot.
>
> Or you can set the RTC using /dev/rtc:
>
> #ifdef __CRIS__
> #include <asm/rtc.h>  /* for the RTC_SET_TIME ioctl */
> #endif
>
> /* open /dev/rtc and use an ioctl to set the time in the RTC chip */
>
> void
> set_rtc(struct timeval *tv)
> {
>         int fd;
>         struct tm *mytm;
>         unsigned int secs;
>
>         /* Open the rtc driver */
>
>         fd = open("/dev/rtc", O_RDONLY);
>
>         if(fd < 0) {
>                 log("cant open /dev/rtc: %m", errno);
>                 return;
>         }
>
>         /* convert from seconds since 1970 to broken down time
>          * (that the RTC needs)
>          * remember to round secs depending on usecs
>          */
>
>         secs = tv->tv_sec + ((tv->tv_usec > 500000) ? 1 : 0);
>
>         mytm = localtime((time_t *)&secs);
>
>         /* set the RTC time
>          * struct rtc_time is the same as struct tm
>          */
> #ifdef RTC_SET_TIME
>         if(ioctl(fd, RTC_SET_TIME, mytm) < 0) {
>                 log("RTC_SET_TIME failed: %m", errno);
>         }
> #else
>         printf("Have no RTC_SET_TIME!");
> #endif
>         close(fd);
> }
>
> And you can set both at the same time, of course.
>
> /BW
>