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