xref: /netbsd-src/external/bsd/ntp/dist/kernel/sys/bsd_audioirig.h (revision cdfa2a7ef92791ba9db70a584a1d904730e6fb46)
1 /*	$NetBSD: bsd_audioirig.h,v 1.6 2020/05/25 20:47:20 christos Exp $	*/
2 
3 /*
4  *	Header
5  */
6 
7 #ifndef _BSD_AUDIOIRIG_H_
8 #define _BSD_AUDIOIRIG_H_
9 
10 #include <sys/time.h>
11 
12 /********************************************************************/
13 /* user interface */
14 
15 /*
16  * irig ioctls
17  */
18 #if defined(__STDC__) || (!defined(sun) && !defined(ibm032) && !defined(__GNUC))
19 #define AUDIO_IRIG_OPEN         _IO('A', 50)
20 #define AUDIO_IRIG_CLOSE        _IO('A', 51)
21 #define AUDIO_IRIG_SETFORMAT    _IOWR('A', 52, int)
22 #else
23 #define AUDIO_IRIG_OPEN         _IO(A, 50)
24 #define AUDIO_IRIG_CLOSE        _IO(A, 51)
25 #define AUDIO_IRIG_SETFORMAT    _IOWR(A, 52, int)
26 #endif
27 
28 /*
29  * irig error codes
30  */
31 #define AUDIO_IRIG_BADSIGNAL	0x01
32 #define AUDIO_IRIG_BADDATA	0x02
33 #define AUDIO_IRIG_BADSYNC	0x04
34 #define AUDIO_IRIG_BADCLOCK	0x08
35 #define AUDIO_IRIG_OLDDATA	0x10
36 
37 /********************************************************************/
38 
39 /*
40  * auib definitions
41  */
42 #define AUIB_SIZE	(0x0040)
43 #define AUIB_INC	(0x0008)
44 #define AUIB_MOD(k)	((k) & 0x0038)
45 #define AUIB_INIT(ib)	((ib)->ib_head = (ib)->ib_tail = (ib)->ib_lock = \
46 			 (ib)->phase = (ib)->shi = (ib)->slo = (ib)->high = \
47 			 (ib)->level0 = (ib)->level1 = \
48 			 (ib)->shift[0] = (ib)->shift[1] = (ib)->shift[2] = \
49 			 (ib)->shift[3] = (ib)->sdata[0] = (ib)->sdata[1] = \
50 			 (ib)->sdata[2] = (ib)->sdata[3] = (ib)->err = 0)
51 #define AUIB_EMPTY(ib)	((ib)->ib_head == (ib)->ib_tail)
52 #define AUIB_LEN(ib)	(AUIB_MOD((ib)->ib_tail - (ib)->ib_head))
53 #define AUIB_LEFT(ib)	(AUIB_MOD((ib)->ib_head - (ib)->ib_tail - 1))
54 #define IRIGDELAY 3
55 #define IRIGLEVEL 1355
56 
57 #ifndef LOCORE
58 /*
59  * irig_time holds IRIG data for one second
60  */
61 struct irig_time {
62         struct timeval  stamp;          /* timestamp */
63         u_char  bits[13];               /* 100 irig data bits */
64 	u_char	status;			/* status byte */
65         char    time[14];               /* time string */
66 };
67 
68 /*
69  * auib's are used for IRIG data communication between the trap
70  * handler and the software interrupt.
71  */
72 struct auib {
73 	/* driver variables */
74 	u_short	active;			/* 0=inactive, else=active */
75 	u_short	format;			/* time output format */
76 	struct	irig_time timestr;	/* time structure */
77 	char	buffer[14];		/* output formation buffer */
78 
79 	/* hardware interrupt variables */
80 	struct	timeval tv1,tv2,tv3;	/* time stamps (median filter) */
81 	int	level0,level1;		/* lo/hi input levels */
82 	int	level;			/* decision level */
83 	int	high;			/* recent largest sample */
84 	int	sl0,sl1;		/* recent sample levels */
85 	int	lasts;			/* last sample value */
86 	u_short	scount;			/* sample count */
87 	u_long	eacc;			/* 10-bit element accumulator */
88 	u_long	ebit;			/* current bit in element */
89 	u_char	r_level,mmr1;		/* recording level 0-255 */
90 	int	shi,slo,phase;		/* AGC variables */
91 	u_long	err;			/* error status bits */
92 	int	ecount;			/* count of elements this second */
93 	long	shift[4];		/* shift register of pos ident */
94 	long	sdata[4];		/* shift register of symbols */
95 
96 	int	ib_head;		/* queue head */
97 	int	ib_tail;		/* queue tail */
98 	u_short	ib_lock;		/* queue head lock */
99 	u_long	ib_data[AUIB_SIZE];	/* data buffer */
100 };
101 #endif
102 
103 #endif /* _BSD_AUDIOIRIG_H_ */
104