Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/include/targets.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ extern bool pwmSerialDefined;
#undef Regulatory_Domain_EU_868
#undef Regulatory_Domain_IN_866
#undef Regulatory_Domain_FCC_915
#undef Regulatory_Domain_ISM_BR_915
#undef Regulatory_Domain_AU_433
#undef Regulatory_Domain_EU_433
#undef Regulatory_Domain_US_433
Expand All @@ -62,6 +63,7 @@ extern bool pwmSerialDefined;
defined(Regulatory_Domain_EU_868) || defined(Regulatory_Domain_IN_866) || \
defined(Regulatory_Domain_AU_433) || defined(Regulatory_Domain_EU_433) || \
defined(Regulatory_Domain_US_433) || defined(Regulatory_Domain_US_433_WIDE) || \
defined(Regulatory_Domain_ISM_BR_915) || \
defined(UNIT_TEST))
#error "Regulatory_Domain is not defined for 900MHz device. Check user_defines.txt!"
#endif
Expand Down
26 changes: 25 additions & 1 deletion src/lib/FHSS/FHSS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const fhss_config_t domains[] = {
{"EU433", FREQ_HZ_TO_REG_VAL(433100000), FREQ_HZ_TO_REG_VAL(434450000), 3, 434000000},
{"US433", FREQ_HZ_TO_REG_VAL(433250000), FREQ_HZ_TO_REG_VAL(438000000), 8, 434000000},
{"US433W", FREQ_HZ_TO_REG_VAL(423500000), FREQ_HZ_TO_REG_VAL(438000000), 20, 434000000},
{"BR915", FREQ_HZ_TO_REG_VAL(902300000), FREQ_HZ_TO_REG_VAL(926900000), 40, 917300000},
};

