Spirit: Fix typos in conditional compilation. Add debug output. Remove extra clear of pending interrupts, could cause missing interrupts. Add spirit_reg_modify() which is not currently used.

This commit is contained in:
Gregory Nutt 2017-08-03 09:55:30 -06:00
parent 8a785c4b66
commit b3e788e11b
4 changed files with 115 additions and 10 deletions

View File

@ -271,11 +271,11 @@ static const struct spirit_csma_init_s g_csma_init =
8 /* BU prescaler */
};
#ifdef CONFIG_SPIRIT_MULTICAST
#ifdef CONFIG_SPIRIT_PROMISICUOUS
static struct pktbasic_addr_s g_addrinit =
{
S_DISABLE, /* Disable filtering on node address */
SPIRIT_NODE_ADDR /* Note address (Temporary, until assigned) */
SPIRIT_NODE_ADDR /* Node address (Temporary, until assigned) */
S_DISABLE, /* Disable filtering on multicast address */
0xee, /* Multicast address */
S_DISABLE, /* Disable filtering on broadcast address */
@ -285,7 +285,7 @@ static struct pktbasic_addr_s g_addrinit =
static struct pktbasic_addr_s g_addrinit =
{
S_ENABLE, /* Enable filtering on node address */
SPIRIT_NODE_ADDR, /* Note address (Temporary, until assigned) */
SPIRIT_NODE_ADDR, /* Node address (Temporary, until assigned) */
#ifdef CONFIG_SPIRIT_MULTICAST
S_ENABLE, /* Enable filtering on multicast address */
#else
@ -523,7 +523,7 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv)
goto errout_with_iob;
}
#ifndef CONFIG_SPIRIT_PROMISCOUS
#ifndef CONFIG_SPIRIT_PROMISICUOUS
/* Set the destination address */
DEBUGASSERT(pktmeta->pm_dest.pa_addrlen == 1);
@ -839,11 +839,14 @@ static void spirit_interrupt_work(FAR void *arg)
DEBUGASSERT(priv != NULL);
spirit = &priv->spirit;
/* Get the interrupt source from radio */
/* Get the set of pending ineterrupts from the radio.
* NOTE: The pending interrupts are cleared as a side-effect of reading
* the IRQ status register.
*/
spirit_lock(priv);
DEBUGVERIFY(spirit_irq_get_pending(spirit, &irqstatus));
DEBUGVERIFY(spirit_irq_clr_pending(spirit));
wlinfo("Pending: %08lx\n", *(FAR unsigned long *)&irqstatus);
/* Process the Spirit1 interrupt */
/* First check for errors */
@ -1040,8 +1043,12 @@ static void spirit_interrupt_work(FAR void *arg)
/* IRQ_RX_DATA_DISC indicates that Rx data was discarded */
if (irqstatus.IRQ_RX_DATA_DISC)
if (irqstatus.IRQ_RX_DATA_DISC != 0)
{
wlinfo("Data discarded: Node addr=%02x RX dest addr=%02x\n",
spirit_pktcommon_get_nodeaddress(spirit),
spirit_pktcommon_get_rxdestaddr(spirit));
DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO));
priv->state = DRIVER_STATE_IDLE;
NETDEV_RXDROPPED(&priv->radio.r_dev);
@ -1057,7 +1064,7 @@ static void spirit_interrupt_work(FAR void *arg)
DEBUGVERIFY(spirit_command(spirit, CMD_RX));
/* Wait for Spirit to enter the Tx state (or timeut) */
/* Wait for Spirit to enter the Rx state (or timeut) */
DEBUGVERIFY(spirit_waitstatus(spirit, MC_STATE_RX, 1));
}
@ -1364,7 +1371,7 @@ static int spirit_ifup(FAR struct net_driver_s *dev)
goto error_with_ifalmostup;
}
#ifndef CONFIG_SPIRIT_PROMISCOUS
#ifndef CONFIG_SPIRIT_PROMISICUOUS
/* Instantiate the assigned node address in harsware*/
DEBUGASSERT(dev->d_mac.sixlowpan.nv_addrlen == 1);

