diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2013-02-27 15:40:57 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2013-02-27 16:40:37 +0100 |
commit | 828c5130645bfde08c7b40c1f901f15701a669b4 (patch) | |
tree | 1960057d38afd1340c5d9dc1780135b798947cfe /src/target/firmware/layer1/prim_bts.c | |
parent | 906f1826e7250be259228e13eb7b323a3a1d035b (diff) |
Calypso BTS uses tx_mask and rx_mask to define which slots to TX or RX
Each mask is used to define first time slot number and number of timeslots
per frame. The transceiver needs to choose different masks, depending on
single phone or multi phone operation.
Note: Currently the code only works with very limited number of mask
values.
Diffstat (limited to 'src/target/firmware/layer1/prim_bts.c')
-rw-r--r-- | src/target/firmware/layer1/prim_bts.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/target/firmware/layer1/prim_bts.c b/src/target/firmware/layer1/prim_bts.c index 36b830e5..5564f803 100644 --- a/src/target/firmware/layer1/prim_bts.c +++ b/src/target/firmware/layer1/prim_bts.c @@ -171,7 +171,7 @@ l1s_bts_resp(uint8_t p1, uint8_t p2, uint16_t p3) energy[i] = 0; } - printf("### RACH ### (%04x %04x)\n", energy_max, energy_avg); +// printf("### RACH ### (%04x %04x)\n", energy_max, energy_avg); /* Create message */ msg = l1ctl_msgb_alloc(L1CTL_BTS_BURST_AB_IND); @@ -197,7 +197,7 @@ l1s_bts_resp(uint8_t p1, uint8_t p2, uint16_t p3) struct l1ctl_bts_burst_nb_ind *bi; int i; - printf("### NB ### (%04x %04x)\n", d[1], d[3]); +// printf("### NB ### (%04x %04x)\n", d[1], d[3]); /* Create message */ msg = l1ctl_msgb_alloc(L1CTL_BTS_BURST_NB_IND); @@ -210,7 +210,7 @@ l1s_bts_resp(uint8_t p1, uint8_t p2, uint16_t p3) bi->fn = htonl(rx_time.fn); /* Timeslot */ - bi->tn = 0; + bi->tn = l1s.bts.rx_start; /* TOA */ if (toa > -32 && toa < 32) @@ -278,7 +278,7 @@ l1s_bts_cmd(uint8_t p1, uint8_t p2, uint16_t p3) t3 = t3 - 1; /* Select which type of burst */ - if ((l1s.bts.type[0] >> 1) != 2) /* not type 4,5 */ + if ((l1s.bts.type[l1s.bts.rx_start] >> 1) != 2) /* not type 4,5 */ db->rx[0].cmd = DSP_EXT_RX_CMD_NB; else if (l1s.bts.type[0] == 4) /* type 4 */ db->rx[0].cmd = DSP_EXT_RX_CMD_AB; @@ -303,7 +303,7 @@ l1s_bts_cmd(uint8_t p1, uint8_t p2, uint16_t p3) rffe_compute_gain(-47 - l1s.bts.gain, CAL_DSP_TGT_BB_LVL); /* Open RX window */ - l1s_rx_win_ctrl(l1s.bts.arfcn | ARFCN_UPLINK, L1_RXWIN_NB, 0); + l1s_rx_win_ctrl(l1s.bts.arfcn | ARFCN_UPLINK, L1_RXWIN_NB, l1s.bts.rx_start); /* restore last gain */ rffe_set_gain(last_gain); @@ -313,16 +313,28 @@ l1s_bts_cmd(uint8_t p1, uint8_t p2, uint16_t p3) /* TX side */ /* ------- */ - #define SLOT 3 + // FIXME put that in a loop over all TX bursts + static uint8_t SLOT, tn; + if (l1s.bts.tx_start == 5) { + SLOT = 3; + tn = 0; + } else { + SLOT = 0; + tn = 1; + } /* Reset all commands to dummy burst */ for (i=0; i<8; i++) db->tx[i].cmd = DSP_EXT_TX_CMD_DUMMY; /* Get the next burst */ - type = trx_get_burst(l1s.next_time.fn, 0, data); + type = trx_get_burst(l1s.next_time.fn, tn, data); /* Program the TX commands */ + if (t3 == 2 && (l1s.bts.type[tn] >> 1) != 2) { + // FIXME use dummy until TSC will be set individually + db->tx[SLOT].cmd = DSP_EXT_TX_CMD_DUMMY; + } else switch (type) { case BURST_FB: db->tx[SLOT].cmd = DSP_EXT_TX_CMD_FB; @@ -366,7 +378,10 @@ l1s_bts_cmd(uint8_t p1, uint8_t p2, uint16_t p3) /* Open TX window */ l1s_tx_apc_helper(l1s.bts.arfcn); - l1s_tx_multi_win_ctrl(l1s.bts.arfcn, 0, 2, 5); + if (l1s.bts.tx_num > 1) + l1s_tx_multi_win_ctrl(l1s.bts.arfcn, 0, (l1s.bts.tx_start + 5) & 7, l1s.bts.tx_num); + else + l1s_tx_win_ctrl(l1s.bts.arfcn, L1_TXWIN_NB, 0, (l1s.bts.tx_start + 5) & 7); return 0; } |