diff --git a/arch/arm/src/samv7/sam_mcan.c b/arch/arm/src/samv7/sam_mcan.c index d4807941a4..ab5a4b9bac 100644 --- a/arch/arm/src/samv7/sam_mcan.c +++ b/arch/arm/src/samv7/sam_mcan.c @@ -3454,6 +3454,19 @@ static int mcan_interrupt(int irq, void *context, FAR void *arg) { canerr("ERROR: RX %08x\n", pending & MCAN_RXERR_INTS); + /* To prevent Interrupt-Flooding the current active + * RX error interupts are disabled. After successfully + * receiving at least one CAN packet all RX error interrupts + * are turned back on. + * + * The Interrupt-Flooding can for example occure if the + * configured CAN speed does not match the speed of the other + * CAN nodes in the network. + */ + + ie &= ~(pending & MCAN_RXERR_INTS); + mcan_putreg(priv, SAM_MCAN_IE_OFFSET, ie); + /* Clear the error indications */ mcan_putreg(priv, SAM_MCAN_IR_OFFSET, MCAN_RXERR_INTS); @@ -3617,6 +3630,11 @@ static int mcan_interrupt(int irq, void *context, FAR void *arg) config->msgram.rxfifo1 + (ndx * priv->config->rxfifo1esize), priv->config->rxfifo1esize); + + /* Turning back on all configured RX error interrupts */ + + ie |= (priv->rxints & MCAN_RXERR_INTS); + mcan_putreg(priv, SAM_MCAN_IE_OFFSET, ie); } /* Acknowledge reading the FIFO entry */ @@ -3651,6 +3669,11 @@ static int mcan_interrupt(int irq, void *context, FAR void *arg) config->msgram.rxfifo0 + (ndx * priv->config->rxfifo0esize), priv->config->rxfifo0esize); + + /* Turning back on all configured RX error interrupts */ + + ie |= (priv->rxints & MCAN_RXERR_INTS); + mcan_putreg(priv, SAM_MCAN_IE_OFFSET, ie); } /* Acknowledge reading the FIFO entry */ diff --git a/drivers/wireless/spirit/drivers/spirit_netdev.c b/drivers/wireless/spirit/drivers/spirit_netdev.c index 56b042ab48..03f7820888 100644 --- a/drivers/wireless/spirit/drivers/spirit_netdev.c +++ b/drivers/wireless/spirit/drivers/spirit_netdev.c @@ -253,7 +253,7 @@ static const struct pktbasic_init_s g_pktbasic_init = SPIRIT_SYNC_WORD, /* syncwords */ SPIRIT_PREAMBLE_LENGTH, /* premblen */ SPIRIT_SYNC_LENGTH, /* synclen */ - SPIRIT_LENGTH_TYPE, /* fixedvarlen */ + SPIRIT_LENGTH_TYPE, /* fixvarlen */ SPIRIT_LENGTH_WIDTH, /* pktlenwidth */ SPIRIT_CRC_MODE, /* crcmode */ SPIRIT_CONTROL_LENGTH, /* ctrllen */ @@ -526,6 +526,19 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv) goto errout_with_iob; } +#ifndef CONFIG_SPIRIT_PROMISCOUS + /* Set the destination address */ + +#warning Missing logic +#if 0 + ret = spirit_pktcommon_set_txdestaddr(spirit, txdestaddr); + if (ret < 0) + { + goto errout_with_iob; + } +#endif +#endif + /* Enable CSMA */ ret = spirit_csma_enable(spirit, S_ENABLE); @@ -848,7 +861,7 @@ static void spirit_interrupt_work(FAR void *arg) /* Read the packet into the I/O buffer */ DEBUGVERIFY(spirit_fifo_read(spirit, iob->io_data, count)); - iob->io_len = spirit_pktbasic_rxpktlen(spirit); + iob->io_len = spirit_pktbasic_get_rxpktlen(spirit); DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO)); priv->state = DRIVER_STATE_IDLE; @@ -1201,6 +1214,7 @@ static int spirit_ifup(FAR struct net_driver_s *dev) goto error_with_ifalmostup; } +#ifndef CONFIG_SPIRIT_PROMISCOUS /* Instantiate the assigned node address */ #warning Missing logic @@ -1210,6 +1224,7 @@ static int spirit_ifup(FAR struct net_driver_s *dev) { goto error_with_ifalmostup; } +#endif #endif /* Set and activate a timer process */ diff --git a/drivers/wireless/spirit/include/spirit_pktbasic.h b/drivers/wireless/spirit/include/spirit_pktbasic.h index e2d04278c8..0f75fe990d 100644 --- a/drivers/wireless/spirit/include/spirit_pktbasic.h +++ b/drivers/wireless/spirit/include/spirit_pktbasic.h @@ -125,12 +125,12 @@ struct pktbasic_init_s * number of bytes in synclen has been stored. * This parameter can be any value of enum * pkt_synlen_e */ - uint8_t fixedvarlen; /* Specifies if a fixed length of packet has to + uint8_t fixvarlen; /* Specifies if a fixed length of packet has to * be used. This parameter can be any value of * enum pkt_fixvar_len_e */ uint8_t pktlenwidth; /* Specifies the size of the length of packet * in bits. This field is useful only if the - * field fixedvarlen is set to BASIC_LENGTH_VAR. + * field fixvarlen is set to BASIC_LENGTH_VAR. * For Basic packets the length width is * log2(max payload length + control length * (0 to 4) + address length (0 or 1)). */ @@ -272,7 +272,7 @@ int spirit_pktbasic_get_addrsetup(FAR struct spirit_library_s *spirit, int spirit_pktbasic_set_format(FAR struct spirit_library_s *spirit); /****************************************************************************** - * Name: spirit_pktbase_set_addrfield + * Name: spirit_pkbasic_enable_addrlen * * Description: * Sets the address length for SPIRIT Basic packets. @@ -286,11 +286,11 @@ int spirit_pktbasic_set_format(FAR struct spirit_library_s *spirit); * ******************************************************************************/ -int spirit_pktbase_set_addrfield(FAR struct spirit_library_s *spirit, - enum spirit_functional_state_e txdestaddr); +int spirit_pkbasic_enable_addrlen(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e txdestaddr); /****************************************************************************** - * Name: spirit_pktbase_get_addrfield + * Name: spirit_pkbasic_isenabled_addrlen * * Description: * Specifies if the Address field for SPIRIT Basic packets is enabled or @@ -305,7 +305,7 @@ int spirit_pktbase_set_addrfield(FAR struct spirit_library_s *spirit, ******************************************************************************/ enum spirit_functional_state_e - spirit_pktbase_get_addrfield(FAR struct spirit_library_s *spirit); + spirit_pkbasic_isenabled_addrlen(FAR struct spirit_library_s *spirit); /****************************************************************************** * Name: spirit_pktbasic_set_payloadlen @@ -348,7 +348,7 @@ int spirit_pktbasic_set_payloadlen(FAR struct spirit_library_s *spirit, uint16_t spirit_pktbase_get_payloadlen(FAR struct spirit_library_s *spirit); /****************************************************************************** - * Name: spirit_pktbasic_rxpktlen + * Name: spirit_pktbasic_get_rxpktlen * * Description: * Returns the packet length field of the received packet. @@ -361,7 +361,7 @@ uint16_t spirit_pktbase_get_payloadlen(FAR struct spirit_library_s *spirit); * ******************************************************************************/ -uint16_t spirit_pktbasic_rxpktlen(FAR struct spirit_library_s *spirit); +uint16_t spirit_pktbasic_get_rxpktlen(FAR struct spirit_library_s *spirit); /****************************************************************************** * Name: spirit_pktbasic_set_varlen diff --git a/drivers/wireless/spirit/include/spirit_pktcommon.h b/drivers/wireless/spirit/include/spirit_pktcommon.h index 6393b8450f..5b8af744a1 100644 --- a/drivers/wireless/spirit/include/spirit_pktcommon.h +++ b/drivers/wireless/spirit/include/spirit_pktcommon.h @@ -104,8 +104,20 @@ (mode == PKT_CRC_MODE_24BITS)) #define IS_PKT_CONTROL_LENGTH(len) \ ((len == PKT_CONTROL_LENGTH_0BYTES) || (len == PKT_CONTROL_LENGTH_1BYTE) || \ - (len == PKT_CONTROL_LENGTH_2BYTES) || (len == PKT_CONTROL_LENGTH_3BYTES) || \ + (len == PKT_CONTROL_LENGTH_2BYTES) || (len == PKT_CONTROL_LENGTH_3BYTES) || \ (len == PKT_CONTROL_LENGTH_4BYTES)) +#define IS_PKT_SYNCWORD(word) \ + (((word) == PKT_SYNC_WORD_1) || ((word) == PKT_SYNC_WORD_2) || \ + ((word) == PKT_SYNC_WORD_3) || ((word) == PKT_SYNC_WORD_4)) +#define IS_PKT_MAXRETX(nretx) \ + (((nretx) == PKT_DISABLE_RETX) || ((nretx) == PKT_N_RETX_1) || \ + ((nretx) == PKT_N_RETX_2) || ((nretx) == PKT_N_RETX_3) || \ + ((nretx) == PKT_N_RETX_4) || ((nretx) == PKT_N_RETX_5) || \ + ((nretx) == PKT_N_RETX_6) || ((nretx) == PKT_N_RETX_7) || \ + ((nretx) == PKT_N_RETX_8) || ((nretx) == PKT_N_RETX_9) || \ + ((nretx) == PKT_N_RETX_10) || ((nretx) == PKT_N_RETX_11) || \ + ((nretx) == PKT_N_RETX_12) || ((nretx) == PKT_N_RETX_13) || \ + ((nretx) == PKT_N_RETX_14) || ((nretx) == PKT_N_RETX_15)) /****************************************************************************** * Public Types @@ -120,7 +132,7 @@ extern "C" enum pkt_preamblen_e { - PKT_PREAMBLE_LENGTH_01BYTE = 0x00, /* Preamble length 1 byte */ + PKT_PREAMBLE_LENGTH_01BYTE = 0x00, /* Preamble length 1 byte */ PKT_PREAMBLE_LENGTH_02BYTES = 0x08, /* Preamble length 2 bytes */ PKT_PREAMBLE_LENGTH_03BYTES = 0x10, /* Preamble length 3 bytes */ PKT_PREAMBLE_LENGTH_04BYTES = 0x18, /* Preamble length 4 bytes */ @@ -194,6 +206,38 @@ enum pkt_ctrllen_e PKT_CONTROL_LENGTH_4BYTES /* Control length 4 bytes */ }; +/* Sync words enumeration for SPIRIT packets. */ + +enum spirit_pktsyncword_e +{ + PKT_SYNC_WORD_1 = 0x01, /* Index of the 1st sync word */ + PKT_SYNC_WORD_2, /* Index of the 2nd sync word */ + PKT_SYNC_WORD_3, /* Index of the 3rd sync word */ + PKT_SYNC_WORD_4 /* Index of the 4th sync word */ +}; + +/* Max retransmissions number enumeration for SPIRIT packets. */ + +enum spirit_maxretx_e +{ + PKT_DISABLE_RETX = 0x00, /* No retrasmissions */ + PKT_N_RETX_1 = 0x10, /* Max retrasmissions 1 */ + PKT_N_RETX_2 = 0x20, /* Max retrasmissions 2 */ + PKT_N_RETX_3 = 0x30, /* Max retrasmissions 3 */ + PKT_N_RETX_4 = 0x40, /* Max retrasmissions 4 */ + PKT_N_RETX_5 = 0x50, /* Max retrasmissions 5 */ + PKT_N_RETX_6 = 0x60, /* Max retrasmissions 6 */ + PKT_N_RETX_7 = 0x70, /* Max retrasmissions 7 */ + PKT_N_RETX_8 = 0x80, /* Max retrasmissions 8 */ + PKT_N_RETX_9 = 0x90, /* Max retrasmissions 9 */ + PKT_N_RETX_10 = 0xa0, /* Max retrasmissions 10 */ + PKT_N_RETX_11 = 0xb0, /* Max retrasmissions 11 */ + PKT_N_RETX_12 = 0xc0, /* Max retrasmissions 12 */ + PKT_N_RETX_13 = 0xd0, /* Max retrasmissions 13 */ + PKT_N_RETX_14 = 0xe0, /* Max retrasmissions 14 */ + PKT_N_RETX_15 = 0xf0 /* Max retrasmissions 15 */ +}; + /****************************************************************************** * Public Function Prototypes ******************************************************************************/ @@ -232,6 +276,96 @@ int spirit_pktcommon_set_controllen(FAR struct spirit_library_s *spirit, uint8_t spirit_pktcommon_get_controllen(FAR struct spirit_library_s *spirit); +/****************************************************************************** + * Name: spirit_pktcommon_set_preamblen + * + * Description: + * Sets the PREAMBLE field Length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * preamblen - Length of PREAMBLE field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_preamblen(FAR struct spirit_library_s *spirit, + enum pkt_preamblen_e preamblen); + +/****************************************************************************** + * Name: spirit_pktcommon_get_preamblen + * + * Description: + * Returns the PREAMBLE field Length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Preamble field length in bytes. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_preamblen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pkt_set_synclen + * + * Description: + * Sets the SYNC field Length for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * synclen - Length of SYNC field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkt_set_synclen(FAR struct spirit_library_s *spirit, + enum pkt_synlen_e synclen); + +/****************************************************************************** + * Name: spirit_pktcommon_get_synclen + * + * Description: + * Returns the SYNC field Length for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Sync field length in bytes. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_synclen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_fixvarlen + * + * Description: + * Sets fixed or variable payload length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * fixvarlen - Variable or fixed length. + * PKT_FIXED_LENGTH_VAR -> variable (the length is extracted + * from the received packet). + * PKT_FIXED_LENGTH_FIX -> fix (the length is set by PCKTLEN0 + * and PCKTLEN1). + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_fixvarlen(FAR struct spirit_library_s *spirit, + enum pkt_fixvar_len_e fixvarlen); + /****************************************************************************** * Name: spirit_pktcommon_enable_crcfilter * @@ -251,6 +385,835 @@ uint8_t spirit_pktcommon_get_controllen(FAR struct spirit_library_s *spirit); int spirit_pktcommon_enable_crcfilter(FAR struct spirit_library_s *spirit, enum spirit_functional_state_e newstate); +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_crcfilter + * + * Description: + * Returns the CRC filtering enable bit. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CRC filtering state. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_crcfilter(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_crcmode + * + * Description: + * Sets the CRC mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * crcmode - Length of CRC field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_crcmode(FAR struct spirit_library_s *spirit, + enum pkt_crcmode_e crcmode); + +/****************************************************************************** + * Name: spirit_pktcommon_get_crcmode + * + * Description: + * Returns the CRC mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Crc mode. + * + ******************************************************************************/ + +enum pkt_crcmode_e + spirit_pktcommon_get_crcmode(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_whitening + * + * Description: + * Enables or Disables WHITENING for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for WHITENING mode. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_whitening(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_fec + * + * Description: + * Enables or Disables FEC for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for FEC mode. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_fec(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_set_syncword + * + * Description: + * Sets a specific SYNC word for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwordno - SYNC word number to be set. + * syncword - SYNC word. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_syncword(FAR struct spirit_library_s *spirit, + enum spirit_pktsyncword_e syncwordno, + uint8_t syncword); + +/****************************************************************************** + * Name: spirit_pktcommon_get_syncword + * + * Description: + * Returns a specific SYNC word for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwordno - SYNC word number to be get. + * + * Returned Value: + * Sync word x. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_syncword(FAR struct spirit_library_s *spirit, + enum spirit_pktsyncword_e syncwordno); + +/****************************************************************************** + * Name: spirit_pktcommon_set_syncwords + * + * Description: + * Sets multiple SYNC words for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwords - SYNC words to be set with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4|. + * synclen - SYNC length in bytes. The 32bit word passed will be stored in + * the SYNCx registers from the MSb until the number of bytes in + * synclen has been stored. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_syncwords(FAR struct spirit_library_s *spirit, + uint32_t syncwords, enum pkt_synlen_e synclen); + +/****************************************************************************** + * Name: spirit_pktcommon_get_syncwords + * + * Description: + * Returns multiple SYNC words for SPIRIT packets. + * + * Input Parameters: + * spiri - Reference to a Spirit library state structure instance + * synclen - SYNC length in bytes. The 32bit word passed will be stored in + * the SYNCx registers from the MSb until the number of bytes in + * synclen has been stored. + * + * Returned Value: + * Sync words. The format of the read 32 bit word is 0x|SYNC1|SYNC2|SYNC3|SYNC4|. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_syncwords(FAR struct spirit_library_s *spirit, + enum pkt_synlen_e synclen); + +/****************************************************************************** + * Name: spirit_pktcommon_get_varlen + * + * Description: + * Returns the variable length width (in number of bits). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Variable length width in bits. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_varlen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_txdestaddr + * + * Description: + * Sets the destination address for the Tx packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * txdestaddr - Destination address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txdestaddr(FAR struct spirit_library_s *spirit, + uint8_t txdestaddr); + +/****************************************************************************** + * Name: spirit_pktcommon_get_txdestaddr + * + * Description: + * Returns the settled destination address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Transmitted destination address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_txdestaddr(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_nodeaddress + * + * Description: + * Sets the node my address. When the filtering on my address is on, if the + * destination address extracted from the received packet is equal to the + * content of the my address, then the packet is accepted (this is the + * address of the node). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * srcaddr - Address of the present node. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_nodeaddress(FAR struct spirit_library_s *spirit, + uint8_t srcaddr); + +/****************************************************************************** + * Name: spirit_pktcommon_get_nodeaddress + * + * Description: + * Returns the address of the present node. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * My address (address of this node). + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_nodeaddress(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_bcastaddr + * + * Description: + * Sets the broadcast address. If the destination address extracted from the + * received packet is equal to the content of the BROADCAST_ADDR register, + * then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * bcastaddr - Broadcast address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_bcastaddr(FAR struct spirit_library_s *spirit, + uint8_t bcastaddr); + +/****************************************************************************** + * Name: spirit_pktcommon_get_bcastaddr + * + * Description: + * Returns the broadcast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Broadcast address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_bcastaddr(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_mcastaddr + * + * Description: + * Sets the multicast address. When the multicast filtering is on, if the + * destination address extracted from the received packet is equal to the + * content of the MULTICAST_ADDR register, then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mcastaddr - Multicast address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_mcastaddr(FAR struct spirit_library_s *spirit, + uint8_t mcastaddr); + +/****************************************************************************** + * Name: spirit_pktcommon_get_mcastaddr + * + * Description: + * Returns the multicast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Multicast address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_mcastaddr(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_ctrlmask + * + * Description: + * Sets the control mask. The 1 bits of the CONTROL_MASK indicate the bits + * to be used in filtering. (All 0s no filtering) + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mask Control mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_ctrlmask(FAR struct spirit_library_s *spirit, + uint32_t mask); + +/****************************************************************************** + * Name: spirit_pktcommon_get_ctrlmask + * + * Description: + * Returns the control mask. The 1 bits of the CONTROL_MASK indicate the + * bits to be used in filtering. (All 0s no filtering) + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control mask. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_ctrlmask(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_ctrlref + * + * Description: + * Sets the control field reference. If the bits enabled by the CONTROL_MASK + * match the ones of the control fields extracted from the received packet + * then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * reference - Control reference. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_ctrlref(FAR struct spirit_library_s *spirit, + uint32_t reference); + +/****************************************************************************** + * Name: spirit_pktcommon_get_ctrlref + * + * Description: + * Returns the control field reference. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control reference. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_ctrlref(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_set_txctrl + * + * Description: + * Sets the TX control field. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * txctrl - Tx control field. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txctrl(FAR struct spirit_library_s *spirit, + uint32_t txctrl); + +/****************************************************************************** + * Name: spirit_pktcommon_get_txctrl + * + * Description: + * Returns the Tx control field. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control field of the transmitted packet. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_txctrl(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_destaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * My address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_SOURCE_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_destaddr_filter(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_mcastaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * multicast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_MULTICAST_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_mcastaddr_filter(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_bcastaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * broadcast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_BROADCAST_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_bcastaddr_filter(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_destaddr_filter + * + * Description: + * Returns the enable bit of the my address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_destaddr_filter(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_mcastaddr_filter + * + * Description: + * Returns the enable bit of the multicast address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_mcastaddr_filter(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_bcastaddr_filter + * + * Description: + * Returns the enable bit of the broadcast address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_bcastaddr_filter(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxdestaddr + * + * Description: + * Returns the destination address of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Destination address of the received address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxdestaddr(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxctrl + * + * Description: + * Returns the control field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Received control field. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_rxctrl(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxcrc + * + * Description: + * Returns the CRC field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * crc - Array in which the CRC field has to be stored. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_get_rxcrc(FAR struct spirit_library_s *spirit, + FAR uint8_t *crc); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_rxautoack + * + * Description: + * Sets the AUTO ACKNOLEDGEMENT mechanism on the receiver. When the feature + * is enabled and a data packet has been correctly received, then an + * acknowledgement packet is sent back to the originator of the received + * packet. If the PIGGYBACKING bit is also set, payload data will be read + * from the FIFO; otherwise an empty packet is sent only containing the + * source and destination addresses and the sequence number of the packet + * being acknowledged. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * autoack - New state for autoack. + * piggyback - New state for autoack. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_rxautoack(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e autoack, + enum spirit_functional_state_e piggyback); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_txautoack + * + * Description: + * Sets the AUTO ACKNOLEDGEMENT mechanism on the transmitter. On the + * transmitter side, the NACK_TX field can be used to require or not an + * acknowledgment for each individual packet: if NACK_TX is set to "1" then + * acknowledgment will not be required; if NACK_TX is set to "0" then + * acknowledgment will be required. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for TX_AUTOACK. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_txautoack(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_set_txseqno + * + * Description: + * Sets the TX sequence number to be used to start counting. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * seqno - New value for Tx seq number reload. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txseqno(FAR struct spirit_library_s *spirit, + uint8_t seqno); + +/****************************************************************************** + * Name: spirit_pktcommon_set_maxretx + * + * Description: + * Set the maximum number of TX retries (from 0 to 15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * seqno - New value for Tx seq number reload. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_maxretx(FAR struct spirit_library_s *spirit, + enum spirit_maxretx_e maxretx); + +/****************************************************************************** + * Name: spirit_pktcommon_get_maxretx + * + * Description: + * Returns the max number of automatic retransmission. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Max number of retransmissions. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_maxretx(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_txackreq + * + * Description: + * Returns the TX ACK request + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Max number of retransmissions. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_get_txackreq(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxsrcaddr + * + * Description: + * Returns the source address of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Source address of the received packet. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxsrcaddr(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxseqno + * + * Description: + * Returns the sequence number of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Received Sequence number. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxseqno(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxnak + * + * Description: + * Returns the Nack bit of the received packet + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Value of the Nack bit. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxnak(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_txseqno + * + * Description: + * Returns the sequence number of the transmitted packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Sequence number of the transmitted packet. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_txseqno(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_get_nretx + * + * Description: + * Returns the number of retransmission done on the transmitted packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Number of retransmissions done until now. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_nretx(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktcommon_enable_ctrl_filter + * + * Description: + * If enabled RX packet is accepted only if the masked control field matches + * the masked control field reference (CONTROL_MASK & CONTROL_FIELD_REF == + * CONTROL_MASK & RX_CONTROL_FIELD). + * + * NOTE: This filtering control is enabled by default but the control mask is + * by default set to 0. As a matter of fact the user has to enable the + * control filtering bit after the packet initialization because the packet + * initialization routine disables it. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for Control filtering enable bit. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_ctrl_filter(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_ctrl_filter + * + * Description: + * Returns the enable bit of the control field filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_ctrl_filter(FAR struct spirit_library_s *spirit); + #ifdef __cplusplus } #endif diff --git a/drivers/wireless/spirit/include/spirit_pktstack.h b/drivers/wireless/spirit/include/spirit_pktstack.h index 44bae72f25..9a6a49fc48 100644 --- a/drivers/wireless/spirit/include/spirit_pktstack.h +++ b/drivers/wireless/spirit/include/spirit_pktstack.h @@ -106,7 +106,8 @@ * Included Files ******************************************************************************/ -#include +#include "spirit_types.h" +#include "spirit_pktcommon.h" /****************************************************************************** * Public Types @@ -129,12 +130,12 @@ struct spirit_pktstack_init_s * parameter can be any value from enum pkt_premblen_e */ uint8_t synclen; /* Specifies the sync word length of packet. This * parameter can be any value of enum pkt_premblen_e */ - uint8_t fixedvarlen; /* Specifies if a fixed length of packet has to be + uint8_t fixvarlen; /* Specifies if a fixed length of packet has to be * used. This parameter can be any value of enum * pkt_fixvar_len_e */ uint8_t pktlenwidth; /* Specifies the size of the length of packet in * bits. This field is useful only if the field - * fixedvarlen is set to STACK_LENGTH_VAR. For STack + * fixvarlen is set to STACK_LENGTH_VAR. For STack * packets the length width is log2( max payload * length + control length (0 to 4) + address length * (always 2)). This parameter is an FAR uint8_t */ @@ -179,24 +180,303 @@ struct spirit_pktstack_address_s struct spirit_pktstack_llp_s { - uint8_t autoack; /* Specifies if the auto ACK feature - * is used or not. This parameter can - * be a value of - * enum spirit_functional_state_e */ - uint8_t piggyback; /* Specifies if the - * piggybacking feature is used - * or not. This parameter can - * be a value of - * enum spirit_functional_state_e */ - uint8_t maxretx; /* Specifies the number of - * MAX-Retransmissions. This parameter can be a - * value of enum spirit_maxretx_e */ + uint8_t autoack; /* Specifies if the auto ACK feature is used or not. + * This parameter can be a value from enum + * spirit_functional_state_e */ + uint8_t piggyback; /* Specifies if the piggybacking feature is used or + * not. This parameter can be a value from enum + * spirit_functional_state_e */ + uint8_t maxretx; /* Specifies the number of MAX-Retransmissions. This + * parameter can be a value from enum spirit_maxretx_e */ }; /****************************************************************************** * Public Function Prototypes ******************************************************************************/ +/****************************************************************************** + * Name: spirit_pktstack_initialize + * + * Description: + * Initializes the SPIRIT STack packet according to the specified parameters + * in the struct spirit_pktstack_init_s. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pktstack - STack packet init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_init_s *pktstack); + +/****************************************************************************** + * Name: spirit_pktstack_get_setup + * Description: + * Returns the SPIRIT STack packet structure according to the specified + * parameters in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pktstack - STack packet init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_setup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_init_s *pktstack); + +/****************************************************************************** + * Name: spirit_pktstack_address_initialize + * + * Description: + * Initializes the SPIRIT STack packet addresses according to the specified + * parameters in the PktStackAddresses struct. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * addrinit - STack packet addresses init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_address_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_address_s *addrinit); + +/****************************************************************************** + * Name: spirit_pktstack_get_addrsetup + * + * Description: + * Returns the SPIRIT STack packet addresses structure according to the + * specified parameters in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * addrinit - STack packet addresses init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_addrsetup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_address_s *addrinit); + +/****************************************************************************** + * Name: spirit_pktstack_llp_initialize + * + * Description: + * Initializes the SPIRIT STack packet LLP options according to the specified + * parameters in the struct spirit_pktstack_llp_s struct. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * llpinit - STack packet LLP init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_llp_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_llp_s *llpinit); + +/****************************************************************************** + * Name: spirit_pktstack_get_llpsetup + * + * Description: + * Returns the SPIRIT STack packet LLP options according to the specified + * values in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * llpinit - STack packet LLP structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_llpsetup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_llp_s *llpinit); + +/****************************************************************************** + * Name: spirit_pktstack_set_format + * + * Description: + * Configures the Stack packet format for SPIRIT. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_set_format(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktstack_enable_addrlen + * + * Description: + * Sets the address length for SPIRIT STack packets (always 2). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_enable_addrlen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktstack_set_payloadlen + * + * Description: + * Sets the payload length for SPIRIT STack packets. Since the packet length + * depends from the address (always 2 for this packet format) and the + * control field size, this function reads the control length register + * content in order to determine the correct packet length to be written. + * + * 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_pktstack_set_payloadlen(FAR struct spirit_library_s *spirit, + uint16_t payloadlen); + +/****************************************************************************** + * Name: spirit_pktstack_get_payloadlen + * + * Description: + * Returns the payload length for SPIRIT STack packets. Since the packet + * length depends from the address and the control field size, this function + * reads the correspondent registers in order to determine the correct + * payload length to be returned. + * + * Input Parameters: + * None. + * + * Returned Value: + * Payload length. + * + ******************************************************************************/ + +uint16_t spirit_pktstack_get_payloadlen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pktstack_set_varlen + * + * Description: + * Computes and sets the variable payload length for SPIRIT STack packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * payloadlen - Payload length in bytes. + * ctrllen - Control length in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_set_varlen(FAR struct spirit_library_s *spirit, + uint16_t payloadlen, + enum pkt_ctrllen_e ctrllen); + +/****************************************************************************** + * Name: spirit_pkstack_set_rxsource_addrmask + * + * Description: + * Rx packet source mask. Used to mask the address of the accepted packets. + * If 0 -> no filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mask - Rx source mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkstack_set_rxsource_addrmask(FAR struct spirit_library_s *spirit, + uint8_t mask); + +/****************************************************************************** + * Name: spirit_pktstack_get_rxsource_addrmask + * + * Description: + * Returns the Rx packet source mask. Used to mask the address of the + * accepted packets. If 0 -> no filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Rx source mask. + * + ******************************************************************************/ + +uint8_t spirit_pktstack_get_rxsource_addrmask(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pkstack_get_rxpktlen + * + * Description: + * Returns the packet length field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Packet length. + * + ******************************************************************************/ + +uint16_t spirit_pkstack_get_rxpktlen(FAR struct spirit_library_s *spirit); + +/****************************************************************************** + * Name: spirit_pkstack_enable_rxsource_addrfilter + * + * Description: + * If enabled RX packet is accepted only if the masked source address field + * matches the masked source address field reference (SOURCE_MASK & + * SOURCE_FIELD_REF == SOURCE_MASK & RX_SOURCE_FIELD). + * + * NOTE: This filtering control is enabled by default but the source + * address mask is by default set to 0. As a matter of fact the user has + * to enable the source filtering bit after the packet initialization + * because the packet initialiazation routine disables it. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for Source address filtering enable bit. + * This parameter can be S_ENABLE or S_DISABLE. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkstack_enable_rxsource_addrfilter(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e newstate); + #ifdef __cplusplus } #endif diff --git a/drivers/wireless/spirit/lib/Make.defs b/drivers/wireless/spirit/lib/Make.defs index 33aa82f2d5..0741ade0d2 100644 --- a/drivers/wireless/spirit/lib/Make.defs +++ b/drivers/wireless/spirit/lib/Make.defs @@ -36,10 +36,10 @@ # Include Spirit driver source files in the build 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_general.c -CSRCS += spirit_spi.c +CSRCS += spirit_pktmbus.c spirit_pktstack.c spirit_directrf.c spirit_qi.c +CSRCS += spirit_calibration.c spirit_management.c spirit_aes.c spirit_csma.c +CSRCS += spirit_linearfifo.c spirit_irq.c spirit_timer.c spirit_gpio.c +CSRCS += spirit_general.c spirit_spi.c # Include Spirit driver build support diff --git a/drivers/wireless/spirit/lib/spirit_pktbasic.c b/drivers/wireless/spirit/lib/spirit_pktbasic.c index c47f479cdc..288799f357 100644 --- a/drivers/wireless/spirit/lib/spirit_pktbasic.c +++ b/drivers/wireless/spirit/lib/spirit_pktbasic.c @@ -81,7 +81,7 @@ int spirit_pktbasic_initialize(FAR struct spirit_library_s *spirit, DEBUGASSERT(IS_PKT_SYNC_LENGTH(pktpasic->synclen)); DEBUGASSERT(IS_PKT_CRC_MODE(pktpasic->crcmode)); DEBUGASSERT(IS_PKT_LENGTH_WIDTH_BITS(pktpasic->pktlenwidth)); - DEBUGASSERT(IS_PKT_FIX_VAR_LENGTH(pktpasic->fixedvarlen)); + DEBUGASSERT(IS_PKT_FIX_VAR_LENGTH(pktpasic->fixvarlen)); DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(pktpasic->txdestaddr)); DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(pktpasic->fec)); DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(pktpasic->datawhite)); @@ -155,7 +155,7 @@ int spirit_pktbasic_initialize(FAR struct spirit_library_s *spirit, /* Preamble, sync and fixed or variable length setting */ regval[2] = (uint8_t)pktpasic->preamblen | (uint8_t)pktpasic->synclen | - (uint8_t)pktpasic->fixedvarlen; + (uint8_t)pktpasic->fixvarlen; /* CRC length, whitening and FEC setting */ @@ -271,7 +271,7 @@ int spirit_pktbasic_get_setup(FAR struct spirit_library_s *spirit, /* FIX or VAR bit */ - pktbasic->fixedvarlen = (enum pkt_fixvar_len_e)(regval[2] & 0x01); + pktbasic->fixvarlen = (enum pkt_fixvar_len_e)(regval[2] & 0x01); /* Preamble length */ @@ -501,22 +501,22 @@ int spirit_pktbasic_set_format(FAR struct spirit_library_s *spirit) } /****************************************************************************** - * Name: spirit_pktbase_set_addrfield + * Name: spirit_pkbasic_enable_addrlen * * Description: * Sets the address length for SPIRIT Basic packets. * * Input Parameters: * spirit - Reference to a Spirit library state structure instance - * txdestaddr - Length of ADDRESS in bytes. + * txdestaddr - Enable/disable address field * * Returned Value: * Zero (OK) on success; a negated errno value on failure. * ******************************************************************************/ -int spirit_pktbase_set_addrfield(FAR struct spirit_library_s *spirit, - enum spirit_functional_state_e txdestaddr) +int spirit_pkbasic_enable_addrlen(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e txdestaddr) { uint8_t regval; int ret; @@ -550,7 +550,7 @@ int spirit_pktbase_set_addrfield(FAR struct spirit_library_s *spirit, } /****************************************************************************** - * Name: spirit_pktbase_get_addrfield + * Name: spirit_pkbasic_isenabled_addrlen * * Description: * Specifies if the Address field for SPIRIT Basic packets is enabled or @@ -565,7 +565,7 @@ int spirit_pktbase_set_addrfield(FAR struct spirit_library_s *spirit, ******************************************************************************/ enum spirit_functional_state_e - spirit_pktbase_get_addrfield(FAR struct spirit_library_s *spirit) + spirit_pkbasic_isenabled_addrlen(FAR struct spirit_library_s *spirit) { uint8_t regval; @@ -611,7 +611,7 @@ int spirit_pktbasic_set_payloadlen(FAR struct spirit_library_s *spirit, /* Computes the oversize (address + control) size */ - if (spirit_pktbase_get_addrfield(spirit)) + if (spirit_pkbasic_isenabled_addrlen(spirit)) { oversize = 1; } @@ -655,7 +655,7 @@ uint16_t spirit_pktbase_get_payloadlen(FAR struct spirit_library_s *spirit) /* Computes the oversize (address + control) size */ - if (spirit_pktbase_get_addrfield(spirit)) + if (spirit_pkbasic_isenabled_addrlen(spirit)) { oversize = 1; } @@ -672,7 +672,7 @@ uint16_t spirit_pktbase_get_payloadlen(FAR struct spirit_library_s *spirit) } /****************************************************************************** - * Name: spirit_pktbasic_rxpktlen + * Name: spirit_pktbasic_get_rxpktlen * * Description: * Returns the packet length field of the received packet. @@ -685,14 +685,14 @@ uint16_t spirit_pktbase_get_payloadlen(FAR struct spirit_library_s *spirit) * ******************************************************************************/ -uint16_t spirit_pktbasic_rxpktlen(FAR struct spirit_library_s *spirit) +uint16_t spirit_pktbasic_get_rxpktlen(FAR struct spirit_library_s *spirit) { uint8_t regval[2]; uint16_t oversize = 0; /* Computes the oversize (address + control) size */ - if (spirit_pktbase_get_addrfield(spirit)) + if (spirit_pkbasic_isenabled_addrlen(spirit)) { oversize = 1; } @@ -717,7 +717,7 @@ uint16_t spirit_pktbasic_rxpktlen(FAR struct spirit_library_s *spirit) * Input Parameters: * spirit - Reference to a Spirit library state structure instance * payloadlen - Payload length in bytes. - * txdestaddr - Enable or Disable Address Field. + * txdestaddr - Enable or disable address field. * ctrllen - Control length in bytes. * * Returned Value: diff --git a/drivers/wireless/spirit/lib/spirit_pktcommon.c b/drivers/wireless/spirit/lib/spirit_pktcommon.c index a911aee221..da3a45a3a6 100644 --- a/drivers/wireless/spirit/lib/spirit_pktcommon.c +++ b/drivers/wireless/spirit/lib/spirit_pktcommon.c @@ -72,7 +72,7 @@ int spirit_pktcommon_set_controllen(FAR struct spirit_library_s *spirit, DEBUGASSERT(IS_PKT_CONTROL_LENGTH(ctrllen)); - /* Reads the PCKTCTRL4 register value */ + /* Read the PCKTCTRL4 register value */ ret = spirit_reg_read(spirit, PCKTCTRL4_BASE, ®val, 1); if (ret >= 0) @@ -108,7 +108,7 @@ uint8_t spirit_pktcommon_get_controllen(FAR struct spirit_library_s *spirit) { uint8_t regval; - /* Reads the PCKTCTRL4 register value */ + /* Read the PCKTCTRL4 register value */ (void)spirit_reg_read(spirit, PCKTCTRL4_BASE, ®val, 1); @@ -117,6 +117,193 @@ uint8_t spirit_pktcommon_get_controllen(FAR struct spirit_library_s *spirit) return (regval & PCKTCTRL4_CONTROL_LEN_MASK); } +/****************************************************************************** + * Name: spirit_pktcommon_set_preamblen + * + * Description: + * Sets the PREAMBLE field Length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * preamblen - Length of PREAMBLE field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_preamblen(FAR struct spirit_library_s *spirit, + enum pkt_preamblen_e preamblen) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_PREAMBLE_LENGTH(preamblen)); + + /* Read the PCKTCTRL2 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Set the preamble length */ + + regval &= ~PCKTCTRL2_PREAMBLE_LENGTH_MASK; + regval |= (uint8_t)preamblen; + + /* Write the new value to the PCKTCTRL2 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL2_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_preamblen + * + * Description: + * Returns the PREAMBLE field Length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Preamble field length in bytes. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_preamblen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PCKTCTRL2 register value */ + + (void)spirit_reg_read(spirit, PCKTCTRL2_BASE, ®val, 1); + + /* Rebuild and return value */ + + return ((regval & PCKTCTRL2_PREAMBLE_LENGTH_MASK) >> 3) + 1; +} + +/****************************************************************************** + * Name: spirit_pkt_set_synclen + * + * Description: + * Sets the SYNC field Length for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * synclen - Length of SYNC field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkt_set_synclen(FAR struct spirit_library_s *spirit, + enum pkt_synlen_e synclen) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_SYNC_LENGTH(synclen)); + + /* Read the PCKTCTRL2 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Set the sync length */ + + regval &= ~PCKTCTRL2_SYNC_LENGTH_MASK; + regval |= (uint8_t)synclen; + + /* Write the new value to the PCKTCTRL2 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL2_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_synclen + * + * Description: + * Returns the SYNC field Length for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Sync field length in bytes. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_synclen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PCKTCTRL2 register value */ + + (void)spirit_reg_read(spirit, PCKTCTRL2_BASE, ®val, 1); + + /* Rebuild and return value */ + + return ((regval & PCKTCTRL2_SYNC_LENGTH_MASK) >> 1) + 1; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_fixvarlen + * + * Description: + * Sets fixed or variable payload length mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * fixvarlen - Variable or fixed length. + * PKT_FIXED_LENGTH_VAR -> variable (the length is extracted + * from the received packet). + * PKT_FIXED_LENGTH_FIX -> fix (the length is set by PCKTLEN0 + * and PCKTLEN1). + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_fixvarlen(FAR struct spirit_library_s *spirit, + enum pkt_fixvar_len_e fixvarlen) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_FIX_VAR_LENGTH(fixvarlen)); + + /* Read the PCKTCTRL2 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL2_BASE, ®val, 1); + if (ret >= 0) + { + /* Set fixed or variable address mode */ + + regval &= ~PCKTCTRL2_FIX_VAR_LEN_MASK; + regval |= (uint8_t)fixvarlen; + + /* Write the new value to the PCKTCTRL2 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL2_BASE, ®val, 1); + } + + return ret; +} + /****************************************************************************** * Name: spirit_pktcommon_enable_crcfilter * @@ -143,7 +330,7 @@ int spirit_pktcommon_enable_crcfilter(FAR struct spirit_library_s *spirit, DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(newstate)); - /* Reads the PCKT_FLT_OPTIONS register value */ + /* Read the PCKT_FLT_OPTIONS register value */ ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); if (ret >= 0) @@ -159,10 +346,1721 @@ int spirit_pktcommon_enable_crcfilter(FAR struct spirit_library_s *spirit, regval &= ~PCKT_FLT_OPTIONS_CRC_CHECK_MASK; } - /* Writes the PCKT_FLT_OPTIONS register value */ + /* Write the PCKT_FLT_OPTIONS register value */ ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); } return ret; } + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_crcfilter + * + * Description: + * Returns the CRC filtering enable bit. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * CRC filtering state. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_crcfilter(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PCKT_FLT_OPTIONS register value */ + + (void)spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + + /* Check the CRC filtering bit */ + + if (regval & PCKT_FLT_OPTIONS_CRC_CHECK_MASK) + { + return S_ENABLE; + } + else + { + return S_DISABLE; + } +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_crcmode + * + * Description: + * Sets the CRC mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * crcmode - Length of CRC field in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_crcmode(FAR struct spirit_library_s *spirit, + enum pkt_crcmode_e crcmode) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_CRC_MODE(crcmode)); + + /* Read the PCKTCTRL1 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL1_BASE, ®val, 1); + if (ret >= 0) + { + /* Build data to write setting the CRC mode */ + + regval &= ~PCKTCTRL1_CRC_MODE_MASK; + regval |= (uint8_t)crcmode; + + /* Write the new value to the PCKTCTRL1 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL1_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_crcmode + * + * Description: + * Returns the CRC mode for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Crc mode. + * + ******************************************************************************/ + +enum pkt_crcmode_e + spirit_pktcommon_get_crcmode(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PCKTCTRL1 register */ + + (void)spirit_reg_read(spirit, PCKTCTRL1_BASE, ®val, 1); + + /* Rebuild and return value */ + + return (enum pkt_crcmode_e) (regval & 0xe0); +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_whitening + * + * Description: + * Enables or Disables WHITENING for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for WHITENING mode. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_whitening(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)); + + /* Read the PCKTCTRL1 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL1_BASE, ®val, 1); + if (ret >= 0) + { + /* Build data to write: set or reset the whitening enable bit */ + + if (newstate == S_ENABLE) + { + regval |= PCKTCTRL1_WHIT_MASK; + } + else + { + regval &= ~PCKTCTRL1_WHIT_MASK; + } + + /* Write the new value to the PCKTCTRL1 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL1_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_fec + * + * Description: + * Enables or Disables FEC for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for FEC mode. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_fec(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)); + + /* Read the PCKTCTRL1 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL1_BASE, ®val, 1); + if (ret >= 0) + { + /* Build data to write: set or reset the FEC enable bit */ + + if (newstate == S_ENABLE) + { + regval |= PCKTCTRL1_FEC_MASK; + } + else + { + regval &= ~PCKTCTRL1_FEC_MASK; + } + + /* Write data to the PCKTCTRL1 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL1_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_syncword + * + * Description: + * Sets a specific SYNC word for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwordno - SYNC word number to be set. + * syncword - SYNC word. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_syncword(FAR struct spirit_library_s *spirit, + enum spirit_pktsyncword_e syncwordno, + uint8_t syncword) +{ + uint8_t regaddr; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_SYNCWORD(syncwordno)); + + /* Set the specified address */ + + switch (syncwordno) + { + case PKT_SYNC_WORD_1: + regaddr = SYNC1_BASE; + break; + + case PKT_SYNC_WORD_2: + regaddr = SYNC2_BASE; + break; + + case PKT_SYNC_WORD_3: + regaddr = SYNC3_BASE; + break; + + default: + regaddr = SYNC4_BASE; + break; + } + + /* Write value to the selected register */ + + return spirit_reg_write(spirit, regaddr, &syncword, 1); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_syncword + * + * Description: + * Returns a specific SYNC word for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwordno - SYNC word number to be get. + * + * Returned Value: + * Sync word x. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_syncword(FAR struct spirit_library_s *spirit, + enum spirit_pktsyncword_e syncwordno) +{ + uint8_t regaddr, regval; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_SYNCWORD(syncwordno)); + + /* Set the specified address */ + + switch (syncwordno) + { + case PKT_SYNC_WORD_1: + regaddr = SYNC1_BASE; + break; + + case PKT_SYNC_WORD_2: + regaddr = SYNC2_BASE; + break; + case PKT_SYNC_WORD_3: + regaddr = SYNC3_BASE; + break; + + default: + regaddr = SYNC4_BASE; + break; + } + + /* Read the selected register value */ + + (void)spirit_reg_read(spirit, regaddr, ®val, 1); + + /* Returns the read value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_syncwords + * + * Description: + * Sets multiple SYNC words for SPIRIT packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * syncwords - SYNC words to be set with format: 0x|SYNC1|SYNC2|SYNC3|SYNC4|. + * synclen - SYNC length in bytes. The 32bit word passed will be stored in + * the SYNCx registers from the MSb until the number of bytes in + * synclen has been stored. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_syncwords(FAR struct spirit_library_s *spirit, + uint32_t syncwords, enum pkt_synlen_e synclen) +{ + uint8_t regval[4]; + int i; + + /* Split the 32-bit value in 4 8-bit values */ + + for (i = 0; i < 4; i++) + { + if (i < ((3 - synclen) >> 1)) + { + regval[i] = 0; + } + else + { + regval[i] = (uint8_t)(syncwords >> (8 * i)); + } + } + + /* Write SYNC value to the SYNCx registers */ + + return spirit_reg_write(spirit, SYNC4_BASE, regval, 4); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_syncwords + * + * Description: + * Returns multiple SYNC words for SPIRIT packets. + * + * Input Parameters: + * spiri - Reference to a Spirit library state structure instance + * synclen - SYNC length in bytes. The 32bit word passed will be stored in + * the SYNCx registers from the MSb until the number of bytes in + * synclen has been stored. + * + * Returned Value: + * Sync words. The format of the read 32 bit word is 0x|SYNC1|SYNC2|SYNC3|SYNC4|. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_syncwords(FAR struct spirit_library_s *spirit, + enum pkt_synlen_e synclen) +{ + uint8_t regval[4]; + uint32_t syncword = 0; + int i; + + /* Read the SYNCx registers value */ + + (void)spirit_reg_read(spirit, SYNC4_BASE, regval, 4); + + /* Rebuild the SYNC words */ + + for (i = 0; i < 4; i++) + { + if (i > 2 - (synclen >> 1)) + { + syncword |= regval[i] << (8 * i); + } + } + + /* Return SYNC words */ + + return syncword; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_varlen + * + * Description: + * Returns the variable length width (in number of bits). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Variable length width in bits. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_varlen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PCKTCTRL3 register value */ + + (void)spirit_reg_read(spirit, PCKTCTRL3_BASE, ®val, 1); + + /* Rebuild and return value */ + + return (regval & PCKTCTRL3_LEN_WID_MASK) + 1; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_txdestaddr + * + * Description: + * Sets the destination address for the Tx packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * txdestaddr - Destination address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txdestaddr(FAR struct spirit_library_s *spirit, + uint8_t txdestaddr) +{ + /* Write value to PCKT_FLT_GOALS_SOURCE_ADDR register */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_SOURCE_ADDR_BASE, &txdestaddr, 1); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_txdestaddr + * + * Description: + * Returns the settled destination address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Transmitted destination address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_txdestaddr(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read value from the PCKT_FLT_GOALS_SOURCE_ADDR register */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_SOURCE_ADDR_BASE, ®val, 1); + + /* Return value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_nodeaddress + * + * Description: + * Sets the node my address. When the filtering on my address is on, if the + * destination address extracted from the received packet is equal to the + * content of the my address, then the packet is accepted (this is the + * address of the node). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * srcaddr - Address of the present node. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_nodeaddress(FAR struct spirit_library_s *spirit, + uint8_t srcaddr) +{ + /* Write value to the PCKT_FLT_GOALS_TX_ADDR register */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_TX_ADDR_BASE, &srcaddr, 1); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_nodeaddress + * + * Description: + * Returns the address of the present node. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * My address (address of this node). + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_nodeaddress(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read value from the PCKT_FLT_GOALS_TX_ADDR register */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_TX_ADDR_BASE, ®val, 1); + + /* Return value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_bcastaddr + * + * Description: + * Sets the broadcast address. If the destination address extracted from the + * received packet is equal to the content of the BROADCAST_ADDR register, + * then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * bcastaddr - Broadcast address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_bcastaddr(FAR struct spirit_library_s *spirit, + uint8_t bcastaddr) +{ + /* Write value to the PCKT_FLT_GOALS_BROADCAST register */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_BROADCAST_BASE, &bcastaddr, 1); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_bcastaddr + * + * Description: + * Returns the broadcast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Broadcast address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_bcastaddr(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read value from the PCKT_FLT_GOALS_BROADCAST register */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_BROADCAST_BASE, ®val, 1); + + /* Return value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_mcastaddr + * + * Description: + * Sets the multicast address. When the multicast filtering is on, if the + * destination address extracted from the received packet is equal to the + * content of the MULTICAST_ADDR register, then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mcastaddr - Multicast address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_mcastaddr(FAR struct spirit_library_s *spirit, + uint8_t mcastaddr) +{ + /* Write value to the PCKT_FLT_GOALS_MULTICAST register */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_MULTICAST_BASE, &mcastaddr, 1); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_mcastaddr + * + * Description: + * Returns the multicast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Multicast address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_mcastaddr(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read value from the PCKT_FLT_GOALS_MULTICAST register */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_MULTICAST_BASE, ®val, 1); + + /* Return value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_ctrlmask + * + * Description: + * Sets the control mask. The 1 bits of the CONTROL_MASK indicate the bits + * to be used in filtering. (All 0s no filtering) + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mask Control mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_ctrlmask(FAR struct spirit_library_s *spirit, + uint32_t mask) +{ + uint8_t regval[4]; + + /* Split the 32-bit value in 4 8-bit values */ + + regval[0] = (uint8_t)mask; + regval[1] = (uint8_t)(mask >> 8); + regval[2] = (uint8_t)(mask >> 16); + regval[3] = (uint8_t)(mask >> 24); + + /* Write values to the CKT_FLT_GOALS_CONTROLx_MASK registers */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_CONTROL0_MASK_BASE, regval, 4); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_ctrlmask + * + * Description: + * Returns the control mask. The 1 bits of the CONTROL_MASK indicate the + * bits to be used in filtering. (All 0s no filtering) + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control mask. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_ctrlmask(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[4]; + uint32_t ctrlmask = 0; + int i; + + /* Read the PCKT_FLT_GOALS_CONTROLx_MASK registers */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_CONTROL0_MASK_BASE, regval, 4); + + /* Rebuild the control mask value on a 32-bit integer variable */ + + for (i = 0; i < 4; i++) + { + ctrlmask |= (uint32_t)regval[i] << (8 * i); + } + + /* Return value */ + + return ctrlmask; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_ctrlref + * + * Description: + * Sets the control field reference. If the bits enabled by the CONTROL_MASK + * match the ones of the control fields extracted from the received packet + * then the packet is accepted. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * reference - Control reference. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_ctrlref(FAR struct spirit_library_s *spirit, + uint32_t reference) +{ + uint8_t regval[4]; + + /* Split the 32-bit value in 4 8-bit values */ + + regval[0] = (uint8_t)reference; + regval[1] = (uint8_t)(reference >> 8); + regval[2] = (uint8_t)(reference >> 16); + regval[3] = (uint8_t)(reference >> 24); + + /* Write values to the CKT_FLT_GOALS_CONTROLx_FIELD registers */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_CONTROL0_FIELD_BASE, regval, 4); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_ctrlref + * + * Description: + * Returns the control field reference. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control reference. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_ctrlref(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[4]; + uint32_t ctrlref = 0; + int i; + + /* Read the PCKT_FLT_GOALS_CONTROLx_FIELD registers */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_CONTROL0_FIELD_BASE, regval, 4); + + /* Rebuild the control mask value on a 32-bit integer variable */ + + for (i = 0; i < 4; i++) + { + ctrlref |= ((uint32_t) regval[i]) << (8 * i); + } + + /* Return value */ + + return ctrlref; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_txctrl + * + * Description: + * Sets the TX control field. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * txctrl - Tx control field. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txctrl(FAR struct spirit_library_s *spirit, + uint32_t txctrl) +{ + uint8_t regval[4]; + + /* Split the 32-bit value in 4 8-bit values */ + + regval[3] = (uint8_t)txctrl; + regval[2] = (uint8_t)(txctrl >> 8); + regval[1] = (uint8_t)(txctrl >> 16); + regval[0] = (uint8_t)(txctrl >> 24); + + /* Write value to the TX_CTRL_FIELDx register */ + + return spirit_reg_write(spirit, TX_CTRL_FIELD3_BASE, regval, 4); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_txctrl + * + * Description: + * Returns the Tx control field. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Control field of the transmitted packet. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_txctrl(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[4]; + uint32_t ctrlfield = 0; + int i; + + /* Read the TX_CTRL_FIELDx registers */ + + (void)spirit_reg_read(spirit, TX_CTRL_FIELD3_BASE, regval, 4); + + /* Rebuild value: build a 32-bit value from the read bytes */ + + for (i = 0; i < 4; i++) + { + ctrlfield |= ((uint32_t) regval[i]) << (8 * (3 - i)); + } + + /* Return value */ + + return ctrlfield; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_destaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * My address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_SOURCE_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_destaddr_filter(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)); + + /* Modify the register value: set or reset the TX source address control */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + if (ret >= 0) + { + /* Set or reset the DESTINATION vs TX enabling bit */ + + if (newstate == S_ENABLE) + { + regval |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; + } + else + { + regval &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; + } + + /* Write the new value to the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_mcastaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * multicast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_MULTICAST_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_mcastaddr_filter(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)); + + /* Read the PCKT_FLT_OPTIONS register value */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + if (ret >= 0) + { + /* Enable or disable the filtering option */ + + if (newstate == S_ENABLE) + { + regval |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; + } + else + { + regval &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; + } + + /* Write the new value to the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_bcastaddr_filter + * + * Description: + * If enabled RX packet is accepted if its destination address matches with + * broadcast address. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for DEST_VS_BROADCAST_ADDRESS. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_bcastaddr_filter(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)); + + /* Read the register value */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + if (ret >= 0) + { + /* Enable or disable the filtering option */ + + if (newstate == S_ENABLE) + { + regval |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; + } + else + { + regval &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; + } + + /* Write the new value to the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_destaddr_filter + * + * Description: + * Returns the enable bit of the my address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_destaddr_filter(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the register value */ + + (void)spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + + /* Gets the enable/disable bit in form of enum spirit_functional_state_e type */ + + if (regval & 0x08) + { + return S_ENABLE; + } + else + { + return S_DISABLE; + } +} + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_mcastaddr_filter + * + * Description: + * Returns the enable bit of the multicast address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_mcastaddr_filter(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the register value */ + + (void)spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + + /* Get the enable/disable bit in form of enum spirit_functional_state_e type */ + + if (regval & 0x04) + { + return S_ENABLE; + } + else + { + return S_DISABLE; + } +} + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_bcastaddr_filter + * + * Description: + * Returns the enable bit of the broadcast address filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_bcastaddr_filter(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the register value */ + + (void)spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + + /* Get the enable/disable bit in form of enum spirit_functional_state_e type */ + + if (regval & 0x02) + { + return S_ENABLE; + } + else + { + return S_DISABLE; + } +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxdestaddr + * + * Description: + * Returns the destination address of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Destination address of the received address. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxdestaddr(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the RX_ADDR_FIELD0 register value */ + + (void)spirit_reg_read(spirit, RX_ADDR_FIELD0_BASE, ®val, 1); + + /* Return value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxctrl + * + * Description: + * Returns the control field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Received control field. + * + ******************************************************************************/ + +uint32_t spirit_pktcommon_get_rxctrl(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[4]; + uint32_t ctrlfield = 0; + int i; + + /* Read the PCKT_FLT_GOALS_CONTROLx_MASK registers */ + + (void)spirit_reg_read(spirit, RX_CTRL_FIELD0_BASE, regval, 4); + + /* Rebuild the control mask value on a 32-bit integer variable */ + + for (i = 0; i < 4; i++) + { + ctrlfield |= ((uint32_t)regval[i]) << (8 * i); + } + + /* Returns value */ + + return ctrlfield; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxcrc + * + * Description: + * Returns the CRC field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * crc - Array in which the CRC field has to be stored. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_get_rxcrc(FAR struct spirit_library_s *spirit, + FAR uint8_t *crc) +{ + enum pkt_crcmode_e crcmode; + uint8_t regval[3]; + uint8_t crclen; + int ret; + int i; + + /* Gets the CRC mode in enum pkt_crcmode_e enum */ + + crcmode = spirit_pktcommon_get_crcmode(spirit); + + /* Cast to FAR uint8_t */ + + crclen = (uint8_t)crcmode; + + /* Obtains the real length: see the @ref enum pkt_crcmode_e enumeration */ + + crclen >>= 5; + if (crclen >= 3) + { + crclen--; + } + + /* Read the CRC_FIELDx registers value */ + + ret = spirit_reg_read(spirit, CRC_FIELD2_BASE, regval, 3); + if (ret >= 0) + { + /* Sets the array to be returned */ + + for (i = 0; i < 3; i++) + { + if (i < crclen) + { + crc[i] = regval[2 - i]; + } + else + { + crc[i] = 0; + } + } + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_rxautoack + * + * Description: + * Sets the AUTO ACKNOLEDGEMENT mechanism on the receiver. When the feature + * is enabled and a data packet has been correctly received, then an + * acknowledgement packet is sent back to the originator of the received + * packet. If the PIGGYBACKING bit is also set, payload data will be read + * from the FIFO; otherwise an empty packet is sent only containing the + * source and destination addresses and the sequence number of the packet + * being acknowledged. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * autoack - New state for autoack. + * piggyback - New state for autoack. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_rxautoack(FAR struct spirit_library_s *spirit, + enum spirit_functional_state_e autoack, + enum spirit_functional_state_e piggyback) +{ + uint8_t regval[2]; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(autoack)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(piggyback)); + + /* Check if piggybacking is enabled and autoack is disabled */ + + DEBUGASSERT(!(piggyback == S_ENABLE && autoack == S_DISABLE)); + + /* Read the PROTOCOL[1:0] registers value */ + + ret = spirit_reg_read(spirit, PROTOCOL1_BASE, regval, 2); + if (ret >= 0) + { + /* Sets the specified LLP option */ + + /* Autoack setting */ + + if (autoack == S_ENABLE) + { + regval[1] |= PROTOCOL0_AUTO_ACK_MASK; + } + else + { + regval[1] &= (~PROTOCOL0_AUTO_ACK_MASK); + } + + /* Piggybacking setting */ + + if (piggyback == S_ENABLE) + { + regval[0] |= PROTOCOL1_PIGGYBACKING_MASK; + } + else + { + regval[0] &= (~PROTOCOL1_PIGGYBACKING_MASK); + } + + /* Write data to the PROTOCOL[1:0] registers */ + + ret = spirit_reg_write(spirit, PROTOCOL1_BASE, regval, 2); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_txautoack + * + * Description: + * Sets the AUTO ACKNOLEDGEMENT mechanism on the transmitter. On the + * transmitter side, the NACK_TX field can be used to require or not an + * acknowledgment for each individual packet: if NACK_TX is set to "1" then + * acknowledgment will not be required; if NACK_TX is set to "0" then + * acknowledgment will be required. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for TX_AUTOACK. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_txautoack(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)); + + /* Read value from the PROTOCOL0 register */ + + ret = spirit_reg_read(spirit, PROTOCOL0_BASE, ®val, 1); + if (ret >= 0) + { + /* Enables or disables the ack requirement option */ + + if (newstate == S_DISABLE) + { + regval |= PROTOCOL0_NACK_TX_MASK; + } + else + { + regval &= ~PROTOCOL0_NACK_TX_MASK; + } + + /* Write value to the PROTOCOL0 register */ + + ret = spirit_reg_write(spirit, PROTOCOL0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_txseqno + * + * Description: + * Sets the TX sequence number to be used to start counting. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * seqno - New value for Tx seq number reload. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_txseqno(FAR struct spirit_library_s *spirit, + uint8_t seqno) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_SEQ_NUMBER_RELOAD(seqno)); + + /* Read value from the PROTOCOL2 register */ + + ret = spirit_reg_read(spirit, PROTOCOL2_BASE, ®val, 1); + if (ret >= 0) + { + regval &= 0xe7; + regval |= (seqno << 3); + + /* Write value to the PROTOCOL2 register */ + + ret = spirit_reg_write(spirit, PROTOCOL2_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_set_maxretx + * + * Description: + * Set the maximum number of TX retries (from 0 to 15). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * seqno - New value for Tx seq number reload. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_set_maxretx(FAR struct spirit_library_s *spirit, + enum spirit_maxretx_e maxretx) +{ + uint8_t regval; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_MAXRETX(maxretx)); + + /* Read the PROTOCOL0 register value */ + + ret = spirit_reg_read(spirit, PROTOCOL0_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the value to be written */ + + regval &= ~PROTOCOL0_NMAX_RETX_MASK; + regval |= maxretx; + + /* Write value to the PROTOCOL0 register */ + + ret = spirit_reg_write(spirit, PROTOCOL0_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_maxretx + * + * Description: + * Returns the max number of automatic retransmission. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Max number of retransmissions. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_maxretx(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PROTOCOL0 register value */ + + (void)spirit_reg_read(spirit, PROTOCOL0_BASE, ®val, 1); + + /* Build the value to be written */ + + return ((regval & PROTOCOL0_NMAX_RETX_MASK) >> 4); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_txackreq + * + * Description: + * Returns the TX ACK request + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Max number of retransmissions. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_get_txackreq(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the PROTOCOL0 register value */ + + (void)spirit_reg_read(spirit, RX_PCKT_INFO_BASE, ®val, 1); + + /* Build the value to be written */ + + return (enum spirit_functional_state_e) ((regval & TX_PCKT_INFO_NACK_RX) >> 2); +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxsrcaddr + * + * Description: + * Returns the source address of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Source address of the received packet. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxsrcaddr(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the RX_ADDR_FIELD1 register value */ + + (void)spirit_reg_read(spirit, RX_ADDR_FIELD1_BASE, ®val, 1); + + /* Returns value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxseqno + * + * Description: + * Returns the sequence number of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Received Sequence number. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxseqno(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the RX_PCKT_INFO register value */ + + (void)spirit_reg_read(spirit, RX_PCKT_INFO_BASE, ®val, 1); + + /* Obtains and returns the sequence number */ + + return regval & 0x03; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_rxnak + * + * Description: + * Returns the Nack bit of the received packet + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Value of the Nack bit. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_rxnak(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the RX_PCKT_INFO register value */ + + (void)spirit_reg_read(spirit, RX_PCKT_INFO_BASE, ®val, 1); + + /* Obtains and returns the RX nack bit */ + + return (regval >> 2) & 0x01; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_txseqno + * + * Description: + * Returns the sequence number of the transmitted packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Sequence number of the transmitted packet. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_txseqno(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the TX_PCKT_INFO register value */ + + (void)spirit_reg_read(spirit, TX_PCKT_INFO_BASE, ®val, 1); + + /* Obtains and returns the TX sequence number */ + + return (regval >> 4) & 0x07; +} + +/****************************************************************************** + * Name: spirit_pktcommon_get_nretx + * + * Description: + * Returns the number of retransmission done on the transmitted packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Number of retransmissions done until now. + * + ******************************************************************************/ + +uint8_t spirit_pktcommon_get_nretx(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the TX_PCKT_INFO register value */ + + (void)spirit_reg_read(spirit, TX_PCKT_INFO_BASE, ®val, 1); + + /* Obtains and returns the number of retransmission done */ + + return (regval & 0x0f); +} + +/****************************************************************************** + * Name: spirit_pktcommon_enable_ctrl_filter + * + * Description: + * If enabled RX packet is accepted only if the masked control field matches + * the masked control field reference (CONTROL_MASK & CONTROL_FIELD_REF == + * CONTROL_MASK & RX_CONTROL_FIELD). + * + * NOTE: This filtering control is enabled by default but the control mask is + * by default set to 0. As a matter of fact the user has to enable the + * control filtering bit after the packet initialization because the packet + * initialization routine disables it. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for Control filtering enable bit. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktcommon_enable_ctrl_filter(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)); + + /* Modify the register value: set or reset the control bit filtering */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + if (ret >= 0) + { + /* Set or reset the CONTROL filtering enabling bit */ + + if (newstate == S_ENABLE) + { + regval |= PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK; + } + else + { + regval &= ~PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK; + } + + /* Write the new value to the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktcommon_isenabled_ctrl_filter + * + * Description: + * Returns the enable bit of the control field filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * S_ENABLE or S_DISABLE. + * + ******************************************************************************/ + +enum spirit_functional_state_e + spirit_pktcommon_isenabled_ctrl_filter(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Read the register value */ + + (void)spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + + /* Gets the enable/disable bit in form of enum spirit_functional_state_e type */ + + if (regval & PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK) + { + return S_ENABLE; + } + else + { + return S_DISABLE; + } +} diff --git a/drivers/wireless/spirit/lib/spirit_pktstack.c b/drivers/wireless/spirit/lib/spirit_pktstack.c new file mode 100644 index 0000000000..eac37980c0 --- /dev/null +++ b/drivers/wireless/spirit/lib/spirit_pktstack.c @@ -0,0 +1,921 @@ +/****************************************************************************** + * drivers/wireless/spirit/spirit_pktstack.c + * Configuration and management of SPIRIT STack packets. + * + * Copyright(c) 2015 STMicroelectronics + * Author: VMA division - AMS + * Version 3.2.2 08-July-2015 + * + * Adapted for NuttX by: + * Author: Gregory Nutt + * + * 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 +#include + +#include "spirit_spi.h" +#include "spirit_pktcommon.h" +#include "spirit_pktstack.h" + +/****************************************************************************** + * Public Functions + ******************************************************************************/ + +/****************************************************************************** + * Name: spirit_pktstack_initialize + * + * Description: + * Initializes the SPIRIT STack packet according to the specified parameters + * in the struct spirit_pktstack_init_s. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pktstack - STack packet init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_init_s *pktstack) +{ + uint8_t regval[4]; + uint8_t pktlenwidth; + int ret; + int i; + + /* Check the parameters */ + + DEBUGASSERT(IS_PKT_PREAMBLE_LENGTH(pktstack->premblen)); + DEBUGASSERT(IS_PKT_SYNC_LENGTH(pktstack->synclen)); + DEBUGASSERT(IS_PKT_CRC_MODE(pktstack->crcmode)); + DEBUGASSERT(IS_PKT_LENGTH_WIDTH_BITS(pktstack->pktlenwidth)); + DEBUGASSERT(IS_PKT_CRC_MODE(pktstack->fixvarlen)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(pktstack->fec)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(pktstack->datawhite)); + DEBUGASSERT(IS_PKT_CONTROL_LENGTH(pktstack->ctrllen)); + + /* Read the PROTOCOL1 register */ + + ret = spirit_reg_read(spirit, PROTOCOL1_BASE, ®val[0], 1); + if (ret < 0) + { + return ret; + } + + /* Mask a reserved bit */ + + regval[0] &= ~0x20; + + /* Always (!) set the automatic packet filtering */ + + regval[0] |= PROTOCOL1_AUTO_PCKT_FLT_MASK; + + /* Write the value to register */ + + ret = spirit_reg_write(spirit, PROTOCOL1_BASE, ®val[0], 1); + if (ret < 0) + { + return ret; + } + + /* Read the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val[0], 1); + if (ret < 0) + { + return ret; + } + + /* Always reset the control and source filtering */ + + regval[0] &= ~(PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK | + PCKT_FLT_OPTIONS_CONTROL_FILTERING_MASK); + + /* Write the value to register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val[0], 1); + if (ret < 0) + { + return ret; + } + + /* Address and control length setting: source and destination address are + * always present so ADDRESS_LENGTH=2 */ + + regval[0] = 0x10 | (uint8_t)pktstack->ctrllen; + + /* Packet format and width length setting */ + + pktlenwidth = pktstack->pktlenwidth; + if (pktlenwidth == 0) + { + pktlenwidth = 1; + } + + regval[1] = (uint8_t)PCKTCTRL3_PCKT_FRMT_STACK | (uint8_t)(pktlenwidth - 1); + + /* Preamble, sync and fixed or variable length setting */ + + regval[2] = ((uint8_t)pktstack->premblen) | ((uint8_t)pktstack->synclen) | + ((uint8_t)pktstack->fixvarlen); + + /* CRC length, whitening and FEC setting */ + + regval[3] = (uint8_t) pktstack->crcmode; + + if (pktstack->datawhite == S_ENABLE) + { + regval[3] |= PCKTCTRL1_WHIT_MASK; + } + + if (pktstack->fec == S_ENABLE) + { + regval[3] |= PCKTCTRL1_FEC_MASK; + } + + /* Write registers */ + + ret = spirit_reg_write(spirit, PCKTCTRL4_BASE, regval, 4); + if (ret < 0) + { + return ret; + } + + /* Sync words setting */ + + for (i = 0; i < 4; i++) + { + if (i < 3 - (pktstack->synclen >> 1)) + { + regval[i] = 0; + } + else + { + regval[i] = (uint8_t) (pktstack->syncwords >> (8 * i)); + } + } + + /* Enables or disables the CRC check */ + + if (pktstack->crcmode == PKT_NO_CRC) + { + ret = spirit_pktcommon_enable_crcfilter(spirit, S_DISABLE); + } + else + { + ret = spirit_pktcommon_enable_crcfilter(spirit, S_ENABLE); + } + + if (ret < 0) + { + return ret; + } + + /* Write registers */ + + return spirit_reg_write(spirit, SYNC4_BASE, regval, 4); +} + +/****************************************************************************** + * Name: spirit_pktstack_get_setup + * Description: + * Returns the SPIRIT STack packet structure according to the specified + * parameters in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * pktstack - STack packet init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_setup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_init_s *pktstack) +{ + uint8_t regval[10]; + int ret; + int i; + + /* Read registers */ + + ret = spirit_reg_read(spirit, PCKTCTRL4_BASE, regval, 10); + if (ret >= 0) + { + /* Length width */ + + pktstack->pktlenwidth = (regval[1] & 0x0f) + 1; + + /* Control length */ + + pktstack->ctrllen = regval[0] & 0x07; + + /* CRC mode */ + + pktstack->crcmode = regval[3] & 0xe0; + + /* Whitening */ + + pktstack->datawhite = (regval[3] >> 4) & 0x01; + + /* FEC */ + + pktstack->fec = regval[3] & 0x01; + + /* FIX or VAR bit */ + + pktstack->fixvarlen = regval[2] & 0x01; + + /* Preamble length */ + + pktstack->premblen = regval[2] & 0xf8; + + /* Sync length */ + + pktstack->synclen = regval[2] & 0x06; + + /* sync Words */ + + pktstack->syncwords = 0; + for (i = 0; i < 4; i++) + { + if (i > 2 - (pktstack->synclen >> 1)) + { + pktstack->syncwords |= regval[i + 6] << (8 * i); + } + } + } + + return OK; +} + +/****************************************************************************** + * Name: spirit_pktstack_address_initialize + * + * Description: + * Initializes the SPIRIT STack packet addresses according to the specified + * parameters in the PktStackAddresses struct. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * addrinit - STack packet addresses init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_address_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_address_s *addrinit) +{ + uint8_t regval[3]; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(addrinit->destfilter)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(addrinit->mcastfilter)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(addrinit->bcastfilter)); + + /* Read the filtering options ragister */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val[0], 1); + if (ret >= 0) + { + /* Enables or disables filtering on my address */ + + if (addrinit->destfilter == S_ENABLE) + { + regval[0] |= PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; + } + else + { + regval[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_TX_ADDR_MASK; + } + + /* Enables or disables filtering on multicast address */ + + if (addrinit->mcastfilter == S_ENABLE) + { + regval[0] |= PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; + } + else + { + regval[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_MULTICAST_ADDR_MASK; + } + + /* Enables or disables filtering on broadcast address */ + + if (addrinit->bcastfilter == S_ENABLE) + { + regval[0] |= PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; + } + else + { + regval[0] &= ~PCKT_FLT_OPTIONS_DEST_VS_BROADCAST_ADDR_MASK; + } + + /* Write values to the register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val[0], 1); + if (ret >= 0) + { + /* Fill array with the addresses passed in the structure */ + + regval[0] = addrinit->bcastaddr; + regval[1] = addrinit->mcastaddr; + regval[2] = addrinit->srcaddr; + + /* Write them to the addresses registers */ + + ret = spirit_reg_write(spirit, PCKT_FLT_GOALS_BROADCAST_BASE, regval, 3); + } + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktstack_get_addrsetup + * + * Description: + * Returns the SPIRIT STack packet addresses structure according to the + * specified parameters in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * addrinit - STack packet addresses init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_addrsetup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_address_s *addrinit) +{ + uint8_t regval[3]; + int ret; + + /* Read values from the PCKT_FLT_GOALS registers */ + + ret = spirit_reg_read(spirit, PCKT_FLT_GOALS_BROADCAST_BASE, regval, 3); + if (ret >= 0) + { + /* Fit the structure with the read addresses */ + + addrinit->bcastaddr = regval[0]; + addrinit->mcastaddr = regval[1]; + addrinit->srcaddr = regval[2]; + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val[0], 1); + if (ret >= 0) + { + /* Fit the structure with the read filtering bits */ + + addrinit->bcastfilter = + (enum spirit_functional_state_e)((regval[0] >> 1) & 0x01); + addrinit->mcastfilter = + (enum spirit_functional_state_e)((regval[0] >> 2) & 0x01); + addrinit->destfilter = + (enum spirit_functional_state_e)((regval[0] >> 3) & 0x01); + } + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktstack_llp_initialize + * + * Description: + * Initializes the SPIRIT STack packet LLP options according to the specified + * parameters in the struct spirit_pktstack_llp_s struct. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * llpinit - STack packet LLP init structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_llp_initialize(FAR struct spirit_library_s *spirit, + FAR const struct spirit_pktstack_llp_s *llpinit) +{ + uint8_t regval[2]; + int ret; + + /* Check the parameters */ + + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(llpinit->piggyback)); + DEBUGASSERT(IS_SPIRIT_FUNCTIONAL_STATE(llpinit->autoack)); + DEBUGASSERT(IS_PKT_MAXRETX(llpinit->maxretx)); + + /* Check if piggybacking is enabled and autoack is disabled */ + + DEBUGASSERT(!(llpinit->piggyback == S_ENABLE && + llpinit->autoack == S_DISABLE)); + + /* Piggybacking mechanism setting from the PROTOCOL1 register */ + + ret = spirit_reg_read(spirit, PROTOCOL1_BASE, regval, 2); + if (ret >= 0) + { + if (llpinit->piggyback == S_ENABLE) + { + regval[0] |= PROTOCOL1_PIGGYBACKING_MASK; + } + else + { + regval[0] &= ~PROTOCOL1_PIGGYBACKING_MASK; + } + + /* RX and TX autoack mechanisms setting from the PROTOCOL0 register */ + + if (llpinit->autoack == S_ENABLE) + { + regval[1] |= PROTOCOL0_AUTO_ACK_MASK; + } + else + { + regval[1] &= ~PROTOCOL0_AUTO_ACK_MASK; + } + + /* Max number of retransmission setting */ + + regval[1] &= ~PROTOCOL0_NMAX_RETX_MASK; + regval[1] |= llpinit->maxretx; + + /* Write registers */ + + ret = spirit_reg_write(spirit, PROTOCOL1_BASE, regval, 2); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktstack_get_llpsetup + * + * Description: + * Returns the SPIRIT STack packet LLP options according to the specified + * values in the registers. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * llpinit - STack packet LLP structure. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_get_llpsetup(FAR struct spirit_library_s *spirit, + FAR struct spirit_pktstack_llp_s *llpinit) +{ + uint8_t regval[2]; + int ret; + + /* Piggybacking mechanism setting from the PROTOCOL1 register */ + + ret = spirit_reg_read(spirit, PROTOCOL1_BASE, regval, 2); + if (ret >= 0) + { + /* Fit the structure with the read values */ + + llpinit->piggyback = (regval[0] >> 6) & 0x01; + llpinit->autoack = (regval[1] >> 2) & 0x01; + llpinit->maxretx = regval[1] & PROTOCOL0_NMAX_RETX_MASK; + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktstack_set_format + * + * Description: + * Configures the Stack packet format for SPIRIT. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_set_format(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + int ret; + + /* Read the PCKTCTRL3 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL3_BASE, ®val, 1); + if (ret < 0) + { + return ret; + } + + /* Build value to be written. Also set to 0 the direct RX mode bits */ + + regval &= 0x0f; + regval |= ((uint8_t) PCKTCTRL3_PCKT_FRMT_STACK); + + /* Write the value to the PCKTCTRL3 register. */ + + ret = spirit_reg_write(spirit, PCKTCTRL3_BASE, ®val, 1); + if (ret < 0) + { + return ret; + } + + /* Read 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; + + /* Write the PCKTCTRL1 value to register */ + + ret = spirit_reg_write(spirit, PCKTCTRL1_BASE, ®val, 1); + if (ret < 0) + { + return ret; + } + + /* Read the PROTOCOL1 register */ + + ret = spirit_reg_read(spirit, PROTOCOL1_BASE, ®val, 1); + if (ret < 0) + { + return ret; + } + + /* Mask a reserved bit */ + + regval &= ~0x20; + + /* Write the value to the PROTOCOL1 register */ + + return spirit_reg_write(spirit, PROTOCOL1_BASE, ®val, 1); +} + +/****************************************************************************** + * Name: spirit_pktstack_enable_addrlen + * + * Description: + * Sets the address length for SPIRIT STack packets (always 2). + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_enable_addrlen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + int ret; + + /* Read the PCKTCTRL4 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL4_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the new value */ + + regval &= ~PCKTCTRL4_ADDRESS_LEN_MASK; + regval |= ((uint8_t) 0x10); + + /* Write the value to the PCKTCTRL4 register */ + + ret = spirit_reg_write(spirit, PCKTCTRL4_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pktstack_set_payloadlen + * + * Description: + * Sets the payload length for SPIRIT STack packets. Since the packet length + * depends from the address (always 2 for this packet format) and the + * control field size, this function reads the control length register + * content in order to determine the correct packet length to be written. + * + * 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_pktstack_set_payloadlen(FAR struct spirit_library_s *spirit, + uint16_t payloadlen) +{ + uint8_t regval[2]; + + /* Computes the oversize (address + control) size */ + + uint16_t oversize = 2 + (uint16_t)spirit_pktcommon_get_controllen(spirit); + + /* Computes PCKTLEN0 value from lPayloadLength */ + + regval[1] = BUILD_PCKTLEN0(payloadlen + oversize); + + /* Computes PCKTLEN1 value from lPayloadLength */ + + regval[0] = BUILD_PCKTLEN1(payloadlen + oversize); + + /* Write the value to the PCKTLENx registers */ + + return spirit_reg_write(spirit, PCKTLEN1_BASE, regval, 2); +} + +/****************************************************************************** + * Name: spirit_pktstack_get_payloadlen + * + * Description: + * Returns the payload length for SPIRIT STack packets. Since the packet + * length depends from the address and the control field size, this function + * reads the correspondent registers in order to determine the correct + * payload length to be returned. + * + * Input Parameters: + * None. + * + * Returned Value: + * Payload length. + * + ******************************************************************************/ + +uint16_t spirit_pktstack_get_payloadlen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[2]; + uint16_t oversize; + + /* Computes the oversize (address + control) size */ + + oversize = 2 + (uint16_t)spirit_pktcommon_get_controllen(spirit); + + /* Read the PCKTLEN1 registers value */ + + (void)spirit_reg_read(spirit, PCKTLEN1_BASE, regval, 2); + + /* Rebuild and return the payload length value */ + + return ((((uint16_t) regval[1]) << 8) + (uint16_t) regval[0] - oversize); +} + +/****************************************************************************** + * Name: spirit_pktstack_set_varlen + * + * Description: + * Computes and sets the variable payload length for SPIRIT STack packets. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * payloadlen - Payload length in bytes. + * ctrllen - Control length in bytes. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pktstack_set_varlen(FAR struct spirit_library_s *spirit, + uint16_t payloadlen, + enum pkt_ctrllen_e ctrllen) +{ + uint32_t pktlen; + uint8_t regval; + int ret; + int i; + + /* packet length = payload length + address length (2) + control length */ + + pktlen = payloadlen + 2 + ctrllen; + + /* Computes the number of bits */ + + for (i = 0; i < 16; i++) + { + if (pktlen == 0) + { + break; + } + + pktlen >>= 1; + } + + if (i == 0) + { + i = 1; + } + + /* Read the PCKTCTRL3 register value */ + + ret = spirit_reg_read(spirit, PCKTCTRL3_BASE, ®val, 1); + if (ret >= 0) + { + /* Build the register value */ + + regval &= ~PCKTCTRL3_LEN_WID_MASK; + regval |= (uint8_t)(i - 1); + + /* Write the PCKTCTRL3 register value */ + + ret = spirit_reg_write(spirit, PCKTCTRL3_BASE, ®val, 1); + } + + return ret; +} + +/****************************************************************************** + * Name: spirit_pkstack_set_rxsource_addrmask + * + * Description: + * Rx packet source mask. Used to mask the address of the accepted packets. + * If 0 -> no filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * mask - Rx source mask. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkstack_set_rxsource_addrmask(FAR struct spirit_library_s *spirit, + uint8_t mask) +{ + /* Write value to the register PCKT_FLT_GOALS_SOURCE_MASK */ + + return spirit_reg_write(spirit, PCKT_FLT_GOALS_SOURCE_MASK_BASE, &mask, 1); +} + +/****************************************************************************** + * Name: spirit_pktstack_get_rxsource_addrmask + * + * Description: + * Returns the Rx packet source mask. Used to mask the address of the + * accepted packets. If 0 -> no filtering. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Rx source mask. + * + ******************************************************************************/ + +uint8_t spirit_pktstack_get_rxsource_addrmask(FAR struct spirit_library_s *spirit) +{ + uint8_t regval; + + /* Write value to the PCKT_FLT_GOALS_SOURCE_MASK register */ + + (void)spirit_reg_read(spirit, PCKT_FLT_GOALS_SOURCE_MASK_BASE, ®val, 1); + + /* Return the read value */ + + return regval; +} + +/****************************************************************************** + * Name: spirit_pkstack_get_rxpktlen + * + * Description: + * Returns the packet length field of the received packet. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * + * Returned Value: + * Packet length. + * + ******************************************************************************/ + +uint16_t spirit_pkstack_get_rxpktlen(FAR struct spirit_library_s *spirit) +{ + uint8_t regval[2]; + uint16_t pktlen; + + /* Read the RX_PCKT_LENx registers value */ + + (void)spirit_reg_read(spirit, RX_PCKT_LEN1_BASE, regval, 2); + + /* Rebuild and return the the length field */ + + pktlen = ((((uint16_t) regval[0]) << 8) + (uint16_t) regval[1]); + + /* Computes the oversize (address + control) size */ + + pktlen -= 2 + (uint16_t)spirit_pktcommon_get_controllen(spirit); + + return pktlen; +} + +/****************************************************************************** + * Name: spirit_pkstack_enable_rxsource_addrfilter + * + * Description: + * If enabled RX packet is accepted only if the masked source address field + * matches the masked source address field reference (SOURCE_MASK & + * SOURCE_FIELD_REF == SOURCE_MASK & RX_SOURCE_FIELD). + * + * NOTE: This filtering control is enabled by default but the source + * address mask is by default set to 0. As a matter of fact the user has + * to enable the source filtering bit after the packet initialization + * because the packet initialiazation routine disables it. + * + * Input Parameters: + * spirit - Reference to a Spirit library state structure instance + * newstate - New state for Source address filtering enable bit. + * This parameter can be S_ENABLE or S_DISABLE. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ******************************************************************************/ + +int spirit_pkstack_enable_rxsource_addrfilter(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)); + + /* Modify the register value: set or reset the source bit filtering */ + + ret = spirit_reg_read(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + if (ret >= 0) + { + /* Set or reset the SOURCE ADDRESS filtering enabling bit */ + + if (newstate == S_ENABLE) + { + regval |= PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK; + } + else + { + regval &= ~PCKT_FLT_OPTIONS_SOURCE_FILTERING_MASK; + } + + /* Write the new value to the PCKT_FLT_OPTIONS register */ + + ret = spirit_reg_write(spirit, PCKT_FLT_OPTIONS_BASE, ®val, 1); + } + + return ret; +} diff --git a/drivers/wireless/spirit/lib/spirit_radio.c b/drivers/wireless/spirit/lib/spirit_radio.c index 43714b7741..da2eaeb2e4 100644 --- a/drivers/wireless/spirit/lib/spirit_radio.c +++ b/drivers/wireless/spirit/lib/spirit_radio.c @@ -1915,7 +1915,7 @@ int spirit_radio_enable_digdivider(FAR struct spirit_library_s *spirit, /* Reads the XO_RCO_TEST_BASE and mask the PD_CLKDIV bit field */ ret = spirit_reg_read(spirit, XO_RCO_TEST_BASE, ®val, 1); - if (ret > 0) + if (ret >= 0) { if (newstate == S_ENABLE) { diff --git a/include/nuttx/serial/tioctl.h b/include/nuttx/serial/tioctl.h index e4c01690ed..5cde650765 100644 --- a/include/nuttx/serial/tioctl.h +++ b/include/nuttx/serial/tioctl.h @@ -86,33 +86,34 @@ #define TIOCINQ _TIOC(0x0012) /* Bytes in input buffer: int */ #define TIOCOUTQ _TIOC(0x0013) /* Bytes in output buffer: int */ #define TCFLSH _TIOC(0x0014) /* Flush: int */ +#define TCDRN _TIOC(0x0015) /* Drain: void */ /* Faking input */ -#define TIOCSTI _TIOC(0x0015) /* Insert into input: const char */ +#define TIOCSTI _TIOC(0x0016) /* Insert into input: const char */ /* Re-directing console output */ -#define TIOCCONS _TIOC(0x0016) /* Re-direct console output to device: void */ +#define TIOCCONS _TIOC(0x0017) /* Re-direct console output to device: void */ /* Controlling TTY */ -#define TIOCSCTTY _TIOC(0x0017) /* Make controlling TTY: int */ -#define TIOCNOTTY _TIOC(0x0018) /* Give up controllinog TTY: void */ +#define TIOCSCTTY _TIOC(0x0018) /* Make controlling TTY: int */ +#define TIOCNOTTY _TIOC(0x0019) /* Give up controllinog TTY: void */ /* Exclusive mode */ -#define TIOCEXCL _TIOC(0x0019) /* Put TTY in exclusive mode: void */ -#define TIOCNXCL _TIOC(0x001a) /* Disable exclusive mode: void */ +#define TIOCEXCL _TIOC(0x001a) /* Put TTY in exclusive mode: void */ +#define TIOCNXCL _TIOC(0x001b) /* Disable exclusive mode: void */ /* Line discipline */ -#define TIOCGETD _TIOC(0x001b) /* Get line discipline: FAR int */ -#define TIOCSETD _TIOC(0x001c) /* Set line discipline: FAR const int */ +#define TIOCGETD _TIOC(0x001c) /* Get line discipline: FAR int */ +#define TIOCSETD _TIOC(0x001d) /* Set line discipline: FAR const int */ /* Packet mode */ -#define TIOCPKT _TIOC(0x001d) /* Control packet mode: FAR const int */ +#define TIOCPKT _TIOC(0x001e) /* Control packet mode: FAR const int */ # define TIOCPKT_FLUSHREAD (1 << 0) /* The read queue for the terminal is flushed */ # define TIOCPKT_FLUSHWRITE (1 << 1) /* The write queue for the terminal is flushed */ @@ -123,10 +124,10 @@ /* Modem control */ -#define TIOCMGET _TIOC(0x001e) /* Get modem status bits: FAR int */ -#define TIOCMSET _TIOC(0x001f) /* Set modem status bits: FAR const int */ -#define TIOCMBIC _TIOC(0x0020) /* Clear modem bits: FAR const int */ -#define TIOCMBIS _TIOC(0x0021) /* Set modem bits: FAR const int */ +#define TIOCMGET _TIOC(0x001f) /* Get modem status bits: FAR int */ +#define TIOCMSET _TIOC(0x0020) /* Set modem status bits: FAR const int */ +#define TIOCMBIC _TIOC(0x0021) /* Clear modem bits: FAR const int */ +#define TIOCMBIS _TIOC(0x0022) /* Set modem bits: FAR const int */ # define TIOCM_LE (1 << 0) /* DSR (data set ready/line enable) */ # define TIOCM_DTR (1 << 1) /* DTR (data terminal ready) */ @@ -142,34 +143,34 @@ /* TTY shutdown */ -#define TIOCVHANGUP _TIOC(0x0022) /* Shutdown TTY: void */ +#define TIOCVHANGUP _TIOC(0x0023) /* Shutdown TTY: void */ /* Marking a line as local */ -#define TIOCGSOFTCAR _TIOC(0x0023) /* Get software carrier flag: FAR int* */ -#define TIOCSSOFTCAR _TIOC(0x0024) /* Set software carrier flag: FAR const int */ +#define TIOCGSOFTCAR _TIOC(0x0024) /* Get software carrier flag: FAR int* */ +#define TIOCSSOFTCAR _TIOC(0x0025) /* Set software carrier flag: FAR const int */ /* Get/set serial line info */ -#define TIOCGSERIAL _TIOC(0x0025) /* Get serial line info: FAR struct serial_struct */ -#define TIOCSSERIAL _TIOC(0x0026) /* Set serial line info: FAR const struct serial_struct */ -#define TIOCSERGETLSR _TIOC(0x0027) /* Get line status register: FAR int */ +#define TIOCGSERIAL _TIOC(0x0026) /* Get serial line info: FAR struct serial_struct */ +#define TIOCSSERIAL _TIOC(0x0027) /* Set serial line info: FAR const struct serial_struct */ +#define TIOCSERGETLSR _TIOC(0x0028) /* Get line status register: FAR int */ /* Serial events */ -#define TIOCMIWAIT _TIOC(0x0028) /* Wait for a change on serial input line(s): void */ -#define TIOCGICOUNT _TIOC(0x0029) /* Read serial port interrupt count: FAR struct serial_icounter_struct */ +#define TIOCMIWAIT _TIOC(0x0029) /* Wait for a change on serial input line(s): void */ +#define TIOCGICOUNT _TIOC(0x002a) /* Read serial port interrupt count: FAR struct serial_icounter_struct */ /* Pseudo-terminals */ -#define TIOCGPTN _TIOC(0x002a) /* Get Pty Number (of pty-mux device): FAR int* */ -#define TIOCSPTLCK _TIOC(0x002b) /* Lock/unlock Pty: int */ -#define TIOCGPTLCK _TIOC(0x002c) /* Get Pty lock state: FAR int* */ +#define TIOCGPTN _TIOC(0x002b) /* Get Pty Number (of pty-mux device): FAR int* */ +#define TIOCSPTLCK _TIOC(0x002c) /* Lock/unlock Pty: int */ +#define TIOCGPTLCK _TIOC(0x002d) /* Get Pty lock state: FAR int* */ /* RS-485 Support */ -#define TIOCSRS485 _TIOC(0x002d) /* Set RS485 mode, arg: pointer to struct serial_rs485 */ -#define TIOCGRS485 _TIOC(0x002e) /* Get RS485 mode, arg: pointer to struct serial_rs485 */ +#define TIOCSRS485 _TIOC(0x002e) /* Set RS485 mode, arg: pointer to struct serial_rs485 */ +#define TIOCGRS485 _TIOC(0x002f) /* Get RS485 mode, arg: pointer to struct serial_rs485 */ /* Definitions for flags used in struct serial_rs485 (Linux compatible) */ @@ -180,14 +181,14 @@ /* Single-wire UART support */ -#define TIOCSSINGLEWIRE _TIOC(0x002f) /* Set single-wire mode */ -#define TIOCGSINGLEWIRE _TIOC(0x0030) /* Get single-wire mode */ +#define TIOCSSINGLEWIRE _TIOC(0x0030) /* Set single-wire mode */ +#define TIOCGSINGLEWIRE _TIOC(0x0031) /* Get single-wire mode */ # define SER_SINGLEWIRE_ENABLED (1 << 0) /* Enable/disable single-wire support */ /* Debugging */ -#define TIOCSERGSTRUCT _TIOC(0x0031) /* Get device TTY structure */ +#define TIOCSERGSTRUCT _TIOC(0x0032) /* Get device TTY structure */ /******************************************************************************************** * Public Type Definitions diff --git a/libc/termios/Make.defs b/libc/termios/Make.defs index 91a4c4a6b6..e04adce65e 100644 --- a/libc/termios/Make.defs +++ b/libc/termios/Make.defs @@ -42,7 +42,7 @@ ifeq ($(CONFIG_SERIAL_TERMIOS),y) # Add the termios C files to the build CSRCS += lib_cfgetspeed.c lib_cfsetspeed.c lib_isatty.c lib_tcflush.c -CSRCS += lib_tcgetattr.c lib_tcsetattr.c +CSRCS += lib_tcgetattr.c lib_tcsetattr.c lib_tcdrain.c # Add the termios directory to the build diff --git a/libc/termios/lib_cfgetspeed.c b/libc/termios/lib_cfgetspeed.c index 507890a10d..1471b23d36 100644 --- a/libc/termios/lib_cfgetspeed.c +++ b/libc/termios/lib_cfgetspeed.c @@ -40,22 +40,6 @@ #include #include -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/libc/termios/lib_cfsetspeed.c b/libc/termios/lib_cfsetspeed.c index 7dce45d6a9..0c3e121586 100644 --- a/libc/termios/lib_cfsetspeed.c +++ b/libc/termios/lib_cfsetspeed.c @@ -41,26 +41,6 @@ #include #include -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - /**************************************************************************** * Name: cfsetspeed * diff --git a/libc/termios/lib_tcdrain.c b/libc/termios/lib_tcdrain.c new file mode 100644 index 0000000000..755442261c --- /dev/null +++ b/libc/termios/lib_tcdrain.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * libc/termios/lib_tcdrain.c + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Copyright (C) 2017 Sebastien Lorquet. All rights reserved. + * Author: Sebastien Lorquet + * + * 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 NuttX 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 OWNER 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 + +#include + +#include +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: tcdrain + * + * Descripton: + * Function for draining the output buffer of a terminal/serial device + * + * Input Parameters: + * fd - The 'fd' argument is an open file descriptor associated with a terminal. + * + * Returned Value: + * Upon successful completion, 0 is returned. Otherwise, -1 is returned and + * errno is set to indicate the error. + * + ****************************************************************************/ + +int tcdrain(int fd) +{ + return ioctl(fd, TCDRN, (unsigned long)0); +} diff --git a/libc/termios/lib_tcflush.c b/libc/termios/lib_tcflush.c index 013ebd4984..239e3610cf 100644 --- a/libc/termios/lib_tcflush.c +++ b/libc/termios/lib_tcflush.c @@ -46,22 +46,6 @@ #include -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/libc/termios/lib_tcgetattr.c b/libc/termios/lib_tcgetattr.c index 447e2ecf01..c7e0c2339e 100644 --- a/libc/termios/lib_tcgetattr.c +++ b/libc/termios/lib_tcgetattr.c @@ -46,22 +46,6 @@ #include -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/ diff --git a/libc/termios/lib_tcsetattr.c b/libc/termios/lib_tcsetattr.c index ab93e2aafd..20903e2029 100644 --- a/libc/termios/lib_tcsetattr.c +++ b/libc/termios/lib_tcsetattr.c @@ -46,22 +46,6 @@ #include -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -/**************************************************************************** - * Public Data - ****************************************************************************/ - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - /**************************************************************************** * Public Functions ****************************************************************************/