blob: bd072397044e11a40d9437841a0ed838ee181423 [file] [log] [blame] [edit]
/*
* This file is part of the flashrom project.
*
* Copyright (C) 2000 Silicon Integrated System Corporation
* Copyright (C) 2004 Tyan Corp
* Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
* Copyright (C) 2006-2009 Carl-Daniel Hailfinger
* Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "ene.h"
#include "flash.h"
#include "flashchips.h"
#include "chipdrivers.h"
#include "chipdrivers/edi.h"
#include "chipdrivers/spi.h"
#include "writeprotect.h"
/**
* List of supported flash chips.
*
* Temporarily, this file is sorted alphabetically by vendor and name to
* assist with merging the Chromium fork of flashprog.
*
* The usual intention is that that this list is sorted by vendor, then chip
* family and chip density, which is useful for the output of 'flashprog -L'.
*/
const struct flashchip flashchips[] = {
/*
* .vendor = Vendor name
* .name = Chip name
* .bustype = Supported flash bus types (Parallel, LPC...)
* .id.type = Type of the ID information (used to match probing method etc.)
* .id.manufacture = Manufacturer chip ID
* .id.model = Model chip ID
* .total_size = Total size in (binary) kbytes
* .page_size = Page or eraseblock(?) size in bytes
* .tested = Test status
* .probe = Probe function
* .probe_timing = Probe function delay
* .block_erasers[] = Array of erase layouts and erase functions
* {
* .eraseblocks[] = Array of { blocksize, blockcount }
* .block_erase = Block erase function
* }
* .printlock = Chip lock status function
* .unlock = Chip unlock function
* .write = Chip write function
* .read = Chip read function
* .voltage = Voltage range in millivolt
*/
{
.vendor = "AMD",
.name = "Am29F002(N)BB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F002BB,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F002(N)BT",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F002BT,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F010",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F010,
.total_size = 128,
.page_size = 16 * 1024,
.feature_bits = FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F010A/B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F010,
.total_size = 128,
.page_size = 16 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F016D",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F016D,
.total_size = 2 * 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 32} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F040",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F040,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F040B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F040,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F080",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F080,
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29F080B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29F080,
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV001BB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV001BB,
.total_size = 128,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 1},
{4 * 1024, 2},
{16 * 1024, 7},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV001BT",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV001BT,
.total_size = 128,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 7},
{4 * 1024, 2},
{8 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV002BB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV002BB,
.total_size = 256,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV002BT",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV002BT,
.total_size = 256,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV004BB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV004BB,
.total_size = 512,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 7},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV004BT",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV004BT,
.total_size = 512,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV008BB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV008BB,
.total_size = 1024,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 15},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV008BT",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV008BT,
.total_size = 1024,
.page_size = 64 * 1024, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 15},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV040B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV040B,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMD",
.name = "Am29LV081B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMD_ID,
.id.model = AMD_AM29LV080B,
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMIC",
.name = "A25L010",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L010,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 32 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 2 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 128 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L016",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L016,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 512 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 32 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 2048 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L020",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L020,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 64 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 4 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 256 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L032",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L032,
.total_size = 4096,
.page_size = 256,
/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 1024 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 4096 * 1024, 1 } },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 4096 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
.unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L040",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L040,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 128 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 8 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 512 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L05PT",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L05PT,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L05PU",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L05PU,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L080",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L080,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 256 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 16 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 1024 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L10PT",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L10PT,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 1},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L10PU",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L10PU,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 1},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L16PT",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L16PT,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 31},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L16PU",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L16PU,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PR,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 31},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L20PT",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L20PT,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L20PU",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L20PU,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
/* The A25L40P{T,U} chips are distinguished by their
* erase block layouts, but without any distinction in RDID.
* This inexplicable quirk was verified by Rudolf Marek
* and discussed on the flashprog mailing list on 2010-07-12.
*/
{
.vendor = "AMIC",
.name = "A25L40PT",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L40PT,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PR,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L40PU",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L40PU,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 7},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L512",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25L512,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 16 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 1 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 64 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25L80P",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID,
.id.model = AMIC_A25L80P,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PRE,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 15},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25LQ032/A25LQ32A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25LQ032,
.total_size = 4096,
.page_size = 256,
/* A25LQ32A supports SFDP */
/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 1024 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 64 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 4096 * 1024, 1 } },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 4096 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
.unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25LQ16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25LQ16,
.total_size = 2048,
.page_size = 256,
/* supports SFDP */
/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 512 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 64 * 1024, 32 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 32 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 2048 * 1024, 1 } },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 2048 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
.unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "AMIC",
.name = "A25LQ64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A25LQ64,
.total_size = 8192,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT |
FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO |
FEATURE_QPI_35_F5,
.dummy_cycles =
{
.qpi_fast_read = 4,
.qpi_fast_read_qio = 6,
},
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 2048 } },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 256 } },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 128 } },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 8192 * 1024, 1 } },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 8192 * 1024, 1 } },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "AMIC",
.name = "A29002B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A29002B,
.total_size = 256,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMIC",
.name = "A29002T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A29002T,
.total_size = 256,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMIC",
.name = "A29040B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A29040B,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "AMIC",
.name = "A49LF040A",
.bustype = BUS_LPC,
.id.type = ID_JEDEC,
.id.manufacture = AMIC_ID_NOPREFIX,
.id.model = AMIC_A49LF040A,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT25DF021",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF021,
.total_size = 256,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
},
{
.vendor = "Atmel",
.name = "AT25DF021A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF021A,
.total_size = 256,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 3600},
},
{
.vendor = "Atmel",
.name = "AT25DF041A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF041A,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
},
{
.vendor = "Atmel",
.name = "AT25DF081",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF081,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
},
{
.vendor = "Atmel",
.name = "AT25DF081A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF081A,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25DF161",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF161,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
/*The AT26DF321 has the same ID as the AT25DF321. */
{
.vendor = "Atmel",
.name = "AT25DF321",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF321,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25DF321A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF321A,
.total_size = 4096,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25DF641(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF641,
.total_size = 8192,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25DL081",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DF081,
.total_size = 1024,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {1650, 1950},
},
{
.vendor = "Atmel",
.name = "AT25DL161",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DL161,
.total_size = 2048,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {1650, 1950},
},
{
.vendor = "Atmel",
.name = "AT25DQ161",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25DQ161,
.total_size = 2048,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df_sec,
.unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
/* The A suffix indicates 33MHz instead of 20MHz clock rate.
* All other properties seem to be the same.*/
.name = "AT25F1024(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_AT25F,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F1024,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f,
.unlock = spi_disable_blockprotect_at25f,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25F2048",
.bustype = BUS_SPI,
.id.type = ID_SPI_AT25F,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F2048,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f,
.unlock = spi_disable_blockprotect_at25f,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25F4096",
.bustype = BUS_SPI,
.id.type = ID_SPI_AT25F,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F4096,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f4096,
/* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25F512",
.bustype = BUS_SPI,
.id.type = ID_SPI_AT25F,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F512,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f,
.unlock = spi_disable_blockprotect_at25f,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25F512A",
.bustype = BUS_SPI,
.id.type = ID_SPI_AT25F,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F512A,
.total_size = 64,
.page_size = 128,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f512a,
/* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
.unlock = spi_disable_blockprotect_at25f512a,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25F512B",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25F512B,
.total_size = 64,
.page_size = 256,
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_62,
}
},
.printlock = spi_prettyprint_status_register_at25f512b,
.unlock = spi_disable_blockprotect_at25f512b,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25FS010",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25FS010,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25fs010,
.unlock = spi_disable_blockprotect_at25fs010,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25FS040",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25FS040,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25fs040,
.unlock = spi_disable_blockprotect_at25fs040,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT25SF041",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25SF041,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2500, 3600},
},
{
.vendor = "Atmel",
.name = "AT25SF081",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25SF081,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
},
{
.vendor = "Atmel",
.name = "AT25SF161",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25SF161,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2500, 3600},
},
{
.vendor = "Atmel",
.name = "AT25SF321",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25SF321,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PR,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2500, 3600},
},
{
.vendor = "Atmel",
.name = "AT25SL128A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT25SL128A,
.total_size = 16384,
.page_size = 256,
/* supports SFDP */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1700, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Atmel",
.name = "AT26DF041",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT26DF041,
.total_size = 512,
.page_size = 256,
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {256, 2048} },
.block_erase = spi_block_erase_81,
}, {
.eraseblocks = { {2 * 1024, 256} },
.block_erase = spi_block_erase_50,
}, {
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}
},
.printlock = spi_prettyprint_status_register_plain,
/* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
.write = spi_chip_write_1,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
},
{
.vendor = "Atmel",
.name = "AT26DF081A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT26DF081A,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at26df081a,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT26DF161",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT26DF161,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at25df,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT26DF161A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT26DF161A,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_at26df081a,
.unlock = spi_disable_blockprotect_at2x_global_unprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT26F004",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT26F004,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.write = NULL, /* Incompatible Page write */
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Atmel",
.name = "AT29C010A",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT29C010A,
.total_size = 128,
.page_size = 128,
.feature_bits = FEATURE_LONG_RESET,
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = 10000, /* 10mS, Enter=Exec */
.block_erasers =
{
{
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec, /* FIXME */
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT29C020",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT29C020,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_LONG_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = 10000, /* 10ms */
.block_erasers =
{
{
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT29C040A",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT29C040A,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_LONG_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10000, /* 10 ms */
.block_erasers =
{
{
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT29C512",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT29C512,
.total_size = 64,
.page_size = 128,
.feature_bits = FEATURE_LONG_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = 10000, /* 10mS, Enter=Exec */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT45CS1282",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45CS1282,
.total_size = 16896, /* No power of two sizes */
.page_size = 1056, /* No power of two sizes */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
.feature_bits = FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1056, 1}, /* sector 0a: opcode 50h */
{248 * 1056, 1}, /* sector 0b: opcode 7Ch */
{256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
},
.block_erase = spi_erase_at45cs_sector,
}
},
.printlock = spi_prettyprint_status_register_plain,
.write = spi_write_at45db,
.read = spi_read_at45db,
.voltage = {2700, 3600},
.gran = write_gran_1056bytes,
},
{
.vendor = "Atmel",
.name = "AT45DB011D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB011D,
.total_size = 128, /* or 132, determined from status register */
.page_size = 256, /* or 264, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {256, 512} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 256, 512/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 256, 1},
{120 * 256, 1},
{128 * 256, 3},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB021D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB021D,
.total_size = 256, /* or 264, determined from status register */
.page_size = 256, /* or 264, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {256, 1024} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 256, 1024/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 256, 1},
{120 * 256, 1},
{128 * 256, 7},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB041D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB041D,
.total_size = 512, /* or 528, determined from status register */
.page_size = 256, /* or 264, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {256, 2048} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 256, 2048/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 256, 1},
{248 * 256, 1},
{256 * 256, 7},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB081D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB081D,
.total_size = 1024, /* or 1056, determined from status register */
.page_size = 256, /* or 264, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {256, 4096} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 256, 4096/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 256, 1},
{248 * 256, 1},
{256 * 256, 15},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB161D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB161D,
.total_size = 2048, /* or 2112, determined from status register */
.page_size = 512, /* or 528, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {512, 4096} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 512, 4096/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 512, 1},
{248 * 512, 1},
{256 * 512, 15},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB321C",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB321C,
.total_size = 4224, /* No power of two sizes */
.page_size = 528, /* No power of two sizes */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
.feature_bits = FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {528, 8192} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 528, 8192/8} },
.block_erase = spi_erase_at45db_block,
}, /* Although the datasheets describes sectors (which can be write protected)
* there seems to be no erase functions for them.
{
.eraseblocks = {
{8 * 528, 1},
{120 * 528, 1},
{128 * 528, 63},
},
.block_erase = spi_erase_at45db_sector
}, */ {
.eraseblocks = { {4224 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
.write = spi_write_at45db,
.read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
.voltage = {2700, 3600},
.gran = write_gran_528bytes,
},
{
.vendor = "Atmel",
.name = "AT45DB321D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB321D,
.total_size = 4096, /* or 4224, determined from status register */
.page_size = 512, /* or 528, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {512, 8192} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 512, 8192/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 512, 1},
{120 * 512, 1},
{128 * 512, 63},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB321E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB321C,
.total_size = 4096, /* or 4224, determined from status register */
.page_size = 512, /* or 528, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {512, 8192} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 512, 8192/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 512, 1},
{120 * 512, 1},
{128 * 512, 63},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT45DB642D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT45DB642D,
.total_size = 8192, /* or 8448, determined from status register */
.page_size = 1024, /* or 1056, determined from status register */
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {1024, 8192} },
.block_erase = spi_erase_at45db_page,
}, {
.eraseblocks = { {8 * 1024, 8192/8} },
.block_erase = spi_erase_at45db_block,
}, {
.eraseblocks = {
{8 * 1024, 1},
{248 * 1024, 1},
{256 * 1024, 31},
},
.block_erase = spi_erase_at45db_sector
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_erase_at45db_chip,
}
},
.printlock = spi_prettyprint_status_register_at45db,
.unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
/* granularity will be set by the probing function. */
.write = spi_write_at45db,
.read = spi_read_at45db, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
.prepare_access = spi_prepare_at45db,
},
{
.vendor = "Atmel",
.name = "AT49(H)F010",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F010,
.total_size = 128,
.page_size = 0, /* unused */
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.printlock = printlock_at49f,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49BV512",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49BV512,
.total_size = 64,
.page_size = 64,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49F002(N)",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F002N,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{96 * 1024, 1},
{128 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49F002(N)T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F002NT,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{128 * 1024, 1},
{96 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49F020",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F020,
.total_size = 256,
.page_size = 0, /* unused */
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
/* Chip features an optional permanent write protection
* of the first 8 kB. The erase function is the same as
* above, but 00000H to 01FFFH will not be erased.
* FIXME: add another eraser when partial erasers are
* supported.
*/
},
.printlock = printlock_at49f,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49F040",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F040,
.total_size = 512,
.page_size = 0, /* unused */
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
/* Chip features an optional permanent write protection
* of the first 16 kB. The erase function is the same as
* above, but 00000H to 03FFFH will not be erased.
* FIXME: add another eraser when partial erasers are
* supported.
*/
},
.printlock = printlock_at49f,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49F080",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F080,
.total_size = 1024,
.page_size = 0, /* unused */
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
/* Chip features an optional permanent write protection
* of the first 16 kB. The erase function is the same as
* above, but 00000H to 03FFFH will not be erased.
* FIXME: add another eraser when partial erasers are
* supported.
*/
},
.printlock = printlock_at49f,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
/* 'top' version of AT49F080. equal in all aspects but the boot block address */
.vendor = "Atmel",
.name = "AT49F080T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49F080T,
.total_size = 1024,
.page_size = 0, /* unused */
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
/* Chip features an optional permanent write protection
* of the first 16 kB. The erase function is the same as
* above, but FC000H to FFFFFH will not be erased.
* FIXME: add another eraser when partial erasers are
* supported.
*/
},
.printlock = printlock_at49f,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49LH002",
.bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
.id.type = ID_82802AB,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49LH002,
.total_size = 256,
.page_size = 0, /* unused */
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = NULL, /* TODO: Implement. */
}, {
.eraseblocks = {
{64 * 1024, 4},
},
.block_erase = erase_block_82802ab,
},
},
.printlock = printlock_regspace2_block_eraser_0,
.unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49LH004",
.bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
.id.type = ID_82802AB,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49LH004,
.total_size = 512,
.page_size = 0, /* unused */
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
}, {
.eraseblocks = {
{64 * 1024, 8},
},
.block_erase = NULL, /* TODO: Implement. */
},
},
.printlock = printlock_regspace2_block_eraser_0,
.unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Atmel",
.name = "AT49LH00B4",
.bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
.id.type = ID_82802AB,
.id.manufacture = ATMEL_ID,
.id.model = ATMEL_AT49LH00B4,
.total_size = 512,
.page_size = 0, /* unused */
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 2},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 7},
},
.block_erase = NULL, /* TODO: Implement. */
}, {
.eraseblocks = {
{64 * 1024, 8},
},
.block_erase = erase_block_82802ab,
},
},
.printlock = printlock_regspace2_block_eraser_0,
.unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D05AS",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D05AS,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D10AS",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D10AS,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D20AS",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D20AS,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D40AS/BY25D40ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D40AS,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D80AS/BY25Q80BS/BY25Q80ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D80AS,
.total_size = 1024,
.page_size = 256,
/* BY25Q80BS: QPI, BY25Q80ES: QIO */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25D16AS/BY25Q16BS/BY25Q16ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25D16AS,
.total_size = 2048,
.page_size = 256,
/* B25Q16BS/ES: QPI */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_OK_PR,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25Q32BS/BY25Q32CS/BY25Q32ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25Q32BS,
.total_size = 4096,
.page_size = 256,
/* BY25Q32CS: QPI w/ SRP (4, 4, 6, 8) */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25Q64AS/BY25Q64ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25Q64AS,
.total_size = 8192,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya/BoHong Microelectronics",
.name = "B.25Q128AS/BY25Q128ES",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25Q128AS,
.total_size = 16384,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Boya Microelectronics",
.name = "BY25Q128FS",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = BOYA_BOHONG_ID,
.id.model = BOYA_BOHONG_B_25Q128FS,
.total_size = 16384,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Bright",
.name = "BM29F040",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = BRIGHT_ID,
.id.model = BRIGHT_BM29F040,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Catalyst",
.name = "CAT28F512",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC, /* FIXME! */
.id.manufacture = CATALYST_ID,
.id.model = CATALYST_CAT28F512,
.total_size = 64,
.page_size = 0, /* unused */
.feature_bits = 0,
.tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
.probe = probe_jedec, /* FIXME! */
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 1} },
.block_erase = NULL, /* TODO */
},
},
.write = NULL, /* TODO */
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "ENE",
.name = "KB9012 (EDI)",
.bustype = BUS_SPI,
.id.type = ID_EDI,
.id.hwversion = ENE_KB9012_HWVERSION,
.id.model = ENE_KB9012_EDIID,
.total_size = 128,
.page_size = 128,
.feature_bits = FEATURE_ERASED_ZERO,
.tested = TEST_OK_PREW,
.spi_cmd_set = SPI_EDI,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {128, 1024} },
.block_erase = edi_chip_block_erase,
},
},
.write = edi_chip_write,
.read = edi_chip_read,
.voltage = {2700, 3600},
.gran = write_gran_128bytes,
.prepare_access = edi_prepare,
},
{
.vendor = "ESI",
.name = "ES25P16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EXCEL_ID_NOPREFIX,
.id.model = EXCEL_ES25P16,
.total_size = 2 * 1024,
.page_size = 256,
/* 256-byte parameter page separate from memory array:
* supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast Read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "ESI",
.name = "ES25P40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EXCEL_ID_NOPREFIX,
.id.model = EXCEL_ES25P40,
.total_size = 512,
.page_size = 256,
/* 256-byte parameter page separate from memory array:
* supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast Read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "ESI",
.name = "ES25P80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EXCEL_ID_NOPREFIX,
.id.model = EXCEL_ES25P80,
.total_size = 1024,
.page_size = 256,
/* 256-byte parameter page separate from memory array:
* supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast Read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "ESMT",
.name = "F25L008A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ESMT_ID,
.id.model = ESMT_F25L008A,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "ESMT",
.name = "F25L32PA",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ESMT_ID,
.id.model = ESMT_F25L32PA,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_bpl,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "ESMT",
.name = "F49B002UA",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = ESMT_ID,
.id.model = ESMT_F49B002UA,
.total_size = 256,
.page_size = 4096,
.feature_bits = FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{128 * 1024, 1},
{96 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN25B05",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B05,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B05T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B05,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B10",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B10,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 3},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B10T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B10,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{32 * 1024, 3},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B16,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 31},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B16T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B16,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 31},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B20",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B20,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 3}
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B20T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B20,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B32,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 63},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B32T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B32,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 63},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 7}
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B40T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B64,
.total_size = 8192,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 127},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B64T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B64,
.total_size = 8192,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 127},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B80,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{4 * 1024, 2},
{8 * 1024, 1},
{16 * 1024, 1},
{32 * 1024, 1},
{64 * 1024, 15}
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25B80T",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B80,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 15},
{32 * 1024, 1},
{16 * 1024, 1},
{8 * 1024, 1},
{4 * 1024, 2},
},
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F05",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F05,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F10",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F10,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F16,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F20",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F20,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F32,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F64,
.total_size = 8192,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25F80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25F80,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P05",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B05,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{32 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P10",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B10,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B16,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P20",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B20,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P32", /* Uniform version of EN25B32 */
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B32,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B64,
.total_size = 8192,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25P80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25B80,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q128",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q128,
.total_size = 16384,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
},
{
/* Note: EN25D16 is an evil twin which shares the model ID
but has different write protection capabilities */
.vendor = "Eon",
.name = "EN25Q16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q16,
.total_size = 2048,
.page_size = 256,
/* OTP: D16 512B/Q16 128B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
/* not supported by Q16 version */
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q32(A/B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q32,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q40,
.total_size = 512,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q64,
.total_size = 8192,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25Q80(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25Q80,
.total_size = 1024,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Eon",
.name = "EN25QH128",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH128,
.total_size = 16384,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 16384 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 16384 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25QH16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH16,
.total_size = 2048,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 2048, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 2048, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25QH32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH32,
.total_size = 4096,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 4096, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 4096, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25QH32B",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH32,
.total_size = 4096,
.page_size = 256,
/* supports SFDP */
/* OTP: 1536B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_38,
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 4096, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 4096, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25QH64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH64,
.total_size = 8192,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25_64k_block,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25QH64A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25QH64,
.total_size = 8192,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0x3A */
/* Has a special, volatile status register 3 that is written with
0xc0 like Set Read Parameters. Hence treating as QPI_SRP. */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { { 8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { { 8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25S10",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S10,
.total_size = 128,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "Eon",
.name = "EN25S16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S16,
.total_size = 2048,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_en25s_wp,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25S20",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S20,
.total_size = 256,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "Eon",
.name = "EN25S32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S32,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_en25s_wp,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25S40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S40,
.total_size = 512,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "Eon",
.name = "EN25S64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S64,
.total_size = 8192,
.page_size = 256,
/* OTP: 512B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
.dummy_cycles =
{
.qpi_fast_read = 6,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_en25s_wp,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Eon",
.name = "EN25S80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = EON_ID_NOPREFIX,
.id.model = EON_EN25S80,
.total_size = 1024,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "Eon",
.name = "EN29F002(A)(N)B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = EON_ID,
.id.model = EON_EN29F002B,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29F002(A)(N)T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = EON_ID,
.id.model = EON_EN29F002T,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29F010",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = EON_ID,
.id.model = EON_EN29F010,
.total_size = 128,
.page_size = 128,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
},
{
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29GL064(A)B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = EON_ID,
.id.model = EON_EN29GL064B,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 127},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29GL064(A)T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = EON_ID,
.id.model = EON_EN29GL064T,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 127},
{8 * 1024, 8},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29GL064H/L",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = EON_ID,
.id.model = EON_EN29GL064HL,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29GL128",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = EON_ID,
.id.model = EON_EN29GL128HL,
.total_size = 16384,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {128 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29LV040(A)",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = EON_ID,
.id.model = EON_EN29LV040,
.total_size = 512,
.page_size = 4 * 1024,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
},
{
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Eon",
.name = "EN29LV640B",
.bustype = BUS_PARALLEL,
.id.type = ID_EN29LV640B,
.id.manufacture = EON_ID,
.id.model = EON_EN29LV640B,
.total_size = 8192,
.page_size = 8192,
.feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_OK_PREW,
.probe = probe_en29lv640b,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 127},
},
.block_erase = erase_block_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_en29lv640b,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Fudan",
.name = "FM25F005",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25F005,
.total_size = 64,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
},
{
.vendor = "Fudan",
.name = "FM25F01",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25F01,
.total_size = 128,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
},
{
.vendor = "Fudan",
.name = "FM25F02(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25F02,
.total_size = 256,
.page_size = 256,
/* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 256, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 256, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
},
{
.vendor = "Fudan",
.name = "FM25F04(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25F04,
.total_size = 512,
.page_size = 256,
/* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 512, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 512, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Fudan",
.name = "FM25Q02",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q02,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}},
.tb = {STATUS1, 5, RW},
.cmp = {STATUS2, 4, RW},
.wps = {STATUS2, 5, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q04",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q04,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.cmp = {STATUS2, 4, RW},
.wps = {STATUS2, 5, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q08",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q08,
.total_size = 1024,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q08A",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q08,
.total_size = 1024,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 4, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q16,
.total_size = 2048,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q32,
.total_size = 4096,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q64",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q64,
.total_size = 8192,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fudan",
.name = "FM25Q128",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = FUDAN_ID_NOPREFIX,
.id.model = FUDAN_FM25Q128,
.total_size = 16384,
.page_size = 256,
/* Supports full QIO/QPI but has non-volatile DC bits controlling all modes. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 |
FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16384 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16384 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.dc = {{STATUS2, 6, RW}, {STATUS2, 7, RW}},
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.cmp = {STATUS1, 6, RW},
.wps = {STATUS3, 2, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp2_tb_bpl,
.unlock = spi_disable_blockprotect_bp2_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Fujitsu",
.name = "MBM29F004BC",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29F004BC,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 7},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = NULL,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Fujitsu",
.name = "MBM29F004TC",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29F004TC,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = NULL,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
.vendor = "Fujitsu",
.name = "MBM29F400BC",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29F400BC,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 7},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Fujitsu",
.name = "MBM29F400TC",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29F400TC,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 7},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Fujitsu",
.name = "MBM29LV160BE",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29LV160BE,
.total_size = 2 * 1024,
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 31},
},
.block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Fujitsu",
.name = "MBM29LV160TE",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = FUJITSU_ID,
.id.model = FUJITSU_MBM29LV160TE,
.total_size = 2 * 1024,
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 31},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "GigaDevice",
.name = "GD25LF80E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LF80E,
.total_size = 1024,
.page_size = 256,
/* OTP: 3x 1024B; read 0x48; write 0x42, erase 0x44 */
/* Supports fast-read quad-i/o (0xeb) but with 10 dummy cycles. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP |
(FEATURE_QPI_SRP & ~FEATURE_FAST_READ_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 10 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LF16E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LF16E,
.total_size = 2048,
.page_size = 256,
/* OTP: 3x 1024B; read 0x48; write 0x42, erase 0x44 */
/* Supports fast-read quad-i/o (0xeb) but with 10 dummy cycles. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP |
(FEATURE_QPI_SRP & ~FEATURE_FAST_READ_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 10 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2048 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LF32E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LF32E,
.total_size = 4096,
.page_size = 256,
/* OTP: 3x 1024B; read 0x48; write 0x42, erase 0x44 */
/* Supports fast-read quad-i/o (0xeb) but with 10 dummy cycles. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP |
(FEATURE_QPI_SRP & ~FEATURE_FAST_READ_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 10 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4096 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LF64E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LF64E,
.total_size = 8192,
.page_size = 256,
/* OTP: 3x 1024B; read 0x48; write 0x42, erase 0x44 */
/* Supports fast-read quad-i/o (0xeb) but with 10 dummy cycles. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP |
(FEATURE_QPI_SRP & ~FEATURE_FAST_READ_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 10 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8192 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LF128E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LF128E,
.total_size = 16384,
.page_size = 256,
/* OTP: 3x 1024B; read 0x48; write 0x42, erase 0x44 */
/* Supports fast-read quad-i/o (0xeb) but with non-volatile DC bits. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | (FEATURE_QPI_SRP & ~FEATURE_FAST_READ_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 10 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16384 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16384 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ128CD,
.total_size = 16384,
.page_size = 256,
/* OTP: 3x 512B, later 3x 1024B; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ16",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ16,
.total_size = 2048,
.page_size = 256,
/* OTP: 1024B total, 256B reserved, later 3x 512B; read 0x48; write 0x42, erase 0x44 */
/* FEATURE_QPI_SRP(4, 4, 6, 8) except for L.16C */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950}, /* 16C, 16E: up to 2.1V */
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ20",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ20,
.total_size = 256,
.page_size = 256,
/* OTP: 3x 512B; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950}, /* 20C: up to 2.1V, 20E: up to 2.0V */
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ256D/GD25LE256D/GD25LB256D/GD25LQ255E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ256D,
.total_size = 32768,
.page_size = 256,
/* GD25LQ255E also supports native 4BA commands, EAR. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP |
FEATURE_4BA_ENTER | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25LB256D: Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW},
.sec = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ256H/GD25LE256H/GD25LB256F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ256D,
.total_size = 32768,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
/* LE256H supports DTR. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25LB256F: Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LE255E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ256D,
.total_size = 32768,
.page_size = 256,
/* Non-volatile DC bits control SPI mode, hence disable fast-read commands. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | (FEATURE_4BA & ~FEATURE_4BA_FAST_READ) |
FEATURE_FAST_READ_QPI4B | (FEATURE_QPI_SRP & ~FEATURE_QIO),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 0 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LB256E/GD25LR256E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LB256E,
.total_size = 32768,
.page_size = 256,
/* Has non-volatile DC bits in unsupported register, controlling QIO, QPI. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_4BA,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ32",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ32,
.total_size = 4096,
.page_size = 256,
/* OTP: 1024B total, 256B reserved, later 3x 1024B; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ40",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ40,
.total_size = 512,
.page_size = 256,
/* OTP: 1024B total, 256B reserved, later 3x 512B; read 0x48; write 0x42, erase 0x44 */
/* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ40B, LQ40C, LQ40E */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950}, /* 40C: up to 2.1V, 40E: up to 2.0V */
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ64(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ64,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total, 256B reserved, later 3x 1024B; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LQ80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LQ80,
.total_size = 1024,
.page_size = 256,
/* OTP: 1024B total, 256B reserved, later 3x 512B; read 0x48; write 0x42, erase 0x44 */
/* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ80B, LQ80C */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950}, /* 80C: up to 2.1V, 80E: up to 2.0V */
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LB512ME/GD25LR512ME",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LB512ME,
.total_size = 65536,
.page_size = 256,
/* Has non-volatile DC bits in unsupported register, controlling QIO, QPI. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_4BA,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25LB512MF/GD25LR512MF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25LB512MF,
.total_size = 65536,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55LB01GE",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55LB01GE,
.total_size = 128 * 1024,
.page_size = 256,
/* Has non-volatile DC bits in unsupported register, controlling QIO, QPI. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_4BA,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55LB01GF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55LB01GF,
.total_size = 128 * 1024,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55LB02GE",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55LB02GE,
.total_size = 256 * 1024,
.page_size = 256,
/* Has non-volatile DC bits in unsupported register, controlling QIO, QPI. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_4BA,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55LB02GF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55LB02GF,
.total_size = 256 * 1024,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q10",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q10,
.total_size = 128,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q127C/GD25B127D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q128B/GD25B128B",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25B128B: Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q128C",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_QPI_SRP,
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
.wps = {STATUS3, 2, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q128E/GD25B128E/GD25R128E/GD25Q128H/GD25B128H",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
/* Supports full QIO but has a non-volatile DC bit. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25B/R: Fixed QE=1 */
.dc = {{STATUS3, 0, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q16(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q16,
.total_size = 2048,
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q20(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q20,
.total_size = 256,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits = {
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q256D/GD25B256D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q256D,
.total_size = 32768,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP | FEATURE_4BA |
FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_QIO,
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25B256D: Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 6, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q257D/GD25B257D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q256D,
.total_size = 32768,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25B257D: Fixed QE=1 */
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q256E/GD25B256E/GD25R256E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q256D,
.total_size = 32768,
.page_size = 256,
/* Supports full QIO but has non-volatile DC bits. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ |
FEATURE_FAST_READ_DOUT | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW}, /* GD25B/R: Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 6, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q32(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q32,
.total_size = 4096,
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q40(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q40,
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q512",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q512,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q64(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q64,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 0, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
.tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
.sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
.cmp = {STATUS2, 6, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25Q80(B)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25Q80,
.total_size = 1024,
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25B512ME/GD25R512ME",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25B512ME,
.total_size = 65536,
.page_size = 256,
/* Supports QPI_38, but with non-volatile DC bits
(which probably also affect QIO (0xeb) in SPI mode). */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_FAST_READ_QPI4B | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {65536 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {65536 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25B512MF/GD25R512MF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25B512MF,
.total_size = 65536,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {65536 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {65536 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RO}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 6, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS3, 3, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55B01GE",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55B01GE,
.total_size = 128 * 1024,
.page_size = 256,
/* Supports QPI_38, but with non-volatile DC bits
(which probably also affect QIO (0xeb) in SPI mode). */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_FAST_READ_QPI4B | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55B01GF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55B01GF,
.total_size = 128 * 1024,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 32768} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 4096} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 2048} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RO}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 6, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS3, 3, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55B02GE",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55B02GE,
.total_size = 256 * 1024,
.page_size = 256,
/* Supports QPI_38, but with non-volatile DC bits
(which probably also affect QIO (0xeb) in SPI mode). */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_FAST_READ_QPI4B | FEATURE_FAST_READ_QOUT,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* Has WPS bit in unsupported register. */
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD55B02GF",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD55B02GF,
.total_size = 256 * 1024,
.page_size = 256,
/* Has non-volatile DC bits which affect DIO and QIO in SPI mode. */
.feature_bits = FEATURE_WRSR_EITHER | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
FEATURE_OTP | FEATURE_4BA | FEATURE_FAST_READ_QPI4B |
(FEATURE_QPI_SRP & ~(FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO)),
.dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 65536} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 8192} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 4096} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.reg_bits =
{
.qe = {STATUS2, 1, RO}, /* Fixed QE=1 */
.dc = {{STATUS3, 0, RW}, {STATUS3, 1, RW}},
.srp = {STATUS1, 7, RW},
.srl = {STATUS2, 6, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {STATUS1, 6, RW},
.cmp = {STATUS3, 3, RW},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25T80",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25T80,
.total_size = 1024,
.page_size = 256,
/* OTP: 256B total; enter 0x3A */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "GigaDevice",
.name = "GD25VQ16C",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25VQ16C,
.total_size = 2 * 1024,
.page_size = 256,
/* Supports SFDP */
/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25VQ21B",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25VQ21B,
.total_size = 256,
.page_size = 256,
/* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25VQ40C",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25VQ41B,
.total_size = 512,
.page_size = 256,
/* Supports SFDP */
/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25VQ41B",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25VQ41B,
.total_size = 512,
.page_size = 256,
/* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25VQ80C",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25VQ80C,
.total_size = 1024,
.page_size = 256,
/* Supports SFDP */
/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { { 4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { { 32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { { 64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "GigaDevice",
.name = "GD25WQ80E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = GIGADEVICE_ID,
.id.model = GIGADEVICE_GD25WQ80E,
.total_size = 1024,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS2, 1, RW},
},
.printlock = spi_prettyprint_status_register_bp4_srwd,
.unlock = spi_disable_blockprotect_bp4_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Hyundai",
.name = "HY29F002B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = HYUNDAI_ID,
.id.model = HYUNDAI_HY29F002B,
.total_size = 256,
.page_size = 256 * 1024,
.feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Hyundai",
.name = "HY29F002T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = HYUNDAI_ID,
.id.model = HYUNDAI_HY29F002T,
.total_size = 256,
.page_size = 256 * 1024,
.feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
.tested = TEST_OK_PRE,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Hyundai",
.name = "HY29F040A",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = HYUNDAI_ID,
.id.model = HYUNDAI_HY29F040A,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "ISSI",
.name = "IS25LP064",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25LP064,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total; read 0x48; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
},
{
.vendor = "ISSI",
.name = "IS25LP128",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25LP128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1024B total; read 0x48; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
},
{
.vendor = "ISSI",
.name = "IS25LP256",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25LP256,
.total_size = 32768,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
/* could also use spi_block_erase_d7 */
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2300, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "ISSI",
.name = "IS25WP032",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25WP032,
.total_size = 4096,
.page_size = 256,
/* OTP: 1024B total; read 0x48; write 0x42 */
/* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
dummy cycles; non-volatile read parameters, so disable for now */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "ISSI",
.name = "IS25WP064",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25WP064,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total; read 0x48; write 0x42 */
/* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
dummy cycles; non-volatile read parameters, so disable for now */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "ISSI",
.name = "IS25WP128",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25WP128,
.total_size = 16384,
.page_size = 256,
/* OTP: 1024B total; read 0x48; write 0x42 */
/* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
dummy cycles; non-volatile read parameters, so disable for now */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_d7,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
},
{
.vendor = "ISSI",
.name = "IS25WP256",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = ISSI_ID_SPI,
.id.model = ISSI_IS25WP256,
.total_size = 32768,
.page_size = 256,
/* supports SFDP */
/* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
/* could also use spi_block_erase_d7 */
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 1950},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "ISSI",
.name = "IS29GL064B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = ISSI_ID,
.id.model = ISSI_PMC_IS29GL064B,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 127},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "ISSI",
.name = "IS29GL064H/L",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = ISSI_ID,
.id.model = ISSI_PMC_IS29GL064HL,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "ISSI",
.name = "IS29GL064T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = ISSI_ID,
.id.model = ISSI_PMC_IS29GL064T,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 127},
{8 * 1024, 8},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "ISSI",
.name = "IS29GL128H/L",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = ISSI_ID,
.id.model = ISSI_PMC_IS29GL128HL,
.total_size = 16384,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {128 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "25F160S33B8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F160S33B8,
.total_size = 2048,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 31} // inaccessible
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "25F160S33T8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F160S33T8,
.total_size = 2048,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{64 * 1024, 31}, // inaccessible
{8 * 1024, 8}
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "25F320S33B8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F320S33B8,
.total_size = 4096,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 63} // inaccessible
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "25F320S33T8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F320S33T8,
.total_size = 4096,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{64 * 1024, 63}, // inaccessible
{8 * 1024, 8}
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "25F640S33B8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F640S33B8,
.total_size = 8192,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 127} // inaccessible
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "25F640S33T8",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = INTEL_ID,
.id.model = INTEL_25F640S33T8,
.total_size = 8192,
.page_size = 256,
/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
/* This chip supports erasing of the 8 so-called "parameter blocks" with
* opcode 0x40. Trying to access an address outside these 8 8kB blocks does
* have no effect on the memory contents, but sets a flag in the SR.
.eraseblocks = {
{64 * 1024, 127}, // inaccessible
{8 * 1024, 8}
},
.block_erase = spi_block_erase_40,
}, { */
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp2_ep_srwd,
.unlock = spi_disable_blockprotect_bp2_ep_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* also fast read 0x0B */
.voltage = {2700, 3600},
},
{
.vendor = "Intel",
.name = "28F001BN/BX-B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F001B,
.total_size = 128,
.page_size = 128 * 1024, /* 8k + 2x4k + 112k */
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 1},
{4 * 1024, 2},
{112 * 1024, 1},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F001BN/BX-T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F001T,
.total_size = 128,
.page_size = 128 * 1024, /* 112k + 2x4k + 8k */
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{112 * 1024, 1},
{4 * 1024, 2},
{8 * 1024, 1},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F002BC/BL/BV/BX-T",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F002T,
.total_size = 256,
.page_size = 256 * 1024,
.tested = TEST_OK_PRE,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{128 * 1024, 1},
{96 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F004B5/BE/BV/BX-B",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F004B,
.total_size = 512,
.page_size = 128 * 1024, /* maximal block size */
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{96 * 1024, 1},
{128 * 1024, 3},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F004B5/BE/BV/BX-T",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F004T,
.total_size = 512,
.page_size = 128 * 1024, /* maximal block size */
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{128 * 1024, 3},
{96 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F008S3/S5/SC",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F004S3,
.total_size = 512,
.page_size = 256,
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
},
},
.unlock = unlock_28f004s5,
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F400BV/BX/CE/CV-B",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F400B,
.total_size = 512,
.page_size = 128 * 1024, /* maximal block size */
.feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{96 * 1024, 1},
{128 * 1024, 3},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "28F400BV/BX/CE/CV-T",
.bustype = BUS_PARALLEL,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_28F400T,
.total_size = 512,
.page_size = 128 * 1024, /* maximal block size */
.feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_UNTESTED,
.probe = probe_82802ab,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
.block_erasers =
{
{
.eraseblocks = {
{128 * 1024, 3},
{96 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
},
},
.write = write_82802ab,
.read = read_memmapped,
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "82802AB",
.bustype = BUS_FWH,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_82802AB,
.total_size = 512,
.page_size = 64 * 1024,
.tested = TEST_OK_PREW,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
},
},
.unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Intel",
.name = "82802AC",
.bustype = BUS_FWH,
.id.type = ID_82802AB,
.id.manufacture = INTEL_ID,
.id.model = INTEL_82802AC,
.total_size = 1024,
.page_size = 64 * 1024,
.tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
},
},
.unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
.prepare_access = prepare_memory_register_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX23L12854",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX23L12854,
.total_size = 16384,
.page_size = 256,
.tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {3000, 3600},
},
{
.vendor = "Macronix",
.name = "MX23L1654",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX23L1654,
.total_size = 2048,
.page_size = 256,
.tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {3000, 3600},
},
{
.vendor = "Macronix",
.name = "MX23L3254",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX23L3254,
.total_size = 4096,
.page_size = 256,
.tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {3000, 3600},
},
{
.vendor = "Macronix",
.name = "MX23L6454",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX23L6454,
.total_size = 8192,
.page_size = 256,
.tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {3000, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L1005(C)/MX25L1006E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1005,
.total_size = 128,
.page_size = 256,
/* MX25L1006E supports SFDP */
/* FEATURE_FAST_READ_DOUT: MX25L1006E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 2} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L12805D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L12805D,
.total_size = 16384,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L12805D,
.total_size = 16384,
.page_size = 256,
/* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
/* *F versions: FEATURE_QPI_35 + DC bits (6, 4, 8, 10) in configuration register */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L1605",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1605,
.total_size = 2048,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L1605A/MX25L1606E/MX25L1608E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1605,
.total_size = 2048,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
/* FEATURE_FAST_READ_DOUT: MX25L1606E & MX25L1608E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L1605D/MX25L1608D/MX25L1673E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1605,
.total_size = 2048,
.page_size = 256,
/* FEATURE_QIO: MX25L1673E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L1635D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1635D,
.total_size = 2048,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L1635E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L1635E,
.total_size = 2048,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L2005(C)/MX25L2006E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L2005,
.total_size = 256,
.page_size = 256,
/* FEATURE_FAST_READ_DOUT: MX25L2006E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 4} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L25635F/MX25L25645G",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L25635F,
.total_size = 32768,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
.dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
.tested = TEST_OK_PREWB,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
.reg_bits = {
.qe = {STATUS1, 6, RW},
.dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
.srp = {STATUS1, 7, RW},
.bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
.tb = {CONFIG, 3, OTP},
},
.wp_write_cfg = spi_wp_write_cfg,
.wp_read_cfg = spi_wp_read_cfg,
.wp_get_ranges = spi_wp_get_available_ranges,
.decode_range = decode_range_spi25,
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L3205(A)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L3205,
.total_size = 4096,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L3205D/MX25L3208D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L3205,
.total_size = 4096,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L3206E/MX25L3208E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L3205,
.total_size = 4096,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L3235D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L3235D,
.total_size = 4096,
.page_size = 256,
/* OTP: 256B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
.tested = TEST_UNTESTED,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L3233F/MX25L3273E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L3205,
.total_size = 4096,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L4005(A/C)/MX25L4006E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L4005,
.total_size = 512,
.page_size = 256,
/* FEATURE_FAST_READ_DOUT: MX25L4006E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 8} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L512(E)/MX25V512(C)",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L512,
.total_size = 64,
.page_size = 256,
/* MX25L512E supports SFDP */
/* FEATURE_FAST_READ_DOUT: MX25L512E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
},
{
.vendor = "Macronix",
.name = "MX25L5121E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L5121E,
.total_size = 64,
.page_size = 32,
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp1_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L6405",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L6405,
.total_size = 8192,
.page_size = 256,
/* Has an additional 512B EEPROM sector */
.feature_bits = FEATURE_WRSR_WREN,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L6405D",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L6405,
.total_size = 8192,
.page_size = 256,
/* OTP: 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L6406E/MX25L6408E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L6405,
.total_size = 8192,
.page_size = 256,
/* MX25L6406E supports SFDP */
/* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L6405,
.total_size = 8192,
.page_size = 256,
/* supports SFDP */
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
/* FEATURE_QIO: MX25L6473E, MX25L6473F */
/* FEATURE_FAST_READ_DOUT, _QOUT: MX25L6436E */
/* FEATURE_FAST_READ_DIO, _QIO: MX25L6445E, MX25L6465E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25L6495F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L6495F,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
.voltage = {2700, 3600},
},
{
.vendor = "Macronix",
.name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25L8005,
.total_size = 1024,
.page_size = 256,
/* MX25L8006E, MX25L8008E support SFDP */
/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
/* FEATURE_FAST_READ_DOUT: MX25L8006E, MX25L8008E */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
},
},
.printlock = spi_prettyprint_status_register_bp2_srwd,
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
},
{
.vendor = "Macronix",
.name = "MX25R3235F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25R3235F,
.total_size = 4096,
.page_size = 256,
/* OTP: 1024B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25R6435F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25R6435F,
.total_size = 8192,
.page_size = 256,
/* OTP: 1024B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 3600},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U12835F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U12835E,
.total_size = 16384,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_35,
.dummy_cycles =
{
/* 133MHz version has configuration register
bit to toggle 8 dummy cycles for QIO, defaults: */
.qpi_fast_read = 4,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 4096} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 512} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 256} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256, /* Multi I/O supported */
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U1635E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U1635E,
.total_size = 2048,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
.dummy_cycles =
{
.qpi_fast_read = 4,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PR,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 512} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 64} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 32} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {2 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U25635F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U25635F,
.total_size = 32768,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
.dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 8192} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 1024} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 512} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {32 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
.dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256, /* Multi I/O supported */
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U3235E/F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U3235E,
.total_size = 4096,
.page_size = 256,
/* F model supports SFDP, FAST_READ_DOUT/_QOUT */
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
.dummy_cycles =
{
.qpi_fast_read = 4,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 1024} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 128} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U51245G",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U51245G,
.total_size = 65536,
.page_size = 256,
/* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
.dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
.dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256, /* Multi I/O supported */
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U6435E/F",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U6435E,
.total_size = 8192,
.page_size = 256,
/* F model supports SFDP, FAST_READ_DOUT/_QOUT */
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
.dummy_cycles =
{
.qpi_fast_read = 4,
.qpi_fast_read_qio = 6,
},
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 2048} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 256} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 128} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX25U8032E",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX25U8032E,
.total_size = 1024,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 256} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 32} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 16} },
.block_erase = spi_block_erase_d8,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {1024 * 1024, 1} },
.block_erase = spi_block_erase_c7,
}
},
/* TODO: security register */
.reg_bits =
{
.qe = {STATUS1, 6, RW},
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
.unlock = spi_disable_blockprotect_bp3_srwd,
.write = spi_chip_write_256,
.read = spi_chip_read,
.voltage = {1650, 2000},
.prepare_access = spi_prepare_io,
.finish_access = spi_finish_io,
},
{
.vendor = "Macronix",
.name = "MX29F001B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F001B,
.total_size = 128,
.page_size = 32 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 1},
{4 * 1024, 2},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F001T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F001T,
.total_size = 128,
.page_size = 32 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 1},
{32 * 1024, 1},
{8 * 1024, 2},
{4 * 1024, 2},
{8 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F002(N)B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F002B,
.total_size = 256,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F002(N)T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F002T,
.total_size = 256,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F022(N)B",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F022B,
.total_size = 256,
.page_size = 0, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{16 * 1024, 1},
{8 * 1024, 2},
{32 * 1024, 1},
{64 * 1024, 3},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F022(N)T",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F022T,
.total_size = 256,
.page_size = 0, /* unused */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_OK_PREW,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 3},
{32 * 1024, 1},
{8 * 1024, 2},
{16 * 1024, 1},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {256 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
}
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29F040",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29F040,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL128F",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL128F,
.total_size = 16384,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {128 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {16 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL320EB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL320EB,
.total_size = 4096,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 63},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL320EH/L",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL320EHL,
.total_size = 4096,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 64} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL320ET",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL320ET,
.total_size = 4096,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 63},
{8 * 1024, 8},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {4 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL640EB",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL640EB,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{8 * 1024, 8},
{64 * 1024, 127},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL640EH/L",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL640EHL,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 128} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29GL640ET",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC_29GL,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29GL640ET,
.total_size = 8192,
.page_size = 128 * 1024, /* actual page size is 16 */
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec_29gl,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = {
{64 * 1024, 127},
{8 * 1024, 8},
},
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX29LV040",
.bustype = BUS_PARALLEL,
.id.type = ID_JEDEC,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX29LV040,
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
.block_erase = erase_chip_block_jedec,
},
},
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {2700, 3600},
.prepare_access = prepare_memory_access,
.finish_access = finish_memory_access,
},
{
.vendor = "Macronix",
.name = "MX66L51235F/MX25L51245G",
.bustype = BUS_SPI,
.id.type = ID_SPI_RDID,
.id.manufacture = MACRONIX_ID,
.id.model = MACRONIX_MX66L51235F,
.total_size = 65536,
.page_size = 256,
/* OTP: 512B total; enter 0xB1, exit 0xC1 */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
.tested = TEST_OK_PREW,
.probe = probe_buses,
.probe_timing = TIMING_ZERO,
.block_erasers =
{
{
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_21,
}, {
.eraseblocks = { {4 * 1024, 16384} },
.block_erase = spi_block_erase_20,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_5c,
}, {
.eraseblocks = { {32 * 1024, 2048} },
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {64 * 1024, 1024} },
.block_erase = spi_block_erase_dc,
},