4 #include <osmocore/linuxlist.h>
5 #include <osmocore/gsm_utils.h>
6 #include <layer1/tdma_sched.h>
7 #include <layer1/mframe_sched.h>
8 #include <l1a_l23_interface.h>
10 /* structure representing L1 sync information about a cell */
12 /* on which ARFCN (+band) is the cell? */
14 /* what's the BSIC of the cell (from SCH burst decoding) */
16 /* Combined or non-combined CCCH */
17 uint8_t ccch_mode; /* enum ccch_mode */
18 /* whats the delta of the cells current GSM frame number
19 * compared to our current local frame number */
21 /* how much does the TPU need adjustment (delta) to synchronize
22 * with the cells burst */
23 uint32_t time_alignment;
24 /* FIXME: should we also store the AFC value? */
39 typedef void l1_compl_cb(enum l1_compl c);
41 #define L1S_NUM_COMPL 32
42 #define L1S_NUM_NEIGH_CELL 6
45 struct gsm_time current_time; /* current GSM time */
46 struct gsm_time next_time; /* GSM time at next TMDMA irq */
48 /* the cell on which we are camping right now */
49 struct l1_cell_info serving_cell;
51 /* neighbor cell sync info */
52 struct l1_cell_info neigh_cell[L1S_NUM_NEIGH_CELL];
55 struct tdma_scheduler tdma_sched;
57 /* Multiframe scheduler */
58 struct mframe_scheduler mframe_sched;
60 /* The current TPU offset register */
63 /* Transmit queues of pending packets for main DCCH and ACCH */
64 struct llist_head tx_queue[_NUM_L1S_CHAN];
66 /* Which L1A completions are scheduled right now */
67 uint32_t scheduled_compl;
68 /* callbacks for each of the completions */
69 l1_compl_cb *completion[L1S_NUM_COMPL];
71 /* Structures below are for L1-task specific parameters, used
72 * to communicate between l1-sync and l1-async (l23_api) */
74 uint8_t mode; /* FB_MODE 0/1 */
78 /* power measurement l1 task */
123 extern struct l1s_state l1s;
125 struct l1s_meas_hdr {
126 uint16_t snr; /* signal/noise ratio */
127 int16_t toa_qbit; /* time of arrival (qbits) */
128 int16_t pm_dbm8; /* power level in dbm/8 */
129 int16_t freq_err; /* Frequency error in Hz */
132 int16_t l1s_snr_int(uint16_t snr);
133 uint16_t l1s_snr_fract(uint16_t snr);
135 void l1s_dsp_abort(void);
137 void l1s_fb_test(uint8_t base_fn, uint8_t fb_mode);
138 void l1s_sb_test(uint8_t base_fn);
139 void l1s_pm_test(uint8_t base_fn, uint16_t arfcn);
140 void l1s_nb_test(uint8_t base_fn);
142 /* schedule a completion */
143 void l1s_compl_sched(enum l1_compl c);
147 /* reset the layer1 as part of synchronizing to a new cell */
148 void l1s_reset(void);
151 void layer1_init(void);
153 /* A debug macro to print every TDMA frame */
154 #ifdef DEBUG_EVERY_TDMA
155 #define putchart(x) putchar(x)
160 /* Convert an angle in fx1.15 notatinon into Hz */
161 #define BITFREQ_DIV_2PI 43104 /* 270kHz / 2 * pi */
162 #define BITFREQ_DIV_PI 86208 /* 270kHz / pi */
163 #define ANG2FREQ_SCALING (2<<15) /* 2^15 scaling factor for fx1.15 */
164 #define ANGLE_TO_FREQ(angle) ((int16_t)angle * BITFREQ_DIV_PI / ANG2FREQ_SCALING)
166 void l1s_reset_hw(void);
167 void synchronize_tdma(struct l1_cell_info *cinfo);
168 void l1s_time_inc(struct gsm_time *time, uint32_t delta_fn);
169 void l1s_time_dump(const struct gsm_time *time);
171 #endif /* _L1_SYNC_H */