Merge remote-tracking branch 'mntm/dev' into 956/prs

This commit is contained in:
956MB
2026-01-25 21:42:08 -06:00
16 changed files with 54 additions and 15 deletions
+7 -1
View File
@@ -1,5 +1,6 @@
### Added:
- Apps:
- NFC: ISO 15693-3 NFC Writer (by @ch4istO)
- Sub-GHz: ProtoPirate (by @RocketGod-git & @xMasterX & @zero-mega et al.)
- Sub-GHz:
- UL: Cardin S449 protocol full support (64bit keeloq) (with Add manually, and all button codes) (use FSK12K modulation to read the remote) (by @xMasterX & @zero-mega)
@@ -31,6 +32,7 @@
- UL: Alutech AT-4N & Nice Flor S turbo speedup (by @Dmitry422)
- UL: Sommer fm2 in Add manually now uses FM12K modulation (Sommer without fm2 tag uses FM476) (try this if regular option doesn't work for you) (by @xMasterX)
- UL: Replaced Cars ignore option with Revers RB2 protocol ignore option (by @xMasterX)
- Archive: Support opening and pinning ProtoPirate files from Archive (#510 by @LeeroysHub)
### Fixed:
- Sub-GHz:
@@ -38,7 +40,11 @@
- UL: Possible Sommer timings fix (by @xMasterX)
- UL: Various fixes (by @xMasterX)
- UL: Nice Flor S remove extra uint64 variable (by @xMasterX)
- UL: NFC: Fix LED not blinking at SLIX unlock (by @xMasterX)
- NFC:
- Fix sending 32+ byte ISO 15693-3 commands (by @WillyJL)
- Fixes to `READ_MULTI` and `GET_BLOCK_SECURITY` commands in ISO 15693-3 emulation (#501 by @WillyJL & aaronjamt)
- UL: Fix LED not blinking at SLIX unlock (by @xMasterX)
- UL: UI: Some small changes (by @xMasterX)
### Removed:
- Sub-GHz:
@@ -45,6 +45,7 @@ static const char* const known_ext[] = {
[ArchiveFileTypeUpdateManifest] = ".fuf",
[ArchiveFileTypeDiskImage] = ".img",
[ArchiveFileTypeFolder] = "?",
[ArchiveFileTypeProtoPirate] = ".psf",
[ArchiveFileTypeUnknown] = "*",
[ArchiveFileTypeAppOrJs] = ".fap|.js",
[ArchiveFileTypeSetting] = "?",
@@ -31,6 +31,7 @@ typedef enum {
ArchiveFileTypeDiskImage,
ArchiveFileTypeFolder,
ArchiveFileTypeSetting,
ArchiveFileTypeProtoPirate,
ArchiveFileTypeUnknown,
ArchiveFileTypeAppOrJs,
ArchiveFileTypeLoading,
@@ -29,6 +29,8 @@ const char* archive_get_flipper_app_name(ArchiveFileTypeEnum file_type) {
return EXT_PATH("apps/Sub-Ghz/subghz_playlist.fap");
case ArchiveFileTypeSubghzRemote:
return EXT_PATH("apps/Sub-Ghz/subghz_remote.fap");
case ArchiveFileTypeProtoPirate:
return EXT_PATH("apps/Sub-Ghz/proto_pirate.fap");
case ArchiveFileTypeInfraredRemote:
return EXT_PATH("apps/Infrared/ir_remote.fap");
case ArchiveFileTypeBadUsb:
@@ -48,6 +48,7 @@ static const Icon* ArchiveItemIcons[] = {
[ArchiveFileTypeSearch] = &I_search_10px,
[ArchiveFileTypeUpdateManifest] = &I_update_10px,
[ArchiveFileTypeDiskImage] = &I_floppydisk_10px,
[ArchiveFileTypeProtoPirate] = &I_protopirate_10px,
[ArchiveFileTypeFolder] = &I_dir_10px,
[ArchiveFileTypeUnknown] = &I_unknown_10px,
[ArchiveFileTypeLoading] = &I_loading_10px,
@@ -105,9 +105,7 @@ static void nfc_scene_read_success_on_enter_felica(NfcApp* instance) {
if(data->workflow_type == FelicaLite) {
bool all_unlocked = data->blocks_read == data->blocks_total;
furi_string_cat_printf(
temp_str,
"\e#%s\n",
all_unlocked ? "All Blocks Are Unlocked" : "Some Blocks Are Locked");
temp_str, "\e#%s\n", all_unlocked ? "All Blocks Unlocked" : "Some Blocks Locked");
nfc_render_felica_idm(data, NfcProtocolFormatTypeShort, temp_str);
uint8_t* ck_data = instance->felica_auth->card_key.data;
furi_string_cat_printf(temp_str, "Key:");
@@ -35,7 +35,7 @@ void nfc_scene_slix_unlock_on_enter(void* context) {
instance->popup, "Hold card next\nto Flipper's back", 94, 27, AlignCenter, AlignTop);
view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup);
notification_message(instance->notifications, &sequence_blink_start_cyan);
notification_message(instance->notifications, &sequence_blink_start_yellow);
instance->poller = nfc_poller_alloc(instance->nfc, NfcProtocolSlix);
nfc_poller_start(instance->poller, nfc_scene_slix_unlock_worker_callback, instance);
Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

+1 -1
View File
@@ -125,7 +125,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)
- Normstahl - `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)
- Stilmatic - `433.92MHz` `AM650` (KeeLoq, 64 bits) (normal learning)
@@ -2,8 +2,12 @@
#include <digital_signal/digital_sequence.h>
#include <nfc/protocols/iso15693_3/iso15693_3_listener_i.h>
#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_LO (4U)
@@ -151,7 +155,7 @@ Iso15693Signal* iso15693_signal_alloc(const GpioPin* pin) {
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) {
iso15693_signal_bank_fill(instance, i);
@@ -8,8 +8,6 @@
#define TAG "Iso15693_3Listener"
#define ISO15693_3_LISTENER_BUFFER_SIZE (256U)
Iso15693_3Listener* iso15693_3_listener_alloc(Nfc* nfc, Iso15693_3Data* data) {
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_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));
const uint32_t block_count = block_index_end - block_index_start + 1;
error = iso15693_3_listener_extension_handler(
instance,
@@ -273,8 +274,21 @@ static Iso15693_3Error iso15693_3_listener_read_multi_blocks_handler(
(uint32_t)block_index_end);
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) {
if(flags & ISO15693_3_REQ_FLAG_T4_OPTION) {
if(include_block_security) {
iso15693_3_append_block_security(
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;
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];
iso15693_3_set_block_data(instance->data, i, block_data, block_size);
}
@@ -10,6 +10,18 @@
extern "C" {
#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 {
Iso15693_3ListenerStateReady,
Iso15693_3ListenerStateSelected,
+1
View File
@@ -4321,6 +4321,7 @@ Variable,+,I_power_text_24x5,const Icon,
Variable,+,I_prev_19x20,const Icon,
Variable,+,I_prev_hover_19x20,const Icon,
Variable,+,I_prev_text_19x5,const Icon,
Variable,+,I_protopirate_10px,const Icon,
Variable,-,I_qr_benchmark_25x25,const Icon,
Variable,+,I_red_19x20,const Icon,
Variable,+,I_red_hover_19x20,const Icon,
1 entry status name type params
4321 Variable + I_prev_19x20 const Icon
4322 Variable + I_prev_hover_19x20 const Icon
4323 Variable + I_prev_text_19x5 const Icon
4324 Variable + I_protopirate_10px const Icon
4325 Variable - I_qr_benchmark_25x25 const Icon
4326 Variable + I_red_19x20 const Icon
4327 Variable + I_red_hover_19x20 const Icon
+3 -2
View File
@@ -8,6 +8,7 @@
#define FURI_HAL_NFC_ISO15693_MAX_FRAME_SIZE (1024U)
#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_EOF_SIZE (5)
@@ -34,9 +35,9 @@ typedef struct {
typedef struct {
// 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;
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;
} FuriHalNfcIso15693Poller;