Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

time.c File Reference

Real time clock driver. More...

#include <const.h>
#include <kernel/console.h>
#include <kernel/semaphore.h>
#include <kernel/time.h>

Go to the source code of this file.

Functions

void time_init ()
 Initialize the Real-Time Clock.

time_t time_read ()
 Get the seconds passed since midnight 1970-01-01 (Unix timestamp).
Returns:
The UNIX timestamp.



Variables

semaphore_t rtc_lock
 The real-time clock semaphore.


Detailed Description

Real time clock driver.

Author:
Andrea Righi <drizzt@inwind.it>
Date:
Last update: 2003-11-01
Note:
Copyright (©) 2003 Andrea Righi

Definition in file time.c.


Function Documentation

void time_init  
 

Initialize the Real-Time Clock.

Definition at line 19 of file time.c.

00020 {
00021         INIT_MUTEX(&rtc_lock);
00022 }

time_t time_read  
 

Get the seconds passed since midnight 1970-01-01 (Unix timestamp).

Returns:
The UNIX timestamp.

Definition at line 29 of file time.c.

00030 {
00031         unsigned int year, mon, day, hour, min, sec;
00032         int i;
00033 
00034         DOWN(&rtc_lock);
00035 
00036         // When the Update-In-Progress (UIP) flag goes from 1 to 0,     //
00037         // the RTC registers show the second which has precisely just   //
00038         // started.                                                     //
00039         // Read RTC exactly on falling edge of update flag.             //
00040 
00041         for (i=0; i<1000000 ; i++)      // may take up to 1 second...   //
00042                 if ( CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP )
00043                         break;
00044 
00045         for (i=0 ; i<1000000 ; i++)     // must try at least 2.228 ms   //
00046                 if ( !(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
00047                         break;
00048 
00049         do { /* Isn't this overkill ? UIP above should guarantee consistency */
00050                 sec =   CMOS_READ(RTC_SECONDS);
00051                 min =   CMOS_READ(RTC_MINUTES);
00052                 hour =  CMOS_READ(RTC_HOURS);
00053                 day =   CMOS_READ(RTC_DAY_OF_MONTH);
00054                 mon =   CMOS_READ(RTC_MONTH);
00055                 year =  CMOS_READ(RTC_YEAR);
00056         } while (sec != CMOS_READ(RTC_SECONDS));
00057 
00058         if ( !(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) )
00059         {
00060                 sec =   BCD2BIN( sec );
00061                 min =   BCD2BIN( min );
00062                 hour =  BCD2BIN( hour );
00063                 day =   BCD2BIN( day );
00064                 mon =   BCD2BIN( mon );
00065                 year =  BCD2BIN( year );
00066         }
00067 
00068         UP(&rtc_lock);
00069 
00070         if ( (year += 1900) < 1970 )
00071                 year += 100;
00072 
00073         return( mktime(year, mon, day, hour, min, sec) );
00074 }


Variable Documentation

semaphore_t rtc_lock
 

The real-time clock semaphore.

Definition at line 16 of file time.c.


Generated on Fri Feb 20 15:32:20 2004 for Minirighi by doxygen1.2.18