mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
Merge branch 'DarkFlippers:dev' into dev
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
## Main changes
|
## Main changes
|
||||||
- Current API: 87.4
|
- Current API: 87.4
|
||||||
* SubGHz: **Cardin S449 protocol full support** (64bit keeloq) (with Add manually, and all button codes) (**use FSK12K modulation to read the remote**) (closes issues #735 #908) (by @xMasterX and @zero-mega (thanks!))
|
* SubGHz: **Cardin S449 protocol full support** (64bit keeloq) (with Add manually, and all button codes) (**use FSK12K modulation to read the remote**) (closes issues #735 #908) (by @xMasterX and @zero-mega (thanks!))
|
||||||
* SubGHz: **Beninca ARC AES128 protocol full support** (128bit dynamic) (with Add manually, and 2 button codes) (resolves issue #596) (by @xMasterX and @zero-mega)
|
* SubGHz: **Beninca ARC AES128 protocol full support** (128bit dynamic) (with Add manually, and 3 button codes) (resolves issue #596) (by @xMasterX and @zero-mega)
|
||||||
* SubGHz: **Treadmill37 protocol support** (37bit static) (by @xMasterX)
|
* SubGHz: **Treadmill37 protocol support** (37bit static) (by @xMasterX)
|
||||||
* SubGHz: **New modulation FSK with 12KHz deviation**
|
* SubGHz: **New modulation FSK with 12KHz deviation**
|
||||||
* SubGHz: **KingGates Stylo 4k - Add manually and button switch support** + refactoring of encoder
|
* SubGHz: **KingGates Stylo 4k - Add manually and button switch support** + refactoring of encoder
|
||||||
@@ -13,10 +13,12 @@
|
|||||||
* SubGHz: Add 390MHz, 430.5MHz to default hopper list (6 elements like in OFW) (works well with Hopper RSSI level set for your enviroment)
|
* SubGHz: Add 390MHz, 430.5MHz to default hopper list (6 elements like in OFW) (works well with Hopper RSSI level set for your enviroment)
|
||||||
* SubGHz: Fixed button mapping for **FAAC RC/XT**
|
* SubGHz: Fixed button mapping for **FAAC RC/XT**
|
||||||
* NFC: Handle PPS request in ISO14443-4 layer (by @WillyJL)
|
* NFC: Handle PPS request in ISO14443-4 layer (by @WillyJL)
|
||||||
|
* NFC: Fixes to `READ_MULTI` and `GET_BLOCK_SECURITY` commands in ISO 15693-3 emulation (by @WillyJL & @aaronjamt)
|
||||||
* Archive: Allow folders to be pinned (by @WillyJL)
|
* Archive: Allow folders to be pinned (by @WillyJL)
|
||||||
* Apps: Build tag (**22jan2026**) - **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev)
|
* Apps: Build tag (**26jan2026**) - **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev)
|
||||||
## Other changes
|
## Other changes
|
||||||
* UI: Various small changes
|
* UI: Various small changes
|
||||||
|
* OFW PR 4333: NFC: Fix sending 32+ byte ISO 15693-3 commands (by @WillyJL)
|
||||||
* NFC: Fix LED not blinking at SLIX unlock (closes issue #945)
|
* NFC: Fix LED not blinking at SLIX unlock (closes issue #945)
|
||||||
* SubGHz: Replaced Cars ignore option with Revers RB2 protocol ignore option
|
* SubGHz: Replaced Cars ignore option with Revers RB2 protocol ignore option
|
||||||
* SubGHz: Moved Starline, ScherKhan, Kia decoders into external app
|
* SubGHz: Moved Starline, ScherKhan, Kia decoders into external app
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ The following manufacturers have KeeLoq support in Unleashed firmware:
|
|||||||
- Nice Smilo - `433.92MHz` `AM650` (KeeLoq, 64 bits) (8bit serial part in Hop - simple learning)
|
- Nice Smilo - `433.92MHz` `AM650` (KeeLoq, 64 bits) (8bit serial part in Hop - simple learning)
|
||||||
- Normstahl - `433.92MHz` `AM650` (KeeLoq, 64 bits)
|
- Normstahl - `433.92MHz` `AM650` (KeeLoq, 64 bits)
|
||||||
- Novoferm - `433.92MHz` `AM650` (KeeLoq, 64 bits)
|
- Novoferm - `433.92MHz` `AM650` (KeeLoq, 64 bits)
|
||||||
- Sommer `434.42MHz, 868.80MHz` `FSK12K (or FSK476)` (KeeLoq, 64 bits) (normal learning) (TX03-868-4, Pearl, and maybe other models are supported (SOMloq2))
|
- Sommer `434.42MHz, 868.80MHz` `FSK12K (or FSK476)` (KeeLoq, 64 bits) (normal learning) (TX03-868-4, Pearl, and maybe other models are supported (SOMloq))
|
||||||
- Steelmate - `433.92MHz` `AM650` (KeeLoq, 64 bits) (12bit serial part in Hop - normal learning)
|
- Steelmate - `433.92MHz` `AM650` (KeeLoq, 64 bits) (12bit serial part in Hop - normal learning)
|
||||||
- Stilmatic - `433.92MHz` `AM650` (KeeLoq, 64 bits) (normal learning)
|
- Stilmatic - `433.92MHz` `AM650` (KeeLoq, 64 bits) (normal learning)
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,12 @@
|
|||||||
|
|
||||||
#include <digital_signal/digital_sequence.h>
|
#include <digital_signal/digital_sequence.h>
|
||||||
|
|
||||||
|
#include <nfc/protocols/iso15693_3/iso15693_3_listener_i.h>
|
||||||
|
|
||||||
#define BITS_IN_BYTE (8U)
|
#define BITS_IN_BYTE (8U)
|
||||||
|
|
||||||
|
#define ISO15693_SIGNAL_BUFFER_SIZE (ISO15693_3_LISTENER_BUFFER_SIZE * BITS_IN_BYTE + 2)
|
||||||
|
|
||||||
#define ISO15693_SIGNAL_COEFF_HI (1U)
|
#define ISO15693_SIGNAL_COEFF_HI (1U)
|
||||||
#define ISO15693_SIGNAL_COEFF_LO (4U)
|
#define ISO15693_SIGNAL_COEFF_LO (4U)
|
||||||
|
|
||||||
@@ -151,7 +155,7 @@ Iso15693Signal* iso15693_signal_alloc(const GpioPin* pin) {
|
|||||||
|
|
||||||
Iso15693Signal* instance = malloc(sizeof(Iso15693Signal));
|
Iso15693Signal* instance = malloc(sizeof(Iso15693Signal));
|
||||||
|
|
||||||
instance->tx_sequence = digital_sequence_alloc(BITS_IN_BYTE * 255 + 2, pin);
|
instance->tx_sequence = digital_sequence_alloc(ISO15693_SIGNAL_BUFFER_SIZE, pin);
|
||||||
|
|
||||||
for(uint32_t i = 0; i < Iso15693SignalDataRateNum; ++i) {
|
for(uint32_t i = 0; i < Iso15693SignalDataRateNum; ++i) {
|
||||||
iso15693_signal_bank_fill(instance, i);
|
iso15693_signal_bank_fill(instance, i);
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
#define TAG "Iso15693_3Listener"
|
#define TAG "Iso15693_3Listener"
|
||||||
|
|
||||||
#define ISO15693_3_LISTENER_BUFFER_SIZE (256U)
|
|
||||||
|
|
||||||
Iso15693_3Listener* iso15693_3_listener_alloc(Nfc* nfc, Iso15693_3Data* data) {
|
Iso15693_3Listener* iso15693_3_listener_alloc(Nfc* nfc, Iso15693_3Data* data) {
|
||||||
furi_assert(nfc);
|
furi_assert(nfc);
|
||||||
|
|
||||||
|
|||||||
@@ -263,8 +263,9 @@ static Iso15693_3Error iso15693_3_listener_read_multi_blocks_handler(
|
|||||||
|
|
||||||
const uint32_t block_index_start = request->first_block_num;
|
const uint32_t block_index_start = request->first_block_num;
|
||||||
const uint32_t block_index_end =
|
const uint32_t block_index_end =
|
||||||
MIN((block_index_start + request->block_count + 1),
|
MIN((block_index_start + request->block_count),
|
||||||
((uint32_t)instance->data->system_info.block_count - 1));
|
((uint32_t)instance->data->system_info.block_count - 1));
|
||||||
|
const uint32_t block_count = block_index_end - block_index_start + 1;
|
||||||
|
|
||||||
error = iso15693_3_listener_extension_handler(
|
error = iso15693_3_listener_extension_handler(
|
||||||
instance,
|
instance,
|
||||||
@@ -273,8 +274,21 @@ static Iso15693_3Error iso15693_3_listener_read_multi_blocks_handler(
|
|||||||
(uint32_t)block_index_end);
|
(uint32_t)block_index_end);
|
||||||
if(error != Iso15693_3ErrorNone) break;
|
if(error != Iso15693_3ErrorNone) break;
|
||||||
|
|
||||||
|
const bool include_block_security = (flags & ISO15693_3_REQ_FLAG_T4_OPTION) != 0;
|
||||||
|
const uint8_t bytes_per_block =
|
||||||
|
(include_block_security ? 1 : 0) + instance->data->system_info.block_size;
|
||||||
|
const uint32_t response_data_max =
|
||||||
|
bit_buffer_get_capacity_bytes(instance->tx_buffer) - 1 - 2; // Flags and CRC
|
||||||
|
const uint32_t response_blocks_max = response_data_max / bytes_per_block;
|
||||||
|
if(block_count > response_blocks_max) {
|
||||||
|
// Tested on SLIX2, if asked for more blocks than supported at once there is no reply
|
||||||
|
// Let's do the same
|
||||||
|
error = Iso15693_3ErrorIgnore;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for(uint32_t i = block_index_start; i <= block_index_end; ++i) {
|
for(uint32_t i = block_index_start; i <= block_index_end; ++i) {
|
||||||
if(flags & ISO15693_3_REQ_FLAG_T4_OPTION) {
|
if(include_block_security) {
|
||||||
iso15693_3_append_block_security(
|
iso15693_3_append_block_security(
|
||||||
instance->data, i, instance->tx_buffer); // Block security (optional)
|
instance->data, i, instance->tx_buffer); // Block security (optional)
|
||||||
}
|
}
|
||||||
@@ -341,7 +355,7 @@ static Iso15693_3Error iso15693_3_listener_write_multi_blocks_handler(
|
|||||||
|
|
||||||
if(error != Iso15693_3ErrorNone) break;
|
if(error != Iso15693_3ErrorNone) break;
|
||||||
|
|
||||||
for(uint32_t i = block_index_start; i < block_count + request->first_block_num; ++i) {
|
for(uint32_t i = block_index_start; i <= block_index_end; ++i) {
|
||||||
const uint8_t* block_data = &request->block_data[block_size * i];
|
const uint8_t* block_data = &request->block_data[block_size * i];
|
||||||
iso15693_3_set_block_data(instance->data, i, block_data, block_size);
|
iso15693_3_set_block_data(instance->data, i, block_data, block_size);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,18 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Based on GET_BLOCKS_SECURITY, one of the commands with lengthier responses:
|
||||||
|
// - 1 byte flags
|
||||||
|
// - 1 byte security status * 256 max block count
|
||||||
|
// - 2 byte crc
|
||||||
|
// for a response size of 259 bytes.
|
||||||
|
// There is also READ_MULTI_BLOCKS which has no explicit limit on requested block count
|
||||||
|
// and ISO 15693-3 also does not specify a maximum overall response length, so this command could
|
||||||
|
// theoretically result in a 8195 byte response (1 byte flags + 32 byte block * 256 blocks + 2 byte crc);
|
||||||
|
// for practicality we use a sufficient buffer for a full GET_BLOCKS_SECURITY and
|
||||||
|
// limit READ_MULTI_BLOCKS to how many blocks we can fit into that buffer size.
|
||||||
|
#define ISO15693_3_LISTENER_BUFFER_SIZE (259U)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
Iso15693_3ListenerStateReady,
|
Iso15693_3ListenerStateReady,
|
||||||
Iso15693_3ListenerStateSelected,
|
Iso15693_3ListenerStateSelected,
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ static uint8_t subghz_protocol_beninca_arc_get_btn_code(void) {
|
|||||||
case 0x04:
|
case 0x04:
|
||||||
btn = 0x02;
|
btn = 0x02;
|
||||||
break;
|
break;
|
||||||
case 0xFF:
|
case 0x00:
|
||||||
btn = 0x04;
|
btn = 0x04;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -106,12 +106,12 @@ static uint8_t subghz_protocol_beninca_arc_get_btn_code(void) {
|
|||||||
} else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_DOWN) {
|
} else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_DOWN) {
|
||||||
switch(original_btn_code) {
|
switch(original_btn_code) {
|
||||||
case 0x02:
|
case 0x02:
|
||||||
btn = 0xFF;
|
btn = 0x00;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 0x04:
|
||||||
btn = 0xFF;
|
btn = 0x00;
|
||||||
break;
|
break;
|
||||||
case 0xFF:
|
case 0x00:
|
||||||
btn = 0x02;
|
btn = 0x02;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#define FURI_HAL_NFC_ISO15693_MAX_FRAME_SIZE (1024U)
|
#define FURI_HAL_NFC_ISO15693_MAX_FRAME_SIZE (1024U)
|
||||||
#define FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE (64)
|
#define FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE (64)
|
||||||
|
#define FURI_HAL_NFC_ISO15693_BIT_LEN (4)
|
||||||
|
|
||||||
#define FURI_HAL_NFC_ISO15693_RESP_SOF_SIZE (5)
|
#define FURI_HAL_NFC_ISO15693_RESP_SOF_SIZE (5)
|
||||||
#define FURI_HAL_NFC_ISO15693_RESP_EOF_SIZE (5)
|
#define FURI_HAL_NFC_ISO15693_RESP_EOF_SIZE (5)
|
||||||
@@ -34,9 +35,9 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// 4 bits per data bit on transmit
|
// 4 bits per data bit on transmit
|
||||||
uint8_t fifo_buf[FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE * 4];
|
uint8_t fifo_buf[FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE * FURI_HAL_NFC_ISO15693_BIT_LEN];
|
||||||
size_t fifo_buf_bits;
|
size_t fifo_buf_bits;
|
||||||
uint8_t frame_buf[FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE * 2];
|
uint8_t frame_buf[FURI_HAL_NFC_ISO15693_POLLER_MAX_BUFFER_SIZE * FURI_HAL_NFC_ISO15693_BIT_LEN];
|
||||||
size_t frame_buf_bits;
|
size_t frame_buf_bits;
|
||||||
} FuriHalNfcIso15693Poller;
|
} FuriHalNfcIso15693Poller;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user