summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/ntpd/map_vme.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ntp/ntpd/map_vme.c')
-rw-r--r--contrib/ntp/ntpd/map_vme.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/contrib/ntp/ntpd/map_vme.c b/contrib/ntp/ntpd/map_vme.c
new file mode 100644
index 0000000..3c161cc
--- /dev/null
+++ b/contrib/ntp/ntpd/map_vme.c
@@ -0,0 +1,135 @@
+/********************************************************/
+/* map_vme.c */
+/* VME control of TrueTime VME-SG sync gen card */
+/* and TrueTime GPS-VME receiver card */
+/* Version for 700 series HPUX 9.0 */
+/* Richard E.Schmidt, US Naval Observatory, Washington */
+/* 27 March 94 */
+/********************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(REFCLOCK) && defined(CLOCK_GPSVME)
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/sysmacros.h>
+#include <sys/rtprio.h> /* for rtprio */
+#include <sys/lock.h> /* for plock */
+#include "/etc/conf/machine/vme2.h"
+#include "/etc/conf/h/io.h"
+#include "gps.h"
+
+/* GLOBALS */
+void *gps_base;
+unsigned short *greg[NREGS];
+struct vme2_map_addr ma; /* memory mapped structure */
+int fd; /* file descriptor for VME */
+
+void unmap_vme ();
+
+caddr_t
+map_vme (
+ char *filename
+ )
+{
+ int ret;
+ caddr_t base;
+ struct vme2_io_testx tx;
+ caddr_t cp;
+
+#define VME_START_ADDR 0x00000 /* Starting address in A16N VME Space */
+#define VMESIZE 0xFF /* 256 bytes of A16N space length */
+
+ /*
+ To create the HP9000/700 series device file, /dev/vme2:
+ mknod /dev/vme2 c 44 0x0; chmod 600 /dev/vme2
+
+ Then must create /etc/vme.CFG and run /etc/vme_config and reboot.
+ */
+ if ((fd = open (filename, O_RDWR)) < 0) {
+ printf("ERROR: VME bus adapter open failed. errno:%d\n",
+ errno);
+ if(errno == ENODEV) {
+ printf("ENODEV. Is driver in kernel? vme2 in dfile?\n");
+ }
+ exit(errno);
+ }
+ tx.card_type = VME_A16;
+ tx.vme_addr = VME_START_ADDR;
+ tx.width = SHORT_WIDE;
+
+ if(ioctl(fd, VME2_IO_TESTR, &tx)) {
+ printf("ioctl to test VME space failed. Errno: %d\n",
+ errno);
+ exit(errno);
+ }
+ if(tx.error)
+ printf("io_testr failed internal error %d\n",tx.error);
+ if(tx.access_result <= 0) {
+ printf("io_testr failed\n");
+ exit(2);
+ }
+
+ /* If successful mmap the device */
+ /* NOW MAP THE CARD */
+ ma.card_type = VME_A16;
+ ma.vme_addr = VME_START_ADDR;
+ ma.size = VMESIZE;
+
+ if(ioctl(fd, VME2_MAP_ADDR, &ma)) {
+ printf("ioctl to map VME space failed. Errno: %d\n",
+ errno);
+ exit(errno);
+ }
+ if(ma.error) {
+ printf("ioctl to map VME failed\n");
+ exit(ENOMEM);
+ }
+ base = ma.user_addr;
+ return(base);
+}
+
+
+void
+unmap_vme(void)
+{
+ if(ioctl(fd, VME2_UNMAP_ADDR, &ma))
+ printf("ioctl to unmap VME space failed. Errno: %d\n",
+ errno);
+ close(fd);
+ return;
+}
+
+
+int
+init_vme(boid)
+{
+ /* set up address offsets */
+
+ gps_base = map_vme (GPS_VME);
+
+/* offsets from base address: */
+
+ greg[0] = (unsigned short *)gps_base + GFRZ1;
+ greg[1] = (unsigned short *)gps_base + GUFRZ1;
+ greg[2] = (unsigned short *)gps_base + GREG1A;
+ greg[3] = (unsigned short *)gps_base + GREG1B;
+ greg[4] = (unsigned short *)gps_base + GREG1C;
+ greg[5] = (unsigned short *)gps_base + GREG1D;
+ greg[6] = (unsigned short *)gps_base + GREG1E;
+
+ return (0);
+}
+
+#else /* not (REFCLOCK && CLOCK_GPSVME) */
+int map_vme_bs;
+#endif /* not (REFCLOCK && CLOCK_GPSVME) */
OpenPOWER on IntegriCloud