diff --git a/tests/driver_at86rf2xx/Makefile b/tests/driver_at86rf2xx/Makefile new file mode 100644 index 0000000000..096cb934ea --- /dev/null +++ b/tests/driver_at86rf2xx/Makefile @@ -0,0 +1,81 @@ +APPLICATION = driver_at86rf2xx +include ../Makefile.tests_common + +FEATURES_REQUIRED = periph_spi periph_gpio + +BOARD_INSUFFICIENT_RAM := stm32f0discovery +BOARD_BLACKLIST := nucleo-f334 +# nucleo-f334: not enough GPIO pins defined + +ifneq (,$(filter saml21-xpro,$(BOARD))) + DRIVER ?= ng_at86rf212b + export ATRF_SPI ?= SPI_0 + export ATRF_CS ?= EXT1_SPI_SS + export ATRF_INT ?= EXT1_P09 + export ATRF_RESET ?= EXT1_P07 + export ATRF_SLEEP ?= EXT1_P10 + export ATRF_SPI_SPEED ?= SPI_SPEED_1MHZ +endif +ifneq (,$(filter iot-lab_M3,$(BOARD))) + DRIVER ?= ng_at86rf231 + export ATRF_SPI ?= SPI_0 + export ATRF_CS ?= GPIO_11 + export ATRF_INT ?= GPIO_12 + export ATRF_RESET ?= GPIO_13 + export ATRF_SLEEP ?= GPIO_14 +endif +ifneq (,$(filter samr21-xpro,$(BOARD))) + DRIVER ?= ng_at86rf233 + export ATRF_SPI ?= SPI_0 + export ATRF_CS ?= GPIO_4 + export ATRF_INT ?= GPIO_5 + export ATRF_RESET ?= GPIO_6 + export ATRF_SLEEP ?= GPIO_7 + export ATRF_SPI_SPEED ?= SPI_SPEED_1MHZ +endif + +ifneq (,$(DRIVER)) + USEMODULE += $(DRIVER) +else + USEMODULE += ng_at86rf231 # default to ng_at86rf231 +endif +USEMODULE += ng_netbase +USEMODULE += ng_nomac +USEMODULE += ng_pktdump +USEMODULE += uart0 +USEMODULE += shell +USEMODULE += shell_commands +USEMODULE += ps + +CFLAGS += -DDEVELHELP + +ifneq (,$(ATRF_SPI)) + CFLAGS += -DATRF_SPI=$(ATRF_SPI) +else + CFLAGS += -DATRF_SPI=SPI_0 # set default +endif +ifneq (,$(ATRF_CS)) + CFLAGS += -DATRF_CS=$(ATRF_CS) +else + CFLAGS += -DATRF_CS=GPIO_0 # set default +endif +ifneq (,$(ATRF_INT)) + CFLAGS += -DATRF_INT=$(ATRF_INT) +else + CFLAGS += -DATRF_INT=GPIO_1 # set default +endif +ifneq (,$(ATRF_SLEEP)) + CFLAGS += -DATRF_SLEEP=$(ATRF_SLEEP) +else + CFLAGS += -DATRF_SLEEP=GPIO_2 # set default +endif +ifneq (,$(ATRF_RESET)) + CFLAGS += -DATRF_RESET=$(ATRF_RESET) +else + CFLAGS += -DATRF_RESET=GPIO_3 # set default +endif +ifneq (,$(ATRF_SPI_SPEED)) + CFLAGS += -DATRF_SPI_SPEED=$(ATRF_SPI_SPEED) +endif + +include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_at86rf2xx/README.md b/tests/driver_at86rf2xx/README.md new file mode 100644 index 0000000000..78441d90b6 --- /dev/null +++ b/tests/driver_at86rf2xx/README.md @@ -0,0 +1,16 @@ +# About +This is a manual test application for the AT86RF2xx radio driver + +For running this test, you need to connect/configure the following pins of your +radio device: +- SPI MISO +- SPI MOSI +- SPI CLK +- CS (ship select) +- RESET +- SLEEP +- INT (external interrupt) + +# Usage +For testing the radio driver you can use the netif and txtsnd shell commands +that are included in this application. diff --git a/tests/driver_at86rf2xx/main.c b/tests/driver_at86rf2xx/main.c new file mode 100644 index 0000000000..6be3c879b8 --- /dev/null +++ b/tests/driver_at86rf2xx/main.c @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2015 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief Test application for AT86RF2xx network device driver + * + * @author Hauke Petersen + * + * @} + */ + +#include + +#include "board.h" +#include "kernel.h" +#include "shell.h" +#include "shell_commands.h" +#include "posix_io.h" +#include "board_uart0.h" +#include "ng_at86rf2xx.h" +#include "net/ng_netbase.h" +#include "net/ng_nomac.h" +#include "net/ng_pktdump.h" + +/* make sure the SPI port and the needed GPIO pins are defined */ +#ifndef ATRF_SPI +#error "SPI not defined" +#endif +#ifndef ATRF_CS +#error "Chip select pin not defined" +#endif +#ifndef ATRF_INT +#error "Interrupt pin not defined" +#endif +#ifndef ATRF_SLEEP +#error "Sleep pin not defined" +#endif +#ifndef ATRF_RESET +#error "Reset pin not defined" +#endif +#ifndef ATRF_SPI_SPEED +#define ATRF_SPI_SPEED (SPI_SPEED_5MHZ) +#endif + +/** + * @brief Buffer size used by the shell + */ +#define SHELL_BUFSIZE (64U) + +/** + * @brief Allocate the AT86RF2xx device descriptor + */ +static ng_at86rf2xx_t dev; + +/** + * @brief Stack for the nomac thread + */ +static char nomac_stack[KERNEL_CONF_STACKSIZE_MAIN]; + +/** + * @brief Read chars from STDIO + */ +int shell_read(void) +{ + char c = 0; + (void) posix_read(uart0_handler_pid, &c, 1); + return c; +} + +/** + * @brief Write chars to STDIO + */ +void shell_put(int c) +{ + putchar((char)c); +} + +/** + * @brief Maybe you are a golfer?! + */ +int main(void) +{ + kernel_pid_t iface; + int res; + shell_t shell; + ng_netreg_entry_t dump; + + puts("AT86RF2xx device driver test"); + printf("Initializing the radio at SPI_%i... \n", ATRF_SPI); + + /* register the pktdump thread */ + puts("Register the packet dump thread for NG_NETTYPE_UNDEF packets"); + dump.pid = ng_pktdump_getpid(); + dump.demux_ctx = NG_NETREG_DEMUX_CTX_ALL; + ng_netreg_register(NG_NETTYPE_UNDEF, &dump); + + /* initialize the AT86RF2xx device */ + puts("Initialize the AT86RF2xx radio device"); + res = ng_at86rf2xx_init(&dev, ATRF_SPI, ATRF_SPI_SPEED, + ATRF_CS, ATRF_INT, + ATRF_SLEEP, ATRF_RESET); + if (res < 0) { + puts("Error initializing AT86RF2xx radio device"); + return -1; + } + + /* start MAC layer */ + puts("Starting the NOMAC layer on top of the driver"); + iface = ng_nomac_init(nomac_stack, sizeof(nomac_stack), PRIORITY_MAIN - 3, + "at86rf2xx", (ng_netdev_t *)&dev); + if (iface <= KERNEL_PID_UNDEF) { + puts("Error initializing MAC layer"); + return -1; + } + + /* start the shell */ + puts("Initialization successful - starting the shell now"); + (void) posix_open(uart0_handler_pid, 0); + shell_init(&shell, NULL, SHELL_BUFSIZE, shell_read, shell_put); + shell_run(&shell); + + return 0; +}