Merge branch 'main' into patch-iso14443-4-blockvals

This commit is contained in:
Aaron Tulino
2026-07-07 02:01:17 -07:00
committed by GitHub
8 changed files with 278 additions and 108 deletions
+3
View File
@@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file.
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
## [unreleased][unreleased]
## [v2.2.0][2026-07-04]
- Added Jablotron LF protocol support: read, emulate and T55xx clone (@midlan)
- Added IDTECK LF protocol support: tag emulation (PSK1 RF/32) and T55xx clone. No reader path yet; PSK demodulation on the envelope-only receive chain is left for a follow-up.
- Added PAC/Stanley LF protocol support: read, emulate and T55xx clone (@kevihiiin, @danieltwagner)
@@ -24,6 +26,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
- Fix Windows build (@suut)
- Added `hf 14a config` to deal with badly configured cards (@azuwis)
- New Symmetrical LED Animation Mode and Improved Minimal Mode (@WillyJL)
- Fix MF1 state reset logic and access control conditions (@unkernet)
## [v2.1.0][2025-09-02]
- Added UV, formatter and linter. Contribution guidelines. (@GameTec-live)
@@ -377,6 +377,11 @@ void nfc_tag_14a_data_process(uint8_t *p_data) {
// The trigger conditions are: REQA response in non -Halt mode
// Temporary through: Wupa response in non -choice state, no matter what state is in the state, you can use the Wupa instruction to wake up
if ((szDataBits == 7) && ((isREQA && m_tag_state_14a != NFC_TAG_STATE_14A_HALTED) || isWUPA)) {
// Received 7-bit command (REQA or WUPA) while the tag is active — reset state machine
if (m_tag_state_14a != NFC_TAG_STATE_14A_IDLE && m_tag_state_14a != NFC_TAG_STATE_14A_HALTED) {
m_tag_state_14a = NFC_TAG_STATE_14A_IDLE;
return;
}
// The receiver of the 14A communication is notified, the internal state machine is reset
if (m_tag_handler.cb_reset != NULL) {
m_tag_handler.cb_reset();
@@ -576,8 +581,16 @@ void nfc_tag_14a_data_process(uint8_t *p_data) {
// No processing is successful, it may be some other data. You need to re-post processing
if (m_tag_handler.cb_state != NULL) { //Activation status, transfer the message to other registered processor processing
m_tag_handler.cb_state(p_data, szDataBits);
break;
}
break;
}
case NFC_TAG_STATE_14A_PROPRIETARY: {
if (m_tag_handler.cb_state != NULL) {
m_tag_handler.cb_state(p_data, szDataBits);
} else {
m_tag_state_14a = NFC_TAG_STATE_14A_IDLE;
}
break;
}
}
}
@@ -36,10 +36,11 @@
// ISO14443-A Universal state machine
typedef enum {
NFC_TAG_STATE_14A_IDLE, // Leisure, you can wait for any instructions
NFC_TAG_STATE_14A_READY, // Select card status, currently the standard 14A anti -rushing collision
NFC_TAG_STATE_14A_ACTIVE, // Select cards or other instructions to enter the working status, which can receive all data
NFC_TAG_STATE_14A_HALTED, // The label stops working status and can only be awakened by Halt or other special instructions (non -labels)
NFC_TAG_STATE_14A_IDLE, // Leisure, you can wait for any instructions
NFC_TAG_STATE_14A_READY, // Select card status, currently the standard 14A anti -rushing collision
NFC_TAG_STATE_14A_ACTIVE, // Select cards or other instructions to enter the working status, which can receive all data
NFC_TAG_STATE_14A_HALTED, // The label stops working status and can only be awakened by Halt or other special instructions (non -labels)
NFC_TAG_STATE_14A_PROPRIETARY, // Card is in proprietary state; all commands handled only by state_handler
} nfc_tag_14a_state_t;
// UID of the length in the enumeration specification
File diff suppressed because it is too large Load Diff
@@ -149,6 +149,7 @@ typedef struct {
nfc_tag_mf1_auth_log_t *mf1_get_auth_log(uint32_t *count);
void nfc_tag_mf1_reset_handler();
int nfc_tag_mf1_data_loadcb(tag_specific_type_t type, tag_data_buffer_t *buffer);
int nfc_tag_mf1_data_savecb(tag_specific_type_t type, tag_data_buffer_t *buffer);
bool nfc_tag_mf1_data_factory(uint8_t slot, tag_specific_type_t tag_type);
+3
View File
@@ -287,6 +287,9 @@ void rgb_marquee_slot_switch(uint8_t led_down, uint8_t color_led_down, uint8_t l
light_level --;
}
}
for (uint8_t i = 0; i < RGB_LIST_NUM; i++) {
nrf_gpio_pin_clear(led_pins[i]);
}
if (led_up >= 0 && led_up <= 7) {
//Treatment
pwm_config.output_pins[0] = led_pins[led_up];
+2 -2
View File
@@ -31,7 +31,9 @@ from chameleon_utils import (
execute_tool,
tqdm_if_exists,
print_key_table,
default_cwd
)
from chameleon_utils import CLITree
from chameleon_utils import CR, CG, CB, CC, CY, C0, color_string
from chameleon_utils import print_mem_dump
@@ -67,8 +69,6 @@ type_id_SAK_dict = {
0x38: "SmartMX with MIFARE Classic 4K",
}
default_cwd = Path.cwd() / Path(__file__).with_name("bin")
def load_key_file(import_key, keys):
"""
+14 -1
View File
@@ -24,7 +24,20 @@ CY = colorama.Fore.YELLOW
CM = colorama.Fore.MAGENTA
C0 = colorama.Style.RESET_ALL
default_cwd = Path.cwd() / Path(__file__).with_name("bin")
def get_resource_dir(relative_path: str):
"""
Get the resource directory of the program.
Returns the temporary directory where files are extracted after being packaged with PyInstaller, or the directory where the script is located in the development environment.
"""
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
base_dir = Path(sys._MEIPASS)
else:
base_dir = Path(__file__).parent
return base_dir / relative_path
default_cwd = get_resource_dir("bin")
class ArgsParserError(Exception):