Annotation of embedaddon/ntp/ports/winnt/ntpd/hopf_PCI_io.c, revision 1.1
1.1 ! misho 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 <stddef.h>
! 23: #include <winioctl.h>
! 24: #include "hopf_PCI_io.h"
! 25:
! 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:
! 46: struct {
! 47: ULONG region;
! 48: ULONG offset;
! 49: ULONG count;
! 50: } io_params;
! 51:
! 52:
! 53: BOOL
! 54: OpenHopfDevice(void)
! 55: {
! 56: OSVERSIONINFO VersionInfo;
! 57: ULONG deviceNumber;
! 58: CHAR deviceName[255];
! 59:
! 60: VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
! 61: GetVersionEx(&VersionInfo);
! 62: switch (VersionInfo.dwPlatformId) {
! 63:
! 64: case VER_PLATFORM_WIN32_WINDOWS: // Win95/98
! 65: return FALSE; // "NTP does not support Win 95-98."
! 66: break;
! 67:
! 68: case VER_PLATFORM_WIN32_NT: // WinNT
! 69: deviceNumber = 0;
! 70: snprintf(deviceName, sizeof(deviceName),
! 71: "\\\\.\\hclk6039%d", deviceNumber + 1);
! 72: hDevice = CreateFile(
! 73: deviceName,
! 74: GENERIC_WRITE | GENERIC_READ,
! 75: FILE_SHARE_WRITE | FILE_SHARE_READ,
! 76: NULL,
! 77: OPEN_EXISTING,
! 78: FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED,
! 79: NULL);
! 80: break;
! 81:
! 82: default:
! 83: hDevice = INVALID_HANDLE_VALUE;
! 84: break;
! 85: } // end switch
! 86:
! 87: if (INVALID_HANDLE_VALUE == hDevice) // the system didn't return a handle
! 88: return FALSE; //"A handle to the driver could not be obtained properly"
! 89:
! 90: // an event to be used for async transfers
! 91: hRdEvent = CreateEvent(
! 92: NULL,
! 93: TRUE,
! 94: FALSE,
! 95: NULL);
! 96:
! 97: if (INVALID_HANDLE_VALUE == hRdEvent)
! 98: return FALSE; // the system didn't return a handle
! 99:
! 100: pRdOverlapped = &Rdoverlapped;
! 101: pRdOverlapped->hEvent = hRdEvent;
! 102:
! 103: HaveBoard = TRUE; // board installed and we have access
! 104:
! 105: return TRUE;
! 106: } // end of OpenHopfDevice()
! 107:
! 108:
! 109: BOOL
! 110: CloseHopfDevice(void)
! 111: {
! 112: CloseHandle(hRdEvent);// When done, close the handle to the driver
! 113:
! 114: return CloseHandle(hDevice);
! 115: } // end of CloseHopfDevice()
! 116:
! 117:
! 118: void
! 119: ReadHopfDevice(void)
! 120: {
! 121: if (!HaveBoard)
! 122: return;
! 123:
! 124: DeviceIoControl(
! 125: hDevice,
! 126: IOCTL_ATLSOFT_PASSTHROUGH_READ,
! 127: &io_params,
! 128: ATL_PASSTHROUGH_READ_TOSIZE,
! 129: iobuffer,
! 130: ATL_PASSTHROUGH_READ_FROMSIZE
! 131: + io_params.count * sizeof(ULONG),
! 132: &cbReturned,
! 133: pRdOverlapped
! 134: );
! 135: }
! 136:
! 137:
! 138: void
! 139: GetHardwareData(
! 140: LPDWORD Data32,
! 141: WORD Ofs
! 142: )
! 143: {
! 144: io_params.region = 1;
! 145: io_params.offset = Ofs;
! 146: io_params.count = 1;
! 147: ReadHopfDevice();
! 148: *Data32 = iobuffer[0];
! 149: }
! 150:
! 151:
! 152: void
! 153: GetHopfTime(
! 154: LPHOPFTIME Data,
! 155: DWORD Offset
! 156: )
! 157: {
! 158: io_params.region = 1;
! 159: io_params.offset = Offset;
! 160: io_params.count = 4;
! 161:
! 162: ReadHopfDevice();
! 163:
! 164: Data->wHour = 0;
! 165: Data->wMinute = 0;
! 166: Data->wSecond = 0;
! 167: while (iobuffer[0] >= 60 * 60 * 1000) {
! 168: iobuffer[0] = iobuffer[0] - 60 * 60 * 1000;
! 169: Data->wHour++;
! 170: }
! 171: while (iobuffer[0] >= 60 * 1000) {
! 172: iobuffer[0] = iobuffer[0] - 60 * 1000;
! 173: Data->wMinute++;
! 174: }
! 175: while (iobuffer[0] >= 1000) {
! 176: iobuffer[0] = iobuffer[0] - 1000;
! 177: Data->wSecond++;
! 178: }
! 179: Data->wMilliseconds = LOWORD(iobuffer[0]);
! 180: Data->wDay = HIBYTE(HIWORD(iobuffer[1]));
! 181: Data->wMonth = LOBYTE(HIWORD(iobuffer[1]));
! 182: Data->wYear = LOWORD(iobuffer[1]);
! 183: Data->wDayOfWeek = HIBYTE(HIWORD(iobuffer[2]));
! 184: if (Data->wDayOfWeek == 7) // Dow Korrektur
! 185: Data->wDayOfWeek = 0;
! 186:
! 187: io_params.region = 1;
! 188: io_params.offset += 0x08;
! 189: io_params.count = 1;
! 190:
! 191: ReadHopfDevice();
! 192:
! 193: Data->wStatus = LOBYTE(HIWORD(iobuffer[0]));
! 194: }
! 195:
! 196:
! 197: void
! 198: GetHopfLocalTime(
! 199: LPHOPFTIME Data
! 200: )
! 201: {
! 202: DWORD Offset = 0;
! 203:
! 204: GetHopfTime(Data, Offset);
! 205: }
! 206:
! 207:
! 208: void
! 209: GetHopfSystemTime(
! 210: LPHOPFTIME Data
! 211: )
! 212: {
! 213: DWORD Offset = 0x10;
! 214:
! 215: GetHopfTime(Data,Offset);
! 216: }
! 217:
! 218:
! 219: void
! 220: GetSatData(
! 221: LPSATSTAT Data
! 222: )
! 223: {
! 224: io_params.region = 1;
! 225: io_params.offset = 0xb0;
! 226: io_params.count = 5;
! 227:
! 228: ReadHopfDevice();
! 229:
! 230: Data->wVisible = HIBYTE(HIWORD(iobuffer[0]));
! 231: Data->wMode = LOBYTE(LOWORD(iobuffer[0]));
! 232: Data->wSat0 = HIBYTE(HIWORD(iobuffer[1]));
! 233: Data->wRat0 = LOBYTE(HIWORD(iobuffer[1]));
! 234: Data->wSat1 = HIBYTE(LOWORD(iobuffer[1]));
! 235: Data->wRat1 = LOBYTE(LOWORD(iobuffer[1]));
! 236: Data->wSat2 = HIBYTE(HIWORD(iobuffer[2]));
! 237: Data->wRat2 = LOBYTE(HIWORD(iobuffer[2]));
! 238: Data->wSat3 = HIBYTE(LOWORD(iobuffer[2]));
! 239: Data->wRat3 = LOBYTE(LOWORD(iobuffer[2]));
! 240: Data->wSat4 = HIBYTE(HIWORD(iobuffer[3]));
! 241: Data->wRat4 = LOBYTE(HIWORD(iobuffer[3]));
! 242: Data->wSat5 = HIBYTE(LOWORD(iobuffer[3]));
! 243: Data->wRat5 = LOBYTE(LOWORD(iobuffer[3]));
! 244: Data->wSat6 = HIBYTE(HIWORD(iobuffer[4]));
! 245: Data->wRat6 = LOBYTE(HIWORD(iobuffer[4]));
! 246: Data->wSat7 = HIBYTE(LOWORD(iobuffer[4]));
! 247: Data->wRat7 = LOBYTE(LOWORD(iobuffer[4]));
! 248: }
! 249:
! 250:
! 251: void
! 252: GetDiffTime(
! 253: LPLONG Data
! 254: )
! 255: {
! 256: io_params.region = 1;
! 257: io_params.offset = 0x0c;
! 258: io_params.count = 1;
! 259:
! 260: ReadHopfDevice();
! 261:
! 262: *Data = iobuffer[0];
! 263: }
! 264:
! 265:
! 266: void
! 267: GetPosition(
! 268: LPGPSPOS Data
! 269: )
! 270: {
! 271: io_params.region = 1;
! 272: io_params.offset = 0x90; // Positionsdaten Länge
! 273: io_params.count = 1;
! 274:
! 275: ReadHopfDevice();
! 276:
! 277: Data->wLongitude = iobuffer[0]; //in Millisekunden
! 278: io_params.region = 1;
! 279: io_params.offset = 0xa0; // Positionsdaten Breite
! 280: io_params.count = 1;
! 281:
! 282: ReadHopfDevice();
! 283:
! 284: Data->wLatitude = iobuffer[0];
! 285: Data->wAltitude = 0;
! 286: }
! 287:
! 288:
! 289: void
! 290: GetHardwareVersion(
! 291: LPCLOCKVER Data
! 292: )
! 293: {
! 294: int i;
! 295:
! 296: io_params.region = 1;
! 297: io_params.offset = 0x50;
! 298: io_params.count = 12;
! 299:
! 300: ReadHopfDevice();
! 301:
! 302: Data->cVersion[0] = '\0';
! 303: iobuffer[13] = 0;
! 304: for (i = 0; i < 13; i++) {
! 305: Data->cVersion[i * 4 ] = HIBYTE(HIWORD(iobuffer[i]));
! 306: Data->cVersion[i * 4 + 1] = LOBYTE(HIWORD(iobuffer[i]));
! 307: Data->cVersion[i * 4 + 2] = HIBYTE(LOWORD(iobuffer[i]));
! 308: Data->cVersion[i * 4 + 3] = LOBYTE(LOWORD(iobuffer[i]));
! 309: }
! 310: }
! 311:
! 312:
! 313: void
! 314: GetDCFAntenne(
! 315: LPDCFANTENNE Data
! 316: )
! 317: {
! 318: io_params.region = 1;
! 319: io_params.offset = 0xcc;
! 320: io_params.count = 1;
! 321:
! 322: ReadHopfDevice();
! 323: Data->bStatus1 = HIBYTE(HIWORD(iobuffer[0]));
! 324: Data->bStatus = LOBYTE(HIWORD(iobuffer[0]));
! 325: Data->wAntValue = LOWORD(iobuffer[0]);
! 326: }
! 327:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>