From f0862c9ee2a692a3d0c5146a0a5d884793166b0d Mon Sep 17 00:00:00 2001 From: ANTodorov Date: Wed, 2 Oct 2024 19:29:44 +0300 Subject: [PATCH] add a helper script to decode SPI flash JEDEC data Signed-off-by: ANTodorov --- CHANGELOG.md | 1 + client/pyscripts/spi_flash_decode.py | 86 ++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 client/pyscripts/spi_flash_decode.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e713803a..34c1df215 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 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] +- add a helper script to decode JEDEC data `script run spi_flash_decode` (@ANTodorov) - show SPI flash JEDEC Manufacturer ID and Device ID in `hw status` output (@ANTodorov) - Improved `hf iclass configcards` to support generating config cards using a different key than the default k0 as the card's key (@antiklesys) - Added maur keys (@iceman1001) diff --git a/client/pyscripts/spi_flash_decode.py b/client/pyscripts/spi_flash_decode.py new file mode 100644 index 000000000..3a8648b8f --- /dev/null +++ b/client/pyscripts/spi_flash_decode.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +import re +import pm3 +# optional color support +try: + # pip install ansicolors + from colors import color +except ModuleNotFoundError: + def color(s, fg=None): + _ = fg + return str(s) + +spi = { + 0x85:{ + "manufacturer": "Puya", + 0x60: { + 0x15: { + "part": "P25Q16H", + "size": "16mbits", + "sizeB": "2MB", + }, + }, + }, + 0xEF:{ + "manufacturer": "Winbond", + 0x30: { + 0x11: { + "part": "W25X10BV", + "size": "1mbits", + "sizeB": "128KB", + }, + 0x12: { + "part": "W25X20BV", + "size": "2mbits", + "sizeB": "256KB", + }, + 0x13: { + "part": "W25X40BV", + "size": "4mbits", + "sizeB": "512KB", + }, + }, + 0x70: { + 0x22: { + "part": "W25Q02JV-IM", + "size": "2mbits", + "sizeB": "256KB", + }, + }, + }, + } + +p = pm3.pm3() + +p.console("hw status") + +rex = re.compile("...\s([0-9a-fA-F]{2})\s/\s([0-9a-fA-F]{4})") +for line in p.grabbed_output.split('\n'): + # [#] JEDEC Mfr ID / Dev ID... 85 / 6015 + if " JEDEC " not in line: + continue + match = re.findall(rex, line) + mid = int(match[0][0], 16) + did = int(match[0][1], 16) + did_h = did >> 8 + did_l = did & 0xff + t = None + if mid in spi: + mfr = spi[mid]['manufacturer'] + if did_h in spi[mid]: + if did_l in spi[mid][did_h]: + t = spi[mid][did_h][did_l] + print("\n Manufacturer... " + color(f"{mfr}", fg="green") + + "\n Device......... " + color(f"{t['part']}", fg="green") + + "\n Size........... " + color(f"{t['size']} ({t['sizeB']})", fg="yellow") + ) + else: + print("\n Manufacturer... " + color(f"{mfr}", fg="green") + + "\n Device ID...... " + color(f"{did:04X}h (unknown)", fg="red")) + else: + print("\n Manufacturer... " + color(f"{mfr}", fg="green") + + "\n Device ID...... " + color(f"{did:04X}h (unknown)", fg="red")) + else: + print("\n Manufacturer... " + color(f"{mid:02X}h (unknown)", fg="red") + + "\n Device ID...... " + color(f"{did:04X}h (unknown)", fg="red"))