View File

@ -121,6 +121,29 @@ int spirit_reg_read(FAR struct spirit_library_s *spirit, uint8_t regaddr,
int spirit_reg_write(FAR struct spirit_library_s *spirit, uint8_t regaddr,
FAR const uint8_t *buffer, unsigned int buflen);
/******************************************************************************
* Name: spirit_reg_modify
*
* Description:
* Perform atomic read/modify/write on a single SPIRIT1 register. This is
* atomic only in the sense that other accesses to the SPI bus are
* prohibited throughout the operation.
*
* Input parameters:
* spirit - Reference to an instance of the driver state stucture.
* regaddr - Base register's address to write
* clrbits - Bits to clear in the register
* setbits - Bits to set in the regiser
*
* Returned Value:
* Zero (OK) is returned on success. A negated errno value is returned on
* any failure. On success, spirit->state is updated.
*
******************************************************************************/
int spirit_reg_modify(FAR struct spirit_library_s *spirit, uint8_t regaddr,
uint8_t setbits, uint8_t clrbits);
/******************************************************************************
* Name: spirit_command
*

View File

@ -219,7 +219,8 @@ int spirit_irt_get_mask(FAR struct spirit_library_s *spirit,
*
* Description:
* Fills a pointer to a structure of struct spirit_irqset_s type with the
* content of the IRQ_STATUS registers.
* content of the IRQ_STATUS registers. NOTE: Status bits will be cleared
* after they are read.
*
* Input Parameters:
* spirit - Reference to a Spirit library state structure instance

View File

@ -357,6 +357,80 @@ int spirit_reg_write(FAR struct spirit_library_s *spirit, uint8_t regaddr,
return OK;
}
/******************************************************************************
* Name: spirit_reg_modify
*
* Description:
* Perform atomic read/modify/write on a single SPIRIT1 register.
*
* Input parameters:
* spirit - Reference to an instance of the driver state stucture.
* regaddr - Base register's address to write
* clrbits - Bits to clear in the register
* setbits - Bits to set in the regiser
*
* Returned Value:
* Zero (OK) is returned on success. A negated errno value is returned on
* any failure. On success, spirit->state is updated.
*
******************************************************************************/
int spirit_reg_modify(FAR struct spirit_library_s *spirit, uint8_t regaddr,
uint8_t setbits, uint8_t clrbits)
{
uint8_t header[2];
uint8_t status[2];
uint8_t regval;
/* Setup the header byte to read the register */
header[0] = READ_HEADER;
header[1] = regaddr;
/* Lock the SPI bus and select the Spirit device */
spirit_lock(spirit->spi);
SPI_SELECT(spirit->spi, SPIDEV_WIRELESS(0), true);
/* Write the header bytes (ignoring the returned SPIRIT1 status bytes) */
SPI_SNDBLOCK(spirit->spi, header, 2);
/* Read the register value */
regval = SPI_SEND(spirit->spi, 0xff);
spirit_regdebug("READ", header, &regval, 1);
/* Modify the register value */
regval &= ~clrbits;
regval |= ~setbits;
/* Setup the header byte for the write operation */
header[0] = WRITE_HEADER;
header[1] = regaddr;
spirit_regdebug("WRITE", header, &regval, 1);
/* Write the header bytes and read the SPIRIT1 status bytes */
SPI_EXCHANGE(spirit->spi, header, status, 2);
/* Update Spirit status. 16-bit status is returned MS bit first */
spirit->u.u16 = ((uint16_t)status[0] << 8) | (uint16_t)status[1];
/* Write the register value */
(void)SPI_SEND(spirit->spi, regval);
/* Deselect the Spirit device and return the result */
SPI_SELECT(spirit->spi, SPIDEV_WIRELESS(0), false);
spirit_unlock(spirit->spi);
return OK;
}
/******************************************************************************
* Name: spirit_command
*