Initial commit to Gerrit
[profile/ivi/ntp.git] / ports / winnt / ntpd / hopf_PCI_io.c
1 /* 
2  * hopf_PCI_io.c
3  * Read data from a hopf PCI clock using the ATLSoft WinNT driver.
4  *
5  * Date: 21.03.2000 Revision: 01.10 
6  *
7  * Copyright (C) 1999, 2000 by Bernd Altmeier altmeier@ATLSoft.de
8  * 
9  */
10
11 /*
12  * Ignore nonstandard extension warning.
13  * This happens when including winioctl.h
14  */
15 #pragma warning( disable : 4201)
16 #define _FILESYSTEMFSCTL_
17
18 #include <config.h>
19 #include <windows.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <winioctl.h>
23 #include "hopf_PCI_io.h"
24
25 #include <stddef.h>
26
27 #define ATL_PASSTHROUGH_READ_TOSIZE     3*sizeof(ULONG)         
28 #define ATL_PASSTHROUGH_READ_FROMSIZE   0                               
29 #define IOCTL_ATLSOFT_PASSTHROUGH_READ  CTL_CODE(       \
30                                                 FILE_DEVICE_UNKNOWN,    \
31                                                 0x805,                  \
32                                                 METHOD_BUFFERED,        \
33                                                 FILE_ANY_ACCESS)
34
35
36 HANDLE  hDevice = NULL; // this is the handle to the PCI Device
37
38 HANDLE                          hRdEvent;
39 OVERLAPPED                      Rdoverlapped;
40 OVERLAPPED                      *pRdOverlapped;
41
42 ULONG                           iobuffer[256];
43 DWORD                           cbReturned;
44 BOOL                            HaveBoard = FALSE; 
45 struct{
46         ULONG   region;
47         ULONG   offset;
48         ULONG   count;
49         }io_params;
50
51
52 BOOL OpenHopfDevice()
53 {
54                 OSVERSIONINFO                   VersionInfo;
55                 ULONG                                   deviceNumber;
56                 CHAR                                    deviceName[255];
57                                 
58                 VersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
59                 GetVersionEx(&VersionInfo);
60                 switch(VersionInfo.dwPlatformId)
61                 {
62                         case VER_PLATFORM_WIN32_WINDOWS:        // Win95/98
63                                 return(FALSE);  //      "NTP does not support Win 95-98."
64                         break;
65
66                         case VER_PLATFORM_WIN32_NT:     // WinNT
67                                 deviceNumber=0; 
68                                 sprintf(deviceName,"\\\\.\\hclk6039%d",deviceNumber+1);
69                                 hDevice=CreateFile(
70                                         deviceName,
71                                         GENERIC_WRITE|GENERIC_READ,                     
72                                         FILE_SHARE_WRITE|FILE_SHARE_READ,       
73                                         NULL,                                                           
74                                         OPEN_EXISTING,                                          
75                                         FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED,
76                                         NULL);
77                         break;
78
79                         default:
80                                 hDevice=INVALID_HANDLE_VALUE;
81                         break;
82
83                 } // end switch
84
85                 if ( hDevice == INVALID_HANDLE_VALUE ) // the system didn't return a handle
86                 {
87                         return(FALSE);  //"A handle to the driver could not be obtained properly"
88                 }
89
90                         hRdEvent=CreateEvent(NULL,      // an event to be used for async transfers
91                                                                 TRUE,   
92                                                                 FALSE,  
93                                                                 NULL);  
94
95                         if ( hRdEvent == INVALID_HANDLE_VALUE ) 
96                                 return(FALSE);  // the system didn't return a handle
97
98                         pRdOverlapped=&Rdoverlapped;
99                         pRdOverlapped->hEvent=hRdEvent;
100
101         HaveBoard = TRUE; // board installed and we have access
102
103         return TRUE;
104 } // end of OpenHopfDevice()
105
106
107 BOOL  CloseHopfDevice(){
108
109         CloseHandle(hRdEvent);// When done, close the handle to the driver
110         if (CloseHandle(hDevice)==TRUE) // unlink the driver using a CloseHandle call
111     {
112                 return TRUE;
113     }
114         return FALSE; // "The driver handle could not be unlinked properly"
115
116 } // end of CloseHopfDevice()
117
118
119 void ReadHopfDevice(){
120
121     if (HaveBoard){
122         DeviceIoControl(hDevice, IOCTL_ATLSOFT_PASSTHROUGH_READ, &io_params,ATL_PASSTHROUGH_READ_TOSIZE,
123                 iobuffer,ATL_PASSTHROUGH_READ_FROMSIZE+io_params.count*sizeof(ULONG),&cbReturned, pRdOverlapped);
124         }
125 }
126
127
128
129
130 void GetHardwareData(LPDWORD Data32,WORD Ofs)
131 {
132         io_params.region = 1;
133         io_params.offset = Ofs;
134         io_params.count =1;
135         ReadHopfDevice();
136         *Data32 = iobuffer[0];
137     return;
138 }
139
140
141 void GetHopfTime(LPHOPFTIME Data,DWORD Offset)
142 {
143         io_params.region = 1;
144         io_params.offset = Offset;
145         io_params.count =4;
146
147         ReadHopfDevice();
148
149         Data->wHour = 0;
150         Data->wMinute = 0;
151         Data->wSecond = 0;
152         while (iobuffer[0] >= (60 * 60 * 1000)) {
153                 iobuffer[0] = iobuffer[0] - 60*60 *1000;
154                 Data->wHour++;
155                 }
156         while (iobuffer[0] >= (60 * 1000)) {
157                 iobuffer[0] = iobuffer[0] - 60 *1000;
158                 Data->wMinute++;
159                 }
160         while (iobuffer[0] >= (1000)) {
161                 iobuffer[0] = iobuffer[0] - 1000;
162                 Data->wSecond++;
163                 }
164         Data->wMilliseconds = LOWORD(iobuffer[0]);
165         Data->wDay = HIBYTE(HIWORD(iobuffer[1]));
166         Data->wMonth = LOBYTE(HIWORD(iobuffer[1]));
167         Data->wYear = LOWORD(iobuffer[1]);
168         Data->wDayOfWeek = HIBYTE(HIWORD(iobuffer[2]));
169         if (Data->wDayOfWeek == 7) // Dow Korrektur
170                 Data->wDayOfWeek = 0;
171         
172         io_params.region = 1;
173         io_params.offset += 0x08;
174         io_params.count =1;
175
176         ReadHopfDevice();
177
178         Data->wStatus = LOBYTE(HIWORD(iobuffer[0]));
179    return;
180 }
181
182
183 void GetHopfLocalTime(LPHOPFTIME Data)
184 {
185         DWORD Offset = 0;
186      GetHopfTime(Data,Offset);
187     return;
188 }
189
190
191 void GetHopfSystemTime(LPHOPFTIME Data)
192 {
193         DWORD Offset = 0x10;
194      GetHopfTime(Data,Offset);
195     return;
196 }
197
198
199 void  GetSatData(LPSATSTAT Data)
200 {
201         io_params.region = 1;
202         io_params.offset = 0xb0;
203         io_params.count =5;
204
205         ReadHopfDevice();
206                                 
207         Data->wVisible= HIBYTE(HIWORD(iobuffer[0]));
208         Data->wMode   = LOBYTE(LOWORD(iobuffer[0]));
209         Data->wSat0   = HIBYTE(HIWORD(iobuffer[1]));
210         Data->wRat0   = LOBYTE(HIWORD(iobuffer[1]));
211         Data->wSat1   = HIBYTE(LOWORD(iobuffer[1]));
212         Data->wRat1   = LOBYTE(LOWORD(iobuffer[1]));
213         Data->wSat2   = HIBYTE(HIWORD(iobuffer[2]));
214         Data->wRat2   = LOBYTE(HIWORD(iobuffer[2]));
215         Data->wSat3   = HIBYTE(LOWORD(iobuffer[2]));
216         Data->wRat3   = LOBYTE(LOWORD(iobuffer[2]));
217         Data->wSat4   = HIBYTE(HIWORD(iobuffer[3]));
218         Data->wRat4   = LOBYTE(HIWORD(iobuffer[3]));
219         Data->wSat5   = HIBYTE(LOWORD(iobuffer[3]));
220         Data->wRat5   = LOBYTE(LOWORD(iobuffer[3]));
221         Data->wSat6   = HIBYTE(HIWORD(iobuffer[4]));
222         Data->wRat6   = LOBYTE(HIWORD(iobuffer[4]));
223         Data->wSat7   = HIBYTE(LOWORD(iobuffer[4]));
224         Data->wRat7   = LOBYTE(LOWORD(iobuffer[4]));
225         
226     return;
227 }
228
229 void GetDiffTime(LPLONG Data)
230 {
231         io_params.region = 1;
232         io_params.offset = 0x0c;
233         io_params.count =1;
234
235         ReadHopfDevice();
236
237     *Data = iobuffer[0];
238     return;
239 }
240
241 void  GetPosition(LPGPSPOS Data){
242         io_params.region = 1;
243         io_params.offset = 0x90; // Positionsdaten Länge
244         io_params.count  = 1;
245
246         ReadHopfDevice();
247
248         Data->wLongitude        = iobuffer[0]; //in Millisekunden
249         io_params.region = 1;
250         io_params.offset = 0xa0; // Positionsdaten Breite
251         io_params.count  = 1;
252
253         ReadHopfDevice();
254
255         Data->wLatitude = iobuffer[0];
256         Data->wAltitude = 0;
257     return;
258 }
259
260 void  GetHardwareVersion(LPCLOCKVER Data){
261 int i;
262         io_params.region = 1;
263         io_params.offset = 0x50;
264         io_params.count =12;
265
266         ReadHopfDevice();
267                                 
268         strcpy(Data->cVersion,"");
269         iobuffer[13] =0;
270         for (i=0; i < 13; i++){
271                 Data->cVersion[i * 4    ] = HIBYTE(HIWORD(iobuffer[i]));
272                 Data->cVersion[i * 4 + 1] = LOBYTE(HIWORD(iobuffer[i]));
273                 Data->cVersion[i * 4 + 2] = HIBYTE(LOWORD(iobuffer[i]));
274                 Data->cVersion[i * 4 + 3] = LOBYTE(LOWORD(iobuffer[i]));
275         }
276 }
277
278 void  GetDCFAntenne(LPDCFANTENNE Data){
279         io_params.region = 1;
280         io_params.offset = 0xcc;        //
281         io_params.count = 1;
282
283         ReadHopfDevice();
284         Data->bStatus1  = HIBYTE(HIWORD(iobuffer[0])); // 
285         Data->bStatus   = LOBYTE(HIWORD(iobuffer[0])); //
286         Data->wAntValue  = LOWORD(iobuffer[0]);
287     return;
288 }
289
290