diff --git a/src/fe/controller.c b/src/fe/controller.c index 3de64485bcdbf88e2926cb29224b6d750f5746ea..d05ac2d5212dfe1986e9d11c88ae48371398ebcb 100644 --- a/src/fe/controller.c +++ b/src/fe/controller.c @@ -522,7 +522,8 @@ int getGpsTimeTsync(unsigned int *tsyncSec, unsigned int *tsyncUsec) { if (cdsPciModules.gps) { timeRead = (TSYNC_REGISTER *)cdsPciModules.gps; timeSec = timeRead->BCD_SEC; - *tsyncSec = timeSec + 31190400; + timeSec += cdsPciModules.gpsOffset; + *tsyncSec = timeSec; timeNsec = timeRead->SUB_SEC; *tsyncUsec = ((timeNsec & 0xfffffff) * 5) / 1000; sync = ((timeNsec >> 31) & 0x1) + 1; @@ -531,6 +532,37 @@ int getGpsTimeTsync(unsigned int *tsyncSec, unsigned int *tsyncUsec) { } return(0); } +//*********************************************************************** +// Get current GPS seconds from TSYNC IRIG-B Rcvr +unsigned int getGpsSecTsync() { +TSYNC_REGISTER *timeRead; + unsigned int timeSec,timeNsec,sync; + + if (cdsPciModules.gps) { + timeRead = (TSYNC_REGISTER *)cdsPciModules.gps; + timeSec = timeRead->BCD_SEC; + timeSec += cdsPciModules.gpsOffset; + return(timeSec); + } + return(0); +} +//*********************************************************************** +// Get current GPS useconds from TSYNC IRIG-B Rcvr + int getGpsuSecTsync(unsigned int *tsyncUsec) { + TSYNC_REGISTER *timeRead; + unsigned int timeNsec,sync; + + if (cdsPciModules.gps) { + timeRead = (TSYNC_REGISTER *)cdsPciModules.gps; + timeNsec = timeRead->SUB_SEC; + *tsyncUsec = ((timeNsec & 0xfffffff) * 5) / 1000; + sync = ((timeNsec >> 31) & 0x1) + 1; + // printf("time = %u %u %d\n",timeSec,(timeNsec & 0xffffff),((timeNsec & 0xffffff)/200)); + return(sync); + } + return(0); +} + #if 0 //*********************************************************************** @@ -1195,17 +1227,6 @@ udelay(1000); #endif onePpsTime = clock16K; timeSec = current_time() -1; - if(cdsPciModules.gpsType == SYMCOM_RCVR) - { - // time = getGpsTime(&ns); - // timeSec = time - 252806386; - } - if(cdsPciModules.gpsType == TSYNC_RCVR) - { - // gps_receiver_locked = getGpsTimeTsync(&timeSec,&usec); - // timeSec += 284083219; - // timeSec += 0; - } #ifdef TIME_SLAVE timeSec = *rfmTime; #endif @@ -1433,8 +1454,10 @@ udelay(1000); if(cdsPciModules.gpsType == SYMCOM_RCVR) lockGpsTime(); if(cdsPciModules.gpsType == TSYNC_RCVR) { - gps_receiver_locked = getGpsTimeTsync(&timeSec,&usec); - pLocalEpics->epicsOutput.diags[FE_DIAGS_IRIGB_TIME] = usec; + // Reading second info will lock the time register, allowing + // nanoseconds to be read later (on next cycle). Two step process used to + // save CPU time here, as each read can take 2usec or more. + timeSec = getGpsSecTsync(); } #ifdef IOP_TIME_SLAVE_RFM timeSec = ((volatile long *)(cdsPciModules.pci_rfm[0]))[1]; @@ -1853,6 +1876,15 @@ udelay(1000); duotoneMeanDac = duotoneTotalDac/CYCLE_PER_SECOND; duotoneTotalDac = 0.0; } + if(clock16K == 1) + { + if(cdsPciModules.gpsType == TSYNC_RCVR) + { + gps_receiver_locked = getGpsuSecTsync(&usec); + pLocalEpics->epicsOutput.diags[FE_DIAGS_IRIGB_TIME] = usec; + if((usec > 20) || (usec < 5)) diagWord |= 0x10;; + } + } duotoneDac[(clock16K + 6) % CYCLE_PER_SECOND] = dWord[0][30]; duotoneTotalDac += dWord[0][30]; duotone[(clock16K + 6) % CYCLE_PER_SECOND] = dWord[0][31]; @@ -2705,7 +2737,7 @@ int main(int argc, char **argv) cdsPciModules.cDio6464lCount ++; cdsPciModules.pci_do[kk] = ioMemData->ipc[ii]; cdsPciModules.doInstance[kk] = doCnt; - status ++; + status += 2; } if((cdsPciModules.cards_used[jj].type == CDO64) && (cdsPciModules.cards_used[jj].instance == doCnt)) @@ -2781,7 +2813,7 @@ int main(int argc, char **argv) //cdsPciModules.dacCount = ioMemData->dacCount; #endif printf("%d PCI cards found \n",status); - if(cards != status) + if(status < cards) { printf(" ERROR **** Did not find correct number of cards! Expected %d and Found %d\n",cards,status); cardCountErr = 1; diff --git a/src/fe/map.c b/src/fe/map.c index 07fdbb456dcc6b49d1a882d5c5b8757c9f95edf4..2add2aa0d4518990e1f1980e6af459bd5aca5693 100644 --- a/src/fe/map.c +++ b/src/fe/map.c @@ -1527,6 +1527,7 @@ int mapTsyncGps(CDS_HARDWARE *pHardware, struct pci_dev *gpsdev) unsigned int days,hours,min,sec,msec,usec,nanosec,tsync; unsigned char *addr1; TSYNC_REGISTER *myTime; + void *TSYNC_FIFO; // Pointer to board uP FIFO pedStatus = pci_enable_device(gpsdev); pci_read_config_dword(gpsdev, PCI_BASE_ADDRESS_0, &pci_io_addr); @@ -1538,6 +1539,37 @@ int mapTsyncGps(CDS_HARDWARE *pHardware, struct pci_dev *gpsdev) pHardware->gps = addr1; pHardware->gpsType = TSYNC_RCVR; +// Spectracom IRIG-B Card does not auto detect Year information from IRIG-B fanout unit +// This section writes to the module uP CodeExp register to correct this. +// Delays are required between code lines, as writing to FIFO is slow. +// Sequence was determined by looking at manufacturer driver code. + TSYNC_FIFO = (void *)(addr1 + 384); + iowrite16(0x301,TSYNC_FIFO); + udelay(1000); + iowrite16(0x1000,TSYNC_FIFO); + udelay(1000); + iowrite16(0x72a,TSYNC_FIFO); + udelay(1000); + iowrite16(0x280,TSYNC_FIFO); + udelay(1000); + iowrite16(0x0,TSYNC_FIFO); + udelay(1000); + iowrite16(0x800,TSYNC_FIFO); + udelay(1000); + iowrite16(0x0,TSYNC_FIFO); + udelay(1000); + iowrite16(0x0,TSYNC_FIFO); + udelay(1000); + iowrite16(0x0,TSYNC_FIFO); + udelay(1000); + iowrite16(0x500,TSYNC_FIFO); + udelay(1000); + iowrite16(0xd400,TSYNC_FIFO); + udelay(10000); + udelay(10000); + udelay(10000); +// End Code exp setup + myTime = (TSYNC_REGISTER *)addr1; for(ii=0;ii<2;ii++) { @@ -1556,7 +1588,15 @@ for(ii=0;ii<2;ii++) tsync = (i>>31) & 1; i = myTime->BCD_SEC; - sec = i - 315964819; + if(i < 1000000000) + { + printk("TSYNC NOT receiving YEAR info, defaulting to by year patch\n"); + pHardware->gpsOffset = 31190400 + 31536000; + } else { + printk("TSYNC receiving YEAR info\n"); + pHardware->gpsOffset = -315964800; + } + sec = i + pHardware->gpsOffset; i = myTime->BCD_SUB_SEC; printk("date = %d days %2d:%2d:%2d\n",days,hours,min,sec); usec = (i&0xf) + ((i>>4)&0xf) *10 + ((i>>8)&0xf) * 100; diff --git a/src/include/drv/cdsHardware.h b/src/include/drv/cdsHardware.h index 6a0ce08d9ce07a88e65a162ef68c1573af854805..9b4b8a79c4e9f0641fd1ede978929834662a0d7a 100644 --- a/src/include/drv/cdsHardware.h +++ b/src/include/drv/cdsHardware.h @@ -604,6 +604,7 @@ typedef struct CDS_HARDWARE{ unsigned char *buf; volatile unsigned int *gps; /* GPS card */ unsigned int gpsType; + int gpsOffset; int dolphinCount; /* the number of Dolphin cards we have on the system */ volatile unsigned long *dolphin[2]; /* read and write Dolphin memory */