From 8288f53d4ea0184150459ca6d3ccfabcb7b43f0b Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 13 Apr 2017 09:13:16 -0600 Subject: [PATCH] ieee802154 radio: Implement IOCTL decode and dispatch in all radio drivers. --- drivers/wireless/ieee802154/at86rf23x.c | 73 ++++++++++++++++++- drivers/wireless/ieee802154/mrf24j40.c | 73 ++++++++++++++++++- .../wireless/ieee802154/ieee802154_radio.h | 20 ++--- 3 files changed, 155 insertions(+), 11 deletions(-) diff --git a/drivers/wireless/ieee802154/at86rf23x.c b/drivers/wireless/ieee802154/at86rf23x.c index 7b6193c0aad..ceebfe79f9e 100644 --- a/drivers/wireless/ieee802154/at86rf23x.c +++ b/drivers/wireless/ieee802154/at86rf23x.c @@ -1154,10 +1154,81 @@ static int at86rf23x_getcca(FAR struct ieee802154_radio_s *ieee, static int at86rf23x_ioctl(FAR struct ieee802154_radio_s *ieee, int cmd, unsigned long arg) { - FAR struct at86rf23x_dev_s *dev = (FAR struct at86rf23x_dev_s *)ieee; + FAR struct at86rf23x_dev_s *dev = + (FAR struct at86rf23x_dev_s *)ieee; + FAR union ieee802154_radioarg_u *u; = + (FAR union ieee802154_radioarg_u *)((uintptr_t)arg) switch (cmd) { + case PHY802154IOC_SET_CHAN: + ret = at86rf23x_setchannel(ieee, u.channel); + break; + + case PHY802154IOC_GET_CHAN: + ret = at86rf23x_getchannel(ieee, &u.channel); + break; + + case PHY802154IOC_SET_PANID: + ret = at86rf23x_setpanid(ieee, u.panid); + break; + + case PHY802154IOC_GET_PANID: + ret = at86rf23x_getpanid(ieee, &u.panid); + break; + + case PHY802154IOC_SET_SADDR: + ret = at86rf23x_setsaddr(ieee, u.saddr); + break; + + case PHY802154IOC_GET_SADDR: + ret = at86rf23x_getsaddr(ieee, &u.saddr); + break; + + case PHY802154IOC_SET_EADDR: + ret = at86rf23x_seteaddr(ieee, u.eaddr); + break; + + case PHY802154IOC_GET_EADDR: + ret = at86rf23x_geteaddr(ieee, u.eaddr); + break; + + case PHY802154IOC_SET_PROMISC: + ret = at86rf23x_setpromisc(ieee, u.promisc); + break; + + case PHY802154IOC_GET_PROMISC: + ret = at86rf23x_getpromisc(ieee, &u.promisc); + break; + + case PHY802154IOC_SET_DEVMODE: + ret = at86rf23x_setdevmode(ieee, u.devmode); + break; + + case PHY802154IOC_GET_DEVMODE: + ret = at86rf23x_getdevmode(ieee, &u.devmode); + break; + + case PHY802154IOC_SET_TXPWR: + ret = at86rf23x_settxpower(ieee, u.txpwr); + break; + + case PHY802154IOC_GET_TXPWR: + ret = at86rf23x_gettxpower(ieee, &u.txpwr); + break; + + case PHY802154IOC_SET_CCA: + ret = at86rf23x_setcca(ieee, &u.cca); + break; + + case PHY802154IOC_GET_CCA: + ret = at86rf23x_getcca(ieee, &u.cca); + break; + + case PHY802154IOC_ENERGYDETECT: + ret = at86rf23x_energydetect(ieee, &u.energy); + break; + case 1000: return at86rf23x_regdump(dev); diff --git a/drivers/wireless/ieee802154/mrf24j40.c b/drivers/wireless/ieee802154/mrf24j40.c index 9ede37739e5..1f3f68bf983 100644 --- a/drivers/wireless/ieee802154/mrf24j40.c +++ b/drivers/wireless/ieee802154/mrf24j40.c @@ -991,10 +991,81 @@ static int mrf24j40_regdump(FAR struct mrf24j40_radio_s *dev) static int mrf24j40_ioctl(FAR struct ieee802154_radio_s *ieee, int cmd, unsigned long arg) { - FAR struct mrf24j40_radio_s *dev = (FAR struct mrf24j40_radio_s *)ieee; + FAR struct mrf24j40_radio_s *dev = + (FAR struct mrf24j40_radio_s *)ieee; + FAR union ieee802154_radioarg_u *u; = + (FAR union ieee802154_radioarg_u *)((uintptr_t)arg) switch(cmd) { + case PHY802154IOC_SET_CHAN: + ret = mrf24j40_setchannel(ieee, u.channel); + break; + + case PHY802154IOC_GET_CHAN: + ret = mrf24j40_getchannel(ieee, &u.channel); + break; + + case PHY802154IOC_SET_PANID: + ret = mrf24j40_setpanid(ieee, u.panid); + break; + + case PHY802154IOC_GET_PANID: + ret = mrf24j40_getpanid(ieee, &u.panid); + break; + + case PHY802154IOC_SET_SADDR: + ret = mrf24j40_setsaddr(ieee, u.saddr); + break; + + case PHY802154IOC_GET_SADDR: + ret = mrf24j40_getsaddr(ieee, &u.saddr); + break; + + case PHY802154IOC_SET_EADDR: + ret = mrf24j40_seteaddr(ieee, u.eaddr); + break; + + case PHY802154IOC_GET_EADDR: + ret = mrf24j40_geteaddr(ieee, u.eaddr); + break; + + case PHY802154IOC_SET_PROMISC: + ret = mrf24j40_setpromisc(ieee, u.promisc); + break; + + case PHY802154IOC_GET_PROMISC: + ret = mrf24j40_getpromisc(ieee, &u.promisc); + break; + + case PHY802154IOC_SET_DEVMODE: + ret = mrf24j40_setdevmode(ieee, u.devmode); + break; + + case PHY802154IOC_GET_DEVMODE: + ret = mrf24j40_getdevmode(ieee, &u.devmode); + break; + + case PHY802154IOC_SET_TXPWR: + ret = mrf24j40_settxpower(ieee, u.txpwr); + break; + + case PHY802154IOC_GET_TXPWR: + ret = mrf24j40_gettxpower(ieee, &u.txpwr); + break; + + case PHY802154IOC_SET_CCA: + ret = mrf24j40_setcca(ieee, &u.cca); + break; + + case PHY802154IOC_GET_CCA: + ret = mrf24j40_getcca(ieee, &u.cca); + break; + + case PHY802154IOC_ENERGYDETECT: + ret = mrf24j40_energydetect(ieee, &u.energy); + break; + case 1000: return mrf24j40_regdump(dev); diff --git a/include/nuttx/wireless/ieee802154/ieee802154_radio.h b/include/nuttx/wireless/ieee802154/ieee802154_radio.h index cbd014b0b17..af44f964450 100644 --- a/include/nuttx/wireless/ieee802154/ieee802154_radio.h +++ b/include/nuttx/wireless/ieee802154/ieee802154_radio.h @@ -99,6 +99,8 @@ #define PHY802154IOC_ENERGYDETECT _PHY802154IOC(0x0011) +#define EADDR_SIZE 8 /* REVISIT */ + /**************************************************************************** * Public Types ****************************************************************************/ @@ -129,15 +131,15 @@ struct ieee802154_packet_s union ieee802154_radioarg_u { - uint8_t channel; /* PHY802154IOC_GET/SET_CHAN */ - uint16_t panid; /* PHY802154IOC_GET/SET_PANID */ - uint16_t saddr; /* PHY802154IOC_GET/SET_SADDR */ - uint16_t laddr; /* PHY802154IOC_GET/SET_EADDR */ - bool promisc; /* PHY802154IOC_GET/SET_EADDR */ - bool devmode; /* PHY802154IOC_GET/SET_DEVMODE */ - int32_t txpwr; /* PHY802154IOC_GET/SET_TXPWR */ - bool energy /* PHY802154IOC_ENERGYDETECT */ - struct ieee802154_cca_s cca; /* PHY802154IOC_GET/SET_CCA */ + uint8_t channel; /* PHY802154IOC_GET/SET_CHAN */ + uint16_t panid; /* PHY802154IOC_GET/SET_PANID */ + uint16_t saddr; /* PHY802154IOC_GET/SET_SADDR */ + uint8_t eaddr[EADDR_SIZE]; /* PHY802154IOC_GET/SET_EADDR */ + bool promisc; /* PHY802154IOC_GET/SET_EADDR */ + uint8_t devmode; /* PHY802154IOC_GET/SET_DEVMODE */ + int32_t txpwr; /* PHY802154IOC_GET/SET_TXPWR */ + bool energy /* PHY802154IOC_ENERGYDETECT */ + struct ieee802154_cca_s cca; /* PHY802154IOC_GET/SET_CCA */ }; #ifdef CONFIG_NET_6LOWPAN