1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-18 12:52:44 +01:00

Merge pull request #16556 from jia200x/pr/improve_hal_test

tests/ieee802154_hal: check error codes and improve error reporting
This commit is contained in:
benpicco 2021-09-08 16:49:56 +02:00 committed by GitHub
commit e9424c3446
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -106,9 +106,10 @@ void _crc_error_handler(event_t *event)
(void) event; (void) event;
puts("Packet with invalid CRC received"); puts("Packet with invalid CRC received");
ieee802154_dev_t* dev = &_radio[0]; ieee802154_dev_t* dev = &_radio[0];
/* switch back to RX_ON state */ if (!ieee802154_radio_has_rx_continuous(dev)) {
ieee802154_radio_request_set_trx_state(dev, IEEE802154_TRX_STATE_RX_ON); /* switch back to RX_ON state */
while (ieee802154_radio_confirm_set_trx_state(dev) == -EAGAIN) {} _set_trx_state(IEEE802154_TRX_STATE_RX_ON, false);
}
} }
static event_t _crc_error_event = { static event_t _crc_error_event = {
@ -119,6 +120,7 @@ void _rx_done_handler(event_t *event)
{ {
(void) event; (void) event;
ieee802154_rx_info_t info; ieee802154_rx_info_t info;
ieee802154_dev_t* dev = &_radio[0];
/* Read packet from internal framebuffer /* Read packet from internal framebuffer
* *
@ -131,9 +133,10 @@ void _rx_done_handler(event_t *event)
_print_packet(size, info.lqi, info.rssi); _print_packet(size, info.lqi, info.rssi);
} }
/* Go out of the HAL's FB Lock state after frame reception and trigger a if (!ieee802154_radio_has_rx_continuous(dev)) {
* state change */ /* switch back to RX_ON state */
_set_trx_state(IEEE802154_TRX_STATE_RX_ON, false); _set_trx_state(IEEE802154_TRX_STATE_RX_ON, false);
}
} }
static event_t _rx_done_event = { static event_t _rx_done_event = {
@ -204,8 +207,11 @@ static event_t _tx_finish_ev = {
static void _send(iolist_t *pkt) static void _send(iolist_t *pkt)
{ {
/* Request a state change to RX_ON */ /* Request a state change to TX_ON */
ieee802154_radio_request_set_trx_state(&_radio[0], IEEE802154_TRX_STATE_TX_ON); if (ieee802154_radio_request_set_trx_state(&_radio[0], IEEE802154_TRX_STATE_TX_ON) < 0) {
puts("Couldn't send frame");
return;
}
/* Write the packet to the radio */ /* Write the packet to the radio */
ieee802154_radio_write(&_radio[0], pkt); ieee802154_radio_write(&_radio[0], pkt);
@ -213,9 +219,16 @@ static void _send(iolist_t *pkt)
/* Block until the radio confirms the state change */ /* Block until the radio confirms the state change */
while(ieee802154_radio_confirm_set_trx_state(&_radio[0]) == -EAGAIN); while(ieee802154_radio_confirm_set_trx_state(&_radio[0]) == -EAGAIN);
/* Trigger the transmit and wait for the mutex unlock (TX_DONE event) */ /* Set the frame filter to receive ACKs */
ieee802154_radio_set_frame_filter_mode(&_radio[0], IEEE802154_FILTER_ACK_ONLY); ieee802154_radio_set_frame_filter_mode(&_radio[0], IEEE802154_FILTER_ACK_ONLY);
ieee802154_radio_request_transmit(&_radio[0]);
/* Trigger the transmit and wait for the mutex unlock (TX_DONE event).
* Spin if the radio is busy before transmission (this indicates the
* transmission is requested before the end of the IFS).
* This won't be necessary anymore when the upper layers take care
* of the IFS.
*/
while (ieee802154_radio_request_transmit(&_radio[0]) == -EBUSY) {}
mutex_lock(&lock); mutex_lock(&lock);
event_post(EVENT_PRIO_HIGHEST, &_tx_finish_ev); event_post(EVENT_PRIO_HIGHEST, &_tx_finish_ev);
@ -250,6 +263,7 @@ static ieee802154_dev_t *_reg_callback(ieee802154_dev_type_t type, void *opaque)
static int _init(void) static int _init(void)
{ {
int res;
struct _reg_container reg = {0}; struct _reg_container reg = {0};
ieee802154_hal_test_init_devs(_reg_callback, &reg); ieee802154_hal_test_init_devs(_reg_callback, &reg);
@ -264,32 +278,39 @@ static int _init(void)
/* Since the device was already initialized, turn on the radio. /* Since the device was already initialized, turn on the radio.
* The transceiver state will be "TRX_OFF" */ * The transceiver state will be "TRX_OFF" */
ieee802154_radio_request_on(&_radio[0]); res = ieee802154_radio_request_on(&_radio[0]);
assert(res >= 0);
while(ieee802154_radio_confirm_on(&_radio[0]) == -EAGAIN) {} while(ieee802154_radio_confirm_on(&_radio[0]) == -EAGAIN) {}
ieee802154_radio_set_frame_filter_mode(&_radio[0], IEEE802154_FILTER_ACCEPT); ieee802154_radio_set_frame_filter_mode(&_radio[0], IEEE802154_FILTER_ACCEPT);
uint16_t panid = CONFIG_IEEE802154_DEFAULT_PANID; uint16_t panid = CONFIG_IEEE802154_DEFAULT_PANID;
/* Set all IEEE addresses */ /* Set all IEEE addresses */
ieee802154_radio_config_addr_filter(&_radio[0], res = ieee802154_radio_config_addr_filter(&_radio[0],
IEEE802154_AF_SHORT_ADDR, &short_addr); IEEE802154_AF_SHORT_ADDR, &short_addr);
ieee802154_radio_config_addr_filter(&_radio[0], assert(res >= 0);
res = ieee802154_radio_config_addr_filter(&_radio[0],
IEEE802154_AF_EXT_ADDR, &ext_addr); IEEE802154_AF_EXT_ADDR, &ext_addr);
ieee802154_radio_config_addr_filter(&_radio[0], assert(res >= 0);
res = ieee802154_radio_config_addr_filter(&_radio[0],
IEEE802154_AF_PANID, &panid); IEEE802154_AF_PANID, &panid);
assert(res >= 0);
/* Set PHY configuration */ /* Set PHY configuration */
ieee802154_phy_conf_t conf = {.channel=CONFIG_IEEE802154_DEFAULT_CHANNEL, .page=CONFIG_IEEE802154_DEFAULT_SUBGHZ_PAGE, .pow=CONFIG_IEEE802154_DEFAULT_TXPOWER}; ieee802154_phy_conf_t conf = {.channel=CONFIG_IEEE802154_DEFAULT_CHANNEL, .page=CONFIG_IEEE802154_DEFAULT_SUBGHZ_PAGE, .pow=CONFIG_IEEE802154_DEFAULT_TXPOWER};
ieee802154_radio_config_phy(&_radio[0], &conf); res = ieee802154_radio_config_phy(&_radio[0], &conf);
assert(res >= 0);
/* ieee802154_radio_set_cca_mode*/ /* ieee802154_radio_set_cca_mode*/
ieee802154_radio_set_cca_mode(&_radio[0], IEEE802154_CCA_MODE_ED_THRESHOLD); res = ieee802154_radio_set_cca_mode(&_radio[0], IEEE802154_CCA_MODE_ED_THRESHOLD);
ieee802154_radio_set_cca_threshold(&_radio[0], CONFIG_IEEE802154_CCA_THRESH_DEFAULT); assert(res >= 0);
res = ieee802154_radio_set_cca_threshold(&_radio[0], CONFIG_IEEE802154_CCA_THRESH_DEFAULT);
assert(res >= 0);
/* Set the transceiver state to RX_ON in order to receive packets */ /* Set the transceiver state to RX_ON in order to receive packets */
_set_trx_state(IEEE802154_TRX_STATE_RX_ON, false); _set_trx_state(IEEE802154_TRX_STATE_RX_ON, false);
return 0; return 0;
} }
@ -405,7 +426,9 @@ int _cca(int argc, char **argv)
{ {
(void) argc; (void) argc;
(void) argv; (void) argv;
ieee802154_radio_request_cca(&_radio[0]); if (ieee802154_radio_request_cca(&_radio[0]) < 0) {
puts("Couldn't perform CCA");
}
mutex_lock(&lock); mutex_lock(&lock);
int res = ieee802154_radio_confirm_cca(&_radio[0]); int res = ieee802154_radio_confirm_cca(&_radio[0]);
assert(res >= 0); assert(res >= 0);
@ -423,7 +446,14 @@ int _cca(int argc, char **argv)
static inline void _set_trx_state(int state, bool verbose) static inline void _set_trx_state(int state, bool verbose)
{ {
xtimer_ticks32_t a; xtimer_ticks32_t a;
int res = ieee802154_radio_request_set_trx_state(&_radio[0], state); int res;
/* Under certain conditions (internal house-keeping or sending ACK frames
* back) the radio could indicate it's busy. Therefore, busy loop until
* the radio doesn't report BUSY
*/
while((res = ieee802154_radio_request_set_trx_state(&_radio[0], state)) == -EBUSY) {}
if (verbose) { if (verbose) {
a = xtimer_now(); a = xtimer_now();
if(res != 0) { if(res != 0) {
@ -504,12 +534,12 @@ static int promisc(int argc, char **argv)
puts("Disabled promiscuos mode"); puts("Disabled promiscuos mode");
} }
ieee802154_radio_set_frame_filter_mode(&_radio[0], conf); return ieee802154_radio_set_frame_filter_mode(&_radio[0], conf);
return 0;
} }
int config_phy(int argc, char **argv) int config_phy(int argc, char **argv)
{ {
int res = -EINVAL;
if (argc < 4) { if (argc < 4) {
puts("Usage: config_phy <phy_mode> <channel> <tx_pow>"); puts("Usage: config_phy <phy_mode> <channel> <tx_pow>");
return 1; return 1;
@ -560,16 +590,18 @@ int config_phy(int argc, char **argv)
} }
else { else {
puts("Success!"); puts("Success!");
res = 0;
} }
_set_trx_state(IEEE802154_TRX_STATE_RX_ON, false); _set_trx_state(IEEE802154_TRX_STATE_RX_ON, false);
return 0; return res;
} }
int txmode_cmd(int argc, char **argv) int txmode_cmd(int argc, char **argv)
{ {
ieee802154_dev_t *dev = &_radio[0]; ieee802154_dev_t *dev = &_radio[0];
int res = -EINVAL;
if (argc < 2) { if (argc < 2) {
printf("Usage: %s <csma_ca|cca|direct>\n", argv[0]); printf("Usage: %s <csma_ca|cca|direct>\n", argv[0]);
@ -594,13 +626,16 @@ int txmode_cmd(int argc, char **argv)
} }
else { else {
puts("Ok"); puts("Ok");
res = 0;
} }
return 0; return res;
} }
static int _config_cca_cmd(int argc, char **argv) static int _config_cca_cmd(int argc, char **argv)
{ {
ieee802154_dev_t *dev = &_radio[0]; ieee802154_dev_t *dev = &_radio[0];
int res = -EINVAL;
ieee802154_cca_mode_t mode; ieee802154_cca_mode_t mode;
if (argc < 2) { if (argc < 2) {
@ -631,13 +666,13 @@ static int _config_cca_cmd(int argc, char **argv)
int8_t thresh = atoi(argv[2]); int8_t thresh = atoi(argv[2]);
if (ieee802154_radio_set_cca_threshold(dev, thresh) < 0) { if (ieee802154_radio_set_cca_threshold(dev, thresh) < 0) {
puts("Error setting the threshold"); puts("Error setting the threshold");
return 1;
} }
else { else {
printf("Set threshold to %i\n", thresh); printf("Set threshold to %i\n", thresh);
res = 0;
} }
} }
return 0; return res;
} }
static int _caps_cmd(int argc, char **argv) static int _caps_cmd(int argc, char **argv)