Skip to content
Commits on Source (5)
......@@ -21,6 +21,15 @@ config GENERICRADIO_SI4463
if GENERICRADIO_SI4463
config GENERICRADIO_SI4463_ANTSWITCH_ALT
bool "Alternate TX/RX switching using dedicated GPIO setup"
default n
---help---
The si4463 has the ability to drive GPIO pins to activate PA/LNA, but these are only active high,
with no internal way to invert the signals. If inverted signals are required, and you cant invert
the signals with external hardware, use this option, but be aware that TX/RX switching time will
be slower since a GPIO setup command has to be sent via before/after each transmission and reception.
choice
prompt "Packet framing"
default GENERICRADIO_SI4463_FRAMING_L2B
......
......@@ -106,6 +106,12 @@
#define SI4463_APPLY_TXFILT (1 << 10)
#define SI4463_APPLY_RXFILT (1 << 11)
/* Antenna switch states */
#define ANTENNA_IDLE 0
#define ANTENNA_TX 1
#define ANTENNA_RX 2
/****************************************************************************
* Types
****************************************************************************/
......@@ -127,6 +133,11 @@ struct si4463_dev_s
defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L2L )
uint8_t header[2];
#endif
#if defined(CONFIG_GENERICRADIO_SI4463_ANTSWITCH_ALT)
uint8_t papin; /* Remember which pin activates the PA */
uint8_t lnapin; /* Remember which pin activates the LNA */
bool activelow; /* TRUE if the PA and LNA use active low signals */
#endif
/* Requested parameters, input to modem calculator */
uint8_t requested_modtype; /* Requested modulation */
......@@ -142,14 +153,6 @@ struct si4463_dev_s
* Private function prototypes
****************************************************************************/
#if 0
static void si4463_lock (FAR struct spi_dev_s *spi);
static int si4463_initialize(FAR struct si4463_dev_s *dev, int txpin,
int rxpin);
static void si4463_irqworker (FAR void *arg);
static int si4463_interrupt (int irq, FAR void *context, FAR void *arg);
#endif
static int si4463_setbasefreq (FAR struct genradio_dev_s *dev,
uint32_t Hz);
static int si4463_setchanspacing (FAR struct genradio_dev_s *dev,
......@@ -811,6 +814,63 @@ static int si4463_getadcreading(FAR struct si4463_dev_s *dev, int pin,
return 0;
}
/****************************************************************************
* Name: si4463_packetconfig
*
* Description: Switch the TX/RX switch between IDLE/TX/RX positions. This is
* only used when we don't rely on the automatic switching made by the chip.
*
****************************************************************************/
static int si4463_antennaswitch(FAR struct si4463_dev_s *dev, int pos)
{
#if defined(CONFIG_GENERICRADIO_SI4463_ANTSWITCH_ALT)
int i;
int ret;
struct si4463_cmdrsp_gpiopincfg_s gpio;
for(i=0;i<4;i++)
{
gpio.gpio[i] = PINCFG_DONOTHING;
}
if(pos == ANTENNA_IDLE)
{
gpio.gpio[dev->papin ] = dev->activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0; // disabled
gpio.gpio[dev->lnapin] = dev->activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0; // disabled
_info("ant -> idle\n");
}
else if(pos == ANTENNA_TX)
{
gpio.gpio[dev->papin ] = dev->activelow ? PINCFG_DRIVE0 : PINCFG_DRIVE1; // enabled
gpio.gpio[dev->lnapin] = dev->activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0; // disabled
_info("ant -> tx\n");
}
else if(pos == ANTENNA_RX)
{
gpio.gpio[dev->papin ] = dev->activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0; // disabled
gpio.gpio[dev->lnapin] = dev->activelow ? PINCFG_DRIVE0 : PINCFG_DRIVE1; // enabled
_info("ant -> rx\n");
}
gpio.nirq = PINCFG_DONOTHING;
gpio.sdo = PINCFG_DONOTHING;
gpio.genconfig = DRV_STRENGTH_HIGH;
ret = si4463_command(dev, SI4463_CMD_GPIO_PIN_CFG,
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s),
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s));
if (ret == 0)
{
ret = si4463_getchipstatus(dev);
}
if(ret != 0)
{
_err("antenna switch setup failed (errno %d)\n", ret);
return ret;
}
#endif
return 0;
}
/****************************************************************************
* Name: si4463_packetconfig
*
......@@ -951,7 +1011,7 @@ static int si4463_packetconfig(FAR struct si4463_dev_s *dev)
****************************************************************************/
static int si4463_initialize(FAR struct si4463_dev_s *dev,
int papin, int lnapin)
int papin, int lnapin, bool activelow)
{
int ret;
#ifndef CONFIG_GENERICRADIO_SI4463_USE_WDS_CONFIG
......@@ -1009,7 +1069,7 @@ static int si4463_initialize(FAR struct si4463_dev_s *dev,
while(*config_ptr != 0)
{
uint8_t len = *config_ptr; config_ptr++;
_info("Apply WDS config len = %d\n", len);
_info("Apply WDS config len= %d cmd= %02X\n", len, *config_ptr);
ret = si4463_command(dev, *config_ptr, (uint8_t*)(config_ptr+1), len-1, NULL, 0);
if (ret == 0)
{
......@@ -1085,35 +1145,7 @@ static int si4463_initialize(FAR struct si4463_dev_s *dev,
_err("Could not define GLOBAL XO TUNE (errno %d)\n", ret);
return ret;
}
//#endif //CONFIG_GENERICRADIO_SI4463_USE_WDS_CONFIG
/* Configure PA/LNA pins and IRQ line */
for(i=0;i<4;i++)
{
gpio.gpio[i] = PINCFG_DONOTHING;
}
gpio.gpio[papin ] = PINCFG_EN_PA | PINCFG_PULL_EN;
gpio.gpio[lnapin] = PINCFG_EN_LNA | PINCFG_PULL_EN;
gpio.nirq = PINCFG_NIRQ_NIRQ;
gpio.sdo = PINCFG_DONOTHING;
gpio.genconfig = DRV_STRENGTH_HIGH;
_info("configure gpios...\n");
ret = si4463_command(dev, SI4463_CMD_GPIO_PIN_CFG,
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s),
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s));
if (ret == 0)
{
ret = si4463_getchipstatus(dev);
}
if(ret != 0)
{
_err("GPIO config failed (errno %d)\n", ret);
return ret;
}
//#ifndef CONFIG_GENERICRADIO_SI4463_USE_WDS_CONFIG
/* Setup global config */
_info("global config...\n");
......@@ -1142,6 +1174,41 @@ static int si4463_initialize(FAR struct si4463_dev_s *dev,
#endif //CONFIG_GENERICRADIO_SI4463_USE_WDS_CONFIG
/* Configure PA/LNA pins and IRQ line */
for(i=0;i<4;i++)
{
gpio.gpio[i] = PINCFG_DONOTHING;
}
#if defined(CONFIG_GENERICRADIO_SI4463_ANTSWITCH_ALT)
dev->papin = papin;
dev->lnapin = lnapin;
dev->activelow = activelow;
/* Just set both pins to idle */
gpio.gpio[papin ] = activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0;
gpio.gpio[lnapin] = activelow ? PINCFG_DRIVE1 : PINCFG_DRIVE0;
#else
/* Use automatic PA/LNA activation by the chip - only active high */
gpio.gpio[papin ] = activelow ? PINCFG_RX_STATE : PINCFG_TX_STATE;
gpio.gpio[lnapin] = activelow ? PINCFG_TX_STATE : PINCFG_RX_STATE;
#endif
gpio.nirq = PINCFG_NIRQ_NIRQ;
gpio.sdo = PINCFG_DONOTHING;
gpio.genconfig = DRV_STRENGTH_HIGH;
_info("configure gpios...\n");
ret = si4463_command(dev, SI4463_CMD_GPIO_PIN_CFG,
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s),
&gpio, sizeof(struct si4463_cmdrsp_gpiopincfg_s));
if (ret == 0)
{
ret = si4463_getchipstatus(dev);
}
if(ret != 0)
{
_err("GPIO config failed (errno %d)\n", ret);
return ret;
}
/* Read VBAT and TEMP */
_info("Read ADCs...\n");
......@@ -1176,51 +1243,47 @@ static int si4463_initialize(FAR struct si4463_dev_s *dev,
ret = si4463_setprop_byte(dev, SI4463_PROP_FRR_CTL_A_MODE, FRR_INT_PH_PEND);
_info("Configure Interrupts\n");
#if 1
/* Setup IRQs: TX complete, data received, RX complete, RX error. */
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_ENABLE, INT_CTL_PH_INT);
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_ENABLE, INT_CTL_PH_INT | INT_CTL_MODEM_INT);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_ENABLE failed\n", ret);
return ret;
}
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_PH_ENABLE,
INT_CTL_PH_RX_FIFO_ALMOST_FULL |
INT_CTL_PH_PACKET_RX |
INT_CTL_PH_PACKET_SENT |
INT_CTL_PH_CRC_ERROR);
INT_CTL_PH_RX_FIFO_ALMOST_FULL | /*0x01*/
// INT_CTL_PH_TX_FIFO_ALMOST_EMPTY| /*0x02*/
INT_CTL_PH_CRC_ERROR | /*0x08*/
INT_CTL_PH_PACKET_RX | /*0x10*/
INT_CTL_PH_PACKET_SENT | /*0x20*/
// INT_CTL_PH_FILTER_MISS | /*0x40*/
// INT_CTL_PH_FILTER_MATCH | /*0x80*/
0);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_PH_ENABLE failed\n", ret);
return ret;
}
#else
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_ENABLE, INT_CTL_PH_INT | INT_CTL_CHIP_INT | INT_CTL_MODEM_INT);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_ENABLE failed\n", ret);
return ret;
}
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_PH_ENABLE, 0xFB);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_PH_ENABLE failed\n", ret);
return ret;
}
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_MODEM_ENABLE, 0xFF);
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_MODEM_ENABLE,
// INT_CTL_MODEM_SYNC_DETECT | /*0x01*/
// INT_CTL_MODEM_PREAMBLE_DETECT | /*0x02*/
INT_CTL_MODEM_INVALID_PREAMBLE | /*0x04*/
INT_CTL_MODEM_RSSI | /*0x08*/
INT_CTL_MODEM_RSSI_JUMP | /*0x10*/
INT_CTL_MODEM_INVALID_SYNC | /*0x20*/
INT_CTL_MODEM_POSTAMBLE_DETECT | /*0x40*/
INT_CTL_MODEM_RSSI_LATCH | /*0x80*/
0);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_MODEM_ENABLE failed\n", ret);
return ret;
}
ret = si4463_setprop_byte(dev, SI4463_PROP_INT_CTL_CHIP_ENABLE, 0x7F);
if(ret != 0)
{
_err("SI4463_PROP_INT_CTL_CHIP_ENABLE failed\n", ret);
return ret;
}
#endif
return ret; /* OK */
}
......@@ -2064,7 +2127,12 @@ static int si4463_rxenable(FAR struct genradio_dev_s *dev, int state)
{
_info("disable rx\n");
/* We are called to STOP receiving */
ret = si4463_changestate(priv, NEWSTATE_SPI_ACTIVE);
ret = si4463_antennaswitch(priv, ANTENNA_IDLE);
if (ret != 0)
{
_err("antenna did not switch to IDLE: %d\n", ret);
}
ret = si4463_changestate(priv, NEWSTATE_READY);
if (ret != 0)
{
_err("rx disable failed: %d\n", ret);
......@@ -2074,8 +2142,14 @@ static int si4463_rxenable(FAR struct genradio_dev_s *dev, int state)
_info("called, buf=%p len=%d chan=%d\n", dev->rxbuf, dev->rxlen, dev->channel);
/* enable RX interrupts */
/* Flush RX fifo before reception */
ret = si4463_getfifoinfo(priv, false, true, NULL, NULL);
if(ret != 0)
{
_err("failed to flush RX FIFO\n");
return ret;
}
/* Setup field 2 length to the MAX receivable length */
ret = si4463_setprop_short(priv, SI4463_PROP_PKT_FIELD_2_LENGTH_0, 0x1FFF);
if(ret != 0)
......@@ -2089,20 +2163,21 @@ static int si4463_rxenable(FAR struct genradio_dev_s *dev, int state)
cmd_rx.condition = STARTRX_CONDITION_IMMEDIATE;
cmd_rx.rx_len = 0;
#if 1
cmd_rx.next_state1 = STARTRX_STATE_READY;
cmd_rx.next_state2 = STARTRX_STATE_READY;
cmd_rx.next_state3 = STARTRX_STATE_READY;
#else
cmd_rx.next_state1 = STARTRX_STATE_RX;
cmd_rx.next_state2 = STARTRX_STATE_READY;
cmd_rx.next_state3 = STARTRX_STATE_READY;
#endif
cmd_rx.next_state1 = STARTRX_STATE_RX; /* State after RX timeout */
cmd_rx.next_state2 = STARTRX_STATE_READY; /* State after RX valid */
cmd_rx.next_state3 = STARTRX_STATE_READY; /* State after RX invalid */
/* Prepare reception state: no bytes received yet (in public and private states)*/
dev ->rxdone = 0;
priv->hdr_done = false;
ret = si4463_antennaswitch(priv, ANTENNA_RX);
if (ret != 0)
{
_err("antenna did not switch to RX: %d\n", ret);
return ret;
}
/* Go to RX mode */
ret = si4463_command(priv, SI4463_CMD_START_RX,
......@@ -2130,7 +2205,10 @@ static void si4463_irqworker(FAR void *arg)
{
struct si4463_dev_s *priv = (struct si4463_dev_s*)arg;
uint8_t ph,mo,ch;
volatile int ret;
int ret;
uint8_t rxlen;
uint32_t room;
bool flush;
/* Get IRQ status */
......@@ -2140,14 +2218,19 @@ static void si4463_irqworker(FAR void *arg)
_err("CRITICAL: Could not read interrupt flags\n");
goto done;
}
_info("!%02X %02X %02X\n", ph,mo,ch);
//_info("!%02X %02X %02X\n", ph,mo,ch);
/* Dispatch */
if( (ph & INTSTATUS_PH_PACKET_SENT) == INTSTATUS_PH_PACKET_SENT)
{
int val,ret;
int val;
_info("!txc\n");
ret = si4463_antennaswitch(priv, ANTENNA_IDLE);
if(ret != 0)
{
_err("antenna did not switch to IDLE: %d\n", ret);
}
priv->genradio.txstatus = 0;
ret = nxsem_getvalue(&priv->genradio.txsem, &val);
if (ret == OK && val <= 0)
......@@ -2159,9 +2242,7 @@ static void si4463_irqworker(FAR void *arg)
if( (ph & INTSTATUS_PH_RX_FIFO_ALMOST_FULL) == INTSTATUS_PH_RX_FIFO_ALMOST_FULL)
{
/* RX data is available, take it from fifo and store in target buf*/
uint32_t room = priv->genradio.rxlen - priv->genradio.rxdone; /* This is how many bytes can be received */
uint8_t rxlen;
bool flush = false;
room = priv->genradio.rxlen - priv->genradio.rxdone; /* This is how many bytes can be received */
uint32_t rxexpected;
_info("!rx\n");
......@@ -2176,42 +2257,24 @@ static void si4463_irqworker(FAR void *arg)
* If we have received enough data, read it.
* TODO: The packet length should not be returned to the user but received live
*/
#if defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L1 )
if(rxlen < 1)
if(rxlen < sizeof(priv->header))
{
return; //Not enough data received (unlikely)
}
si4463_readrxfifo(priv, priv->header, sizeof(priv->header));
rxlen -= 1;
rxlen -= sizeof(priv->header); //Remove the header length from the available fifo data length
#if defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L1 )
rxexpected = priv->header[0];
rxexpected += 1; /* this is the length of the header itself */
#elif defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L2B )
if(rxlen < 2)
{
return; //Not enough data received (unlikely)
}
si4463_readrxfifo(priv, priv->header, sizeof(priv->header));
rxlen -= 2;
rxexpected = priv->header[0];
rxexpected <<= 8;
rxexpected |= priv->header[1];
rxexpected += 2; /* this is the length of the header itself */
#elif defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L2L )
if(rxlen < 2)
{
return; //Not enough data received (unlikely)
}
si4463_readrxfifo(priv, priv->header, sizeof(priv->header));
rxlen -= 2;
rxexpected = priv->header[1];
rxexpected <<= 8;
rxexpected |= priv->header[2];
rxexpected += 2; /* this is the length of the header itself */
#endif
_info("total on-air packet length: %d\n", rxexpected);
_info("payload length: %d\n", rxexpected);
priv->hdr_done = true;
}
......@@ -2219,6 +2282,7 @@ static void si4463_irqworker(FAR void *arg)
* will still receive it in full (and discard data that does not fit in
* the user buffer )
*/
flush = false;
if(rxlen > room)
{
rxlen = room;
......@@ -2237,9 +2301,32 @@ static void si4463_irqworker(FAR void *arg)
if( (ph & INTSTATUS_PH_PACKET_RX) == INTSTATUS_PH_PACKET_RX)
{
int val,ret;
int val;
/* Packet reception is complete. TODO read RSSI */
_info("!rxc\n");
/* FIFO may still contain more data */
ret = si4463_getfifoinfo(priv, false, false, NULL, &rxlen);
room = priv->genradio.rxlen - priv->genradio.rxdone; /* This is how many bytes can stil be received */
flush = false;
if(rxlen > room)
{
rxlen = room;
flush = true;
}
si4463_readrxfifo(priv, priv->genradio.rxbuf + priv->genradio.rxdone, rxlen);
priv->genradio.rxdone += rxlen;
if(flush)
{
/* Flush the RX fifo since this data cannot be stored in the user buffer */
si4463_getfifoinfo(priv, false, true, NULL, NULL);
}
/* Reception is complete */
priv->genradio.rxlen = priv->genradio.rxdone;
/* Signal the RX waiter semaphore ONLY if it's locked */
......@@ -2248,12 +2335,11 @@ static void si4463_irqworker(FAR void *arg)
{
nxsem_post(&priv->genradio.rxsem);
}
ret = si4463_changestate(priv, NEWSTATE_READY);
}
if( (ph & INTSTATUS_PH_CRC_ERROR) == INTSTATUS_PH_CRC_ERROR)
{
int val,ret;
int val;
_info("!crc\n");
priv->genradio.rxlen = -EIO;
......@@ -2267,18 +2353,20 @@ static void si4463_irqworker(FAR void *arg)
}
//modem ints
#if 0
if( (mo & INTSTATUS_MODEM_SYNC_DETECT) == INTSTATUS_MODEM_SYNC_DETECT)
{
_info("!sync\n");
_info("!sync\n"); /* Happens before each packet */
}
if( (mo & INTSTATUS_MODEM_PREAMBLE_DETECT) == INTSTATUS_MODEM_PREAMBLE_DETECT)
{
_info("!pre\n");
_info("!pre\n"); /* Happens before each packet */
}
if( (mo & INTSTATUS_MODEM_INVALID_PREAMBLE) == INTSTATUS_MODEM_INVALID_PREAMBLE)
{
_info("!badpre\n");
}
#endif
if( (mo & INTSTATUS_MODEM_RSSI) == INTSTATUS_MODEM_RSSI)
{
_info("!rssi\n");
......@@ -2305,19 +2393,22 @@ static void si4463_irqworker(FAR void *arg)
{
_info("!fiflow\n");
}
#if 0
if( (ch & INTSTATUS_CHIP_STATE_CHANGE) == INTSTATUS_CHIP_STATE_CHANGE)
{
_info("!state change\n");
_info("!state change\n"); /* Happens after each receive, not interesting */
}
#endif
if( (ch & INTSTTAUS_CHIP_CMD_ERROR) == INTSTTAUS_CHIP_CMD_ERROR)
{
_info("!cmderr\n");
}
#if 0
if( (ch & INTSTATUS_CHIP_READY) == INTSTATUS_CHIP_READY)
{
_info("!rdy\n");
_info("!rdy\n"); //Happens once after radio boot */
}
#endif
done:
/* Re-enable */
priv->lower->enable(priv->lower, TRUE);
......@@ -2424,7 +2515,8 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
*/
/* First of all go to the READY state */
//_info("tx start: channel %d\n", dev->channel);
//_info("tx start: len %d channel %d\n", len, dev->channel);
ret = si4463_changestate(priv, NEWSTATE_READY);
if (ret != 0)
{
......@@ -2435,6 +2527,7 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
len_sent = false;
while(len > 0)
{
/* Get TX FIFO room, flush TX FIFO the first time we will write. */
ret = si4463_getfifoinfo(priv, initial, false, &txroom, NULL);
if (ret != 0)
......@@ -2448,19 +2541,14 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
* the second field. */
if(!len_sent)
{
uint8_t lenbuf[2];
int lenlen = 0;
#if defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L1 )
lenbuf[0] = len & 0xFF;
lenlen = 1;
priv->header[0] = len & 0xFF;
#elif defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L2B )
lenbuf[0] = len >> 8;
lenbuf[1] = len & 0xFF;
lenlen = 2;
priv->header[0] = len >> 8;
priv->header[1] = len & 0xFF;
#elif defined( CONFIG_GENERICRADIO_SI4463_FRAMING_L2L )
lenbuf[0] = len & 0xFF;
lenbuf[1] = len >> 8;
lenlen = 2;
priv->header[0] = len & 0xFF;
priv->header[1] = len >> 8;
#endif
ret = si4463_setprop_short(priv,
SI4463_PROP_PKT_FIELD_2_LENGTH_0, len);
......@@ -2470,14 +2558,14 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
goto done;
}
if(txroom < lenlen)
if(txroom < sizeof(priv->header))
{
_err("no room to write header in fifo\n");
ret = -EIO;
goto done;
}
si4463_writetxfifo(priv, lenbuf, lenlen);
txroom -= lenlen;
si4463_writetxfifo(priv, priv->header, sizeof(priv->header));
txroom -= sizeof(priv->header);
len_sent = true;
}
......@@ -2495,6 +2583,12 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
if(initial)
{
ret = si4463_antennaswitch(priv, ANTENNA_TX);
if(ret != 0)
{
_err("antenna did not switch to TX: %d\n", ret);
goto done;
}
/* Start transmission right after the first fifo fill */
initial = false;
cmd_tx.channel = dev->channel;
......@@ -2521,8 +2615,6 @@ static void si4463_transmit(FAR struct genradio_dev_s *dev,
ret = savelen;
/* TODO enable TX complete/error interrupts */
done:
priv->genradio.txstatus = ret;
return;
......@@ -2549,6 +2641,7 @@ static int si4463_ioctl(FAR struct genradio_dev_s *dev, int cmd, unsigned long a
FAR struct genradio_dev_s *si4463_init(FAR struct spi_dev_s *spi, int devid,
uint32_t xtal, int papin, int lnapin,
bool activelow,
FAR const struct si4463_lower_s *lower)
{
FAR struct si4463_dev_s *dev;
......@@ -2590,7 +2683,7 @@ FAR struct genradio_dev_s *si4463_init(FAR struct spi_dev_s *spi, int devid,
dev->spiid = devid;
dev->xtal = xtal;
ret = si4463_initialize(dev,papin,lnapin);
ret = si4463_initialize(dev, papin, lnapin, activelow);
if(ret != 0)
{
lower->attach(lower, NULL, NULL);
......
/****************************************************************************
* drivers/wireless/generic/si4463.h
*
* Copyright (C) 2017 Sebastien Lorquet. All rights reserved.
* Copyright (C) 2017-2018 Sebastien Lorquet. All rights reserved.
* Author: Sebastien Lorquet <sebastien@lorquet.fr>
*
* Redistribution and use in source and binary forms, with or without
......@@ -181,14 +181,14 @@ end_packed_struct;
#define PINCFG_DRIVE1 3
#define PINCFG_INPUT 4
#define PINCFG_32K_CLK 5
#define PINCFG_GPIO_BOOT_CLK 6
#define PINCFG_BOOT_CLK 6
#define PINCFG_DIV_CLK 7
#define PINCFG_CTS 8
#define PINCFG_GPIO_INV_CTS 9
#define PINCFG_GPIO_CMD_OVERLAP 10
#define PINCFG_INV_CTS 9
#define PINCFG_CMD_OVERLAP 10
#define PINCFG_SDO 11
#define PINCFG_POR 12
#define PINCFG_GPIO_CAL_WUT 13
#define PINCFG_CAL_WUT 13
#define PINCFG_WUT 14
#define PINCFG_EN_PA 15
#define PINCFG_TX_DATA_CLK 16
......@@ -203,17 +203,17 @@ end_packed_struct;
#define PINCFG_INVALID_PREAMBLE 25
#define PINCFG_SYNC_WORD_DETECT 26
#define PINCFG_CCA 27
#define PINCFG_GPIO_IN_SLEEP 28
#define PINCFG_IN_SLEEP 28
#define PINCFG_PKT_TRACE 29
#define PINCFG_TX_RX_DATA_CLK 31
#define PINCFG_GPIO_TX_STATE 32
#define PINCFG_GPIO_RX_STATE 33
#define PINCFG_GPIO_RX_FIFO_FULL 34
#define PINCFG_GPIO_TX_FIFO_EMPTY 35
#define PINCFG_GPIO_LOW_BATT 36
#define PINCFG_GPIO_CCA_LATCH 37
#define PINCFG_GPIO_HOPPED 38
#define PINCFG_GPIO_HOP_TABLE_WRAP 39
#define PINCFG_TX_STATE 32
#define PINCFG_RX_STATE 33
#define PINCFG_RX_FIFO_FULL 34
#define PINCFG_TX_FIFO_EMPTY 35
#define PINCFG_LOW_BATT 36
#define PINCFG_CCA_LATCH 37
#define PINCFG_HOPPED 38
#define PINCFG_HOP_TABLE_WRAP 39
#define PINCFG_NIRQ_NIRQ 39
#define DRV_STRENGTH_HIGH (0<<5)
......@@ -453,7 +453,7 @@ end_packed_struct;
#define STARTRX_CONDITION_WUT (1 << 0)
#define STARTRX_CONDITION_IMMEDIATE (1 << 0)
#define STARTRX_CONDITION_IMMEDIATE (0 << 0)
#define STARTRX_STATE_NOCHANGE 0
#define STARTRX_STATE_SLEEP 1
#define STARTRX_STATE_SPI_ACTIVE 2
......
......@@ -107,15 +107,17 @@ extern "C"
struct spi_dev_s; /* Forward reference */
FAR struct genradio_dev_s *si4463_init(FAR struct spi_dev_s *spi, int devnum,
uint32_t xtal, int papin, int lnapin,
bool pininvert,
FAR const struct si4463_lower_s *lower);
/* these wrappers can be used to initialize radio modules with known xtals */
/* these wrappers can be used to initialize radio modules with known params */
/* RFM26 has a 30 MHz crystal and active-low antenna switch control */
static inline FAR struct genradio_dev_s *
RFM26_init(FAR struct spi_dev_s *spi, int devnum, int papin, int lnapin,
FAR const struct si4463_lower_s *lower)
{
return si4463_init(spi, devnum, 30000000, papin, lnapin, lower);
return si4463_init(spi, devnum, 30000000, papin, lnapin, true, lower);
}
......