start to use libosmocore within the firmware
[osmocom-bb.git] / src / target / firmware / include / layer1 / sync.h
1 #ifndef _L1_SYNC_H
2 #define _L1_SYNC_H
3
4 #include <osmocore/linuxlist.h>
5 #include <osmocore/gsm_utils.h>
6 #include <layer1/tdma_sched.h>
7 #include <l1a_l23_interface.h>
8
9 struct l1_cell_info {
10         uint16_t        arfcn;
11         uint32_t        bsic;
12         uint32_t        fn_offset;
13         uint32_t        time_alignment;
14 };
15
16 enum l1s_chan {
17         L1S_CHAN_MAIN,
18         L1S_CHAN_SACCH,
19         _NUM_L1S_CHAN
20 };
21
22
23 struct l1s_state {
24         struct gsm_time current_time;   /* current time */
25         struct gsm_time next_time;      /* time at next TMDMA irq */
26
27         struct l1_cell_info serving_cell;
28
29         struct tdma_scheduler tdma_sched;
30
31         uint32_t        tpu_offset;
32
33         int             task;
34
35         /* Transmit queues of pending packets for main DCCH and ACCH */
36         struct llist_head tx_queue[_NUM_L1S_CHAN];
37
38         /* bit-mask of multi-frame tasks that are currently active */
39         uint32_t        mf_tasks;
40
41         struct {
42                 uint8_t         ra;
43         } rach;
44 };
45
46 extern struct l1s_state l1s;
47
48 enum l1_sig_num {
49         L1_SIG_PM,      /* Power Measurement */
50         L1_SIG_NB,      /* Normal Burst */
51 };
52
53 struct l1s_meas_hdr {
54         uint16_t snr;           /* signal/noise ratio */
55         int16_t toa_qbit;       /* time of arrival (qbits) */
56         int16_t pm_dbm8;        /* power level in dbm/8 */
57         int16_t freq_err;       /* Frequency error in Hz */
58 };
59
60 struct l1_signal {
61         uint16_t signum;
62         uint16_t arfcn;
63         union {
64                 struct {
65                         int16_t dbm8[2];
66                 } pm;
67                 struct {
68                         struct l1s_meas_hdr meas[4];
69                         uint16_t crc;
70                         uint16_t fire;
71                         uint16_t num_biterr;
72                         uint8_t frame[24];
73                 } nb;
74         };
75 };
76
77 typedef void (*l1s_cb_t)(struct l1_signal *sig);
78
79 void l1s_set_handler(l1s_cb_t handler);
80
81 int16_t l1s_snr_int(uint16_t snr);
82 uint16_t l1s_snr_fract(uint16_t snr);
83
84 void l1s_dsp_abort(void);
85
86 void l1s_fb_test(uint8_t base_fn, uint8_t fb_mode);
87 void l1s_sb_test(uint8_t base_fn);
88 void l1s_pm_test(uint8_t base_fn, uint16_t arfcn);
89 void l1s_nb_test(uint8_t base_fn);
90
91 void l1s_init(void);
92
93 /* init.c */
94 void layer1_init(void);
95
96 #endif /* _L1_SYNC_H */