drivers/at86rf2xx: Updated address API

Changed the address getter and setter functions to avoid byte order
confusion.
This commit is contained in:
Marian Buschsieweke 2019-10-29 23:09:00 +01:00
parent ea4b78654f
commit f0317c50f2
No known key found for this signature in database
GPG Key ID: 61F64C6599B1539F
4 changed files with 27 additions and 28 deletions

View File

@ -106,8 +106,8 @@ void at86rf2xx_reset(at86rf2xx_t *dev)
addr_long.uint8[0] &= ~(0x01); addr_long.uint8[0] &= ~(0x01);
addr_long.uint8[0] |= (0x02); addr_long.uint8[0] |= (0x02);
/* set short and long address */ /* set short and long address */
at86rf2xx_set_addr_long(dev, ntohll(addr_long.uint64.u64)); at86rf2xx_set_addr_long(dev, &addr_long);
at86rf2xx_set_addr_short(dev, ntohs(addr_long.uint16[0].u16)); at86rf2xx_set_addr_short(dev, &addr_long.uint16[ARRAY_SIZE(addr_long.uint16) - 1]);
/* set default channel */ /* set default channel */
at86rf2xx_set_chan(dev, AT86RF2XX_DEFAULT_CHANNEL); at86rf2xx_set_chan(dev, AT86RF2XX_DEFAULT_CHANNEL);

View File

@ -24,6 +24,8 @@
* @} * @}
*/ */
#include <string.h>
#include "at86rf2xx.h" #include "at86rf2xx.h"
#include "at86rf2xx_internal.h" #include "at86rf2xx_internal.h"
#include "at86rf2xx_registers.h" #include "at86rf2xx_registers.h"
@ -130,43 +132,38 @@ static const uint8_t dbm_to_rx_sens[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x0e, 0x0e, 0x0e, 0x0f }; 0x0d, 0x0e, 0x0e, 0x0e, 0x0f };
#endif #endif
uint16_t at86rf2xx_get_addr_short(const at86rf2xx_t *dev) void at86rf2xx_get_addr_short(const at86rf2xx_t *dev, network_uint16_t *addr)
{ {
return (dev->netdev.short_addr[0] << 8) | dev->netdev.short_addr[1]; memcpy(addr, dev->netdev.short_addr, sizeof(*addr));
} }
void at86rf2xx_set_addr_short(at86rf2xx_t *dev, uint16_t addr) void at86rf2xx_set_addr_short(at86rf2xx_t *dev, const network_uint16_t *addr)
{ {
dev->netdev.short_addr[0] = (uint8_t)(addr); memcpy(dev->netdev.short_addr, addr, sizeof(*addr));
dev->netdev.short_addr[1] = (uint8_t)(addr >> 8);
#ifdef MODULE_SIXLOWPAN #ifdef MODULE_SIXLOWPAN
/* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit to /* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit to
* 0 for unicast addresses */ * 0 for unicast addresses */
dev->netdev.short_addr[0] &= 0x7F; dev->netdev.short_addr[0] &= 0x7F;
#endif #endif
/* device use lsb first, not network byte order */
at86rf2xx_reg_write(dev, AT86RF2XX_REG__SHORT_ADDR_0, at86rf2xx_reg_write(dev, AT86RF2XX_REG__SHORT_ADDR_0,
dev->netdev.short_addr[1]); dev->netdev.short_addr[1]);
at86rf2xx_reg_write(dev, AT86RF2XX_REG__SHORT_ADDR_1, at86rf2xx_reg_write(dev, AT86RF2XX_REG__SHORT_ADDR_1,
dev->netdev.short_addr[0]); dev->netdev.short_addr[0]);
} }
uint64_t at86rf2xx_get_addr_long(const at86rf2xx_t *dev) void at86rf2xx_get_addr_long(const at86rf2xx_t *dev, eui64_t *addr)
{ {
uint64_t addr; memcpy(addr, dev->netdev.long_addr, sizeof(*addr));
uint8_t *ap = (uint8_t *)(&addr);
for (int i = 0; i < 8; i++) {
ap[i] = dev->netdev.long_addr[i];
}
return addr;
} }
void at86rf2xx_set_addr_long(at86rf2xx_t *dev, uint64_t addr) void at86rf2xx_set_addr_long(at86rf2xx_t *dev, const eui64_t *addr)
{ {
memcpy(dev->netdev.long_addr, addr, sizeof(*addr));
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
dev->netdev.long_addr[i] = (uint8_t)(addr >> (i * 8)); /* device use lsb first, not network byte order */
at86rf2xx_reg_write(dev, (AT86RF2XX_REG__IEEE_ADDR_0 + i), at86rf2xx_reg_write(dev, (AT86RF2XX_REG__IEEE_ADDR_0 + i),
(addr >> ((7 - i) * 8))); dev->netdev.long_addr[IEEE802154_LONG_ADDRESS_LEN - 1 - i]);
} }
} }

