Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers/at86rf2xx: setting rx timestamp based on symbol counter for ATmega*RFR2 #19605

Merged
merged 1 commit into from
May 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cpu/atmega_common/include/cpu_conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
extern "C" {
#endif

#ifndef THREAD_EXTRA_STACKSIZE_PRINTF
#define THREAD_EXTRA_STACKSIZE_PRINTF (128)
#endif

/**
* @name Kernel configuration
Expand Down
17 changes: 16 additions & 1 deletion drivers/at86rf2xx/at86rf2xx_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,23 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info)
at86rf2xx_fb_stop(dev);
#endif
radio_info->rssi = RSSI_BASE_VAL + ed;
DEBUG("[at86rf2xx] LQI:%d high is good, RSSI:%d high is either good or"
DEBUG("[at86rf2xx] LQI:%d high is good, RSSI:%d high is either good or "
"too much interference.\n", radio_info->lqi, radio_info->rssi);
#if AT86RF2XX_IS_PERIPH && IS_USED(MODULE_NETDEV_IEEE802154_RX_TIMESTAMP)
/* AT86RF2XX_IS_PERIPH means the MCU is ATmegaRFR2 that has symbol counter */
{
uint32_t rx_sc;
rx_sc = at86rf2xx_get_sc(dev);

/* convert counter value to ns */
uint64_t res = SC_TO_NS * (uint64_t)rx_sc;
netdev_ieee802154_rx_info_set_timestamp(radio_info, res);
DEBUG("[at86rf2xx] CS: %" PRIu32 " timestamp: %" PRIu32 ".%09" PRIu32 " ",
rx_sc, (uint32_t)(radio_info->timestamp / NS_PER_SEC),
(uint32_t)(radio_info->timestamp % NS_PER_SEC));
}
#endif

}
else {
at86rf2xx_fb_stop(dev);
Expand Down
42 changes: 42 additions & 0 deletions drivers/at86rf2xx/include/at86rf2xx_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@

#if AT86RF2XX_IS_PERIPH
#include <string.h>
#include "irq.h"
#include "time_units.h"
#endif
#include "at86rf2xx_registers.h"

Expand Down Expand Up @@ -293,6 +295,46 @@ static inline uint8_t at86rf2xx_get_irq_flags(at86rf2xx_t *dev)

}

#if AT86RF2XX_IS_PERIPH
/*
* Read a 32 bit register as described in section 10.3 of the datasheet: A read
* of the least significant byte causes the current value to be atomically
* captured in a temporary 32 bit registers. The remaining reads will access this
* register instead. Only a single 32 bit temporary register is used to provide
* means to atomically access them. Thus, interrupts must be disabled during the
* read sequence in order to prevent other threads (or ISRs) from updating the
* temporary 32 bit register before the reading sequence has completed.
*/
static inline uint32_t reg32_read(volatile uint8_t *reg_ll)
{
le_uint32_t reg;
unsigned state = irq_disable();
reg.u8[0] = reg_ll[0];
reg.u8[1] = reg_ll[1];
reg.u8[2] = reg_ll[2];
reg.u8[3] = reg_ll[3];
irq_restore(state);
return reg.u32;
}

/**
* @brief Get the timestamp of the packet in symbol counter ticks
*
* @param[in] dev pointer to the device descriptor
*
* @return the symbol counter value
*/
static inline uint32_t at86rf2xx_get_sc(const at86rf2xx_t *dev)
{
(void) dev;
return reg32_read(&SCCNTLL);
benpicco marked this conversation as resolved.
Show resolved Hide resolved
}

/* Symbol counter frequency is 62500Hz. One symbol counter tick is 16us = 16000 ns*/
#define SC_TO_NS (16000LU)

#endif

#ifdef __cplusplus
}
#endif
Expand Down
1 change: 1 addition & 0 deletions sys/include/net/gnrc/netif/hdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "net/gnrc/pkt.h"
#include "net/gnrc/pktbuf.h"
#include "net/gnrc/netif.h"
#include "time_units.h"

