Spirit network driver: Need to enable sending of TX address. Moved some non-optional settings out of board.h to driver.

This commit is contained in:
Gregory Nutt 2017-08-04 09:03:08 -06:00
parent e8738e1f55
commit f6ebcc2220
6 changed files with 65 additions and 45 deletions

View File

@ -121,25 +121,12 @@
#define SPIRIT_PREAMBLE_LENGTH PKT_PREAMBLE_LENGTH_04BYTES #define SPIRIT_PREAMBLE_LENGTH PKT_PREAMBLE_LENGTH_04BYTES
#define SPIRIT_SYNC_LENGTH PKT_SYNC_LENGTH_4BYTES #define SPIRIT_SYNC_LENGTH PKT_SYNC_LENGTH_4BYTES
#define SPIRIT_SYNC_WORD 0x88888888 #define SPIRIT_SYNC_WORD 0x88888888
#define SPIRIT_LENGTH_TYPE PKT_LENGTH_VAR
#define SPIRIT_LENGTH_WIDTH 8
#define SPIRIT_CRC_MODE PKT_CRC_MODE_16BITS_2 #define SPIRIT_CRC_MODE PKT_CRC_MODE_16BITS_2
#define SPIRIT_CONTROL_LENGTH PKT_CONTROL_LENGTH_0BYTES #define SPIRIT_CONTROL_LENGTH PKT_CONTROL_LENGTH_0BYTES
#define SPIRIT_EN_ADDRESS S_DISABLE
#define SPIRIT_EN_FEC S_DISABLE #define SPIRIT_EN_FEC S_DISABLE
#define SPIRIT_EN_WHITENING S_DISABLE #define SPIRIT_EN_WHITENING S_DISABLE
#define SPIRIT_MAX_FIFO_LEN 96
#define SPIRIT_RANGE_TYPE RANGE_EXT_NONE /* RANGE_EXT_SKYWORKS */ #define SPIRIT_RANGE_TYPE RANGE_EXT_NONE /* RANGE_EXT_SKYWORKS */
/* The MAX_PACKET_LEN is an arbitrary value used to define the two array
* spirit_txbuf and spirit_rxbuf.
*
* The SPIRIT1 supports with its packet handler a length of 65,535 bytes,
* and in direct mode (without packet handler) there is no limit of data.
*/
#define SPIRIT_MAX_PACKET_LEN SPIRIT_MAX_FIFO_LEN
/* Spirit1 IC version */ /* Spirit1 IC version */
#define SPIRIT_VERSION SPIRIT_VERSION_3_0 #define SPIRIT_VERSION SPIRIT_VERSION_3_0

View File

