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>