diff --git a/drivers/wireless/spirit/Kconfig b/drivers/wireless/spirit/Kconfig index 2a3f6d6de5..97ae6541cc 100644 --- a/drivers/wireless/spirit/Kconfig +++ b/drivers/wireless/spirit/Kconfig @@ -20,6 +20,21 @@ config WL_SPIRIT_SPIFREQUENCY The default is the absolution maximum and you may likely have to reduce this for your board. +config WL_SPIRIT_REGDEBUG + bool "Enable register level debug" + default n + depenes ont DEBUG_WIRELESS_INFO + ---help--- + Enable logic to dump each value read from and written to the Sprit + registers. + +config WL_SPIRIT_FIFODUMP + bool "Enable debug FIFO dump" + default n + depenes ont DEBUG_WIRELESS_INFO + ---help--- + Enable logic to dump data written to and read from the linear FIFO. + endif source drivers/wireless/spirit/drivers/Kconfig diff --git a/drivers/wireless/spirit/drivers/Kconfig b/drivers/wireless/spirit/drivers/Kconfig index 7860a4a35c..778c8054e9 100644 --- a/drivers/wireless/spirit/drivers/Kconfig +++ b/drivers/wireless/spirit/drivers/Kconfig @@ -14,4 +14,46 @@ config SPIRIT_NETDEV if SPIRIT_NETDEV +config SPIRIT_PKTLEN + int "Fixed packet length" + default 96 + range 1 96 if !SPIRIT_FIFOS + range 1 65535 if SPIRIT_FIFOS + ---help--- + Fixed pkt sizes are used. This setting describes that fixed packet + size. + +config SPIRIT_FIFOS + bool "FIFO Watermarks" + default n + depends on EXPERIMENTAL + ---help--- + The Spirit hardware can provided interrupts when indicate when the + RX or TX FIFOs are almost full or empty. This is useful for + supporting very large packets, larger than the FIFO size. The RX/TX + FIFO size is 96 bytes. As long as the packet size is less then or + equal 96 bytes, this feature is not needed. + + NOTE: Marked experimental because this feature is not yet implement + (hooks are present). You should not enable this feature unless you + plan to implement the feature. + +config SPIRIT_PKTLEN + int "Fixed packet length" + default 96 + range 1 96 if !SPIRIT_FIFOS + range 1 65535 if SPIRIT_FIFOS + ---help--- + Fixed pkt sizes are used. This setting describes that fixed packet + size. + +config SPIRIT_MTU + int "MTU" + default 596 + ---help--- + 6LoWPAN support fragmenting and reassembly of large IPv6 packets. + Each fragment will be up CONFIG_SPIRIT_PKTLEN in length. An single + IPv6 packet maybe fragment into several such frames. This setting + provides the MTU which is the largest fully assembled IPv6 packet that can be sent. + endif # SPIRIT_NETDEV diff --git a/drivers/wireless/spirit/drivers/spirit_netdev.c b/drivers/wireless/spirit/drivers/spirit_netdev.c index 6b2b5b11d7..b09c0629d2 100644 --- a/drivers/wireless/spirit/drivers/spirit_netdev.c +++ b/drivers/wireless/spirit/drivers/spirit_netdev.c @@ -96,7 +96,7 @@ #endif #ifndef CONFIG_SPIRIT_PKTLEN -# define CONFIG_SPIRIT_PKTLEN 128 +# define CONFIG_SPIRIT_PKTLEN 96 #endif #ifndef CONFIG_SPIRIT_MTU @@ -1733,13 +1733,13 @@ int spirit_hw_initialize(FAR struct spirit_driver_s *priv, return ret; } - ret = spirit_qi_sqicheck(spirit, S_ENABLE); + ret = spirit_qi_enable_sqicheck(spirit, S_ENABLE); if (ret < 0) { return ret; } - ret = spirit_qi_set_rssithreshold(spirit, SPIRIT_CCA_THRESHOLD); + ret = spirit_qi_set_rssithreshold_dbm(spirit, SPIRIT_CCA_THRESHOLD); if (ret < 0) { return ret; diff --git a/drivers/wireless/spirit/include/spirit_general.h b/drivers/wireless/spirit/include/spirit_general.h index e8467937ca..204b3dfcee 100644 --- a/drivers/wireless/spirit/include/spirit_general.h +++ b/drivers/wireless/spirit/include/spirit_general.h @@ -47,6 +47,8 @@ * Pre-processor Definitions ******************************************************************************/ +#define SPIRIT_GENERAL_LIBVERSION() "Spirit1_Libraries_v.3.2.0" + /* Macros used in debug assertions */ #define IS_MODE_EXT(mode) (mode == MODE_EXT_XO || mode == MODE_EXT_XIN) diff --git a/drivers/wireless/spirit/include/spirit_gpio.h b/drivers/wireless/spirit/include/spirit_gpio.h index b1bb5a6287..5162af32a3 100644 --- a/drivers/wireless/spirit/include/spirit_gpio.h +++ b/drivers/wireless/spirit/include/spirit_gpio.h @@ -37,6 +37,31 @@ #ifndef __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_GPIO_H #define __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_GPIO_H +/* This module can be used to configure the Spirit GPIO pins to perform + * specific functions. The structure gpioIRQ can be used to specify these + * features for one of the four Spirit GPIO pin. + * + * The following example shows how to configure a pin (GPIO 3) to be used as + * an IRQ source for a microcontroller using the spirit_gpio_initialize() + * function. + * + * Example: + * + * struct spirit_gpio_init_s g_gpio_init = + * { + * SPIRIT_GPIO_3, + * SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, + * SPIRIT_GPIO_DIG_OUT_IRQ + * }; + * + * ... + * + * spirit_gpio_initialize(&g_gpio_init); + * + * NOTE: Please read the functions documentation for the other GPIO + * features. + */ + /****************************************************************************** * Included Files ******************************************************************************/ @@ -96,6 +121,24 @@ (iosel == SPIRIT_GPIO_DIG_IN_TX_DATA_INPUT_FOR_DIRECTRF) ||\ (iosel == SPIRIT_GPIO_DIG_IN_DATA_WAKEUP) ||\ (iosel == SPIRIT_GPIO_DIG_IN_EXT_CLOCK_AT_34_7KHZ)) +#define IS_SPIRIT_GPIO_LEVEL(level) \ + (((level) == LOW) || ((level) == HIGH)) +#define IS_SPIRIT_CLOCK_OUTPUT_XO(ratio) \ + (((ratio) == XO_RATIO_1) || ((ratio) == XO_RATIO_2_3) || \ + ((ratio) == XO_RATIO_1_2) || ((ratio) == XO_RATIO_1_3) || \ + ((ratio) == XO_RATIO_1_4) || ((ratio) == XO_RATIO_1_6) || \ + ((ratio) == XO_RATIO_1_8) || ((ratio) == XO_RATIO_1_12) || \ + ((ratio) == XO_RATIO_1_16) || ((ratio) == XO_RATIO_1_24) || \ + ((ratio) == XO_RATIO_1_36) || ((ratio) == XO_RATIO_1_48) || \ + ((ratio) == XO_RATIO_1_64) || ((ratio) == XO_RATIO_1_96) || \ + ((ratio) == XO_RATIO_1_128) || ((ratio) == XO_RATIO_1_192)) +#define IS_SPIRIT_CLOCK_OUTPUT_RCO(ratio) \ + (((ratio) == RCO_RATIO_1) || ((ratio) == RCO_RATIO_1_128)) +#define IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(cycles) \ + (((cycles) == EXTRA_CLOCK_CYCLES_0) || \ + ((cycles) == EXTRA_CLOCK_CYCLES_64) || \ + ((cycles) == EXTRA_CLOCK_CYCLES_256) || \ + ((cycles) == EXTRA_CLOCK_CYCLES_512)) /****************************************************************************** * Public Types @@ -210,12 +253,81 @@ struct spirit_gpio_init_s * can be a value of enum spirit_gpio_io_e */ }; +/* SPIRIT OutputLevel enumeration. */ + +enum spirit_outputlevel_e +{ + LOW = 0, + HIGH = 1 +}; + +/* SPIRIT clock output XO prescaler enumeration. */ + +enum spirit_clockoutput_xoprescaler_e +{ + XO_RATIO_1 = 0x00, /* XO Clock signal available on the GPIO divided by 1 */ + XO_RATIO_2_3 = 0x02, /* XO Clock signal available on the GPIO divided by 2/3 */ + XO_RATIO_1_2 = 0x04, /* XO Clock signal available on the GPIO divided by 1/2 */ + XO_RATIO_1_3 = 0x06, /* XO Clock signal available on the GPIO divided by 1/3 */ + XO_RATIO_1_4 = 0x08, /* XO Clock signal available on the GPIO divided by 1/4 */ + XO_RATIO_1_6 = 0x0a, /* XO Clock signal available on the GPIO divided by 1/6 */ + XO_RATIO_1_8 = 0x0C, /* XO Clock signal available on the GPIO divided by 1/8 */ + XO_RATIO_1_12 = 0x0e, /* XO Clock signal available on the GPIO divided by 1/12 */ + XO_RATIO_1_16 = 0x10, /* XO Clock signal available on the GPIO divided by 1/16 */ + XO_RATIO_1_24 = 0x12, /* XO Clock signal available on the GPIO divided by 1/24 */ + XO_RATIO_1_36 = 0x14, /* XO Clock signal available on the GPIO divided by 1/36 */ + XO_RATIO_1_48 = 0x16, /* XO Clock signal available on the GPIO divided by 1/48 */ + XO_RATIO_1_64 = 0x18, /* XO Clock signal available on the GPIO divided by 1/64 */ + XO_RATIO_1_96 = 0x1a, /* XO Clock signal available on the GPIO divided by 1/96 */ + XO_RATIO_1_128 = 0x1c, /* XO Clock signal available on the GPIO divided by 1/128 */ + XO_RATIO_1_192 = 0x1e /* XO Clock signal available on the GPIO divided by 1/196 */ +}; + +/* SPIRIT Clock Output RCO prescaler enumeration. */ + +enum spirit_clockoutput_rcoprescaler_e +{ + RCO_RATIO_1 = 0x00, /* RCO Clock signal available on the GPIO divided by 1 */ + RCO_RATIO_1_128 = 0x01 /* RCO Clock signal available on the GPIO divided by 1/128 */ +}; + +/* SPIRIT Extra Clock Cycles enumeration. */ + +enum spirit_extra_clockcycles_e +{ + EXTRA_CLOCK_CYCLES_0 = 0x00, /* 0 extra clock cycles provided to the MCU + * before switching to STANDBY * state */ + EXTRA_CLOCK_CYCLES_64 = 0x20, /* 64 extra clock cycles provided to the + * MCU before switching to STANDBY state */ + EXTRA_CLOCK_CYCLES_256 = 0x40, /* 256 extra clock cycles provided to the + * MCU before switching to STANDBY state */ + EXTRA_CLOCK_CYCLES_512 = 0x60 /* 512 extra clock cycles provided to the + * MCU before switching to STANDBY state */ +}; + +/* SPIRIT Clock Output initialization structure definition. */ + +struct spirit_clockoutput_init_s +{ + uint8_t xoprescaler; /* Specifies the XO Ratio as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_xoprescaler_e */ + + uint8_t rcoprescaler; /* Specifies the RCO Ratio as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_rcoprescaler_e */ + + uint8_t xtracycles; /* Specifies the Extra Clock Cycles provided before + * entering in Standby State. This parameter can + * be any value from enum spirit_extra_clockcycles_e */ +}; + /****************************************************************************** * Public Function Prototypes ******************************************************************************/ /****************************************************************************** - * Name: + * Name: spirit_gpio_initialize * * Description: * Initializes the Spirit GPIOx according to the specified parameters in @@ -235,4 +347,232 @@ struct spirit_gpio_init_s int spirit_gpio_initialize(FAR struct spirit_library_s *spirit, FAR const struct spirit_gpio_init_s *gpioinit); + +/****************************************************************************** + * Name: spirit_gpio_enable_tempsensor + * + * Description: + * Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - Bew state for temperature sensor. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_enable_tempsensor(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_gpio_set_outputlevel + * + * Description: + * Forces SPIRIT GPIO_x configured as digital output, to VDD or GND. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * gpio - Specifies the GPIO to be configured. This parameter can be one + * of following values: + * + * SPIRIT_GPIO_0: SPIRIT GPIO_0 + * SPIRIT_GPIO_1: SPIRIT GPIO_1 + * SPIRIT_GPIO_2: SPIRIT GPIO_2 + * SPIRIT_GPIO_3: SPIRIT GPIO_3 + * + * level - Specifies the level. This parameter can be: HIGH or LOW. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_outputlevel(FAR struct spirit_library_s *spirit, + enum spirit_gpio_pin_e gpio, + enum spirit_outputlevel_e level); + +/****************************************************************************** + * Name: spirit_gpio_get_outputlevel + * + * Description: + * Returns output value (VDD or GND) of SPIRIT GPIO_x, when it is configured + * as digital output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * gpio - Specifies the GPIO to be read. This parameter can be one of + * following values: + * + * SPIRIT_GPIO_0: SPIRIT GPIO_0 + * SPIRIT_GPIO_1: SPIRIT GPIO_1 + * SPIRIT_GPIO_2: SPIRIT GPIO_2 + * SPIRIT_GPIO_3: SPIRIT GPIO_3 + * + * Returned Value: + * Logical level of selected GPIO configured as digital output. This + * parameter can be: HIGH or LOW. + * + ******************************************************************************/ + +enum spirit_outputlevel_e + spirit_gpio_get_outputlevel(FAR struct spirit_library_s *spirit, + enum spirit_gpio_pin_e gpio); + +/****************************************************************************** + * Name: spirit_gpio_enable_clockoutput + * + * Description: + * Enables or Disables the MCU clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for the MCU clock output. This parameter can be: + * S_ENABLE or S_DISABLE. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_enable_clockoutput(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_gpio_clockoutput_initialize + * + * Description: + * Initializes the SPIRIT Clock Output according to the specified parameters + * in the xClockOutputInitStruct. + * + * NOTE: The function spirit_gpio_enable_clockoutput() must be called in order to + * enable or disable the MCU clock dividers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * clockoutput - Pointer to a struct spirit_clockoutput_init_s structure + * that contains the configuration information for the SPIRIT + * Clock Output. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_clockoutput_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_clockoutput_init_s *clockoutput); + +/****************************************************************************** + * Name: spirit_gpio_set_xoprescaler + * + * Description: + * Sets the XO ratio as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * xoprescaler - the XO prescaler to be used as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_xoprescaler_e . + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_xoprescaler(FAR struct spirit_library_s *spirit, + enum spirit_clockoutput_xoprescaler_e xoprescaler); + +/****************************************************************************** + * Name: spirit_gpio_get_xoprescaler + * + * Description: + * Returns the settled XO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled XO prescaler used for clock output. + * + ******************************************************************************/ + +enum spirit_clockoutput_xoprescaler_e + spirit_gpio_get_xoprescaler(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_gpio_set_rcoprescaler + * + * Description: + * Sets the RCO ratio as clock output + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rcoprescaler - The RCO prescaler to be used as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_rcoprescaler_e . + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_rcoprescaler(FAR struct spirit_library_s *spirit, + enum spirit_clockoutput_rcoprescaler_e rcoprescaler); + +/****************************************************************************** + * Name: spirit_gpio_get_rcoprescaler + * + * Description: + * Returns the settled RCO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled RCO prescaler used for clock output. + * + ******************************************************************************/ + +enum spirit_clockoutput_rcoprescaler_e + spirit_gpio_get_rcoprescaler(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_gpio_set_extracycles + * + * Description: + * Sets the RCO ratio as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * xtracycles - The number of extra clock cycles provided before switching + * to STANDBY state. This parameter can be any value of enum + * spirit_extra_clockcycles_e. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_extracycles(FAR struct spirit_library_s *spirit, + enum spirit_extra_clockcycles_e xtracycles); + +/****************************************************************************** + * Name: spirit_gpio_get_extracycles + * + * Description: + * Returns the settled RCO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled number of extra clock cycles provided before switching to STANDBY + * state. + * + ******************************************************************************/ + +enum spirit_extra_clockcycles_e + spirit_gpio_get_extracycles(FAR struct spirit_library_s *spirit); + #endif /* __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_GPIO_H*/ diff --git a/drivers/wireless/spirit/include/spirit_qi.h b/drivers/wireless/spirit/include/spirit_qi.h index d42d6a9ab9..0745cece08 100644 --- a/drivers/wireless/spirit/include/spirit_qi.h +++ b/drivers/wireless/spirit/include/spirit_qi.h @@ -37,6 +37,28 @@ #ifndef __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_QI_H #define __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_QI_H +/* This module can be used to configure and read some quality indicators + * used by Spirit. API to set thresholds and to read values in raw mode or in + * dBm are provided. + * + * Example: + * + * float rssi; + * uint8_t pqi; + * uint8_t sqi; + * + * spirit_qi_enable_pqicheck(spirit, S_ENABLE); + * spirit_qi_enable_sqicheck(spirit, S_ENABLE); + * + * ... + * + * rssi = spirit_qi_get_rssidbm(spirit); + * pqi = spirit_qi_get_pqi(spirit); + * sqi = spirit_qi_get_sqi(spirit); + * + * ... + */ + /****************************************************************************** * Included Files ******************************************************************************/ @@ -48,20 +70,37 @@ * Pre-processor Definitions ******************************************************************************/ +/* Macro to obtain the RSSI value in dBm (type float) */ + +#define spirit_qi_get_rssidbm(spirit) \ + (-120.0 + ((float)(spirit_qi_get_rssi(spirit) - 20)) / 2) + /* Macros used in debug assertions */ +#define IS_PQI_THR(value) \ + (value == PQI_TH_0 || value == PQI_TH_1 ||\ + value == PQI_TH_2 || value == PQI_TH_3 ||\ + value == PQI_TH_4 || value == PQI_TH_5 ||\ + value == PQI_TH_6 || value == PQI_TH_7 ||\ + value == PQI_TH_8 || value == PQI_TH_9 ||\ + value == PQI_TH_10 || value == PQI_TH_11 ||\ + value == PQI_TH_12 || value == PQI_TH_13 ||\ + value == PQI_TH_14 || value == PQI_TH_15) #define IS_SQI_THR(value) \ - (value == SQI_TH_0 || value == SQI_TH_1 || \ + (value == SQI_TH_0 || value == SQI_TH_1 || \ value == SQI_TH_2 || value == SQI_TH_3) #define IS_RSSI_FILTER_GAIN(value) \ - (value==RSSI_FG_0 || value==RSSI_FG_1 ||\ - value==RSSI_FG_2 || value==RSSI_FG_3 ||\ - value==RSSI_FG_4 || value==RSSI_FG_5 ||\ - value==RSSI_FG_6 || value==RSSI_FG_7 ||\ - value==RSSI_FG_8 || value==RSSI_FG_9 ||\ - value==RSSI_FG_10 || value==RSSI_FG_11 ||\ - value==RSSI_FG_12 || value==RSSI_FG_13 ||\ - value==RSSI_FG_14 || value==RSSI_FG_15) + (value == RSSI_FG_0 || value == RSSI_FG_1 ||\ + value == RSSI_FG_2 || value == RSSI_FG_3 ||\ + value == RSSI_FG_4 || value == RSSI_FG_5 ||\ + value == RSSI_FG_6 || value == RSSI_FG_7 ||\ + value == RSSI_FG_8 || value == RSSI_FG_9 ||\ + value == RSSI_FG_10 || value == RSSI_FG_11 ||\ + value == RSSI_FG_12 || value == RSSI_FG_13 ||\ + value == RSSI_FG_14 || value == RSSI_FG_15) +#define IS_CS_MODE(mode) \ + (mode == CS_MODE_STATIC_3DB || mode == CS_MODE_DYNAMIC_6DB || \ + mode == CS_MODE_DYNAMIC_12DB || mode == CS_MODE_DYNAMIC_18DB) /* Range for the RSSI Threshold in dBm */ @@ -76,14 +115,36 @@ extern "C" { #endif +/* PQI threshold value enumeration. */ + +enum spirit_pqi_threshold_e +{ + PQI_TH_0 = 0x00, + PQI_TH_1 = 0x04, + PQI_TH_2 = 0x08, + PQI_TH_3 = 0x0c, + PQI_TH_4 = 0x10, + PQI_TH_5 = 0x14, + PQI_TH_6 = 0x18, + PQI_TH_7 = 0x1c, + PQI_TH_8 = 0x20, + PQI_TH_9 = 0x24, + PQI_TH_10 = 0x28, + PQI_TH_11 = 0x2c, + PQI_TH_12 = 0x30, + PQI_TH_13 = 0x34, + PQI_TH_14 = 0x38, + PQI_TH_15 = 0x3c +}; + /* SQI threshold value enumeration. */ enum spirit_sqi_threshold_e { - SQI_TH_0 = 0x00, - SQI_TH_1 = 0x40, - SQI_TH_2 = 0x80, - SQI_TH_3 = 0xC0 + SQI_TH_0 = 0x00, + SQI_TH_1 = 0x40, + SQI_TH_2 = 0x80, + SQI_TH_3 = 0xc0 }; /* RSSI filter gain value enumeration. */ @@ -108,12 +169,42 @@ enum spirit_rssi_filtergain_e RSSI_FG_15 = 0xf0 }; +/* CS mode enumeration. */ + +enum spirit_csmode_e +{ + CS_MODE_STATIC_3DB = 0x00, + CS_MODE_DYNAMIC_6DB = 0x04, + CS_MODE_DYNAMIC_12DB = 0x08, + CS_MODE_DYNAMIC_18DB = 0x0c +}; + /****************************************************************************** * Public Function Prototypes ******************************************************************************/ /****************************************************************************** - * Name: spirit_qi_sqicheck + * Name: spirit_qi_enable_pqicheck + * + * Description: + * Enables/Disables the PQI Preamble Quality Indicator check. The running + * peak PQI is compared to a threshold value and the preamble valid IRQ is + * asserted as soon as the threshold is passed. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for PQI check. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_pqicheck(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_qi_enable_sqicheck * * Description: * Enables/Disables the Synchronization Quality Indicator check. The @@ -129,8 +220,46 @@ enum spirit_rssi_filtergain_e * ******************************************************************************/ -int spirit_qi_sqicheck(FAR struct spirit_library_s *spirit, - enum spirit_functional_state_e newstate); +int spirit_qi_enable_sqicheck(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + + +/****************************************************************************** + * Name: spirit_qi_set_pqithreshold + * + * Description: + * Sets the PQI threshold. The preamble quality threshold is 4*PQI_TH + * (PQI_TH = 0..15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pqithr - Parameter of the formula above. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_pqithreshold(FAR struct spirit_library_s *spirit, + enum spirit_pqi_threshold_e pqithr); + +/****************************************************************************** + * Name: spirit_qi_get_pqithreshold + * + * Description: + * Returns the PQI threshold. The preamble quality threshold is 4*PQI_TH + * (PQI_TH = 0..15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * PQI threshold (PQI_TH of the formula above). + * + ******************************************************************************/ + +enum spirit_pqi_threshold_e + spirit_qi_get_pqithreshold(FAR struct spirit_library_s *spirit); /****************************************************************************** * Name: spirit_qi_set_sqithreshold @@ -172,10 +301,146 @@ int spirit_qi_set_sqithreshold(FAR struct spirit_library_s *spirit, enum spirit_sqi_threshold_e spirit_qi_get_sqithreshold(FAR struct spirit_library_s *spirit); +/****************************************************************************** + * Name: spirit_qi_get_pqi + * + * Description: + * Returns the PQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * PQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_pqi(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_get_sqi + * + * Description: + * Returns the SQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * SQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_sqi(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_get_lqi + * + * Description: + * Returns the LQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * LQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_lqi(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_get_cs + * + * Description: + * Returns the CS status. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CS value (S_SET or S_RESET). + * + ******************************************************************************/ + +enum spirit_flag_status_e spirit_qi_get_cs(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_get_rssi + * + * Description: + * Returns the RSSI value. The measured power is reported in steps of half a + * dB from 0 to 255 and is offset in such a way that -120 dBm corresponds to + * 20. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_rssi(FAR struct spirit_library_s *spirit); + /****************************************************************************** * Name: spirit_qi_set_rssithreshold * * Description: + * Sets the RSSI threshold. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rssithr - RSSI threshold reported in steps of half a dBm with a -130 + * dBm offset. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_rssithreshold(FAR struct spirit_library_s *spirit, + uint8_t rssithr); + +/****************************************************************************** + * Name: spirit_qi_get_rssithreshold + * + * Description: + * Returns the RSSI threshold. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI threshold. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_rssithreshold(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_calc_rssithreshold + * + * Description: + * Computes the RSSI threshold from its dBm value according to the formula: + * (RSSI[Dbm] + 130)/0.5 + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * dbmvalue - RSSI threshold reported in dBm. + * + * Returned Value: + * RSSI threshold corresponding to dBm value. + * + ******************************************************************************/ + +uint8_t spirit_qi_calc_rssithreshold(FAR struct spirit_library_s *spirit, + int dbmvalue); + +/****************************************************************************** + * Name: spirit_qi_set_rssithreshold_dbm + * + * Description: * Sets the RSSI threshold from its dBm value according to the formula: * (RSSI[Dbm] + 130)/0.5. * @@ -188,7 +453,143 @@ enum spirit_sqi_threshold_e * ******************************************************************************/ -int spirit_qi_set_rssithreshold(FAR struct spirit_library_s *spirit, - int dbmvalue); +int spirit_qi_set_rssithreshold_dbm(FAR struct spirit_library_s *spirit, + int dbmvalue); + +/****************************************************************************** + * Name: spirit_qi_set_rssifiltergain + * + * Description: + * Sets the RSSI filter gain. This parameter sets the bandwidth of a low + * pass IIR filter (RSSI_FLT register, allowed values 0..15), a lower values + * gives a faster settling of the measurements but lower precision. The + * recommended value for such parameter is 14. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rssfg - RSSI filter gain value. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_rssifiltergain(FAR struct spirit_library_s *spirit, + enum spirit_rssi_filtergain_e rssfg); + +/****************************************************************************** + * Name: spirit_qi_get_rssifiltergain + * + * Description: + * Returns the RSSI filter gain. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI filter gain. + * + ******************************************************************************/ + +enum spirit_rssi_filtergain_e + spirit_qi_get_rssifiltergain(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_set_csmode + * + * Description: + * Sets the CS Mode. When static carrier sensing is used (cs_mode = 0), the + * carrier sense signal is asserted when the measured RSSI is above the + * value specified in the RSSI_TH register and is deasserted when the RSSI + * falls 3 dB below the same threshold. When dynamic carrier sense is used + * (cs_mode = 1, 2, 3), the carrier sense signal is asserted if the signal + * is above the threshold and a fast power increase of 6, 12 or 18 dB is + * detected; it is deasserted if a power fall of the same amplitude is + * detected. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * csmode - CS mode selector. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_csmode(FAR struct spirit_library_s *spirit, + enum spirit_csmode_e csmode); + +/****************************************************************************** + * Name: spirit_qi_get_csmode + * + * Description: + * Returns the CS Mode. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CS mode. + * + ******************************************************************************/ + +enum spirit_csmode_e spirit_qi_get_csmode(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_qi_enable_cstimeout + * + * Description: + * Enables/Disables the CS Timeout Mask. If enabled CS value contributes to + * timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for CS Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_cstimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_qi_enable_pqitimeout + * + * Description: + * Enables/Disables the PQI Timeout Mask. If enabled PQI value contributes + * to timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for PQI Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_pqitimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_qi_enable_sqitimeout + * + * Description: + * Enables/Disables the SQI Timeout Mask. If enabled SQI value contributes + * to timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for SQI Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_sqitimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); #endif /* __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_GENERAL_H*/ diff --git a/drivers/wireless/spirit/lib/Make.defs b/drivers/wireless/spirit/lib/Make.defs index 8a39b76aec..33aa82f2d5 100644 --- a/drivers/wireless/spirit/lib/Make.defs +++ b/drivers/wireless/spirit/lib/Make.defs @@ -38,7 +38,8 @@ CSRCS += spirit_radio.c spirit_pktbasic.c spirit_pktcommon.c CSRCS += spirit_pktmbus.c spirit_directrf.c spirit_qi.c spirit_calibration.c CSRCS += spirit_management.c spirit_aes.c spirit_csma.c spirit_linearfifo.c -CSRCS += spirit_irq.c spirit_timer.c spirit_gpio.c spirit_spi.c +CSRCS += spirit_irq.c spirit_timer.c spirit_gpio.c spirit_general.c +CSRCS += spirit_spi.c # Include Spirit driver build support diff --git a/drivers/wireless/spirit/lib/spirit_general.c b/drivers/wireless/spirit/lib/spirit_general.c new file mode 100644 index 0000000000..665713f67a --- /dev/null +++ b/drivers/wireless/spirit/lib/spirit_general.c @@ -0,0 +1,539 @@ +/****************************************************************************** + * drivers/wireless/spirit/spirit_general.c + * Configuration and management of SPIRIT General functionalities. + * + * Copyright(c) 2015 STMicroelectronics + * Author: VMA division - AMS + * Version 3.2.2 08-July-2015 + * + * Adapted for NuttX by: + * Author: Gregory Nutt + * + * 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 STMicroelectronics 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. + * + ******************************************************************************/ + +/****************************************************************************** + * Included Files + ******************************************************************************/ + +#include + +#include "spirit_general.h" +#include "spirit_spi.h" + +/****************************************************************************** + * Public Functions + ******************************************************************************/ + +/****************************************************************************** + * Name: spirit_general_enable_batterylevel + * + * Description: + * Enables or Disables the output of battery level detector. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for battery level detector. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_enable_batterylevel(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the ANA_FUNC_CONF0_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to be stored */ + + if (newstate == S_ENABLE) + { + regval |= BATTERY_LEVEL_MASK; + } + else + { + regval &= ~BATTERY_LEVEL_MASK; + } + + /* Write the new value */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_set_batterylevel + * + * Description: + * Sets the battery level. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * batterylevel - New state for battery level. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_set_batterylevel(FAR struct spirit_library_s *spirit, + enum battery_level_e batterylevel) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_BLD_LVL(batterylevel)); + + /* Reads the ANA_FUNC_CONF1_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to be stored */ + + regval &= ~ANA_FUNC_CONF1_SET_BLD_LVL_MASK; + switch (batterylevel) + { + case BLD_LVL_2_7_V: + regval |= BLD_LVL_2_7; + break; + + case BLD_LVL_2_5_V: + regval |= BLD_LVL_2_5; + break; + + case BLD_LVL_2_3_V: + regval |= BLD_LVL_2_3; + break; + + case BLD_LVL_2_1_V: + regval |= BLD_LVL_2_1; + break; + } + + /* Write the new value */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_get_batterylevel + * + * Description: + * Returns the settled battery level. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled battery level. + * + ******************************************************************************/ + +enum battery_level_e + spirit_general_get_batterylevel(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the ANA_FUNC_CONF1_BASE register value */ + + (void)spirit_reg_read(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + + /* Mask the battery level field and returns the settled battery level */ + + return ((enum battery_level_e)(regval & ANA_FUNC_CONF1_SET_BLD_LVL_MASK)); +} + +/****************************************************************************** + * Name: spirit_general_enable_brownout + * + * Description: + * Enables or Disables the output of brown out detector. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for brown out detector. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_enable_brownout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the ANA_FUNC_CONF0_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to be stored */ + + if (newstate == S_ENABLE) + { + regval |= BROWN_OUT_MASK; + } + else + { + regval &= ~BROWN_OUT_MASK; + } + + /* Write the value to the register */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_enable_highpower + * + * Description: + * Sets High Power Mode. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for High Power Mode. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_enable_highpower(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the ANA_FUNC_CONF0_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to write */ + + if (newstate == S_ENABLE) + { + regval |= HIGH_POWER_MODE_MASK; + } + else + { + regval &= ~HIGH_POWER_MODE_MASK; + } + + /* Write the new value to the register */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_set_extref + * + * Description: + * Sets External Reference. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * extmode - New state for the external reference. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_set_extref(FAR struct spirit_library_s *spirit, + enum mode_extref_e extmode) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_MODE_EXT(extmode)); + + /* Reads the ANA_FUNC_CONF0_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to write */ + + if (extmode == MODE_EXT_XO) + { + regval &= ~EXT_REF_MASK; + } + else + { + regval |= EXT_REF_MASK; + } + + /* Write the value to the register */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_get_extref + * + * Description: + * Returns External Reference. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled external reference. + * + ******************************************************************************/ + +enum mode_extref_e + spirit_general_get_extref(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the ANA_FUNC_CONF0_BASE register value and return the result */ + + (void)spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + + /* Mask the EXT_REF field field and returns the settled reference signal */ + + return ((enum mode_extref_e) ((regval & 0x10) >> 4)); +} + +/****************************************************************************** + * Name: spirit_general_set_xogm + * + * Description: + * Sets XO gm at startup. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * gm - Transconductance value of XO at startup. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_general_set_xogm(FAR struct spirit_library_s *spirit, + enum gm_conf_e gm) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_GM_CONF(gm)); + + /* Reads the ANA_FUNC_CONF1_BASE register value */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to write */ + + regval &= ~ANA_FUNC_CONF1_GMCONF_MASK; + switch (gm) + { + case GM_SU_13_2: + regval |= GM_13_2; + break; + + case GM_SU_18_2: + regval |= GM_18_2; + break; + + case GM_SU_21_5: + regval |= GM_21_5; + break; + + case GM_SU_25_6: + regval |= GM_25_6; + break; + + case GM_SU_28_8: + regval |= GM_28_8; + break; + + case GM_SU_33_9: + regval |= GM_33_9; + break; + + case GM_SU_38_5: + regval |= GM_38_5; + break; + + case GM_SU_43_0: + regval |= GM_43_0; + break; + } + + /* Write the new value to the register */ + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_general_get_xogm + * + * Description: + * Returns the configured XO gm at startup. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled XO gm + * + ******************************************************************************/ + +enum gm_conf_e spirit_general_get_xogm(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the ANA_FUNC_CONF1_BASE register value */ + + (void)spirit_reg_read(spirit, ANA_FUNC_CONF1_BASE, ®val, 1); + + /* Mask the GM_CONF field field and returns the settled transconductance of + * the XO at startup */ + + return ((enum gm_conf_e) ((regval & 0x1C) >> 2)); +} + +/****************************************************************************** + * Name: spirit_general_get_pkttype + * + * Description: + * Returns the settled packet format. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled packet type. + * + ******************************************************************************/ + +enum packet_type_e + spirit_general_get_pkttype(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the PROTOCOL1 register */ + + (void)spirit_reg_read(spirit, PCKTCTRL3_BASE, ®val, 1); + + /* cast and return value */ + + return (enum packet_type_e)(regval >> 6); +} + +/****************************************************************************** + * Name: spirit_general_get_partnumber + * + * Description: + * Returns device part number. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Device part number. + * + ******************************************************************************/ + +uint16_t spirit_general_get_partnumber(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[2]; + + /* Reads the register value containing the device part number */ + + (void)spirit_reg_read(spirit, DEVICE_INFO1_PARTNUM, regval, 2); + + return (((uint16_t)regval[0] << 8) | (uint16_t)regval[1]); +} + +/****************************************************************************** + * Name: spirit_general_get_version + * + * Description: + * Returns SPIRIT RF board version. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * SPIRIT RF board version: 0x30 is the only admitted value + * + ******************************************************************************/ + +uint8_t spirit_general_get_version(FAR struct spirit_library_s *spirit) +{ + uint8_t ver; + + (void)spirit_reg_read(spirit, DEVICE_INFO0_VERSION, &ver, 1); + return ver; +} diff --git a/drivers/wireless/spirit/lib/spirit_gpio.c b/drivers/wireless/spirit/lib/spirit_gpio.c index 4021e785c5..e7bc071b9d 100644 --- a/drivers/wireless/spirit/lib/spirit_gpio.c +++ b/drivers/wireless/spirit/lib/spirit_gpio.c @@ -44,31 +44,12 @@ #include "spirit_gpio.h" #include "spirit_spi.h" -/****************************************************************************** - * Pre-processor Definitions - ******************************************************************************/ - -/****************************************************************************** - * Private Functions - ******************************************************************************/ - -/****************************************************************************** - * Name: - * - * Description: - * - * Parameters: - * - * Returned Value: - * - ******************************************************************************/ - /****************************************************************************** * Public Functions ******************************************************************************/ /****************************************************************************** - * Name: + * Name: spirit_gpio_initialize * * Description: * Initializes the Spirit GPIOx according to the specified parameters in @@ -99,3 +80,490 @@ int spirit_gpio_initialize(FAR struct spirit_library_s *spirit, regval = ((uint8_t)(gpioinit->gpiomode) | (uint8_t)(gpioinit->gpioio)); return spirit_reg_write(spirit, gpioinit->gpiopin, ®val, 1); } + +/****************************************************************************** + * Name: spirit_gpio_enable_tempsensor + * + * Description: + * Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - Bew state for temperature sensor. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_enable_tempsensor(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval = 0; + uint8_t gpio0regval = 0; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the ANA_FUNC_CONF0 register and mask the result to enable or disable + * the temperature sensor */ + + ret = spirit_reg_read(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + if (newstate == S_ENABLE) + { + regval |= TEMPERATURE_SENSOR_MASK; + } + else + { + regval &= (~TEMPERATURE_SENSOR_MASK); + gpio0regval = 0x0a; /* Default value */ + } + + ret = spirit_reg_write(spirit, ANA_FUNC_CONF0_BASE, ®val, 1); + if (ret >= 0) + { + /* Sets the SPIRIT GPIO_0 according to input request */ + + ret = spirit_reg_write(spirit, GPIO0_CONF_BASE, &gpio0regval, 1); + } + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_set_outputlevel + * + * Description: + * Forces SPIRIT GPIO_x configured as digital output, to VDD or GND. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * gpio - Specifies the GPIO to be configured. This parameter can be one + * of following values: + * + * SPIRIT_GPIO_0: SPIRIT GPIO_0 + * SPIRIT_GPIO_1: SPIRIT GPIO_1 + * SPIRIT_GPIO_2: SPIRIT GPIO_2 + * SPIRIT_GPIO_3: SPIRIT GPIO_3 + * + * level - Specifies the level. This parameter can be: HIGH or LOW. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_outputlevel(FAR struct spirit_library_s *spirit, + enum spirit_gpio_pin_e gpio, + enum spirit_outputlevel_e level) +{ + uint8_t regval = 0; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_GPIO(gpio)); + DEBUGASSERT(IS_SPIRIT_GPIO_LEVEL(level)); + + /* Reads the SPIRIT_GPIOx register and mask the GPIO_SELECT field */ + + ret = spirit_reg_read(spirit, gpio, ®val, 1); + if (ret >= 0) + { + regval &= 0x04; + + /* Sets the value of the SPIRIT GPIO register according to the + * specified level. + */ + + if (level == HIGH) + { + regval |= (uint8_t)SPIRIT_GPIO_DIG_OUT_VDD | + (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; + } + else + { + regval |= (uint8_t)SPIRIT_GPIO_DIG_OUT_GND | + (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; + } + + /* Write to the SPIRIT GPIO register */ + + ret = spirit_reg_write(spirit, gpio, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_get_outputlevel + * + * Description: + * Returns output value (VDD or GND) of SPIRIT GPIO_x, when it is configured + * as digital output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * gpio - Specifies the GPIO to be read. This parameter can be one of + * following values: + * + * SPIRIT_GPIO_0: SPIRIT GPIO_0 + * SPIRIT_GPIO_1: SPIRIT GPIO_1 + * SPIRIT_GPIO_2: SPIRIT GPIO_2 + * SPIRIT_GPIO_3: SPIRIT GPIO_3 + * + * Returned Value: + * Logical level of selected GPIO configured as digital output. This + * parameter can be: HIGH or LOW. + * + ******************************************************************************/ + +enum spirit_outputlevel_e + spirit_gpio_get_outputlevel(FAR struct spirit_library_s *spirit, + enum spirit_gpio_pin_e gpio) +{ + enum spirit_outputlevel_e level; + uint8_t regval = 0; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_GPIO(gpio)); + + /* Reads the SPIRIT_GPIOx register */ + + (void)spirit_reg_read(spirit, gpio, ®val, 1); + + /* Mask the GPIO_SELECT field and returns the value according */ + + regval &= 0xf8; + if (regval == SPIRIT_GPIO_DIG_OUT_VDD) + { + level = HIGH; + } + else + { + level = LOW; + } + + return level; +} + +/****************************************************************************** + * Name: spirit_gpio_enable_clockoutput + * + * Description: + * Enables or Disables the MCU clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for the MCU clock output. This parameter can be: + * S_ENABLE or S_DISABLE. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_enable_clockoutput(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the MCU_CK_CONF register and mask the result to enable or disable + * the clock output */ + + ret = spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + if (ret >= 0) + { + if (newstate) + { + regval |= MCU_CK_ENABLE; + } + else + { + regval &= (~MCU_CK_ENABLE); + } + + /* Write to the MCU_CK_CONF register */ + + ret = spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_clockoutput_initialize + * + * Description: + * Initializes the SPIRIT Clock Output according to the specified parameters + * in the xClockOutputInitStruct. + * + * NOTE: The function spirit_gpio_enable_clockoutput() must be called in order to + * enable or disable the MCU clock dividers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * clockoutput - Pointer to a struct spirit_clockoutput_init_s structure + * that contains the configuration information for the SPIRIT + * Clock Output. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_clockoutput_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_clockoutput_init_s *clockoutput) +{ + uint8_t regval = 0; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_XO(clockoutput->xoprescaler)); + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_RCO(clockoutput->rcoprescaler)); + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(clockoutput->xtracycles)); + + /* Calculates the register value to write according to the specified + * configuration */ + + regval = ((uint8_t)(clockoutput->xoprescaler) | + (uint8_t)(clockoutput->rcoprescaler) | + (uint8_t)(clockoutput->xtracycles)); + + /* Write to the the MCU_CLOCK register */ + + return spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); +} + +/****************************************************************************** + * Name: spirit_gpio_set_xoprescaler + * + * Description: + * Sets the XO ratio as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * xoprescaler - the XO prescaler to be used as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_xoprescaler_e . + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_xoprescaler(FAR struct spirit_library_s *spirit, + enum spirit_clockoutput_xoprescaler_e xoprescaler) +{ + uint8_t regval = 0; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_XO(xoprescaler)); + + /* Reads the MCU_CLK_CONFIG register */ + + ret = spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + if (ret >= 0) + { + /* Mask the XO_RATIO field and writes the new value */ + + regval &= 0x61; + regval |= (uint8_t)xoprescaler; + + /* Write to the new XO prescaler in the MCU_CLOCK register */ + + ret = spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_get_xoprescaler + * + * Description: + * Returns the settled XO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled XO prescaler used for clock output. + * + ******************************************************************************/ + +enum spirit_clockoutput_xoprescaler_e + spirit_gpio_get_xoprescaler(FAR struct spirit_library_s *spirit) +{ + uint8_t regval = 0x00; + + /* Reads the MCU_CLK_CONFIG register */ + + (void)spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + + /* Mask the XO_RATIO field and return the value */ + + return ((enum spirit_clockoutput_xoprescaler_e)(regval & 0x1e)); +} + +/****************************************************************************** + * Name: spirit_gpio_set_rcoprescaler + * + * Description: + * Sets the RCO ratio as clock output + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rcoprescaler - The RCO prescaler to be used as clock output. This + * parameter can be any value from enum + * spirit_clockoutput_rcoprescaler_e . + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_rcoprescaler(FAR struct spirit_library_s *spirit, + enum spirit_clockoutput_rcoprescaler_e rcoprescaler) +{ + uint8_t regval = 0; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_RCO(rcoprescaler)); + + /* Reads the MCU_CLK_CONFIG register */ + + ret = spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + if (ret >= 0) + { + /* Mask the RCO_RATIO field and writes the new value */ + + regval &= 0xfe; + regval |= (uint8_t)rcoprescaler; + + /* Write to the new RCO prescaler in the MCU_CLOCK register */ + + ret = spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_get_rcoprescaler + * + * Description: + * Returns the settled RCO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled RCO prescaler used for clock output. + * + ******************************************************************************/ + +enum spirit_clockoutput_rcoprescaler_e + spirit_gpio_get_rcoprescaler(FAR struct spirit_library_s *spirit) +{ + uint8_t regval = 0; + + /* Reads the MCU_CLK_CONFIG register */ + + (void)spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + + /* Mask the RCO_RATIO field and returns the value */ + + return ((enum spirit_clockoutput_rcoprescaler_e)(regval & 0x01)); +} + +/****************************************************************************** + * Name: spirit_gpio_set_extracycles + * + * Description: + * Sets the RCO ratio as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * xtracycles - The number of extra clock cycles provided before switching + * to STANDBY state. This parameter can be any value of enum + * spirit_extra_clockcycles_e. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_gpio_set_extracycles(FAR struct spirit_library_s *spirit, + enum spirit_extra_clockcycles_e xtracycles) +{ + uint8_t regval = 0; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xtracycles)); + + /* Reads the MCU_CLK_CONFIG register */ + + ret = spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + if (ret >= 0) + { + /* Mask the CLOCK_TAIL field and writes the new value */ + + regval &= 0x9f; + regval |= (uint8_t)xtracycles; + + /* Write to the new number of extra clock cycles in the MCU_CLOCK + * register. + */ + + ret = spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_gpio_get_extracycles + * + * Description: + * Returns the settled RCO prescaler as clock output. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Settled number of extra clock cycles provided before switching to STANDBY + * state. + * + ******************************************************************************/ + +enum spirit_extra_clockcycles_e + spirit_gpio_get_extracycles(FAR struct spirit_library_s *spirit) +{ + uint8_t regval = 0; + + /* Reads the MCU_CLK_CONFIG register */ + + (void)spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); + + /* Mask the CLOCK_TAIL field and returns the value */ + + return ((enum spirit_extra_clockcycles_e)(regval & 0x60)); +} diff --git a/drivers/wireless/spirit/lib/spirit_qi.c b/drivers/wireless/spirit/lib/spirit_qi.c index 8adaff0a4e..394fbab71a 100644 --- a/drivers/wireless/spirit/lib/spirit_qi.c +++ b/drivers/wireless/spirit/lib/spirit_qi.c @@ -43,31 +43,63 @@ #include "spirit_qi.h" #include "spirit_spi.h" -/****************************************************************************** - * Pre-processor Definitions - ******************************************************************************/ - -/****************************************************************************** - * Private Functions - ******************************************************************************/ - -/****************************************************************************** - * Name: - * - * Description: - * - * Parameters: - * - * Returned Value: - * - ******************************************************************************/ - /****************************************************************************** * Public Functions ******************************************************************************/ /****************************************************************************** - * Name: spirit_qi_sqicheck + * Name: spirit_qi_enable_pqicheck + * + * Description: + * Enables/Disables the PQI Preamble Quality Indicator check. The running + * peak PQI is compared to a threshold value and the preamble valid IRQ is + * asserted as soon as the threshold is passed. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for PQI check. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_pqicheck(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the QI register value */ + + ret = spirit_reg_read(spirit, QI_BASE, ®val, 1); + if (ret >= 0) + { + /* Enables or disables the PQI Check bit on the QI_BASE register */ + + if (newstate == S_ENABLE) + { + regval |= QI_PQI_MASK; + } + else + { + regval &= ~QI_PQI_MASK; + } + + /* Write the value on the QI register */ + + ret = spirit_reg_write(spirit, QI_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_enable_sqicheck * * Description: * Enables/Disables the Synchronization Quality Indicator check. The @@ -83,8 +115,8 @@ * ******************************************************************************/ -int spirit_qi_sqicheck(FAR struct spirit_library_s *spirit, - enum spirit_functional_state_e newstate) +int spirit_qi_enable_sqicheck(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) { uint8_t regval; int ret; @@ -117,6 +149,79 @@ int spirit_qi_sqicheck(FAR struct spirit_library_s *spirit, return ret; } +/****************************************************************************** + * Name: spirit_qi_set_pqithreshold + * + * Description: + * Sets the PQI threshold. The preamble quality threshold is 4*PQI_TH + * (PQI_TH = 0..15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pqithr - Parameter of the formula above. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_pqithreshold(FAR struct spirit_library_s *spirit, + enum spirit_pqi_threshold_e pqithr) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PQI_THR(pqithr)); + + /* Reads the QI register value */ + + ret = spirit_reg_read(spirit, QI_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the PQI threshold value to be written */ + + regval &= 0xc3; + regval |= (uint8_t)pqithr; + + /* Write the value on the QI register */ + + ret = spirit_reg_write(spirit, QI_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_get_pqithreshold + * + * Description: + * Returns the PQI threshold. The preamble quality threshold is 4*PQI_TH + * (PQI_TH = 0..15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * PQI threshold (PQI_TH of the formula above). + * + ******************************************************************************/ + +enum spirit_pqi_threshold_e + spirit_qi_get_pqithreshold(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the QI register value */ + + (void)spirit_reg_read(spirit, QI_BASE, ®val, 1); + + /* Rebuild and return the PQI threshold value */ + + return (enum spirit_pqi_threshold_e)(regval & 0x3c); +} + /****************************************************************************** * Name: spirit_qi_set_sqithreshold * @@ -193,10 +298,233 @@ enum spirit_sqi_threshold_e return (enum spirit_sqi_threshold_e)(regval & 0xc0); } +/****************************************************************************** + * Name: spirit_qi_get_pqi + * + * Description: + * Returns the PQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * PQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_pqi(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the LINK_QUALIF2 register value */ + + (void)spirit_reg_read(spirit, LINK_QUALIF2_BASE, ®val, 1); + + /* Returns the PQI value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_qi_get_sqi + * + * Description: + * Returns the SQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * SQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_sqi(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the register LINK_QUALIF1 value */ + + (void)spirit_reg_read(spirit, LINK_QUALIF1_BASE, ®val, 1); + + /* Rebuild and return the SQI value */ + + return (regval & 0x7f); +} + +/****************************************************************************** + * Name: spirit_qi_get_lqi + * + * Description: + * Returns the LQI value. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * LQI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_lqi(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the LINK_QUALIF0 register value */ + + (void)spirit_reg_read(spirit, LINK_QUALIF0_BASE, ®val, 1); + + /* Rebuild and return the LQI value */ + + return ((regval & 0xf0) >> 4); +} + +/****************************************************************************** + * Name: spirit_qi_get_cs + * + * Description: + * Returns the CS status. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CS value (S_SET or S_RESET). + * + ******************************************************************************/ + +enum spirit_flag_status_e spirit_qi_get_cs(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the LINK_QUALIF1 register value */ + + (void)spirit_reg_read(spirit, LINK_QUALIF1_BASE, ®val, 1); + + /* Rebuild and returns the CS status value */ + + if ((regval & 0x80) == 0) + { + return S_RESET; + } + else + { + return S_SET; + } +} + +/****************************************************************************** + * Name: spirit_qi_get_rssi + * + * Description: + * Returns the RSSI value. The measured power is reported in steps of half a + * dB from 0 to 255 and is offset in such a way that -120 dBm corresponds to + * 20. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI value. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_rssi(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the RSSI_LEVEL register value */ + + (void)spirit_reg_read(spirit, RSSI_LEVEL_BASE, ®val, 1); + + /* Returns the RSSI value */ + + return regval; +} + /****************************************************************************** * Name: spirit_qi_set_rssithreshold * * Description: + * Sets the RSSI threshold. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rssithr - RSSI threshold reported in steps of half a dBm with a -130 + * dBm offset. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_rssithreshold(FAR struct spirit_library_s *spirit, + uint8_t rssithr) +{ + /* Writes the new value on the RSSI_TH register */ + + return spirit_reg_write(spirit, RSSI_TH_BASE, &rssithr, 1); +} + +/****************************************************************************** + * Name: spirit_qi_get_rssithreshold + * + * Description: + * Returns the RSSI threshold. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI threshold. + * + ******************************************************************************/ + +uint8_t spirit_qi_get_rssithreshold(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the RSSI_TH register value */ + + (void)spirit_reg_read(spirit, RSSI_TH_BASE, ®val, 1); + + /* Returns RSSI threshold */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_qi_calc_rssithreshold + * + * Description: + * Computes the RSSI threshold from its dBm value according to the formula: + * (RSSI[Dbm] + 130)/0.5 + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * dbmvalue - RSSI threshold reported in dBm. + * + * Returned Value: + * RSSI threshold corresponding to dBm value. + * + ******************************************************************************/ + +uint8_t spirit_qi_calc_rssithreshold(FAR struct spirit_library_s *spirit, + int dbmvalue) +{ + /* Check the parameters */ + + DEBUGASSERT(IS_RSSI_THR_DBM(dbmvalue)); + + /* Computes the RSSI threshold for register */ + + return 2 * (dbmvalue + 130); +} + +/****************************************************************************** + * Name: spirit_qi_set_rssithreshold_dbm + * + * Description: * Sets the RSSI threshold from its dBm value according to the formula: * (RSSI[Dbm] + 130)/0.5. * @@ -209,8 +537,8 @@ enum spirit_sqi_threshold_e * ******************************************************************************/ -int spirit_qi_set_rssithreshold(FAR struct spirit_library_s *spirit, - int dbmvalue) +int spirit_qi_set_rssithreshold_dbm(FAR struct spirit_library_s *spirit, + int dbmvalue) { uint8_t regval = 2 * (dbmvalue + 130); @@ -222,3 +550,304 @@ int spirit_qi_set_rssithreshold(FAR struct spirit_library_s *spirit, return spirit_reg_write(spirit, RSSI_TH_BASE, ®val, 1); } + +/****************************************************************************** + * Name: spirit_qi_set_rssifiltergain + * + * Description: + * Sets the RSSI filter gain. This parameter sets the bandwidth of a low + * pass IIR filter (RSSI_FLT register, allowed values 0..15), a lower values + * gives a faster settling of the measurements but lower precision. The + * recommended value for such parameter is 14. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * rssfg - RSSI filter gain value. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_rssifiltergain(FAR struct spirit_library_s *spirit, + enum spirit_rssi_filtergain_e rssfg) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_RSSI_FILTER_GAIN(rssfg)); + + /* Reads the RSSI_FLT register */ + + ret = spirit_reg_read(spirit, RSSI_FLT_BASE, ®val, 1); + if (ret >= 0) + { + /* Sets the specified filter gain */ + + regval &= 0x0f; + regval |= ((uint8_t) rssfg); + + /* Write the new value to the RSSI_FLT register */ + + ret = spirit_reg_write(spirit, RSSI_FLT_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_get_rssifiltergain + * + * Description: + * Returns the RSSI filter gain. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * RSSI filter gain. + * + ******************************************************************************/ + +enum spirit_rssi_filtergain_e + spirit_qi_get_rssifiltergain(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the RSSI_FLT register */ + + (void)spirit_reg_read(spirit, RSSI_FLT_BASE, ®val, 1); + + /* Rebuild and returns the filter gain value */ + + return (enum spirit_rssi_filtergain_e)(regval & 0xf0); +} + +/****************************************************************************** + * Name: spirit_qi_set_csmode + * + * Description: + * Sets the CS Mode. When static carrier sensing is used (cs_mode = 0), the + * carrier sense signal is asserted when the measured RSSI is above the + * value specified in the RSSI_TH register and is deasserted when the RSSI + * falls 3 dB below the same threshold. When dynamic carrier sense is used + * (cs_mode = 1, 2, 3), the carrier sense signal is asserted if the signal + * is above the threshold and a fast power increase of 6, 12 or 18 dB is + * detected; it is deasserted if a power fall of the same amplitude is + * detected. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * csmode - CS mode selector. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_set_csmode(FAR struct spirit_library_s *spirit, + enum spirit_csmode_e csmode) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_CS_MODE(csmode)); + + /* Reads the RSSI_FLT register */ + + ret = spirit_reg_read(spirit, RSSI_FLT_BASE, ®val, 1); + if (ret >= 0) + { + /* Sets bit to select the CS mode */ + + regval &= ~0x0c; + regval |= (uint8_t)csmode; + + /* Writesthe new value to the RSSI_FLT register */ + + ret = spirit_reg_write(spirit, RSSI_FLT_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_get_csmode + * + * Description: + * Returns the CS Mode. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CS mode. + * + ******************************************************************************/ + +enum spirit_csmode_e spirit_qi_get_csmode(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Reads the RSSI_FLT register */ + + (void)spirit_reg_read(spirit, RSSI_FLT_BASE, ®val, 1); + + /* Rebuild and returns the CS mode value */ + + return (enum spirit_csmode_e) (regval & 0x0c); +} + +/****************************************************************************** + * Name: spirit_qi_enable_cstimeout + * + * Description: + * Enables/Disables the CS Timeout Mask. If enabled CS value contributes to + * timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for CS Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_cstimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the PROTOCOL2 register value */ + + ret = spirit_reg_read(spirit, PROTOCOL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Enables or disables the CS timeout mask */ + + if (newstate == S_ENABLE) + { + regval |= PROTOCOL2_CS_TIMEOUT_MASK; + } + else + { + regval &= ~PROTOCOL2_CS_TIMEOUT_MASK; + } + + /* Write the new value to the PROTOCOL2 register */ + + ret = spirit_reg_write(spirit, PROTOCOL2_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_enable_pqitimeout + * + * Description: + * Enables/Disables the PQI Timeout Mask. If enabled PQI value contributes + * to timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for PQI Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_pqitimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the PROTOCOL2 register */ + + ret = spirit_reg_read(spirit, PROTOCOL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Enables or disables the PQI timeout mask */ + + if (newstate == S_ENABLE) + { + regval |= PROTOCOL2_PQI_TIMEOUT_MASK; + } + else + { + regval &= ~PROTOCOL2_PQI_TIMEOUT_MASK; + } + + /* Write the new value to the PROTOCOL2 register */ + + ret = spirit_reg_write(spirit, PROTOCOL2_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_qi_enable_sqitimeout + * + * Description: + * Enables/Disables the SQI Timeout Mask. If enabled SQI value contributes + * to timeout disabling. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for SQI Timeout Mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_qi_enable_sqitimeout(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); + + /* Reads the PROTOCOL2 register */ + + ret = spirit_reg_read(spirit, PROTOCOL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Enables or disables the SQI timeout mask */ + + if (newstate == S_ENABLE) + { + regval |= PROTOCOL2_SQI_TIMEOUT_MASK; + } + else + { + regval &= ~PROTOCOL2_SQI_TIMEOUT_MASK; + } + + /* Write the new value to the PROTOCOL2 register */ + + ret = spirit_reg_write(spirit, PROTOCOL2_BASE, ®val, 1); + } + + return ret; +} diff --git a/drivers/wireless/spirit/lib/spirit_spi.c b/drivers/wireless/spirit/lib/spirit_spi.c index 704e4ba5b1..604c77a569 100644 --- a/drivers/wireless/spirit/lib/spirit_spi.c +++ b/drivers/wireless/spirit/lib/spirit_spi.c @@ -65,6 +65,113 @@ * Private Functions ******************************************************************************/ +/****************************************************************************** + * Name: spirit_dump_buffer + * + * Description: + * Dump a data buffer to the SYSLOG. + * + * Parameters: + * buffer - The buffer to be dumped + * buflen - The length of the buffer in bytes. + * + * Returned Value: + * None + * + ******************************************************************************/ + +#if defined(CONFIG_WL_SPIRIT_REGDEBUG) || defined(CONFIG_WL_SPIRIT_FIFODUMP) +static void spirit_dump_buffer(FAR const uint8_t *buffer, unsigned int buflen) +{ + char outbuf[16*3 + 3]; /* 16 hex bytes + 2 space separator + NUL termination */ + FAR char *ptr; + unsigned int i; + unsigned int j: + unsigned int maxj: + + for (i = 0; i < buflen; i += 16) + { + maxj = 16; + if (i + maxj > buflen) + { + maxj = buflen - i; + } + + ptr = outbuf; + for (j = 0; j < maxj; j++) + { + if (j = 8) + { + *outbuf++ = ' '; + *outbuf++ = ' '; + } + + sprintf(outbuf, "%02x ", *buffer++); + outbuf += 3; + } + + *outbuf = '\0'; + wlinfo(" %s\n", outbuf) + } +} +#endif + +/****************************************************************************** + * Name: spirit_regdebug + * + * Description: + * Dump a register access. + * + * Parameters: + * msg - Describes the access + * header - Two byte header before the access + * buffer - The buffer to be dumped + * buflen - The length of the buffer in bytes. + * + * Returned Value: + * None + * + ******************************************************************************/ + +#ifdef CONFIG_WL_SPIRIT_REGDEBUG +static void spirit_regdebug(FAR const char *msg, FAR uint8_t *header, + FAR const uint8_t *buffer, unsigned int buflen) +{ + wlinfo("%-8s: %02x %02x\n", header[0], header[1]); + spirit_dump_buffer(buffer, buflen); +} +#else +# define spirit_regdebug(msg,header,buffer,buflen) +#endif + +/****************************************************************************** + * Name: spirit_fifodebug + * + * Description: + * Dump a FIFO access. + * + * Parameters: + * msg - Describes the access + * header - Two byte header before the access + * buffer - The buffer to be dumped + * buflen - The length of the buffer in bytes. + * + * Returned Value: + * None + * + ******************************************************************************/ + +#ifdef CONFIG_WL_SPIRIT_FIFODUMP +static void spirit_fifodebug(FAR const char *msg, FAR uint8_t *header, + FAR const uint8_t *buffer, unsigned int buflen) +{ + wlinfo("%-8s: %02x %02x\n", header[0], header[1]); + spirit_dump_buffer(buffer, buflen); +} +#else +# define spirit_fifodebug(msg,header,buffer,buflen) +#endif + /****************************************************************************** * Name: spirit_lock * @@ -187,6 +294,8 @@ int spirit_reg_read(FAR struct spirit_library_s *spirit, uint8_t regaddr, SPI_SELECT(spirit->spi, SPIDEV_WIRELESS(0), false); spirit_unlock(spirit->spi); + + spirit_regdebug("READ", header, buffer, buflen); return OK; } @@ -218,6 +327,7 @@ int spirit_reg_write(FAR struct spirit_library_s *spirit, uint8_t regaddr, header[0] = WRITE_HEADER; header[1] = regaddr; + spirit_regdebug("WRITE", header, buffer, buflen); /* Lock the SPI bus and select the Spirit device */ @@ -268,6 +378,7 @@ int spirit_command(FAR struct spirit_library_s *spirit, uint8_t cmd) header[0] = COMMAND_HEADER; header[1] = cmd; + spirit_regdebug("CMD", header, NULL, 0); /* Lock the SPI bus and select the Spirit device */ @@ -338,6 +449,8 @@ int spirit_fifo_read(FAR struct spirit_library_s *spirit, FAR uint8_t *buffer, SPI_SELECT(spirit->spi, SPIDEV_WIRELESS(0), false); spirit_unlock(spirit->spi); + + spirit_fifodebug("FIFO IN", header, buffer, buflen); return OK; } @@ -368,6 +481,7 @@ int spirit_fifo_write(FAR struct spirit_library_s *spirit, header[0] = WRITE_HEADER; header[1] = LINEAR_FIFO_ADDRESS; + spirit_fifodebug("FIFO OUT", header, buffer, buflen); /* Lock the SPI bus and select the Spirit device */