#ifdef __cplusplus
extern "C" {
Expand Down
6 changes: 5 additions & 1 deletion sys/net/gnrc/netif/hdr/gnrc_netif_hdr_print.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,14 @@ void gnrc_netif_hdr_print(gnrc_netif_hdr_t *hdr)
if (hdr->flags & GNRC_NETIF_HDR_FLAGS_BROADCAST) {
printf("BROADCAST ");
}

if (hdr->flags & GNRC_NETIF_HDR_FLAGS_MULTICAST) {
printf("MULTICAST ");
}
#if IS_USED(MODULE_GNRC_NETIF_TIMESTAMP)
if (hdr->flags & GNRC_NETIF_HDR_FLAGS_TIMESTAMP) {
printf("TIMESTAMP ");
}
#endif
puts("");
}
else {
Expand Down
31 changes: 23 additions & 8 deletions tests/net/gnrc_netif_ieee802154/Makefile
Original file line number Diff line number Diff line change
@@ -1,19 +1,34 @@
BOARD_WHITELIST = native
BOARD_WHITELIST = native derfmega256 avr-rss2 atmega256rfr2-xpro nrf52840dongle

include ../Makefile.net_common

TERMFLAGS ?= -z "0.0.0.0:17755,localhost:17754"
ifeq (native, $(BOARD))
USEMODULE += socket_zep
TERMFLAGS ?= -z "0.0.0.0:17755,localhost:17754"
USEMODULE += netdev
# somehow this breaks the test
DISABLE_MODULE += test_utils_print_stack_usage
else
USEMODULE += shell
USEMODULE += shell_cmds_default
USEMODULE += ps
# use the default network interface for the board
USEMODULE += netdev_default
# shell command to send L2 packets with a simple string
USEMODULE += gnrc_txtsnd
# module to test rx timestamp
USEMODULE += gnrc_netif_timestamp
endif

USEMODULE += socket_zep
USEMODULE += auto_init_gnrc_netif
USEMODULE += netdev
# gnrc is a meta module including all required, basic gnrc networking modules
USEMODULE += gnrc
# automatically initialize the network interface
USEMODULE += auto_init_gnrc_netif
# use GNRC IEEE 802.15.4 as link-layer protocol
USEMODULE += gnrc_netif_ieee802154
# the application dumps received packets to stdout
USEMODULE += gnrc_pktdump

# somehow this breaks the test
DISABLE_MODULE += test_utils_print_stack_usage

TEST_ON_CI_WHITELIST += native

include $(RIOTBASE)/Makefile.include
18 changes: 17 additions & 1 deletion tests/net/gnrc_netif_ieee802154/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,36 @@
#include "net/gnrc/netif.h"
#include "net/gnrc/pktdump.h"

#if IS_USED(MODULE_SHELL)
#include <stdio.h>
#include <string.h>

#include "thread.h"
#include "shell.h"
#endif

int main(void)
{
#if IS_USED(MODULE_SOCKET_ZEP)
/* This is a test for native with socket_zep */
char addr_str[GNRC_NETIF_L2ADDR_MAXLEN * 3];
gnrc_netif_t *netif = gnrc_netif_iter(NULL);

printf("l2_addr: %s\n", gnrc_netif_addr_to_str(netif->l2addr,
netif->l2addr_len,
addr_str));

#endif
gnrc_netreg_entry_t dump = GNRC_NETREG_ENTRY_INIT_PID(
GNRC_NETREG_DEMUX_CTX_ALL,
gnrc_pktdump_pid
);
gnrc_netreg_register(GNRC_NETTYPE_UNDEF, &dump);

#if IS_USED(MODULE_SHELL)
/* this is manual test for real MCU using shell module */
char line_buf[SHELL_DEFAULT_BUFSIZE];
shell_run(NULL, line_buf, SHELL_DEFAULT_BUFSIZE);
#endif
return 0;
}

Expand Down