From ab86d3325e8361154b90aa2a1dde7162205bd6ba Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:13:43 +0300 Subject: [PATCH] subghz: add fsk12k deviation, cardin s449 full support + thanks @zero-mega :)) --- .../cc1101_ext/cc1101_ext_interconnect.c | 4 + .../main/subghz/helpers/subghz_custom_event.h | 1 + .../main/subghz/helpers/subghz_gen_info.c | 10 ++ .../main/subghz/helpers/subghz_txrx.c | 2 + .../resources/subghz/assets/keeloq_mfcodes | 133 +++++++++--------- .../subghz/scenes/subghz_scene_set_type.c | 1 + applications/main/subghz/subghz_cli.c | 2 + .../main/subghz/subghz_last_settings.c | 2 +- .../main/subghz/subghz_last_settings.h | 2 +- .../js_app/modules/js_subghz/js_subghz.c | 2 + .../file_formats/SubGhzFileFormats.md | 1 + lib/subghz/blocks/generic.c | 2 + lib/subghz/devices/cc1101_configs.c | 71 ++++++++++ lib/subghz/devices/cc1101_configs.h | 1 + .../cc1101_int/cc1101_int_interconnect.c | 3 + lib/subghz/devices/preset.h | 1 + lib/subghz/protocols/keeloq.c | 6 +- lib/subghz/subghz_setting.c | 2 + targets/f7/api_symbols.csv | 3 +- 19 files changed, 179 insertions(+), 70 deletions(-) diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c index eef92dbe8..6cf9f90b1 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c @@ -43,6 +43,10 @@ static void subghz_device_cc1101_ext_interconnect_load_preset( subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs); break; + case FuriHalSubGhzPreset2FSKDev12KAsync: + subghz_device_cc1101_ext_load_custom_preset( + subghz_device_cc1101_preset_2fsk_dev12khz_async_regs); + break; case FuriHalSubGhzPreset2FSKDev476Async: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs); diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 41e704ea5..33a70fd57 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -103,6 +103,7 @@ typedef enum { SetTypeJCM_433_92, SetTypeNovoferm_433_92, SetTypeHormannEcoStar_433_92, + SetTypeCardinS449_433FM, SetTypeFAACRCXT_433_92, SetTypeFAACRCXT_868, SetTypeGeniusBravo433, diff --git a/applications/main/subghz/helpers/subghz_gen_info.c b/applications/main/subghz/helpers/subghz_gen_info.c index fe5cd0e8a..5f1021ddd 100644 --- a/applications/main/subghz/helpers/subghz_gen_info.c +++ b/applications/main/subghz/helpers/subghz_gen_info.c @@ -643,6 +643,16 @@ void subghz_scene_set_type_fill_generation_infos(GenInfo* infos_dest, SetType ty .keeloq.cnt = 0x03, .keeloq.manuf = "EcoStar"}; break; + case SetTypeCardinS449_433FM: + gen_info = (GenInfo){ + .type = GenKeeloq, + .mod = "FM12K", + .freq = 433920000, + .keeloq.serial = (key & 0x000FFFFF), + .keeloq.btn = 0x02, + .keeloq.cnt = 0x03, + .keeloq.manuf = "Cardin_S449"}; + break; case SetTypeFAACRCXT_433_92: gen_info = (GenInfo){ .type = GenKeeloq, diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index 8e00bd6af..8abf373f4 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -116,6 +116,8 @@ const char* subghz_txrx_get_preset_name(SubGhzTxRx* instance, const char* preset preset_name = "AM650"; } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev238Async")) { preset_name = "FM238"; + } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev12KAsync")) { + preset_name = "FM12K"; } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev476Async")) { preset_name = "FM476"; } else if(!strcmp(preset, "FuriHalSubGhzPresetCustom")) { diff --git a/applications/main/subghz/resources/subghz/assets/keeloq_mfcodes b/applications/main/subghz/resources/subghz/assets/keeloq_mfcodes index 62135c0b9..b146d0ded 100644 --- a/applications/main/subghz/resources/subghz/assets/keeloq_mfcodes +++ b/applications/main/subghz/resources/subghz/assets/keeloq_mfcodes @@ -1,69 +1,70 @@ Filetype: Flipper SubGhz Keystore File Version: 0 Encryption: 1 -IV: 46 75 72 72 79 20 52 6F 63 6B 65 74 21 21 21 30 -05176EEFAC177FE261FE3EB5C8E103BE7CF9F2FEB32BDD6BB63D22EE9C17B9D2 -B645E3CAC0D5E26891249D326BCEB09850E4FB8F8E86A466E97E83437A9E0041 -AA4255FFA1ADE8FB840F80A93F8F1A2D1E39051131D24DE7258D66A8CF2066CF -13ACA390FD5254B024084D5D1F41B8DDF5304FF00C3C85A9C26CD13A7A268654 -4CFBF498D5E2C85496985E83D91B0F4229A925E16A90C6712750032C3699EE0AA5D04123E579B6121573FC61766E89AD -93DADC2AE4235470E171E0E85D24D04A84C37187284C38D1CBB48666FDA8CD6C -DB13D8CCC0CB07685F29F33AE07DA2FD14C2AE4F4D001DB88465D5CFE8CFDAA9 -E51CD1B5074B63D26E274218A0AB3B2E435454EE094DCA5679F35477658A72F9 -10AFD5FD9C296E67EDD9504A60BA9EF84556F40213DEC4DE44F99B088BCC6A57 -EF7AA55F6A473DE093D648240D5FCEB05F8B3295DC37B3E83239A4AF320CD688 -A22892E71B9D0D7FAF92B27C724E76C4A6824DBE5F083F1006D11E42D153C4AC98D0A11C6A8D62F5921A24ECC7437485 -7A25416E390D81DA68A59C3BA30D4B7FC8269B5E0DAF77CA3A857B6F478A050585918485AEE72D375F02D177CB296E31 -94004BA0BB1E47965E60025949EF4CC2738C463F57C97FD2A89C76CCCDEA5397 -111CB1C19863A0165521D974F838CE718DA07948A8D9A8A7490E75032A62ECA2 -17B6E27C69FA002F6CF23D719DFE595140BEFA5083D12E774CF89E2CED53D68D -73311E0FF8ABB3E9461AD14A4F52791647A50E2102D3B74188A73C35BC14EB55 -54E15840A6A6DCA85275E38E4218EE2B539E9E468E24C49428DA363C955C5FC81ACEE79EEB941B83EE4147A0817043BD -7D0FBB417B99B3C6AB18C7B2DC82582D2DCD1E10515028874E73254188F7FEE9 -3F6E89BBCC133B85945234A8201539ECD8796909CC81FE67673F8DE1ECA63045 -39554C0DC1C3694FAAFF65537FF710D9593B7B461E011FC39D014F253F0432533A40276D8259AFD8C957A378237D574F -E60F6CD7063B85F0F20ACB7E7A42B03DE4A9F6CCA54CB7F036AFA23A27D3E9E006BD523E5356260AA78206D9276E6E57 -9EB252EDA9352B966EC4F053D5B013772361D2AD4B217EF33F46A5CEC97A00F3 -AA6773E79BC6D76314BB523FDF203358E01ECB2BBCF3B5DD1EBD043663C74B05 -29B29A50F3F27F4D8C7B0FADA98CC004A7871078DAD1CBAC4846862C3DF82E02 -6E3A479D4334FF05606899B0383116125056A316621B279F904A02B842918C59 -3991732015F4A213E9912E34AC92515D88010C07DA0B118AD6F64A05DC38D2C5 -550B1866F7493C75812DF85DDADC38AF21D9B58189E4EE99A021328523881A9D -77960CA031D28362586100F17DF94FF4E7D6EFAFAF23952887F9DF0507825A99 -01E6FC89E97B7729BF4D1ED8041F69005181BF3639F939C5833B009E96B9F2F7 -D1CC7C536706ECFC5826C8933135D2B110996F1CB13388A702B8453DA40E40AD -B64D2F1E1A80E6DAB92283A512B40DB7FFC519F394AA94CC86C8532F69949723 -6399409A0AC0298DEDA76037C83042FC0870132CFF7F82E54AD0966BE16AC882 -D310536FA78F95BB0B408676990AA937117717BADE9D3B975C0ECE10FB586A1B -A8149C0581DCC291D037E96EF321DB6214BD7CB25F1696226A9FE750AA23B334 -BA3BEBD564D8F571202CD6FE89BC33F89C8E01C03AE0814F2BEF37C33CE874B4 -88CD81AC7605A7F6EFF85FD62C65E0C9945335CFC085B92B27B69648C6E5BF6B -8057C7CB5071DFFFAE4804FD9EC1EC1D3F54D06514906A34B17F6B6CB45A9D473992DF6BC8A9F9E146E39D6163209CC6 -9ABC8814C8FD1AB254374150177616F5C7B43049473C84329BEC855578B96002 -8BCA39A498B00245C71D94E3160CEE8ACA5BEB18AE0AD64A385AFCC018E99744 -5AD75C51CA5AE5FA9BBC6A41576C745F265CC28FC4DA2AD230B6692CF151FD61 -E86092E04CD72D874A92DE838035E811E75E411049C0A7BD0FE2AA9C802BE5AB -CE70ADB22E85747FDC064F0B5974385CD57D41D376CE1C7490C1BEC8A3FC5A7A -8F096E0A11682DB315825213D3DB5D725555C1CDF444169EB919E47E0F0FA6F7 -AD9C9A694D807BA77E5A54B248A88B55000757203D931506255BF8F4215C00D3 -F0E804B6C6B6E91916CB73EB44FB2D1992400BC90ED8B22DF5D038317588341207D74E08C00E529DF2CF2A64F2C7C0FF -72212FCEED35E9C3A176B67DCDB84B284F4DFDCD0ECE8D3F6089C58C2B8A616C -000F9F746BFB47FC10B23E3F08C2A84BCB3870D0C5AE974472849699884BC929 -7B8F9AB04E5F86D6DDCF6164A25EA927788A03F57977FC5C55E1D565279B09C4 -0E9CDCD07D1D4F1429E59F81B524960A75F19A464798C7E822E52728AC83784A -F2DE2B108A1476BB6F85DD3CCB0F0527627B45179092BA7A56D5971490E3875C -7F307358D988FEA12648739F58DD249EBDF0B1C44B73BA547C50EB576C071DAE -2DFBA988592CEF3B62A76183DBA727E734359B89F53AFF3160441EF8709FC633 -57F7DC38DDC87C19CE956BC44C638DEF34D814A7BAB0AC8AD61855143FD984FD -A8AADB687251FA6AC2BBC8EF1E3FA621893293DFBD8C1D07971BF82F22A00DC3 -65AEA1EE34E316C769E551AC2309D07FC2ED92EA044674E3A99CD7B543C730EB -968ECC790E5590E7EB22AFD3546C28F4EB87EA4CEE35F72DDFE7153F74611EAA -0F937930D4E1BDF0B729277CF94A47064BCB959938C70CDB3AC3C65DA68DA1FB -A8AB66375D59E112104CD81B819D618BE43D6A6F159BAD35583653EF3547D25D -A81D5DE2102F05D50750DC37C26E9C9502FA89EF98A2EB1EA546EE48C628E9C4 -EAFDE0A8936AF8EF718027937BC17CEF691E570996B403CF4762240D267EB305 -C48686348F0A94B07BC60AB825C1A0791C20DBBDD7DAE0ED47E8A7FBD9334EACF8E33DCEC36963E87929260DF769520B -493D53BD7BB2B3E081AE793A3BADB3AB0F33C95B83677715D6DE2922F2BEC892 -63FFD3D8CAB980E45D49253A69C99A6813CBE6013992EFBC862173BAD0E26373 -2EF88F43C5A76EC87E02B780585B10957F4EA386F96710FAB98BC2C1E214DBFA -A021CFA0E72AADFD75BC67FBE9345082B0A8B31782E933E81196F84B1797D83E8B2F81E1CF5C3F026D11B9DFC95222E2 +IV: 41 20 46 75 72 72 79 20 48 41 4C 21 4F 77 4F 21 +2CAD19E0C7E482D138AD8EC452C5D9175534F5FD5B8DAB0FF2082A75A9410C60 +87341133DBC22CC39E1952466C1FA6F7DA4215FB3B9D6975CDA16CD0211AEC7E +8D60AA06878EA9EE24D3F2CDC0166373E3CD131CAD016976758B4F5F0DCC4A36 +E455A4EF9016D5682815F4714A678833CD09D6CED6D9D3D796CC700B0FFB79CC +FD5A46DF885486EE89F867BF629B63940AE8A1D0695BE93FCE4385AF523F8809145A3381F2F3F578A38FD40B2546A423 +84F8D5D63DC863490A0B36BC6102FFAA4D0852DE5E92B567B39F0C6F90454029 +8D1A3A7BE24A6F96B3401944435FF5441628B3E60C1CA29F54650BF5912C7E00 +4F2A1A51AC845F91CC8F0AC693CC8D95C4FCF2524317F2576BF1B426332257F2 +6482B6BC4C59F14FC414C4A1E8DEE687E3263FC575646287CF07CE21D5356CB9 +B98C8FE2030F448F80F075EC844311F503B8B4A1048F3EF761AFC695BED8767D +426044078972749851904C762094DC45D8E6DEEEB36232A1489BFBEDC15F6EA0308756673C7494241BCA9BF6216B0C63 +7446FBF891E79C130550E5AEC07BCD6605AB16A16123C7F58B34BA8243567CD29EFBFF44730F36E86A17B97B4CA86BCD +3F76A9C0273C7A344244703F24F625091B1F599A2DDFBD698F33CF7BF7765BD4 +AC491FF039EE8D1548F127AA11863B8CD6B67C37F5DE55D810C04AA1A0207D7D +E14027E544A3B867402F1FD496AD8E173CB6FC55053C3846142882D746C8A3BA +182599DE46C923C4A2A8B1CB07165A8FD5F571BE95A32DA4D517B99378AF618C +5AE341DCF8BFDBA55301555D3300946352CA174F5B0DF6EB239EE997C0E093D1930F6A75996B149199DFFE78B25F5BD5 +A495E957DBE11937C967CEBF99BCFE85CE2E2FFBBD6952352EC7E59FD9ABDC2D +F1F924BD569DD0E6AB7EEC7C880EDE0CE53757A2A183EED3674C10FDE4ADFF17 +B6E32951F4C886371968E5BED5711C05648E87F36FC397E2455B8DD5AFF3865D3BADADF7626D071F792712F6B0FD115B +BC88789A8C037EBCA6F9F6A0FC616D3512474AED1C96270845171CF76F7CDA6D4D2CD42CB8463CE706398B0A9DBEA87A +4A8686B20E1339C81AAE8BBF1C9EABA5BEB61D0A394F314958546FA14A67DEE7 +CA71F413EC992ACFEB03EE1760BE683050FF4D1E1B65ACF9E3A4964F2B3C2B01 +0E05B3BD4854604B6FB82900A13051C0377E85C49A293A39C2A8C75B904D8102 +C9EDE274DD3C5B6DF276565FEE81ED060F0C3BD0CB72EA3E49E9595FAFE77F5C +A33A4B9AD451ACDB5EC4830EFE421AE8929E024108C34343D3D55F098CDE5B0B +9C5C17D4FB32DDD18D88A2B358786E9A941931BE9D645B379412F2E187020C14 +2626DD2FCE983EA3DEAB2FE2A5F378250F1644BE24BDCC2C5FAFDBA68D4F1872 +9F1E27964102BFCEFBF6F5FE7DA8C3B102E97ED0CEE074625175FB02674D5EF2 +7E1745495E213781ABCA814552046470EA41F0EBE8BDD64592DDFA7319AFCD69 +EB6C3B1F4265C71A0DD74847588A89CCF57539CF20711233A221C9BE1F9EB6C9 +4C1A2768E44F9DD2E4AEE9C18DE5449B92CD4DFE5BDA7F65F5A654C86544B2E1 +4F1835CDBDA4128324F4B92E709201502852892699EC0C84B1E4A4B841542C3C +E0EBE4B259B61F05475FFE07EAC8E2A9D013D4471DC7CF3481E1334006F7FB02 +20342B2D84CD3936DEA5058CE07F3F3DB6178C6BF0AC72CF8F807503B3AC8F88 +DC775129215670CD8B81A5335190F6544687D38A70E758348578B0B3A1389300 +208F0D588404D9BDD6E310F16B7460BDB2A8B284CA6E59E24F5FACFD55D48AACC5D86C886A9EF5F06DC2AADE76EFF35F +5CD70EFEAB4B5345531102A0DA1453F857AC93F3456E81C305111626CE084627 +341E61A3AB6BA3F71F5215905149E2D3E84260CC77C068C92D71C6DD9067F633 +0342C01D966663D7542F2D5D7635758EC65CDDE5E7FD5884846D675D06C59363 +2E9F77AD044F9C8C23CA239E71303D6682A2A86C3B4D44831DB4B1BC377043CD +3A11CBA6703808A36911F036E9042198950C2C82269D892F5C87DFD32C101BCA +6E75A69923DFC22957705A624368CFB657B77C11D7F831704BCC76A87377AB26 +21F70436CF950862D306829B542E307EF327F23870D4FBF42869A3BF0891F9DB +4A00DFB119C12D86B953BEC9F41DFB3D4AE3A9BE984CD8C3606CC1ED4B9020ED82922BCED5AE8A2A88DD2995A0D28EFE +12E2B40E49B0FC157203286B39ED852EDC2B444527472A8C07E78A70722DB825 +91A106AF60685D56D19D2E58C9F902F2B3B80A1CFCBC1B84316FBAF69DB47730 +58B5AF1BB0EF318CC3026041A3403B025980FB4DE06C3F2B804800B8578295B7 +FA7C4461C2F0BECADB414694B04E7A89BC99433A635E2905DC3A40A947EC9846 +DF356AFF3212088F223EC32E5FE9D5D73701F25B2075BC50E0F0B45195F28365 +2D099AE3FB0AE7B92976E02E2F01A9D6821D7C15CC04DCA881E05D50BC46EB11 +1FE9F8D29A77CD399B068A8AD890ECB85A957438855F85223B16E3B83A655213 +07DFA64C22CF6DB1E36D16F763BDD822AF3991BDE07C30B4F4084BD13CDEF012 +3BA563F522243D807151BC2EF1B524C174058888D9DE852AA0E9C15F1EA22950 +475979BC2EA05EE2443F65F2372E36D780A34EC8AC1D70BB2480FF519C6C84C1 +7275E88766DCA0EB3725641E950EEC094129361D280AE963D89A9B5403136B06 +65202C209229A36A2B80ED69DEEA285A7273BAA007365AC2E7F438C7AE428BBA +C83ABA33828918FB80D92D8217BB8AE6B5AA4017D0CD7F37C39925F7F96B9BD2 +AAEF1B708581570F87D1FB016FE23FF2804CB6942E576C40165D9F81A4E7AB04 +F7434FBA076E677D71A584341A77D54BFEF4DEBDCADA67D23DB50AA5902DA4EE +5480CB40AB7CA50ABA5EED094281282D5302C38E5EF0B8AF7AE51B5C702574F2 +1C90B716E8AF97DEADB0199C4BBDE7E3669FB4D6794A27F716D523DDFC74905ECEB64509C073405B38A271B7FBFEA3DD +36036999661471644E50D56532DA3D82F2713035BDBDA399E6B121B15E2FDCD5 +DCD61BB556CD42849B99C7A1916005305E57723555CD24F6F1D67D30224A275F +4E3662D52FB2396DCC0D76E7ECFFECF5E581492FA520D8427F772C61435FF925 +7F33462CB81E81DDF8284A6EA121401EEA6301277ABDF2D5C39EDB818AE973F0D51527BA6146C3178624F61E38F220D2 diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index 8ca5b95ab..731da6f3f 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -50,6 +50,7 @@ static const char* submenu_names[SetTypeMAX] = { [SetTypeJCM_433_92] = "KL: JCM Tech 433MHz", [SetTypeNovoferm_433_92] = "KL: Novoferm 433MHz", [SetTypeHormannEcoStar_433_92] = "KL: Hor. EcoStar 433MHz", + [SetTypeCardinS449_433FM] = "KL: Cardin S449 433MHz", [SetTypeFAACRCXT_433_92] = "KL: FAAC RC,XT 433MHz", [SetTypeFAACRCXT_868] = "KL: FAAC RC,XT 868MHz", [SetTypeGeniusBravo433] = "KL: Genius Bravo 433MHz", diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index 88b5f7f0d..2c6c6b908 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -574,6 +574,8 @@ static FuriHalSubGhzPreset subghz_cli_get_preset_name(const char* preset_name) { preset = FuriHalSubGhzPresetOok650Async; } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev238Async")) { preset = FuriHalSubGhzPreset2FSKDev238Async; + } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev12KAsync")) { + preset = FuriHalSubGhzPreset2FSKDev12KAsync; } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev476Async")) { preset = FuriHalSubGhzPreset2FSKDev476Async; } else if(!strcmp(preset_name, "FuriHalSubGhzPresetCustom")) { diff --git a/applications/main/subghz/subghz_last_settings.c b/applications/main/subghz/subghz_last_settings.c index 6ffdc858e..0a4783a23 100644 --- a/applications/main/subghz/subghz_last_settings.c +++ b/applications/main/subghz/subghz_last_settings.c @@ -149,7 +149,7 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count instance->frequency = SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY; } - if(instance->preset_index > 3) { + if(instance->preset_index > 4) { instance->preset_index = SUBGHZ_LAST_SETTING_DEFAULT_PRESET; } } diff --git a/applications/main/subghz/subghz_last_settings.h b/applications/main/subghz/subghz_last_settings.h index c0559e4ec..78de5e51c 100644 --- a/applications/main/subghz/subghz_last_settings.h +++ b/applications/main/subghz/subghz_last_settings.h @@ -8,7 +8,7 @@ #define SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_TRIGGER (-93.0f) // 1 = "AM650" -// "AM270", "AM650", "FM238", "FM476", +// "AM270", "AM650", "FM238", "FM12K", "FM476", #define SUBGHZ_LAST_SETTING_DEFAULT_PRESET 1 #define SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY 433920000 #define SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_FEEDBACK_LEVEL 2 diff --git a/applications/system/js_app/modules/js_subghz/js_subghz.c b/applications/system/js_app/modules/js_subghz/js_subghz.c index f7065d38c..ae3e1f60d 100644 --- a/applications/system/js_app/modules/js_subghz/js_subghz.c +++ b/applications/system/js_app/modules/js_subghz/js_subghz.c @@ -30,6 +30,8 @@ static FuriHalSubGhzPreset js_subghz_get_preset_name(const char* preset_name) { preset = FuriHalSubGhzPresetOok650Async; } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev238Async")) { preset = FuriHalSubGhzPreset2FSKDev238Async; + } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev12KAsync")) { + preset = FuriHalSubGhzPreset2FSKDev12KAsync; } else if(!strcmp(preset_name, "FuriHalSubGhzPreset2FSKDev476Async")) { preset = FuriHalSubGhzPreset2FSKDev476Async; } else if(!strcmp(preset_name, "FuriHalSubGhzPresetCustom")) { diff --git a/documentation/file_formats/SubGhzFileFormats.md b/documentation/file_formats/SubGhzFileFormats.md index 80047faf7..1ff1f830d 100644 --- a/documentation/file_formats/SubGhzFileFormats.md +++ b/documentation/file_formats/SubGhzFileFormats.md @@ -39,6 +39,7 @@ Built-in presets: - `FuriHalSubGhzPresetOok270Async` — On/Off Keying, 270kHz bandwidth, async(IO throw GP0) - `FuriHalSubGhzPresetOok650Async` — On/Off Keying, 650kHz bandwidth, async(IO throw GP0) - `FuriHalSubGhzPreset2FSKDev238Async` — 2 Frequency Shift Keying, deviation 2kHz, 270kHz bandwidth, async(IO throw GP0) +- `FuriHalSubGhzPreset2FSKDev12KAsync` — 2 Frequency Shift Keying, deviation 12kHz, 270kHz bandwidth, async(IO throw GP0) - `FuriHalSubGhzPreset2FSKDev476Async` — 2 Frequency Shift Keying, deviation 47kHz, 270kHz bandwidth, async(IO throw GP0) ### Transceiver Configuration Data {#transceiver-configuration-data} diff --git a/lib/subghz/blocks/generic.c b/lib/subghz/blocks/generic.c index b659e7947..57fbb580f 100644 --- a/lib/subghz/blocks/generic.c +++ b/lib/subghz/blocks/generic.c @@ -12,6 +12,8 @@ void subghz_block_generic_get_preset_name(const char* preset_name, FuriString* p preset_name_temp = "FuriHalSubGhzPresetOok650Async"; } else if(!strcmp(preset_name, "FM238")) { preset_name_temp = "FuriHalSubGhzPreset2FSKDev238Async"; + } else if(!strcmp(preset_name, "FM12K")) { + preset_name_temp = "FuriHalSubGhzPreset2FSKDev12KAsync"; } else if(!strcmp(preset_name, "FM476")) { preset_name_temp = "FuriHalSubGhzPreset2FSKDev476Async"; } else { diff --git a/lib/subghz/devices/cc1101_configs.c b/lib/subghz/devices/cc1101_configs.c index a75842589..971c3cb28 100644 --- a/lib/subghz/devices/cc1101_configs.c +++ b/lib/subghz/devices/cc1101_configs.c @@ -220,6 +220,77 @@ const uint8_t subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs[] = { 0x00, }; +const uint8_t subghz_device_cc1101_preset_2fsk_dev12khz_async_regs[] = { + + /* GPIO GD0 */ + CC1101_IOCFG0, + 0x0D, // GD0 as async serial data output/input + + /* Frequency Synthesizer Control */ + CC1101_FSCTRL1, + 0x06, // IF = (26*10^6) / (2^10) * 0x06 = 152343.75Hz + + /* Packet engine */ + CC1101_PKTCTRL0, + 0x32, // Async, continious, no whitening + CC1101_PKTCTRL1, + 0x04, + + // // Modem Configuration + CC1101_MDMCFG0, + 0x00, + CC1101_MDMCFG1, + 0x02, + CC1101_MDMCFG2, + 0x04, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized) + CC1101_MDMCFG3, + 0x83, // Data rate is 4.79794 kBaud + CC1101_MDMCFG4, + 0x67, //Rx BW filter is 270.833333 kHz + CC1101_DEVIATN, + 0x30, //Deviation ~12 kHz + + /* Main Radio Control State Machine */ + CC1101_MCSM0, + 0x18, // Autocalibrate on idle-to-rx/tx, PO_TIMEOUT is 64 cycles(149-155us) + + /* Frequency Offset Compensation Configuration */ + CC1101_FOCCFG, + 0x16, // no frequency offset compensation, POST_K same as PRE_K, PRE_K is 4K, GATE is off + + /* Automatic Gain Control */ + CC1101_AGCCTRL0, + 0x91, //10 - Medium hysteresis, medium asymmetric dead zone, medium gain ; 01 - 16 samples agc; 00 - Normal AGC, 01 - 8dB boundary + CC1101_AGCCTRL1, + 0x00, // 0; 0 - LNA 2 gain is decreased to minimum before decreasing LNA gain; 00 - Relative carrier sense threshold disabled; 0000 - RSSI to MAIN_TARGET + CC1101_AGCCTRL2, + 0x07, // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAIN_TARGET 42 dB + + /* Wake on radio and timeouts control */ + CC1101_WORCTRL, + 0xFB, // WOR_RES is 2^15 periods (0.91 - 0.94 s) 16.5 - 17.2 hours + + /* Frontend configuration */ + CC1101_FREND0, + 0x10, // Adjusts current TX LO buffer + CC1101_FREND1, + 0x56, + + /* End load reg */ + 0, + 0, + + // 2fsk_async_patable[8] + 0xC0, // 10dBm 0xC0, 7dBm 0xC8, 5dBm 0x84, 0dBm 0x60, -10dBm 0x34, -15dBm 0x1D, -20dBm 0x0E, -30dBm 0x12 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; + const uint8_t subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs[] = { /* GPIO GD0 */ diff --git a/lib/subghz/devices/cc1101_configs.h b/lib/subghz/devices/cc1101_configs.h index 5b96b4a1a..86321edab 100644 --- a/lib/subghz/devices/cc1101_configs.h +++ b/lib/subghz/devices/cc1101_configs.h @@ -8,6 +8,7 @@ extern "C" { extern const uint8_t subghz_device_cc1101_preset_ook_270khz_async_regs[]; extern const uint8_t subghz_device_cc1101_preset_ook_650khz_async_regs[]; extern const uint8_t subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs[]; +extern const uint8_t subghz_device_cc1101_preset_2fsk_dev12khz_async_regs[]; extern const uint8_t subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs[]; extern const uint8_t subghz_device_cc1101_preset_msk_99_97kb_async_regs[]; extern const uint8_t subghz_device_cc1101_preset_gfsk_9_99kb_async_regs[]; diff --git a/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c b/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c index 284c717fd..be33b8778 100644 --- a/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c +++ b/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c @@ -38,6 +38,9 @@ static void subghz_device_cc1101_int_interconnect_load_preset( case FuriHalSubGhzPreset2FSKDev238Async: furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs); break; + case FuriHalSubGhzPreset2FSKDev12KAsync: + furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_2fsk_dev12khz_async_regs); + break; case FuriHalSubGhzPreset2FSKDev476Async: furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs); break; diff --git a/lib/subghz/devices/preset.h b/lib/subghz/devices/preset.h index 8716f2e23..6f67594af 100644 --- a/lib/subghz/devices/preset.h +++ b/lib/subghz/devices/preset.h @@ -6,6 +6,7 @@ typedef enum { FuriHalSubGhzPresetOok270Async, /**< OOK, bandwidth 270kHz, asynchronous */ FuriHalSubGhzPresetOok650Async, /**< OOK, bandwidth 650kHz, asynchronous */ FuriHalSubGhzPreset2FSKDev238Async, /**< FM, deviation 2.380371 kHz, asynchronous */ + FuriHalSubGhzPreset2FSKDev12KAsync, /**< FM, deviation ~12 kHz, asynchronous */ FuriHalSubGhzPreset2FSKDev476Async, /**< FM, deviation 47.60742 kHz, asynchronous */ FuriHalSubGhzPresetMSK99_97KbAsync, /**< MSK, deviation 47.60742 kHz, 99.97Kb/s, asynchronous */ FuriHalSubGhzPresetGFSK9_99KbAsync, /**< GFSK, deviation 19.042969 kHz, 9.996Kb/s, asynchronous */ diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 70de346ad..6d40a11ea 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -299,11 +299,13 @@ static bool subghz_protocol_keeloq_gen_data( (strcmp(instance->manufacture_name, "Rosh") == 0) || (strcmp(instance->manufacture_name, "Rossi") == 0) || (strcmp(instance->manufacture_name, "Pecinin") == 0) || - (strcmp(instance->manufacture_name, "Steelmate") == 0)) { + (strcmp(instance->manufacture_name, "Steelmate") == 0) || + (strcmp(instance->manufacture_name, "Cardin_S449") == 0)) { // DTM Neo, Came_Space uses 12bit serial -> simple learning // FAAC_RC,XT , Mutanco_Mutancode, Genius_Bravo, GSN 12bit serial -> normal learning // Rosh, Rossi, Pecinin -> 12bit serial - simple learning // Steelmate -> 12bit serial - normal learning + // Cardin_S449 -> 12bit serial - normal learning decrypt = btn << 28 | (instance->generic.serial & 0xFFF) << 16 | instance->generic.cnt; } else if( @@ -511,6 +513,8 @@ static bool klq_last_custom_btn = 0x6; } else if((strcmp(instance->manufacture_name, "AN-Motors") == 0)) { klq_last_custom_btn = 0xC; + } else if((strcmp(instance->manufacture_name, "Cardin_S449") == 0)) { + klq_last_custom_btn = 0xD; } btn = subghz_protocol_keeloq_get_btn_code(klq_last_custom_btn); diff --git a/lib/subghz/subghz_setting.c b/lib/subghz/subghz_setting.c index fcb426c8c..037bd6df8 100644 --- a/lib/subghz/subghz_setting.c +++ b/lib/subghz/subghz_setting.c @@ -201,6 +201,8 @@ static void subghz_setting_load_default_region( instance, "FM238", subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs); subghz_setting_load_default_preset( instance, "FM476", subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs); + subghz_setting_load_default_preset( + instance, "FM12K", subghz_device_cc1101_preset_2fsk_dev12khz_async_regs); } // Region check removed diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 1213d09e7..74c45e91a 100755 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,87.1,, +Version,+,87.2,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -4274,6 +4274,7 @@ Variable,+,sequence_solid_yellow,const NotificationSequence, Variable,+,sequence_success,const NotificationSequence, Variable,+,simple_array_config_uint8_t,const SimpleArrayConfig, Variable,-,subghz_device_cc1101_int,const SubGhzDevice, +Variable,+,subghz_device_cc1101_preset_2fsk_dev12khz_async_regs,const uint8_t[], Variable,+,subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs,const uint8_t[], Variable,+,subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs,const uint8_t[], Variable,+,subghz_device_cc1101_preset_gfsk_9_99kb_async_regs,const uint8_t[],