URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [rtems/] [c/] [src/] [libchip/] [rtc/] [icm7170.c] - Rev 1773
Go to most recent revision | Compare with Previous | Blame | View Log
/* * This file interfaces with the real-time clock found in * a Harris ICM7170 * * Year 2K Notes: * * This chip only uses a two digit field to store the year. This * code uses the RTEMS Epoch as a pivot year. This lets us map the * two digit year field as follows: * * + two digit years 0-87 are mapped to 2000-2087. * + two digit years 88-99 are mapped to 1988-1999. * * This is less than the time span supported by RTEMS. * * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.OARcorp.com/rtems/license.html. * * $Id: icm7170.c,v 1.2 2001-09-27 12:01:42 chris Exp $ */ #include <rtems.h> #include <libchip/rtc.h> #include <libchip/icm7170.h> /* * Control register bits */ /* XXX */ /* * icm7170_initialize */ void icm7170_initialize( int minor ) { unsigned32 icm7170; setRegister_f setReg; unsigned32 clock; icm7170 = RTC_Table[ minor ].ulCtrlPort1; setReg = RTC_Table[ minor ].setRegister; /* * Initialize the RTC with the proper clock frequency */ clock = (unsigned32) RTC_Table[ minor ].pDeviceParams; (*setReg)( icm7170, ICM7170_CONTROL, 0x0c | clock ); } /* * icm7170_get_time */ int icm7170_get_time( int minor, rtems_time_of_day *time ) { unsigned32 icm7170; getRegister_f getReg; setRegister_f setReg; unsigned32 year; icm7170 = RTC_Table[ minor ].ulCtrlPort1; getReg = RTC_Table[ minor ].getRegister; setReg = RTC_Table[ minor ].setRegister; /* * Put the RTC into read mode */ (void) (*getReg)( icm7170, ICM7170_COUNTER_HUNDREDTHS ); /* * Now get the time */ year = (*getReg)( icm7170, ICM7170_YEAR ); if ( year < 88 ) year += 2000; else year += 1900; time->year = year; time->month = (*getReg)( icm7170, ICM7170_MONTH ); time->day = (*getReg)( icm7170, ICM7170_DATE ); time->hour = (*getReg)( icm7170, ICM7170_HOUR ); time->minute = (*getReg)( icm7170, ICM7170_MINUTE ); time->second = (*getReg)( icm7170, ICM7170_SECOND ); time->ticks = 0; /* * Put the RTC back into normal mode. */ (void) (*getReg)( icm7170, ICM7170_COUNTER_HUNDREDTHS ); return 0; } /* * icm7170_set_time */ int icm7170_set_time( int minor, rtems_time_of_day *time ) { unsigned32 icm7170; getRegister_f getReg; setRegister_f setReg; unsigned32 year; unsigned32 clock; icm7170 = RTC_Table[ minor ].ulCtrlPort1; getReg = RTC_Table[ minor ].getRegister; setReg = RTC_Table[ minor ].setRegister; clock = (unsigned32) RTC_Table[ minor ].pDeviceParams; year = time->year; if ( year >= 2088 ) rtems_fatal_error_occurred( RTEMS_INVALID_NUMBER ); if ( year >= 2000 ) year -= 2000; else year -= 1900; (*setReg)( icm7170, ICM7170_CONTROL, 0x04 | clock ); (*setReg)( icm7170, ICM7170_YEAR, year ); (*setReg)( icm7170, ICM7170_MONTH, time->month ); (*setReg)( icm7170, ICM7170_DATE, time->day ); (*setReg)( icm7170, ICM7170_HOUR, time->hour ); (*setReg)( icm7170, ICM7170_MINUTE, time->minute ); (*setReg)( icm7170, ICM7170_SECOND, time->second ); /* * This is not really right. */ (*setReg)( icm7170, ICM7170_DAY_OF_WEEK, 1 ); /* * Put the RTC back into normal mode. */ (*setReg)( icm7170, ICM7170_CONTROL, 0x0c | clock ); return 0; } /* * Driver function table */ rtc_fns icm7170_fns = { icm7170_initialize, icm7170_get_time, icm7170_set_time };
Go to most recent revision | Compare with Previous | Blame | View Log