Merge pull request #1350 from g-oikonomou/bugfix/cc26xx/tx-power
Correctly set new CC26xx TX power when the RFC is powered off
This commit is contained in:
commit
109696174f
@ -395,26 +395,33 @@ set_tx_power(radio_value_t power)
|
|||||||
int i;
|
int i;
|
||||||
rfc_CMD_SET_TX_POWER_t cmd;
|
rfc_CMD_SET_TX_POWER_t cmd;
|
||||||
|
|
||||||
/* Send a CMD_SET_TX_POWER command to the RF */
|
/* First, find the correct setting and save it */
|
||||||
memset(&cmd, 0x00, sizeof(cmd));
|
|
||||||
|
|
||||||
cmd.commandNo = CMD_SET_TX_POWER;
|
|
||||||
|
|
||||||
for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) {
|
for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) {
|
||||||
if(power <= output_power[i].dbm) {
|
if(power <= output_power[i].dbm) {
|
||||||
cmd.txPower.IB = output_power[i].register_ib;
|
tx_power_current = &output_power[i];
|
||||||
cmd.txPower.GC = output_power[i].register_gc;
|
break;
|
||||||
cmd.txPower.tempCoeff = output_power[i].temp_coeff;
|
|
||||||
|
|
||||||
if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) {
|
|
||||||
/* Success: Remember the new setting */
|
|
||||||
tx_power_current = &output_power[i];
|
|
||||||
} else {
|
|
||||||
PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the core is not accessible, the new setting will be applied next
|
||||||
|
* time we send CMD_RADIO_SETUP, so we don't need to do anything further.
|
||||||
|
* If the core is accessible, we can apply the new setting immediately with
|
||||||
|
* CMD_SET_TX_POWER
|
||||||
|
*/
|
||||||
|
if(rf_core_is_accessible() == RF_CORE_NOT_ACCESSIBLE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&cmd, 0x00, sizeof(cmd));
|
||||||
|
cmd.commandNo = CMD_SET_TX_POWER;
|
||||||
|
cmd.txPower.IB = output_power[i].register_ib;
|
||||||
|
cmd.txPower.GC = output_power[i].register_gc;
|
||||||
|
cmd.txPower.tempCoeff = output_power[i].temp_coeff;
|
||||||
|
|
||||||
|
if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) {
|
||||||
|
PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static uint8_t
|
static uint8_t
|
||||||
|
@ -122,10 +122,18 @@ rf_core_send_cmd(uint32_t cmd, uint32_t *status)
|
|||||||
bool interrupts_disabled;
|
bool interrupts_disabled;
|
||||||
bool is_radio_op = false;
|
bool is_radio_op = false;
|
||||||
|
|
||||||
/* If cmd is 4-byte aligned, then it's a radio OP. Clear the status field */
|
/*
|
||||||
|
* If cmd is 4-byte aligned, then it's either a radio OP or an immediate
|
||||||
|
* command. Clear the status field if it's a radio OP
|
||||||
|
*/
|
||||||
if((cmd & 0x03) == 0) {
|
if((cmd & 0x03) == 0) {
|
||||||
is_radio_op = true;
|
uint32_t cmd_type;
|
||||||
((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE;
|
cmd_type = ((rfc_command_t *)cmd)->commandNo & RF_CORE_COMMAND_TYPE_MASK;
|
||||||
|
if(cmd_type == RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP ||
|
||||||
|
cmd_type == RF_CORE_COMMAND_TYPE_RADIO_OP) {
|
||||||
|
is_radio_op = true;
|
||||||
|
((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -152,7 +160,7 @@ rf_core_send_cmd(uint32_t cmd, uint32_t *status)
|
|||||||
|
|
||||||
HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd;
|
HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd;
|
||||||
do {
|
do {
|
||||||
*status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA);
|
*status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA) & 0xFF;
|
||||||
if(++timeout_count > 50000) {
|
if(++timeout_count > 50000) {
|
||||||
PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd);
|
PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd);
|
||||||
if(!interrupts_disabled) {
|
if(!interrupts_disabled) {
|
||||||
|
@ -218,7 +218,6 @@ typedef struct rf_core_primary_mode_s {
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Command Types */
|
/* Command Types */
|
||||||
#define RF_CORE_COMMAND_TYPE_MASK 0x0C00
|
#define RF_CORE_COMMAND_TYPE_MASK 0x0C00
|
||||||
#define RF_CORE_COMMAND_TYPE_IMMEDIATE 0x0000
|
|
||||||
#define RF_CORE_COMMAND_TYPE_RADIO_OP 0x0800
|
#define RF_CORE_COMMAND_TYPE_RADIO_OP 0x0800
|
||||||
#define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800
|
#define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800
|
||||||
#define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00
|
#define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00
|
||||||
|
Loading…
Reference in New Issue
Block a user