Squashed commit of the following:

commit cb79778a3044ae97a1cc615dfa24099144f04bd0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 11:46:31 2017 -0600

    Spirit:  Bring in last of QI interfaces.

commit 0245b330a33aa73531b82ae261b1312be9922e0f
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 10:14:34 2017 -0600

    Spirit:  Add general interfaces.

commit 121845a8f229ec2c88e5721da5512135f6624ee5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 09:41:23 2017 -0600

    Spirit:  Bring in last of GPIO interfaces.

commit 279bfcc92bcd0cfa48c0ed7862fa2b75fbee99b8
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 17:09:19 2017 -0600

    Spirit: Add some missing configuration options: Add register -level debug options.

commit 4be89324a5908e35afc70373c279f4d05f62b48f
Merge: 66e87f9bb3 598386ef90
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 15:36:20 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 66e87f9bb3ef75fddf25400bc08475c5e6ad4c30
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 15:19:56 2017 -0600

    Spirit:  Brings in last of PktBasic logic.

commit 8b4c89d6a103003fa04363e2c2ae7b9ee390bf49
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 11:55:50 2017 -0600

    Spirit:  Bring in AES and MBUS logic.

commit d00022d39ab0ce839de29386949481e5c24feff3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 09:22:03 2017 -0600

    Spirit:  Bring in remainder of calibration interfaces.

commit 40b4b2f902e04293f8940551a97a9a24a48988dd
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 08:44:32 2017 -0600

    Spirit:  Bring in DirectRF interfaces.

commit 7c109608e1a2989f3edbc2fd939a2d225fff382a
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 07:46:19 2017 -0600

    Spirit: Add CSMA support.

commit 0f88896595d162c4ac6138e7b1af2fc35c865b3d
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 18:57:43 2017 -0600

    Spirit:  Add some initial TX logic to network driver.

commit 4dc7058dfcdcf40980578680b7e1a4206dea4ea2
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 17:02:11 2017 -0600

    Spirit: Completes ports of spirit_management.* files

commit c904eef51d929e041b87d0c8aff6fa3c2f895341
Merge: 91e985a877 c9ff8cbab9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 15:15:04 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 91e985a87729017a66d19276c4d47681064f95ea
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 15:13:54 2017 -0600

    Spirit:  Add a few more functions that will soon be needed for packet transmission.

commit b5981d29983907c2194fbc26af4b72ad532bee78
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 13:30:07 2017 -0600

    Spirit:  Finish off some initialization issues; Started some interrupt handling logic.

commit c21073e0bc2870b3d9ba40bdfdfd5151ce4f5890
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 09:35:52 2017 -0600

    Spirit:  Completes very basic radio initialization for network driver

commit 1b544334361c54f46bcf0ba313c125932e8dafc6
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 07:58:30 2017 -0600

    Spirit: Add more radio initialization logic... getting closer.

commit 45d1047db60843c57d394ec910c63e7c127671e0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 19:15:33 2017 -0600

    Spirit: add some CSMA initialization logic

commit bcf55c71336d48947fe19bb09a799169852301c2
Merge: 89e9d426e9 2fc0fbcf7e
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:47:11 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 89e9d426e91c056e659fccf5e5c4392618f8f777
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:44:19 2017 -0600

    Update some comments

commit 9c5d8a5833350006ed389e898b11c8c8a20e5f4f
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:15:54 2017 -0600

    Spirit:  Rename drivers/wireless/spirit/src to lib.  Move Spirit network driver out of IEEE802.15.4 into drivers/wireless/spirit/drivers

commit cabc0ec9e6eb558dcb715ab17264383aa0105e7a
Merge: 87b616414a 6bd744c4b3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 15:38:40 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 87b616414a79c01a71acea78f8258e05325c1996
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 15:37:27 2017 -0600

    Spirit radio driver is mutating into a standalone network driver.

commit 507798233868a661ae8adad3e3aa117075a7a146
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 13:32:08 2017 -0600

    Spirit: More radio initialization logic

