diff --git a/src/include/targets.h b/src/include/targets.h index a10f49b17f..3ff5d7ad2e 100644 --- a/src/include/targets.h +++ b/src/include/targets.h @@ -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 @@ -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 diff --git a/src/lib/FHSS/FHSS.cpp b/src/lib/FHSS/FHSS.cpp index 279e54620b..74507d6b87 100644 --- a/src/lib/FHSS/FHSS.cpp +++ b/src/lib/FHSS/FHSS.cpp @@ -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) @@ -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]; @@ -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", diff --git a/src/lib/FHSS/FHSS.h b/src/lib/FHSS/FHSS.h index 5541b62b3b..cd5476c199 100644 --- a/src/lib/FHSS/FHSS.h +++ b/src/lib/FHSS/FHSS.h @@ -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 @@ -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; @@ -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 @@ -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 @@ -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 { diff --git a/src/python/binary_configurator.py b/src/python/binary_configurator.py index 200b52b0dd..40c7e55f7a 100644 --- a/src/python/binary_configurator.py +++ b/src/python/binary_configurator.py @@ -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 @@ -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 = {} diff --git a/src/python/build_flags.py b/src/python/build_flags.py index 00241c835c..ded206a856 100644 --- a/src/python/build_flags.py +++ b/src/python/build_flags.py @@ -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 diff --git a/src/user_defines.txt b/src/user_defines.txt index c74dda4f9e..cbf0705ae2 100644 --- a/src/user_defines.txt +++ b/src/user_defines.txt @@ -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