#if defined(RADIO_LR1121)
Expand Down Expand Up @@ -51,6 +52,21 @@ const fhss_config_t domains[] = {
// Our table of FHSS frequencies. Define a regulatory domain to select the correct set for your location and radio
const fhss_config_t *FHSSconfig;
const fhss_config_t *FHSSconfigDualBand;
bool FHSSuseFreqTableBR915 = false;

const uint32_t FHSSfreqsISM_BR_915[] = {
FREQ_HZ_TO_REG_VAL(902300000), FREQ_HZ_TO_REG_VAL(902800000), FREQ_HZ_TO_REG_VAL(903300000), FREQ_HZ_TO_REG_VAL(903800000),
FREQ_HZ_TO_REG_VAL(904300000), FREQ_HZ_TO_REG_VAL(904800000), FREQ_HZ_TO_REG_VAL(905300000), FREQ_HZ_TO_REG_VAL(905800000),
FREQ_HZ_TO_REG_VAL(906300000), FREQ_HZ_TO_REG_VAL(906800000),
FREQ_HZ_TO_REG_VAL(915300000), FREQ_HZ_TO_REG_VAL(915700000), FREQ_HZ_TO_REG_VAL(916100000), FREQ_HZ_TO_REG_VAL(916500000),
FREQ_HZ_TO_REG_VAL(916900000), FREQ_HZ_TO_REG_VAL(917300000), FREQ_HZ_TO_REG_VAL(917700000), FREQ_HZ_TO_REG_VAL(918100000),
FREQ_HZ_TO_REG_VAL(918500000), FREQ_HZ_TO_REG_VAL(918900000), FREQ_HZ_TO_REG_VAL(919300000), FREQ_HZ_TO_REG_VAL(919700000),
FREQ_HZ_TO_REG_VAL(920100000), FREQ_HZ_TO_REG_VAL(920500000), FREQ_HZ_TO_REG_VAL(920900000), FREQ_HZ_TO_REG_VAL(921300000),
FREQ_HZ_TO_REG_VAL(921700000), FREQ_HZ_TO_REG_VAL(922100000), FREQ_HZ_TO_REG_VAL(922500000), FREQ_HZ_TO_REG_VAL(922900000),
FREQ_HZ_TO_REG_VAL(923300000), FREQ_HZ_TO_REG_VAL(923700000), FREQ_HZ_TO_REG_VAL(924100000), FREQ_HZ_TO_REG_VAL(924500000),
FREQ_HZ_TO_REG_VAL(924900000), FREQ_HZ_TO_REG_VAL(925300000), FREQ_HZ_TO_REG_VAL(925700000), FREQ_HZ_TO_REG_VAL(926100000),
FREQ_HZ_TO_REG_VAL(926500000), FREQ_HZ_TO_REG_VAL(926900000),
};

// Actual sequence of hops as indexes into the frequency list
uint8_t FHSSsequence[FHSS_SEQUENCE_LEN];
Expand Down Expand Up @@ -81,8 +97,16 @@ uint16_t secondaryBandCount;
void FHSSrandomiseFHSSsequence(const uint32_t seed)
{
FHSSconfig = &domains[firmwareOptions.domain];
FHSSuseFreqTableBR915 = (firmwareOptions.domain == DOMAIN_ISM_BR_915);
sync_channel = FHSSconfig->freq_count / 2;
freq_spread = (FHSSconfig->freq_stop - FHSSconfig->freq_start) * FREQ_SPREAD_SCALE / (FHSSconfig->freq_count - 1);
if (FHSSuseFreqTableBR915)
{
freq_spread = 0;
}
else
{
freq_spread = (FHSSconfig->freq_stop - FHSSconfig->freq_start) * FREQ_SPREAD_SCALE / (FHSSconfig->freq_count - 1);
}
primaryBandCount = (FHSS_SEQUENCE_LEN / FHSSconfig->freq_count) * FHSSconfig->freq_count;

DBGLN("Primary Domain %s, %u channels, sync=%u",
Expand Down
34 changes: 33 additions & 1 deletion src/lib/FHSS/FHSS.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ typedef struct {
uint32_t freq_center;
} fhss_config_t;

enum fhss_domain_index_t : uint8_t {
DOMAIN_AU_915 = 0,
DOMAIN_FCC_915,
DOMAIN_EU_868,
DOMAIN_IN_866,
DOMAIN_AU_433,
DOMAIN_EU_433,
DOMAIN_US_433,
DOMAIN_US_433_WIDE,
DOMAIN_ISM_BR_915,
};

extern const uint32_t FHSSfreqsISM_BR_915[];

extern volatile uint8_t FHSSptr;
extern int32_t FreqCorrection; // Only used for the SX1276
extern int32_t FreqCorrection_2; // Only used for the SX1276
Expand All @@ -40,6 +54,7 @@ extern uint32_t freq_spread;
extern uint8_t FHSSsequence[];
extern uint_fast8_t sync_channel;
extern const fhss_config_t *FHSSconfig;
extern bool FHSSuseFreqTableBR915;

// DualBand Variables
extern bool FHSSusePrimaryFreqBand;
Expand Down Expand Up @@ -107,6 +122,11 @@ static inline uint32_t FHSSgetInitialFreq()
{
if (FHSSusePrimaryFreqBand)
{
if (FHSSuseFreqTableBR915)
{
return FHSSfreqsISM_BR_915[sync_channel] - FreqCorrection;
}

return FHSSconfig->freq_start + (sync_channel * freq_spread / FREQ_SPREAD_SCALE) - FreqCorrection;
}
else
Expand Down Expand Up @@ -147,6 +167,11 @@ static inline uint32_t FHSSgetNextFreq()

if (FHSSusePrimaryFreqBand)
{
if (FHSSuseFreqTableBR915)
{
return FHSSfreqsISM_BR_915[FHSSsequence[FHSSptr]] - FreqCorrection;
}

return FHSSconfig->freq_start + (freq_spread * FHSSsequence[FHSSptr] / FREQ_SPREAD_SCALE) - FreqCorrection;
}
else
Expand Down Expand Up @@ -176,7 +201,14 @@ static inline uint32_t FHSSGeminiFreq(uint8_t FHSSsequenceIdx)

if (FHSSusePrimaryFreqBand)
{
freq = FHSSconfig->freq_start + (freq_spread * offSetIdx / FREQ_SPREAD_SCALE) - FreqCorrection_2;
if (FHSSuseFreqTableBR915)
{
freq = FHSSfreqsISM_BR_915[offSetIdx] - FreqCorrection_2;
}
else
{
freq = FHSSconfig->freq_start + (freq_spread * offSetIdx / FREQ_SPREAD_SCALE) - FreqCorrection_2;
}
}
else
{
Expand Down
3 changes: 3 additions & 0 deletions src/python/binary_configurator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class RegulatoryDomain(Enum):
eu_868 = 'eu_868'
au_915 = 'au_915'
fcc_915 = 'fcc_915'
ism_br_915 = 'ism_br_915'

def __str__(self):
return self.value
Expand Down Expand Up @@ -66,6 +67,8 @@ def domain_number(domain):
return 6
elif domain == RegulatoryDomain.us_433_wide:
return 7
elif domain == RegulatoryDomain.ism_br_915:
return 8

def patch_unified(args, options):
json_flags = {}
Expand Down
2 changes: 2 additions & 0 deletions src/python/build_flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ def cleanDefaultProductForTarget(target_name: str) -> None:
json_flags['domain'] = 6
if fnmatch.filter(build_flags, '*-DRegulatory_Domain_US_433_WIDE'):
json_flags['domain'] = 7
if fnmatch.filter(build_flags, '*-DRegulatory_Domain_ISM_BR_915'):
json_flags['domain'] = 8
else:
json_flags['domain'] = 0

Expand Down
1 change: 1 addition & 0 deletions src/user_defines.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#-DRegulatory_Domain_US_433
#-DRegulatory_Domain_US_433_WIDE
#-DRegulatory_Domain_FCC_915
#-DRegulatory_Domain_ISM_BR_915
#-DRegulatory_Domain_ISM_2400
#-DRegulatory_Domain_EU_CE_2400

Expand Down