diff options
author | Sylvain Munaut <tnt@246tNt.com> | 2012-10-19 23:07:39 +0200 |
---|---|---|
committer | Sylvain Munaut <tnt@246tNt.com> | 2013-01-02 20:44:11 +0100 |
commit | 1ccc9f88229f51fdeb4823599a304b22f4b72374 (patch) | |
tree | db8b4dfa3c346426edc11b35871708703e5e85b8 /src/target/firmware/layer1 | |
parent | f853f92e4712a629ccaa5e79b97aa9340d8d9123 (diff) |
target: Add support for IQ swap when required
Operation in GSM850 band requires IQ swap because of the offset PLL
used in the TRF causing spectrum reversal.
Thanks to Dieter Spaar for noticing the issue and the original patch
Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Diffstat (limited to 'src/target/firmware/layer1')
-rw-r--r-- | src/target/firmware/layer1/prim_rach.c | 7 | ||||
-rw-r--r-- | src/target/firmware/layer1/prim_rx_nb.c | 5 | ||||
-rw-r--r-- | src/target/firmware/layer1/prim_tch.c | 20 | ||||
-rw-r--r-- | src/target/firmware/layer1/prim_tx_nb.c | 5 |
4 files changed, 29 insertions, 8 deletions
diff --git a/src/target/firmware/layer1/prim_rach.c b/src/target/firmware/layer1/prim_rach.c index 27e89abb..08353efb 100644 --- a/src/target/firmware/layer1/prim_rach.c +++ b/src/target/firmware/layer1/prim_rach.c @@ -60,6 +60,7 @@ static int l1s_tx_rach_cmd(__unused uint8_t p1, __unused uint8_t p2, __unused ui { int i; uint16_t *info_ptr; + uint16_t arfcn; uint8_t data[2]; putchart('T'); @@ -72,9 +73,11 @@ static int l1s_tx_rach_cmd(__unused uint8_t p1, __unused uint8_t p2, __unused ui info_ptr = &dsp_api.ndb->d_rach; info_ptr[0] = ((uint16_t)(data[0])) | ((uint16_t)(data[1])<<8); - dsp_api.db_w->d_task_ra = RACH_DSP_TASK; + arfcn = l1s.serving_cell.arfcn; - l1s_tx_win_ctrl(l1s.serving_cell.arfcn | ARFCN_UPLINK, L1_TXWIN_AB, 0, 3); + dsp_api.db_w->d_task_ra = dsp_task_iq_swap(RACH_DSP_TASK, arfcn, 1); + + l1s_tx_win_ctrl(arfcn | ARFCN_UPLINK, L1_TXWIN_AB, 0, 3); return 0; } diff --git a/src/target/firmware/layer1/prim_rx_nb.c b/src/target/firmware/layer1/prim_rx_nb.c index ade23a01..38c7b53b 100644 --- a/src/target/firmware/layer1/prim_rx_nb.c +++ b/src/target/firmware/layer1/prim_rx_nb.c @@ -199,7 +199,10 @@ static int l1s_nb_cmd(__unused uint8_t p1, uint8_t burst_id, dsp_load_tch_param(&l1s.next_time, SIG_ONLY_MODE, SDCCH_4, 0, 0, 0, tn); - dsp_load_rx_task(ALLC_DSP_TASK, burst_id, tsc); + dsp_load_rx_task( + dsp_task_iq_swap(ALLC_DSP_TASK, arfcn, 0), + burst_id, tsc + ); l1s_rx_win_ctrl(arfcn, L1_RXWIN_NB, 0); diff --git a/src/target/firmware/layer1/prim_tch.c b/src/target/firmware/layer1/prim_tch.c index a26c58ea..a0a03b81 100644 --- a/src/target/firmware/layer1/prim_tch.c +++ b/src/target/firmware/layer1/prim_tch.c @@ -475,10 +475,16 @@ skip_tx_traffic: 0, sync, tn ); - dsp_load_rx_task(TCHT_DSP_TASK, 0, tsc); /* burst_id unused for TCH */ + dsp_load_rx_task( + dsp_task_iq_swap(TCHT_DSP_TASK, arfcn, 0), + 0, tsc /* burst_id unused for TCH */ + ); l1s_rx_win_ctrl(arfcn, L1_RXWIN_NB, 0); - dsp_load_tx_task(TCHT_DSP_TASK, 0, tsc); /* burst_id unused for TCH */ + dsp_load_tx_task( + dsp_task_iq_swap(TCHT_DSP_TASK, arfcn, 1), + 0, tsc /* burst_id unused for TCH */ + ); l1s_tx_win_ctrl(arfcn | ARFCN_UPLINK, L1_TXWIN_NB, 0, 3); return 0; @@ -734,10 +740,16 @@ static int l1s_tch_a_cmd(__unused uint8_t p1, __unused uint8_t p2, uint16_t p3) 0, 0, tn ); - dsp_load_rx_task(TCHA_DSP_TASK, 0, tsc); /* burst_id unused for TCHA */ + dsp_load_rx_task( + dsp_task_iq_swap(TCHA_DSP_TASK, arfcn, 0), + 0, tsc /* burst_id unused for TCHA */ + ); l1s_rx_win_ctrl(arfcn, L1_RXWIN_NB, 0); - dsp_load_tx_task(TCHA_DSP_TASK, 0, tsc); /* burst_id unused for TCHA */ + dsp_load_tx_task( + dsp_task_iq_swap(TCHA_DSP_TASK, arfcn, 1), + 0, tsc /* burst_id unused for TCHA */ + ); l1s_tx_win_ctrl(arfcn | ARFCN_UPLINK, L1_TXWIN_NB, 0, 3); return 0; diff --git a/src/target/firmware/layer1/prim_tx_nb.c b/src/target/firmware/layer1/prim_tx_nb.c index df13c757..71b32eba 100644 --- a/src/target/firmware/layer1/prim_tx_nb.c +++ b/src/target/firmware/layer1/prim_tx_nb.c @@ -121,7 +121,10 @@ static int l1s_tx_cmd(uint8_t p1, uint8_t burst_id, uint16_t p3) dsp_load_tch_param(&l1s.next_time, SIG_ONLY_MODE, SDCCH_4, 0, 0, 0, tn); - dsp_load_tx_task(DUL_DSP_TASK, burst_id, tsc); + dsp_load_tx_task( + dsp_task_iq_swap(DUL_DSP_TASK, arfcn, 1), + burst_id, tsc + ); l1s_tx_win_ctrl(arfcn | ARFCN_UPLINK, L1_TXWIN_NB, 0, 3); |