summaryrefslogtreecommitdiffstats
path: root/src/target/firmware/layer1
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2012-10-19 23:07:39 +0200
committerSylvain Munaut <tnt@246tNt.com>2013-01-02 20:44:11 +0100
commit1ccc9f88229f51fdeb4823599a304b22f4b72374 (patch)
treedb8b4dfa3c346426edc11b35871708703e5e85b8 /src/target/firmware/layer1
parentf853f92e4712a629ccaa5e79b97aa9340d8d9123 (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.c7
-rw-r--r--src/target/firmware/layer1/prim_rx_nb.c5
-rw-r--r--src/target/firmware/layer1/prim_tch.c20
-rw-r--r--src/target/firmware/layer1/prim_tx_nb.c5
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);