summaryrefslogtreecommitdiff
path: root/libloragw/src/loragw_hal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libloragw/src/loragw_hal.c')
-rw-r--r--libloragw/src/loragw_hal.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c
index a891fbf..48bc3b0 100644
--- a/libloragw/src/loragw_hal.c
+++ b/libloragw/src/loragw_hal.c
@@ -1414,27 +1414,29 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) {
/* interpretation of TX power */
- if (read_fpga_version() == 32) {
- for (pow_index = 0; pow_index < txgain_lut.size-1; pow_index++) {
- if (txgain_lut.lut[pow_index].rf_power >= pkt_data.rf_power) {
- x = lgw_set_attenuation((float)(txgain_lut.lut[pow_index].rf_power - pkt_data.rf_power));
- if (x != LGW_HAL_SUCCESS) {
- DEBUG_MSG("ERROR: Failed to set attenuation value\n");
- return LGW_HAL_ERROR;
- }
- break;
- }
+ if (fpga_supports_attenuator()) {
+ /* Power is set to max and the attenuator brings down the level to match the packet's request */
+ target_mix_gain = 15; /* Mixer gain is not used for setting power*/
+ lgw_reg_w(LGW_TX_GAIN, 0); /* Dig gain is not used for setting power */
+ x = lgw_set_attenuation((float)(32.0 - pkt_data.rf_power));
+ if (x != LGW_HAL_SUCCESS) {
+ DEBUG_MSG("ERROR: Failed to set attenuation value\n");
+ return LGW_HAL_ERROR;
}
} else {
+ /* Power is matched from the txgain_lut */
for (pow_index = txgain_lut.size-1; pow_index > 0; pow_index--) {
if (txgain_lut.lut[pow_index].rf_power <= pkt_data.rf_power) {
break;
}
}
+
+ /* loading TX imbalance correction */
+ target_mix_gain = txgain_lut.lut[pow_index].mix_gain;
+ /* Set digital gain from LUT */
+ lgw_reg_w(LGW_TX_GAIN, txgain_lut.lut[pow_index].dig_gain);
}
- /* loading TX imbalance correction */
- target_mix_gain = txgain_lut.lut[pow_index].mix_gain;
if (pkt_data.rf_chain == 0) { /* use radio A calibration table */
lgw_reg_w(LGW_TX_OFFSET_I, cal_offset_a_i[target_mix_gain - 8]);
lgw_reg_w(LGW_TX_OFFSET_Q, cal_offset_a_q[target_mix_gain - 8]);
@@ -1443,9 +1445,6 @@ int lgw_send(struct lgw_pkt_tx_s pkt_data) {
lgw_reg_w(LGW_TX_OFFSET_Q, cal_offset_b_q[target_mix_gain - 8]);
}
- /* Set digital gain from LUT */
- lgw_reg_w(LGW_TX_GAIN, txgain_lut.lut[pow_index].dig_gain);
-
/* fixed metadata, useful payload and misc metadata compositing */
transfer_size = TX_METADATA_NB + pkt_data.size; /* */
payload_offset = TX_METADATA_NB; /* start the payload just after the metadata */