feat(rawcli): ICODE SLIX2 datasheet catalog
SLIX2 is the SLIX command set plus three SLIX2-only commands and a larger 80-block memory: READ_SIGNATURE (0xBD, the ECC originality signature identify already probes), PASSWORD_PROTECTION_64BIT (0xBB), STAY_QUIET_PERSISTENT (0xBC). Built by reusing the SLIX catalog's commands, so it stays a strict superset; catalog_for routes an identified "ICODE SLIX2" to it (SLIX2 checked before the SLIX/ICODE fallback). Verified live through the real completer + PromptSession: command-name completion surfaces the SLIX2 commands, raw-opcode completion maps 0xBD/0xBB/0xBC back to them, and entry accepts end to end. Unit test covers the delta + dispatch. Follow-ups noted in docs/rawcli-todo.md: NTAG5 (needs a finer identify probe first, since it shares E0 04 with SLIX), and INVENTORY_READ/FAST_INVENTORY_READ for the SLIX catalogs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -352,6 +352,19 @@ _SLIX = _catalog(
|
||||
)
|
||||
|
||||
|
||||
# ICODE SLIX2 (SL2S2602): everything the SLIX has, plus three SLIX2-only commands and a larger
|
||||
# 80-block memory. READ_SIGNATURE (0xBD) is the one identify probes to tell SLIX2 from SLIX.
|
||||
_SLIX2 = _catalog(
|
||||
"ICODE SLIX2", "hf15", *_SLIX.commands.values(),
|
||||
_c("READ_SIGNATURE", [], lambda: iso15_frame(0xBD, mfg=NXP_MFG),
|
||||
"read the 32-byte ECC originality signature — SLIX2 only (0xBD)", opcode=0xBD),
|
||||
_c("PASSWORD_PROTECTION_64BIT", [], lambda: iso15_frame(0xBB, mfg=NXP_MFG),
|
||||
"combine the read+write passwords into 64-bit protection — SLIX2 only (0xBB)", opcode=0xBB),
|
||||
_c("STAY_QUIET_PERSISTENT", [], lambda: iso15_frame(0xBC, mfg=NXP_MFG),
|
||||
"persistent quiet that survives power cycles — SLIX2 only (0xBC)", opcode=0xBC),
|
||||
)
|
||||
|
||||
|
||||
# ---- LF T5577 / ATA5577 (block read/write over the T55xx downlink; executes via lf.t55) ----
|
||||
# build() exists only to expose the downlink opcode for hex/binary completion; execution goes
|
||||
# through run() (the device method), since LF isn't a raw-byte exchange like 14a.
|
||||
@@ -420,6 +433,8 @@ def catalog_for(session) -> Catalog | None:
|
||||
"""Resolve the command catalog for the session's identified transponder, or None."""
|
||||
name = (session.transponder or "").upper()
|
||||
if session.protocol == "hf15":
|
||||
if "SLIX2" in name:
|
||||
return _SLIX2
|
||||
return _SLIX if "SLIX" in name or "ICODE" in name else ISO15
|
||||
if session.protocol == "hf14a":
|
||||
if not session.transponder:
|
||||
|
||||
Reference in New Issue
Block a user