diff --git a/cpu/cc26xx-cc13xx/Makefile.cc13xx b/cpu/cc26xx-cc13xx/Makefile.cc13xx index 56593ee9f..093aa1f02 100644 --- a/cpu/cc26xx-cc13xx/Makefile.cc13xx +++ b/cpu/cc26xx-cc13xx/Makefile.cc13xx @@ -1,6 +1,6 @@ TI_XXWARE_PATH = lib/cc13xxware -CONTIKI_CPU_SOURCEFILES += smartrf-settings.c prop-mode.c +CONTIKI_CPU_SOURCEFILES += smartrf-settings.c prop-mode.c prop-mode-tx-power.c CFLAGS += -DCPU_FAMILY_CC13XX=1 diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode-tx-power.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode-tx-power.c new file mode 100644 index 000000000..2f14c30e9 --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode-tx-power.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core-prop + * @{ + * + * \file + * Default TX power settings. The board can override + */ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/radio.h" +#include "rf-core/prop-mode.h" +/*---------------------------------------------------------------------------*/ +/* Default TX power settings for the 779-930MHz band */ +const prop_mode_tx_power_config_t prop_mode_tx_power_779_930[] = { + { 14, 0xa73f }, + { 13, 0xa63f }, /* 12.5 */ + { 12, 0xb818 }, + { 11, 0x50da }, + { 10, 0x38d3 }, + { 9, 0x2ccd }, + { 8, 0x24cb }, + { 7, 0x20c9 }, + { 6, 0x1cc7 }, + { 5, 0x18c6 }, + { 4, 0x18c5 }, + { 3, 0x14c4 }, + { 2, 0x1042 }, + { 1, 0x10c3 }, + { 0, 0x0041 }, + { -10, 0x08c0 }, + {-128, 0xFFFF }, +}; +/*---------------------------------------------------------------------------*/ +/* Default TX power settings for the 431-527MHz band */ +const prop_mode_tx_power_config_t prop_mode_tx_power_431_527[] = { + { 15, 0x003f }, + { 14, 0xbe3f }, /* 13.7 */ + { 13, 0x6a0f }, + { 10, 0x3dcb }, + { 6, 0x22c4 }, + {-128, 0xFFFF }, +}; +/*---------------------------------------------------------------------------*/ +/** + * @} + */ diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c index f3685eb74..49c8f875e 100644 --- a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c @@ -29,11 +29,7 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup rf-core - * @{ - * - * \defgroup rf-core-prop CC13xx Prop mode driver - * + * \addtogroup rf-core-prop * @{ * * \file @@ -58,6 +54,7 @@ #include "rf-core/rf-core.h" #include "rf-core/rf-switch.h" #include "rf-core/rf-ble.h" +#include "rf-core/prop-mode.h" #include "rf-core/dot-15-4g.h" /*---------------------------------------------------------------------------*/ /* RF core and RF HAL API */ @@ -180,40 +177,35 @@ static rfc_propRxOutput_t rx_stats; /* How long to wait for the RF to enter RX in rf_cmd_ieee_rx */ #define ENTER_RX_WAIT_TIMEOUT (RTIMER_SECOND >> 10) /*---------------------------------------------------------------------------*/ -/* TX Power dBm lookup table - values from SmartRF Studio */ -typedef struct output_config { - radio_value_t dbm; - uint16_t tx_power; /* Value for the PROP_DIV_RADIO_SETUP.txPower field */ -} output_config_t; - -static const output_config_t output_power[] = { - { 14, 0xa73f }, - { 13, 0xa63f }, /* 12.5 */ - { 12, 0xb818 }, - { 11, 0x50da }, - { 10, 0x38d3 }, - { 9, 0x2ccd }, - { 8, 0x24cb }, - { 7, 0x20c9 }, - { 6, 0x1cc7 }, - { 5, 0x18c6 }, - { 4, 0x18c5 }, - { 3, 0x14c4 }, - { 2, 0x1042 }, - { 1, 0x10c3 }, - { 0, 0x0041 }, - {-10, 0x08c0 }, -}; - -#define OUTPUT_CONFIG_COUNT (sizeof(output_power) / sizeof(output_config_t)) +/* TX power table for the 431-527MHz band */ +#ifdef PROP_MODE_CONF_TX_POWER_431_527 +#define PROP_MODE_TX_POWER_431_527 PROP_MODE_CONF_TX_POWER_431_527 +#else +#define PROP_MODE_TX_POWER_431_527 prop_mode_tx_power_431_527 +#endif +/*---------------------------------------------------------------------------*/ +/* TX power table for the 779-930MHz band */ +#ifdef PROP_MODE_CONF_TX_POWER_779_930 +#define PROP_MODE_TX_POWER_779_930 PROP_MODE_CONF_TX_POWER_779_930 +#else +#define PROP_MODE_TX_POWER_779_930 prop_mode_tx_power_779_930 +#endif +/*---------------------------------------------------------------------------*/ +/* Select power table based on the frequency band */ +#if DOT_15_4G_FREQUENCY_BAND_ID==DOT_15_4G_FREQUENCY_BAND_470 +#define TX_POWER_DRIVER PROP_MODE_TX_POWER_431_527 +#else +#define TX_POWER_DRIVER PROP_MODE_TX_POWER_779_930 +#endif +/*---------------------------------------------------------------------------*/ +extern const prop_mode_tx_power_config_t TX_POWER_DRIVER[]; /* Max and Min Output Power in dBm */ -#define OUTPUT_POWER_MIN (output_power[OUTPUT_CONFIG_COUNT - 1].dbm) -#define OUTPUT_POWER_MAX (output_power[0].dbm) +#define OUTPUT_POWER_MAX (TX_POWER_DRIVER[0].dbm) #define OUTPUT_POWER_UNKNOWN 0xFFFF /* Default TX Power - position in output_power[] */ -const output_config_t *tx_power_current = &output_power[1]; +const prop_mode_tx_power_config_t *tx_power_current = &TX_POWER_DRIVER[1]; /*---------------------------------------------------------------------------*/ #ifdef PROP_MODE_CONF_LO_DIVIDER #define PROP_MODE_LO_DIVIDER PROP_MODE_CONF_LO_DIVIDER @@ -330,6 +322,19 @@ set_channel(uint8_t channel) smartrf_settings_cmd_fs.fractFreq = frac; } /*---------------------------------------------------------------------------*/ +static uint8_t +get_tx_power_array_last_element(void) +{ + const prop_mode_tx_power_config_t *array = TX_POWER_DRIVER; + uint8_t count = 0; + + while(array->tx_power != OUTPUT_POWER_UNKNOWN) { + count++; + array++; + } + return count - 1; +} +/*---------------------------------------------------------------------------*/ /* Returns the current TX power in dBm */ static radio_value_t get_tx_power(void) @@ -338,7 +343,7 @@ get_tx_power(void) } /*---------------------------------------------------------------------------*/ /* - * The caller must make sure to send a new CMD_PROP_RADIO_DIV_SETP to the + * The caller must make sure to send a new CMD_PROP_RADIO_DIV_SETUP to the * radio after calling this function. */ static void @@ -346,14 +351,14 @@ set_tx_power(radio_value_t power) { int i; - for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { - if(power <= output_power[i].dbm) { + for(i = get_tx_power_array_last_element(); i >= 0; --i) { + if(power <= TX_POWER_DRIVER[i].dbm) { /* * Merely save the value. It will be used in all subsequent usages of * CMD_PROP_RADIO_DIV_SETP, including one immediately after this function * has returned */ - tx_power_current = &output_power[i]; + tx_power_current = &TX_POWER_DRIVER[i]; return; } @@ -1023,7 +1028,7 @@ get_value(radio_param_t param, radio_value_t *value) *value = DOT_15_4G_CHANNEL_MAX; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MIN: - *value = OUTPUT_POWER_MIN; + *value = TX_POWER_DRIVER[get_tx_power_array_last_element()].dbm; return RADIO_RESULT_OK; case RADIO_CONST_TXPOWER_MAX: *value = OUTPUT_POWER_MAX; @@ -1068,7 +1073,8 @@ set_value(radio_param_t param, radio_value_t value) set_channel((uint8_t)value); break; case RADIO_PARAM_TXPOWER: - if(value < OUTPUT_POWER_MIN || value > OUTPUT_POWER_MAX) { + if(value < TX_POWER_DRIVER[get_tx_power_array_last_element()].dbm || + value > OUTPUT_POWER_MAX) { return RADIO_RESULT_INVALID_VALUE; } @@ -1148,6 +1154,5 @@ const struct radio_driver prop_mode_driver = { }; /*---------------------------------------------------------------------------*/ /** - * @} * @} */ diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.h b/cpu/cc26xx-cc13xx/rf-core/prop-mode.h new file mode 100644 index 000000000..55048777a --- /dev/null +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup rf-core + * @{ + * + * \defgroup rf-core-prop CC13xx Prop mode driver + * + * @{ + * + * \file + * Header file for the CC13xx prop mode NETSTACK_RADIO driver + */ +/*---------------------------------------------------------------------------*/ +#ifndef PROP_MODE_H_ +#define PROP_MODE_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "rf-core/dot-15-4g.h" + +#include +/*---------------------------------------------------------------------------*/ +typedef struct prop_mode_tx_power_config { + radio_value_t dbm; + uint16_t tx_power; /* Value for the PROP_DIV_RADIO_SETUP.txPower field */ +} prop_mode_tx_power_config_t; +/*---------------------------------------------------------------------------*/ +#endif /* PROP_MODE_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */