diff --git a/cpu/cc2538/radio/cc2538_rf_radio_ops.c b/cpu/cc2538/radio/cc2538_rf_radio_ops.c index 66f32fe859..f4c2cc2abe 100644 --- a/cpu/cc2538/radio/cc2538_rf_radio_ops.c +++ b/cpu/cc2538/radio/cc2538_rf_radio_ops.c @@ -400,23 +400,6 @@ static int _off(ieee802154_dev_t *dev) return -ENOTSUP; } -static bool _get_cap(ieee802154_dev_t *dev, ieee802154_rf_caps_t cap) -{ - (void) dev; - switch (cap) { - case IEEE802154_CAP_24_GHZ: - case IEEE802154_CAP_AUTO_CSMA: - case IEEE802154_CAP_IRQ_CRC_ERROR: - case IEEE802154_CAP_IRQ_TX_DONE: - case IEEE802154_CAP_IRQ_CCA_DONE: - case IEEE802154_CAP_IRQ_RX_START: - case IEEE802154_CAP_IRQ_TX_START: - return true; - default: - return false; - } -} - static int _set_hw_addr_filter(ieee802154_dev_t *dev, const network_uint16_t *short_addr, const eui64_t *ext_addr, const uint16_t *pan_id) { @@ -536,6 +519,14 @@ static int _set_csma_params(ieee802154_dev_t *dev, const ieee802154_csma_be_t *b } static const ieee802154_radio_ops_t cc2538_rf_ops = { + .caps = IEEE802154_CAP_24_GHZ + | IEEE802154_CAP_AUTO_CSMA + | IEEE802154_CAP_IRQ_CRC_ERROR + | IEEE802154_CAP_IRQ_TX_DONE + | IEEE802154_CAP_IRQ_CCA_DONE + | IEEE802154_CAP_IRQ_RX_START + | IEEE802154_CAP_IRQ_TX_START, + .write = _write, .read = _read, .request_transmit = _request_transmit, @@ -548,7 +539,6 @@ static const ieee802154_radio_ops_t cc2538_rf_ops = { .confirm_set_trx_state = _confirm_set_trx_state, .request_cca = _request_cca, .confirm_cca = _confirm_cca, - .get_cap = _get_cap, .set_cca_threshold = _set_cca_threshold, .set_cca_mode = _set_cca_mode, .config_phy = _config_phy, diff --git a/cpu/nrf52/radio/nrf802154/nrf802154_radio.c b/cpu/nrf52/radio/nrf802154/nrf802154_radio.c index 8725290337..0773ab0151 100644 --- a/cpu/nrf52/radio/nrf802154/nrf802154_radio.c +++ b/cpu/nrf52/radio/nrf802154/nrf802154_radio.c @@ -661,22 +661,6 @@ static int _off(ieee802154_dev_t *dev) return 0; } -static bool _get_cap(ieee802154_dev_t *dev, ieee802154_rf_caps_t cap) -{ - (void) dev; - switch (cap) { - case IEEE802154_CAP_24_GHZ: - case IEEE802154_CAP_IRQ_CRC_ERROR: - case IEEE802154_CAP_IRQ_RX_START: - case IEEE802154_CAP_IRQ_TX_START: - case IEEE802154_CAP_IRQ_TX_DONE: - case IEEE802154_CAP_IRQ_CCA_DONE: - return true; - default: - return false; - } -} - int _len(ieee802154_dev_t *dev) { (void) dev; @@ -793,6 +777,13 @@ void nrf802154_setup(nrf802154_t *dev) } static const ieee802154_radio_ops_t nrf802154_ops = { + .caps = IEEE802154_CAP_24_GHZ + | IEEE802154_CAP_IRQ_CRC_ERROR + | IEEE802154_CAP_IRQ_RX_START + | IEEE802154_CAP_IRQ_TX_START + | IEEE802154_CAP_IRQ_TX_DONE + | IEEE802154_CAP_IRQ_CCA_DONE, + .write = _write, .read = _read, .request_transmit = _request_transmit, @@ -805,7 +796,6 @@ static const ieee802154_radio_ops_t nrf802154_ops = { .confirm_set_trx_state = _confirm_set_trx_state, .request_cca = _request_cca, .confirm_cca = _confirm_cca, - .get_cap = _get_cap, .set_cca_threshold = set_cca_threshold, .set_cca_mode = _set_cca_mode, .config_phy = _config_phy, diff --git a/sys/include/net/ieee802154/radio.h b/sys/include/net/ieee802154/radio.h index 5304ae5597..86f438bf3a 100644 --- a/sys/include/net/ieee802154/radio.h +++ b/sys/include/net/ieee802154/radio.h @@ -29,6 +29,7 @@ extern "C" { #include #include "iolist.h" #include "sys/uio.h" +#include "bitarithm.h" #include "byteorder.h" #include "net/eui64.h" @@ -59,7 +60,7 @@ typedef enum { * @note it's implicit that a radio supports @ref * IEEE802154_CAP_AUTO_CSMA if this cap is available */ - IEEE802154_CAP_FRAME_RETRANS, + IEEE802154_CAP_FRAME_RETRANS = BIT0, /** * @brief the device supports Auto CSMA-CA * @@ -69,7 +70,7 @@ typedef enum { * ieee802154_radio_ops::confirm_transmit. If it fails, the device reports * @ref TX_STATUS_MEDIUM_BUSY. */ - IEEE802154_CAP_AUTO_CSMA, + IEEE802154_CAP_AUTO_CSMA = BIT1, /** * @brief the device support ACK timeout interrupt * @@ -81,47 +82,47 @@ typedef enum { * * The ACK frame is not indicated to the upper layer. */ - IEEE802154_CAP_IRQ_ACK_TIMEOUT, + IEEE802154_CAP_IRQ_ACK_TIMEOUT = BIT2, /** * @brief the device supports the IEEE802.15.4 2.4 GHz band * * It's assumed that @ref IEEE802154_CAP_IRQ_TX_DONE is present. */ - IEEE802154_CAP_24_GHZ, + IEEE802154_CAP_24_GHZ = BIT3, /** * @brief the device support the IEEE802.15.4 Sub GHz band */ - IEEE802154_CAP_SUB_GHZ, + IEEE802154_CAP_SUB_GHZ = BIT4, /** * @brief the device reports reception off frames with invalid CRC. */ - IEEE802154_CAP_IRQ_CRC_ERROR, + IEEE802154_CAP_IRQ_CRC_ERROR = BIT5, /** * @brief the device reports when the transmission is done */ - IEEE802154_CAP_IRQ_TX_DONE, + IEEE802154_CAP_IRQ_TX_DONE = BIT6, /** * @brief the device reports the start of a frame (SFD) when received. */ - IEEE802154_CAP_IRQ_RX_START, + IEEE802154_CAP_IRQ_RX_START = BIT7, /** * @brief the device reports the start of a frame (SFD) was sent. */ - IEEE802154_CAP_IRQ_TX_START, + IEEE802154_CAP_IRQ_TX_START = BIT8, /** * @brief the device reports the end of the CCA procedure */ - IEEE802154_CAP_IRQ_CCA_DONE, + IEEE802154_CAP_IRQ_CCA_DONE = BIT9, /** * @brief the device provides the number of retransmissions * * It's assumed that @ref IEEE802154_CAP_FRAME_RETRANS is present. */ - IEEE802154_CAP_FRAME_RETRANS_INFO, + IEEE802154_CAP_FRAME_RETRANS_INFO = BIT10, /** * @brief the device retains all register values when off. */ - IEEE802154_CAP_REG_RETENTION, + IEEE802154_CAP_REG_RETENTION = BIT11, } ieee802154_rf_caps_t; /** @@ -382,6 +383,14 @@ typedef struct { * @brief Radio ops struct declaration */ struct ieee802154_radio_ops { + /** + * @brief Radio device capabilities + * + * This field contains bitflags of supported capabilities + * (@ref ieee802154_rf_caps_t) by the device. + */ + const uint16_t caps; + /** * @brief Write a frame into the framebuffer. * @@ -602,17 +611,6 @@ struct ieee802154_radio_ops { */ int (*confirm_cca)(ieee802154_dev_t *dev); - /** - * @brief Get a cap from the radio - * - * @param[in] dev IEEE802.15.4 device descriptor - * @param cap cap to be checked - * - * @return true if the radio supports the cap - * @return false otherwise - */ - bool (*get_cap)(ieee802154_dev_t *dev, ieee802154_rf_caps_t cap); - /** * @brief Set the threshold for the Energy Detection (first mode of CCA) * @@ -998,8 +996,8 @@ static inline int ieee802154_radio_confirm_cca(ieee802154_dev_t *dev) /** * @brief Check if the device supports ACK timeout * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_IRQ_ACK_TIMEOUT. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_IRQ_ACK_TIMEOUT. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1008,14 +1006,14 @@ static inline int ieee802154_radio_confirm_cca(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_irq_ack_timeout(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_IRQ_ACK_TIMEOUT); + return (dev->driver->caps & IEEE802154_CAP_IRQ_ACK_TIMEOUT); } /** * @brief Check if the device supports frame retransmissions (with CSMA-CA). * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_FRAME_RETRANS. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_FRAME_RETRANS. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1024,14 +1022,14 @@ static inline bool ieee802154_radio_has_irq_ack_timeout(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_frame_retrans(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_FRAME_RETRANS); + return (dev->driver->caps & IEEE802154_CAP_FRAME_RETRANS); } /** * @brief Check if the device supports Auto CSMA-CA for transmissions. * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_AUTO_CSMA. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_AUTO_CSMA. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1040,14 +1038,14 @@ static inline bool ieee802154_radio_has_frame_retrans(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_auto_csma(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_AUTO_CSMA); + return (dev->driver->caps & IEEE802154_CAP_AUTO_CSMA); } /** * @brief Check if the device supports the IEEE802.15.4 Sub-GHz band * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_SUB_GHZ. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_SUB_GHZ. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1056,14 +1054,14 @@ static inline bool ieee802154_radio_has_auto_csma(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_sub_ghz(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_SUB_GHZ); + return (dev->driver->caps & IEEE802154_CAP_SUB_GHZ); } /** * @brief Check if the device supports the IEEE802.15.4 2.4 GHz band * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_24_GHZ. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_24_GHZ. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1072,14 +1070,14 @@ static inline bool ieee802154_radio_has_sub_ghz(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_24_ghz(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_24_GHZ); + return (dev->driver->caps & IEEE802154_CAP_24_GHZ); } /** * @brief Check if the device supports TX done interrupt * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_IRQ_TX_DONE. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_IRQ_TX_DONE. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1088,14 +1086,14 @@ static inline bool ieee802154_radio_has_24_ghz(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_irq_tx_done(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_IRQ_TX_DONE); + return (dev->driver->caps & IEEE802154_CAP_IRQ_TX_DONE); } /** * @brief Check if the device supports RX start interrupt * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_IRQ_RX_START. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_IRQ_RX_START. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1104,14 +1102,14 @@ static inline bool ieee802154_radio_has_irq_tx_done(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_irq_rx_start(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_IRQ_RX_START); + return (dev->driver->caps & IEEE802154_CAP_IRQ_RX_START); } /** * @brief Check if the device supports TX start interrupt * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_IRQ_TX_START. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_IRQ_TX_START. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1120,13 +1118,13 @@ static inline bool ieee802154_radio_has_irq_rx_start(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_irq_tx_start(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_IRQ_TX_START); + return (dev->driver->caps & IEEE802154_CAP_IRQ_TX_START); } /** * @brief Check if the device supports CCA done interrupt * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref + * Internally this function reads ieee802154_radio_ops::caps with @ref * IEEE802154_CAP_IRQ_CCA_DONE. * * @param[in] dev IEEE802.15.4 device descriptor @@ -1136,15 +1134,15 @@ static inline bool ieee802154_radio_has_irq_tx_start(ieee802154_dev_t *dev) */ static inline bool ieee802154_radio_has_irq_cca_done(ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_IRQ_CCA_DONE); + return (dev->driver->caps & IEEE802154_CAP_IRQ_CCA_DONE); } /** * @brief Check if the device reports the number of retransmissions of the last * TX procedure. * - * Internally this function calls ieee802154_radio_ops::get_cap with @ref - * IEEE802154_CAP_FRAME_RETRANS_INFO. + * Internally this function reads ieee802154_radio_ops::caps and checks for + * @ref IEEE802154_CAP_FRAME_RETRANS_INFO. * * @param[in] dev IEEE802.15.4 device descriptor * @@ -1154,7 +1152,7 @@ static inline bool ieee802154_radio_has_irq_cca_done(ieee802154_dev_t *dev) static inline bool ieee802154_radio_has_frame_retrans_info( ieee802154_dev_t *dev) { - return dev->driver->get_cap(dev, IEEE802154_CAP_FRAME_RETRANS_INFO); + return (dev->driver->caps & IEEE802154_CAP_FRAME_RETRANS_INFO); } /**