2017-07-26 23:35:42 +02:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* drivers/wireless/spirit/spirit_pktmbus.c
|
|
|
|
|
* Configuration and management of SPIRIT MBUS packets.
|
|
|
|
|
*
|
|
|
|
|
* 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_pktmbus.h"
|
|
|
|
|
#include "spirit_radio.h"
|
|
|
|
|
#include "spirit_spi.h"
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Public Functions
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_initialize
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Initializes the SPIRIT MBUS packet according to the specified parameters
|
|
|
|
|
* in the struct spirit_pktmbus_init_s structure.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* mbusinit - Pointer to a struct spirit_pktmbus_init_s structure that
|
|
|
|
|
* contains the configuration information for the specified
|
|
|
|
|
* SPIRIT MBUS PACKET FORMAT.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_initialize(FAR struct spirit_library_s *spirit,
|
|
|
|
|
FAR const struct spirit_pktmbus_init_s *mbusinit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval[3];
|
|
|
|
|
|
|
|
|
|
/* Check the parameters */
|
|
|
|
|
|
|
|
|
|
DEBUGASSERT(IS_MBUS_SUBMODE(mbusinit->submode));
|
|
|
|
|
|
|
|
|
|
/* Packet format config */
|
|
|
|
|
|
|
|
|
|
spirit_pktmbus_set_format(spirit);
|
|
|
|
|
spirit_pktcommon_enable_crcfilter(spirit, S_DISABLE);
|
|
|
|
|
spirit_radio_enable_csblanking(spirit, S_ENABLE);
|
|
|
|
|
|
|
|
|
|
/* Preamble, postamble and submode config */
|
|
|
|
|
|
|
|
|
|
regval[0] = mbusinit->preamblen;
|
|
|
|
|
regval[1] = mbusinit->postamblen;
|
|
|
|
|
regval[2] = (uint8_t) mbusinit->submode;
|
|
|
|
|
|
|
|
|
|
/* Writes the new values on the MBUS_PRMBL registers */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, MBUS_PRMBL_BASE, regval, 3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_get_setup
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Returns the SPIRIT MBUS packet structure according to the specified
|
|
|
|
|
* parameters in the registers.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* mbusinit - MBUS packet init structure.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_get_setup(FAR struct spirit_library_s *spirit,
|
|
|
|
|
FAR struct spirit_pktmbus_init_s *mbusinit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval[3];
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
/* Reads the MBUS regs value */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_read(spirit, MBUS_PRMBL_BASE, regval, 3);
|
|
|
|
|
if (ret >= 0)
|
|
|
|
|
{
|
|
|
|
|
/* Fit the structure */
|
|
|
|
|
|
|
|
|
|
mbusinit->preamblen = regval[0];
|
|
|
|
|
mbusinit->postamblen = regval[1];
|
2019-12-05 18:49:12 +01:00
|
|
|
|
mbusinit->submode = (enum spirit_mbus_submode_e) (regval[2] & 0x0e);
|
2017-07-26 23:35:42 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_set_format
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Configures the MBUS packet format as the one used by SPIRIT.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* None.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_set_format(FAR struct spirit_library_s *spirit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
/* Reads the PCKTCTRL3 register value */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_read(spirit, PCKTCTRL3_BASE, ®val, 1);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Sets format bits. Also set to 0 the direct RX mode bits */
|
|
|
|
|
|
2019-12-05 18:49:12 +01:00
|
|
|
|
regval &= 0x0f;
|
2017-07-26 23:35:42 +02:00
|
|
|
|
regval |= ((uint8_t) PCKTCTRL3_PCKT_FRMT_MBUS);
|
|
|
|
|
|
|
|
|
|
/* Writes value on the PCKTCTRL3 register */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_write(spirit, PCKTCTRL3_BASE, ®val, 1);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Reads the PCKTCTRL1 register value */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_read(spirit, PCKTCTRL1_BASE, ®val, 1);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Build the new value. Set to 0 the direct TX mode bits */
|
|
|
|
|
|
|
|
|
|
regval &= 0xf3;
|
|
|
|
|
|
|
|
|
|
/* Writes the value on the PCKTCTRL1 register */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_write(spirit, PCKTCTRL1_BASE, ®val, 1);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Reads the PROTOCOL1 register */
|
|
|
|
|
|
|
|
|
|
ret = spirit_reg_read(spirit, PROTOCOL1_BASE, ®val, 1);
|
|
|
|
|
if (ret < 0)
|
|
|
|
|
{
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mask a reserved bit */
|
|
|
|
|
|
|
|
|
|
regval &= ~0x20;
|
|
|
|
|
|
|
|
|
|
/* Writes the value on the PROTOCOL1 register */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, PROTOCOL1_BASE, ®val, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_set_preamble
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Sets how many chip sequence <EFBFBD>01<EFBFBD> shall be added in the preamble respect
|
|
|
|
|
* to the minimum value as defined according to the specified sub-mode.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* preamble - The number of chip sequence.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_set_preamble(FAR struct spirit_library_s *spirit,
|
|
|
|
|
uint8_t preamble)
|
|
|
|
|
{
|
|
|
|
|
/* Modifies the MBUS_PRMBL register value */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, MBUS_PRMBL_BASE, &preamble, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_get_preamble
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Returns how many chip sequence "01" are added in the preamble respect to
|
|
|
|
|
* the minimum value as defined according to the specified sub-mode.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Preable in number of "01" chip sequences.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
uint8_t spirit_pktmbus_get_preamble(FAR struct spirit_library_s *spirit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval;
|
|
|
|
|
|
|
|
|
|
/* Modifies the MBUS_PRMBL register value */
|
|
|
|
|
|
2020-01-02 17:49:34 +01:00
|
|
|
|
spirit_reg_read(spirit, MBUS_PRMBL_BASE, ®val, 1);
|
2017-07-26 23:35:42 +02:00
|
|
|
|
|
|
|
|
|
/* Return value */
|
|
|
|
|
|
|
|
|
|
return regval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_set_postamble
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Sets how many chip sequence <EFBFBD>01<EFBFBD> will be used in postamble
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* postamble - The number of chip sequence.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_set_postamble(FAR struct spirit_library_s *spirit,
|
|
|
|
|
uint8_t postamble)
|
|
|
|
|
{
|
|
|
|
|
/* Modifies the MBUS_PSTMBL register value */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, MBUS_PSTMBL_BASE, &postamble, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
2018-08-13 15:39:38 +02:00
|
|
|
|
* Name: spirit_pktmbus_get_postamble
|
2017-07-26 23:35:42 +02:00
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Returns how many chip sequence "01" are used in the postamble
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Postamble in number of "01" chip sequences.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
uint8_t spirit_pktmbus_get_postamble(FAR struct spirit_library_s *spirit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval;
|
|
|
|
|
|
|
|
|
|
/* Reads the MBUS_PSTMBL register */
|
|
|
|
|
|
2020-01-02 17:49:34 +01:00
|
|
|
|
spirit_reg_read(spirit, MBUS_PSTMBL_BASE, ®val, 1);
|
2017-07-26 23:35:42 +02:00
|
|
|
|
|
|
|
|
|
/* Returns value */
|
|
|
|
|
|
|
|
|
|
return regval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
2018-08-13 15:39:38 +02:00
|
|
|
|
* Name: spirit_pktmbus_set_submode
|
2017-07-26 23:35:42 +02:00
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Sets the MBUS submode used.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* submode - The submode used.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_set_submode(FAR struct spirit_library_s *spirit,
|
|
|
|
|
enum spirit_mbus_submode_e submode)
|
|
|
|
|
{
|
|
|
|
|
/* Modifies the MBUS_CTRL register value */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, MBUS_CTRL_BASE, (FAR uint8_t *)submode, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_get_submode
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Returns the MBUS submode used.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* MBUS submode.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
enum spirit_mbus_submode_e
|
|
|
|
|
spirit_pktmbus_get_submode(FAR struct spirit_library_s *spirit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval;
|
|
|
|
|
|
|
|
|
|
/* Reads the MBUS_CTRL register value */
|
|
|
|
|
|
2020-01-02 17:49:34 +01:00
|
|
|
|
spirit_reg_read(spirit, MBUS_CTRL_BASE, ®val, 1);
|
2017-07-26 23:35:42 +02:00
|
|
|
|
|
|
|
|
|
/* Returns value */
|
|
|
|
|
|
|
|
|
|
return (enum spirit_mbus_submode_e) regval;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_set_payloadlen
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Sets the payload length for SPIRIT MBUS packets.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
* payloadlen - Payload length in bytes.
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Zero (OK) on success; a negated errno value on failure.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
int spirit_pktmbus_set_payloadlen(FAR struct spirit_library_s *spirit,
|
|
|
|
|
uint16_t payloadlen)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval[2];
|
|
|
|
|
|
|
|
|
|
/* Computes PCKTLEN0 value from payloadlen */
|
|
|
|
|
|
|
|
|
|
regval[1] = BUILD_PCKTLEN0(payloadlen);
|
|
|
|
|
|
|
|
|
|
/* Computes PCKTLEN1 value from payloadlen */
|
|
|
|
|
|
|
|
|
|
regval[0] = BUILD_PCKTLEN1(payloadlen);
|
|
|
|
|
|
|
|
|
|
/* Writes data on the PCKTLEN1/0 register */
|
|
|
|
|
|
|
|
|
|
return spirit_reg_write(spirit, PCKTLEN1_BASE, regval, 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Name: spirit_pktmbus_get_payloadlen
|
|
|
|
|
*
|
|
|
|
|
* Description:
|
|
|
|
|
* Returns the payload length for SPIRIT MBUS packets.
|
|
|
|
|
*
|
|
|
|
|
* Input Parameters:
|
|
|
|
|
* spirit - Reference to a Spirit library state structure instance
|
|
|
|
|
*
|
|
|
|
|
* Returned Value:
|
|
|
|
|
* Payload length in bytes.
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
uint16_t spirit_pktmbus_get_payloadlen(FAR struct spirit_library_s *spirit)
|
|
|
|
|
{
|
|
|
|
|
uint8_t regval[2];
|
|
|
|
|
|
|
|
|
|
/* Reads the packet length registers */
|
|
|
|
|
|
2020-01-02 17:49:34 +01:00
|
|
|
|
spirit_reg_read(spirit, PCKTLEN1_BASE, regval, 2);
|
2017-07-26 23:35:42 +02:00
|
|
|
|
|
|
|
|
|
/* Returns the packet length */
|
|
|
|
|
|
|
|
|
|
return ((((uint16_t)regval[0]) << 8) + (uint16_t)regval[1]);
|
|
|
|
|
}
|