@ -62,6 +62,7 @@
#include <nuttx/wireless/spirit.h> #include <nuttx/wireless/spirit.h>
#include <nuttx/wireless/pktradio.h> #include <nuttx/wireless/pktradio.h>
#include "spirit_config.h"
#include "spirit_types.h" #include "spirit_types.h"
#include "spirit_general.h" #include "spirit_general.h"
#include "spirit_irq.h" #include "spirit_irq.h"
@ -95,7 +96,52 @@
#endif #endif
#ifndef CONFIG_SPIRIT_PKTLEN #ifndef CONFIG_SPIRIT_PKTLEN
# define CONFIG_SPIRIT_PKTLEN 96 # define CONFIG_SPIRIT_PKTLEN SPIRIT_MAX_FIFO_LEN
#endif
#if CONFIG_SPIRIT_PKTLEN > SPIRIT_MAX_FIFO_LEN && \
!defined(CONFIG_SPIRIT_FIFOS)
# error Without CONFIG_SPIRIT_FIFOS, need CONFIG_SPIRIT_PKTLEN <= SPIRIT_MAX_FIFO_LEN
# undef CONFIG_SPIRIT_PKTLEN
# define CONFIG_SPIRIT_PKTLEN SPIRIT_MAX_FIFO_LEN
#endif
/* The packet length width field specifies log2 or the number of bits used to
* transfer the packet length.
*/
#if CONFIG_SPIRIT_PKTLEN < 4
# define PKT_LENGTH_WIDTH (2 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 8
# define PKT_LENGTH_WIDTH (3 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 16
# define PKT_LENGTH_WIDTH (4 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 32
# define PKT_LENGTH_WIDTH (5 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 64
# define PKT_LENGTH_WIDTH (6 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 128
# define PKT_LENGTH_WIDTH (7 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 256
# define PKT_LENGTH_WIDTH (8 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 512
# define PKT_LENGTH_WIDTH (9 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 1024
# define PKT_LENGTH_WIDTH (10 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 2048
# define PKT_LENGTH_WIDTH (11 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 4096
# define PKT_LENGTH_WIDTH (12 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 8192
# define PKT_LENGTH_WIDTH (13 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 16384
# define PKT_LENGTH_WIDTH (14 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 32768
# define PKT_LENGTH_WIDTH (15 - 1)
#elif CONFIG_SPIRIT_PKTLEN < 65536
# define PKT_LENGTH_WIDTH (16 - 1)
#else
# error Invalid CONFIG_SPIRIT_PKTLEN
#endif #endif
/* Default node address */ /* Default node address */
@ -245,11 +291,11 @@ static const struct pktbasic_init_s g_pktbasic_init =
SPIRIT_SYNC_WORD, /* syncwords */ SPIRIT_SYNC_WORD, /* syncwords */
SPIRIT_PREAMBLE_LENGTH, /* premblen */ SPIRIT_PREAMBLE_LENGTH, /* premblen */
SPIRIT_SYNC_LENGTH, /* synclen */ SPIRIT_SYNC_LENGTH, /* synclen */
SPIRIT_LENGTH_TYPE, /* fixvarlen */ PKT_LENGTH_VAR, /* fixvarlen, variable packet length */
SPIRIT_LENGTH_WIDTH, /* pktlenwidth */ PKT_LENGTH_WIDTH, /* pktlenwidth from CONFIG_SPIRIT_PKTLEN */
SPIRIT_CRC_MODE, /* crcmode */ SPIRIT_CRC_MODE, /* crcmode */
SPIRIT_CONTROL_LENGTH, /* ctrllen */ SPIRIT_CONTROL_LENGTH, /* ctrllen */
SPIRIT_EN_ADDRESS, /* txdestaddr */ S_ENABLE, /* txdestaddr, need to send address */
SPIRIT_EN_FEC, /* fec */ SPIRIT_EN_FEC, /* fec */
SPIRIT_EN_WHITENING /* datawhite */ SPIRIT_EN_WHITENING /* datawhite */
}; };
@ -543,7 +589,6 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv)
goto errout_with_iob; goto errout_with_iob;
} }
#ifndef CONFIG_SPIRIT_PROMISICUOUS
/* Set the destination address */ /* Set the destination address */
DEBUGASSERT(pktmeta->pm_dest.pa_addrlen == 1); DEBUGASSERT(pktmeta->pm_dest.pa_addrlen == 1);
@ -557,7 +602,6 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv)
pktmeta->pm_dest.pa_addr[0], ret); pktmeta->pm_dest.pa_addr[0], ret);
goto errout_with_iob; goto errout_with_iob;
} }
#endif
/* Enable CSMA */ /* Enable CSMA */
@ -1070,6 +1114,8 @@ static void spirit_interrupt_work(FAR void *arg)
wlinfo("Data discarded: Node addr=%02x RX dest addr=%02x\n", wlinfo("Data discarded: Node addr=%02x RX dest addr=%02x\n",
spirit_pktcommon_get_nodeaddress(spirit), spirit_pktcommon_get_nodeaddress(spirit),
spirit_pktcommon_get_rxdestaddr(spirit)); spirit_pktcommon_get_rxdestaddr(spirit));
wlinfo(" CRC error=%u RX timeout=%u\n",
irqstatus.IRQ_CRC_ERROR, irqstatus.IRQ_RX_TIMEOUT);
DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO)); DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO));
priv->state = DRIVER_STATE_IDLE; priv->state = DRIVER_STATE_IDLE;
@ -1094,10 +1140,6 @@ static void spirit_interrupt_work(FAR void *arg)
DEBUGVERIFY(spirit_waitstatus(spirit, MC_STATE_RX, 1)); DEBUGVERIFY(spirit_waitstatus(spirit, MC_STATE_RX, 1));
} }
/* Re-enable the interrupt. */
DEBUGASSERT(priv->lower != NULL && priv->lower->enable != NULL);
priv->lower->enable(priv->lower, true);
spirit_unlock(priv); spirit_unlock(priv);
} }
@ -1128,15 +1170,8 @@ static int spirit_interrupt(int irq, FAR void *context, FAR void *arg)
* this case, we will defer processing to the worker thread. This is also * this case, we will defer processing to the worker thread. This is also
* much kinder in the use of system resources and is, therefore, probably * much kinder in the use of system resources and is, therefore, probably
* a good thing to do in any event. * a good thing to do in any event.
*
* Notice that further GPIO interrupts are disabled until the work is
* actually performed. This is to prevent overrun of the worker thread.
* Interrupts are re-enabled in spirit_interrupt_work() when the work is
* completed.
*/ */
priv->lower->enable(priv->lower, false);
return work_queue(HPWORK, &priv->irqwork, spirit_interrupt_work, return work_queue(HPWORK, &priv->irqwork, spirit_interrupt_work,
(FAR void *)priv, 0); (FAR void *)priv, 0);
} }
@ -1398,8 +1433,7 @@ static int spirit_ifup(FAR struct net_driver_s *dev)
goto error_with_ifalmostup; goto error_with_ifalmostup;
} }
#ifndef CONFIG_SPIRIT_PROMISICUOUS /* Instantiate the assigned node address in hardware */
/* Instantiate the assigned node address in harsware*/
DEBUGASSERT(dev->d_mac.sixlowpan.nv_addrlen == 1); DEBUGASSERT(dev->d_mac.sixlowpan.nv_addrlen == 1);
wlinfo("Set node address to %02x\n", wlinfo("Set node address to %02x\n",
@ -1412,7 +1446,6 @@ static int spirit_ifup(FAR struct net_driver_s *dev)
wlerr("ERROR: Failed to set node address: %d\n", ret); wlerr("ERROR: Failed to set node address: %d\n", ret);
goto error_with_ifalmostup; goto error_with_ifalmostup;
} }
#endif
/* Set and activate a timer process */ /* Set and activate a timer process */

