📄 icm7170.c
字号:
/* * 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.rtems.com/license/LICENSE. * * $Id: icm7170.c,v 1.2.8.1 2003/09/04 18:46:04 joel 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};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -