OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [libchip/] [rtc/] [icm7170.c] - Blame information for rev 517

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 *  This file interfaces with the real-time clock found in
3
 *  a Harris ICM7170
4
 *
5
 *  Year 2K Notes:
6
 *
7
 *  This chip only uses a two digit field to store the year.  This
8
 *  code uses the RTEMS Epoch as a pivot year.  This lets us map the
9
 *  two digit year field as follows:
10
 *
11
 *    + two digit years 0-87 are mapped to 2000-2087.
12
 *    + two digit years 88-99 are mapped to 1988-1999.
13
 *
14
 *  This is less than the time span supported by RTEMS.
15
 *
16
 *  COPYRIGHT (c) 1989-1999.
17
 *  On-Line Applications Research Corporation (OAR).
18
 *
19
 *  The license and distribution terms for this file may be
20
 *  found in the file LICENSE in this distribution or at
21
 *  http://www.OARcorp.com/rtems/license.html.
22
 *
23
 *  $Id: icm7170.c,v 1.2 2001-09-27 12:01:42 chris Exp $
24
 */
25
 
26
#include <rtems.h>
27
#include <libchip/rtc.h>
28
#include <libchip/icm7170.h>
29
 
30
/*
31
 *  Control register bits
32
 */
33
 
34
/* XXX */
35
 
36
/*
37
 *  icm7170_initialize
38
 */
39
 
40
void icm7170_initialize(
41
  int minor
42
)
43
{
44
  unsigned32     icm7170;
45
  setRegister_f  setReg;
46
  unsigned32     clock;
47
 
48
  icm7170 = RTC_Table[ minor ].ulCtrlPort1;
49
  setReg = RTC_Table[ minor ].setRegister;
50
 
51
  /*
52
   *  Initialize the RTC with the proper clock frequency
53
   */
54
 
55
  clock = (unsigned32) RTC_Table[ minor ].pDeviceParams;
56
  (*setReg)( icm7170, ICM7170_CONTROL, 0x0c | clock );
57
}
58
 
59
/*
60
 *  icm7170_get_time
61
 */
62
 
63
int icm7170_get_time(
64
  int                minor,
65
  rtems_time_of_day *time
66
)
67
{
68
  unsigned32     icm7170;
69
  getRegister_f  getReg;
70
  setRegister_f  setReg;
71
  unsigned32     year;
72
 
73
  icm7170 = RTC_Table[ minor ].ulCtrlPort1;
74
  getReg = RTC_Table[ minor ].getRegister;
75
  setReg = RTC_Table[ minor ].setRegister;
76
 
77
  /*
78
   *  Put the RTC into read mode
79
   */
80
 
81
  (void) (*getReg)( icm7170, ICM7170_COUNTER_HUNDREDTHS );
82
 
83
  /*
84
   *  Now get the time
85
   */
86
 
87
 
88
  year = (*getReg)( icm7170, ICM7170_YEAR );
89
  if ( year < 88 )
90
    year += 2000;
91
  else
92
    year += 1900;
93
 
94
  time->year   = year;
95
  time->month  = (*getReg)( icm7170, ICM7170_MONTH );
96
  time->day    = (*getReg)( icm7170, ICM7170_DATE );
97
  time->hour   = (*getReg)( icm7170, ICM7170_HOUR );
98
  time->minute = (*getReg)( icm7170, ICM7170_MINUTE );
99
  time->second = (*getReg)( icm7170, ICM7170_SECOND );
100
 
101
  time->ticks  = 0;
102
 
103
  /*
104
   *  Put the RTC back into normal mode.
105
   */
106
 
107
  (void) (*getReg)( icm7170, ICM7170_COUNTER_HUNDREDTHS );
108
 
109
  return 0;
110
}
111
 
112
/*
113
 *  icm7170_set_time
114
 */
115
 
116
int icm7170_set_time(
117
  int                minor,
118
  rtems_time_of_day *time
119
)
120
{
121
  unsigned32     icm7170;
122
  getRegister_f  getReg;
123
  setRegister_f  setReg;
124
  unsigned32     year;
125
  unsigned32     clock;
126
 
127
  icm7170 = RTC_Table[ minor ].ulCtrlPort1;
128
  getReg = RTC_Table[ minor ].getRegister;
129
  setReg = RTC_Table[ minor ].setRegister;
130
  clock = (unsigned32) RTC_Table[ minor ].pDeviceParams;
131
 
132
  year = time->year;
133
 
134
  if ( year >= 2088 )
135
    rtems_fatal_error_occurred( RTEMS_INVALID_NUMBER );
136
 
137
  if ( year >= 2000 )
138
    year -= 2000;
139
  else
140
    year -= 1900;
141
 
142
  (*setReg)( icm7170, ICM7170_CONTROL, 0x04 | clock );
143
 
144
  (*setReg)( icm7170, ICM7170_YEAR,    year );
145
  (*setReg)( icm7170, ICM7170_MONTH,   time->month );
146
  (*setReg)( icm7170, ICM7170_DATE,    time->day );
147
  (*setReg)( icm7170, ICM7170_HOUR,    time->hour );
148
  (*setReg)( icm7170, ICM7170_MINUTE,  time->minute );
149
  (*setReg)( icm7170, ICM7170_SECOND,  time->second );
150
 
151
  /*
152
   *  This is not really right.
153
   */
154
 
155
  (*setReg)( icm7170, ICM7170_DAY_OF_WEEK,  1 );
156
 
157
  /*
158
   *  Put the RTC back into normal mode.
159
   */
160
 
161
  (*setReg)( icm7170, ICM7170_CONTROL, 0x0c | clock );
162
 
163
  return 0;
164
}
165
 
166
/*
167
 *  Driver function table
168
 */
169
 
170
rtc_fns icm7170_fns = {
171
  icm7170_initialize,
172
  icm7170_get_time,
173
  icm7170_set_time
174
};
175
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.