mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
pkg/semtech-loramac: persist updated RX2 params
After a successful OTAA join procedure, the network may change the RX2 channel datarate. It's required to also persist to be able to correctly receive downlink after a reboot
This commit is contained in:
parent
bcad9ee517
commit
ba8e7e5eaf
@ -60,6 +60,7 @@ sx127x_t sx127x;
|
|||||||
RadioEvents_t semtech_loramac_radio_events;
|
RadioEvents_t semtech_loramac_radio_events;
|
||||||
LoRaMacPrimitives_t semtech_loramac_primitives;
|
LoRaMacPrimitives_t semtech_loramac_primitives;
|
||||||
LoRaMacCallback_t semtech_loramac_callbacks;
|
LoRaMacCallback_t semtech_loramac_callbacks;
|
||||||
|
extern LoRaMacParams_t LoRaMacParams;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t *payload;
|
uint8_t *payload;
|
||||||
@ -183,19 +184,33 @@ static void mlme_indication(MlmeIndication_t *indication)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MODULE_PERIPH_EEPROM
|
#ifdef MODULE_PERIPH_EEPROM
|
||||||
static inline void _set_uplink_counter(semtech_loramac_t *mac, uint8_t *counter)
|
static size_t _read_uint32(size_t pos, uint32_t *value)
|
||||||
{
|
{
|
||||||
uint32_t counter4 = ((uint32_t)counter[0] << 24 |
|
uint8_t array[4] = { 0 };
|
||||||
(uint32_t)counter[1] << 16 |
|
size_t ret = eeprom_read(pos, array, sizeof(uint32_t));
|
||||||
(uint32_t)counter[2] << 8 |
|
*value = ((uint32_t)array[0] << 24 | (uint32_t)array[1] << 16 |
|
||||||
counter[3]);
|
(uint32_t)array[2] << 8 | array[3]);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG("[semtech-loramac] reading uplink counter: %" PRIu32 " \n", counter4);
|
static size_t _write_uint32(size_t pos, uint32_t value)
|
||||||
|
{
|
||||||
|
uint8_t array[4] = { 0 };
|
||||||
|
array[0] = (uint8_t)(value >> 24);
|
||||||
|
array[1] = (uint8_t)(value >> 16);
|
||||||
|
array[2] = (uint8_t)(value >> 8);
|
||||||
|
array[3] = (uint8_t)(value);
|
||||||
|
return eeprom_write(pos, array, sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _set_uplink_counter(semtech_loramac_t *mac, uint32_t counter)
|
||||||
|
{
|
||||||
|
DEBUG("[semtech-loramac] reading uplink counter: %" PRIu32 " \n", counter);
|
||||||
|
|
||||||
mutex_lock(&mac->lock);
|
mutex_lock(&mac->lock);
|
||||||
MibRequestConfirm_t mibReq;
|
MibRequestConfirm_t mibReq;
|
||||||
mibReq.Type = MIB_UPLINK_COUNTER;
|
mibReq.Type = MIB_UPLINK_COUNTER;
|
||||||
mibReq.Param.UpLinkCounter = counter4;
|
mibReq.Param.UpLinkCounter = counter;
|
||||||
LoRaMacMibSetRequestConfirm(&mibReq);
|
LoRaMacMibSetRequestConfirm(&mibReq);
|
||||||
mutex_unlock(&mac->lock);
|
mutex_unlock(&mac->lock);
|
||||||
}
|
}
|
||||||
@ -240,14 +255,26 @@ static inline void _read_loramac_config(semtech_loramac_t *mac)
|
|||||||
/* Read and set device address */
|
/* Read and set device address */
|
||||||
uint8_t devaddr[LORAMAC_DEVADDR_LEN];
|
uint8_t devaddr[LORAMAC_DEVADDR_LEN];
|
||||||
pos += eeprom_read(pos, devaddr, LORAMAC_DEVADDR_LEN);
|
pos += eeprom_read(pos, devaddr, LORAMAC_DEVADDR_LEN);
|
||||||
|
|
||||||
semtech_loramac_set_devaddr(mac, devaddr);
|
semtech_loramac_set_devaddr(mac, devaddr);
|
||||||
|
|
||||||
/* uplink counter */
|
/* Read uplink counter */
|
||||||
uint8_t counter[4] = { 0 };
|
uint32_t ul_counter;
|
||||||
pos += eeprom_read(pos, counter, 4);
|
pos += _read_uint32(pos, &ul_counter);
|
||||||
_set_uplink_counter(mac, counter);
|
_set_uplink_counter(mac, ul_counter);
|
||||||
|
|
||||||
|
/* Read RX2 freq */
|
||||||
|
uint32_t rx2_freq;
|
||||||
|
pos += _read_uint32(pos, &rx2_freq);
|
||||||
|
DEBUG("[semtech-loramac] reading rx2 freq: %" PRIu32 "\n", rx2_freq);
|
||||||
|
semtech_loramac_set_rx2_freq(mac, rx2_freq);
|
||||||
|
|
||||||
|
/* Read RX2 datarate */
|
||||||
|
uint8_t dr;
|
||||||
|
pos += eeprom_read(pos, &dr, 1);
|
||||||
|
DEBUG("[semtech-loramac] reading rx2 dr: %d\n", dr);
|
||||||
|
semtech_loramac_set_rx2_dr(mac, dr);
|
||||||
|
|
||||||
|
/* Read join state */
|
||||||
uint8_t joined = eeprom_read_byte(pos);
|
uint8_t joined = eeprom_read_byte(pos);
|
||||||
_set_join_state(mac, (bool)joined);
|
_set_join_state(mac, (bool)joined);
|
||||||
}
|
}
|
||||||
@ -260,19 +287,15 @@ static inline size_t _save_uplink_counter(semtech_loramac_t *mac)
|
|||||||
LORAMAC_APPKEY_LEN + LORAMAC_APPSKEY_LEN +
|
LORAMAC_APPKEY_LEN + LORAMAC_APPSKEY_LEN +
|
||||||
LORAMAC_NWKSKEY_LEN + LORAMAC_DEVADDR_LEN;
|
LORAMAC_NWKSKEY_LEN + LORAMAC_DEVADDR_LEN;
|
||||||
|
|
||||||
uint8_t counter[LORAMAC_DEVADDR_LEN];
|
uint32_t ul_counter;
|
||||||
mutex_lock(&mac->lock);
|
mutex_lock(&mac->lock);
|
||||||
MibRequestConfirm_t mibReq;
|
MibRequestConfirm_t mibReq;
|
||||||
mibReq.Type = MIB_UPLINK_COUNTER;
|
mibReq.Type = MIB_UPLINK_COUNTER;
|
||||||
LoRaMacMibGetRequestConfirm(&mibReq);
|
LoRaMacMibGetRequestConfirm(&mibReq);
|
||||||
DEBUG("[semtech-loramac] saving uplink counter: %" PRIu32 " \n",
|
ul_counter = mibReq.Param.UpLinkCounter;
|
||||||
mibReq.Param.UpLinkCounter);
|
|
||||||
counter[0] = (uint8_t)(mibReq.Param.UpLinkCounter >> 24);
|
|
||||||
counter[1] = (uint8_t)(mibReq.Param.UpLinkCounter >> 16);
|
|
||||||
counter[2] = (uint8_t)(mibReq.Param.UpLinkCounter >> 8);
|
|
||||||
counter[3] = (uint8_t)(mibReq.Param.UpLinkCounter);
|
|
||||||
mutex_unlock(&mac->lock);
|
mutex_unlock(&mac->lock);
|
||||||
return eeprom_write(pos, counter, LORAMAC_DEVADDR_LEN);
|
DEBUG("[semtech-loramac] saving uplink counter: %" PRIu32 " \n", ul_counter);
|
||||||
|
return _write_uint32(pos, ul_counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void semtech_loramac_save_config(semtech_loramac_t *mac)
|
void semtech_loramac_save_config(semtech_loramac_t *mac)
|
||||||
@ -302,6 +325,16 @@ void semtech_loramac_save_config(semtech_loramac_t *mac)
|
|||||||
/* save uplink counter, mainly used for ABP activation */
|
/* save uplink counter, mainly used for ABP activation */
|
||||||
pos += _save_uplink_counter(mac);
|
pos += _save_uplink_counter(mac);
|
||||||
|
|
||||||
|
/* save RX2 freq */
|
||||||
|
uint32_t rx2_freq = semtech_loramac_get_rx2_freq(mac);
|
||||||
|
DEBUG("[semtech-loramac] saving rx2 freq: %" PRIu32 "\n", rx2_freq);
|
||||||
|
pos += _write_uint32(pos, rx2_freq);
|
||||||
|
|
||||||
|
/* save RX2 dr */
|
||||||
|
uint8_t dr = semtech_loramac_get_rx2_dr(mac);
|
||||||
|
DEBUG("[semtech-loramac] saving rx2 dr: %d\n", dr);
|
||||||
|
pos += eeprom_write(pos, &dr, 1);
|
||||||
|
|
||||||
/* save join state */
|
/* save join state */
|
||||||
uint8_t joined = (uint8_t)semtech_loramac_is_mac_joined(mac);
|
uint8_t joined = (uint8_t)semtech_loramac_is_mac_joined(mac);
|
||||||
eeprom_write_byte(pos, joined);
|
eeprom_write_byte(pos, joined);
|
||||||
@ -319,15 +352,17 @@ void semtech_loramac_erase_config(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MibRequestConfirm_t mibReq;
|
size_t uplink_counter_len = sizeof(uint32_t);
|
||||||
size_t uplink_counter_len = sizeof(mibReq.Param.UpLinkCounter);
|
size_t rx2_freq_len = sizeof(uint32_t);
|
||||||
size_t joined_state_len = sizeof(mibReq.Param.IsNetworkJoined);
|
size_t rx2_dr_len = sizeof(uint8_t);
|
||||||
|
size_t joined_state_len = sizeof(uint8_t);
|
||||||
|
|
||||||
size_t end = (pos + SEMTECH_LORAMAC_EEPROM_MAGIC_LEN +
|
size_t end = (pos + SEMTECH_LORAMAC_EEPROM_MAGIC_LEN +
|
||||||
LORAMAC_DEVEUI_LEN + LORAMAC_APPEUI_LEN +
|
LORAMAC_DEVEUI_LEN + LORAMAC_APPEUI_LEN +
|
||||||
LORAMAC_APPKEY_LEN + LORAMAC_APPSKEY_LEN +
|
LORAMAC_APPKEY_LEN + LORAMAC_APPSKEY_LEN +
|
||||||
LORAMAC_NWKSKEY_LEN + LORAMAC_DEVADDR_LEN +
|
LORAMAC_NWKSKEY_LEN + LORAMAC_DEVADDR_LEN +
|
||||||
uplink_counter_len + joined_state_len);
|
uplink_counter_len + rx2_freq_len + rx2_dr_len +
|
||||||
|
joined_state_len);
|
||||||
for (size_t p = pos; p < end; p++) {
|
for (size_t p = pos; p < end; p++) {
|
||||||
eeprom_write_byte(p, 0);
|
eeprom_write_byte(p, 0);
|
||||||
}
|
}
|
||||||
@ -362,7 +397,6 @@ void _init_loramac(semtech_loramac_t *mac,
|
|||||||
#ifdef MODULE_PERIPH_EEPROM
|
#ifdef MODULE_PERIPH_EEPROM
|
||||||
_read_loramac_config(mac);
|
_read_loramac_config(mac);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _join_otaa(semtech_loramac_t *mac)
|
static void _join_otaa(semtech_loramac_t *mac)
|
||||||
@ -623,6 +657,8 @@ void *_semtech_loramac_event_loop(void *arg)
|
|||||||
/* Status is OK, node has joined the network */
|
/* Status is OK, node has joined the network */
|
||||||
DEBUG("[semtech-loramac] join succeeded\n");
|
DEBUG("[semtech-loramac] join succeeded\n");
|
||||||
msg_ret.content.value = SEMTECH_LORAMAC_JOIN_SUCCEEDED;
|
msg_ret.content.value = SEMTECH_LORAMAC_JOIN_SUCCEEDED;
|
||||||
|
/* Set RX2 DR parameters in the MIB from MAC params */
|
||||||
|
semtech_loramac_set_rx2_dr(mac, LoRaMacParams.Rx2Channel.Datarate);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DEBUG("[semtech-loramac] join not successful\n");
|
DEBUG("[semtech-loramac] join not successful\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user