40enum _cr_t { CR_4_5=0, CR_4_6, CR_4_7, CR_4_8 };
41enum _sf_t { FSK=0, SF7, SF8, SF9, SF10, SF11, SF12, SFrfu };
42enum _bw_t { BW125=0, BW250, BW500, BWrfu };
59enum { ILLEGAL_RPS = 0xFF };
62enum { STD_PREAMBLE_LEN = 8 };
63enum { MAX_LEN_FRAME = LMIC_MAX_FRAME_LENGTH };
64enum { LEN_DEVNONCE = 2 };
65enum { LEN_ARTNONCE = 3 };
66enum { LEN_NETID = 3 };
67enum { DELAY_JACC1 = 5 };
68enum { DELAY_DNW1 = 1 };
69enum { DELAY_EXTDNW2 = 1 };
70enum { DELAY_JACC2 = DELAY_JACC1+(int)DELAY_EXTDNW2 };
71enum { DELAY_DNW2 = DELAY_DNW1 +(int)DELAY_EXTDNW2 };
72enum { BCN_INTV_exp = 7 };
73enum { BCN_INTV_sec = 1<<BCN_INTV_exp };
74enum { BCN_INTV_ms = BCN_INTV_sec*1000L };
75enum { BCN_INTV_us = BCN_INTV_ms*1000L };
76enum { BCN_RESERVE_ms = 2120 };
77enum { BCN_GUARD_ms = 3000 };
78enum { BCN_SLOT_SPAN_ms = 30 };
79enum { BCN_WINDOW_ms = BCN_INTV_ms-(int)BCN_GUARD_ms-(
int)BCN_RESERVE_ms };
80enum { BCN_RESERVE_us = 2120000 };
81enum { BCN_GUARD_us = 3000000 };
82enum { BCN_SLOT_SPAN_us = 30000 };
126#if defined(CFG_eu868)
128#include "lorabase_eu868.h"
131#define LMIC_ENABLE_TxParamSetupReq 0
133enum { DR_DFLTMIN = EU868_DR_SF7 };
135enum { DR_PAGE = DR_PAGE_EU868 };
138enum { FREQ_PING = EU868_F6 };
139enum { DR_PING = EU868_DR_SF9 };
141enum { FREQ_DNW2 = EU868_F6 };
142enum { DR_DNW2 = EU868_DR_SF12 };
143enum { CHNL_BCN = 5 };
144enum { FREQ_BCN = EU868_F6 };
145enum { DR_BCN = EU868_DR_SF9 };
146enum { AIRTIME_BCN = 144384 };
147enum { LMIC_REGION_EIRP = EU868_LMIC_REGION_EIRP };
163enum _dr_configured_t {
164 DR_SF12 = EU868_DR_SF12,
165 DR_SF11 = EU868_DR_SF11,
166 DR_SF10 = EU868_DR_SF10,
167 DR_SF9 = EU868_DR_SF9,
168 DR_SF8 = EU868_DR_SF8,
169 DR_SF7 = EU868_DR_SF7,
170 DR_SF7B = EU868_DR_SF7B,
171 DR_FSK = EU868_DR_FSK,
172 DR_NONE = EU868_DR_NONE
176#elif defined(CFG_us915)
178#include "lorabase_us915.h"
181#define LMIC_ENABLE_TxParamSetupReq 0
183enum { DR_DFLTMIN = US915_DR_SF7 };
186enum { DR_PAGE = DR_PAGE_US915 };
189enum { FREQ_PING = US915_500kHz_DNFBASE + 0*US915_500kHz_DNFSTEP };
190enum { DR_PING = US915_DR_SF10CR };
192enum { FREQ_DNW2 = US915_500kHz_DNFBASE + 0*US915_500kHz_DNFSTEP };
193enum { DR_DNW2 = US915_DR_SF12CR };
194enum { CHNL_BCN = 0 };
195enum { DR_BCN = US915_DR_SF12CR };
197enum { AIRTIME_BCN = 72192 };
198enum { LMIC_REGION_EIRP = US915_LMIC_REGION_EIRP };
214enum _dr_configured_t {
215 DR_SF10 = US915_DR_SF10,
216 DR_SF9 = US915_DR_SF9,
217 DR_SF8 = US915_DR_SF8,
218 DR_SF7 = US915_DR_SF7,
219 DR_SF8C = US915_DR_SF8C,
220 DR_NONE = US915_DR_NONE,
221 DR_SF12CR = US915_DR_SF12CR,
222 DR_SF11CR = US915_DR_SF11CR,
223 DR_SF10CR = US915_DR_SF10CR,
224 DR_SF9CR = US915_DR_SF9CR,
225 DR_SF8CR = US915_DR_SF8CR,
226 DR_SF7CR = US915_DR_SF7CR
230#elif defined(CFG_au915)
232#include "lorabase_au915.h"
235#define LMIC_ENABLE_TxParamSetupReq 1
237enum { DR_DFLTMIN = AU915_DR_SF7 };
240enum { DR_PAGE = DR_PAGE_AU915 };
243enum { FREQ_PING = AU915_500kHz_DNFBASE + 0*AU915_500kHz_DNFSTEP };
244enum { DR_PING = AU915_DR_SF10CR };
246enum { FREQ_DNW2 = AU915_500kHz_DNFBASE + 0*AU915_500kHz_DNFSTEP };
247enum { DR_DNW2 = AU915_DR_SF12CR };
248enum { CHNL_BCN = 0 };
249enum { DR_BCN = AU915_DR_SF10CR };
250enum { AIRTIME_BCN = 72192 };
251enum { LMIC_REGION_EIRP = AU915_LMIC_REGION_EIRP };
267enum _dr_configured_t {
268 DR_SF12 = AU915_DR_SF12,
269 DR_SF11 = AU915_DR_SF11,
270 DR_SF10 = AU915_DR_SF10,
271 DR_SF9 = AU915_DR_SF9,
272 DR_SF8 = AU915_DR_SF8,
273 DR_SF7 = AU915_DR_SF7,
274 DR_SF8C = AU915_DR_SF8C,
275 DR_NONE = AU915_DR_NONE,
276 DR_SF12CR = AU915_DR_SF12CR,
277 DR_SF11CR = AU915_DR_SF11CR,
278 DR_SF10CR = AU915_DR_SF10CR,
279 DR_SF9CR = AU915_DR_SF9CR,
280 DR_SF8CR = AU915_DR_SF8CR,
281 DR_SF7CR = AU915_DR_SF7CR
285#elif defined(CFG_as923)
287#include "lorabase_as923.h"
290#define LMIC_ENABLE_TxParamSetupReq 1
292enum { DR_DFLTMIN = AS923_DR_SF10 };
294enum { DR_PAGE = DR_PAGE_AS923 };
296enum { FREQ_PING = AS923_F2 };
297enum { DR_PING = AS923_DR_SF9 };
298enum { FREQ_DNW2 = AS923_FDOWN };
299enum { DR_DNW2 = AS923_DR_SF10 };
300enum { CHNL_BCN = 5 };
301enum { FREQ_BCN = AS923_FBCN };
302enum { DR_BCN = AS923_DR_SF9 };
303enum { AIRTIME_BCN = 144384 };
304enum { LMIC_REGION_EIRP = AS923_LMIC_REGION_EIRP };
319enum _dr_configured_t {
320 DR_SF12 = AS923_DR_SF12,
321 DR_SF11 = AS923_DR_SF11,
322 DR_SF10 = AS923_DR_SF10,
323 DR_SF9 = AS923_DR_SF9,
324 DR_SF8 = AS923_DR_SF8,
325 DR_SF7 = AS923_DR_SF7,
326 DR_SF7B = AS923_DR_SF7B,
327 DR_FSK = AS923_DR_FSK,
328 DR_NONE = AS923_DR_NONE
332#elif defined(CFG_kr920)
334#include "lorabase_kr920.h"
337#define LMIC_ENABLE_TxParamSetupReq 0
339enum { DR_DFLTMIN = KR920_DR_SF12 };
341enum { DR_PAGE = DR_PAGE_KR920 };
343enum { FREQ_PING = KR920_FBCN };
344enum { DR_PING = KR920_DR_SF9 };
345enum { FREQ_DNW2 = KR920_FDOWN };
346enum { DR_DNW2 = KR920_DR_SF12 };
347enum { CHNL_BCN = 11 };
348enum { FREQ_BCN = KR920_FBCN };
349enum { DR_BCN = KR920_DR_SF9 };
350enum { AIRTIME_BCN = 144384 };
351enum { LMIC_REGION_EIRP = KR920_LMIC_REGION_EIRP };
366enum _dr_configured_t {
367 DR_SF12 = KR920_DR_SF12,
368 DR_SF11 = KR920_DR_SF11,
369 DR_SF10 = KR920_DR_SF10,
370 DR_SF9 = KR920_DR_SF9,
371 DR_SF8 = KR920_DR_SF8,
372 DR_SF7 = KR920_DR_SF7,
373 DR_NONE = KR920_DR_NONE
377#elif defined(CFG_in866)
379#include "lorabase_in866.h"
382#define LMIC_ENABLE_TxParamSetupReq 0
384enum { DR_DFLTMIN = IN866_DR_SF7 };
385enum { DR_PAGE = DR_PAGE_IN866 };
387enum { FREQ_PING = IN866_FB };
388enum { DR_PING = IN866_DR_SF8 };
389enum { FREQ_DNW2 = IN866_FB };
390enum { DR_DNW2 = IN866_DR_SF10 };
391enum { CHNL_BCN = 5 };
392enum { FREQ_BCN = IN866_FB };
393enum { DR_BCN = IN866_DR_SF8 };
394enum { AIRTIME_BCN = 144384 };
395enum { LMIC_REGION_EIRP = IN866_LMIC_REGION_EIRP };
410enum _dr_configured_t {
411 DR_SF12 = IN866_DR_SF12,
412 DR_SF11 = IN866_DR_SF11,
413 DR_SF10 = IN866_DR_SF10,
414 DR_SF9 = IN866_DR_SF9,
415 DR_SF8 = IN866_DR_SF8,
416 DR_SF7 = IN866_DR_SF7,
417 DR_FSK = IN866_DR_FSK,
418 DR_NONE = IN866_DR_NONE
423# error Unsupported configuration setting
431 OFF_JR_DEVNONCE = 17,
451 LORAWAN_JoinAccept_CFListType_FREQUENCIES = 0,
452 LORAWAN_JoinAccept_CFListType_MASK = 1,
463enum { MAX_LEN_PAYLOAD = MAX_LEN_FRAME-(int)OFF_DAT_OPTS-4 };
470enum { HDR_FTYPE_DNFLAG = 0x20 };
473 HDR_FTYPE_JREQ = 0x00,
474 HDR_FTYPE_JACC = 0x20,
475 HDR_FTYPE_DAUP = 0x40,
476 HDR_FTYPE_DADN = 0x60,
477 HDR_FTYPE_DCUP = 0x80,
478 HDR_FTYPE_DCDN = 0xA0,
479 HDR_FTYPE_PROP = 0xE0
487 FCT_ADRACKReq = 0x40,
494 FCT_CLASSB = FCT_MORE
498 LWAN_FCtrl_FOptsLen_MAX = 0x0Fu,
502 NWKID_MASK = (int)0xFE000000,
509 MCMD_LinkCheckReq = 0x02,
510 MCMD_LinkADRAns = 0x03,
511 MCMD_DutyCycleAns = 0x04,
512 MCMD_RXParamSetupAns = 0x05,
513 MCMD_DevStatusAns = 0x06,
514 MCMD_NewChannelAns = 0x07,
515 MCMD_RXTimingSetupAns = 0x08,
516 MCMD_TxParamSetupAns = 0x09,
517 MCMD_DlChannelAns = 0x0A,
518 MCMD_DeviceTimeReq = 0x0D,
521 MCMD_PingSlotInfoReq = 0x10,
522 MCMD_PingSlotChannelAns = 0x11,
523 MCMD_BeaconInfoReq = 0x12,
524 MCMD_BeaconFreqAns = 0x13,
530 MCMD_LinkCheckAns = 0x02,
531 MCMD_LinkADRReq = 0x03,
532 MCMD_DutyCycleReq = 0x04,
533 MCMD_RXParamSetupReq = 0x05,
534 MCMD_DevStatusReq = 0x06,
535 MCMD_NewChannelReq = 0x07,
536 MCMD_RXTimingSetupReq = 0x08,
537 MCMD_TxParamSetupReq = 0x09,
538 MCMD_DlChannelReq = 0x0A,
539 MCMD_DeviceTimeAns = 0x0D,
542 MCMD_PingSlotInfoAns = 0x10,
543 MCMD_PingSlotChannelReq = 0x11,
544 MCMD_BeaconTimingAns = 0x12,
545 MCMD_BeaconFreqReq = 0x13,
549 MCMD_BeaconTimingAns_TUNIT = 30
552 MCMD_LinkADRAns_RFU = 0xF8,
553 MCMD_LinkADRAns_PowerACK = 0x04,
554 MCMD_LinkADRAns_DataRateACK = 0x02,
555 MCMD_LinkADRAns_ChannelACK = 0x01,
558 MCMD_RXParamSetupAns_RFU = 0xF8,
559 MCMD_RXParamSetupAns_RX1DrOffsetAck = 0x04,
560 MCMD_RXParamSetupAns_RX2DataRateACK = 0x02,
561 MCMD_RXParamSetupAns_ChannelACK = 0x01,
564 MCMD_NewChannelAns_RFU = 0xFC,
565 MCMD_NewChannelAns_DataRateACK = 0x02,
566 MCMD_NewChannelAns_ChannelACK = 0x01,
569 MCMD_RXTimingSetupReq_RFU = 0xF0,
570 MCMD_RXTimingSetupReq_Delay = 0x0F,
573 MCMD_DlChannelAns_RFU = 0xFC,
574 MCMD_DlChannelAns_FreqACK = 0x02,
575 MCMD_DlChannelAns_ChannelACK = 0x01,
578 MCMD_PingSlotFreqAns_RFU = 0xFC,
579 MCMD_PingSlotFreqAns_DataRateACK = 0x02,
580 MCMD_PingSlotFreqAns_ChannelACK = 0x01,
584 MCMD_DEVS_EXT_POWER = 0x00,
585 MCMD_DEVS_BATT_MIN = 0x01,
586 MCMD_DEVS_BATT_MAX = 0xFE,
587 MCMD_DEVS_BATT_NOINFO = 0xFF,
592 MCMD_LinkADRReq_Redundancy_RFU = 0x80,
593 MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK= 0x70,
594 MCMD_LinkADRReq_Redundancy_NbTrans_MASK = 0x0F,
596 MCMD_LinkADRReq_ChMaskCntl_EULIKE_DIRECT = 0x00,
597 MCMD_LinkADRReq_ChMaskCntl_EULIKE_ALL_ON = 0x60,
599 MCMD_LinkADRReq_ChMaskCntl_USLIKE_500K = 0x40,
600 MCMD_LinkADRReq_ChMaskCntl_USLIKE_SPECIAL = 0x50,
601 MCMD_LinkADRReq_ChMaskCntl_USLIKE_BANK = 0x50,
602 MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON = 0x60,
603 MCMD_LinkADRReq_ChMaskCntl_USLIKE_125OFF = 0x70,
605 MCMD_LinkADRReq_ChMaskCntl_CN470_ALL_ON = 0x60,
610 MCMD_LinkADRReq_DR_MASK = 0xF0,
611 MCMD_LinkADRReq_POW_MASK = 0x0F,
612 MCMD_LinkADRReq_DR_SHIFT = 4,
613 MCMD_LinkADRReq_POW_SHIFT = 0,
618 MCMD_TxParam_RxDWELL_SHIFT = 5,
619 MCMD_TxParam_RxDWELL_MASK = 1 << MCMD_TxParam_RxDWELL_SHIFT,
620 MCMD_TxParam_TxDWELL_SHIFT = 4,
621 MCMD_TxParam_TxDWELL_MASK = 1 << MCMD_TxParam_TxDWELL_SHIFT,
622 MCMD_TxParam_MaxEIRP_SHIFT = 0,
623 MCMD_TxParam_MaxEIRP_MASK = 0xF << MCMD_TxParam_MaxEIRP_SHIFT,
627typedef u4_t devaddr_t;
630enum { RSSI_OFF=64, SNR_SCALEUP=4 };
632static inline sf_t getSf (rps_t params) {
return (sf_t)(params & 0x7); }
633static inline rps_t setSf (rps_t params, sf_t sf) {
return (rps_t)((params & ~0x7) | sf); }
634static inline bw_t getBw (rps_t params) {
return (bw_t)((params >> 3) & 0x3); }
635static inline rps_t setBw (rps_t params, bw_t cr) {
return (rps_t)((params & ~0x18) | (cr<<3)); }
636static inline cr_t getCr (rps_t params) {
return (cr_t)((params >> 5) & 0x3); }
637static inline rps_t setCr (rps_t params, cr_t cr) {
return (rps_t)((params & ~0x60) | (cr<<5)); }
638static inline int getNocrc(rps_t params) {
return ((params >> 7) & 0x1); }
639static inline rps_t setNocrc(rps_t params,
int nocrc) {
return (rps_t)((params & ~0x80) | (nocrc<<7)); }
640static inline int getIh (rps_t params) {
return ((params >> 8) & 0xFF); }
641static inline rps_t setIh (rps_t params,
int ih) {
return (rps_t)((params & ~0xFF00) | (ih<<8)); }
642static inline rps_t makeRps (sf_t sf, bw_t bw, cr_t cr,
int ih,
int nocrc) {
643 return sf | (bw<<3) | (cr<<5) | (nocrc?(1<<7):0) | ((ih&0xFF)<<8);
645#define MAKERPS(sf,bw,cr,ih,nocrc) ((rps_t)((sf) | ((bw)<<3) | ((cr)<<5) | ((nocrc)?(1<<7):0) | ((ih&0xFF)<<8)))
647static inline int sameSfBw(rps_t r1, rps_t r2) {
return ((r1^r2)&0x1F) == 0; }
648static inline int isFasterDR (dr_t dr1, dr_t dr2) {
return dr1 > dr2; }
649static inline int isSlowerDR (dr_t dr1, dr_t dr2) {
return dr1 < dr2; }
657ostime_t calcAirTime (rps_t rps, u1_t plen);
659int getSensitivity (rps_t rps);