1 /*        $NetBSD: tt560_api.h,v 1.5 2020/05/25 20:47:20 christos Exp $         */
2 
3 /***********************************************************************
4  *
5  *  Module:  ttime_api.h
6  *
7  *  Author:  SIS  1998
8  *           LM NE&SS 2001
9  *
10  *  Description
11  *
12  *      This header file contains data necessary for the API to the
13  *      True Time board. This contains all of the structure definitions
14  *      for the individual registers.
15  *
16  ***********************************************************************/
17 #ifndef TTIME_API_H
18 #define TTIME_API_H
19 
20 #ifdef CPP
21 extern "C" {
22 #endif
23 
24 #include <time.h>
25 
26 typedef struct
27 {
28     unsigned int    micro_sec;
29     unsigned int    milli_sec;
30     struct tm                 gps_tm;
31 } gps_time_t;
32 
33 typedef struct
34 {
35     unsigned char reserved_1;
36     unsigned unit_ms                    : 4;
37     unsigned filler_0                   : 4;
38     unsigned hun_ms           : 4;
39     unsigned tens_ms                    : 4;
40     unsigned tens_sec                   : 4;
41     unsigned unit_sec                   : 4;
42 
43     unsigned tens_min                   : 4;
44     unsigned unit_min                   : 4;
45     unsigned tens_hour                  : 4;
46     unsigned unit_hour                  : 4;
47     unsigned tens_day                   : 4;
48     unsigned unit_day                   : 4;
49     unsigned filler_1                   : 4;
50     unsigned hun_day                    : 4;
51 
52     unsigned tens_year                  : 4;
53     unsigned unit_year                  : 4;
54     unsigned thou_year                  : 4;
55     unsigned hun_year                   : 4;
56     unsigned char reserved_2[2];
57 } preset_time_reg_t;
58 
59 typedef struct
60 {
61     unsigned n_d0                       : 2;
62     unsigned antenna_short_stat                   : 1; /* 0 = fault */
63     unsigned antenna_open_stat                    : 1; /* 0 = fault */
64     unsigned n_d1                       : 1;
65     unsigned rate_gen_pulse_stat        : 1;
66     unsigned time_cmp_pulse_stat        : 1;
67     unsigned ext_event_stat             : 1;
68 
69 } hw_stat_reg_t;
70 
71 typedef struct
72 {
73     unsigned tens_us                    : 4;
74     unsigned unit_us                    : 4;
75     unsigned unit_ms                    : 4;
76     unsigned hun_us           : 4;
77     unsigned char hw_stat;    /* hw_stat_reg_t hw_stat; */
78     unsigned char reserved_3;
79 
80     unsigned hun_ms           : 4;
81     unsigned tens_ms                    : 4;
82     unsigned tens_sec                   : 4;
83     unsigned unit_sec                   : 4;
84     unsigned tens_min                   : 4;
85     unsigned unit_min                   : 4;
86     unsigned tens_hour                  : 4;
87     unsigned unit_hour                  : 4;
88 
89     unsigned tens_day                   : 4;
90     unsigned unit_day                   : 4;
91     unsigned status           : 4;
92     unsigned hun_day                    : 4;
93     unsigned tens_year                  : 4;
94     unsigned unit_year                  : 4;
95     unsigned thou_year                  : 4;
96     unsigned hun_year                   : 4;
97 } time_freeze_reg_t;
98 
99 typedef struct
100 {
101     unsigned char off_low;
102     unsigned char off_high;
103     unsigned char reserved_4[2];
104 } sync_gen_off_reg_t;
105 
106 typedef struct
107 {
108     unsigned tens_min                   : 4;
109     unsigned unit_min                   : 4;
110     unsigned tens_hour                  : 4;
111     unsigned unit_hour                  : 4;
112     unsigned char sign_ascii; /* '+' or '-' */
113     unsigned char reserved_5;
114 } local_off_t;
115 
116 /*
117  *  This structure can be used for both the position freeze
118  *  and position preset registers.
119  */
120 typedef struct
121 {
122     unsigned lat_tens_degee             : 4;
123     unsigned lat_unit_degee             : 4;
124     unsigned filler_0                             : 4;
125     unsigned lat_hun_degree             : 4;
126     unsigned lat_tens_min               : 4;
127     unsigned lat_unit_min               : 4;
128     unsigned char lat_north_south;      /* 'N' or 'S' */
129 
130     unsigned filler_1                             : 4;
131     unsigned lat_tenth_sec              : 4;
132     unsigned lat_tens_sec               : 4;
133     unsigned lat_unit_sec               : 4;
134     unsigned long_tens_degree           : 4;
135     unsigned long_unit_degree           : 4;
136     unsigned filler_2                             : 4;
137     unsigned long_hun_degree            : 4;
138 
139     unsigned long_tens_min              : 4;
140     unsigned long_unit_min              : 4;
141     unsigned char long_east_west;       /* 'E' or 'W' */
142     unsigned filler_3                             : 4;
143     unsigned long_tenth_sec             : 4;
144     unsigned long_tens_sec              : 4;
145     unsigned long_unit_sec              : 4;
146 
147     unsigned elv_tens_km                : 4;
148     unsigned elv_unit_km                : 4;
149     unsigned char elv_sign;             /* '+' or '-' */
150     unsigned elv_unit_m                           : 4;
151     unsigned elv_tenth_m                : 4;
152     unsigned elv_hun_m                            : 4;
153     unsigned elv_tens_m                           : 4;
154 } pos_reg_t;
155 
156 typedef struct
157 {
158     unsigned char prn1_tens_units;
159     unsigned char prn1_reserved;
160     unsigned char lvl1_tenths_hundredths;
161     unsigned char lvl1_tens_units;
162 
163     unsigned char prn2_tens_units;
164     unsigned char prn2_reserved;
165     unsigned char lvl2_tenths_hundredths;
166     unsigned char lvl2_tens_units;
167 
168     unsigned char prn3_tens_units;
169     unsigned char prn3_reserved;
170     unsigned char lvl3_tenths_hundredths;
171     unsigned char lvl3_tens_units;
172 
173     unsigned char prn4_tens_units;
174     unsigned char prn4_reserved;
175     unsigned char lvl4_tenths_hundredths;
176     unsigned char lvl4_tens_units;
177 
178     unsigned char prn5_tens_units;
179     unsigned char prn5_reserved;
180     unsigned char lvl5_tenths_hundredths;
181     unsigned char lvl5_tens_units;
182 
183     unsigned char prn6_tens_units;
184     unsigned char prn6_reserved;
185     unsigned char lvl6_tenths_hundredths;
186     unsigned char lvl6_tens_units;
187 
188     unsigned char flag;
189     unsigned char reserved[3];
190 } sig_levels_t;
191 
192 typedef struct
193 {
194     unsigned tens_us                    : 4;
195     unsigned unit_us                    : 4;
196     unsigned unit_ms                    : 4;
197     unsigned hun_us           : 4;
198     unsigned hun_ms           : 4;
199     unsigned tens_ms                    : 4;
200     unsigned tens_sec                   : 4;
201     unsigned unit_sec                   : 4;
202 
203     unsigned tens_min                   : 4;
204     unsigned unit_min                   : 4;
205     unsigned tens_hour                  : 4;
206     unsigned unit_hour                  : 4;
207     unsigned tens_day                   : 4;
208     unsigned unit_day                   : 4;
209     unsigned stat             : 4;
210     unsigned hun_day                    : 4;
211 
212     unsigned tens_year                  : 4;
213     unsigned unit_year                  : 4;
214     unsigned thou_year                  : 4;
215     unsigned hun_year                   : 4;
216     unsigned char reserved_5[2];
217 } ext_time_event_reg_t;
218 
219 typedef struct
220 {
221     unsigned tens_us          : 4;
222     unsigned unit_us          : 4;
223     unsigned unit_ms          : 4;
224     unsigned hun_us : 4;
225     unsigned hun_ms : 4;
226     unsigned tens_ms          : 4;
227     unsigned tens_sec         : 4;
228     unsigned unit_sec         : 4;
229 
230     unsigned tens_min         : 4;
231     unsigned unit_min         : 4;
232     unsigned tens_hour        : 4;
233     unsigned unit_hour        : 4;
234     unsigned tens_day         : 4;
235     unsigned unit_day         : 4;
236     unsigned mask   : 4;
237     unsigned hun_day          : 4;
238 } time_cmp_reg_t;
239 
240 typedef struct
241 {
242     unsigned char err_stat;
243     unsigned char no_def;
244     unsigned char oscillator_stat[2];
245 } diag_reg_t;
246 
247 typedef struct
248 {
249     unsigned res              :2;
250     unsigned rate_int_mask    :1;
251     unsigned cmp_int_mask     :1;
252     unsigned ext_int_mask     :1;
253     unsigned rate_stat_clr    :1;
254     unsigned cmp_stat_clr     :1;
255     unsigned ext_stat_clr     :1;
256     unsigned char reserved[3];
257 } hw_ctl_reg_t;
258 
259 typedef struct
260 {
261     unsigned  preset_pos_rdy  :1;
262     unsigned  sel_pps_ref     :1;
263     unsigned  sel_gps_ref     :1;
264     unsigned  sel_time_code   :1;
265     unsigned  gen_stp_run     :1;
266     unsigned  preset_time_rdy :1;
267     unsigned  dst             :1;
268     unsigned  mode_sel                  :1;
269 
270     unsigned  ctl_am_dc                 :1;
271     unsigned  reserved                  :3;
272     unsigned  input_code      :4;
273 
274     unsigned char rate_reserved;
275 
276     unsigned  rate_flag                 :4;
277     unsigned  rate_reserved1  :4;
278 } conf_reg_t;
279 
280 typedef struct
281 {
282      unsigned char  mem_reserved[0xf8];
283 
284      hw_ctl_reg_t   hw_ctl_reg;
285 
286      time_freeze_reg_t  time_freeze_reg;
287 
288      pos_reg_t                pos_freeze_reg;
289 
290      conf_reg_t               conf_reg;
291 
292      diag_reg_t               diag_reg;
293 
294      local_off_t    local_offset;
295 
296      sync_gen_off_reg_t sync_gen_offset;
297 
298      unsigned char  reserved[4];
299 
300      unsigned char  config_reg2_ctl;
301 
302      unsigned char      reserved2[11];
303 
304      time_cmp_reg_t time_compare_reg;
305 
306      unsigned char  reserved3[24];
307 
308      preset_time_reg_t        preset_time_reg;
309 
310      pos_reg_t                preset_pos_reg;
311 
312      ext_time_event_reg_t extern_time_event_reg;
313 
314      unsigned char  reserved4[24];
315 
316      sig_levels_t   signal_levels_reg;
317 
318      unsigned char  reserved5[12];
319 } tt_mem_space_t;
320 
321 #define TTIME_MEMORY_SIZE 0x200
322 
323 /*
324  *  Defines for register offsets
325  */
326 #define HW_CTL_REG            0x0f8
327 #define TIME_FREEZE_REG                 0x0fc
328 #define HW_STAT_REG           0x0fe
329 #define POS_FREEZE_REG                  0x108
330 #define CONFIG_REG_1                    0x118
331 #define DIAG_REG              0x11c
332 #define LOCAL_OFF_REG                   0x120
333 #define SYNC_GEN_OFF_REG      0x124
334 #define CONFIG_REG_2                    0x12c
335 #define TIME_CMP_REG                    0x138
336 #define PRESET_TIME_REG                 0x158
337 #define PRESET_POS_REG                  0x164
338 #define EXT_EVENT_REG                   0x174
339 #define SIG_LVL_PRN1                    0x198
340 #define SIG_LVL_PRN2                    0x19c
341 #define SIG_LVL_PRN3                    0x1a0
342 #define SIG_LVL_PRN4                    0x1a4
343 #define SIG_LVL_PRN5                    0x1a8
344 #define SIG_LVL_PRN6                    0x1ac
345 #define SIG_LVL_FLAG                    0x1b0
346 
347 /*
348  *  Defines for accessing the hardware status register.
349  */
350 #define HW_STAT_ANTENNA_SHORT           0         /* access the antenna short bit */
351 #define HW_STAT_ANTENNA_OPEN            1         /* access the antenna open bit */
352 #define HW_STAT_RATE_GEN_PULSE_STAT     2         /* access the rate gen pulse bit */
353 #define HW_STAT_TIME_CMP_PULSE_STAT     3         /* access the time cmp bit */
354 #define HW_STAT_EXT_EVENT_STAT                    4         /* access the external event bit */
355 
356 /*
357  *  Defines for accessing the hardware control register
358  */
359 
360 #define HW_CTL_RATE_INT_MASK            0         /* access rate generator int mask */
361 #define HW_CTL_CMP_INT_MASK             1         /* access compare interrupt mask */
362 #define HW_CTL_EXT_INT_MASK             2         /* access external event interrupt mask */
363 #define HW_CTL_RATE_GEN_INT_CLEAR       3         /* access rate gen. interrupt clear field */
364 #define HW_CTL_TIME_CMP_INT_CLEAR       4         /* access time cmp interrupt clear field */
365 #define HW_CTL_EXT_EVENT_INT_CLEAR      5         /* access external event int clear field */
366 
367 /*
368  *  Defines for configuration register bit fields.
369  */
370 #define PRESET_POS_RDY_BIT              0         /* access the preset pos. rdy. bit */
371 #define SEL_1_PPS_REF_BIT               1         /* access the select 1 pps reference bit */
372 #define SEL_GPS_REF_BIT                           2         /* access the select gps reference bit */
373 #define SEL_TIME_CODE_REF_BIT           3         /* access the select time code reference bit */
374 #define GEN_STOP_BIT                              4         /* access the generator start/stop bit */
375 #define PRESET_TIME_RDY_BIT             5         /* access the preset time ready bit */
376 #define DST_BIT                                   6         /* access the DST bit */
377 #define MODE_SEL_BIT                              7         /* access the mode select bit */
378 #define AM_DC_BIT                       8         /* access the code bits AM/DC bit */
379 #define IN_CODE_SEL_BIT                           9         /* access the input code select bit */
380 #define FLAG_BIT                        10        /* access the flag bit */
381 
382 /*
383  * The following defines are used to set modes in the
384  * configuration register.
385  */
386 
387 #define CONF_SET_AM                     0         /* Set code to AM   */
388 #define CONF_SET_DC                     1         /* Set code to DC   */
389 #define CONF_SET_IRIG_B                           0         /* Set code IRIG B  */
390 #define CONF_SET_IRIG_A                           1         /* Set code IRIG A  */
391 
392 #define CONF_FLAG_DISABLE               0         /* Disable pulse        */
393 #define CONF_FLAG_10K_PPS               1         /* Set rate to 10k PPS  */
394 #define CONF_FLAG_1K_PPS                2         /* Set rate to 1k PPS   */
395 #define CONF_FLAG_100_PPS               3         /* Set rate to 100 PPS  */
396 #define CONF_FLAG_10_PPS                4         /* Set rate to 10 PPS   */
397 #define CONF_FLAG_1_PPS                           5         /* Set rate to 1 PPS    */
398 
399 /*
400  *  Defines for read commands
401  */
402 
403 #define TT_RD_FREEZE_REG      0x01
404 #define TT_RD_HW_CTL_REG      0x02
405 #define TT_RD_CNFG_REG                  0x03
406 #define TT_RD_DIAG_REG                  0x04
407 #define TT_RD_LCL_OFFSET      0x05
408 #define TT_RD_SYNC_GEN_OFF    0x06
409 #define TT_RD_CNFG_REG_2      0x07
410 #define TT_RD_TIME_CMP_REG    0x08
411 #define TT_RD_PRESET_REG      0x09
412 #define TT_RD_EXT_EVNT_REG    0x0a
413 #define TT_RD_SIG_LVL_REG     0x0b
414 
415 /*
416  *  Defines for write commands
417  */
418 #define TT_WRT_FREEZE_REG     0x0c
419 #define TT_WRT_HW_CTL_REG     0x0d
420 #define TT_WRT_CNFG_REG                 0x0e
421 #define TT_WRT_DIAG_REG                 0x0f
422 #define TT_WRT_LCL_OFFSET     0x10
423 #define TT_WRT_SYNC_GEN_OFF   0x11
424 #define TT_WRT_CNFG_REG_2     0x12
425 #define TT_WRT_TIME_CMP_REG   0x13
426 #define TT_WRT_PRESET_REG     0x14
427 #define TT_WRT_EXT_EVNT_REG   0x15
428 #define TT_WRT_SIG_LVL_REG    0x16
429 
430 /*
431  *  Define the length of the buffers to move (in 32 bit words).
432  */
433 
434 #define HW_CTL_REG_LEN                  1
435 #define CNFG_REG_1_LEN                  1
436 #define DIAG_REG_LEN                    1
437 #define LCL_OFFSET_LEN                  1
438 #define SYNC_GEN_OFF_LEN      1
439 #define CNFG_REG_2_LEN                  1
440 
441 #define TIME_CMP_REG_LEN      2
442 #define PRESET_TIME_REG_LEN   3
443 #define PRESET_POS_REG_LEN    4
444 #define PRESET_REG_LEN                  (PRESET_TIME_REG_LEN+PRESET_POS_REG_LEN)
445 #define TIME_FREEZE_REG_LEN   3
446 #define POSN_FREEZE_REG_LEN   4
447 #define FREEZE_REG_LEN                  (TIME_FREEZE_REG_LEN+POSN_FREEZE_REG_LEN)
448 #define EXT_EVNT_REG_LEN      3
449 #define   SIG_LVL_REG_LEN               7
450 #define   GPS_TIME_LEN                  7
451 
452 /*
453  * Define BCD - INT - BCD macros.
454  */
455 
456 #define BCDTOI(a)   ( ( ( ( (a) & 0xf0 ) >> 4 ) * 10 )  + ( (a) & 0x0f ) )
457 #define ITOBCD(a)   ( ( ( (           (a) ) / 10) << 4 ) + ( (           (a) ) % 10) )
458 #define LTOBCD(a)   ( ( ( ( (uint64_t)(a) ) / 10) << 4 ) + ( ( (uint64_t)(a) ) % 10) )
459 
460 extern int  init_560                  (                      );
461 extern void close_560                 (                      );
462 extern int  write_hw_ctl_reg          (hw_ctl_reg_t         *);
463 extern int  write_hw_ctl_reg_bitfield (int, int              );
464 extern int  read_conf_reg             (conf_reg_t           *);
465 extern int  read_conf_reg_bitfield    (int                   );
466 extern int  write_conf_reg            (conf_reg_t           *);
467 extern int  write_conf_reg_bitfield   (int, unsigned char    );
468 extern int  read_hw_stat_reg_bitfield (int                   );
469 extern int  read_local_offset_reg     (local_off_t          *);
470 extern int  write_local_offset_reg    (local_off_t          *);
471 extern int  read_sync_offset_reg      (sync_gen_off_reg_t   *);
472 extern int  write_sync_offset_reg     (sync_gen_off_reg_t   *);
473 extern int  read_time_cmp_reg         (time_cmp_reg_t       *);
474 extern int  write_time_cmp_reg        (time_cmp_reg_t       *);
475 extern int  read_preset_time_reg      (preset_time_reg_t    *);
476 extern int  write_preset_time_reg     (preset_time_reg_t    *);
477 extern int  reset_time                (                      );
478 extern int  set_new_time              (preset_time_reg_t    *);
479 extern int  read_preset_position_reg  (pos_reg_t            *);
480 extern int  write_preset_position_reg (pos_reg_t            *);
481 extern int  read_external_event_reg   (ext_time_event_reg_t *);
482 extern int  read_signal_level_reg     (sig_levels_t         *);
483 extern int  freeze_time               (                      );
484 extern int  snapshot_time             (time_freeze_reg_t    *);
485 extern int  read_position_freeze_reg  (pos_reg_t            *);
486 extern int  read_diag_reg             (diag_reg_t           *);
487 
488 #ifdef CPP
489 }
490 #endif
491 #endif
492