From 822de11e728a7021ac970cff832bce98fdafe45f Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Sun, 25 Jun 2017 20:01:16 -0400 Subject: [PATCH 1/8] ieee802154: Minor fix to setup logic for i8sak --- wireless/ieee802154/i8sak/i8sak_main.c | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 789bdbcce..872e3c5e5 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -528,23 +528,24 @@ static void i8sak_switch_instance(FAR char *devname) } sq_addlast((FAR sq_entry_t *)i8sak, &g_i8sak_instances); + + /* Update our "sticky" i8sak instance. Must come before call to setup so that + * the shared active global i8sak is correct. + */ + + g_activei8sak = i8sak; + + if (i8sak_setup(i8sak, devname) < 0) + { + exit(EXIT_FAILURE); + } } - - /* Update our "sticky" i8sak instance. Must come before call to setup so that - * the shared active global i8sak is correct. - */ - - g_activei8sak = i8sak; - - if (!g_activei8sak_set) + else { - g_activei8sak_set = true; + g_activei8sak = i8sak; } - if (i8sak_setup(i8sak, devname) < 0) - { - exit(EXIT_FAILURE); - } + g_activei8sak_set = true; } static int i8sak_setup(FAR struct i8sak_s *i8sak, FAR const char *devname) From 49a8d9a0fb3c3d7d3848c4a8c666def176c5191d Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Tue, 27 Jun 2017 17:58:09 -0400 Subject: [PATCH 2/8] ieee802154/i8sak: Renaming according to nuttx changes --- wireless/ieee802154/i8sak/i8sak_startpan.c | 2 +- wireless/ieee802154/i8sak/wpanlistener.c | 2 +- wireless/ieee802154/i8sak/wpanlistener.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_startpan.c b/wireless/ieee802154/i8sak/i8sak_startpan.c index 1f45a534b..2c48c463e 100644 --- a/wireless/ieee802154/i8sak/i8sak_startpan.c +++ b/wireless/ieee802154/i8sak/i8sak_startpan.c @@ -194,7 +194,7 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) if (beaconenabled) { - startreq.beaconorder = 6; + startreq.beaconorder = 8; startreq.superframeorder = 5; } else diff --git a/wireless/ieee802154/i8sak/wpanlistener.c b/wireless/ieee802154/i8sak/wpanlistener.c index 4fdd344ba..eeaa60622 100644 --- a/wireless/ieee802154/i8sak/wpanlistener.c +++ b/wireless/ieee802154/i8sak/wpanlistener.c @@ -742,7 +742,7 @@ static pthread_addr_t wpanlistener_eventthread(pthread_addr_t arg) } if (notif.notiftype == IEEE802154_NOTIFY_IND_BEACONNOTIFY && - receiver->filter.indevents.beaconnotify) + receiver->filter.indevents.beacon) { receiver->cb(¬if, receiver->arg); diff --git a/wireless/ieee802154/i8sak/wpanlistener.h b/wireless/ieee802154/i8sak/wpanlistener.h index 5d1ee14aa..26a2bd707 100644 --- a/wireless/ieee802154/i8sak/wpanlistener.h +++ b/wireless/ieee802154/i8sak/wpanlistener.h @@ -84,7 +84,7 @@ struct wpanlistener_eventfilter_s { uint32_t assoc : 1; uint32_t disassoc : 1; - uint32_t beaconnotify : 1; + uint32_t beacon : 1; uint32_t commstatus : 1; uint32_t gts : 1; uint32_t orphan : 1; From 84940171645c4610b059a2b809dbe8f8ea678015 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Sat, 1 Jul 2017 17:13:32 -0400 Subject: [PATCH 3/8] i8sak: Adds reset command to reset the MAC layer --- include/wireless/ieee802154.h | 2 +- wireless/ieee802154/i8sak/Makefile | 1 + wireless/ieee802154/i8sak/i8sak.h | 1 + wireless/ieee802154/i8sak/i8sak_main.c | 2 + wireless/ieee802154/i8sak/i8sak_reset.c | 111 ++++++++++++++++++ wireless/ieee802154/i8sak/i8sak_startpan.c | 4 +- .../ieee802154/libmac/ieee802154_resetreq.c | 9 +- 7 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 wireless/ieee802154/i8sak/i8sak_reset.c diff --git a/include/wireless/ieee802154.h b/include/wireless/ieee802154.h index da84dcfcd..3ba410fd2 100644 --- a/include/wireless/ieee802154.h +++ b/include/wireless/ieee802154.h @@ -68,7 +68,7 @@ int ieee802154_get_req(int fd, FAR struct ieee802154_get_req_s *req); int ieee802154_gts_req(int fd, FAR struct ieee802154_gts_req_s *req); int ieee802154_orphan_resp(int fd, FAR struct ieee802154_orphan_resp_s *resp); -int ieee802154_reset_req(int fd, FAR struct ieee802154_reset_req_s *req); +int ieee802154_reset_req(int fd, bool resetattr); int ieee802154_rxenable_req(int fd, FAR struct ieee802154_rxenable_req_s *req); int ieee802154_scan_req(int fd, FAR struct ieee802154_scan_req_s *req); diff --git a/wireless/ieee802154/i8sak/Makefile b/wireless/ieee802154/i8sak/Makefile index d24344887..2b4e61b14 100644 --- a/wireless/ieee802154/i8sak/Makefile +++ b/wireless/ieee802154/i8sak/Makefile @@ -49,6 +49,7 @@ STACKSIZE = 4096 ASRCS = CSRCS = i8sak_acceptassoc.c i8sak_assoc.c i8sak_scan.c i8sak_blaster.c i8sak_poll.c CSRCS += i8sak_sniffer.c i8sak_startpan.c i8sak_tx.c i8sak_chan.c i8sak_coordinfo.c +CSRCS += i8sak_reset.c CSRCS += wpanlistener.c MAINSRC = i8sak_main.c diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index 3ea211b76..c3ae6033f 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -193,6 +193,7 @@ void i8sak_sniffer_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[ void i8sak_blaster_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_chan_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_coordinfo_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); +void i8sak_reset_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); /**************************************************************************** * Inline Functions diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 872e3c5e5..9f309c4db 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -111,6 +111,7 @@ static const struct i8sak_command_s g_i8sak_commands[] = {"blaster", (CODE void *)i8sak_blaster_cmd}, {"chan", (CODE void *)i8sak_chan_cmd}, {"coordinfo", (CODE void *)i8sak_coordinfo_cmd}, + {"reset", (CODE void *)i8sak_reset_cmd}, }; #define NCOMMANDS (sizeof(g_i8sak_commands) / sizeof(struct i8sak_command_s)) @@ -742,6 +743,7 @@ static int i8sak_showusage(FAR const char *progname, int exitcode) " sniffer [-h|q]\n" " chan [-h|g] []\n" " coordinfo [-h|a|e|s]\n" + " reset [-h]\n" , progname); exit(exitcode); } diff --git a/wireless/ieee802154/i8sak/i8sak_reset.c b/wireless/ieee802154/i8sak/i8sak_reset.c new file mode 100644 index 000000000..4b415481b --- /dev/null +++ b/wireless/ieee802154/i8sak/i8sak_reset.c @@ -0,0 +1,111 @@ +/**************************************************************************** + * apps/wireless/ieee802154/i8sak/i8sak_reset.c + * IEEE 802.15.4 Swiss Army Knife + * + * Copyright (C) 2017 Verge Inc. All rights reserved. + * Author: Anthony Merlino + * + * 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 NuttX 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 OWNER 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. + * + ****************************************************************************/ + + /**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i8sak.h" + +#include +#include +#include "wireless/ieee802154.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name : i8sak_reset_cmd + * + * Description : + * Reset the MAC layer + ****************************************************************************/ + +void i8sak_reset_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) +{ + int option; + int fd; + + while ((option = getopt(argc, argv, ":h")) != ERROR) + { + switch (option) + { + case 'h': + fprintf(stderr, "Resets the MAC layer\n" + "Usage: %s [-h]\n" + " -h = this help menu\n" + , argv[0]); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + return; + + case ':': + fprintf(stderr, "ERROR: missing argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + case '?': + fprintf(stderr, "ERROR: unknown argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + } + } + + fd = open(i8sak->devname, O_RDWR); + if (fd < 0) + { + printf("cannot open %s, errno=%d\n", i8sak->devname, errno); + i8sak_cmd_error(i8sak); + } + + ieee802154_reset_req(fd, true); + + close(fd); +} diff --git a/wireless/ieee802154/i8sak/i8sak_startpan.c b/wireless/ieee802154/i8sak/i8sak_startpan.c index 2c48c463e..2e1d59bca 100644 --- a/wireless/ieee802154/i8sak/i8sak_startpan.c +++ b/wireless/ieee802154/i8sak/i8sak_startpan.c @@ -71,7 +71,6 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) { - struct ieee802154_reset_req_s resetreq; struct ieee802154_start_req_s startreq; bool beaconenabled = false; int option; @@ -120,8 +119,7 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) /* Reset the MAC layer */ printf("\ni8sak: resetting MAC layer\n"); - resetreq.rst_pibattr = true; - ieee802154_reset_req(fd, &resetreq); + ieee802154_reset_req(fd, true); /* Make sure receiver is always on */ diff --git a/wireless/ieee802154/libmac/ieee802154_resetreq.c b/wireless/ieee802154/libmac/ieee802154_resetreq.c index e5f970112..33c62e2b9 100644 --- a/wireless/ieee802154/libmac/ieee802154_resetreq.c +++ b/wireless/ieee802154/libmac/ieee802154_resetreq.c @@ -53,11 +53,14 @@ * Public Functions ****************************************************************************/ -int ieee802154_reset_req(int fd, FAR struct ieee802154_reset_req_s *req) -{ +int ieee802154_reset_req(int fd, bool resetattr) +{ + FAR struct ieee802154_reset_req_s req; int ret; - ret = ioctl(fd, MAC802154IOC_MLME_RESET_REQUEST, (unsigned long)((uintptr_t)req)); + req.resetattr = resetattr; + + ret = ioctl(fd, MAC802154IOC_MLME_RESET_REQUEST, (unsigned long)((uintptr_t)&req)); if (ret < 0) { ret = -errno; From 509ac5d5101b34bd0b7dfbc3bc6aff4065bf01a3 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Sat, 1 Jul 2017 17:14:17 -0400 Subject: [PATCH 4/8] i8sak: Adds option to assoc command -t to specify how long to wait for a response from the Coordinator --- wireless/ieee802154/i8sak/i8sak_assoc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_assoc.c b/wireless/ieee802154/i8sak/i8sak_assoc.c index d06ff0bf4..5f1c3ac1c 100644 --- a/wireless/ieee802154/i8sak/i8sak_assoc.c +++ b/wireless/ieee802154/i8sak/i8sak_assoc.c @@ -83,6 +83,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) struct ieee802154_assoc_req_s assocreq; struct wpanlistener_eventfilter_s filter; FAR struct ieee802154_pandesc_s *pandesc; + struct ieee802154_set_req_s setreq; bool retry = false; int maxretries = 0; int retrycnt; @@ -92,6 +93,9 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) int ret; uint8_t resindex; + setreq.attr = IEEE802154_ATTR_MAC_RESPONSE_WAIT_TIME; + setreq.attrval.mac.resp_waittime = 32; + /* If the addresses has never been automatically or manually set before, set * it assuming that we are the default device address and the endpoint is the * default PAN Coordinator address. This is actually the way the i8sak settings @@ -104,7 +108,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) } optcnt = 0; - while ((option = getopt(argc, argv, ":hr:s:e:w:")) != ERROR) + while ((option = getopt(argc, argv, ":hr:s:e:w:t:")) != ERROR) { optcnt++; switch (option) @@ -115,6 +119,9 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) " -h = this help menu\n" " -w = wait and retry on failure\n" " -r = use scan result index\n" + " -s = coordinator short address" + " -e = coordinator ext address" + " -t = response wait time" , argv[0]); /* Must manually reset optind if we are going to exit early */ @@ -143,7 +150,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) break; case 's': - /* Parse extended address and put it into the i8sak instance */ + /* Parse short address and put it into the i8sak instance */ i8sak_str2saddr(optarg, i8sak->ep.saddr); i8sak->ep.mode= IEEE802154_ADDRMODE_SHORT; @@ -155,6 +162,12 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_str2eaddr(optarg, i8sak->ep.eaddr); i8sak->ep.mode = IEEE802154_ADDRMODE_EXTENDED; break; + + case 't': + /* Parse wait time and set the paremeter in the request */ + + setreq.attrval.mac.resp_waittime = i8sak_str2luint8(optarg); + break; case 'w': /* Wait and retry if we fail to associate */ @@ -197,6 +210,8 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } + ieee802154_set_req(fd, &setreq); + /* Register new callback for receiving the association notifications. */ memset(&filter, 0, sizeof(struct wpanlistener_eventfilter_s)); From 9a37576e48dd88a7fca0c50036bbad1279d45b21 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Sat, 1 Jul 2017 17:14:31 -0400 Subject: [PATCH 5/8] i8sak: Minor tweaks --- wireless/ieee802154/i8sak/i8sak.h | 4 ++-- wireless/ieee802154/i8sak/i8sak_scan.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index c3ae6033f..b2c05f0d2 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -103,10 +103,10 @@ #define PRINT_COORDEADDR(eaddr) \ printf(" Coordinator EADDR: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", \ - eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5], eaddr[6], eaddr[7]); + eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5], eaddr[6], eaddr[7]) #define PRINT_COORDSADDR(saddr) \ - printf(" Coordinator SADDR: %02X:%02X\n", saddr[0], saddr[1]); + printf(" Coordinator SADDR: %02X:%02X\n", saddr[0], saddr[1]) /**************************************************************************** * Public Types diff --git a/wireless/ieee802154/i8sak/i8sak_scan.c b/wireless/ieee802154/i8sak/i8sak_scan.c index 069949f33..7a51dd42d 100644 --- a/wireless/ieee802154/i8sak/i8sak_scan.c +++ b/wireless/ieee802154/i8sak/i8sak_scan.c @@ -142,7 +142,7 @@ void i8sak_scan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } - scan.duration = 5; + scan.duration = 8; scan.chpage = i8sak->chpage; /* Parse channel list */ From 2f32bd4391cbc30517ba972088b7ee3b03be5c8c Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Mon, 10 Jul 2017 19:49:43 -0400 Subject: [PATCH 6/8] i8sak: Minor formatting fix --- wireless/ieee802154/i8sak/i8sak_tx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_tx.c b/wireless/ieee802154/i8sak/i8sak_tx.c index d60668f86..179542a07 100644 --- a/wireless/ieee802154/i8sak/i8sak_tx.c +++ b/wireless/ieee802154/i8sak/i8sak_tx.c @@ -197,8 +197,7 @@ void i8sak_tx_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) wpanlistener_add_eventreceiver(&i8sak->wpanlistener, tx_eventcb, &eventfilter, (FAR void *)i8sak, true); - - ret = i8sak_tx(i8sak,fd); + ret = i8sak_tx(i8sak, fd); if (ret < 0) { fprintf(stderr, "ERROR: Failed to transmit packet\n"); From 3f07f04e78643fab5844848f425a36d58e7fe955 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Mon, 17 Jul 2017 01:24:06 -0400 Subject: [PATCH 7/8] wireless/ieee802154/i8sak: Minor setting changes --- wireless/ieee802154/i8sak/Kconfig | 4 ++++ wireless/ieee802154/i8sak/i8sak_main.c | 10 +++++----- wireless/ieee802154/i8sak/i8sak_scan.c | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/wireless/ieee802154/i8sak/Kconfig b/wireless/ieee802154/i8sak/Kconfig index d74fddd74..ac3381a59 100644 --- a/wireless/ieee802154/i8sak/Kconfig +++ b/wireless/ieee802154/i8sak/Kconfig @@ -31,5 +31,9 @@ config IEEE802154_I8SAK_STACKSIZE int "i8sak stack size" default 2048 +config IEEE802154_I8SAK_CHNUM + int "default channel" + default 11 + endif diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 9f309c4db..02949d982 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -150,14 +150,14 @@ int i8sak_tx(FAR struct i8sak_s *i8sak, int fd) /* Set an application defined handle */ - tx.meta.msdu_handle = i8sak->msdu_handle++; + tx.meta.handle = i8sak->msdu_handle++; /* This is a normal transaction, no special handling */ - tx.meta.msdu_flags.ack_tx = 0; - tx.meta.msdu_flags.gts_tx = 0; + tx.meta.flags.ackreq = 1; + tx.meta.flags.usegts = 0; - tx.meta.msdu_flags.indirect_tx = i8sak->indirect; + tx.meta.flags.indirect = i8sak->indirect; if (i8sak->indirect) { @@ -178,7 +178,7 @@ int i8sak_tx(FAR struct i8sak_s *i8sak, int fd) tx.meta.ranging = IEEE802154_NON_RANGING; - tx.meta.srcaddr_mode = IEEE802154_ADDRMODE_SHORT; + tx.meta.srcmode = IEEE802154_ADDRMODE_SHORT; memcpy(&tx.meta.destaddr, &i8sak->ep, sizeof(struct ieee802154_addr_s)); /* Each byte is represented by 2 chars */ diff --git a/wireless/ieee802154/i8sak/i8sak_scan.c b/wireless/ieee802154/i8sak/i8sak_scan.c index 7a51dd42d..0be136ccd 100644 --- a/wireless/ieee802154/i8sak/i8sak_scan.c +++ b/wireless/ieee802154/i8sak/i8sak_scan.c @@ -142,7 +142,7 @@ void i8sak_scan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } - scan.duration = 8; + scan.duration = 7; scan.chpage = i8sak->chpage; /* Parse channel list */ From 997b753334c9366c9ed96ecbd1837fc9ce97d6a4 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Tue, 18 Jul 2017 14:05:42 -0400 Subject: [PATCH 8/8] ieee802154/i8sak: Adds command to trigger regdump of radio --- wireless/ieee802154/i8sak/Makefile | 2 +- wireless/ieee802154/i8sak/i8sak.h | 1 + wireless/ieee802154/i8sak/i8sak_main.c | 2 + wireless/ieee802154/i8sak/i8sak_regdump.c | 113 ++++++++++++++++++++++ 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 wireless/ieee802154/i8sak/i8sak_regdump.c diff --git a/wireless/ieee802154/i8sak/Makefile b/wireless/ieee802154/i8sak/Makefile index 2b4e61b14..572b96870 100644 --- a/wireless/ieee802154/i8sak/Makefile +++ b/wireless/ieee802154/i8sak/Makefile @@ -49,7 +49,7 @@ STACKSIZE = 4096 ASRCS = CSRCS = i8sak_acceptassoc.c i8sak_assoc.c i8sak_scan.c i8sak_blaster.c i8sak_poll.c CSRCS += i8sak_sniffer.c i8sak_startpan.c i8sak_tx.c i8sak_chan.c i8sak_coordinfo.c -CSRCS += i8sak_reset.c +CSRCS += i8sak_reset.c i8sak_regdump.c CSRCS += wpanlistener.c MAINSRC = i8sak_main.c diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index b2c05f0d2..37b31e957 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -194,6 +194,7 @@ void i8sak_blaster_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[ void i8sak_chan_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_coordinfo_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_reset_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); +void i8sak_regdump_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); /**************************************************************************** * Inline Functions diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 02949d982..054e65fc3 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -112,6 +112,7 @@ static const struct i8sak_command_s g_i8sak_commands[] = {"chan", (CODE void *)i8sak_chan_cmd}, {"coordinfo", (CODE void *)i8sak_coordinfo_cmd}, {"reset", (CODE void *)i8sak_reset_cmd}, + {"regdump", (CODE void *)i8sak_regdump_cmd}, }; #define NCOMMANDS (sizeof(g_i8sak_commands) / sizeof(struct i8sak_command_s)) @@ -744,6 +745,7 @@ static int i8sak_showusage(FAR const char *progname, int exitcode) " chan [-h|g] []\n" " coordinfo [-h|a|e|s]\n" " reset [-h]\n" + " regdump [-h]\n" , progname); exit(exitcode); } diff --git a/wireless/ieee802154/i8sak/i8sak_regdump.c b/wireless/ieee802154/i8sak/i8sak_regdump.c new file mode 100644 index 000000000..5233b9c8b --- /dev/null +++ b/wireless/ieee802154/i8sak/i8sak_regdump.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * apps/wireless/ieee802154/i8sak/i8sak_regdump.c + * IEEE 802.15.4 Swiss Army Knife + * + * Copyright (C) 2017 Verge Inc. All rights reserved. + * Author: Anthony Merlino + * + * 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 NuttX 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 OWNER 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. + * + ****************************************************************************/ + + /**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "i8sak.h" + +#include +#include +#include "wireless/ieee802154.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name : i8sak_regdump_cmd + * + * Description : + * Print register information of radio device + ****************************************************************************/ + +void i8sak_regdump_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) +{ + struct ieee802154_get_req_s req; + int option; + int fd; + + while ((option = getopt(argc, argv, ":h")) != ERROR) + { + switch (option) + { + case 'h': + fprintf(stderr, "Prints reg info of radio device\n" + "Usage: %s [-h]\n" + " -h = this help menu\n" + , argv[0]); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + return; + + case ':': + fprintf(stderr, "ERROR: missing argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + case '?': + fprintf(stderr, "ERROR: unknown argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + } + } + + fd = open(i8sak->devname, O_RDWR); + if (fd < 0) + { + printf("cannot open %s, errno=%d\n", i8sak->devname, errno); + i8sak_cmd_error(i8sak); + } + + req.attr = IEEE802154_ATTR_RADIO_REGDUMP; + ieee802154_get_req(fd, &req); + + close(fd); +}