From f7bf03073c1dd9fb6b24bbc822eb03da846be531 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Thu, 15 Nov 2018 16:59:56 +0100 Subject: [PATCH 1/4] mrf24j40: read address from device This change modifies the mrf24j40 driver to read the address directly from the device instead of returning the netdev_ieee802154_t member --- drivers/mrf24j40/mrf24j40_getset.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/mrf24j40/mrf24j40_getset.c b/drivers/mrf24j40/mrf24j40_getset.c index 70bbbe747d..7780bb9c03 100644 --- a/drivers/mrf24j40/mrf24j40_getset.c +++ b/drivers/mrf24j40/mrf24j40_getset.c @@ -122,7 +122,8 @@ static const uint8_t RSSI_value[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, uint16_t mrf24j40_get_addr_short(mrf24j40_t *dev) { - return (dev->netdev.short_addr[0] << 8) | dev->netdev.short_addr[1]; + return (mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRL) << 8) | + mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRH); } void mrf24j40_set_addr_short(mrf24j40_t *dev, uint16_t addr) @@ -147,7 +148,7 @@ uint64_t mrf24j40_get_addr_long(mrf24j40_t *dev) uint8_t *ap = (uint8_t *)(&addr); for (int i = 0; i < 8; i++) { - ap[i] = dev->netdev.long_addr[i]; + ap[7 - i] = mrf24j40_reg_read_short(dev, (MRF24J40_REG_EADR0 + i)); } return addr; } From e6ace9c05d5d3bfe5954cf24bbaae42249aca553 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Thu, 15 Nov 2018 17:00:57 +0100 Subject: [PATCH 2/4] mrf24j40: Add NETOPT_ADDRESS{,_LONG} to getters --- drivers/mrf24j40/mrf24j40_netdev.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/mrf24j40/mrf24j40_netdev.c b/drivers/mrf24j40/mrf24j40_netdev.c index 099bc3789b..8da46fff32 100644 --- a/drivers/mrf24j40/mrf24j40_netdev.c +++ b/drivers/mrf24j40/mrf24j40_netdev.c @@ -174,6 +174,26 @@ static int _get(netdev_t *netdev, netopt_t opt, void *val, size_t max_len) int res; switch (opt) { + case NETOPT_ADDRESS: + if (max_len < sizeof(uint16_t)) { + res = -EOVERFLOW; + } + else { + *(uint16_t*)val = mrf24j40_get_addr_short(dev); + res = sizeof(uint16_t); + } + break; + + case NETOPT_ADDRESS_LONG: + if (max_len < sizeof(uint64_t)) { + res = -EOVERFLOW; + } + else { + *(uint64_t*)val = mrf24j40_get_addr_long(dev); + res = sizeof(uint64_t); + } + break; + case NETOPT_CHANNEL_PAGE: if (max_len < sizeof(uint16_t)) { res = -EOVERFLOW; From 38e5bd627bc2349a675927c355c784279f24a9f0 Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Thu, 15 Nov 2018 17:01:25 +0100 Subject: [PATCH 3/4] mrf24j40: Don't propagate address to 802154 layer --- drivers/mrf24j40/mrf24j40_getset.c | 9 +++------ drivers/mrf24j40/mrf24j40_netdev.c | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/mrf24j40/mrf24j40_getset.c b/drivers/mrf24j40/mrf24j40_getset.c index 7780bb9c03..ce8dca98cf 100644 --- a/drivers/mrf24j40/mrf24j40_getset.c +++ b/drivers/mrf24j40/mrf24j40_getset.c @@ -131,14 +131,12 @@ void mrf24j40_set_addr_short(mrf24j40_t *dev, uint16_t addr) #ifdef MODULE_SIXLOWPAN /* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit to * 0 for unicast addresses */ - dev->netdev.short_addr[0] &= 0x7F; + addr &= 0xFF7F; #endif - dev->netdev.short_addr[0] = (uint8_t)(addr); - dev->netdev.short_addr[1] = (uint8_t)(addr >> 8); mrf24j40_reg_write_short(dev, MRF24J40_REG_SADRL, - dev->netdev.short_addr[1]); + (uint8_t)(addr >> 8)); mrf24j40_reg_write_short(dev, MRF24J40_REG_SADRH, - dev->netdev.short_addr[0]); + (uint8_t)addr); } uint64_t mrf24j40_get_addr_long(mrf24j40_t *dev) @@ -156,7 +154,6 @@ uint64_t mrf24j40_get_addr_long(mrf24j40_t *dev) void mrf24j40_set_addr_long(mrf24j40_t *dev, uint64_t addr) { for (int i = 0; i < 8; i++) { - dev->netdev.long_addr[i] = (uint8_t)(addr >> (i * 8)); mrf24j40_reg_write_short(dev, (MRF24J40_REG_EADR0 + i), (addr >> ((7 - i) * 8))); } diff --git a/drivers/mrf24j40/mrf24j40_netdev.c b/drivers/mrf24j40/mrf24j40_netdev.c index 8da46fff32..be1d89226d 100644 --- a/drivers/mrf24j40/mrf24j40_netdev.c +++ b/drivers/mrf24j40/mrf24j40_netdev.c @@ -371,7 +371,7 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t len) } else { mrf24j40_set_addr_short(dev, *((const uint16_t *)val)); - /* don't set res to set netdev_ieee802154_t::short_addr */ + res = sizeof(uint16_t); } break; @@ -381,7 +381,7 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t len) } else { mrf24j40_set_addr_long(dev, *((const uint64_t *)val)); - /* don't set res to set netdev_ieee802154_t::long_addr */ + res = sizeof(uint64_t); } break; From a6e7882879c6937232e9a4842e1df34591ddd60f Mon Sep 17 00:00:00 2001 From: Koen Zandberg Date: Thu, 15 Nov 2018 17:08:43 +0100 Subject: [PATCH 4/4] mrf24j40: use byteorder for address operations --- drivers/mrf24j40/mrf24j40_getset.c | 31 +++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/mrf24j40/mrf24j40_getset.c b/drivers/mrf24j40/mrf24j40_getset.c index ce8dca98cf..74fd1b187e 100644 --- a/drivers/mrf24j40/mrf24j40_getset.c +++ b/drivers/mrf24j40/mrf24j40_getset.c @@ -20,6 +20,7 @@ * @} */ +#include "byteorder.h" #include "mrf24j40.h" #include "mrf24j40_internal.h" #include "mrf24j40_registers.h" @@ -122,40 +123,48 @@ static const uint8_t RSSI_value[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, uint16_t mrf24j40_get_addr_short(mrf24j40_t *dev) { - return (mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRL) << 8) | - mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRH); + network_uint16_t naddr; + naddr.u8[1] = mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRL); + naddr.u8[0] = mrf24j40_reg_read_short(dev, MRF24J40_REG_SADRH); + + return naddr.u16; } void mrf24j40_set_addr_short(mrf24j40_t *dev, uint16_t addr) { + network_uint16_t naddr; + naddr.u16 = addr; + #ifdef MODULE_SIXLOWPAN /* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit to * 0 for unicast addresses */ - addr &= 0xFF7F; + naddr.u8[0] &= 0x7F; #endif + mrf24j40_reg_write_short(dev, MRF24J40_REG_SADRL, - (uint8_t)(addr >> 8)); + naddr.u8[1]); mrf24j40_reg_write_short(dev, MRF24J40_REG_SADRH, - (uint8_t)addr); + naddr.u8[0]); } uint64_t mrf24j40_get_addr_long(mrf24j40_t *dev) { - uint64_t addr; - - uint8_t *ap = (uint8_t *)(&addr); + network_uint64_t naddr; for (int i = 0; i < 8; i++) { - ap[7 - i] = mrf24j40_reg_read_short(dev, (MRF24J40_REG_EADR0 + i)); + naddr.u8[7 - i] = mrf24j40_reg_read_short(dev, (MRF24J40_REG_EADR0 + i)); } - return addr; + return naddr.u64; } void mrf24j40_set_addr_long(mrf24j40_t *dev, uint64_t addr) { + network_uint64_t naddr; + naddr.u64 = addr; + for (int i = 0; i < 8; i++) { mrf24j40_reg_write_short(dev, (MRF24J40_REG_EADR0 + i), - (addr >> ((7 - i) * 8))); + (naddr.u8[7 - i])); } }