Annotation of embedaddon/ntp/ports/winnt/ntpd/hopf_PCI_io.c, revision 1.1.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>