Skip to main content

spiflash

A database of SPI flash chips — JEDEC ids, part names, sizes, page and sector sizes, erase opcodes and block layouts, supply voltages and capabilities — merged from the flash tables of every project that keeps one:

source what is read records
Linux drivers/mtd/spi-nor/*.c, drivers/mtd/nand/spi/*.c 377 (127 SPI NAND)
U-Boot drivers/mtd/spi/spi-nor-ids.c 334
flashrom flashchips/*.c (SPI chips only) 512
flashprog flashchips.c (SPI chips only) 480
OpenOCD src/flash/nor/spi.c, and src/helper/jep106.inc for manufacturer names 190
openFPGALoader src/spiFlashdb.hpp 53

Together that is 778 distinct chip ids (651 SPI NOR, 127 SPI NAND) from 37 manufacturers, 459 of them described by more than one source, plus the full JEP106 manufacturer list. Every entry keeps the upstream file and line it came from, and where the sources disagree (60 ids do) both answers are kept.

spiflash sources (or spiflash.sources()) names the exact upstream commits the shipped data was extracted from.

Install

pip install spiflash          # or: uv tool install spiflash

It has no dependencies. Or, as a Debian package, from the signed apt repository at https://mith.ro/spiflash/. There is one per suite (bookworm, trixie, forky and sid), and the package is Architecture: all, so it installs on any architecture. Put your suite's name in place of trixie below (Raspberry Pi OS uses Debian's codenames):

sudo install -d -m0755 /etc/apt/keyrings
curl -fsSL https://mith.ro/spiflash/spiflash.gpg | sudo tee /etc/apt/keyrings/spiflash.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/spiflash.gpg] https://mith.ro/spiflash/trixie/ ./" \
  | sudo tee /etc/apt/sources.list.d/spiflash.list
sudo apt update
sudo apt install python3-spiflash      # provides the spiflash command

The repository's signing key is B528 6C61 A99A 9E6A 5B8A 8E5B 6B2D 7683 DE01 081D (gpg --show-keys /etc/apt/keyrings/spiflash.gpg shows it).

The command

What answered 9f with ef 40 18?

$ spiflash id ef4018
ef4018  Winbond  W25Q128, W25Q128.V, W25Q128FV, W25Q128JV  (nor)
    size 16 MiB, page 256 B, sector 64 KiB, 2.7-3.6 V
    features: dual_read erase_32k erase_4k erase_64k fast_read lock otp quad_read sfdp
    from: flashrom, flashprog, linux, u-boot, openocd, openfpgaloader

-v lists every upstream entry with its file and line, --json prints it all as JSON. Bytes after the three-byte id narrow the answer: a Spansion S25FL128S answers 01 20 18 4d 01 80, and spiflash id '01 20 18 4d 01 80' drops the variants with other extended ids. A leading 7f continuation code is optional (1c7018 and 7f1c7018 are both an Eon EN25QH128).

What does a part answer?

$ spiflash find gd25q64
c84017  GigaDevice  GD25Q64, GD25Q64C  (nor)
    size 8 MiB, page 256 B, sector 64 KiB, 2.7-3.6 V
    ...

A family (w25q128), a part (W25Q128JV) or a full order code (S25FL128SAGMFI001) all work; flashrom's . wildcards (W25Q128.V) are understood.

spiflash list --manufacturer winbond     # every Winbond id
spiflash list --type nand
spiflash id --method res1 10             # a legacy RES signature byte (M25P10)
spiflash jep106 7f1c                     # "Eon Silicon Devices"
spiflash sources                         # the upstream commits

The library

import spiflash

(chip,) = spiflash.lookup("ef4018")      # or b"\xef\x40\x18", 0xef4018, [0xef, 0x40, 0x18]
chip.manufacturer                        # 'Winbond'
chip.names                               # ('W25Q128', 'W25Q128.V', 'W25Q128FV', 'W25Q128JV')
chip.size, chip.page_size, chip.sector_size   # (16777216, 256, 65536)
chip.voltage                             # (2700, 3600), in mV
"quad_read" in chip.features             # True
chip.feature_sources("quad_read")        # ('flashprog', 'linux', 'openocd', 'u-boot')
chip.conflicts                           # {} -- or {"page_size": {256: (...), 512: (...)}}

for r in chip.records:                   # every upstream entry, as extracted
    print(r.source, r.name, r.url, r.erasers, r.opcodes, r.flags)

spiflash.find("MX25L12835F")             # by part name, best match first
spiflash.jep106(0xC2)                    # 'Macronix'

A Flash is one chip id, and several parts can share one (a W25Q128BV, FV and JV all answer ef4018), so it lists every name the sources give. Its single values (size, page_size, sector_size, voltage, manufacturer) are what most sources agree on, ties going to flashrom, then flashprog, Linux, U-Boot, OpenOCD and openFPGALoader; values("size") shows who says what. features is everything any source claims, from this list:

feature meaning
erase_4k, erase_32k, erase_64k that erase size is supported (0x20, 0x52, 0xd8)
sfdp answers SFDP (JESD216) queries
fast_read, dual_read, quad_read, octal_read, octal_dtr_read read modes
quad_pp, octal_dtr_pp page program modes
qpi QPI (4-4-4) mode
4byte_addr, 4byte_opcodes 4-byte addressing; dedicated 4-byte opcodes
otp, lock, rww, no_erase OTP area; status-register block protection; read-while-write; FRAM/MRAM

The upstream's own flags (SPI_NOR_HAS_TB, FEATURE_WRSR2, ...) are kept on each record's flags for anything this list does not capture.

Updating the data

The data is generated, never edited: tools/sources.toml pins each upstream to a commit, and

uv run tools/update_db.py            # rebuild src/spiflash/data/ from the pins
uv run tools/update_db.py --latest   # move the pins to each upstream's HEAD first

fetches only the files it reads (a sparse, blobless, depth-1 fetch: about 15 MB for Linux) and parses the tables as text. A weekly workflow reports when an upstream table has changed. See docs/DEVELOPING.md for how the extraction works and docs/SOURCES.md for what is taken from where, and under what terms.

Credits

The extraction follows the approach of LiteSPI's spi_nor_config_generator (Antmicro, 2020): the same upstreams, a JSON record per upstream entry, and the handling of OpenOCD's w25q128fv/jv-style names. The parsers are new, as Linux and flashrom have both since changed their table formats. The data itself is the work of the people who maintain those tables.

License

Apache-2.0; see LICENSE and, for the data, docs/SOURCES.md.

Metadata

Release files for spiflash 0.0.post11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for spiflash 0.0.post11
File Size Uploaded Provenance Actions
spiflash-0.0.post11.tar.gz 146.3 kB With provenance Details for spiflash-0.0.post11.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for spiflash 0.0.post11
File Interpreter ABI Platform Actions
spiflash-0.0.post11-py3-none-any.whl Python 3 none any Details for spiflash-0.0.post11-py3-none-any.whl

Total release size: 266.4 kB

Release files / spiflash-0.0.post11.tar.gz

Download URL spiflash-0.0.post11.tar.gz
Size 146.3 kB
Tags Source
SHA-256 checksum
How to use checksums
cccf21eaae7a7a1071a4fc6b3261ebff2b79553e87c6469c8166deee2f6b64dd
BLAKE2b-256 checksum
How to use checksums
21fe340918ec331ad996ff58221bc679bad50462cd49779194d7dd543bc0a9e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / spiflash-0.0.post11-py3-none-any.whl

Download URL spiflash-0.0.post11-py3-none-any.whl
Size 120.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
76b6c92086dbdcb676c83014cce8414049f68dd4e5cd9a281aeec9cd9a331af9
BLAKE2b-256 checksum
How to use checksums
a19ca44b573b97c79d194a6eca9c94e1e7adfc3cf14711331d6250010174940b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Security for spiflash 0.0.post11

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for spiflash-0.0.post11.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.0.post11 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page