blob: d72cfdd72ca68f9630bde1f3284c9c6399d5182a [file] [log] [blame]
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +02001#pragma once
2
3#include <stdint.h>
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +02004#include <stdbool.h>
5#include <unistd.h>
6#include <math.h>
7
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +02008#include <osmocom/core/endian.h>
9
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020010#include "debug.h"
11
12#define MAX_RX_BURST_BUF_SIZE 444 /* 444 = EDGE_BURST_NBITS */
13
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020014enum Modulation {
15 MODULATION_GMSK,
16 MODULATION_8PSK,
17/* Not supported yet:
18 MODULATION_AQPSK,
19 MODULATION_16QAM,
20 MODULATION_32QAM
21*/
22};
23
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020024struct trx_ul_burst_ind {
25 float rx_burst[MAX_RX_BURST_BUF_SIZE]; /* soft bits normalized 0..1 */
26 unsigned nbits; // number of symbols per slot in rxBurst, not counting guard periods
27 uint32_t fn; // TDMA frame number
28 uint8_t tn; // TDMA time-slot number
29 double rssi; // in dBFS
30 double toa; // in symbols
31 double noise; // noise level in dBFS
32 bool idle; // true if no valid burst is included
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020033 enum Modulation modulation; // modulation type
34 uint8_t tss; // training sequence set
35 uint8_t tsc; // training sequence code
36 float ci; // Carrier-to-Interference ratio, in dB
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020037};
38
39bool trxd_send_burst_ind_v0(size_t chan, int fd, const struct trx_ul_burst_ind *bi);
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020040bool trxd_send_burst_ind_v1(size_t chan, int fd, const struct trx_ul_burst_ind *bi);
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020041
42/* The latest supported TRXD header format version */
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020043#define TRX_DATA_FORMAT_VER 1
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020044
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020045struct trxd_hdr_common {
46#if OSMO_IS_LITTLE_ENDIAN
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020047 uint8_t tn:3,
48 reserved:1,
49 version:4;
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020050#elif OSMO_IS_BIG_ENDIAN
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020051 uint8_t version:4,
52 reserved:1,
53 tn:3;
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020054#endif
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020055 uint32_t fn; /* big endian */
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020056} __attribute__ ((packed));
57
58struct trxd_hdr_v0_specific {
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020059 uint8_t rssi;
60 uint16_t toa; /* big endian */
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020061} __attribute__ ((packed));
62
63struct trxd_hdr_v0 {
Pau Espin Pedrol15fa64b2019-07-01 20:41:55 +020064 struct trxd_hdr_common common;
65 struct trxd_hdr_v0_specific v0;
66 uint8_t soft_bits[0];
Pau Espin Pedrol778b30a2019-06-28 13:27:24 +020067} __attribute__ ((packed));
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020068
Pau Espin Pedrole4166be2019-08-26 11:21:55 +020069/* Downlink burst (BTS->TRX), v0 anf v1 use same format */
70struct trxd_hdr_v01_dl {
71 struct trxd_hdr_common common;
72 uint8_t tx_att; /* Tx Attentuation */
73 uint8_t soft_bits[0];
74} __attribute__ ((packed));
75
Pau Espin Pedrolcf6113b2019-07-01 20:42:53 +020076
77#define TRXD_MODULATION_GMSK(ts_set) (0b0000 | (ts_set & 0b0011))
78#define TRXD_MODULATION_8PSK(ts_set) (0b0100 | (ts_set & 0b0001))
79#define TRXD_MODULATION_AQPSK(ts_set) (0b0110 | (ts_set & 0b0001))
80#define TRXD_MODULATION_16QAM(ts_set) (0b1000 | (ts_set & 0b0001))
81#define TRXD_MODULATION_32QAM(ts_set) (0b1010 | (ts_set & 0b0001))
82
83struct trxd_hdr_v1_specific {
84#if OSMO_IS_LITTLE_ENDIAN
85 uint8_t tsc:3,
86 modulation:4,
87 idle:1;
88#elif OSMO_IS_BIG_ENDIAN
89 uint8_t idle:1,
90 modulation:4,
91 tsc:3;
92#endif
93 int16_t ci; /* big endian, in centiBels */
94} __attribute__ ((packed));
95
96struct trxd_hdr_v1 {
97 struct trxd_hdr_common common;
98 struct trxd_hdr_v0_specific v0;
99 struct trxd_hdr_v1_specific v1;
100 uint8_t soft_bits[0];
101} __attribute__ ((packed));