commit 33af25704ce9ca83d576300d153cfe31cc6d2576
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 12:19:14 2017 -0600

    Spirit:  Beginning of radio initialization logic

commit 97b20014c016e55952a8f9d8f4ae29e2cc555b23
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 09:42:06 2017 -0600

    Spirit: More initialization logic.

commit 295d8e27824c0417fccea2344b30bb5c93ffbabe
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 15:39:53 2017 -0600

    Spirit:  Add header file containing enumeration of commands.

commit 8a2d9dd8eb9cc70cbcdd1b913fc9022b9c9ec8da
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 11:33:50 2017 -0600

    Spirit:  Add GPIO initialization logic

commit 8b6d80c44f92024c45a6ba63ba1af3fdafe94dc3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 10:07:25 2017 -0600

    Spirit:  Add interrupt control logic.

commit 423f846fe5c914f92a4bfea4d9d1fa33de1c77a5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 19:06:52 2017 -0600

    Spirit: Yet a little more radio initialization logic.

commit 5895b979823e51ddde5ad52e6de66a8ad662e883
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 15:36:05 2017 -0600

    Spirit: A little more radio initialization logic.

commit 86311ab30aad386203c181c792847dd1d37f9a02
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 13:02:32 2017 -0600

    Spirit: A miniscule amount of radio initialization logic.

commit ad55e89d5ee12ea1eeea95fcd38ff3da0db4416a
Merge: 90a7666655 f4e46b0da7
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 10:56:30 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 90a766665534b05da0157dbc383cb06a98c86a79
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 10:52:52 2017 -0600

    Spirit1:  A few fixes for a clean build of initial configuration (not much there yet)

commit bbbf04c223230a52a7705a2161128265cfbaa480
Merge: 623d54a7f7 2319ea53a9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:53:57 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 623d54a7f719e9032099f88f38203efee4b80722
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:43:52 2017 -0600

    b-l475e-iot01a: Add a configuration for testing sprit radio.

commit d309d73d9f4665f9d870eb03531f450043d9389d
Merge: 52c3ddfae6 d88dc9b2e5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:02:06 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 52c3ddfae6802e111c2b5cf1207baf21a61dd00b
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 08:33:04 2017 -0600

    Spirit:  Add register definition header file.

commit 8d842ab5e8f9ca653b42f9ee88dc279f06b4fa98
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 17:27:03 2017 -0600

    b-l475e-iot01a: Add initial, unverified support for the SPSRGF/Spirit1 module.

commit 73d902a1048616fb9c2dd2147cabcd8ee78e19ac
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 15:49:43 2017 -0600

    Spirit: Fixes to get skeleton IEEE 802.15.4 driver build.

commit ebc5a8387bb94f0cc3827533795f3e4a33207e67
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 15:16:29 2017 -0600

    Spirit1:  Add framework for IEEE 802.15.4 driver.  Does not yet build.

commit 52e195a7ae14ddb18bdd56258f4877381d2501ca
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 14:02:42 2017 -0600

    Spirit:  A little more SPI logic.

commit 90048d0c5b8a5af4d81a15d99535c84ed38d8ae9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 11:19:06 2017 -0600

    Spirit: Build directories setup.  Some initial files added, mostly just to verify build.

commit 8273a381ac1f6bb081b292b5e73226185e9e634c
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 08:34:04 2017 -0600

    USB composite:  Remove references to CDC/ACM and USB MSC from composite logic.  They are no longer coupled.
This commit is contained in:
Gregory Nutt 2017-07-27 11:56:26 -06:00
parent 5f31999b75
commit f287cc25d6
11 changed files with 2618 additions and 67 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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*/

View File

@ -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*/

View File

@ -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

View File

@ -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 <gnutt@nuttx.org>
*
* 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 <assert.h>
#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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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;
}

View File

@ -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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 1);
/* Mask the CLOCK_TAIL field and returns the value */
return ((enum spirit_extra_clockcycles_e)(regval & 0x60));
}

View File

@ -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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 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, &regval, 1);
}
return ret;
}

View File

@ -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 */