View File

@ -41,6 +41,7 @@
* Included Files * Included Files
******************************************************************************/ ******************************************************************************/
#define SPIRIT_MAX_FIFO_LEN 96
#define DOUBLE_XTAL_THR 30000000 #define DOUBLE_XTAL_THR 30000000
#endif /* __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_CONFIG_H */ #endif /* __DRIVERS_WIRELESS_SPIRIT_INCLUDE_SPIRIT_CONFIG_H */

View File

@ -98,8 +98,6 @@
* Pre-processor Definitions * Pre-processor Definitions
******************************************************************************/ ******************************************************************************/
/* PktBasic_Exported_Constants Pkt Basic Exported Constants */
#define IS_BASIC_LENGTH_WIDTH_BITS IS_PKT_LENGTH_WIDTH_BITS #define IS_BASIC_LENGTH_WIDTH_BITS IS_PKT_LENGTH_WIDTH_BITS
/* Macros used in assertions */ /* Macros used in assertions */

View File

@ -2081,6 +2081,7 @@
* 22 | PM start-up timer expiration * 22 | PM start-up timer expiration
* 23 | XO settling timeout * 23 | XO settling timeout
*/ */
#define IRQ_MASK2_BASE ((uint8_t)0x91) /* IRQ_MASK is split into 4 registers */ #define IRQ_MASK2_BASE ((uint8_t)0x91) /* IRQ_MASK is split into 4 registers */
#define IRQ_MASK2_READY ((uint8_t)0x01) /* IRQ: READY state */ #define IRQ_MASK2_READY ((uint8_t)0x01) /* IRQ: READY state */

View File

@ -286,7 +286,7 @@ int spirit_reg_read(FAR struct spirit_library_s *spirit, uint8_t regaddr,
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
@ -342,7 +342,7 @@ int spirit_reg_write(FAR struct spirit_library_s *spirit, uint8_t regaddr,
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
@ -404,7 +404,7 @@ int spirit_reg_modify(FAR struct spirit_library_s *spirit, uint8_t regaddr,
/* Modify the register value */ /* Modify the register value */
regval &= ~clrbits; regval &= ~clrbits;
regval |= ~setbits; regval |= setbits;
/* Setup the header byte for the write operation */ /* Setup the header byte for the write operation */
@ -421,7 +421,7 @@ int spirit_reg_modify(FAR struct spirit_library_s *spirit, uint8_t regaddr,
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
@ -472,7 +472,7 @@ int spirit_command(FAR struct spirit_library_s *spirit, uint8_t cmd)
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
@ -520,7 +520,7 @@ int spirit_fifo_read(FAR struct spirit_library_s *spirit, FAR uint8_t *buffer,
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
@ -575,7 +575,7 @@ int spirit_fifo_write(FAR struct spirit_library_s *spirit,
SPI_EXCHANGE(spirit->spi, header, status, 2); SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */ /* Update Spirit status. 16-bit status is returned MS byte first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1]; spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];