ieee802154 radio: Implement IOCTL decode and dispatch in all radio drivers.

This commit is contained in:
Gregory Nutt 2017-04-13 09:13:16 -06:00
parent 32962fa6e3
commit 8288f53d4e
3 changed files with 155 additions and 11 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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