Added radio parameters RADIO_PARAM_RSSI and RADIO_PARAM_TXPOWER for cc2420
This commit is contained in:
parent
4834816306
commit
8c0cdcfaec
|
@ -84,6 +84,9 @@
|
||||||
#define FOOTER1_CRC_OK 0x80
|
#define FOOTER1_CRC_OK 0x80
|
||||||
#define FOOTER1_CORRELATION 0x7f
|
#define FOOTER1_CORRELATION 0x7f
|
||||||
|
|
||||||
|
/* The RSSI_OFFSET is approximate -45 (see CC2420 specification) */
|
||||||
|
#define RSSI_OFFSET -45
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -103,6 +106,28 @@
|
||||||
#define LEDS_OFF(x)
|
#define LEDS_OFF(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Conversion map between PA_LEVEL and output power in dBm
|
||||||
|
(from table 9 in CC2420 specification).
|
||||||
|
*/
|
||||||
|
struct output_config {
|
||||||
|
int8_t power;
|
||||||
|
uint8_t config;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct output_config output_power[] = {
|
||||||
|
{ 0, 31 }, /* 0xff */
|
||||||
|
{ -1, 27 }, /* 0xfb */
|
||||||
|
{ -3, 23 }, /* 0xf7 */
|
||||||
|
{ -5, 19 }, /* 0xf3 */
|
||||||
|
{ -7, 15 }, /* 0xef */
|
||||||
|
{-10, 11 }, /* 0xeb */
|
||||||
|
{-15, 7 }, /* 0xe7 */
|
||||||
|
{-25, 3 }, /* 0xe3 */
|
||||||
|
};
|
||||||
|
#define OUTPUT_NUM (sizeof(output_power) / sizeof(struct output_config))
|
||||||
|
#define OUTPUT_POWER_MAX 0
|
||||||
|
#define OUTPUT_POWER_MIN -25
|
||||||
|
|
||||||
void cc2420_arch_init(void);
|
void cc2420_arch_init(void);
|
||||||
|
|
||||||
/* XXX hack: these will be made as Chameleon packet attributes */
|
/* XXX hack: these will be made as Chameleon packet attributes */
|
||||||
|
@ -154,6 +179,8 @@ static int channel;
|
||||||
static radio_result_t
|
static radio_result_t
|
||||||
get_value(radio_param_t param, radio_value_t *value)
|
get_value(radio_param_t param, radio_value_t *value)
|
||||||
{
|
{
|
||||||
|
int i, v;
|
||||||
|
|
||||||
if(!value) {
|
if(!value) {
|
||||||
return RADIO_RESULT_INVALID_VALUE;
|
return RADIO_RESULT_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -164,12 +191,33 @@ get_value(radio_param_t param, radio_value_t *value)
|
||||||
case RADIO_PARAM_CHANNEL:
|
case RADIO_PARAM_CHANNEL:
|
||||||
*value = cc2420_get_channel();
|
*value = cc2420_get_channel();
|
||||||
return RADIO_RESULT_OK;
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_TXPOWER:
|
||||||
|
v = cc2420_get_txpower();
|
||||||
|
*value = OUTPUT_POWER_MIN;
|
||||||
|
/* Find the actual estimated output power in conversion table */
|
||||||
|
for(i = 0; i < OUTPUT_NUM; i++) {
|
||||||
|
if(v >= output_power[i].config) {
|
||||||
|
*value = output_power[i].power;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_RSSI:
|
||||||
|
/* Return the RSSI value in dBm */
|
||||||
|
*value = cc2420_rssi() + RSSI_OFFSET;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
case RADIO_CONST_CHANNEL_MIN:
|
case RADIO_CONST_CHANNEL_MIN:
|
||||||
*value = 11;
|
*value = 11;
|
||||||
return RADIO_RESULT_OK;
|
return RADIO_RESULT_OK;
|
||||||
case RADIO_CONST_CHANNEL_MAX:
|
case RADIO_CONST_CHANNEL_MAX:
|
||||||
*value = 26;
|
*value = 26;
|
||||||
return RADIO_RESULT_OK;
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_TXPOWER_MIN:
|
||||||
|
*value = OUTPUT_POWER_MIN;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_CONST_TXPOWER_MAX:
|
||||||
|
*value = OUTPUT_POWER_MAX;
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
default:
|
default:
|
||||||
return RADIO_RESULT_NOT_SUPPORTED;
|
return RADIO_RESULT_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -178,6 +226,8 @@ get_value(radio_param_t param, radio_value_t *value)
|
||||||
static radio_result_t
|
static radio_result_t
|
||||||
set_value(radio_param_t param, radio_value_t value)
|
set_value(radio_param_t param, radio_value_t value)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
switch(param) {
|
switch(param) {
|
||||||
case RADIO_PARAM_POWER_MODE:
|
case RADIO_PARAM_POWER_MODE:
|
||||||
if(value == RADIO_POWER_MODE_ON) {
|
if(value == RADIO_POWER_MODE_ON) {
|
||||||
|
@ -195,6 +245,17 @@ set_value(radio_param_t param, radio_value_t value)
|
||||||
}
|
}
|
||||||
cc2420_set_channel(value);
|
cc2420_set_channel(value);
|
||||||
return RADIO_RESULT_OK;
|
return RADIO_RESULT_OK;
|
||||||
|
case RADIO_PARAM_TXPOWER:
|
||||||
|
/* Find the closest higher PA_LEVEL for the desired output power */
|
||||||
|
for(i = 1; i < OUTPUT_NUM; i++) {
|
||||||
|
if(value > output_power[i].power) {
|
||||||
|
cc2420_set_txpower(output_power[i - 1].config);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Set lowest output power */
|
||||||
|
cc2420_set_txpower(output_power[OUTPUT_NUM - 1].config);
|
||||||
|
return RADIO_RESULT_OK;
|
||||||
default:
|
default:
|
||||||
return RADIO_RESULT_NOT_SUPPORTED;
|
return RADIO_RESULT_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue