/* * 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 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger * Copyright (C) 2009 Sean Nelson * * 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. */ { .vendor = "Winbond", .name = "W25P16", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25P16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .block_erasers = { { .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25P32", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25P32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .probe_timing = TIMING_ZERO, .block_erasers = { { .eraseblocks = { {64 * 1024, 64} }, .block_erase = SPI_BLOCK_ERASE_D8, }, { .eraseblocks = { {4096 * 1024, 1} }, .block_erase = SPI_BLOCK_ERASE_C7, } }, .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25P80", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25P80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .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_WRITE256, .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25Q128.V", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q128_V, .total_size = 16384, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q128.V..M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q128_V_M, .total_size = 16384, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q128.W", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q128_W, .total_size = 16384, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q128.JW.DTR", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q128_DTR, .total_size = 16384, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q16JV_M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q16JV_M, .total_size = 2048, .page_size = 256, /* supports SFDP */ /* OTP: 3x 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .srp = {STATUS1, 7, RW}, .sec = {STATUS1, 6, RW}, .tb = {STATUS1, 5, RW}, .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, .cmp = {STATUS2, 6, RW}, .srl = {STATUS2, 0, RW}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q16.V", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q16_V, .total_size = 2048, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q16.W", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q16_W, .total_size = 2048, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25Q20.W", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q20_W, .total_size = 256, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25Q256FV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q256_V, .total_size = 32768, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ | FEATURE_WRSR2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q256JV_Q", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q256_V, .total_size = 32768, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2, .tested = TEST_UNTESTED, .probe = PROBE_SPI_RDID, .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_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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q256JV_M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q256JV_M, .total_size = 32768, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q256JW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q256_W, .total_size = 32768, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, }, { .vendor = "Winbond", .name = "W25R512NW/W74M51NW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25R512NW, .total_size = 65536, .page_size = 256, /* supports SFDP */ /* OTP: 3X256B; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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 = { {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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, }, { .vendor = "Winbond", .name = "W25Q256JW_DTR", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q256_DTR, .total_size = 32768, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_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_BP3_SRWD, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32BV/W25Q32CV/W25Q32DV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_V, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32FV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_V, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32JV_M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32JV_M, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 3x 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .srp = {STATUS1, 7, RW}, .sec = {STATUS1, 6, RW}, .tb = {STATUS1, 5, RW}, .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, .cmp = {STATUS2, 6, RW}, .srl = {STATUS2, 0, RW}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32JV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_V, .total_size = 4096, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32BW/W25Q32CW/W25Q32DW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_W, .total_size = 4096, .page_size = 256, /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR_EXT2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32FW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_W, .total_size = 4096, .page_size = 256, /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32JW...Q", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32_W, .total_size = 4096, .page_size = 256, /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q32JW...M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q32JW_M, .total_size = 4096, .page_size = 256, /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q40.V", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q40_V, .total_size = 512, .page_size = 256, /* supports SFDP */ /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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 */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25Q40BW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q40BW, .total_size = 512, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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 */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25Q40EW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q40EW, .total_size = 512, .page_size = 256, /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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 */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25Q512JV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q512JV, .total_size = 64 * 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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 = { {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_PLAIN, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25Q512NW-IM", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q512NW_IM, .total_size = 64 * 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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 = { {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, } }, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q64BV/W25Q64CV/W25Q64FV", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q64_V, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q64JV-.Q", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q64_V, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q64JV-.M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q64JV, .total_size = 8192, .page_size = 256, /* supports SFDP */ /* QPI enable 0x38 */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_BP2_TB_BPL, .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25Q64.W", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q64_W, .total_size = 8192, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ .reg_bits = { .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q64JW...M", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q64JW_M, .total_size = 8192, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ /* QPI enable 0x38, disable 0xFF */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_SRWD_SEC_TB_BP2_WELWIP, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ .reg_bits = { .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}, .wps = {STATUS3, 2, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25Q80.V", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q80_V, .total_size = 1024, .page_size = 256, /* supports SFDP */ /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W25Q80BW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q80BW, .total_size = 1024, .page_size = 256, /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25Q80EW", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25Q80EW, .total_size = 1024, .page_size = 256, /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ }, { .vendor = "Winbond", .name = "W25X05", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X05, .total_size = 64, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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, } }, .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2300, 3600}, .reg_bits = { /* W25X05 is single 64KiB block without any smaller WP granularity */ /* According to datasheet W25X05 has 2 BP bits, any non-zero value protects ALL.*/ .srp = {STATUS1, 7, RW}, .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X10", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X10, .total_size = 128, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .srp = {STATUS1, 7, RW}, .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, .tb = {STATUS1, 5, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X16", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X16, .total_size = 2048, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X20", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X20, .total_size = 256, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREWB, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .read = SPI_CHIP_READ, .voltage = {2700, 3600}, .reg_bits = { .srp = {STATUS1, 7, RW}, .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, .tb = {STATUS1, 5, RW}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X32", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X32, .total_size = 4096, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X40", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X40, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X64", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X64, .total_size = 8192, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .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}, }, .decode_range = DECODE_RANGE_SPI25, }, { .vendor = "Winbond", .name = "W25X80", .bustype = BUS_SPI, .manufacture_id = WINBOND_NEX_ID, .model_id = WINBOND_NEX_W25X80, .total_size = 1024, .page_size = 256, .feature_bits = FEATURE_WRSR_WREN, .tested = TEST_OK_PREW, .probe = PROBE_SPI_RDID, .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_PLAIN, /* TODO: improve */ .unlock = SPI_DISABLE_BLOCKPROTECT, .write = SPI_CHIP_WRITE256, .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}, }, .decode_range = DECODE_RANGE_SPI25, }, /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */ { .vendor = "Winbond", .name = "W29C010(M)/W29C011A/W29EE011/W29EE012", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W29C010, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, /* used datasheet for the W29C011A */ .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC, .read = READ_MEMMAPPED, }, { .vendor = "Winbond", .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W29C010, .total_size = 128, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, .probe = PROBE_W29EE011, .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */ .block_erasers = { { .eraseblocks = { {128 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC, .read = READ_MEMMAPPED, }, { .vendor = "Winbond", .name = "W29C020(C)/W29C022", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W29C020, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W29C040/P", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W29C040, .total_size = 512, .page_size = 256, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_UNTESTED, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W29C512A/W29EE512", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W29C512A, .total_size = 64, .page_size = 128, .feature_bits = FEATURE_LONG_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W29GL032CB", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL032CB, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL032CH/L", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL032CHL, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL032CT", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL032CT, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {4 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL064CB", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL064CB, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL064CH/L", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL064CHL, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL064CT", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL064CT, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {8 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W29GL128C", .bustype = BUS_PARALLEL, .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ .model_id = WINBOND_W29GL128CHL, .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 = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {16 * 1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, }, }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {2700, 3600}, }, { .vendor = "Winbond", .name = "W39F010", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39F010, .total_size = 128, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = JEDEC_BLOCK_ERASE, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39F010, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W39L010", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39L010, .total_size = 128, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {4 * 1024, 32} }, .block_erase = JEDEC_BLOCK_ERASE, }, { .eraseblocks = { {128 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39L010, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39L020", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39L020, .total_size = 256, .page_size = 4 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {4 * 1024, 64} }, .block_erase = JEDEC_BLOCK_ERASE, }, { .eraseblocks = { {64 * 1024, 4} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39L020, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39L040", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39L040, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PR, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = JEDEC_BLOCK_ERASE, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39L040, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V040A", .bustype = BUS_LPC, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040A, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040A, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V040B", .bustype = BUS_LPC, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040B, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V040C", .bustype = BUS_LPC, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040C, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040C, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V040FA", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040FA, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {4 * 1024, 128} }, .block_erase = JEDEC_BLOCK_ERASE, }, { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040FA, .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V040FB", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040B, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040FB, .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, /* Also has 12V fast program */ }, { .vendor = "Winbond", .name = "W39V040FC", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V040C, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V040FC, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, /* Also has 12V fast program */ }, { .vendor = "Winbond", .name = "W39V080A", .bustype = BUS_LPC, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V080A, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V080A, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W39V080FA", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V080FA, .total_size = 1024, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 16} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {1024 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V080FA, .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, /* Also has 12V fast program */ }, { .vendor = "Winbond", .name = "W39V080FA (dual mode)", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W39V080FA_DM, .total_size = 512, .page_size = 64 * 1024, .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, .tested = TEST_UNTESTED, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 8} }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {512 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .printlock = PRINTLOCK_W39V080FA_DUAL, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, /* Also has 12V fast program */ }, { .vendor = "Winbond", .name = "W49F002U/N", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W49F002U, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {128 * 1024, 1}, {96 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W49F020", .bustype = BUS_PARALLEL, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W49F020, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PROBE, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {4500, 5500}, }, { .vendor = "Winbond", .name = "W49V002A", .bustype = BUS_LPC, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W49V002A, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, }, { .vendor = "Winbond", .name = "W49V002FA", .bustype = BUS_FWH, .manufacture_id = WINBOND_ID, .model_id = WINBOND_W49V002FA, .total_size = 256, .page_size = 128, .feature_bits = FEATURE_EITHER_RESET, .tested = TEST_OK_PREW, .probe = PROBE_JEDEC, .probe_timing = 10, .block_erasers = { { .eraseblocks = { {64 * 1024, 3}, {32 * 1024, 1}, {8 * 1024, 2}, {16 * 1024, 1}, }, .block_erase = JEDEC_SECTOR_ERASE, }, { .eraseblocks = { {256 * 1024, 1} }, .block_erase = JEDEC_CHIP_BLOCK_ERASE, } }, .write = WRITE_JEDEC1, .read = READ_MEMMAPPED, .voltage = {3000, 3600}, },