View File

@ -469,13 +469,13 @@ static int _set(netdev_t *netdev, netopt_t opt, const void *val, size_t len)
switch (opt) { switch (opt) {
case NETOPT_ADDRESS: case NETOPT_ADDRESS:
assert(len <= sizeof(uint16_t)); assert(len >= sizeof(network_uint16_t));
at86rf2xx_set_addr_short(dev, *((const uint16_t *)val)); at86rf2xx_set_addr_short(dev, val);
/* don't set res to set netdev_ieee802154_t::short_addr */ /* don't set res to set netdev_ieee802154_t::short_addr */
break; break;
case NETOPT_ADDRESS_LONG: case NETOPT_ADDRESS_LONG:
assert(len <= sizeof(uint64_t)); assert(len >= sizeof(eui64_t));
at86rf2xx_set_addr_long(dev, *((const uint64_t *)val)); at86rf2xx_set_addr_long(dev, val);
/* don't set res to set netdev_ieee802154_t::long_addr */ /* don't set res to set netdev_ieee802154_t::long_addr */
break; break;
case NETOPT_NID: case NETOPT_NID:

View File

@ -283,10 +283,11 @@ void at86rf2xx_reset(at86rf2xx_t *dev);
* @brief Get the short address of the given device * @brief Get the short address of the given device
* *
* @param[in] dev device to read from * @param[in] dev device to read from
* @param[out] addr the short address will be stored here
* *
* @return the currently set (2-byte) short address * @return the currently set (2-byte) short address
*/ */
uint16_t at86rf2xx_get_addr_short(const at86rf2xx_t *dev); void at86rf2xx_get_addr_short(const at86rf2xx_t *dev, network_uint16_t *addr);
/** /**
* @brief Set the short address of the given device * @brief Set the short address of the given device
@ -294,16 +295,17 @@ uint16_t at86rf2xx_get_addr_short(const at86rf2xx_t *dev);
* @param[in,out] dev device to write to * @param[in,out] dev device to write to
* @param[in] addr (2-byte) short address to set * @param[in] addr (2-byte) short address to set
*/ */
void at86rf2xx_set_addr_short(at86rf2xx_t *dev, uint16_t addr); void at86rf2xx_set_addr_short(at86rf2xx_t *dev, const network_uint16_t *addr);
/** /**
* @brief Get the configured long address of the given device * @brief Get the configured long address of the given device
* *
* @param[in] dev device to read from * @param[in] dev device to read from
* @param[out] addr the long address will be stored here
* *
* @return the currently set (8-byte) long address * @return the currently set (8-byte) long address
*/ */
uint64_t at86rf2xx_get_addr_long(const at86rf2xx_t *dev); void at86rf2xx_get_addr_long(const at86rf2xx_t *dev, eui64_t *addr);
/** /**
* @brief Set the long address of the given device * @brief Set the long address of the given device
@ -311,7 +313,7 @@ uint64_t at86rf2xx_get_addr_long(const at86rf2xx_t *dev);
* @param[in,out] dev device to write to * @param[in,out] dev device to write to
* @param[in] addr (8-byte) long address to set * @param[in] addr (8-byte) long address to set
*/ */
void at86rf2xx_set_addr_long(at86rf2xx_t *dev, uint64_t addr); void at86rf2xx_set_addr_long(at86rf2xx_t *dev, const eui64_t *addr);
/** /**
* @brief Get the configured channel number of the given device * @brief Get the configured channel number of the given device