From 0a85ccdc563d2ca4ca2d9da0c4934338b0544896 Mon Sep 17 00:00:00 2001 From: andrewbrannan Date: Wed, 8 Mar 2017 12:42:56 +0000 Subject: [PATCH 01/29] prevent the rpl root from dropping packets bound for outside the dodag while in NS mode --- core/net/rpl/rpl-ext-header.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index 80de287d9..1dd0850a2 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -642,12 +642,18 @@ rpl_update_header(void) if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) { /* At the root, remove headers if any, and insert SRH or HBH - * (SRH is inserted only if the destination is in the DODAG) */ + * (SRH is inserted only if the destination is in the DODAG) */ rpl_remove_header(); - if(RPL_IS_NON_STORING(default_instance)) { - return insert_srh_header(); + if(rpl_get_dag(&UIP_IP_BUF->destipaddr) != NULL) { + /* dest is in a DODAG; the packet is going down. */ + if(RPL_IS_NON_STORING(default_instance)) { + return insert_srh_header(); + } else { + return insert_hbh_header(default_instance); + } } else { - return insert_hbh_header(default_instance); + /* dest is outside of DODAGs; no ext header is needed. */ + return 1; } } else { if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr) From 7e6d5c2971549d3fd23e2872f990cfdb7a70d8c9 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Fri, 17 Mar 2017 22:30:43 +0000 Subject: [PATCH 02/29] Don't force RPL MOP configuration in contiki-default-conf.h rpl-private.h handles the default MOP correctly, whereas the block in `contiki-default-conf.h` is not only redundant but also fails to handle situations where RPL multicast is required. --- core/contiki-default-conf.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/contiki-default-conf.h b/core/contiki-default-conf.h index 8fb380f87..cd002414e 100644 --- a/core/contiki-default-conf.h +++ b/core/contiki-default-conf.h @@ -148,13 +148,6 @@ #endif /* NBR_TABLE_FIND_REMOVABLE */ #endif /* UIP_CONF_IPV6_RPL */ -/* RPL_CONF_MOP specifies the RPL mode of operation that will be - * advertised by the RPL root. Possible values: RPL_MOP_NO_DOWNWARD_ROUTES, - * RPL_MOP_NON_STORING, RPL_MOP_STORING_NO_MULTICAST, RPL_MOP_STORING_MULTICAST */ -#ifndef RPL_CONF_MOP -#define RPL_CONF_MOP RPL_MOP_STORING_NO_MULTICAST -#endif /* RPL_CONF_MOP */ - /* UIP_CONF_MAX_ROUTES specifies the maximum number of routes that each node will be able to handle. */ #ifndef UIP_CONF_MAX_ROUTES From c932ff45a3b9ba20ccbff44a19f4e32be3f6554b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Harter?= Date: Wed, 7 Dec 2016 17:09:52 +0100 Subject: [PATCH 03/29] er-coap: run uncrustify-fix-style.sh Clean style before modifying. --- apps/er-coap/er-coap-engine.c | 6 +++--- apps/er-coap/er-coap-observe.c | 4 ++-- apps/er-coap/er-coap.c | 4 ++-- apps/er-coap/er-coap.h | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/er-coap/er-coap-engine.c b/apps/er-coap/er-coap-engine.c index 2f58eda94..872de013a 100644 --- a/apps/er-coap/er-coap-engine.c +++ b/apps/er-coap/er-coap-engine.c @@ -256,12 +256,12 @@ coap_receive(void) transaction = NULL; #if COAP_OBSERVE_CLIENT - /* if observe notification */ + /* if observe notification */ if((message->type == COAP_TYPE_CON || message->type == COAP_TYPE_NON) - && IS_OPTION(message, COAP_OPTION_OBSERVE)) { + && IS_OPTION(message, COAP_OPTION_OBSERVE)) { PRINTF("Observe [%u]\n", message->observe); coap_handle_notification(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, - message); + message); } #endif /* COAP_OBSERVE_CLIENT */ } /* request or response */ diff --git a/apps/er-coap/er-coap-observe.c b/apps/er-coap/er-coap-observe.c index 35ab2ff74..3f3dc34ec 100644 --- a/apps/er-coap/er-coap-observe.c +++ b/apps/er-coap/er-coap-observe.c @@ -266,7 +266,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response) { coap_packet_t *const coap_req = (coap_packet_t *)request; coap_packet_t *const coap_res = (coap_packet_t *)response; - coap_observer_t * obs; + coap_observer_t *obs; if(coap_req->code == COAP_GET && coap_res->code < 128) { /* GET request and response without error code */ if(IS_OPTION(coap_req, COAP_OPTION_OBSERVE)) { @@ -274,7 +274,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response) obs = add_observer(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, coap_req->token, coap_req->token_len, coap_req->uri_path, coap_req->uri_path_len); - if(obs) { + if(obs) { coap_set_header_observe(coap_res, (obs->obs_counter)++); /* * Following payload is for demonstration purposes only. diff --git a/apps/er-coap/er-coap.c b/apps/er-coap/er-coap.c index 597d24a11..3c71ff6f9 100644 --- a/apps/er-coap/er-coap.c +++ b/apps/er-coap/er-coap.c @@ -178,7 +178,7 @@ coap_serialize_array_option(unsigned int number, unsigned int current_number, size_t i = 0; PRINTF("ARRAY type %u, len %zu, full [%.*s]\n", number, length, - (int)length, array); + (int)length, array); if(split_char != '\0') { int j; @@ -602,7 +602,7 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) coap_pkt->uri_host = (char *)current_option; coap_pkt->uri_host_len = option_length; PRINTF("Uri-Host [%.*s]\n", (int)coap_pkt->uri_host_len, - coap_pkt->uri_host); + coap_pkt->uri_host); break; case COAP_OPTION_URI_PORT: coap_pkt->uri_port = coap_parse_int_option(current_option, diff --git a/apps/er-coap/er-coap.h b/apps/er-coap/er-coap.h index ccac6d76e..015d5ee04 100644 --- a/apps/er-coap/er-coap.h +++ b/apps/er-coap/er-coap.h @@ -61,8 +61,8 @@ (REST_MAX_CHUNK_SIZE < 128 ? 64 : \ (REST_MAX_CHUNK_SIZE < 256 ? 128 : \ (REST_MAX_CHUNK_SIZE < 512 ? 256 : \ - (REST_MAX_CHUNK_SIZE < 1024 ? 512 : \ - (REST_MAX_CHUNK_SIZE < 2048 ? 1024 : 2048))))))) + (REST_MAX_CHUNK_SIZE < 1024 ? 512 : \ + (REST_MAX_CHUNK_SIZE < 2048 ? 1024 : 2048))))))) #endif /* COAP_MAX_BLOCK_SIZE */ /* direct access into the buffer */ @@ -135,7 +135,7 @@ typedef struct { /* option format serialization */ #define COAP_SERIALIZE_INT_OPTION(number, field, text) \ if(IS_OPTION(coap_pkt, number)) { \ - PRINTF(text " [%u]\n", (unsigned int)coap_pkt->field); \ + PRINTF(text " [%u]\n", (unsigned int)coap_pkt->field); \ option += coap_serialize_int_option(number, current_number, option, coap_pkt->field); \ current_number = number; \ } @@ -167,7 +167,7 @@ typedef struct { uint32_t block = coap_pkt->field##_num << 4; \ if(coap_pkt->field##_more) { block |= 0x8; } \ block |= 0xF & coap_log_2(coap_pkt->field##_size / 16); \ - PRINTF(text " encoded: 0x%lX\n", (unsigned long)block); \ + PRINTF(text " encoded: 0x%lX\n", (unsigned long)block); \ option += coap_serialize_int_option(number, current_number, option, block); \ current_number = number; \ } From f70adde9a917ffcf3c0f6c0071e3d9c06856bfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Harter?= Date: Tue, 13 Dec 2016 16:01:16 +0100 Subject: [PATCH 04/29] er-coap-observe-client: missing 'addr' parameter --- apps/er-coap/er-coap-observe-client.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/er-coap/er-coap-observe-client.h b/apps/er-coap/er-coap-observe-client.h index d0ece32c0..dfb511620 100644 --- a/apps/er-coap/er-coap-observe-client.h +++ b/apps/er-coap/er-coap-observe-client.h @@ -107,7 +107,7 @@ int coap_obs_remove_observee_by_token(uip_ipaddr_t *addr, uint16_t port, int coap_obs_remove_observee_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url); -void coap_handle_notification(uip_ipaddr_t *, uint16_t port, +void coap_handle_notification(uip_ipaddr_t *addr, uint16_t port, coap_packet_t *notification); coap_observee_t *coap_obs_request_registration(uip_ipaddr_t *addr, From 9e5aed5df6554be3afda2e8fae9cb10bfe33d6b1 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Sat, 21 Jan 2017 16:37:37 +0100 Subject: [PATCH 05/29] Support for changing PANID and channel from project-conf.h modified: cpu/avr/radio/rf230bb/rf230bb.c modified: platform/avr-rss2/contiki-conf.h modified: platform/avr-rss2/contiki-main.c --- cpu/avr/radio/rf230bb/rf230bb.c | 15 +++++++++++++++ platform/avr-rss2/contiki-conf.h | 4 ---- platform/avr-rss2/contiki-main.c | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index cbe8160ef..565c118d5 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -1291,6 +1291,21 @@ rf230_listen_channel(uint8_t c) radio_set_trx_state(RX_ON); } /*---------------------------------------------------------------------------*/ + +unsigned +rf230_get_panid(void) +{ + unsigned pan; + uint8_t byte; + + byte = hal_register_read(RG_PAN_ID_1); + pan = byte; + byte = hal_register_read(RG_PAN_ID_0); + pan = (pan << 8) + byte; + + return pan; +} + void rf230_set_pan_addr(unsigned pan, unsigned addr, diff --git a/platform/avr-rss2/contiki-conf.h b/platform/avr-rss2/contiki-conf.h index 3e1f5dfc2..e69a0a637 100644 --- a/platform/avr-rss2/contiki-conf.h +++ b/platform/avr-rss2/contiki-conf.h @@ -78,10 +78,6 @@ #define NETSTACK_CONF_RADIO rf230_driver #endif -#ifndef CHANNEL_802_15_4 -#define CHANNEL_802_15_4 26 -#endif - /* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */ #ifndef RF230_CONF_AUTOACK #define RF230_CONF_AUTOACK 1 diff --git a/platform/avr-rss2/contiki-main.c b/platform/avr-rss2/contiki-main.c index f220a168a..a872d0cd5 100644 --- a/platform/avr-rss2/contiki-main.c +++ b/platform/avr-rss2/contiki-main.c @@ -314,8 +314,18 @@ initialize(void) memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_t)); #endif +#ifdef IEEE802154_CONF_PANID + rf230_set_pan_addr(IEEE802154_CONF_PANID, params_get_panaddr(), (uint8_t *)&addr.u8); +#else rf230_set_pan_addr(params_get_panid(), params_get_panaddr(), (uint8_t *)&addr.u8); +#endif + +#ifdef CHANNEL_CONF_802_15_4 + rf230_set_channel(CHANNEL_CONF_802_15_4); +#else rf230_set_channel(params_get_channel()); +#endif + rf230_set_txpower(params_get_txpower()); #if NETSTACK_CONF_WITH_IPV6 @@ -339,8 +349,8 @@ initialize(void) NETSTACK_NETWORK.init(); #if ANNOUNCE_BOOT - PRINTA("MAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", NETSTACK_MAC.name, - NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(), + PRINTA("PAN=0x%X, XMAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", rf230_get_panid(), + NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(), CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 : NETSTACK_RDC.channel_check_interval()), rf230_get_txpower()); #if UIP_CONF_IPV6_RPL @@ -349,7 +359,6 @@ initialize(void) #if UIP_CONF_ROUTER PRINTA("Routing Enabled\n"); #endif - #endif /* ANNOUNCE_BOOT */ #if NETSTACK_CONF_WITH_IPV6 || NETSTACK_CONF_WITH_IPV4 From fa6c52633fcbca7467fe6b38e61a23bad3a60fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Sj=C3=B6din?= Date: Fri, 28 Oct 2016 01:04:05 +0200 Subject: [PATCH 06/29] Use RS232_BAUDRATE to define baudrate from projekt config file. Removed serial initialization from contiki-main.c. It seems to be too soon. --- platform/avr-rss2/contiki-conf.h | 5 +++++ platform/avr-rss2/contiki-main.c | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/avr-rss2/contiki-conf.h b/platform/avr-rss2/contiki-conf.h index e69a0a637..2d3ee1031 100644 --- a/platform/avr-rss2/contiki-conf.h +++ b/platform/avr-rss2/contiki-conf.h @@ -106,6 +106,11 @@ void clock_adjust_ticks(clock_time_t howmany); #define AVR_CONF_USE32KCRYSTAL 1 #define SLIP_PORT RS232_PORT_0 +/* Default baud rare on RS232 port */ +#ifndef RS232_BAUDRATE +#define RS232_BAUDRATE USART_BAUD_38400 +#endif + /* Pre-allocated memory for loadable modules heap space (in bytes)*/ /* Default is 4096. Currently used only when elfloader is present. Not tested on Raven */ /* #define MMEM_CONF_SIZE 256 */ diff --git a/platform/avr-rss2/contiki-main.c b/platform/avr-rss2/contiki-main.c index a872d0cd5..907576d43 100644 --- a/platform/avr-rss2/contiki-main.c +++ b/platform/avr-rss2/contiki-main.c @@ -71,7 +71,6 @@ #include "contiki-lib.h" #include "dev/rs232.h" -#include "dev/serial-line.h" #include "dev/slip.h" #if AVR_WEBSERVER @@ -186,9 +185,8 @@ initialize(void) watchdog_init(); watchdog_start(); leds_init(); - serial_line_init(); - rs232_init(RS232_PORT_0, USART_BAUD_38400, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8); + rs232_init(RS232_PORT_0, RS232_BAUDRATE, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8); rs232_redirect_stdout(RS232_PORT_0); #if 0 @@ -198,8 +196,6 @@ initialize(void) //UBRR0L = 3; UBRR0H = 0; UCSR0A = (1 << U2X0); // 500k 0% #endif - rs232_set_input(RS232_PORT_0, serial_line_input_byte); - clock_init(); if(MCUSR & (1 << PORF)) { From 29914b5a1fdfb487c6a6facb104599520c567bea Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Mon, 23 Jan 2017 22:18:54 +0100 Subject: [PATCH 07/29] =?UTF-8?q?Fixing=20input=20serial=20line=20initiali?= =?UTF-8?q?zation=20pointed=20by=20Peter=20Sj=C3=B6din/KTH=20For=20avr-rss?= =?UTF-8?q?2=20platform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform/avr-rss2/README.md | 8 -------- platform/avr-rss2/contiki-main.c | 5 +++++ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/platform/avr-rss2/README.md b/platform/avr-rss2/README.md index 05d448fc6..2f92a64c4 100644 --- a/platform/avr-rss2/README.md +++ b/platform/avr-rss2/README.md @@ -110,14 +110,6 @@ Tested applications and examples * `examples/powertrace` * `example-shell` -Note that the shell example needs file `symbols.c` to be added to project also seems like -in `core/dev/serial-line.c` the function `process_poll` must be replaced with `process_post`: - - /* Wake up consumer process */ - - process_poll(&serial_line_process); - + process_post(&serial_line_process, 0, 0); - - Platform tutorial applications ----------------------------- Example to read out various sensors, leds, serial numbers, and so on: diff --git a/platform/avr-rss2/contiki-main.c b/platform/avr-rss2/contiki-main.c index 907576d43..ad7af6d11 100644 --- a/platform/avr-rss2/contiki-main.c +++ b/platform/avr-rss2/contiki-main.c @@ -71,6 +71,7 @@ #include "contiki-lib.h" #include "dev/rs232.h" +#include "dev/serial-line.h" #include "dev/slip.h" #if AVR_WEBSERVER @@ -267,6 +268,10 @@ initialize(void) process_start(&etimer_process, NULL); ctimer_init(); + /* After process start */ + serial_line_init(); + rs232_set_input(RS232_PORT_0, serial_line_input_byte); + /* Start radio and radio receive process */ NETSTACK_RADIO.init(); From e09bdc0c07eeae0e765b1e5c16717e51dd8ea6f3 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Sat, 18 Mar 2017 14:13:47 +0100 Subject: [PATCH 08/29] Increasing route table from 4 to 20 modified: platform/avr-rss2/examples/ipv6/mqtt-demo/project-conf.h --- platform/avr-rss2/contiki-conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/avr-rss2/contiki-conf.h b/platform/avr-rss2/contiki-conf.h index 2d3ee1031..8b365671a 100644 --- a/platform/avr-rss2/contiki-conf.h +++ b/platform/avr-rss2/contiki-conf.h @@ -274,7 +274,7 @@ typedef unsigned short uip_stats_t; #define NBR_TABLE_CONF_MAX_NEIGHBORS 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 -#define UIP_CONF_MAX_ROUTES 4 +#define UIP_CONF_MAX_ROUTES 20 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 From c0239b41c92c7efdf216069880d66cd3e664abbc Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Sun, 19 Mar 2017 21:14:31 +0100 Subject: [PATCH 09/29] Cleand-up _CONF for ROUTES, NEIGHBOR and BUFFER_SIZE modified: platform/avr-rss2/contiki-conf.h --- platform/avr-rss2/contiki-conf.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/platform/avr-rss2/contiki-conf.h b/platform/avr-rss2/contiki-conf.h index 8b365671a..b379319b6 100644 --- a/platform/avr-rss2/contiki-conf.h +++ b/platform/avr-rss2/contiki-conf.h @@ -165,6 +165,16 @@ typedef unsigned short uip_stats_t; #define RDC_CONF_MCU_SLEEP 1 #if NETSTACK_CONF_WITH_IPV6 + +#ifndef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 20 +#endif +#ifndef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 20 +#endif +#ifndef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 +#endif #define LINKADDR_CONF_SIZE 8 #define UIP_CONF_ICMP6 1 #define UIP_CONF_UDP 1 @@ -230,16 +240,15 @@ typedef unsigned short uip_stats_t; /* from previous GETs, causing decreased throughput, retransmissions, and timeouts. Increase to study this. */ /* ACKs to other ports become interleaved with computation-intensive GETs, so ACKs are particularly missed. */ /* Increasing the number of packet receive buffers in RAM helps to keep ACKs from being lost */ + #define UIP_CONF_MAX_CONNECTIONS 4 /* 2 bytes per TCP listening port */ #define UIP_CONF_MAX_LISTENPORTS 4 /* 25 bytes per UDP connection */ #define UIP_CONF_UDP_CONNS 10 /* See uip-ds6.h */ -#define NBR_TABLE_CONF_MAX_NEIGHBORS 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 -#define UIP_CONF_MAX_ROUTES 20 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -271,10 +280,8 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_MAX_CONNECTIONS 2 #define UIP_CONF_MAX_LISTENPORTS 4 #define UIP_CONF_UDP_CONNS 5 -#define NBR_TABLE_CONF_MAX_NEIGHBORS 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 -#define UIP_CONF_MAX_ROUTES 20 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -300,10 +307,8 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_MAX_CONNECTIONS 2 #define UIP_CONF_MAX_LISTENPORTS 4 #define UIP_CONF_UDP_CONNS 5 -#define NBR_TABLE_CONF_MAX_NEIGHBORS 4 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 -#define UIP_CONF_MAX_ROUTES 4 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -333,7 +338,6 @@ typedef unsigned short uip_stats_t; /* For slow slip connections, to prevent buffer overruns */ /* #define UIP_CONF_RECEIVE_WINDOW 300 */ #undef UIP_CONF_FWCACHE_SIZE -#define UIP_CONF_BUFFER_SIZE 600 /* DHCPv4 packets by ip64 module */ #define UIP_CONF_FWCACHE_SIZE 30 #define UIP_CONF_BROADCAST 1 #define UIP_ARCH_IPCHKSUM 1 From bf8e77ea4e316e5d7988dcaf3a587169f40b3c51 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 24 Mar 2017 17:07:35 +0100 Subject: [PATCH 10/29] Added missing prototype modified: cpu/avr/radio/rf230bb/rf230bb.h --- cpu/avr/radio/rf230bb/rf230bb.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cpu/avr/radio/rf230bb/rf230bb.h b/cpu/avr/radio/rf230bb/rf230bb.h index c441e09ab..15f5b6438 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.h +++ b/cpu/avr/radio/rf230bb/rf230bb.h @@ -215,6 +215,7 @@ void rf230_set_channel(uint8_t channel); void rf230_listen_channel(uint8_t channel); uint8_t rf230_get_channel(void); void rf230_set_pan_addr(unsigned pan,unsigned addr,const uint8_t ieee_addr[8]); +unsigned rf230_get_panid(void); void rf230_set_txpower(uint8_t power); uint8_t rf230_get_txpower(void); void rf230_set_rpc(uint8_t rpc); From e77dba152d3aa4664d6d3e50f24b212d607dc9cc Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 24 Mar 2017 17:29:50 +0100 Subject: [PATCH 11/29] Removing avr-rss2 private sniffer app. Better use examples/sensniff. --- platform/avr-rss2/apps/sniffer/Makefile | 11 -- platform/avr-rss2/apps/sniffer/README.md | 29 ----- platform/avr-rss2/apps/sniffer/project-conf.h | 51 --------- .../apps/sniffer/sniffer-example-coap.pcapng | 0 platform/avr-rss2/apps/sniffer/sniffer.c | 67 ------------ platform/avr-rss2/apps/sniffer/stub-rdc.c | 100 ------------------ 6 files changed, 258 deletions(-) delete mode 100644 platform/avr-rss2/apps/sniffer/Makefile delete mode 100644 platform/avr-rss2/apps/sniffer/README.md delete mode 100644 platform/avr-rss2/apps/sniffer/project-conf.h delete mode 100644 platform/avr-rss2/apps/sniffer/sniffer-example-coap.pcapng delete mode 100644 platform/avr-rss2/apps/sniffer/sniffer.c delete mode 100644 platform/avr-rss2/apps/sniffer/stub-rdc.c diff --git a/platform/avr-rss2/apps/sniffer/Makefile b/platform/avr-rss2/apps/sniffer/Makefile deleted file mode 100644 index 63412a817..000000000 --- a/platform/avr-rss2/apps/sniffer/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -DEFINES+=PROJECT_CONF_H=\"project-conf.h\" -PROJECT_SOURCEFILES += stub-rdc.c - -CONTIKI_PROJECT = sniffer - -all: $(CONTIKI_PROJECT) - -CONTIKI = ../../../.. - -CONTIKI_WITH_RIME = 1 -include $(CONTIKI)/Makefile.include diff --git a/platform/avr-rss2/apps/sniffer/README.md b/platform/avr-rss2/apps/sniffer/README.md deleted file mode 100644 index b9332893b..000000000 --- a/platform/avr-rss2/apps/sniffer/README.md +++ /dev/null @@ -1,29 +0,0 @@ -Sniffer application mote side -============================= -This put the radio in sniff mode and should capure all traffic used -on the set channel. - -Default channel ---------------- -26 - -Bulld ------ -make TARGET=avr-rss2 - -Default serial port speed -------------------------- -38400 bps - -More info & uasage ------------------- -Look in the host directory - -Contiki support ---------------- -The code promisc for support is needed. This also adds the sensniff -format. - -References ----------- -https://github.com/g-oikonomou/sensniff diff --git a/platform/avr-rss2/apps/sniffer/project-conf.h b/platform/avr-rss2/apps/sniffer/project-conf.h deleted file mode 100644 index d56b19e7d..000000000 --- a/platform/avr-rss2/apps/sniffer/project-conf.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * 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 the Institute 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 INSTITUTE 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 INSTITUTE 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. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Project specific configuration defines for the sniffer example. - * - * \author - * George Oikonomou - - * Robert Olsson - - */ - -#ifndef PROJECT_CONF_H_ -#define PROJECT_CONF_H_ - - -#define NETSTACK_CONF_MAC nullmac_driver -/* Can see other channels. Interesting. */ -/* #define NETSTACK_CONF_MAC csma_driver */ -#define NETSTACK_CONF_RDC stub_rdc_driver - - -#endif /* PROJECT_CONF_H_ */ diff --git a/platform/avr-rss2/apps/sniffer/sniffer-example-coap.pcapng b/platform/avr-rss2/apps/sniffer/sniffer-example-coap.pcapng deleted file mode 100644 index e69de29bb..000000000 diff --git a/platform/avr-rss2/apps/sniffer/sniffer.c b/platform/avr-rss2/apps/sniffer/sniffer.c deleted file mode 100644 index be572bce1..000000000 --- a/platform/avr-rss2/apps/sniffer/sniffer.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 the Institute 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 INSTITUTE 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 INSTITUTE 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. - * - * This file is part of the Contiki operating system. - * - */ - -/* - Author: Robert Olsson -*/ - -#include "contiki.h" -#include "net/rime/rime.h" -#include "random.h" -#include "dev/button-sensor.h" -#include "dev/leds.h" -#include -/*---------------------------------------------------------------------------*/ - -PROCESS(sniffer_process, "Sniffer process"); -AUTOSTART_PROCESSES(&sniffer_process); - -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(sniffer_process, ev, data) -{ - PROCESS_BEGIN(); - - /* - To get rf230bb radio in sniff mode we need to have radio in RX_ON. - The promisc commands fixes this for us. No need to set PAN and - address or MAC to zero is this case. Se Atmel datasheet. There is - a chance other radios works the same way. - */ - - rf230_set_promiscuous_mode(1); - - printf("Sniffer started\n"); - - while(1) { - PROCESS_YIELD(); - } - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ diff --git a/platform/avr-rss2/apps/sniffer/stub-rdc.c b/platform/avr-rss2/apps/sniffer/stub-rdc.c deleted file mode 100644 index a4db0710d..000000000 --- a/platform/avr-rss2/apps/sniffer/stub-rdc.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * 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 the Institute 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 INSTITUTE 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 INSTITUTE 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. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Definition of a fake RDC driver to be used with passive - * examples. The sniffer will never send packets and it will never - * push incoming packets up the stack. We do this by defining this - * driver as our RDC. We then drop everything - * - * \author - * George Oikonomou - - */ - -#include "net/mac/mac.h" -#include "net/mac/rdc.h" -/*---------------------------------------------------------------------------*/ -static void -send(mac_callback_t sent, void *ptr) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -input(void) -{ -} -/*---------------------------------------------------------------------------*/ -static int -on(void) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -off(int keep_radio_on) -{ - return keep_radio_on; -} -/*---------------------------------------------------------------------------*/ -static unsigned short -cca(void) -{ - return 0; -} -/*---------------------------------------------------------------------------*/ -static void -init(void) -{ -} -/*---------------------------------------------------------------------------*/ -const struct rdc_driver stub_rdc_driver = { - "stub-rdc", - init, - send, - send_list, - input, - on, - off, - cca, -}; -/*---------------------------------------------------------------------------*/ From 3829dd2f209a619a71521c37dc271f1a02087d8d Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 24 Mar 2017 17:37:37 +0100 Subject: [PATCH 12/29] Leds toggle added modified: platform/avr-rss2/dev/leds.c --- platform/avr-rss2/dev/leds.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/avr-rss2/dev/leds.c b/platform/avr-rss2/dev/leds.c index c59f9d09f..ec228f804 100644 --- a/platform/avr-rss2/dev/leds.c +++ b/platform/avr-rss2/dev/leds.c @@ -33,6 +33,12 @@ leds_off(unsigned char ledv) void leds_toggle(unsigned char ledv) { + if(ledv & LEDS_YELLOW) { + PORTE ^= (1 << LED_YELLOW); + } + if(ledv & LEDS_RED) { + PORTE ^= (1 << LED_RED); + } } void leds_invert(unsigned char ledv) From 94defe6ba29c6ea270c4f0e8342506ffcd5f6fe2 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Tue, 28 Mar 2017 18:53:56 +0200 Subject: [PATCH 13/29] Updates for Atmel RF233 radio in AtMega256rfr2 including register update for MAC symbol counter. Basic functions for get/set-value parameter setting added. SPI radios needs to be tested. modified: cpu/avr/radio/rf230bb/atmega256rfr2_registermap.h modified: cpu/avr/radio/rf230bb/rf230bb.c --- .../radio/rf230bb/atmega256rfr2_registermap.h | 170 ++++++++++++--- cpu/avr/radio/rf230bb/rf230bb.c | 197 +++++++++++++++++- 2 files changed, 338 insertions(+), 29 deletions(-) diff --git a/cpu/avr/radio/rf230bb/atmega256rfr2_registermap.h b/cpu/avr/radio/rf230bb/atmega256rfr2_registermap.h index 1baf1a3ac..151513a25 100644 --- a/cpu/avr/radio/rf230bb/atmega256rfr2_registermap.h +++ b/cpu/avr/radio/rf230bb/atmega256rfr2_registermap.h @@ -41,6 +41,120 @@ * Registers can be read with a macro, but the args for subregisters don't expand properly so the actual address * is used with explicit _SFR_MEM8 in the subregister read/write routines. */ + + +/* Symbol Counter */ +#define RG_SCCNTHH (0xE4) /* SCCNTHH7-0 */ +#define RG_SCCNTHL (0xE3) /* SCCNTHL7-0 */ +#define RG_SCCNTLH (0xE2) /* SCCNTLH7-0 */ +#define RG_SCCNTLL (0xE1) /* SCCNTLL7-0 */ + +/* Counter control register 0 */ +#define RG_SCCR0 (0xdc) +#define SR_SCCR0 0xdc, 0xff, 0 +#define SR_SCCR0_SCRES 0xdc, 0x80, 7 /* Counter Sync. */ +#define SR_SCCR0_SCMBTS 0xdc, 0x40, 6 /* Manual Beacon timestamp */ +#define SR_SCCR0_SCEN 0xdc, 0x20, 5 /* Counter enable */ +#define SR_SCCR0_SCCKSEL 0xdc, 0x10, 4 /* Counter clock source */ +#define SR_SCCR0_SCTSE 0xdc, 0x08, 3 /* Auto timstamp Beacon, SFD */ +#define SR_SCCR0_SCMP3 0xdc, 0x04, 2 /* Compare 3 counter mode sel. */ +#define SR_SCCR0_SCMP2 0xdc, 0x02, 1 /* Compare 2 counter mode sel. */ +#define SR_SCCR0_SCMP1 0xdc, 0x01, 0 /* Compare 1 counter mode sel. */ + +/* Counter control register 1 */ +#define RG_SCCR1 (0xdd) +#define SR_SCCR1 0xdd, 0xff, 0 +#define SR_SCCR1_SCBTSM 0xdd, 0x20, 5 /* Disable beacon timestamp */ +#define SR_SCCR1_CLKDIV 0xdd, 0x1c, 2 /* CLKDIV */ +#define SR_SCCR1_CLK0 0xdd, 0x10, 4 /* CLK0 */ +#define SR_SCCR1_CLK1 0xdd, 0x08, 3 /* CLK1 */ +#define SR_SCCR1_CLK2 0xdd, 0x04, 2 /* CLK2 */ +#define SR_SCCR1_EECLK 0xdd, 0x02, 1 /* */ +#define SR_SCCR1_SCENBO 0xdd, 0x01, 0 /* Backoff Slot Counter Enable */ + +/* Prescaler for symbol counter */ +#define SCCKDIV_62_5k 0 +#define SCCKDIV_125k 1 +#define SCCKDIV_250k 2 +#define SCCKDIV_500k 3 +#define SCCKDIV_1M 4 +#define SCCKDIV_2M 5 +#define SCCKDIV_4M 6 + +/* Counter status register 1 */ +#define RG_SCSR (0xde) +#define SR_SCSR 0xde, 0xff, 0 +#define SR_SCBSY 0xde, 0x01, 0 /* Symbol counter busy */ + +/* Counter ISR */ +#define RG_SCIRQS (0xe0) +#define SR_SCIRQS 0xe0, 0xff, 0 +#define SR_SCIRQS_IRQSB0 0xe0, 0x10, 4 /* Backoff */ +#define SR_SCIRQS_IRQSOF 0xe0, 0x08, 3 /* Counter overflow */ +#define SR_SCIRQS_IRQSCP3 0xe0, 0x04, 2 /* Compare 3 counter */ +#define SR_SCIRQS_IRQSCP2 0xe0, 0x02, 1 /* Compare 2 counter */ +#define SR_SCIRQS_IRQSCP1 0xe0, 0x01, 0 /* Compare 1 counter */ + +/* Counter IRQ mask */ +#define RG_SCIRQM (0xdf) +#define SR_SCIRQM 0xdf, 0xff, 0 +#define SR_SCIRQM_IRQMB0 0xdf, 0x10, 4 /* Backoff mask */ +#define SR_SCIRQM_IRQMOF 0xdf, 0x08, 3 /* Counter overflow mask */ +#define SR_SCIRQM_IRQMCP3 0xdf, 0x04, 2 /* Compare 3 counter mask */ +#define SR_SCIRQM_IRQMCP2 0xdf, 0x02, 1 /* Compare 2 counter mask */ +#define SR_SCIRQM_IRQMCP1 0xdf, 0x01, 0 /* Compare 1 counter mask */ + +/* Timestamp SFD */ +#define RG_SCTSRHH 0xFC /* SCTSRHH7-0 */ +#define RG_SCTSRHL 0xFB /* SCTSRHL7-0 */ +#define RG_SCTSRLH 0xFA /* SCTSRLH7-0 */ +#define RG_SCTSRLL 0xF9 /* SCTSRLL7-0 */ + +/* Beacon Timestamp */ +#define RG_SCBTSRHH (0xE8) /* SCBTSRHH7-0 */ +#define RG_SCBTSRHL (0xE7) /* SCBTSRHL7-0 */ +#define RG_SCBTSRLH (0xE6) /* SCBTSRLH7-0 */ +#define RG_SCBTSRLL (0xE5) /* SCBTSRLL7-0 */ + +/* Output Compare 1 */ +#define RG_SCOCR1HH (0xF8) /* SCOCR1HH7-0 */ +#define RG_SCOCR1HL (0xF7) /* SCOCR1HL7-0 */ +#define RG_SCOCR1LH (0xF6) /* SCOCR1LH7-0 */ +#define RG_SCOCR1LL (0xF5) /* SCOCR1LL7-0 */ + +/* Output Compare 2 */ +#define RG_SCOCR2HH (0xF4) /* SCOCR2HH7-0 */ +#define RG_SCOCR2HL (0xF3) /* SCOCR2HL7-0 */ +#define RG_SCOCR2LH (0xF2) /* SCOCR2LH7-0 */ +#define RG_SCOCR2LL (0xF1) /* SCOCR2LL7-0 */ + +/* Output Compare 3 */ +#define RG_SCOCR3HH (0xF0) /* SCOCR3HH7-0 */ +#define RG_SCOCR3HL (0xEF) /* SCOCR3HL7-0 */ +#define RG_SCOCR3LH (0xEE) /* SCOCR3LH7-0 */ +#define RG_SCOCR3LL (0xED) /* SCOCR3LL7-0 */ + +/* Transmit Frame Timestamp */ +#define RG_SCTSTRHH (0xFC) /* SCTSTRHH7-0 */ +#define RG_SCTSTRHL (0xFB) /* SCTSTRHL7-0 */ +#define RG_SCTSTRLH (0xFA) /* SCTSTRLH7-0 */ +#define RG_SCTSTRLL (0xF9) /* SCTSTRLL7-0 */ + +/* +Interrupt Status +#define RG_SCIRQS (0xE0) Res2 Res1 Res0 IRQSBO IRQSOF IRQSCP3 IRQSCP2 IRQSCP1 page 173 +Interrupt Mask +#define RG_SCIRQM (0xDF) Res2 Res1 Res0 IRQMBO IRQMOF IRQMCP3 IRQMCP2 IRQMCP1 page 174 +Counter status +#define RG_SCSR (0xDE) Res6 Res5 Res4 Res3 Res2 Res1 Res0 SCBSY page 173 +Counter Control 1 +#define RG_SCCR1 (0xDD) Res6 Res5 SCBTSM SCCKDIV2 SCCKDIV1 SCCKDIV0 SCEECLK SCENBO page 172 +Counter Control 0 +#define RG_SCCR0 (0xDC) SCRES SCMBTS SCEN SCCKSEL SCTSE SCCMP3 SCCMP2 SCCMP1 page 171 +Counter Compare Source +#define RG_SCCSR (0xDB) Res1 Res0 SCCS31 SCCS30 SCCS21 SCCS20 SCCS11 SCCS10 page 161 +*/ + #define RG_TRX_STATUS TRX_STATUS #define SR_TRX_STATUS 0x141, 0x1f, 0 #define SR_TRX_CMD 0x142, 0x1f, 0 @@ -48,9 +162,35 @@ #define SR_TX_PWR 0x145, 0x0f, 0 #define RG_VERSION_NUM VERSION_NUM #define RG_MAN_ID_0 MAN_ID_0 -#define RG_IRQ_MASK IRQ_MASK +#define RG_IRQ_MASK (0x14e) +/** Access parameters for sub-register IRQ_MASK in register @ref RG_IRQ_MASK */ +#define SR_IRQ_MASK 0x14e, 0xff, 0 +/** Offset for register IRQ_STATUS */ +#define RG_IRQ_STATUS (0x14f) +#define SR_IRQ_STATUS 0x14f, 0xff, 0 +/** Awake Interrupt Status */ +#define SR_IRQ_AWAKE 0x14f, 0x80, 7 +/** TX_END Interrupt Status */ +#define SR_IRQ_TX_END 0x14f, 0x40, 6 +/** Address Match */ +#define SR_IRQ_AMI 0x14f, 0x20, 5 +/** End of ED Measurement Interrupt Status */ +#define SR_CCA_ED_DONE 0x14f, 0x10, 4 +/** Access parameters for sub-register IRQ_3_TRX_END in register @ref RG_IRQ_STATUS */ +#define SR_IRQ_3_TRX_END 0x14f, 0x08, 3 +/** Access parameters for sub-register IRQ_2_RX_START in register @ref RG_IRQ_STATUS */ +#define SR_IRQ_2_RX_START 0x14f, 0x04, 2 +/** Access parameters for sub-register IRQ_1_PLL_UNLOCK in register @ref RG_IRQ_STATUS */ +#define SR_IRQ_1_PLL_UNLOCK 0x14f, 0x02, 1 +/** Access parameters for sub-register IRQ_0_PLL_LOCK in register @ref RG_IRQ_STATUS */ +#define RG_XAH_CTRL_1 (0x157) +#define SR_AACK_PROM_MODE 0x157, 0x02, 1 + + +#define SR_IRQ_0_PLL_LOCK 0x14f, 0x01, 0 #define SR_MAX_FRAME_RETRIES 0x16C, 0xf0, 4 #define SR_TX_AUTO_CRC_ON 0x144, 0x20, 5 +#define SR_PLL_FLT 0x144, 0x10, 4 #define SR_TRAC_STATUS 0x142, 0xe0, 5 #define SR_CHANNEL 0x148, 0x1f, 0 #define SR_CCA_MODE 0x148, 0x60, 5 @@ -67,7 +207,7 @@ #define RG_IEEE_ADDR_5 IEEE_ADDR_5 #define RG_IEEE_ADDR_6 IEEE_ADDR_6 #define RG_IEEE_ADDR_7 IEEE_ADDR_7 -//#define SR_ED_LEVEL 0x147, 0xff, 0 +/* #define SR_ED_LEVEL 0x147, 0xff, 0 */ #define RG_PHY_ED_LEVEL PHY_ED_LEVEL #define RG_RX_SYN RX_SYN #define SR_RSSI 0x146, 0x1f, 0 @@ -81,12 +221,13 @@ #define RG_CSMA_BE CSMA_BE #define RG_CSMA_SEED_0 CSMA_SEED_0 #define RG_PHY_RSSI PHY_RSSI -//#define SR_CCA_CS_THRES 0x149, 0xf0, 4 +#define SR_CCA_CS_THRES 0x149, 0xf0, 4 #define SR_CCA_ED_THRES 0x149, 0x0f, 0 #define SR_CCA_DONE 0x141, 0x80, 7 #define SR_CCA_STATUS 0x141, 0x40, 6 #define SR_AACK_SET_PD 0x16e, 0x20, 5 -#define SR_CSMA_SEED_1 0x16e, 0x10, 4 +#define SR_CSMA_SEED_1 0x16e, 0x03, 0 +#define SR_AACK_DIS_ACK 0x16e, 0x10, 4 /* RF230 register assignments, for reference */ #if 1 @@ -216,27 +357,6 @@ ///** Access parameters for sub-register CCA_ED_THRES in register @ref RG_CCA_THRES */ //#define SR_CCA_ED_THRES 0x09, 0x0f, 0 ///** Offset for register IRQ_MASK */ -//#define RG_IRQ_MASK (0x0e) -///** Access parameters for sub-register IRQ_MASK in register @ref RG_IRQ_MASK */ -//#define SR_IRQ_MASK 0x0e, 0xff, 0 -///** Offset for register IRQ_STATUS */ -//#define RG_IRQ_STATUS (0x0f) -///** Access parameters for sub-register IRQ_7_BAT_LOW in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_7_BAT_LOW 0x0f, 0x80, 7 -///** Access parameters for sub-register IRQ_6_TRX_UR in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_6_TRX_UR 0x0f, 0x40, 6 -///** Access parameters for sub-register IRQ_5 in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_5 0x0f, 0x20, 5 -///** Access parameters for sub-register IRQ_4 in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_4 0x0f, 0x10, 4 -///** Access parameters for sub-register IRQ_3_TRX_END in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_3_TRX_END 0x0f, 0x08, 3 -///** Access parameters for sub-register IRQ_2_RX_START in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_2_RX_START 0x0f, 0x04, 2 -///** Access parameters for sub-register IRQ_1_PLL_UNLOCK in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_1_PLL_UNLOCK 0x0f, 0x02, 1 -///** Access parameters for sub-register IRQ_0_PLL_LOCK in register @ref RG_IRQ_STATUS */ -//#define SR_IRQ_0_PLL_LOCK 0x0f, 0x01, 0 ///** Offset for register VREG_CTRL */ //#define RG_VREG_CTRL (0x10) ///** Access parameters for sub-register AVREG_EXT in register @ref RG_VREG_CTRL */ diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index cbe8160ef..fcc198e31 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -94,6 +94,9 @@ static bool is_promiscuous; #endif +/* Poll mode disabled by default */ +uint8_t poll_mode = 0; + /* RF230_CONF_FRAME_RETRIES is 1 plus the number written to the hardware. */ /* Valid range 1-16, zero disables extended mode. */ #ifndef RF230_CONF_FRAME_RETRIES @@ -201,6 +204,8 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; #define DEBUGFLOW(c) #endif +static radio_status_t radio_set_trx_state(uint8_t new_state); + /* XXX hack: these will be made as Chameleon packet attributes */ #if RF230_CONF_TIMESTAMPS rtimer_clock_t rf230_time_of_arrival, rf230_time_of_departure; @@ -254,17 +259,186 @@ static int rf230_cca(void); uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi; +static void +set_poll_mode(bool enable) +{ + poll_mode = enable; + if(poll_mode) { + rf230_set_rpc(0x0); /* Disbable all RPC features */ + radio_set_trx_state(RX_ON); + hal_subregister_write(SR_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK); + /* hal_register_write(RG_IRQ_MASK, 0xFF); */ + } else { + /* Initialize and enable interrupts */ + rf230_set_rpc(0xFF); /* Enable all RPC features. Only XRFR2 radios */ + radio_set_trx_state(RX_AACK_ON); + } +} + +static bool +get_poll_mode(void) +{ + return poll_mode; +} + +void +set_frame_filtering(bool i) +{ + if(i) + hal_subregister_write(SR_AACK_PROM_MODE, 0); + else { + hal_subregister_write(SR_AACK_PROM_MODE, 1); + } +} + +static bool +get_frame_filtering(void) +{ + int i = hal_subregister_read(SR_AACK_PROM_MODE); + if(i) + return 0; + return 1; +} + +void +set_auto_ack(bool i) +{ + if(i) + hal_subregister_write(SR_AACK_DIS_ACK, 0); + else + hal_subregister_write(SR_AACK_DIS_ACK, 1); +} + +static bool +get_auto_ack(void) +{ + int i = hal_subregister_read(SR_AACK_DIS_ACK); + if(i) + return 0; + return 1; +} /*---------------------------------------------------------------------------*/ static radio_result_t get_value(radio_param_t param, radio_value_t *value) { - return RADIO_RESULT_NOT_SUPPORTED; + if(!value) { + return RADIO_RESULT_INVALID_VALUE; + } + + switch(param) { + case RADIO_PARAM_POWER_MODE: + /* *value = (REG(RFCORE_XREG_RXENABLE) && RFCORE_XREG_RXENABLE_RXENMASK) == 0 )? + RADIO_POWER_MODE_OFF : RADIO_POWER_MODE_ON; */ + return RADIO_RESULT_OK; + + case RADIO_PARAM_TX_MODE: + return RADIO_RESULT_OK; + + case RADIO_PARAM_CHANNEL: + *value = (radio_value_t)rf230_get_channel(); + return RADIO_RESULT_OK; + case RADIO_PARAM_PAN_ID: + /* *value = get_pan_id(); */ + return RADIO_RESULT_OK; + case RADIO_PARAM_16BIT_ADDR: + /* *value = get_short_addr(); */ + return RADIO_RESULT_OK; + case RADIO_PARAM_RX_MODE: + *value = 0; + if(get_frame_filtering()) { + *value |= RADIO_RX_MODE_ADDRESS_FILTER; + } + if(get_auto_ack()) { + *value |= RADIO_RX_MODE_AUTOACK; + } + if(get_poll_mode()) { + *value |= RADIO_RX_MODE_POLL_MODE; + } + return RADIO_RESULT_OK; + case RADIO_PARAM_TXPOWER: + *value = rf230_get_txpower(); + return RADIO_RESULT_OK; + case RADIO_PARAM_CCA_THRESHOLD: + /* *value = get_cca_threshold(); */ + return RADIO_RESULT_OK; + case RADIO_PARAM_RSSI: + *value = rf230_get_raw_rssi(); + return RADIO_RESULT_OK; + case RADIO_CONST_CHANNEL_MIN: + *value = RF230_MIN_CHANNEL; + return RADIO_RESULT_OK; + case RADIO_CONST_CHANNEL_MAX: + *value = RF230_MAX_CHANNEL;; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MIN: + *value = TX_PWR_MIN; + return RADIO_RESULT_OK; + case RADIO_CONST_TXPOWER_MAX: + *value = TX_PWR_MAX; + return RADIO_RESULT_OK; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } } /*---------------------------------------------------------------------------*/ static radio_result_t set_value(radio_param_t param, radio_value_t value) { - return RADIO_RESULT_NOT_SUPPORTED; + switch(param) { + case RADIO_PARAM_POWER_MODE: + if(value == RADIO_POWER_MODE_ON) { + rf230_on(); + return RADIO_RESULT_OK; + } + if(value == RADIO_POWER_MODE_OFF) { + rf230_off(); + return RADIO_RESULT_OK; + } + return RADIO_RESULT_INVALID_VALUE; + + case RADIO_PARAM_CHANNEL: + + if(value < RF230_MIN_CHANNEL || + value > RF230_MAX_CHANNEL) { + return RADIO_RESULT_INVALID_VALUE; + } + + rf230_set_channel(value); + return RADIO_RESULT_OK; + + case RADIO_PARAM_TX_MODE: + return RADIO_RESULT_OK; + + case RADIO_PARAM_PAN_ID: + /* set_pan_id(value & 0xffff); */ + return RADIO_RESULT_OK; + case RADIO_PARAM_16BIT_ADDR: + /* set_short_addr(value & 0xffff); */ + return RADIO_RESULT_OK; + case RADIO_PARAM_RX_MODE: + + if(value & ~(RADIO_RX_MODE_ADDRESS_FILTER | RADIO_RX_MODE_POLL_MODE | + RADIO_RX_MODE_AUTOACK)) { + return RADIO_RESULT_INVALID_VALUE; + } + set_frame_filtering((value & RADIO_RX_MODE_ADDRESS_FILTER) != 0); + set_auto_ack((value & RADIO_RX_MODE_AUTOACK) != 0); + set_poll_mode((value & RADIO_RX_MODE_POLL_MODE) != 0); + return RADIO_RESULT_OK; + + case RADIO_PARAM_TXPOWER: + if(value < TX_PWR_MIN || value > TX_PWR_MAX) { + return RADIO_RESULT_INVALID_VALUE; + } + rf230_set_txpower(value); + return RADIO_RESULT_OK; + + case RADIO_PARAM_CCA_THRESHOLD: + /* set_cca_threshold(value); */ + return RADIO_RESULT_OK; + default: + return RADIO_RESULT_NOT_SUPPORTED; + } } /*---------------------------------------------------------------------------*/ static radio_result_t @@ -347,7 +521,7 @@ hal_rx_frame_t rxframe[RF230_CONF_RX_BUFFERS]; * \retval STATE_TRANSITION The radio transceiver's state machine is in * transition between two states. */ -//static uint8_t + uint8_t radio_get_trx_state(void) { @@ -878,7 +1052,7 @@ void rf230_warm_reset(void) { DDRB &= ~(1<<7); #endif - hal_register_write(RG_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK); + hal_subregister_write(SR_IRQ_MASK, RF230_SUPPORTED_INTERRUPT_MASK); /* Set up number of automatic retries 0-15 * (0 implies PLL_ON sends instead of the extended TX_ARET mode */ @@ -1291,6 +1465,21 @@ rf230_listen_channel(uint8_t c) radio_set_trx_state(RX_ON); } /*---------------------------------------------------------------------------*/ + +unsigned +rf230_get_panid(void) +{ + unsigned pan; + uint8_t byte; + + byte = hal_register_read(RG_PAN_ID_1); + pan = byte; + byte = hal_register_read(RG_PAN_ID_0); + pan = (pan << 8) + byte; + + return pan; +} + void rf230_set_pan_addr(unsigned pan, unsigned addr, From 55daec98dcb6ca24be108bceb294e0c2a1b30f28 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Tue, 28 Mar 2017 22:16:50 +0200 Subject: [PATCH 14/29] Added missing registers in modified: cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h --- cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h b/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h index b28ed0ec0..64b068579 100644 --- a/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h +++ b/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h @@ -83,7 +83,10 @@ #define SR_CCA_DONE 0x141, 0x80, 7 #define SR_CCA_STATUS 0x141, 0x40, 6 #define SR_AACK_SET_PD 0x16e, 0x20, 5 +#define SR_AACK_DIS_ACK 0x16e, 0x10, 4 +#define RG_XAH_CTRL_1 (0x157) +#define SR_AACK_PROM_MODE 0x157, 0x02, 1 /* RF230 register assignments, for reference */ #if 0 From d6128852b2a2c749a9102894a4e40fd1390e724f Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Wed, 29 Mar 2017 11:32:39 +0200 Subject: [PATCH 15/29] Added missing register definitions in at86rf230_registermap.h modified: cpu/avr/radio/rf230bb/at86rf230_registermap.h --- cpu/avr/radio/rf230bb/at86rf230_registermap.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpu/avr/radio/rf230bb/at86rf230_registermap.h b/cpu/avr/radio/rf230bb/at86rf230_registermap.h index 1ca9d5130..b5c500315 100644 --- a/cpu/avr/radio/rf230bb/at86rf230_registermap.h +++ b/cpu/avr/radio/rf230bb/at86rf230_registermap.h @@ -236,6 +236,7 @@ #define RG_RX_SYN 0x15 /** Offset for register XAH_CTRL_1 */ #define RG_XAH_CTRL_1 0x17 +#define SR_AACK_PROM_MODE 0x17, 0x02, 1 /** Access parameters for sub-register XTAL_MODE in register @ref RG_XOSC_CTRL */ #define SR_XTAL_MODE 0x12, 0xf0, 4 /** Access parameters for sub-register XTAL_TRIM in register @ref RG_XOSC_CTRL */ @@ -340,6 +341,7 @@ #define SR_CSMA_SEED_0 0x2d, 0xff, 0 /** Offset for register CSMA_SEED_1 */ #define RG_CSMA_SEED_1 (0x2e) +#define SR_AACK_DIS_ACK 0x2e, 0x10, 4 /** Offset for register CSMA_BE */ #define RG_CSMA_BE 0x2f /** Access parameters for sub-register MIN_BE in register @ref RG_CSMA_SEED_1 */ From 399150b1428d49a36afbb74ca07f9d01c12e9e9b Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Thu, 30 Mar 2017 15:24:19 +0200 Subject: [PATCH 16/29] Minor spell fix in ANNOUNCE_BOOT modified: platform/avr-rss2/contiki-main.c --- platform/avr-rss2/contiki-main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/avr-rss2/contiki-main.c b/platform/avr-rss2/contiki-main.c index ad7af6d11..2b5cf3b07 100644 --- a/platform/avr-rss2/contiki-main.c +++ b/platform/avr-rss2/contiki-main.c @@ -350,7 +350,7 @@ initialize(void) NETSTACK_NETWORK.init(); #if ANNOUNCE_BOOT - PRINTA("PAN=0x%X, XMAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", rf230_get_panid(), + PRINTA("PAN=0x%X, MAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", rf230_get_panid(), NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(), CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 : NETSTACK_RDC.channel_check_interval()), rf230_get_txpower()); From a30364189a610058c4915516220ebb4682025d94 Mon Sep 17 00:00:00 2001 From: alexstanoev Date: Fri, 31 Mar 2017 16:44:11 +0100 Subject: [PATCH 17/29] Zero out httpd_state before deallocating When a connection is aborted by the HTTP server while it's still being processed it is possible to hit a null pointer dereference issue by jumping back to a protothread (outputpt) after its httpd_state has been freed. This can be triggered by sending a POST to any form in the CC26xx web demo server using Firefox. This patch prevents that by zeroing out httpd_state structs before freeing them, thus also clearing the httpd_state->outputpt field. Tested using Firefox 55.0a1 on a CC2650 LaunchPad. --- examples/cc26xx/cc26xx-web-demo/httpd-simple.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c index 9800bbc48..e23e78efe 100644 --- a/examples/cc26xx/cc26xx-web-demo/httpd-simple.c +++ b/examples/cc26xx/cc26xx-web-demo/httpd-simple.c @@ -1268,9 +1268,7 @@ appcall(void *state) if(uip_closed() || uip_aborted() || uip_timedout()) { if(s != NULL) { - s->script = NULL; - s->blen = 0; - s->tmp_buf_len = 0; + memset(s, 0, sizeof(struct httpd_state)); memb_free(&conns, s); } } else if(uip_connected()) { @@ -1291,7 +1289,7 @@ appcall(void *state) if(uip_poll()) { if(timer_expired(&s->timer)) { uip_abort(); - s->script = NULL; + memset(s, 0, sizeof(struct httpd_state)); memb_free(&conns, s); } } else { From f15b86158bead763ea1824eb2e7f55eeec5ba71e Mon Sep 17 00:00:00 2001 From: Alexandru-Ioan Pop Date: Sun, 12 Mar 2017 20:59:00 +0000 Subject: [PATCH 18/29] Check broker IP conversion. Adjust state machine accordingly The result of converting the IP address of the broker wasn't checked. As a result, the pointer was left uninitialised and the IPv6 address used for connecting was some random data. The function now returns an error. Before connect_to_broker is called, mqtt_register is executed, which memsets conn to 0, making its state 0 (MQTT_CONN_STATE_ERROR). In order to recover from this error state, the extra check was added in the MQTT_CLIENT_STATE_NEWCONFIG state. This was discovered using [CodeSonar](https://www.grammatech.com/products/codesonar) --- apps/mqtt/mqtt.c | 4 +++- examples/cc26xx/cc26xx-web-demo/mqtt-client.c | 15 ++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/mqtt/mqtt.c b/apps/mqtt/mqtt.c index 0be8e83bc..5ef4cbca3 100644 --- a/apps/mqtt/mqtt.c +++ b/apps/mqtt/mqtt.c @@ -1333,7 +1333,9 @@ mqtt_connect(struct mqtt_connection *conn, char *host, uint16_t port, conn->connect_vhdr_flags |= MQTT_VHDR_CLEAN_SESSION_FLAG; /* convert the string IPv6 address to a numeric IPv6 address */ - uiplib_ip6addrconv(host, &ip6addr); + if(uiplib_ip6addrconv(host, &ip6addr) == 0) { + return MQTT_STATUS_ERROR; + } uip_ipaddr_copy(&(conn->server_ip), ipaddr); diff --git a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c index cf60d6c63..e45378264 100644 --- a/examples/cc26xx/cc26xx-web-demo/mqtt-client.c +++ b/examples/cc26xx/cc26xx-web-demo/mqtt-client.c @@ -698,10 +698,15 @@ static void connect_to_broker(void) { /* Connect to MQTT server */ - mqtt_connect(&conn, conf->broker_ip, conf->broker_port, - conf->pub_interval * 3); + mqtt_status_t conn_attempt_result = mqtt_connect(&conn, conf->broker_ip, + conf->broker_port, + conf->pub_interval * 3); - state = MQTT_CLIENT_STATE_CONNECTING; + if(conn_attempt_result == MQTT_STATUS_OK) { + state = MQTT_CLIENT_STATE_CONNECTING; + } else { + state = MQTT_CLIENT_STATE_CONFIG_ERROR; + } } /*---------------------------------------------------------------------------*/ static void @@ -827,8 +832,8 @@ state_machine(void) } break; case MQTT_CLIENT_STATE_NEWCONFIG: - /* Only update config after we have disconnected */ - if(conn.state == MQTT_CONN_STATE_NOT_CONNECTED) { + /* Only update config after we have disconnected or in the case of an error */ + if(conn.state == MQTT_CONN_STATE_NOT_CONNECTED || conn.state == MQTT_CONN_STATE_ERROR) { update_config(); DBG("New config\n"); From 093550ecbf56f757577fda6f9400425d33f9a29d Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 31 Mar 2017 18:38:27 +0200 Subject: [PATCH 19/29] Update for Atmel radio part II modified: cpu/avr/radio/rf230bb/halbb.c modified: cpu/avr/radio/rf230bb/rf230bb.c --- cpu/avr/radio/rf230bb/halbb.c | 4 +- cpu/avr/radio/rf230bb/rf230bb.c | 92 ++++++++++++++++++++++----------- 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/cpu/avr/radio/rf230bb/halbb.c b/cpu/avr/radio/rf230bb/halbb.c index 243e11c03..c146998d4 100644 --- a/cpu/avr/radio/rf230bb/halbb.c +++ b/cpu/avr/radio/rf230bb/halbb.c @@ -81,10 +81,10 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; #include "at86rf230_registermap.h" #endif +extern void get_last_rx_packet_timestamp(void); /*============================ VARIABLES =====================================*/ volatile extern signed char rf230_last_rssi; - /*============================ CALLBACKS =====================================*/ @@ -668,7 +668,7 @@ ISR(TRX24_RX_START_vect) #if !RF230_CONF_AUTOACK rf230_last_rssi = 3 * hal_subregister_read(SR_RSSI); #endif - + get_last_rx_packet_timestamp(); } /* PLL has locked, either from a transition out of TRX_OFF or a channel change while on */ diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index fcc198e31..2abe6b911 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -146,6 +146,8 @@ uint8_t ack_pending,ack_seqnum; #warning RF230 Untested Configuration! #endif +rtimer_clock_t last_rx_packet_timestamp; + struct timestamp { uint16_t time; uint8_t authority_level; @@ -317,6 +319,44 @@ get_auto_ack(void) return 0; return 1; } + +uint16_t +rf230_get_panid(void) +{ + unsigned pan; + uint8_t byte; + + byte = hal_register_read(RG_PAN_ID_1); + pan = byte; + byte = hal_register_read(RG_PAN_ID_0); + pan = (pan << 8) + byte; + + return pan; +} + +void +rf230_set_panid(uint16_t pan) +{ + hal_register_write(RG_PAN_ID_1, (pan >> 8)); + hal_register_write(RG_PAN_ID_0, (pan & 0xFF)); +} + +uint16_t +rf230_get_short_addr(void) +{ + unsigned char a0, a1; + a0 = hal_register_read(RG_SHORT_ADDR_0); + a1 = hal_register_read(RG_SHORT_ADDR_1); + return (a1 << 8) | a0; +} + +void +rf230_set_short_addr(uint16_t addr) +{ + hal_register_write(RG_SHORT_ADDR_0, (addr & 0xFF)); + hal_register_write(RG_SHORT_ADDR_1, (addr >> 8)); +} + /*---------------------------------------------------------------------------*/ static radio_result_t get_value(radio_param_t param, radio_value_t *value) @@ -338,10 +378,10 @@ get_value(radio_param_t param, radio_value_t *value) *value = (radio_value_t)rf230_get_channel(); return RADIO_RESULT_OK; case RADIO_PARAM_PAN_ID: - /* *value = get_pan_id(); */ + *value = rf230_get_panid(); return RADIO_RESULT_OK; case RADIO_PARAM_16BIT_ADDR: - /* *value = get_short_addr(); */ + *value = rf230_get_short_addr(); return RADIO_RESULT_OK; case RADIO_PARAM_RX_MODE: *value = 0; @@ -410,10 +450,11 @@ set_value(radio_param_t param, radio_value_t value) return RADIO_RESULT_OK; case RADIO_PARAM_PAN_ID: - /* set_pan_id(value & 0xffff); */ + rf230_set_panid(value & 0xffff); return RADIO_RESULT_OK; + case RADIO_PARAM_16BIT_ADDR: - /* set_short_addr(value & 0xffff); */ + rf230_set_short_addr(value & 0xffff); return RADIO_RESULT_OK; case RADIO_PARAM_RX_MODE: @@ -444,6 +485,14 @@ set_value(radio_param_t param, radio_value_t value) static radio_result_t get_object(radio_param_t param, void *dest, size_t size) { + if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) { + if(size != sizeof(rtimer_clock_t) || !dest) { + return RADIO_RESULT_INVALID_VALUE; + } + *(rtimer_clock_t *)dest = last_rx_packet_timestamp; + + return RADIO_RESULT_OK; + } return RADIO_RESULT_NOT_SUPPORTED; } /*---------------------------------------------------------------------------*/ @@ -1466,38 +1515,15 @@ rf230_listen_channel(uint8_t c) } /*---------------------------------------------------------------------------*/ -unsigned -rf230_get_panid(void) -{ - unsigned pan; - uint8_t byte; - - byte = hal_register_read(RG_PAN_ID_1); - pan = byte; - byte = hal_register_read(RG_PAN_ID_0); - pan = (pan << 8) + byte; - - return pan; -} - void rf230_set_pan_addr(unsigned pan, unsigned addr, const uint8_t ieee_addr[8]) -//rf230_set_pan_addr(uint16_t pan,uint16_t addr,uint8_t *ieee_addr) { PRINTF("rf230: PAN=%x Short Addr=%x\n",pan,addr); - uint8_t abyte; - abyte = pan & 0xFF; - hal_register_write(RG_PAN_ID_0,abyte); - abyte = (pan >> 8*1) & 0xFF; - hal_register_write(RG_PAN_ID_1, abyte); - - abyte = addr & 0xFF; - hal_register_write(RG_SHORT_ADDR_0, abyte); - abyte = (addr >> 8*1) & 0xFF; - hal_register_write(RG_SHORT_ADDR_1, abyte); + rf230_set_panid(pan); + rf230_set_short_addr(addr); if (ieee_addr != NULL) { PRINTF("MAC=%x",*ieee_addr); @@ -1519,6 +1545,14 @@ rf230_set_pan_addr(unsigned pan, PRINTF("\n"); } } + +/* From ISR context */ +void +get_last_rx_packet_timestamp(void) +{ + last_rx_packet_timestamp = RTIMER_NOW(); +} + /*---------------------------------------------------------------------------*/ /* * Interrupt leaves frame intact in FIFO. From 417f32c65d77e8af6259a012cf66bb4289c1425a Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 31 Mar 2017 19:14:31 +0200 Subject: [PATCH 20/29] Adding sensniff support for Atmel via avr-rss2 platform --- examples/sensniff/README.md | 1 + examples/sensniff/avr-rss2/avr-rss2-io.h | 43 ++++++++++++++++++++++++ examples/sensniff/avr-rss2/target-conf.h | 39 +++++++++++++++++++++ platform/avr-rss2/README.md | 1 + 4 files changed, 84 insertions(+) create mode 100644 examples/sensniff/avr-rss2/avr-rss2-io.h create mode 100644 examples/sensniff/avr-rss2/target-conf.h diff --git a/examples/sensniff/README.md b/examples/sensniff/README.md index 646111391..3fe1df7dd 100644 --- a/examples/sensniff/README.md +++ b/examples/sensniff/README.md @@ -49,6 +49,7 @@ The following radios have been tested: * CC2538 * CC2530/CC2531 * CC1200 +* RF233 Once you have the radio sorted out, you also need to configure character I/O. The firmware captures wireless frames and streams them over a serial line to diff --git a/examples/sensniff/avr-rss2/avr-rss2-io.h b/examples/sensniff/avr-rss2/avr-rss2-io.h new file mode 100644 index 000000000..b92467511 --- /dev/null +++ b/examples/sensniff/avr-rss2/avr-rss2-io.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * 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 the copyright holder 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. + */ +/*---------------------------------------------------------------------------*/ +#ifndef AVR_RSS2_IO_H_ +#define AVR_RSS2_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/rs232.h" + +#define sensniff_io_byte_out(b) rs232_send(0, b) +#define sensniff_io_flush() +#define sensniff_io_set_input(b) rs232_set_input(RS232_PORT_0, b) +/*---------------------------------------------------------------------------*/ +#endif /* AVR_RSS2_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/avr-rss2/target-conf.h b/examples/sensniff/avr-rss2/target-conf.h new file mode 100644 index 000000000..c524b7c6e --- /dev/null +++ b/examples/sensniff/avr-rss2/target-conf.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * 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 the copyright holder 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. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "avr-rss2/avr-rss2-io.h" +#define RS232_BAUDRATE USART_BAUD_500000 +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/platform/avr-rss2/README.md b/platform/avr-rss2/README.md index 05d448fc6..89f7bbf50 100644 --- a/platform/avr-rss2/README.md +++ b/platform/avr-rss2/README.md @@ -108,6 +108,7 @@ Tested applications and examples * `rime` * `ipv6/multicast` * `examples/powertrace` +* `examples/sensniff` use 500kBAUD * `example-shell` Note that the shell example needs file `symbols.c` to be added to project also seems like From f564e6bb5fe778ed21e559296c34709d79874382 Mon Sep 17 00:00:00 2001 From: tarakanov Date: Sun, 2 Apr 2017 13:14:09 +0500 Subject: [PATCH 21/29] Correct SPI pins --- platform/srf06-cc26xx/sensortag/cc2650/board.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/srf06-cc26xx/sensortag/cc2650/board.h b/platform/srf06-cc26xx/sensortag/cc2650/board.h index 9f0a7abd3..68580d4ff 100644 --- a/platform/srf06-cc26xx/sensortag/cc2650/board.h +++ b/platform/srf06-cc26xx/sensortag/cc2650/board.h @@ -137,8 +137,12 @@ * Those values are not meant to be modified by the user * @{ */ +#define BOARD_IOID_SPI_SCK IOID_17 #define BOARD_IOID_SPI_MOSI IOID_19 #define BOARD_IOID_SPI_MISO IOID_18 +#define BOARD_SPI_SCK (1 << BOARD_IOID_SPI_SCK) +#define BOARD_SPI_MOSI (1 << BOARD_IOID_SPI_MOSI) +#define BOARD_SPI_MISO (1 << BOARD_IOID_SPI_MISO) /** @} */ /*---------------------------------------------------------------------------*/ /** From aed54573322f668333fbd66ffdf40fb893b37a8c Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Sun, 2 Apr 2017 11:32:52 +0200 Subject: [PATCH 22/29] Correct names for Atmel previous radio fixes plus static declarations. --- cpu/avr/radio/rf230bb/halbb.c | 4 ++-- cpu/avr/radio/rf230bb/rf230bb.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cpu/avr/radio/rf230bb/halbb.c b/cpu/avr/radio/rf230bb/halbb.c index c146998d4..1a85dfd1f 100644 --- a/cpu/avr/radio/rf230bb/halbb.c +++ b/cpu/avr/radio/rf230bb/halbb.c @@ -81,7 +81,7 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; #include "at86rf230_registermap.h" #endif -extern void get_last_rx_packet_timestamp(void); +extern void rf230_get_last_rx_packet_timestamp(void); /*============================ VARIABLES =====================================*/ volatile extern signed char rf230_last_rssi; @@ -668,7 +668,7 @@ ISR(TRX24_RX_START_vect) #if !RF230_CONF_AUTOACK rf230_last_rssi = 3 * hal_subregister_read(SR_RSSI); #endif - get_last_rx_packet_timestamp(); + rf230_get_last_rx_packet_timestamp(); } /* PLL has locked, either from a transition out of TRX_OFF or a channel change while on */ diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index 2abe6b911..4fa9a44b4 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -146,7 +146,7 @@ uint8_t ack_pending,ack_seqnum; #warning RF230 Untested Configuration! #endif -rtimer_clock_t last_rx_packet_timestamp; +static rtimer_clock_t rf230_last_rx_packet_timestamp; struct timestamp { uint16_t time; @@ -283,7 +283,7 @@ get_poll_mode(void) return poll_mode; } -void +static void set_frame_filtering(bool i) { if(i) @@ -302,7 +302,7 @@ get_frame_filtering(void) return 1; } -void +static void set_auto_ack(bool i) { if(i) @@ -334,14 +334,14 @@ rf230_get_panid(void) return pan; } -void +static void rf230_set_panid(uint16_t pan) { hal_register_write(RG_PAN_ID_1, (pan >> 8)); hal_register_write(RG_PAN_ID_0, (pan & 0xFF)); } -uint16_t +static uint16_t rf230_get_short_addr(void) { unsigned char a0, a1; @@ -350,7 +350,7 @@ rf230_get_short_addr(void) return (a1 << 8) | a0; } -void +static void rf230_set_short_addr(uint16_t addr) { hal_register_write(RG_SHORT_ADDR_0, (addr & 0xFF)); @@ -489,7 +489,7 @@ get_object(radio_param_t param, void *dest, size_t size) if(size != sizeof(rtimer_clock_t) || !dest) { return RADIO_RESULT_INVALID_VALUE; } - *(rtimer_clock_t *)dest = last_rx_packet_timestamp; + *(rtimer_clock_t *)dest = rf230_last_rx_packet_timestamp; return RADIO_RESULT_OK; } @@ -1548,9 +1548,9 @@ rf230_set_pan_addr(unsigned pan, /* From ISR context */ void -get_last_rx_packet_timestamp(void) +rf230_get_last_rx_packet_timestamp(void) { - last_rx_packet_timestamp = RTIMER_NOW(); + rf230_last_rx_packet_timestamp = RTIMER_NOW(); } /*---------------------------------------------------------------------------*/ From 22b262ce73587c8cee431856e170584a62f70f90 Mon Sep 17 00:00:00 2001 From: chenek Date: Mon, 13 Feb 2017 09:37:34 +0100 Subject: [PATCH 23/29] Add ADC example to cc26xx-web-demo --- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.c | 73 ++++++++++++++++++- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.h | 8 ++ examples/cc26xx/cc26xx-web-demo/coap-server.c | 2 + .../cc26xx/cc26xx-web-demo/project-conf.h | 7 ++ .../cc26xx-web-demo/resources/res-sensors.c | 12 +++ 5 files changed, 101 insertions(+), 1 deletion(-) diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c index a363c31d5..02af7f946 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c @@ -55,9 +55,13 @@ #include #include #include + +#include "ti-lib.h" + /*---------------------------------------------------------------------------*/ PROCESS_NAME(cetic_6lbr_client_process); PROCESS(cc26xx_web_demo_process, "CC26XX Web Demo"); +PROCESS(adc_process, "ADC process"); /*---------------------------------------------------------------------------*/ /* * Update sensor readings in a staggered fashion every SENSOR_READING_PERIOD @@ -84,6 +88,9 @@ static struct uip_icmp6_echo_reply_notification echo_reply_notification; static struct etimer echo_request_timer; int def_rt_rssi = 0; #endif + +static uint16_t single_adc_sample; + /*---------------------------------------------------------------------------*/ process_event_t cc26xx_web_demo_publish_event; process_event_t cc26xx_web_demo_config_loaded_event; @@ -110,6 +117,9 @@ DEMO_SENSOR(batmon_temp, CC26XX_WEB_DEMO_SENSOR_BATMON_TEMP, DEMO_SENSOR(batmon_volt, CC26XX_WEB_DEMO_SENSOR_BATMON_VOLT, "Battery Volt", "battery-volt", "batmon_volt", CC26XX_WEB_DEMO_UNIT_VOLT); +DEMO_SENSOR(adc_dio23, CC26XX_WEB_DEMO_SENSOR_ADC_DIO23, + "ADC DIO23", "adc-dio23", "adc_dio23", + CC26XX_WEB_DEMO_UNIT_VOLT); /* Sensortag sensors */ #if BOARD_SENSORTAG @@ -467,6 +477,20 @@ get_batmon_reading(void *data) ctimer_set(&batmon_timer, next, get_batmon_reading, NULL); } /*---------------------------------------------------------------------------*/ +static void +get_adc_reading(void *data) +{ + int value; + char *buf; + + if(adc_dio23_reading.publish) { + value = single_adc_sample; + buf = adc_dio23_reading.converted; + memset(buf, 0, CC26XX_WEB_DEMO_CONVERTED_LEN); + snprintf(buf, CC26XX_WEB_DEMO_CONVERTED_LEN, "%d", (value * 4300) >> 12); + } +} +/*---------------------------------------------------------------------------*/ #if BOARD_SENSORTAG /*---------------------------------------------------------------------------*/ static void @@ -825,6 +849,7 @@ init_sensors(void) list_add(sensor_list, &batmon_temp_reading); list_add(sensor_list, &batmon_volt_reading); + list_add(sensor_list, &adc_dio23_reading); SENSORS_ACTIVATE(batmon_sensor); #if BOARD_SENSORTAG @@ -864,6 +889,7 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) /* Start all other (enabled) processes first */ process_start(&httpd_simple_process, NULL); + #if CC26XX_WEB_DEMO_COAP_SERVER process_start(&coap_server_process, NULL); #endif @@ -880,13 +906,17 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) process_start(&net_uart_process, NULL); #endif +#if CC26XX_WEB_DEMO_ADC_DEMO + process_start(&adc_process, NULL); +#endif + /* * Now that processes have set their own config default values, set our * own defaults and restore saved config from flash... */ cc26xx_web_demo_config.sensors_bitmap = 0xFFFFFFFF; /* all on by default */ cc26xx_web_demo_config.def_rt_ping_interval = - CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL; + CC26XX_WEB_DEMO_DEFAULT_RSSI_MEAS_INTERVAL; load_config(); /* @@ -966,6 +996,47 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) PROCESS_END(); } + +PROCESS_THREAD(adc_process, ev, data) +{ + PROCESS_BEGIN(); + static struct etimer et_adc; + etimer_set(&et_adc, CLOCK_SECOND * 5); + while(1) { + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et_adc)); + /* intialisation of ADC */ + ti_lib_aon_wuc_aux_wakeup_event(AONWUC_AUX_WAKEUP); + while(!(ti_lib_aon_wuc_power_status_get() & AONWUC_AUX_POWER_ON)) { + } + + /* Enable clock for ADC digital and analog interface (not currently enabled in driver) */ + /* Enable clocks */ + ti_lib_aux_wuc_clock_enable(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK); + while(ti_lib_aux_wuc_clock_status(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK) != AUX_WUC_CLOCK_READY) { + } + + /* Connect AUX IO7 (DIO23, but also DP2 on XDS110) as analog input. */ + ti_lib_aux_adc_select_input(ADC_COMPB_IN_AUXIO7); + + /* Set up ADC range */ + /* AUXADC_REF_FIXED = nominally 4.3 V */ + ti_lib_aux_adc_enable_sync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL); + + /* Trigger ADC converting */ + ti_lib_aux_adc_gen_manual_trigger(); + + /* reading adc value */ + single_adc_sample = ti_lib_aux_adc_read_fifo(); + + /* shut the adc down */ + ti_lib_aux_adc_disable(); + + get_adc_reading(NULL); + + etimer_reset(&et_adc); + } + PROCESS_END(); +} /*---------------------------------------------------------------------------*/ /** * @} diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h index 14bf3150c..b740a5d4c 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h @@ -79,6 +79,13 @@ #else #define CC26XX_WEB_DEMO_NET_UART 1 #endif + +#ifdef CC26XX_WEB_DEMO_CONF_ADC_DEMO +#define CC26XX_WEB_DEMO_ADC_DEMO CC26XX_WEB_DEMO_CONF_ADC_DEMO +#else +#define CC26XX_WEB_DEMO_ADC_DEMO 0 +#endif + /*---------------------------------------------------------------------------*/ /* Active probing of RSSI from our preferred parent */ #if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT) @@ -146,6 +153,7 @@ #define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_X 12 #define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Y 13 #define CC26XX_WEB_DEMO_SENSOR_MPU_GYRO_Z 14 +#define CC26XX_WEB_DEMO_SENSOR_ADC_DIO23 15 /*---------------------------------------------------------------------------*/ extern process_event_t cc26xx_web_demo_publish_event; extern process_event_t cc26xx_web_demo_config_loaded_event; diff --git a/examples/cc26xx/cc26xx-web-demo/coap-server.c b/examples/cc26xx/cc26xx-web-demo/coap-server.c index 518065f6e..957e8adae 100644 --- a/examples/cc26xx/cc26xx-web-demo/coap-server.c +++ b/examples/cc26xx/cc26xx-web-demo/coap-server.c @@ -50,6 +50,7 @@ extern resource_t res_leds; extern resource_t res_batmon_temp; extern resource_t res_batmon_volt; +extern resource_t res_adc_dio23; extern resource_t res_device_sw; extern resource_t res_device_hw; @@ -133,6 +134,7 @@ PROCESS_THREAD(coap_server_process, ev, data) rest_activate_resource(&res_batmon_temp, "sen/batmon/temp"); rest_activate_resource(&res_batmon_volt, "sen/batmon/voltage"); + rest_activate_resource(&res_adc_dio23, "sen/adc/dio23"); rest_activate_resource(&res_device_hw, "dev/mdl/hw"); rest_activate_resource(&res_device_sw, "dev/mdl/sw"); diff --git a/examples/cc26xx/cc26xx-web-demo/project-conf.h b/examples/cc26xx/cc26xx-web-demo/project-conf.h index adf2f1427..1d2355006 100644 --- a/examples/cc26xx/cc26xx-web-demo/project-conf.h +++ b/examples/cc26xx/cc26xx-web-demo/project-conf.h @@ -41,6 +41,13 @@ #define CC26XX_WEB_DEMO_CONF_6LBR_CLIENT 1 #define CC26XX_WEB_DEMO_CONF_COAP_SERVER 1 #define CC26XX_WEB_DEMO_CONF_NET_UART 1 +/* + * ADC sensor functionality. To test this, an external voltage source should be + * connected to DIO23 + * Enable/Disable DIO23 ADC reading by setting CC26XX_WEB_DEMO_CONF_ADC_DEMO + */ +#define CC26XX_WEB_DEMO_CONF_ADC_DEMO 0 + /*---------------------------------------------------------------------------*/ /* Enable the ROM bootloader */ #define ROM_BOOTLOADER_ENABLE 1 diff --git a/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c b/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c index 277c29c05..f5cfad79e 100644 --- a/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c +++ b/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c @@ -111,12 +111,24 @@ res_get_handler_batmon_volt(void *request, void *response, uint8_t *buffer, buffer, preferred_size, offset); } /*---------------------------------------------------------------------------*/ +static void +res_get_handler_adc_dio23(void *request, void *response, uint8_t *buffer, + uint16_t preferred_size, int32_t *offset) +{ + res_get_handler_all(CC26XX_WEB_DEMO_SENSOR_ADC_DIO23, request, response, + buffer, preferred_size, offset); +} +/*---------------------------------------------------------------------------*/ RESOURCE(res_batmon_temp, "title=\"Battery Temp\";rt=\"C\"", res_get_handler_batmon_temp, NULL, NULL, NULL); /*---------------------------------------------------------------------------*/ RESOURCE(res_batmon_volt, "title=\"Battery Voltage\";rt=\"mV\"", res_get_handler_batmon_volt, NULL, NULL, NULL); /*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +RESOURCE(res_adc_dio23, "title=\"ADC DIO23\";rt=\"mV\"", + res_get_handler_adc_dio23, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ #if BOARD_SENSORTAG /*---------------------------------------------------------------------------*/ /* MPU resources and handler: Accelerometer and Gyro */ From 474dc33e122195f62e598a7e020c722b9009a2b4 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 18 Mar 2017 14:36:18 +0000 Subject: [PATCH 24/29] Wrap web demo ADC functionality inside #if blocks --- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.c | 19 ++++++++++++++++--- examples/cc26xx/cc26xx-web-demo/coap-server.c | 9 ++++++++- .../cc26xx-web-demo/resources/res-sensors.c | 17 ++++++++++------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c index 02af7f946..1b80801a6 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c @@ -61,7 +61,6 @@ /*---------------------------------------------------------------------------*/ PROCESS_NAME(cetic_6lbr_client_process); PROCESS(cc26xx_web_demo_process, "CC26XX Web Demo"); -PROCESS(adc_process, "ADC process"); /*---------------------------------------------------------------------------*/ /* * Update sensor readings in a staggered fashion every SENSOR_READING_PERIOD @@ -88,9 +87,13 @@ static struct uip_icmp6_echo_reply_notification echo_reply_notification; static struct etimer echo_request_timer; int def_rt_rssi = 0; #endif +/*---------------------------------------------------------------------------*/ +#if CC26XX_WEB_DEMO_ADC_DEMO +PROCESS(adc_process, "ADC process"); static uint16_t single_adc_sample; - +static struct etimer et_adc; +#endif /*---------------------------------------------------------------------------*/ process_event_t cc26xx_web_demo_publish_event; process_event_t cc26xx_web_demo_config_loaded_event; @@ -117,9 +120,12 @@ DEMO_SENSOR(batmon_temp, CC26XX_WEB_DEMO_SENSOR_BATMON_TEMP, DEMO_SENSOR(batmon_volt, CC26XX_WEB_DEMO_SENSOR_BATMON_VOLT, "Battery Volt", "battery-volt", "batmon_volt", CC26XX_WEB_DEMO_UNIT_VOLT); + +#if CC26XX_WEB_DEMO_ADC_DEMO DEMO_SENSOR(adc_dio23, CC26XX_WEB_DEMO_SENSOR_ADC_DIO23, "ADC DIO23", "adc-dio23", "adc_dio23", CC26XX_WEB_DEMO_UNIT_VOLT); +#endif /* Sensortag sensors */ #if BOARD_SENSORTAG @@ -477,6 +483,7 @@ get_batmon_reading(void *data) ctimer_set(&batmon_timer, next, get_batmon_reading, NULL); } /*---------------------------------------------------------------------------*/ +#if CC26XX_WEB_DEMO_ADC_DEMO static void get_adc_reading(void *data) { @@ -490,6 +497,7 @@ get_adc_reading(void *data) snprintf(buf, CC26XX_WEB_DEMO_CONVERTED_LEN, "%d", (value * 4300) >> 12); } } +#endif /*---------------------------------------------------------------------------*/ #if BOARD_SENSORTAG /*---------------------------------------------------------------------------*/ @@ -849,7 +857,11 @@ init_sensors(void) list_add(sensor_list, &batmon_temp_reading); list_add(sensor_list, &batmon_volt_reading); + +#if CC26XX_WEB_DEMO_ADC_DEMO list_add(sensor_list, &adc_dio23_reading); +#endif + SENSORS_ACTIVATE(batmon_sensor); #if BOARD_SENSORTAG @@ -997,10 +1009,10 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) PROCESS_END(); } +#if CC26XX_WEB_DEMO_ADC_DEMO PROCESS_THREAD(adc_process, ev, data) { PROCESS_BEGIN(); - static struct etimer et_adc; etimer_set(&et_adc, CLOCK_SECOND * 5); while(1) { PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et_adc)); @@ -1037,6 +1049,7 @@ PROCESS_THREAD(adc_process, ev, data) } PROCESS_END(); } +#endif /*---------------------------------------------------------------------------*/ /** * @} diff --git a/examples/cc26xx/cc26xx-web-demo/coap-server.c b/examples/cc26xx/cc26xx-web-demo/coap-server.c index 957e8adae..8897eb23f 100644 --- a/examples/cc26xx/cc26xx-web-demo/coap-server.c +++ b/examples/cc26xx/cc26xx-web-demo/coap-server.c @@ -40,6 +40,7 @@ #include "rest-engine.h" #include "board-peripherals.h" #include "rf-core/rf-ble.h" +#include "cc26xx-web-demo.h" #include #include @@ -50,7 +51,6 @@ extern resource_t res_leds; extern resource_t res_batmon_temp; extern resource_t res_batmon_volt; -extern resource_t res_adc_dio23; extern resource_t res_device_sw; extern resource_t res_device_hw; @@ -86,6 +86,10 @@ extern resource_t res_mpu_gyro_z; extern resource_t res_toggle_orange; extern resource_t res_toggle_yellow; #endif + +#if CC26XX_WEB_DEMO_ADC_DEMO +extern resource_t res_adc_dio23; +#endif /*---------------------------------------------------------------------------*/ const char *coap_server_not_found_msg = "Resource not found"; const char *coap_server_supported_msg = "Supported:" @@ -134,7 +138,10 @@ PROCESS_THREAD(coap_server_process, ev, data) rest_activate_resource(&res_batmon_temp, "sen/batmon/temp"); rest_activate_resource(&res_batmon_volt, "sen/batmon/voltage"); + +#if CC26XX_WEB_DEMO_ADC_DEMO rest_activate_resource(&res_adc_dio23, "sen/adc/dio23"); +#endif rest_activate_resource(&res_device_hw, "dev/mdl/hw"); rest_activate_resource(&res_device_sw, "dev/mdl/sw"); diff --git a/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c b/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c index f5cfad79e..f3fd7bd26 100644 --- a/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c +++ b/examples/cc26xx/cc26xx-web-demo/resources/res-sensors.c @@ -111,6 +111,14 @@ res_get_handler_batmon_volt(void *request, void *response, uint8_t *buffer, buffer, preferred_size, offset); } /*---------------------------------------------------------------------------*/ +RESOURCE(res_batmon_temp, "title=\"Battery Temp\";rt=\"C\"", + res_get_handler_batmon_temp, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ +RESOURCE(res_batmon_volt, "title=\"Battery Voltage\";rt=\"mV\"", + res_get_handler_batmon_volt, NULL, NULL, NULL); +/*---------------------------------------------------------------------------*/ +#if CC26XX_WEB_DEMO_ADC_DEMO +/*---------------------------------------------------------------------------*/ static void res_get_handler_adc_dio23(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -119,16 +127,11 @@ res_get_handler_adc_dio23(void *request, void *response, uint8_t *buffer, buffer, preferred_size, offset); } /*---------------------------------------------------------------------------*/ -RESOURCE(res_batmon_temp, "title=\"Battery Temp\";rt=\"C\"", - res_get_handler_batmon_temp, NULL, NULL, NULL); -/*---------------------------------------------------------------------------*/ -RESOURCE(res_batmon_volt, "title=\"Battery Voltage\";rt=\"mV\"", - res_get_handler_batmon_volt, NULL, NULL, NULL); -/*---------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------*/ RESOURCE(res_adc_dio23, "title=\"ADC DIO23\";rt=\"mV\"", res_get_handler_adc_dio23, NULL, NULL, NULL); /*---------------------------------------------------------------------------*/ +#endif +/*---------------------------------------------------------------------------*/ #if BOARD_SENSORTAG /*---------------------------------------------------------------------------*/ /* MPU resources and handler: Accelerometer and Gyro */ From e823ead4b0af94b12b3cf5ffae7ea4ca4bc0628f Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 18 Mar 2017 14:36:35 +0000 Subject: [PATCH 25/29] Tidy up web demo ADC code style --- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.c | 35 +++++++++++-------- .../cc26xx/cc26xx-web-demo/cc26xx-web-demo.h | 1 - .../cc26xx/cc26xx-web-demo/project-conf.h | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c index 1b80801a6..e14991d04 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.c @@ -57,7 +57,6 @@ #include #include "ti-lib.h" - /*---------------------------------------------------------------------------*/ PROCESS_NAME(cetic_6lbr_client_process); PROCESS(cc26xx_web_demo_process, "CC26XX Web Demo"); @@ -1008,45 +1007,53 @@ PROCESS_THREAD(cc26xx_web_demo_process, ev, data) PROCESS_END(); } - +/*---------------------------------------------------------------------------*/ #if CC26XX_WEB_DEMO_ADC_DEMO PROCESS_THREAD(adc_process, ev, data) { PROCESS_BEGIN(); + etimer_set(&et_adc, CLOCK_SECOND * 5); + while(1) { + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et_adc)); + /* intialisation of ADC */ ti_lib_aon_wuc_aux_wakeup_event(AONWUC_AUX_WAKEUP); - while(!(ti_lib_aon_wuc_power_status_get() & AONWUC_AUX_POWER_ON)) { - } + while(!(ti_lib_aon_wuc_power_status_get() & AONWUC_AUX_POWER_ON)); - /* Enable clock for ADC digital and analog interface (not currently enabled in driver) */ - /* Enable clocks */ - ti_lib_aux_wuc_clock_enable(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK); - while(ti_lib_aux_wuc_clock_status(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | AUX_WUC_SMPH_CLOCK) != AUX_WUC_CLOCK_READY) { - } + /* + * Enable clock for ADC digital and analog interface (not currently enabled + * in driver) + */ + ti_lib_aux_wuc_clock_enable(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | + AUX_WUC_SMPH_CLOCK); + while(ti_lib_aux_wuc_clock_status(AUX_WUC_ADI_CLOCK | AUX_WUC_ANAIF_CLOCK | + AUX_WUC_SMPH_CLOCK) + != AUX_WUC_CLOCK_READY); /* Connect AUX IO7 (DIO23, but also DP2 on XDS110) as analog input. */ ti_lib_aux_adc_select_input(ADC_COMPB_IN_AUXIO7); - /* Set up ADC range */ - /* AUXADC_REF_FIXED = nominally 4.3 V */ - ti_lib_aux_adc_enable_sync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL); + /* Set up ADC range, AUXADC_REF_FIXED = nominally 4.3 V */ + ti_lib_aux_adc_enable_sync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, + AUXADC_TRIGGER_MANUAL); /* Trigger ADC converting */ ti_lib_aux_adc_gen_manual_trigger(); - /* reading adc value */ + /* Read value */ single_adc_sample = ti_lib_aux_adc_read_fifo(); - /* shut the adc down */ + /* Shut the adc down */ ti_lib_aux_adc_disable(); get_adc_reading(NULL); etimer_reset(&et_adc); } + PROCESS_END(); } #endif diff --git a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h index b740a5d4c..e40cd1864 100644 --- a/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h +++ b/examples/cc26xx/cc26xx-web-demo/cc26xx-web-demo.h @@ -85,7 +85,6 @@ #else #define CC26XX_WEB_DEMO_ADC_DEMO 0 #endif - /*---------------------------------------------------------------------------*/ /* Active probing of RSSI from our preferred parent */ #if (CC26XX_WEB_DEMO_COAP_SERVER || CC26XX_WEB_DEMO_MQTT_CLIENT) diff --git a/examples/cc26xx/cc26xx-web-demo/project-conf.h b/examples/cc26xx/cc26xx-web-demo/project-conf.h index 1d2355006..67b0971c7 100644 --- a/examples/cc26xx/cc26xx-web-demo/project-conf.h +++ b/examples/cc26xx/cc26xx-web-demo/project-conf.h @@ -41,13 +41,13 @@ #define CC26XX_WEB_DEMO_CONF_6LBR_CLIENT 1 #define CC26XX_WEB_DEMO_CONF_COAP_SERVER 1 #define CC26XX_WEB_DEMO_CONF_NET_UART 1 + /* * ADC sensor functionality. To test this, an external voltage source should be * connected to DIO23 * Enable/Disable DIO23 ADC reading by setting CC26XX_WEB_DEMO_CONF_ADC_DEMO */ #define CC26XX_WEB_DEMO_CONF_ADC_DEMO 0 - /*---------------------------------------------------------------------------*/ /* Enable the ROM bootloader */ #define ROM_BOOTLOADER_ENABLE 1 From 51205eb809db3b50473a93e0a2162e443f56ef12 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 4 Apr 2017 14:12:35 +0200 Subject: [PATCH 26/29] TSCH readme: link to reference paper on implem and eval --- core/net/mac/tsch/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/net/mac/tsch/README.md b/core/net/mac/tsch/README.md index 143bc0482..49e78573b 100644 --- a/core/net/mac/tsch/README.md +++ b/core/net/mac/tsch/README.md @@ -13,7 +13,9 @@ It was developped by: * Beshr Al Nahas, SICS (now Chalmers University), beshr@chalmers.se, github user: [beshrns](https://github.com/beshrns) * Atis Elsts, Univ. Bristol, atis.elsts@bristol.ac.uk, github user: [atiselsts](https://github.com/atiselsts) -You can find an extensive evaluation of this implementation in our paper [*Orchestra: Robust Mesh Networks Through Autonomously Scheduled TSCH*](http://www.simonduquennoy.net/papers/duquennoy15orchestra.pdf), ACM SenSys'15. + +This implementation is presented in depth and evaluated in our paper: [*TSCH and 6TiSCH for Contiki: Challenges, Design and Evaluation*](http://www.simonduquennoy.net/papers/duquennoy17tsch.pdf), IEEE DCOSS'17. +The scheduler Orchestra is detailled in [*Orchestra: Robust Mesh Networks Through Autonomously Scheduled TSCH*](http://www.simonduquennoy.net/papers/duquennoy15orchestra.pdf), ACM SenSys'15. ## Features From a330f59b8edff790e005cb0508e1a957ace572f7 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 4 Apr 2017 14:14:42 +0200 Subject: [PATCH 27/29] TSCH readme: update with 802.15.4-2015 and 6TiSCH --- core/net/mac/tsch/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/net/mac/tsch/README.md b/core/net/mac/tsch/README.md index 49e78573b..91bd603ca 100644 --- a/core/net/mac/tsch/README.md +++ b/core/net/mac/tsch/README.md @@ -1,8 +1,8 @@ -# IEEE 802.15.4e TSCH (TimeSlotted Channel Hopping) +# IEEE 802.15.4-2015 TSCH and IETF 6TiSCH ## Overview -TSCH is a MAC layer of the [IEEE 802.15.4e-2012 amendment][ieee802.15.4e-2012], +Time Slotted Channel Hopping (TSCH) is a MAC layer of the [IEEE 802.15.4e-2012 amendment][ieee802.15.4e-2012], currently being integrated as part of the new IEEE 802.15.4-2015. [6TiSCH][ietf-6tisch-wg] is an IETF Working Group focused on IPv6 over TSCH. This is a Contiki implementation of TSCH and the 6TiSCH so-called "minimal configuration", @@ -29,7 +29,7 @@ This implementation includes: * Standard TSCH link selection and slot operation (10ms slots by default) * Standard TSCH synchronization, including with ACK/NACK time correction Information Element * Standard TSCH queues and CSMA-CA mechanism - * Standard TSCH security + * Standard TSCH and 6TiSCH security * Standard 6TiSCH TSCH-RPL interaction (6TiSCH Minimal Configuration and Minimal Schedule) * A scheduling API to add/remove slotframes and links * A system for logging from TSCH timeslot operation interrupt, with postponed printout From f6a2c4ea3f6dcc06af9acbd02c896e406aa4699a Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Wed, 5 Apr 2017 12:23:26 +0100 Subject: [PATCH 28/29] Fix HDC sensor reading conversion --- platform/srf06-cc26xx/sensortag/hdc-1000-sensor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/srf06-cc26xx/sensortag/hdc-1000-sensor.c b/platform/srf06-cc26xx/sensortag/hdc-1000-sensor.c index 8fdd6d847..b8da56fef 100644 --- a/platform/srf06-cc26xx/sensortag/hdc-1000-sensor.c +++ b/platform/srf06-cc26xx/sensortag/hdc-1000-sensor.c @@ -186,7 +186,7 @@ static void convert(float *temp, float *hum) { /* Convert temperature to degrees C */ - *temp = ((double)(int16_t)raw_temp / 65536) * 165 - 40; + *temp = ((double)raw_temp / 65536) * 165 - 40; /* Convert relative humidity to a %RH value */ *hum = ((double)raw_hum / 65536) * 100; From fa618ad86c68d7c24c8b5b0025d90812902b3853 Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Mon, 10 Apr 2017 11:09:28 +0200 Subject: [PATCH 29/29] Adjusted cc65 compiler options to recent cc65 option handling change. --- cpu/6502/Makefile.6502 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/6502/Makefile.6502 b/cpu/6502/Makefile.6502 index 1ddf9599c..8721c6f73 100644 --- a/cpu/6502/Makefile.6502 +++ b/cpu/6502/Makefile.6502 @@ -67,7 +67,7 @@ AR = ar65 # The apps coming with Contiki run even on a 0x100 byte stack. ASFLAGS = -t $(TARGET) -CFLAGS += -t $(TARGET) -Or -W -unused-param +CFLAGS += -t $(TARGET) -Ors -W -unused-param LDFLAGS = -t $(TARGET) -m contiki-$(TARGET).map -D __STACKSIZE__=0x200 AROPTS = a