1 /* 2 * This file is part of the flashrom project. 3 * 4 * Copyright (C) 2000 Silicon Integrated System Corporation 5 * Copyright (C) 2004 Tyan Corp 6 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org> 7 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger 8 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 */ 20 21 #include "flash.h" 22 #include "flashchips.h" 23 #include "chipdrivers.h" 24 25 /** 26 * List of supported flash chips. 27 * 28 * Temporarily, this file is sorted alphabetically by vendor and name to 29 * assist with merging the Chromium fork of flashrom. 30 * 31 * The usual intention is that that this list is sorted by vendor, then chip 32 * family and chip density, which is useful for the output of 'flashrom -L'. 33 */ 34 const struct flashchip flashchips[] = { 35 36 /* BlockSampler_Init(BlockSampler bs,BlockNumber nblocks,int samplesize,long randseed)37 * .vendor = Vendor name 38 * .name = Chip name 39 * .bustype = Supported flash bus types (Parallel, LPC...) 40 * .manufacture_id = Manufacturer chip ID 41 * .model_id = Model chip ID 42 * .total_size = Total size in (binary) kbytes 43 * .page_size = Page or eraseblock(?) size in bytes 44 * .tested = Test status 45 * .probe = Probe function 46 * .probe_timing = Probe function delay 47 * .block_erasers[] = Array of erase layouts and erase functions 48 * { 49 * .eraseblocks[] = Array of { blocksize, blockcount } 50 * .block_erase = Block erase function 51 * } 52 * .printlock = Chip lock status function 53 * .unlock = Chip unlock function 54 * .write = Chip write function 55 * .read = Chip read function 56 * .voltage = Voltage range in millivolt 57 */ 58 59 { 60 .vendor = "AMD", 61 .name = "Am29F002(N)BB", 62 .bustype = BUS_PARALLEL, 63 .manufacture_id = AMD_ID, 64 .model_id = AMD_AM29F002BB, 65 .total_size = 256, 66 .page_size = 256, 67 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA, 68 .tested = TEST_UNTESTED, 69 .probe = probe_jedec, 70 .probe_timing = TIMING_ZERO, 71 .block_erasers = 72 { 73 { 74 .eraseblocks = { 75 {16 * 1024, 1}, 76 {8 * 1024, 2}, 77 {32 * 1024, 1}, 78 {64 * 1024, 3}, 79 }, 80 .block_erase = erase_sector_jedec, 81 }, { 82 .eraseblocks = { {256 * 1024, 1} }, 83 .block_erase = erase_chip_block_jedec, 84 }, 85 }, 86 .write = write_jedec_1, 87 .read = read_memmapped, 88 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 89 }, 90 91 { 92 .vendor = "AMD", 93 .name = "Am29F002(N)BT", 94 .bustype = BUS_PARALLEL, 95 .manufacture_id = AMD_ID, 96 .model_id = AMD_AM29F002BT, 97 .total_size = 256, 98 .page_size = 256, 99 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA, 100 .tested = TEST_UNTESTED, 101 .probe = probe_jedec, 102 .probe_timing = TIMING_ZERO, 103 .block_erasers = 104 { 105 { 106 .eraseblocks = { 107 {64 * 1024, 3}, 108 {32 * 1024, 1}, 109 {8 * 1024, 2}, 110 {16 * 1024, 1}, 111 }, 112 .block_erase = erase_sector_jedec, 113 }, { 114 .eraseblocks = { {256 * 1024, 1} }, 115 .block_erase = erase_chip_block_jedec, 116 }, 117 }, 118 .write = write_jedec_1, 119 .read = read_memmapped, 120 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 121 }, 122 123 { 124 .vendor = "AMD", 125 .name = "Am29F010", 126 .bustype = BUS_PARALLEL, 127 .manufacture_id = AMD_ID, 128 .model_id = AMD_AM29F010, reservoir_init_selection_state(ReservoirState rs,int n)129 .total_size = 128, 130 .page_size = 16 * 1024, 131 .feature_bits = FEATURE_SHORT_RESET, 132 .tested = TEST_UNTESTED, 133 .probe = probe_jedec, 134 .probe_timing = TIMING_ZERO, 135 .block_erasers = 136 { 137 { 138 .eraseblocks = { {16 * 1024, 8} }, 139 .block_erase = erase_sector_jedec, 140 }, { 141 .eraseblocks = { {128 * 1024, 1} }, 142 .block_erase = erase_chip_block_jedec, 143 }, 144 }, 145 .write = write_jedec_1, 146 .read = read_memmapped, 147 .voltage = {4500, 5500}, 148 }, 149 150 { 151 .vendor = "AMD", 152 .name = "Am29F010A/B", 153 .bustype = BUS_PARALLEL, 154 .manufacture_id = AMD_ID, 155 .model_id = AMD_AM29F010, 156 .total_size = 128, 157 .page_size = 16 * 1024, 158 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 159 .tested = TEST_OK_PRE, 160 .probe = probe_jedec, 161 .probe_timing = TIMING_ZERO, 162 .block_erasers = 163 { 164 { 165 .eraseblocks = { {16 * 1024, 8} }, 166 .block_erase = erase_sector_jedec, 167 }, { 168 .eraseblocks = { {128 * 1024, 1} }, 169 .block_erase = erase_chip_block_jedec, 170 }, 171 }, 172 .write = write_jedec_1, 173 .read = read_memmapped, 174 .voltage = {4500, 5500}, 175 }, 176 177 { 178 .vendor = "AMD", 179 .name = "Am29F016D", 180 .bustype = BUS_PARALLEL, 181 .manufacture_id = AMD_ID, 182 .model_id = AMD_AM29F016D, 183 .total_size = 2 * 1024, 184 .page_size = 64 * 1024, 185 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 186 .tested = TEST_UNTESTED, 187 .probe = probe_jedec, 188 .probe_timing = TIMING_ZERO, 189 .block_erasers = 190 { 191 { 192 .eraseblocks = { {64 * 1024, 32} }, 193 .block_erase = erase_sector_jedec, 194 }, { 195 .eraseblocks = { {2048 * 1024, 1} }, 196 .block_erase = erase_chip_block_jedec, 197 }, 198 }, 199 .write = write_jedec_1, 200 .read = read_memmapped, 201 .voltage = {4500, 5500}, 202 }, 203 204 { 205 .vendor = "AMD", 206 .name = "Am29F040", 207 .bustype = BUS_PARALLEL, 208 .manufacture_id = AMD_ID, 209 .model_id = AMD_AM29F040, 210 .total_size = 512, 211 .page_size = 64 * 1024, 212 .feature_bits = FEATURE_EITHER_RESET, 213 .tested = TEST_UNTESTED, 214 .probe = probe_jedec, 215 .probe_timing = TIMING_ZERO, 216 .block_erasers = 217 { 218 { 219 .eraseblocks = { {64 * 1024, 8} }, 220 .block_erase = erase_sector_jedec, 221 }, { 222 .eraseblocks = { {512 * 1024, 1} }, 223 .block_erase = erase_chip_block_jedec, 224 }, 225 }, 226 .write = write_jedec_1, 227 .read = read_memmapped, 228 .voltage = {4500, 5500}, sampler_random_init_state(long seed,SamplerRandomState randstate)229 }, 230 231 { 232 .vendor = "AMD", 233 .name = "Am29F040B", 234 .bustype = BUS_PARALLEL, 235 .manufacture_id = AMD_ID, 236 .model_id = AMD_AM29F040, 237 .total_size = 512, 238 .page_size = 64 * 1024, 239 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 240 .tested = TEST_UNTESTED, 241 .probe = probe_jedec, 242 .probe_timing = TIMING_ZERO, 243 .block_erasers = 244 { 245 { 246 .eraseblocks = { {64 * 1024, 8} }, 247 .block_erase = erase_sector_jedec, 248 }, { 249 .eraseblocks = { {512 * 1024, 1} }, 250 .block_erase = erase_chip_block_jedec, 251 }, 252 }, 253 .write = write_jedec_1, 254 .read = read_memmapped, 255 .voltage = {4500, 5500}, 256 }, 257 258 { 259 .vendor = "AMD", 260 .name = "Am29F080", 261 .bustype = BUS_PARALLEL, anl_random_fract(void)262 .manufacture_id = AMD_ID, 263 .model_id = AMD_AM29F080, 264 .total_size = 1024, 265 .page_size = 64 * 1024, 266 .feature_bits = FEATURE_EITHER_RESET, 267 .tested = TEST_UNTESTED, 268 .probe = probe_jedec, 269 .probe_timing = TIMING_ZERO, 270 .block_erasers = 271 { 272 { 273 .eraseblocks = { {64 * 1024, 16} }, 274 .block_erase = erase_sector_jedec, 275 }, { 276 .eraseblocks = { {1024 * 1024, 1} }, 277 .block_erase = erase_chip_block_jedec, 278 }, 279 }, 280 .write = write_jedec_1, 281 .read = read_memmapped, 282 .voltage = {4500, 5500}, 283 }, anl_get_next_S(double t,int n,double * stateptr)284 285 { 286 .vendor = "AMD", 287 .name = "Am29F080B", 288 .bustype = BUS_PARALLEL, 289 .manufacture_id = AMD_ID, 290 .model_id = AMD_AM29F080, 291 .total_size = 1024, 292 .page_size = 64 * 1024, 293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 294 .tested = TEST_UNTESTED, 295 .probe = probe_jedec, 296 .probe_timing = TIMING_ZERO, 297 .block_erasers = 298 { 299 { 300 .eraseblocks = { {64 * 1024, 16} }, 301 .block_erase = erase_sector_jedec, 302 }, { 303 .eraseblocks = { {1024 * 1024, 1} }, 304 .block_erase = erase_chip_block_jedec, 305 }, 306 }, 307 .write = write_jedec_1, 308 .read = read_memmapped, 309 .voltage = {4500, 5500}, 310 }, 311 312 { 313 .vendor = "AMD", 314 .name = "Am29LV001BB", 315 .bustype = BUS_PARALLEL, 316 .manufacture_id = AMD_ID, 317 .model_id = AMD_AM29LV001BB, 318 .total_size = 128, 319 .page_size = 64 * 1024, /* unused */ 320 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 321 .tested = TEST_OK_PREW, 322 .probe = probe_jedec, 323 .probe_timing = TIMING_ZERO, 324 .block_erasers = 325 { 326 { 327 .eraseblocks = { 328 {8 * 1024, 1}, 329 {4 * 1024, 2}, 330 {16 * 1024, 7}, 331 }, 332 .block_erase = erase_sector_jedec, 333 }, { 334 .eraseblocks = { {128 * 1024, 1} }, 335 .block_erase = erase_chip_block_jedec, 336 }, 337 }, 338 .write = write_jedec_1, 339 .read = read_memmapped, 340 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */ 341 }, 342 343 { 344 .vendor = "AMD", 345 .name = "Am29LV001BT", 346 .bustype = BUS_PARALLEL, 347 .manufacture_id = AMD_ID, 348 .model_id = AMD_AM29LV001BT, 349 .total_size = 128, 350 .page_size = 64 * 1024, /* unused */ 351 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 352 .tested = TEST_UNTESTED, 353 .probe = probe_jedec, 354 .probe_timing = TIMING_ZERO, 355 .block_erasers = 356 { 357 { 358 .eraseblocks = { 359 {16 * 1024, 7}, 360 {4 * 1024, 2}, 361 {8 * 1024, 1}, 362 }, 363 .block_erase = erase_sector_jedec, 364 }, { 365 .eraseblocks = { {128 * 1024, 1} }, 366 .block_erase = erase_chip_block_jedec, 367 }, 368 }, 369 .write = write_jedec_1, 370 .read = read_memmapped, 371 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */ 372 }, 373 374 { 375 .vendor = "AMD", 376 .name = "Am29LV002BB", 377 .bustype = BUS_PARALLEL, 378 .manufacture_id = AMD_ID, 379 .model_id = AMD_AM29LV002BB, 380 .total_size = 256, 381 .page_size = 64 * 1024, /* unused */ 382 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 383 .tested = TEST_UNTESTED, 384 .probe = probe_jedec, 385 .probe_timing = TIMING_ZERO, 386 .block_erasers = 387 { 388 { 389 .eraseblocks = { 390 {16 * 1024, 1}, 391 {8 * 1024, 2}, 392 {32 * 1024, 1}, 393 {64 * 1024, 3}, 394 }, 395 .block_erase = erase_sector_jedec, 396 }, { 397 .eraseblocks = { {256 * 1024, 1} }, 398 .block_erase = erase_chip_block_jedec, 399 }, 400 }, 401 .write = write_jedec_1, 402 .read = read_memmapped, 403 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */ 404 }, 405 406 { 407 .vendor = "AMD", 408 .name = "Am29LV002BT", 409 .bustype = BUS_PARALLEL, 410 .manufacture_id = AMD_ID, 411 .model_id = AMD_AM29LV002BT, 412 .total_size = 256, 413 .page_size = 64 * 1024, /* unused */ 414 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 415 .tested = TEST_UNTESTED, 416 .probe = probe_jedec, 417 .probe_timing = TIMING_ZERO, 418 .block_erasers = 419 { 420 { 421 .eraseblocks = { 422 {64 * 1024, 3}, 423 {32 * 1024, 1}, 424 {8 * 1024, 2}, 425 {16 * 1024, 1}, 426 }, 427 .block_erase = erase_sector_jedec, 428 }, { 429 .eraseblocks = { {256 * 1024, 1} }, 430 .block_erase = erase_chip_block_jedec, 431 }, 432 }, 433 .write = write_jedec_1, 434 .read = read_memmapped, 435 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */ 436 }, 437 438 { 439 .vendor = "AMD", 440 .name = "Am29LV004BB", 441 .bustype = BUS_PARALLEL, 442 .manufacture_id = AMD_ID, 443 .model_id = AMD_AM29LV004BB, 444 .total_size = 512, 445 .page_size = 64 * 1024, /* unused */ 446 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 447 .tested = TEST_UNTESTED, 448 .probe = probe_jedec, 449 .probe_timing = TIMING_ZERO, 450 .block_erasers = 451 { 452 { 453 .eraseblocks = { 454 {16 * 1024, 1}, 455 {8 * 1024, 2}, 456 {32 * 1024, 1}, 457 {64 * 1024, 7}, 458 }, 459 .block_erase = erase_sector_jedec, 460 }, { 461 .eraseblocks = { {512 * 1024, 1} }, 462 .block_erase = erase_chip_block_jedec, 463 }, 464 }, 465 .write = write_jedec_1, 466 .read = read_memmapped, 467 .voltage = {2700, 3600}, 468 }, 469 470 { 471 .vendor = "AMD", 472 .name = "Am29LV004BT", 473 .bustype = BUS_PARALLEL, 474 .manufacture_id = AMD_ID, 475 .model_id = AMD_AM29LV004BT, 476 .total_size = 512, 477 .page_size = 64 * 1024, /* unused */ 478 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 479 .tested = TEST_UNTESTED, 480 .probe = probe_jedec, 481 .probe_timing = TIMING_ZERO, 482 .block_erasers = 483 { 484 { 485 .eraseblocks = { 486 {64 * 1024, 7}, 487 {32 * 1024, 1}, 488 {8 * 1024, 2}, 489 {16 * 1024, 1}, 490 }, 491 .block_erase = erase_sector_jedec, 492 }, { 493 .eraseblocks = { {512 * 1024, 1} }, 494 .block_erase = erase_chip_block_jedec, 495 }, 496 }, 497 .write = write_jedec_1, 498 .read = read_memmapped, 499 .voltage = {2700, 3600}, 500 }, 501 502 { 503 .vendor = "AMD", 504 .name = "Am29LV008BB", 505 .bustype = BUS_PARALLEL, 506 .manufacture_id = AMD_ID, 507 .model_id = AMD_AM29LV008BB, 508 .total_size = 1024, 509 .page_size = 64 * 1024, /* unused */ 510 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 511 .tested = TEST_OK_PREW, 512 .probe = probe_jedec, 513 .probe_timing = TIMING_ZERO, 514 .block_erasers = 515 { 516 { 517 .eraseblocks = { 518 {16 * 1024, 1}, 519 {8 * 1024, 2}, 520 {32 * 1024, 1}, 521 {64 * 1024, 15}, 522 }, 523 .block_erase = erase_sector_jedec, 524 }, { 525 .eraseblocks = { {1024 * 1024, 1} }, 526 .block_erase = erase_chip_block_jedec, 527 }, 528 }, 529 .write = write_jedec_1, 530 .read = read_memmapped, 531 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */ 532 }, 533 534 { 535 .vendor = "AMD", 536 .name = "Am29LV008BT", 537 .bustype = BUS_PARALLEL, 538 .manufacture_id = AMD_ID, 539 .model_id = AMD_AM29LV008BT, 540 .total_size = 1024, 541 .page_size = 64 * 1024, /* unused */ 542 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 543 .tested = TEST_UNTESTED, 544 .probe = probe_jedec, 545 .probe_timing = TIMING_ZERO, 546 .block_erasers = 547 { 548 { 549 .eraseblocks = { 550 {64 * 1024, 15}, 551 {32 * 1024, 1}, 552 {8 * 1024, 2}, 553 {16 * 1024, 1}, 554 }, 555 .block_erase = erase_sector_jedec, 556 }, { 557 .eraseblocks = { {1024 * 1024, 1} }, 558 .block_erase = erase_chip_block_jedec, 559 }, 560 }, 561 .write = write_jedec_1, 562 .read = read_memmapped, 563 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */ 564 }, 565 566 { 567 .vendor = "AMD", 568 .name = "Am29LV040B", 569 .bustype = BUS_PARALLEL, 570 .manufacture_id = AMD_ID, 571 .model_id = AMD_AM29LV040B, 572 .total_size = 512, 573 .page_size = 64 * 1024, 574 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 575 .tested = TEST_OK_PRE, 576 .probe = probe_jedec, 577 .probe_timing = TIMING_ZERO, 578 .block_erasers = 579 { 580 { 581 .eraseblocks = { {64 * 1024, 8} }, 582 .block_erase = erase_sector_jedec, 583 }, { 584 .eraseblocks = { {512 * 1024, 1} }, 585 .block_erase = erase_chip_block_jedec, 586 }, 587 }, 588 .write = write_jedec_1, 589 .read = read_memmapped, 590 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/ 591 }, 592 593 { 594 .vendor = "AMD", 595 .name = "Am29LV081B", 596 .bustype = BUS_PARALLEL, 597 .manufacture_id = AMD_ID, 598 .model_id = AMD_AM29LV080B, 599 .total_size = 1024, 600 .page_size = 64 * 1024, 601 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */ 602 .tested = TEST_UNTESTED, 603 .probe = probe_jedec, 604 .probe_timing = TIMING_ZERO, 605 .block_erasers = 606 { 607 { 608 .eraseblocks = { {64 * 1024, 16} }, 609 .block_erase = erase_sector_jedec, 610 }, { 611 .eraseblocks = { {1024 * 1024, 1} }, 612 .block_erase = erase_chip_block_jedec, 613 }, 614 }, 615 .write = write_jedec_1, 616 .read = read_memmapped, 617 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */ 618 }, 619 620 { 621 .vendor = "AMIC", 622 .name = "A25L010", 623 .bustype = BUS_SPI, 624 .manufacture_id = AMIC_ID_NOPREFIX, 625 .model_id = AMIC_A25L010, 626 .total_size = 128, 627 .page_size = 256, 628 .feature_bits = FEATURE_WRSR_WREN, 629 .tested = TEST_UNTESTED, 630 .probe = probe_spi_rdid, 631 .probe_timing = TIMING_ZERO, 632 .block_erasers = 633 { 634 { 635 .eraseblocks = { { 4 * 1024, 32 } }, 636 .block_erase = spi_block_erase_20, 637 }, { 638 .eraseblocks = { { 64 * 1024, 2 } }, 639 .block_erase = spi_block_erase_d8, 640 }, { 641 .eraseblocks = { { 128 * 1024, 1 } }, 642 .block_erase = spi_block_erase_c7, 643 } 644 }, 645 .printlock = spi_prettyprint_status_register_bp2_srwd, 646 .unlock = spi_disable_blockprotect, 647 .write = spi_chip_write_256, 648 .read = spi_chip_read, 649 .voltage = {2700, 3600}, 650 }, 651 652 { 653 .vendor = "AMIC", 654 .name = "A25L016", 655 .bustype = BUS_SPI, 656 .manufacture_id = AMIC_ID_NOPREFIX, 657 .model_id = AMIC_A25L016, 658 .total_size = 2048, 659 .page_size = 256, 660 .feature_bits = FEATURE_WRSR_WREN, 661 .tested = TEST_UNTESTED, 662 .probe = probe_spi_rdid, 663 .probe_timing = TIMING_ZERO, 664 .block_erasers = 665 { 666 { 667 .eraseblocks = { { 4 * 1024, 512 } }, 668 .block_erase = spi_block_erase_20, 669 }, { 670 .eraseblocks = { { 64 * 1024, 32 } }, 671 .block_erase = spi_block_erase_d8, 672 }, { 673 .eraseblocks = { { 2048 * 1024, 1 } }, 674 .block_erase = spi_block_erase_c7, 675 } 676 }, 677 .printlock = spi_prettyprint_status_register_bp2_srwd, 678 .unlock = spi_disable_blockprotect, 679 .write = spi_chip_write_256, 680 .read = spi_chip_read, 681 .voltage = {2700, 3600}, 682 }, 683 684 { 685 .vendor = "AMIC", 686 .name = "A25L020", 687 .bustype = BUS_SPI, 688 .manufacture_id = AMIC_ID_NOPREFIX, 689 .model_id = AMIC_A25L020, 690 .total_size = 256, 691 .page_size = 256, 692 .feature_bits = FEATURE_WRSR_WREN, 693 .tested = TEST_UNTESTED, 694 .probe = probe_spi_rdid, 695 .probe_timing = TIMING_ZERO, 696 .block_erasers = 697 { 698 { 699 .eraseblocks = { { 4 * 1024, 64 } }, 700 .block_erase = spi_block_erase_20, 701 }, { 702 .eraseblocks = { { 64 * 1024, 4 } }, 703 .block_erase = spi_block_erase_d8, 704 }, { 705 .eraseblocks = { { 256 * 1024, 1 } }, 706 .block_erase = spi_block_erase_c7, 707 } 708 }, 709 .printlock = spi_prettyprint_status_register_bp2_srwd, 710 .unlock = spi_disable_blockprotect, 711 .write = spi_chip_write_256, 712 .read = spi_chip_read, 713 .voltage = {2700, 3600}, 714 }, 715 716 { 717 .vendor = "AMIC", 718 .name = "A25L032", 719 .bustype = BUS_SPI, 720 .manufacture_id = AMIC_ID_NOPREFIX, 721 .model_id = AMIC_A25L032, 722 .total_size = 4096, 723 .page_size = 256, 724 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ 725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 726 .tested = TEST_OK_PREW, 727 .probe = probe_spi_rdid, 728 .probe_timing = TIMING_ZERO, 729 .block_erasers = 730 { 731 { 732 .eraseblocks = { { 4 * 1024, 1024 } }, 733 .block_erase = spi_block_erase_20, 734 }, { 735 .eraseblocks = { { 64 * 1024, 64 } }, 736 .block_erase = spi_block_erase_52, 737 }, { 738 .eraseblocks = { { 64 * 1024, 64 } }, 739 .block_erase = spi_block_erase_d8, 740 }, { 741 .eraseblocks = { { 4096 * 1024, 1 } }, 742 .block_erase = spi_block_erase_60, 743 }, { 744 .eraseblocks = { { 4096 * 1024, 1 } }, 745 .block_erase = spi_block_erase_c7, 746 } 747 }, 748 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */ 749 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */ 750 .write = spi_chip_write_256, 751 .read = spi_chip_read, 752 .voltage = {2700, 3600}, 753 }, 754 755 { 756 .vendor = "AMIC", 757 .name = "A25L040", 758 .bustype = BUS_SPI, 759 .manufacture_id = AMIC_ID_NOPREFIX, 760 .model_id = AMIC_A25L040, 761 .total_size = 512, 762 .page_size = 256, 763 .feature_bits = FEATURE_WRSR_WREN, 764 .tested = TEST_UNTESTED, 765 .probe = probe_spi_rdid, 766 .probe_timing = TIMING_ZERO, 767 .block_erasers = 768 { 769 { 770 .eraseblocks = { { 4 * 1024, 128 } }, 771 .block_erase = spi_block_erase_20, 772 }, { 773 .eraseblocks = { { 64 * 1024, 8 } }, 774 .block_erase = spi_block_erase_d8, 775 }, { 776 .eraseblocks = { { 512 * 1024, 1 } }, 777 .block_erase = spi_block_erase_c7, 778 } 779 }, 780 .printlock = spi_prettyprint_status_register_bp2_srwd, 781 .unlock = spi_disable_blockprotect, 782 .write = spi_chip_write_256, 783 .read = spi_chip_read, 784 .voltage = {2700, 3600}, 785 }, 786 787 { 788 .vendor = "AMIC", 789 .name = "A25L05PT", 790 .bustype = BUS_SPI, 791 .manufacture_id = AMIC_ID, 792 .model_id = AMIC_A25L05PT, 793 .total_size = 64, 794 .page_size = 256, 795 .feature_bits = FEATURE_WRSR_WREN, 796 .tested = TEST_UNTESTED, 797 .probe = probe_spi_rdid4, 798 .probe_timing = TIMING_ZERO, 799 .block_erasers = 800 { 801 { 802 .eraseblocks = { 803 {32 * 1024, 1}, 804 {16 * 1024, 1}, 805 {8 * 1024, 1}, 806 {4 * 1024, 2}, 807 }, 808 .block_erase = spi_block_erase_d8, 809 }, { 810 .eraseblocks = { {64 * 1024, 1} }, 811 .block_erase = spi_block_erase_c7, 812 } 813 }, 814 .printlock = spi_prettyprint_status_register_bp1_srwd, 815 .unlock = spi_disable_blockprotect, 816 .write = spi_chip_write_256, 817 .read = spi_chip_read, 818 .voltage = {2700, 3600}, 819 }, 820 821 { 822 .vendor = "AMIC", 823 .name = "A25L05PU", 824 .bustype = BUS_SPI, 825 .manufacture_id = AMIC_ID, 826 .model_id = AMIC_A25L05PU, 827 .total_size = 64, 828 .page_size = 256, 829 .feature_bits = FEATURE_WRSR_WREN, 830 .tested = TEST_UNTESTED, 831 .probe = probe_spi_rdid4, 832 .probe_timing = TIMING_ZERO, 833 .block_erasers = 834 { 835 { 836 .eraseblocks = { 837 {4 * 1024, 2}, 838 {8 * 1024, 1}, 839 {16 * 1024, 1}, 840 {32 * 1024, 1}, 841 }, 842 .block_erase = spi_block_erase_d8, 843 }, { 844 .eraseblocks = { {64 * 1024, 1} }, 845 .block_erase = spi_block_erase_c7, 846 } 847 }, 848 .printlock = spi_prettyprint_status_register_bp1_srwd, 849 .unlock = spi_disable_blockprotect, 850 .write = spi_chip_write_256, 851 .read = spi_chip_read, 852 .voltage = {2700, 3600}, 853 }, 854 855 { 856 .vendor = "AMIC", 857 .name = "A25L080", 858 .bustype = BUS_SPI, 859 .manufacture_id = AMIC_ID_NOPREFIX, 860 .model_id = AMIC_A25L080, 861 .total_size = 1024, 862 .page_size = 256, 863 .feature_bits = FEATURE_WRSR_WREN, 864 .tested = TEST_UNTESTED, 865 .probe = probe_spi_rdid, 866 .probe_timing = TIMING_ZERO, 867 .block_erasers = 868 { 869 { 870 .eraseblocks = { { 4 * 1024, 256 } }, 871 .block_erase = spi_block_erase_20, 872 }, { 873 .eraseblocks = { { 64 * 1024, 16 } }, 874 .block_erase = spi_block_erase_d8, 875 }, { 876 .eraseblocks = { { 1024 * 1024, 1 } }, 877 .block_erase = spi_block_erase_c7, 878 } 879 }, 880 .printlock = spi_prettyprint_status_register_bp2_srwd, 881 .unlock = spi_disable_blockprotect, 882 .write = spi_chip_write_256, 883 .read = spi_chip_read, 884 .voltage = {2700, 3600}, 885 }, 886 887 { 888 .vendor = "AMIC", 889 .name = "A25L10PT", 890 .bustype = BUS_SPI, 891 .manufacture_id = AMIC_ID, 892 .model_id = AMIC_A25L10PT, 893 .total_size = 128, 894 .page_size = 256, 895 .feature_bits = FEATURE_WRSR_WREN, 896 .tested = TEST_UNTESTED, 897 .probe = probe_spi_rdid4, 898 .probe_timing = TIMING_ZERO, 899 .block_erasers = 900 { 901 { 902 .eraseblocks = { 903 {64 * 1024, 1}, 904 {32 * 1024, 1}, 905 {16 * 1024, 1}, 906 {8 * 1024, 1}, 907 {4 * 1024, 2}, 908 }, 909 .block_erase = spi_block_erase_d8, 910 }, { 911 .eraseblocks = { {128 * 1024, 1} }, 912 .block_erase = spi_block_erase_c7, 913 } 914 }, 915 .printlock = spi_prettyprint_status_register_bp1_srwd, 916 .unlock = spi_disable_blockprotect, 917 .write = spi_chip_write_256, 918 .read = spi_chip_read, 919 .voltage = {2700, 3600}, 920 }, 921 922 { 923 .vendor = "AMIC", 924 .name = "A25L10PU", 925 .bustype = BUS_SPI, 926 .manufacture_id = AMIC_ID, 927 .model_id = AMIC_A25L10PU, 928 .total_size = 128, 929 .page_size = 256, 930 .feature_bits = FEATURE_WRSR_WREN, 931 .tested = TEST_UNTESTED, 932 .probe = probe_spi_rdid4, 933 .probe_timing = TIMING_ZERO, 934 .block_erasers = 935 { 936 { 937 .eraseblocks = { 938 {4 * 1024, 2}, 939 {8 * 1024, 1}, 940 {16 * 1024, 1}, 941 {32 * 1024, 1}, 942 {64 * 1024, 1}, 943 }, 944 .block_erase = spi_block_erase_d8, 945 }, { 946 .eraseblocks = { {128 * 1024, 1} }, 947 .block_erase = spi_block_erase_c7, 948 } 949 }, 950 .printlock = spi_prettyprint_status_register_bp1_srwd, 951 .unlock = spi_disable_blockprotect, 952 .write = spi_chip_write_256, 953 .read = spi_chip_read, 954 .voltage = {2700, 3600}, 955 }, 956 957 { 958 .vendor = "AMIC", 959 .name = "A25L16PT", 960 .bustype = BUS_SPI, 961 .manufacture_id = AMIC_ID, 962 .model_id = AMIC_A25L16PT, 963 .total_size = 2048, 964 .page_size = 256, 965 .feature_bits = FEATURE_WRSR_WREN, 966 .tested = TEST_UNTESTED, 967 .probe = probe_spi_rdid4, 968 .probe_timing = TIMING_ZERO, 969 .block_erasers = 970 { 971 { 972 .eraseblocks = { 973 {64 * 1024, 31}, 974 {32 * 1024, 1}, 975 {16 * 1024, 1}, 976 {8 * 1024, 1}, 977 {4 * 1024, 2}, 978 }, 979 .block_erase = spi_block_erase_d8, 980 }, { 981 .eraseblocks = { {2048 * 1024, 1} }, 982 .block_erase = spi_block_erase_60, 983 }, { 984 .eraseblocks = { {2048 * 1024, 1} }, 985 .block_erase = spi_block_erase_c7, 986 } 987 }, 988 .printlock = spi_prettyprint_status_register_bp2_srwd, 989 .unlock = spi_disable_blockprotect, 990 .write = spi_chip_write_256, 991 .read = spi_chip_read, 992 .voltage = {2700, 3600}, 993 }, 994 995 { 996 .vendor = "AMIC", 997 .name = "A25L16PU", 998 .bustype = BUS_SPI, 999 .manufacture_id = AMIC_ID, 1000 .model_id = AMIC_A25L16PU, 1001 .total_size = 2048, 1002 .page_size = 256, 1003 .feature_bits = FEATURE_WRSR_WREN, 1004 .tested = TEST_OK_PR, 1005 .probe = probe_spi_rdid4, 1006 .probe_timing = TIMING_ZERO, 1007 .block_erasers = 1008 { 1009 { 1010 .eraseblocks = { 1011 {4 * 1024, 2}, 1012 {8 * 1024, 1}, 1013 {16 * 1024, 1}, 1014 {32 * 1024, 1}, 1015 {64 * 1024, 31}, 1016 }, 1017 .block_erase = spi_block_erase_d8, 1018 }, { 1019 .eraseblocks = { {2048 * 1024, 1} }, 1020 .block_erase = spi_block_erase_60, 1021 }, { 1022 .eraseblocks = { {2048 * 1024, 1} }, 1023 .block_erase = spi_block_erase_c7, 1024 } 1025 }, 1026 .printlock = spi_prettyprint_status_register_bp2_srwd, 1027 .unlock = spi_disable_blockprotect, 1028 .write = spi_chip_write_256, 1029 .read = spi_chip_read, 1030 .voltage = {2700, 3600}, 1031 }, 1032 1033 { 1034 .vendor = "AMIC", 1035 .name = "A25L20PT", 1036 .bustype = BUS_SPI, 1037 .manufacture_id = AMIC_ID, 1038 .model_id = AMIC_A25L20PT, 1039 .total_size = 256, 1040 .page_size = 256, 1041 .feature_bits = FEATURE_WRSR_WREN, 1042 .tested = TEST_UNTESTED, 1043 .probe = probe_spi_rdid4, 1044 .probe_timing = TIMING_ZERO, 1045 .block_erasers = 1046 { 1047 { 1048 .eraseblocks = { 1049 {64 * 1024, 3}, 1050 {32 * 1024, 1}, 1051 {16 * 1024, 1}, 1052 {8 * 1024, 1}, 1053 {4 * 1024, 2}, 1054 }, 1055 .block_erase = spi_block_erase_d8, 1056 }, { 1057 .eraseblocks = { {256 * 1024, 1} }, 1058 .block_erase = spi_block_erase_c7, 1059 } 1060 }, 1061 .printlock = spi_prettyprint_status_register_bp1_srwd, 1062 .unlock = spi_disable_blockprotect, 1063 .write = spi_chip_write_256, 1064 .read = spi_chip_read, 1065 .voltage = {2700, 3600}, 1066 }, 1067 1068 { 1069 .vendor = "AMIC", 1070 .name = "A25L20PU", 1071 .bustype = BUS_SPI, 1072 .manufacture_id = AMIC_ID, 1073 .model_id = AMIC_A25L20PU, 1074 .total_size = 256, 1075 .page_size = 256, 1076 .feature_bits = FEATURE_WRSR_WREN, 1077 .tested = TEST_UNTESTED, 1078 .probe = probe_spi_rdid4, 1079 .probe_timing = TIMING_ZERO, 1080 .block_erasers = 1081 { 1082 { 1083 .eraseblocks = { 1084 {4 * 1024, 2}, 1085 {8 * 1024, 1}, 1086 {16 * 1024, 1}, 1087 {32 * 1024, 1}, 1088 {64 * 1024, 3}, 1089 }, 1090 .block_erase = spi_block_erase_d8, 1091 }, { 1092 .eraseblocks = { {256 * 1024, 1} }, 1093 .block_erase = spi_block_erase_c7, 1094 } 1095 }, 1096 .printlock = spi_prettyprint_status_register_bp1_srwd, 1097 .unlock = spi_disable_blockprotect, 1098 .write = spi_chip_write_256, 1099 .read = spi_chip_read, 1100 .voltage = {2700, 3600}, 1101 }, 1102 1103 /* The A25L40P{T,U} chips are distinguished by their 1104 * erase block layouts, but without any distinction in RDID. 1105 * This inexplicable quirk was verified by Rudolf Marek 1106 * and discussed on the flashrom mailing list on 2010-07-12. 1107 */ 1108 { 1109 .vendor = "AMIC", 1110 .name = "A25L40PT", 1111 .bustype = BUS_SPI, 1112 .manufacture_id = AMIC_ID, 1113 .model_id = AMIC_A25L40PT, 1114 .total_size = 512, 1115 .page_size = 256, 1116 .feature_bits = FEATURE_WRSR_WREN, 1117 .tested = TEST_OK_PR, 1118 .probe = probe_spi_rdid4, 1119 .probe_timing = TIMING_ZERO, 1120 .block_erasers = 1121 { 1122 { 1123 .eraseblocks = { 1124 {64 * 1024, 7}, 1125 {32 * 1024, 1}, 1126 {16 * 1024, 1}, 1127 {8 * 1024, 1}, 1128 {4 * 1024, 2}, 1129 }, 1130 .block_erase = spi_block_erase_d8, 1131 }, { 1132 .eraseblocks = { {512 * 1024, 1} }, 1133 .block_erase = spi_block_erase_c7, 1134 } 1135 }, 1136 .printlock = spi_prettyprint_status_register_bp2_srwd, 1137 .unlock = spi_disable_blockprotect, 1138 .write = spi_chip_write_256, 1139 .read = spi_chip_read, 1140 .voltage = {2700, 3600}, 1141 }, 1142 1143 { 1144 .vendor = "AMIC", 1145 .name = "A25L40PU", 1146 .bustype = BUS_SPI, 1147 .manufacture_id = AMIC_ID, 1148 .model_id = AMIC_A25L40PU, 1149 .total_size = 512, 1150 .page_size = 256, 1151 .feature_bits = FEATURE_WRSR_WREN, 1152 .tested = TEST_OK_PREW, 1153 .probe = probe_spi_rdid4, 1154 .probe_timing = TIMING_ZERO, 1155 .block_erasers = 1156 { 1157 { 1158 .eraseblocks = { 1159 {4 * 1024, 2}, 1160 {8 * 1024, 1}, 1161 {16 * 1024, 1}, 1162 {32 * 1024, 1}, 1163 {64 * 1024, 7}, 1164 }, 1165 .block_erase = spi_block_erase_d8, 1166 }, { 1167 .eraseblocks = { {512 * 1024, 1} }, 1168 .block_erase = spi_block_erase_c7, 1169 } 1170 }, 1171 .printlock = spi_prettyprint_status_register_bp2_srwd, 1172 .unlock = spi_disable_blockprotect, 1173 .write = spi_chip_write_256, 1174 .read = spi_chip_read, 1175 .voltage = {2700, 3600}, 1176 }, 1177 1178 { 1179 .vendor = "AMIC", 1180 .name = "A25L512", 1181 .bustype = BUS_SPI, 1182 .manufacture_id = AMIC_ID_NOPREFIX, 1183 .model_id = AMIC_A25L512, 1184 .total_size = 64, 1185 .page_size = 256, 1186 .feature_bits = FEATURE_WRSR_WREN, 1187 .tested = TEST_UNTESTED, 1188 .probe = probe_spi_rdid, 1189 .probe_timing = TIMING_ZERO, 1190 .block_erasers = 1191 { 1192 { 1193 .eraseblocks = { { 4 * 1024, 16 } }, 1194 .block_erase = spi_block_erase_20, 1195 }, { 1196 .eraseblocks = { { 64 * 1024, 1 } }, 1197 .block_erase = spi_block_erase_d8, 1198 }, { 1199 .eraseblocks = { { 64 * 1024, 1 } }, 1200 .block_erase = spi_block_erase_c7, 1201 } 1202 }, 1203 .printlock = spi_prettyprint_status_register_bp2_srwd, 1204 .unlock = spi_disable_blockprotect, 1205 .write = spi_chip_write_256, 1206 .read = spi_chip_read, 1207 .voltage = {2700, 3600}, 1208 }, 1209 1210 { 1211 .vendor = "AMIC", 1212 .name = "A25L80P", 1213 .bustype = BUS_SPI, 1214 .manufacture_id = AMIC_ID, 1215 .model_id = AMIC_A25L80P, 1216 .total_size = 1024, 1217 .page_size = 256, 1218 .feature_bits = FEATURE_WRSR_WREN, 1219 .tested = TEST_OK_PRE, 1220 .probe = probe_spi_rdid4, 1221 .probe_timing = TIMING_ZERO, 1222 .block_erasers = 1223 { 1224 { 1225 .eraseblocks = { 1226 {4 * 1024, 2}, 1227 {8 * 1024, 1}, 1228 {16 * 1024, 1}, 1229 {32 * 1024, 1}, 1230 {64 * 1024, 15}, 1231 }, 1232 .block_erase = spi_block_erase_d8, 1233 }, { 1234 .eraseblocks = { {1024 * 1024, 1} }, 1235 .block_erase = spi_block_erase_c7, 1236 } 1237 }, 1238 .printlock = spi_prettyprint_status_register_bp2_srwd, 1239 .unlock = spi_disable_blockprotect, 1240 .write = spi_chip_write_256, 1241 .read = spi_chip_read, 1242 .voltage = {2700, 3600}, 1243 }, 1244 1245 { 1246 .vendor = "AMIC", 1247 .name = "A25LQ032/A25LQ32A", 1248 .bustype = BUS_SPI, 1249 .manufacture_id = AMIC_ID_NOPREFIX, 1250 .model_id = AMIC_A25LQ032, 1251 .total_size = 4096, 1252 .page_size = 256, 1253 /* A25LQ32A supports SFDP */ 1254 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ 1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1256 .tested = TEST_UNTESTED, 1257 .probe = probe_spi_rdid, 1258 .probe_timing = TIMING_ZERO, 1259 .block_erasers = 1260 { 1261 { 1262 .eraseblocks = { { 4 * 1024, 1024 } }, 1263 .block_erase = spi_block_erase_20, 1264 }, { 1265 .eraseblocks = { { 64 * 1024, 64 } }, 1266 .block_erase = spi_block_erase_52, 1267 }, { 1268 .eraseblocks = { { 64 * 1024, 64 } }, 1269 .block_erase = spi_block_erase_d8, 1270 }, { 1271 .eraseblocks = { { 4096 * 1024, 1 } }, 1272 .block_erase = spi_block_erase_60, 1273 }, { 1274 .eraseblocks = { { 4096 * 1024, 1 } }, 1275 .block_erase = spi_block_erase_c7, 1276 } 1277 }, 1278 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */ 1279 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */ 1280 .write = spi_chip_write_256, 1281 .read = spi_chip_read, 1282 .voltage = {2700, 3600}, 1283 }, 1284 1285 { 1286 .vendor = "AMIC", 1287 .name = "A25LQ16", 1288 .bustype = BUS_SPI, 1289 .manufacture_id = AMIC_ID_NOPREFIX, 1290 .model_id = AMIC_A25LQ16, 1291 .total_size = 2048, 1292 .page_size = 256, 1293 /* supports SFDP */ 1294 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */ 1295 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1296 .tested = TEST_UNTESTED, 1297 .probe = probe_spi_rdid, 1298 .probe_timing = TIMING_ZERO, 1299 .block_erasers = 1300 { 1301 { 1302 .eraseblocks = { { 4 * 1024, 512 } }, 1303 .block_erase = spi_block_erase_20, 1304 }, { 1305 .eraseblocks = { { 64 * 1024, 32 } }, 1306 .block_erase = spi_block_erase_52, 1307 }, { 1308 .eraseblocks = { { 64 * 1024, 32 } }, 1309 .block_erase = spi_block_erase_d8, 1310 }, { 1311 .eraseblocks = { { 2048 * 1024, 1 } }, 1312 .block_erase = spi_block_erase_60, 1313 }, { 1314 .eraseblocks = { { 2048 * 1024, 1 } }, 1315 .block_erase = spi_block_erase_c7, 1316 } 1317 }, 1318 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */ 1319 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */ 1320 .write = spi_chip_write_256, 1321 .read = spi_chip_read, 1322 .voltage = {2700, 3600}, 1323 }, 1324 1325 { 1326 .vendor = "AMIC", 1327 .name = "A25LQ64", 1328 .bustype = BUS_SPI, 1329 .manufacture_id = AMIC_ID_NOPREFIX, 1330 .model_id = AMIC_A25LQ64, 1331 .total_size = 8192, 1332 .page_size = 256, 1333 /* supports SFDP */ 1334 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 1335 /* QPI enable 0x35, disable 0xF5 */ 1336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 1337 .tested = TEST_UNTESTED, 1338 .probe = probe_spi_rdid, 1339 .probe_timing = TIMING_ZERO, 1340 .block_erasers = 1341 { 1342 { 1343 .eraseblocks = { { 4 * 1024, 2048 } }, 1344 .block_erase = spi_block_erase_20, 1345 }, { 1346 .eraseblocks = { { 32 * 1024, 256 } }, 1347 .block_erase = spi_block_erase_52, 1348 }, { 1349 .eraseblocks = { { 64 * 1024, 128 } }, 1350 .block_erase = spi_block_erase_d8, 1351 }, { 1352 .eraseblocks = { { 8192 * 1024, 1 } }, 1353 .block_erase = spi_block_erase_60, 1354 }, { 1355 .eraseblocks = { { 8192 * 1024, 1 } }, 1356 .block_erase = spi_block_erase_c7, 1357 } 1358 }, 1359 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */ 1360 .unlock = spi_disable_blockprotect_bp3_srwd, 1361 .write = spi_chip_write_256, 1362 .read = spi_chip_read, 1363 .voltage = {2700, 3600}, 1364 }, 1365 1366 { 1367 .vendor = "AMIC", 1368 .name = "A29002B", 1369 .bustype = BUS_PARALLEL, 1370 .manufacture_id = AMIC_ID_NOPREFIX, 1371 .model_id = AMIC_A29002B, 1372 .total_size = 256, 1373 .page_size = 64 * 1024, 1374 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 1375 .tested = TEST_UNTESTED, 1376 .probe = probe_jedec, 1377 .probe_timing = TIMING_ZERO, 1378 .block_erasers = 1379 { 1380 { 1381 .eraseblocks = { 1382 {16 * 1024, 1}, 1383 {8 * 1024, 2}, 1384 {32 * 1024, 1}, 1385 {64 * 1024, 3}, 1386 }, 1387 .block_erase = erase_sector_jedec, 1388 }, { 1389 .eraseblocks = { {256 * 1024, 1} }, 1390 .block_erase = erase_chip_block_jedec, 1391 }, 1392 }, 1393 .write = write_jedec_1, 1394 .read = read_memmapped, 1395 .voltage = {4500, 5500}, 1396 }, 1397 1398 { 1399 .vendor = "AMIC", 1400 .name = "A29002T", 1401 .bustype = BUS_PARALLEL, 1402 .manufacture_id = AMIC_ID_NOPREFIX, 1403 .model_id = AMIC_A29002T, 1404 .total_size = 256, 1405 .page_size = 64 * 1024, 1406 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 1407 .tested = TEST_OK_PREW, 1408 .probe = probe_jedec, 1409 .probe_timing = TIMING_ZERO, 1410 .block_erasers = 1411 { 1412 { 1413 .eraseblocks = { 1414 {64 * 1024, 3}, 1415 {32 * 1024, 1}, 1416 {8 * 1024, 2}, 1417 {16 * 1024, 1}, 1418 }, 1419 .block_erase = erase_sector_jedec, 1420 }, { 1421 .eraseblocks = { {256 * 1024, 1} }, 1422 .block_erase = erase_chip_block_jedec, 1423 }, 1424 }, 1425 .write = write_jedec_1, 1426 .read = read_memmapped, 1427 .voltage = {4500, 5500}, 1428 }, 1429 1430 { 1431 .vendor = "AMIC", 1432 .name = "A29040B", 1433 .bustype = BUS_PARALLEL, 1434 .manufacture_id = AMIC_ID_NOPREFIX, 1435 .model_id = AMIC_A29040B, 1436 .total_size = 512, 1437 .page_size = 64 * 1024, 1438 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 1439 .tested = TEST_OK_PREW, 1440 .probe = probe_jedec, 1441 .probe_timing = TIMING_ZERO, 1442 .block_erasers = 1443 { 1444 { 1445 .eraseblocks = { {64 * 1024, 8} }, 1446 .block_erase = erase_sector_jedec, 1447 }, { 1448 .eraseblocks = { {512 * 1024, 1} }, 1449 .block_erase = erase_chip_block_jedec, 1450 }, 1451 }, 1452 .write = write_jedec_1, 1453 .read = read_memmapped, 1454 .voltage = {4500, 5500}, 1455 }, 1456 1457 { 1458 .vendor = "AMIC", 1459 .name = "A49LF040A", 1460 .bustype = BUS_LPC, 1461 .manufacture_id = AMIC_ID_NOPREFIX, 1462 .model_id = AMIC_A49LF040A, 1463 .total_size = 512, 1464 .page_size = 64 * 1024, 1465 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 1466 .tested = TEST_OK_PR, 1467 .probe = probe_jedec, 1468 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */ 1469 .block_erasers = 1470 { 1471 { 1472 .eraseblocks = { {64 * 1024, 8} }, 1473 .block_erase = erase_block_jedec, 1474 }, { 1475 .eraseblocks = { {512 * 1024, 1} }, 1476 .block_erase = erase_chip_block_jedec, 1477 } 1478 }, 1479 .unlock = unlock_regspace2_uniform_64k, 1480 .write = write_jedec_1, 1481 .read = read_memmapped, 1482 .voltage = {3000, 3600}, 1483 }, 1484 1485 { 1486 .vendor = "Atmel", 1487 .name = "AT25DF021", 1488 .bustype = BUS_SPI, 1489 .manufacture_id = ATMEL_ID, 1490 .model_id = ATMEL_AT25DF021, 1491 .total_size = 256, 1492 .page_size = 256, 1493 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1495 .tested = TEST_UNTESTED, 1496 .probe = probe_spi_rdid, 1497 .probe_timing = TIMING_ZERO, 1498 .block_erasers = 1499 { 1500 { 1501 .eraseblocks = { {4 * 1024, 64} }, 1502 .block_erase = spi_block_erase_20, 1503 }, { 1504 .eraseblocks = { {32 * 1024, 8} }, 1505 .block_erase = spi_block_erase_52, 1506 }, { 1507 .eraseblocks = { {64 * 1024, 4} }, 1508 .block_erase = spi_block_erase_d8, 1509 }, { 1510 .eraseblocks = { {256 * 1024, 1} }, 1511 .block_erase = spi_block_erase_60, 1512 }, { 1513 .eraseblocks = { {256 * 1024, 1} }, 1514 .block_erase = spi_block_erase_c7, 1515 } 1516 }, 1517 .printlock = spi_prettyprint_status_register_at25df, 1518 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 1519 .write = spi_chip_write_256, 1520 .read = spi_chip_read, 1521 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */ 1522 }, 1523 1524 { 1525 .vendor = "Atmel", 1526 .name = "AT25DF021A", 1527 .bustype = BUS_SPI, 1528 .manufacture_id = ATMEL_ID, 1529 .model_id = ATMEL_AT25DF021A, 1530 .total_size = 256, 1531 .page_size = 256, 1532 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1533 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1534 .tested = TEST_OK_PREW, 1535 .probe = probe_spi_rdid, 1536 .probe_timing = TIMING_ZERO, 1537 .block_erasers = 1538 { 1539 { 1540 .eraseblocks = { {4 * 1024, 64} }, 1541 .block_erase = spi_block_erase_20, 1542 }, { 1543 .eraseblocks = { {32 * 1024, 8} }, 1544 .block_erase = spi_block_erase_52, 1545 }, { 1546 .eraseblocks = { {64 * 1024, 4} }, 1547 .block_erase = spi_block_erase_d8, 1548 }, { 1549 .eraseblocks = { {256 * 1024, 1} }, 1550 .block_erase = spi_block_erase_60, 1551 }, { 1552 .eraseblocks = { {256 * 1024, 1} }, 1553 .block_erase = spi_block_erase_c7, 1554 } 1555 }, 1556 .printlock = spi_prettyprint_status_register_at25df, 1557 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 1558 .write = spi_chip_write_256, 1559 .read = spi_chip_read, 1560 .voltage = {1650, 3600}, 1561 }, 1562 1563 { 1564 .vendor = "Atmel", 1565 .name = "AT25DF041A", 1566 .bustype = BUS_SPI, 1567 .manufacture_id = ATMEL_ID, 1568 .model_id = ATMEL_AT25DF041A, 1569 .total_size = 512, 1570 .page_size = 256, 1571 .feature_bits = FEATURE_WRSR_WREN, 1572 .tested = TEST_OK_PREW, 1573 .probe = probe_spi_rdid, 1574 .probe_timing = TIMING_ZERO, 1575 .block_erasers = 1576 { 1577 { 1578 .eraseblocks = { {4 * 1024, 128} }, 1579 .block_erase = spi_block_erase_20, 1580 }, { 1581 .eraseblocks = { {32 * 1024, 16} }, 1582 .block_erase = spi_block_erase_52, 1583 }, { 1584 .eraseblocks = { {64 * 1024, 8} }, 1585 .block_erase = spi_block_erase_d8, 1586 }, { 1587 .eraseblocks = { {512 * 1024, 1} }, 1588 .block_erase = spi_block_erase_60, 1589 }, { 1590 .eraseblocks = { {512 * 1024, 1} }, 1591 .block_erase = spi_block_erase_c7, 1592 } 1593 }, 1594 .printlock = spi_prettyprint_status_register_at25df, 1595 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 1596 .write = spi_chip_write_256, 1597 .read = spi_chip_read, 1598 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */ 1599 }, 1600 1601 { 1602 .vendor = "Atmel", 1603 .name = "AT25DF081", 1604 .bustype = BUS_SPI, 1605 .manufacture_id = ATMEL_ID, 1606 .model_id = ATMEL_AT25DF081, 1607 .total_size = 1024, 1608 .page_size = 256, 1609 .feature_bits = FEATURE_WRSR_WREN, 1610 .tested = TEST_UNTESTED, 1611 .probe = probe_spi_rdid, 1612 .probe_timing = TIMING_ZERO, 1613 .block_erasers = 1614 { 1615 { 1616 .eraseblocks = { {4 * 1024, 256} }, 1617 .block_erase = spi_block_erase_20, 1618 }, { 1619 .eraseblocks = { {32 * 1024, 32} }, 1620 .block_erase = spi_block_erase_52, 1621 }, { 1622 .eraseblocks = { {64 * 1024, 16} }, 1623 .block_erase = spi_block_erase_d8, 1624 }, { 1625 .eraseblocks = { {1024 * 1024, 1} }, 1626 .block_erase = spi_block_erase_60, 1627 }, { 1628 .eraseblocks = { {1024 * 1024, 1} }, 1629 .block_erase = spi_block_erase_c7, 1630 } 1631 }, 1632 .printlock = spi_prettyprint_status_register_at25df, 1633 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 1634 .write = spi_chip_write_256, 1635 .read = spi_chip_read, 1636 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */ 1637 }, 1638 1639 { 1640 .vendor = "Atmel", 1641 .name = "AT25DF081A", 1642 .bustype = BUS_SPI, 1643 .manufacture_id = ATMEL_ID, 1644 .model_id = ATMEL_AT25DF081A, 1645 .total_size = 1024, 1646 .page_size = 256, 1647 .feature_bits = FEATURE_WRSR_WREN, 1648 .tested = TEST_UNTESTED, 1649 .probe = probe_spi_rdid, 1650 .probe_timing = TIMING_ZERO, 1651 .block_erasers = 1652 { 1653 { 1654 .eraseblocks = { {4 * 1024, 256} }, 1655 .block_erase = spi_block_erase_20, 1656 }, { 1657 .eraseblocks = { {32 * 1024, 32} }, 1658 .block_erase = spi_block_erase_52, 1659 }, { 1660 .eraseblocks = { {64 * 1024, 16} }, 1661 .block_erase = spi_block_erase_d8, 1662 }, { 1663 .eraseblocks = { {1024 * 1024, 1} }, 1664 .block_erase = spi_block_erase_60, 1665 }, { 1666 .eraseblocks = { {1024 * 1024, 1} }, 1667 .block_erase = spi_block_erase_c7, 1668 } 1669 }, 1670 .printlock = spi_prettyprint_status_register_at25df_sec, 1671 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1672 .write = spi_chip_write_256, 1673 .read = spi_chip_read, 1674 .voltage = {2700, 3600}, 1675 }, 1676 1677 { 1678 .vendor = "Atmel", 1679 .name = "AT25DF161", 1680 .bustype = BUS_SPI, 1681 .manufacture_id = ATMEL_ID, 1682 .model_id = ATMEL_AT25DF161, 1683 .total_size = 2048, 1684 .page_size = 256, 1685 .feature_bits = FEATURE_WRSR_WREN, 1686 .tested = TEST_OK_PREW, 1687 .probe = probe_spi_rdid, 1688 .probe_timing = TIMING_ZERO, 1689 .block_erasers = 1690 { 1691 { 1692 .eraseblocks = { {4 * 1024, 512} }, 1693 .block_erase = spi_block_erase_20, 1694 }, { 1695 .eraseblocks = { {32 * 1024, 64} }, 1696 .block_erase = spi_block_erase_52, 1697 }, { 1698 .eraseblocks = { {64 * 1024, 32} }, 1699 .block_erase = spi_block_erase_d8, 1700 }, { 1701 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1702 .block_erase = spi_block_erase_60, 1703 }, { 1704 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1705 .block_erase = spi_block_erase_c7, 1706 } 1707 }, 1708 .printlock = spi_prettyprint_status_register_at25df_sec, 1709 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1710 .write = spi_chip_write_256, 1711 .read = spi_chip_read, 1712 .voltage = {2700, 3600}, 1713 }, 1714 1715 /*The AT26DF321 has the same ID as the AT25DF321. */ 1716 { 1717 .vendor = "Atmel", 1718 .name = "AT25DF321", 1719 .bustype = BUS_SPI, 1720 .manufacture_id = ATMEL_ID, 1721 .model_id = ATMEL_AT25DF321, 1722 .total_size = 4096, 1723 .page_size = 256, 1724 .feature_bits = FEATURE_WRSR_WREN, 1725 .tested = TEST_OK_PREW, 1726 .probe = probe_spi_rdid, 1727 .probe_timing = TIMING_ZERO, 1728 .block_erasers = 1729 { 1730 { 1731 .eraseblocks = { {4 * 1024, 1024} }, 1732 .block_erase = spi_block_erase_20, 1733 }, { 1734 .eraseblocks = { {32 * 1024, 128} }, 1735 .block_erase = spi_block_erase_52, 1736 }, { 1737 .eraseblocks = { {64 * 1024, 64} }, 1738 .block_erase = spi_block_erase_d8, 1739 }, { 1740 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1741 .block_erase = spi_block_erase_60, 1742 }, { 1743 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1744 .block_erase = spi_block_erase_c7, 1745 } 1746 }, 1747 .printlock = spi_prettyprint_status_register_at25df, 1748 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 1749 .write = spi_chip_write_256, 1750 .read = spi_chip_read, 1751 .voltage = {2700, 3600}, 1752 }, 1753 1754 { 1755 .vendor = "Atmel", 1756 .name = "AT25DF321A", 1757 .bustype = BUS_SPI, 1758 .manufacture_id = ATMEL_ID, 1759 .model_id = ATMEL_AT25DF321A, 1760 .total_size = 4096, 1761 .page_size = 256, 1762 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1763 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1764 .tested = TEST_OK_PREW, 1765 .probe = probe_spi_rdid, 1766 .probe_timing = TIMING_ZERO, 1767 .block_erasers = 1768 { 1769 { 1770 .eraseblocks = { {4 * 1024, 1024} }, 1771 .block_erase = spi_block_erase_20, 1772 }, { 1773 .eraseblocks = { {32 * 1024, 128} }, 1774 .block_erase = spi_block_erase_52, 1775 }, { 1776 .eraseblocks = { {64 * 1024, 64} }, 1777 .block_erase = spi_block_erase_d8, 1778 }, { 1779 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1780 .block_erase = spi_block_erase_60, 1781 }, { 1782 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1783 .block_erase = spi_block_erase_c7, 1784 } 1785 }, 1786 .printlock = spi_prettyprint_status_register_at25df_sec, 1787 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1788 .write = spi_chip_write_256, 1789 .read = spi_chip_read, 1790 .voltage = {2700, 3600}, 1791 }, 1792 1793 { 1794 .vendor = "Atmel", 1795 .name = "AT25DF641(A)", 1796 .bustype = BUS_SPI, 1797 .manufacture_id = ATMEL_ID, 1798 .model_id = ATMEL_AT25DF641, 1799 .total_size = 8192, 1800 .page_size = 256, 1801 .feature_bits = FEATURE_WRSR_WREN, 1802 .tested = TEST_OK_PREW, 1803 .probe = probe_spi_rdid, 1804 .probe_timing = TIMING_ZERO, 1805 .block_erasers = 1806 { 1807 { 1808 .eraseblocks = { {4 * 1024, 2048} }, 1809 .block_erase = spi_block_erase_20, 1810 }, { 1811 .eraseblocks = { {32 * 1024, 256} }, 1812 .block_erase = spi_block_erase_52, 1813 }, { 1814 .eraseblocks = { {64 * 1024, 128} }, 1815 .block_erase = spi_block_erase_d8, 1816 }, { 1817 .eraseblocks = { {8 * 1024 * 1024, 1} }, 1818 .block_erase = spi_block_erase_60, 1819 }, { 1820 .eraseblocks = { {8 * 1024 * 1024, 1} }, 1821 .block_erase = spi_block_erase_c7, 1822 } 1823 }, 1824 .printlock = spi_prettyprint_status_register_at25df_sec, 1825 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1826 .write = spi_chip_write_256, 1827 .read = spi_chip_read, 1828 .voltage = {2700, 3600}, 1829 }, 1830 1831 { 1832 .vendor = "Atmel", 1833 .name = "AT25DL081", 1834 .bustype = BUS_SPI, 1835 .manufacture_id = ATMEL_ID, 1836 .model_id = ATMEL_AT25DF081, 1837 .total_size = 1024, 1838 .page_size = 256, 1839 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1840 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1841 .tested = TEST_UNTESTED, 1842 .probe = probe_spi_rdid, 1843 .probe_timing = TIMING_ZERO, 1844 .block_erasers = 1845 { 1846 { 1847 .eraseblocks = { {4 * 1024, 256} }, 1848 .block_erase = spi_block_erase_20, 1849 }, { 1850 .eraseblocks = { {32 * 1024, 32} }, 1851 .block_erase = spi_block_erase_52, 1852 }, { 1853 .eraseblocks = { {64 * 1024, 16} }, 1854 .block_erase = spi_block_erase_d8, 1855 }, { 1856 .eraseblocks = { {1 * 1024 * 1024, 1} }, 1857 .block_erase = spi_block_erase_60, 1858 }, { 1859 .eraseblocks = { {1 * 1024 * 1024, 1} }, 1860 .block_erase = spi_block_erase_c7, 1861 } 1862 }, 1863 .printlock = spi_prettyprint_status_register_at25df_sec, 1864 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1865 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */ 1866 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */ 1867 .voltage = {1650, 1950}, 1868 }, 1869 1870 { 1871 .vendor = "Atmel", 1872 .name = "AT25DL161", 1873 .bustype = BUS_SPI, 1874 .manufacture_id = ATMEL_ID, 1875 .model_id = ATMEL_AT25DL161, 1876 .total_size = 2048, 1877 .page_size = 256, 1878 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1880 .tested = TEST_UNTESTED, 1881 .probe = probe_spi_rdid, 1882 .probe_timing = TIMING_ZERO, 1883 .block_erasers = 1884 { 1885 { 1886 .eraseblocks = { {4 * 1024, 512} }, 1887 .block_erase = spi_block_erase_20, 1888 }, { 1889 .eraseblocks = { {32 * 1024, 64} }, 1890 .block_erase = spi_block_erase_52, 1891 }, { 1892 .eraseblocks = { {64 * 1024, 32} }, 1893 .block_erase = spi_block_erase_d8, 1894 }, { 1895 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1896 .block_erase = spi_block_erase_60, 1897 }, { 1898 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1899 .block_erase = spi_block_erase_c7, 1900 } 1901 }, 1902 .printlock = spi_prettyprint_status_register_at25df_sec, 1903 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1904 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */ 1905 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */ 1906 .voltage = {1650, 1950}, 1907 }, 1908 1909 { 1910 .vendor = "Atmel", 1911 .name = "AT25DQ161", 1912 .bustype = BUS_SPI, 1913 .manufacture_id = ATMEL_ID, 1914 .model_id = ATMEL_AT25DQ161, 1915 .total_size = 2048, 1916 .page_size = 256, 1917 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1918 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1919 .tested = TEST_UNTESTED, 1920 .probe = probe_spi_rdid, 1921 .probe_timing = TIMING_ZERO, 1922 .block_erasers = 1923 { 1924 { 1925 .eraseblocks = { {4 * 1024, 512} }, 1926 .block_erase = spi_block_erase_20, 1927 }, { 1928 .eraseblocks = { {32 * 1024, 64} }, 1929 .block_erase = spi_block_erase_52, 1930 }, { 1931 .eraseblocks = { {64 * 1024, 32} }, 1932 .block_erase = spi_block_erase_d8, 1933 }, { 1934 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1935 .block_erase = spi_block_erase_60, 1936 }, { 1937 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1938 .block_erase = spi_block_erase_c7, 1939 } 1940 }, 1941 .printlock = spi_prettyprint_status_register_at25df_sec, 1942 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec, 1943 .write = spi_chip_write_256, 1944 .read = spi_chip_read, 1945 .voltage = {2700, 3600}, 1946 }, 1947 1948 { 1949 .vendor = "Atmel", 1950 /* The A suffix indicates 33MHz instead of 20MHz clock rate. 1951 * All other properties seem to be the same.*/ 1952 .name = "AT25F1024(A)", 1953 .bustype = BUS_SPI, 1954 .manufacture_id = ATMEL_ID, 1955 .model_id = ATMEL_AT25F1024, 1956 .total_size = 128, 1957 .page_size = 256, 1958 .feature_bits = FEATURE_WRSR_WREN, 1959 .tested = TEST_OK_PREW, 1960 .probe = probe_spi_at25f, 1961 .probe_timing = TIMING_ZERO, 1962 .block_erasers = 1963 { 1964 { 1965 .eraseblocks = { {32 * 1024, 4} }, 1966 .block_erase = spi_block_erase_52, 1967 }, { 1968 .eraseblocks = { {128 * 1024, 1} }, 1969 .block_erase = spi_block_erase_62, 1970 } 1971 }, 1972 .printlock = spi_prettyprint_status_register_at25f, 1973 .unlock = spi_disable_blockprotect_at25f, 1974 .write = spi_chip_write_256, 1975 .read = spi_chip_read, 1976 .voltage = {2700, 3600}, 1977 }, 1978 1979 { 1980 .vendor = "Atmel", 1981 .name = "AT25F2048", 1982 .bustype = BUS_SPI, 1983 .manufacture_id = ATMEL_ID, 1984 .model_id = ATMEL_AT25F2048, 1985 .total_size = 256, 1986 .page_size = 256, 1987 .feature_bits = FEATURE_WRSR_WREN, 1988 .tested = TEST_UNTESTED, 1989 .probe = probe_spi_at25f, 1990 .probe_timing = TIMING_ZERO, 1991 .block_erasers = 1992 { 1993 { 1994 .eraseblocks = { {64 * 1024, 4} }, 1995 .block_erase = spi_block_erase_52, 1996 }, { 1997 .eraseblocks = { {256 * 1024, 1} }, 1998 .block_erase = spi_block_erase_62, 1999 } 2000 }, 2001 .printlock = spi_prettyprint_status_register_at25f, 2002 .unlock = spi_disable_blockprotect_at25f, 2003 .write = spi_chip_write_256, 2004 .read = spi_chip_read, 2005 .voltage = {2700, 3600}, 2006 }, 2007 2008 { 2009 .vendor = "Atmel", 2010 .name = "AT25F4096", 2011 .bustype = BUS_SPI, 2012 .manufacture_id = ATMEL_ID, 2013 .model_id = ATMEL_AT25F4096, 2014 .total_size = 512, 2015 .page_size = 256, 2016 .feature_bits = FEATURE_WRSR_WREN, 2017 .tested = TEST_OK_PREW, 2018 .probe = probe_spi_at25f, 2019 .probe_timing = TIMING_ZERO, 2020 .block_erasers = 2021 { 2022 { 2023 .eraseblocks = { {64 * 1024, 8} }, 2024 .block_erase = spi_block_erase_52, 2025 }, { 2026 .eraseblocks = { {512 * 1024, 1} }, 2027 .block_erase = spi_block_erase_62, 2028 } 2029 }, 2030 .printlock = spi_prettyprint_status_register_at25f4096, 2031 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */ 2032 .unlock = spi_disable_blockprotect_bp2_srwd, 2033 .write = spi_chip_write_256, 2034 .read = spi_chip_read, 2035 .voltage = {2700, 3600}, 2036 }, 2037 2038 { 2039 .vendor = "Atmel", 2040 .name = "AT25F512", 2041 .bustype = BUS_SPI, 2042 .manufacture_id = ATMEL_ID, 2043 .model_id = ATMEL_AT25F512, 2044 .total_size = 64, 2045 .page_size = 256, 2046 .feature_bits = FEATURE_WRSR_WREN, 2047 .tested = TEST_OK_PREW, 2048 .probe = probe_spi_at25f, 2049 .probe_timing = TIMING_ZERO, 2050 .block_erasers = 2051 { 2052 { 2053 .eraseblocks = { {32 * 1024, 2} }, 2054 .block_erase = spi_block_erase_52, 2055 }, { 2056 .eraseblocks = { {64 * 1024, 1} }, 2057 .block_erase = spi_block_erase_62, 2058 } 2059 }, 2060 .printlock = spi_prettyprint_status_register_at25f, 2061 .unlock = spi_disable_blockprotect_at25f, 2062 .write = spi_chip_write_256, 2063 .read = spi_chip_read, 2064 .voltage = {2700, 3600}, 2065 }, 2066 2067 { 2068 .vendor = "Atmel", 2069 .name = "AT25F512A", 2070 .bustype = BUS_SPI, 2071 .manufacture_id = ATMEL_ID, 2072 .model_id = ATMEL_AT25F512A, 2073 .total_size = 64, 2074 .page_size = 128, 2075 .feature_bits = FEATURE_WRSR_WREN, 2076 .tested = TEST_OK_PREW, 2077 .probe = probe_spi_at25f, 2078 .probe_timing = TIMING_ZERO, 2079 .block_erasers = 2080 { 2081 { 2082 .eraseblocks = { {32 * 1024, 2} }, 2083 .block_erase = spi_block_erase_52, 2084 }, { 2085 .eraseblocks = { {64 * 1024, 1} }, 2086 .block_erase = spi_block_erase_62, 2087 } 2088 }, 2089 .printlock = spi_prettyprint_status_register_at25f512a, 2090 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */ 2091 .unlock = spi_disable_blockprotect_at25f512a, 2092 .write = spi_chip_write_256, 2093 .read = spi_chip_read, 2094 .voltage = {2700, 3600}, 2095 }, 2096 2097 { 2098 .vendor = "Atmel", 2099 .name = "AT25F512B", 2100 .bustype = BUS_SPI, 2101 .manufacture_id = ATMEL_ID, 2102 .model_id = ATMEL_AT25F512B, 2103 .total_size = 64, 2104 .page_size = 256, 2105 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 2107 .tested = TEST_UNTESTED, 2108 .probe = probe_spi_rdid, 2109 .probe_timing = TIMING_ZERO, 2110 .block_erasers = 2111 { 2112 { 2113 .eraseblocks = { {4 * 1024, 16} }, 2114 .block_erase = spi_block_erase_20, 2115 }, { 2116 .eraseblocks = { {32 * 1024, 2} }, 2117 .block_erase = spi_block_erase_52, 2118 }, { 2119 .eraseblocks = { {32 * 1024, 2} }, 2120 .block_erase = spi_block_erase_d8, 2121 }, { 2122 .eraseblocks = { {64 * 1024, 1} }, 2123 .block_erase = spi_block_erase_60, 2124 }, { 2125 .eraseblocks = { {64 * 1024, 1} }, 2126 .block_erase = spi_block_erase_c7, 2127 }, { 2128 .eraseblocks = { {64 * 1024, 1} }, 2129 .block_erase = spi_block_erase_62, 2130 } 2131 }, 2132 .printlock = spi_prettyprint_status_register_at25f512b, 2133 .unlock = spi_disable_blockprotect_at25f512b, 2134 .write = spi_chip_write_256, 2135 .read = spi_chip_read, 2136 .voltage = {2700, 3600}, 2137 }, 2138 2139 { 2140 .vendor = "Atmel", 2141 .name = "AT25FS010", 2142 .bustype = BUS_SPI, 2143 .manufacture_id = ATMEL_ID, 2144 .model_id = ATMEL_AT25FS010, 2145 .total_size = 128, 2146 .page_size = 256, 2147 .feature_bits = FEATURE_WRSR_WREN, 2148 .tested = TEST_OK_PREW, 2149 .probe = probe_spi_rdid, 2150 .probe_timing = TIMING_ZERO, 2151 .block_erasers = 2152 { 2153 { 2154 .eraseblocks = { {4 * 1024, 32} }, 2155 .block_erase = spi_block_erase_20, 2156 }, { 2157 .eraseblocks = { {4 * 1024, 32} }, 2158 .block_erase = spi_block_erase_d7, 2159 }, { 2160 .eraseblocks = { {32 * 1024, 4} }, 2161 .block_erase = spi_block_erase_52, 2162 }, { 2163 .eraseblocks = { {32 * 1024, 4} }, 2164 .block_erase = spi_block_erase_d8, 2165 }, { 2166 .eraseblocks = { {128 * 1024, 1} }, 2167 .block_erase = spi_block_erase_60, 2168 }, { 2169 .eraseblocks = { {128 * 1024, 1} }, 2170 .block_erase = spi_block_erase_c7, 2171 } 2172 }, 2173 .printlock = spi_prettyprint_status_register_at25fs010, 2174 .unlock = spi_disable_blockprotect_at25fs010, 2175 .write = spi_chip_write_256, 2176 .read = spi_chip_read, 2177 .voltage = {2700, 3600}, 2178 }, 2179 2180 { 2181 .vendor = "Atmel", 2182 .name = "AT25FS040", 2183 .bustype = BUS_SPI, 2184 .manufacture_id = ATMEL_ID, 2185 .model_id = ATMEL_AT25FS040, 2186 .total_size = 512, 2187 .page_size = 256, 2188 .feature_bits = FEATURE_WRSR_WREN, 2189 .tested = TEST_UNTESTED, 2190 .probe = probe_spi_rdid, 2191 .probe_timing = TIMING_ZERO, 2192 .block_erasers = 2193 { 2194 { 2195 .eraseblocks = { {4 * 1024, 128} }, 2196 .block_erase = spi_block_erase_20, 2197 }, { 2198 .eraseblocks = { {64 * 1024, 8} }, 2199 .block_erase = spi_block_erase_52, 2200 }, { 2201 .eraseblocks = { {64 * 1024, 8} }, 2202 .block_erase = spi_block_erase_d8, 2203 }, { 2204 .eraseblocks = { {512 * 1024, 1} }, 2205 .block_erase = spi_block_erase_60, 2206 }, { 2207 .eraseblocks = { {512 * 1024, 1} }, 2208 .block_erase = spi_block_erase_c7, 2209 } 2210 }, 2211 .printlock = spi_prettyprint_status_register_at25fs040, 2212 .unlock = spi_disable_blockprotect_at25fs040, 2213 .write = spi_chip_write_256, 2214 .read = spi_chip_read, 2215 .voltage = {2700, 3600}, 2216 }, 2217 2218 { 2219 .vendor = "Atmel", 2220 .name = "AT25SF041", 2221 .bustype = BUS_SPI, 2222 .manufacture_id = ATMEL_ID, 2223 .model_id = ATMEL_AT25SF041, 2224 .total_size = 512, 2225 .page_size = 256, 2226 .feature_bits = FEATURE_WRSR_WREN, 2227 .tested = TEST_OK_PREW, 2228 .probe = probe_spi_rdid, 2229 .probe_timing = TIMING_ZERO, 2230 .block_erasers = 2231 { 2232 { 2233 .eraseblocks = { {4 * 1024, 128} }, 2234 .block_erase = spi_block_erase_20, 2235 }, { 2236 .eraseblocks = { {32 * 1024, 16} }, 2237 .block_erase = spi_block_erase_52, 2238 }, { 2239 .eraseblocks = { {64 * 1024, 8} }, 2240 .block_erase = spi_block_erase_d8, 2241 }, { 2242 .eraseblocks = { {512 * 1024, 1} }, 2243 .block_erase = spi_block_erase_60, 2244 }, { 2245 .eraseblocks = { {512 * 1024, 1} }, 2246 .block_erase = spi_block_erase_c7, 2247 } 2248 }, 2249 .printlock = spi_prettyprint_status_register_plain, 2250 .unlock = spi_disable_blockprotect, 2251 .write = spi_chip_write_256, 2252 .read = spi_chip_read, 2253 .voltage = {2500, 3600}, 2254 }, 2255 2256 { 2257 .vendor = "Atmel", 2258 .name = "AT25SF081", 2259 .bustype = BUS_SPI, 2260 .manufacture_id = ATMEL_ID, 2261 .model_id = ATMEL_AT25SF081, 2262 .total_size = 1024, 2263 .page_size = 256, 2264 .feature_bits = FEATURE_WRSR_WREN, 2265 .tested = TEST_OK_PREW, 2266 .probe = probe_spi_rdid, 2267 .probe_timing = TIMING_ZERO, 2268 .block_erasers = 2269 { 2270 { 2271 .eraseblocks = { {4 * 1024, 256} }, 2272 .block_erase = spi_block_erase_20, 2273 }, { 2274 .eraseblocks = { {32 * 1024, 32} }, 2275 .block_erase = spi_block_erase_52, 2276 }, { 2277 .eraseblocks = { {64 * 1024, 16} }, 2278 .block_erase = spi_block_erase_d8, 2279 }, { 2280 .eraseblocks = { {1024 * 1024, 1} }, 2281 .block_erase = spi_block_erase_60, 2282 }, { 2283 .eraseblocks = { {1024 * 1024, 1} }, 2284 .block_erase = spi_block_erase_c7, 2285 } 2286 }, 2287 .printlock = spi_prettyprint_status_register_plain, 2288 .unlock = spi_disable_blockprotect, 2289 .write = spi_chip_write_256, 2290 .read = spi_chip_read, 2291 .voltage = {2300, 3600}, 2292 }, 2293 2294 { 2295 .vendor = "Atmel", 2296 .name = "AT25SF161", 2297 .bustype = BUS_SPI, 2298 .manufacture_id = ATMEL_ID, 2299 .model_id = ATMEL_AT25SF161, 2300 .total_size = 2048, 2301 .page_size = 256, 2302 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 2303 .tested = TEST_OK_PREW, 2304 .probe = probe_spi_rdid, 2305 .probe_timing = TIMING_ZERO, 2306 .block_erasers = 2307 { 2308 { 2309 .eraseblocks = { {4 * 1024, 512} }, 2310 .block_erase = spi_block_erase_20, 2311 }, { 2312 .eraseblocks = { {32 * 1024, 64} }, 2313 .block_erase = spi_block_erase_52, 2314 }, { 2315 .eraseblocks = { {64 * 1024, 32} }, 2316 .block_erase = spi_block_erase_d8, 2317 }, { 2318 .eraseblocks = { {2048 * 1024, 1} }, 2319 .block_erase = spi_block_erase_60, 2320 }, { 2321 .eraseblocks = { {2048 * 1024, 1} }, 2322 .block_erase = spi_block_erase_c7, 2323 } 2324 }, 2325 .printlock = spi_prettyprint_status_register_plain, 2326 .unlock = spi_disable_blockprotect, 2327 .write = spi_chip_write_256, 2328 .read = spi_chip_read, 2329 .voltage = {2500, 3600}, 2330 }, 2331 2332 { 2333 .vendor = "Atmel", 2334 .name = "AT25SF321", 2335 .bustype = BUS_SPI, 2336 .manufacture_id = ATMEL_ID, 2337 .model_id = ATMEL_AT25SF321, 2338 .total_size = 4096, 2339 .page_size = 256, 2340 .feature_bits = FEATURE_WRSR_WREN, 2341 .tested = TEST_OK_PR, 2342 .probe = probe_spi_rdid, 2343 .probe_timing = TIMING_ZERO, 2344 .block_erasers = 2345 { 2346 { 2347 .eraseblocks = { {4 * 1024, 1024} }, 2348 .block_erase = spi_block_erase_20, 2349 }, { 2350 .eraseblocks = { {32 * 1024, 128} }, 2351 .block_erase = spi_block_erase_52, 2352 }, { 2353 .eraseblocks = { {64 * 1024, 64} }, 2354 .block_erase = spi_block_erase_d8, 2355 }, { 2356 .eraseblocks = { {4096 * 1024, 1} }, 2357 .block_erase = spi_block_erase_60, 2358 }, { 2359 .eraseblocks = { {4096 * 1024, 1} }, 2360 .block_erase = spi_block_erase_c7, 2361 } 2362 }, 2363 .printlock = spi_prettyprint_status_register_plain, 2364 .unlock = spi_disable_blockprotect, 2365 .write = spi_chip_write_256, 2366 .read = spi_chip_read, 2367 .voltage = {2500, 3600}, 2368 }, 2369 2370 { 2371 .vendor = "Atmel", 2372 .name = "AT25SL128A", 2373 .bustype = BUS_SPI, 2374 .manufacture_id = ATMEL_ID, 2375 .model_id = ATMEL_AT25SL128A, 2376 .total_size = 16384, 2377 .page_size = 256, 2378 /* supports SFDP */ 2379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 2380 .tested = TEST_OK_PREW, 2381 .probe = probe_spi_rdid, 2382 .probe_timing = TIMING_ZERO, 2383 .block_erasers = 2384 { 2385 { 2386 .eraseblocks = { {4 * 1024, 4096} }, 2387 .block_erase = spi_block_erase_20, 2388 }, { 2389 .eraseblocks = { {32 * 1024, 512} }, 2390 .block_erase = spi_block_erase_52, 2391 }, { 2392 .eraseblocks = { {64 * 1024, 256} }, 2393 .block_erase = spi_block_erase_d8, 2394 }, { 2395 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2396 .block_erase = spi_block_erase_60, 2397 }, { 2398 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2399 .block_erase = spi_block_erase_c7, 2400 } 2401 }, 2402 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 2403 .unlock = spi_disable_blockprotect, 2404 .write = spi_chip_write_256, 2405 .read = spi_chip_read, 2406 .voltage = {1700, 2000}, 2407 }, 2408 2409 { 2410 .vendor = "Atmel", 2411 .name = "AT26DF041", 2412 .bustype = BUS_SPI, 2413 .manufacture_id = ATMEL_ID, 2414 .model_id = ATMEL_AT26DF041, 2415 .total_size = 512, 2416 .page_size = 256, 2417 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2418 .tested = TEST_OK_PREW, 2419 .probe = probe_spi_rdid, 2420 .probe_timing = TIMING_ZERO, 2421 .block_erasers = 2422 { 2423 { 2424 .eraseblocks = { {256, 2048} }, 2425 .block_erase = spi_block_erase_81, 2426 }, { 2427 .eraseblocks = { {2 * 1024, 256} }, 2428 .block_erase = spi_block_erase_50, 2429 }, { 2430 .eraseblocks = { {4 * 1024, 128} }, 2431 .block_erase = spi_block_erase_20, 2432 } 2433 }, 2434 .printlock = spi_prettyprint_status_register_plain, 2435 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */ 2436 .write = spi_chip_write_1, 2437 .read = spi_chip_read, /* Fast read (0x0B) supported */ 2438 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */ 2439 }, 2440 2441 { 2442 .vendor = "Atmel", 2443 .name = "AT26DF081A", 2444 .bustype = BUS_SPI, 2445 .manufacture_id = ATMEL_ID, 2446 .model_id = ATMEL_AT26DF081A, 2447 .total_size = 1024, 2448 .page_size = 256, 2449 .feature_bits = FEATURE_WRSR_WREN, 2450 .tested = TEST_OK_PREW, 2451 .probe = probe_spi_rdid, 2452 .probe_timing = TIMING_ZERO, 2453 .block_erasers = 2454 { 2455 { 2456 .eraseblocks = { {4 * 1024, 256} }, 2457 .block_erase = spi_block_erase_20, 2458 }, { 2459 .eraseblocks = { {32 * 1024, 32} }, 2460 .block_erase = spi_block_erase_52, 2461 }, { 2462 .eraseblocks = { {64 * 1024, 16} }, 2463 .block_erase = spi_block_erase_d8, 2464 }, { 2465 .eraseblocks = { {1024 * 1024, 1} }, 2466 .block_erase = spi_block_erase_60, 2467 }, { 2468 .eraseblocks = { {1024 * 1024, 1} }, 2469 .block_erase = spi_block_erase_c7, 2470 } 2471 }, 2472 .printlock = spi_prettyprint_status_register_at26df081a, 2473 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 2474 .write = spi_chip_write_256, 2475 .read = spi_chip_read, 2476 .voltage = {2700, 3600}, 2477 }, 2478 2479 { 2480 .vendor = "Atmel", 2481 .name = "AT26DF161", 2482 .bustype = BUS_SPI, 2483 .manufacture_id = ATMEL_ID, 2484 .model_id = ATMEL_AT26DF161, 2485 .total_size = 2048, 2486 .page_size = 256, 2487 .feature_bits = FEATURE_WRSR_WREN, 2488 .tested = TEST_OK_PREW, 2489 .probe = probe_spi_rdid, 2490 .probe_timing = TIMING_ZERO, 2491 .block_erasers = 2492 { 2493 { 2494 .eraseblocks = { {4 * 1024, 512} }, 2495 .block_erase = spi_block_erase_20, 2496 }, { 2497 .eraseblocks = { {32 * 1024, 64} }, 2498 .block_erase = spi_block_erase_52, 2499 }, { 2500 .eraseblocks = { {64 * 1024, 32} }, 2501 .block_erase = spi_block_erase_d8, 2502 }, { 2503 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2504 .block_erase = spi_block_erase_60, 2505 }, { 2506 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2507 .block_erase = spi_block_erase_c7, 2508 } 2509 }, 2510 .printlock = spi_prettyprint_status_register_at25df, 2511 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 2512 .write = spi_chip_write_256, 2513 .read = spi_chip_read, 2514 .voltage = {2700, 3600}, 2515 }, 2516 2517 { 2518 .vendor = "Atmel", 2519 .name = "AT26DF161A", 2520 .bustype = BUS_SPI, 2521 .manufacture_id = ATMEL_ID, 2522 .model_id = ATMEL_AT26DF161A, 2523 .total_size = 2048, 2524 .page_size = 256, 2525 .feature_bits = FEATURE_WRSR_WREN, 2526 .tested = TEST_OK_PREW, 2527 .probe = probe_spi_rdid, 2528 .probe_timing = TIMING_ZERO, 2529 .block_erasers = 2530 { 2531 { 2532 .eraseblocks = { {4 * 1024, 512} }, 2533 .block_erase = spi_block_erase_20, 2534 }, { 2535 .eraseblocks = { {32 * 1024, 64} }, 2536 .block_erase = spi_block_erase_52, 2537 }, { 2538 .eraseblocks = { {64 * 1024, 32} }, 2539 .block_erase = spi_block_erase_d8, 2540 }, { 2541 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2542 .block_erase = spi_block_erase_60, 2543 }, { 2544 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2545 .block_erase = spi_block_erase_c7, 2546 } 2547 }, 2548 .printlock = spi_prettyprint_status_register_at26df081a, 2549 .unlock = spi_disable_blockprotect_at2x_global_unprotect, 2550 .write = spi_chip_write_256, 2551 .read = spi_chip_read, 2552 .voltage = {2700, 3600}, 2553 }, 2554 2555 { 2556 .vendor = "Atmel", 2557 .name = "AT26F004", 2558 .bustype = BUS_SPI, 2559 .manufacture_id = ATMEL_ID, 2560 .model_id = ATMEL_AT26F004, 2561 .total_size = 512, 2562 .page_size = 256, 2563 .feature_bits = FEATURE_WRSR_WREN, 2564 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD}, 2565 .probe = probe_spi_rdid, 2566 .probe_timing = TIMING_ZERO, 2567 .block_erasers = 2568 { 2569 { 2570 .eraseblocks = { {4 * 1024, 128} }, 2571 .block_erase = spi_block_erase_20, 2572 }, { 2573 .eraseblocks = { {32 * 1024, 16} }, 2574 .block_erase = spi_block_erase_52, 2575 }, { 2576 .eraseblocks = { {64 * 1024, 8} }, 2577 .block_erase = spi_block_erase_d8, 2578 }, { 2579 .eraseblocks = { {512 * 1024, 1} }, 2580 .block_erase = spi_block_erase_60, 2581 }, { 2582 .eraseblocks = { {512 * 1024, 1} }, 2583 .block_erase = spi_block_erase_c7, 2584 } 2585 }, 2586 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 2587 .write = NULL, /* Incompatible Page write */ 2588 .read = spi_chip_read, 2589 .voltage = {2700, 3600}, 2590 }, 2591 2592 { 2593 .vendor = "Atmel", 2594 .name = "AT29C010A", 2595 .bustype = BUS_PARALLEL, 2596 .manufacture_id = ATMEL_ID, 2597 .model_id = ATMEL_AT29C010A, 2598 .total_size = 128, 2599 .page_size = 128, 2600 .feature_bits = FEATURE_LONG_RESET, 2601 .tested = TEST_OK_PRE, 2602 .probe = probe_jedec, 2603 .probe_timing = 10000, /* 10mS, Enter=Exec */ 2604 .block_erasers = 2605 { 2606 { 2607 .eraseblocks = { {128 * 1024, 1} }, 2608 .block_erase = erase_chip_block_jedec, 2609 } 2610 }, 2611 .write = write_jedec, /* FIXME */ 2612 .read = read_memmapped, 2613 .voltage = {4500, 5500}, 2614 }, 2615 2616 { 2617 .vendor = "Atmel", 2618 .name = "AT29C020", 2619 .bustype = BUS_PARALLEL, 2620 .manufacture_id = ATMEL_ID, 2621 .model_id = ATMEL_AT29C020, 2622 .total_size = 256, 2623 .page_size = 256, 2624 .feature_bits = FEATURE_LONG_RESET, 2625 .tested = TEST_OK_PREW, 2626 .probe = probe_jedec, 2627 .probe_timing = 10000, /* 10ms */ 2628 .block_erasers = 2629 { 2630 { 2631 .eraseblocks = { {256 * 1024, 1} }, 2632 .block_erase = erase_chip_block_jedec, 2633 } 2634 }, 2635 .write = write_jedec, 2636 .read = read_memmapped, 2637 .voltage = {4500, 5500}, 2638 }, 2639 2640 { 2641 .vendor = "Atmel", 2642 .name = "AT29C040A", 2643 .bustype = BUS_PARALLEL, 2644 .manufacture_id = ATMEL_ID, 2645 .model_id = ATMEL_AT29C040A, 2646 .total_size = 512, 2647 .page_size = 256, 2648 .feature_bits = FEATURE_LONG_RESET, 2649 .tested = TEST_UNTESTED, 2650 .probe = probe_jedec, 2651 .probe_timing = 10000, /* 10 ms */ 2652 .block_erasers = 2653 { 2654 { 2655 .eraseblocks = { {512 * 1024, 1} }, 2656 .block_erase = erase_chip_block_jedec, 2657 } 2658 }, 2659 .write = write_jedec, 2660 .read = read_memmapped, 2661 .voltage = {4500, 5500}, 2662 }, 2663 2664 { 2665 .vendor = "Atmel", 2666 .name = "AT29C512", 2667 .bustype = BUS_PARALLEL, 2668 .manufacture_id = ATMEL_ID, 2669 .model_id = ATMEL_AT29C512, 2670 .total_size = 64, 2671 .page_size = 128, 2672 .feature_bits = FEATURE_LONG_RESET, 2673 .tested = TEST_OK_PREW, 2674 .probe = probe_jedec, 2675 .probe_timing = 10000, /* 10mS, Enter=Exec */ 2676 .block_erasers = 2677 { 2678 { 2679 .eraseblocks = { {64 * 1024, 1} }, 2680 .block_erase = erase_chip_block_jedec, 2681 } 2682 }, 2683 .write = write_jedec, 2684 .read = read_memmapped, 2685 .voltage = {4500, 5500}, 2686 }, 2687 2688 { 2689 .vendor = "Atmel", 2690 .name = "AT45CS1282", 2691 .bustype = BUS_SPI, 2692 .manufacture_id = ATMEL_ID, 2693 .model_id = ATMEL_AT45CS1282, 2694 .total_size = 16896, /* No power of two sizes */ 2695 .page_size = 1056, /* No power of two sizes */ 2696 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2697 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ 2698 .feature_bits = FEATURE_OTP, 2699 .tested = TEST_UNTESTED, 2700 .probe = probe_spi_rdid, 2701 .probe_timing = TIMING_ZERO, 2702 .block_erasers = 2703 { 2704 { 2705 .eraseblocks = { 2706 {8 * 1056, 1}, /* sector 0a: opcode 50h */ 2707 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */ 2708 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */ 2709 }, 2710 .block_erase = spi_erase_at45cs_sector, 2711 } 2712 }, 2713 .printlock = spi_prettyprint_status_register_plain, 2714 .write = spi_write_at45db, 2715 .read = spi_read_at45db, 2716 .voltage = {2700, 3600}, 2717 .gran = write_gran_1056bytes, 2718 }, 2719 2720 { 2721 .vendor = "Atmel", 2722 .name = "AT45DB011D", 2723 .bustype = BUS_SPI, 2724 .manufacture_id = ATMEL_ID, 2725 .model_id = ATMEL_AT45DB011D, 2726 .total_size = 128, /* or 132, determined from status register */ 2727 .page_size = 256, /* or 264, determined from status register */ 2728 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2729 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2730 .feature_bits = FEATURE_OTP, 2731 .tested = TEST_OK_PREW, 2732 .probe = probe_spi_at45db, 2733 .probe_timing = TIMING_ZERO, 2734 .block_erasers = 2735 { 2736 { 2737 .eraseblocks = { {256, 512} }, 2738 .block_erase = spi_erase_at45db_page, 2739 }, { 2740 .eraseblocks = { {8 * 256, 512/8} }, 2741 .block_erase = spi_erase_at45db_block, 2742 }, { 2743 .eraseblocks = { 2744 {8 * 256, 1}, 2745 {120 * 256, 1}, 2746 {128 * 256, 3}, 2747 }, 2748 .block_erase = spi_erase_at45db_sector 2749 }, { 2750 .eraseblocks = { {128 * 1024, 1} }, 2751 .block_erase = spi_erase_at45db_chip, 2752 } 2753 }, 2754 .printlock = spi_prettyprint_status_register_at45db, 2755 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 2756 /* granularity will be set by the probing function. */ 2757 .write = spi_write_at45db, 2758 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 2759 .voltage = {2700, 3600}, 2760 }, 2761 2762 { 2763 .vendor = "Atmel", 2764 .name = "AT45DB021D", 2765 .bustype = BUS_SPI, 2766 .manufacture_id = ATMEL_ID, 2767 .model_id = ATMEL_AT45DB021D, 2768 .total_size = 256, /* or 264, determined from status register */ 2769 .page_size = 256, /* or 264, determined from status register */ 2770 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2771 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2772 .feature_bits = FEATURE_OTP, 2773 .tested = TEST_OK_PREW, 2774 .probe = probe_spi_at45db, 2775 .probe_timing = TIMING_ZERO, 2776 .block_erasers = 2777 { 2778 { 2779 .eraseblocks = { {256, 1024} }, 2780 .block_erase = spi_erase_at45db_page, 2781 }, { 2782 .eraseblocks = { {8 * 256, 1024/8} }, 2783 .block_erase = spi_erase_at45db_block, 2784 }, { 2785 .eraseblocks = { 2786 {8 * 256, 1}, 2787 {120 * 256, 1}, 2788 {128 * 256, 7}, 2789 }, 2790 .block_erase = spi_erase_at45db_sector 2791 }, { 2792 .eraseblocks = { {256 * 1024, 1} }, 2793 .block_erase = spi_erase_at45db_chip, 2794 } 2795 }, 2796 .printlock = spi_prettyprint_status_register_at45db, 2797 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 2798 /* granularity will be set by the probing function. */ 2799 .write = spi_write_at45db, 2800 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 2801 .voltage = {2700, 3600}, 2802 }, 2803 2804 { 2805 .vendor = "Atmel", 2806 .name = "AT45DB041D", 2807 .bustype = BUS_SPI, 2808 .manufacture_id = ATMEL_ID, 2809 .model_id = ATMEL_AT45DB041D, 2810 .total_size = 512, /* or 528, determined from status register */ 2811 .page_size = 256, /* or 264, determined from status register */ 2812 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2813 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2814 .feature_bits = FEATURE_OTP, 2815 .tested = TEST_OK_PREW, 2816 .probe = probe_spi_at45db, 2817 .probe_timing = TIMING_ZERO, 2818 .block_erasers = 2819 { 2820 { 2821 .eraseblocks = { {256, 2048} }, 2822 .block_erase = spi_erase_at45db_page, 2823 }, { 2824 .eraseblocks = { {8 * 256, 2048/8} }, 2825 .block_erase = spi_erase_at45db_block, 2826 }, { 2827 .eraseblocks = { 2828 {8 * 256, 1}, 2829 {248 * 256, 1}, 2830 {256 * 256, 7}, 2831 }, 2832 .block_erase = spi_erase_at45db_sector 2833 }, { 2834 .eraseblocks = { {512 * 1024, 1} }, 2835 .block_erase = spi_erase_at45db_chip, 2836 } 2837 }, 2838 .printlock = spi_prettyprint_status_register_at45db, 2839 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 2840 /* granularity will be set by the probing function. */ 2841 .write = spi_write_at45db, 2842 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 2843 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 2844 }, 2845 2846 { 2847 .vendor = "Atmel", 2848 .name = "AT45DB081D", 2849 .bustype = BUS_SPI, 2850 .manufacture_id = ATMEL_ID, 2851 .model_id = ATMEL_AT45DB081D, 2852 .total_size = 1024, /* or 1056, determined from status register */ 2853 .page_size = 256, /* or 264, determined from status register */ 2854 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2855 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2856 .feature_bits = FEATURE_OTP, 2857 .tested = TEST_OK_PREW, 2858 .probe = probe_spi_at45db, 2859 .probe_timing = TIMING_ZERO, 2860 .block_erasers = 2861 { 2862 { 2863 .eraseblocks = { {256, 4096} }, 2864 .block_erase = spi_erase_at45db_page, 2865 }, { 2866 .eraseblocks = { {8 * 256, 4096/8} }, 2867 .block_erase = spi_erase_at45db_block, 2868 }, { 2869 .eraseblocks = { 2870 {8 * 256, 1}, 2871 {248 * 256, 1}, 2872 {256 * 256, 15}, 2873 }, 2874 .block_erase = spi_erase_at45db_sector 2875 }, { 2876 .eraseblocks = { {1024 * 1024, 1} }, 2877 .block_erase = spi_erase_at45db_chip, 2878 } 2879 }, 2880 .printlock = spi_prettyprint_status_register_at45db, 2881 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 2882 /* granularity will be set by the probing function. */ 2883 .write = spi_write_at45db, 2884 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 2885 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 2886 }, 2887 2888 { 2889 .vendor = "Atmel", 2890 .name = "AT45DB161D", 2891 .bustype = BUS_SPI, 2892 .manufacture_id = ATMEL_ID, 2893 .model_id = ATMEL_AT45DB161D, 2894 .total_size = 2048, /* or 2112, determined from status register */ 2895 .page_size = 512, /* or 528, determined from status register */ 2896 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2897 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2898 .feature_bits = FEATURE_OTP, 2899 .tested = TEST_OK_PREW, 2900 .probe = probe_spi_at45db, 2901 .probe_timing = TIMING_ZERO, 2902 .block_erasers = 2903 { 2904 { 2905 .eraseblocks = { {512, 4096} }, 2906 .block_erase = spi_erase_at45db_page, 2907 }, { 2908 .eraseblocks = { {8 * 512, 4096/8} }, 2909 .block_erase = spi_erase_at45db_block, 2910 }, { 2911 .eraseblocks = { 2912 {8 * 512, 1}, 2913 {248 * 512, 1}, 2914 {256 * 512, 15}, 2915 }, 2916 .block_erase = spi_erase_at45db_sector 2917 }, { 2918 .eraseblocks = { {2048 * 1024, 1} }, 2919 .block_erase = spi_erase_at45db_chip, 2920 } 2921 }, 2922 .printlock = spi_prettyprint_status_register_at45db, 2923 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 2924 /* granularity will be set by the probing function. */ 2925 .write = spi_write_at45db, 2926 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 2927 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 2928 }, 2929 2930 { 2931 .vendor = "Atmel", 2932 .name = "AT45DB321C", 2933 .bustype = BUS_SPI, 2934 .manufacture_id = ATMEL_ID, 2935 .model_id = ATMEL_AT45DB321C, 2936 .total_size = 4224, /* No power of two sizes */ 2937 .page_size = 528, /* No power of two sizes */ 2938 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2939 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ 2940 .feature_bits = FEATURE_OTP, 2941 .tested = TEST_UNTESTED, 2942 .probe = probe_spi_rdid, 2943 .probe_timing = TIMING_ZERO, 2944 .block_erasers = 2945 { 2946 { 2947 .eraseblocks = { {528, 8192} }, 2948 .block_erase = spi_erase_at45db_page, 2949 }, { 2950 .eraseblocks = { {8 * 528, 8192/8} }, 2951 .block_erase = spi_erase_at45db_block, 2952 }, /* Although the datasheets describes sectors (which can be write protected) 2953 * there seems to be no erase functions for them. 2954 { 2955 .eraseblocks = { 2956 {8 * 528, 1}, 2957 {120 * 528, 1}, 2958 {128 * 528, 63}, 2959 }, 2960 .block_erase = spi_erase_at45db_sector 2961 }, */ { 2962 .eraseblocks = { {4224 * 1024, 1} }, 2963 .block_erase = spi_erase_at45db_chip, 2964 } 2965 }, 2966 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */ 2967 .write = spi_write_at45db, 2968 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */ 2969 .voltage = {2700, 3600}, 2970 .gran = write_gran_528bytes, 2971 }, 2972 2973 { 2974 .vendor = "Atmel", 2975 .name = "AT45DB321D", 2976 .bustype = BUS_SPI, 2977 .manufacture_id = ATMEL_ID, 2978 .model_id = ATMEL_AT45DB321D, 2979 .total_size = 4096, /* or 4224, determined from status register */ 2980 .page_size = 512, /* or 528, determined from status register */ 2981 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2982 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2983 .feature_bits = FEATURE_OTP, 2984 .tested = TEST_OK_PREW, 2985 .probe = probe_spi_at45db, 2986 .probe_timing = TIMING_ZERO, 2987 .block_erasers = 2988 { 2989 { 2990 .eraseblocks = { {512, 8192} }, 2991 .block_erase = spi_erase_at45db_page, 2992 }, { 2993 .eraseblocks = { {8 * 512, 8192/8} }, 2994 .block_erase = spi_erase_at45db_block, 2995 }, { 2996 .eraseblocks = { 2997 {8 * 512, 1}, 2998 {120 * 512, 1}, 2999 {128 * 512, 63}, 3000 }, 3001 .block_erase = spi_erase_at45db_sector 3002 }, { 3003 .eraseblocks = { {4096 * 1024, 1} }, 3004 .block_erase = spi_erase_at45db_chip, 3005 } 3006 }, 3007 .printlock = spi_prettyprint_status_register_at45db, 3008 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 3009 /* granularity will be set by the probing function. */ 3010 .write = spi_write_at45db, 3011 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 3012 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 3013 }, 3014 3015 { 3016 .vendor = "Atmel", 3017 .name = "AT45DB321E", 3018 .bustype = BUS_SPI, 3019 .manufacture_id = ATMEL_ID, 3020 .model_id = ATMEL_AT45DB321C, 3021 .total_size = 4096, /* or 4224, determined from status register */ 3022 .page_size = 512, /* or 528, determined from status register */ 3023 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3024 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 3025 .feature_bits = FEATURE_OTP, 3026 .tested = TEST_UNTESTED, 3027 .probe = probe_spi_at45db, 3028 .probe_timing = TIMING_ZERO, 3029 .block_erasers = 3030 { 3031 { 3032 .eraseblocks = { {512, 8192} }, 3033 .block_erase = spi_erase_at45db_page, 3034 }, { 3035 .eraseblocks = { {8 * 512, 8192/8} }, 3036 .block_erase = spi_erase_at45db_block, 3037 }, { 3038 .eraseblocks = { 3039 {8 * 512, 1}, 3040 {120 * 512, 1}, 3041 {128 * 512, 63}, 3042 }, 3043 .block_erase = spi_erase_at45db_sector 3044 }, { 3045 .eraseblocks = { {4096 * 1024, 1} }, 3046 .block_erase = spi_erase_at45db_chip, 3047 } 3048 }, 3049 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */ 3050 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 3051 /* granularity will be set by the probing function. */ 3052 .write = spi_write_at45db, 3053 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 3054 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */ 3055 }, 3056 3057 { 3058 .vendor = "Atmel", 3059 .name = "AT45DB642D", 3060 .bustype = BUS_SPI, 3061 .manufacture_id = ATMEL_ID, 3062 .model_id = ATMEL_AT45DB642D, 3063 .total_size = 8192, /* or 8448, determined from status register */ 3064 .page_size = 1024, /* or 1056, determined from status register */ 3065 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3066 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 3067 .feature_bits = FEATURE_OTP, 3068 .tested = TEST_OK_PREW, 3069 .probe = probe_spi_at45db, 3070 .probe_timing = TIMING_ZERO, 3071 .block_erasers = 3072 { 3073 { 3074 .eraseblocks = { {1024, 8192} }, 3075 .block_erase = spi_erase_at45db_page, 3076 }, { 3077 .eraseblocks = { {8 * 1024, 8192/8} }, 3078 .block_erase = spi_erase_at45db_block, 3079 }, { 3080 .eraseblocks = { 3081 {8 * 1024, 1}, 3082 {248 * 1024, 1}, 3083 {256 * 1024, 31}, 3084 }, 3085 .block_erase = spi_erase_at45db_sector 3086 }, { 3087 .eraseblocks = { {8192 * 1024, 1} }, 3088 .block_erase = spi_erase_at45db_chip, 3089 } 3090 }, 3091 .printlock = spi_prettyprint_status_register_at45db, 3092 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */ 3093 /* granularity will be set by the probing function. */ 3094 .write = spi_write_at45db, 3095 .read = spi_read_at45db, /* Fast read (0x0B) supported */ 3096 .voltage = {2700, 3600}, 3097 }, 3098 3099 { 3100 .vendor = "Atmel", 3101 .name = "AT49(H)F010", 3102 .bustype = BUS_PARALLEL, 3103 .manufacture_id = ATMEL_ID, 3104 .model_id = ATMEL_AT49F010, 3105 .total_size = 128, 3106 .page_size = 0, /* unused */ 3107 .feature_bits = FEATURE_EITHER_RESET, 3108 .tested = TEST_OK_PREW, 3109 .probe = probe_jedec, 3110 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3111 .block_erasers = 3112 { 3113 { 3114 .eraseblocks = { {128 * 1024, 1} }, 3115 .block_erase = erase_chip_block_jedec, 3116 } 3117 }, 3118 .printlock = printlock_at49f, 3119 .write = write_jedec_1, 3120 .read = read_memmapped, 3121 .voltage = {4500, 5500}, 3122 }, 3123 3124 { 3125 .vendor = "Atmel", 3126 .name = "AT49BV512", 3127 .bustype = BUS_PARALLEL, 3128 .manufacture_id = ATMEL_ID, 3129 .model_id = ATMEL_AT49BV512, 3130 .total_size = 64, 3131 .page_size = 64, 3132 .feature_bits = FEATURE_EITHER_RESET, 3133 .tested = TEST_OK_PREW, 3134 .probe = probe_jedec, 3135 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3136 .block_erasers = 3137 { 3138 { 3139 .eraseblocks = { {64 * 1024, 1} }, 3140 .block_erase = erase_chip_block_jedec, 3141 } 3142 }, 3143 .write = write_jedec_1, 3144 .read = read_memmapped, 3145 .voltage = {2700, 3600}, 3146 }, 3147 3148 { 3149 .vendor = "Atmel", 3150 .name = "AT49F002(N)", 3151 .bustype = BUS_PARALLEL, 3152 .manufacture_id = ATMEL_ID, 3153 .model_id = ATMEL_AT49F002N, 3154 .total_size = 256, 3155 .page_size = 256, 3156 .feature_bits = FEATURE_EITHER_RESET, 3157 .tested = TEST_UNTESTED, 3158 .probe = probe_jedec, 3159 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3160 .block_erasers = 3161 { 3162 { 3163 .eraseblocks = { 3164 {16 * 1024, 1}, 3165 {8 * 1024, 2}, 3166 {96 * 1024, 1}, 3167 {128 * 1024, 1}, 3168 }, 3169 .block_erase = erase_sector_jedec, 3170 }, { 3171 .eraseblocks = { {256 * 1024, 1} }, 3172 .block_erase = erase_chip_block_jedec, 3173 } 3174 }, 3175 .write = write_jedec_1, 3176 .read = read_memmapped, 3177 .voltage = {4500, 5500}, 3178 }, 3179 3180 { 3181 .vendor = "Atmel", 3182 .name = "AT49F002(N)T", 3183 .bustype = BUS_PARALLEL, 3184 .manufacture_id = ATMEL_ID, 3185 .model_id = ATMEL_AT49F002NT, 3186 .total_size = 256, 3187 .page_size = 256, 3188 .feature_bits = FEATURE_EITHER_RESET, 3189 .tested = TEST_OK_PR, 3190 .probe = probe_jedec, 3191 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3192 .block_erasers = 3193 { 3194 { 3195 .eraseblocks = { 3196 {128 * 1024, 1}, 3197 {96 * 1024, 1}, 3198 {8 * 1024, 2}, 3199 {16 * 1024, 1}, 3200 }, 3201 .block_erase = erase_sector_jedec, 3202 }, { 3203 .eraseblocks = { {256 * 1024, 1} }, 3204 .block_erase = erase_chip_block_jedec, 3205 } 3206 }, 3207 .write = write_jedec_1, 3208 .read = read_memmapped, 3209 .voltage = {4500, 5500}, 3210 }, 3211 3212 { 3213 .vendor = "Atmel", 3214 .name = "AT49F020", 3215 .bustype = BUS_PARALLEL, 3216 .manufacture_id = ATMEL_ID, 3217 .model_id = ATMEL_AT49F020, 3218 .total_size = 256, 3219 .page_size = 0, /* unused */ 3220 .feature_bits = FEATURE_EITHER_RESET, 3221 .tested = TEST_OK_PRE, 3222 .probe = probe_jedec, 3223 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3224 .block_erasers = 3225 { 3226 { 3227 .eraseblocks = { {256 * 1024, 1} }, 3228 .block_erase = erase_chip_block_jedec, 3229 } 3230 /* Chip features an optional permanent write protection 3231 * of the first 8 kB. The erase function is the same as 3232 * above, but 00000H to 01FFFH will not be erased. 3233 * FIXME: add another eraser when partial erasers are 3234 * supported. 3235 */ 3236 }, 3237 .printlock = printlock_at49f, 3238 .write = write_jedec_1, 3239 .read = read_memmapped, 3240 .voltage = {4500, 5500}, 3241 }, 3242 3243 { 3244 .vendor = "Atmel", 3245 .name = "AT49F040", 3246 .bustype = BUS_PARALLEL, 3247 .manufacture_id = ATMEL_ID, 3248 .model_id = ATMEL_AT49F040, 3249 .total_size = 512, 3250 .page_size = 0, /* unused */ 3251 .feature_bits = FEATURE_EITHER_RESET, 3252 .tested = TEST_UNTESTED, 3253 .probe = probe_jedec, 3254 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3255 .block_erasers = 3256 { 3257 { 3258 .eraseblocks = { {512 * 1024, 1} }, 3259 .block_erase = erase_chip_block_jedec, 3260 } 3261 /* Chip features an optional permanent write protection 3262 * of the first 16 kB. The erase function is the same as 3263 * above, but 00000H to 03FFFH will not be erased. 3264 * FIXME: add another eraser when partial erasers are 3265 * supported. 3266 */ 3267 }, 3268 .printlock = printlock_at49f, 3269 .write = write_jedec_1, 3270 .read = read_memmapped, 3271 .voltage = {4500, 5500}, 3272 }, 3273 3274 { 3275 .vendor = "Atmel", 3276 .name = "AT49F080", 3277 .bustype = BUS_PARALLEL, 3278 .manufacture_id = ATMEL_ID, 3279 .model_id = ATMEL_AT49F080, 3280 .total_size = 1024, 3281 .page_size = 0, /* unused */ 3282 .feature_bits = FEATURE_EITHER_RESET, 3283 .tested = TEST_UNTESTED, 3284 .probe = probe_jedec, 3285 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3286 .block_erasers = 3287 { 3288 { 3289 .eraseblocks = { {1024 * 1024, 1} }, 3290 .block_erase = erase_chip_block_jedec, 3291 } 3292 /* Chip features an optional permanent write protection 3293 * of the first 16 kB. The erase function is the same as 3294 * above, but 00000H to 03FFFH will not be erased. 3295 * FIXME: add another eraser when partial erasers are 3296 * supported. 3297 */ 3298 }, 3299 .printlock = printlock_at49f, 3300 .write = write_jedec_1, 3301 .read = read_memmapped, 3302 .voltage = {4500, 5500}, 3303 }, 3304 3305 { 3306 /* 'top' version of AT49F080. equal in all aspects but the boot block address */ 3307 .vendor = "Atmel", 3308 .name = "AT49F080T", 3309 .bustype = BUS_PARALLEL, 3310 .manufacture_id = ATMEL_ID, 3311 .model_id = ATMEL_AT49F080T, 3312 .total_size = 1024, 3313 .page_size = 0, /* unused */ 3314 .feature_bits = FEATURE_EITHER_RESET, 3315 .tested = TEST_UNTESTED, 3316 .probe = probe_jedec, 3317 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3318 .block_erasers = 3319 { 3320 { 3321 .eraseblocks = { {1024 * 1024, 1} }, 3322 .block_erase = erase_chip_block_jedec, 3323 } 3324 /* Chip features an optional permanent write protection 3325 * of the first 16 kB. The erase function is the same as 3326 * above, but FC000H to FFFFFH will not be erased. 3327 * FIXME: add another eraser when partial erasers are 3328 * supported. 3329 */ 3330 }, 3331 .printlock = printlock_at49f, 3332 .write = write_jedec_1, 3333 .read = read_memmapped, 3334 .voltage = {4500, 5500}, 3335 }, 3336 3337 { 3338 .vendor = "Atmel", 3339 .name = "AT49LH002", 3340 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3341 .manufacture_id = ATMEL_ID, 3342 .model_id = ATMEL_AT49LH002, 3343 .total_size = 256, 3344 .page_size = 0, /* unused */ 3345 .feature_bits = FEATURE_REGISTERMAP, 3346 .tested = TEST_UNTESTED, 3347 .probe = probe_82802ab, 3348 .probe_timing = TIMING_ZERO, 3349 .block_erasers = 3350 { 3351 { 3352 .eraseblocks = { 3353 {64 * 1024, 3}, 3354 {32 * 1024, 1}, 3355 {8 * 1024, 2}, 3356 {16 * 1024, 1}, 3357 }, 3358 .block_erase = NULL, /* TODO: Implement. */ 3359 }, { 3360 .eraseblocks = { 3361 {64 * 1024, 4}, 3362 }, 3363 .block_erase = erase_block_82802ab, 3364 }, 3365 }, 3366 .printlock = printlock_regspace2_block_eraser_0, 3367 .unlock = unlock_regspace2_block_eraser_0, 3368 .write = write_82802ab, 3369 .read = read_memmapped, 3370 .voltage = {3000, 3600}, 3371 }, 3372 3373 { 3374 .vendor = "Atmel", 3375 .name = "AT49LH004", 3376 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3377 .manufacture_id = ATMEL_ID, 3378 .model_id = ATMEL_AT49LH004, 3379 .total_size = 512, 3380 .page_size = 0, /* unused */ 3381 .feature_bits = FEATURE_REGISTERMAP, 3382 .tested = TEST_UNTESTED, 3383 .probe = probe_82802ab, 3384 .probe_timing = TIMING_ZERO, 3385 .block_erasers = 3386 { 3387 { 3388 .eraseblocks = { 3389 {64 * 1024, 7}, 3390 {32 * 1024, 1}, 3391 {8 * 1024, 2}, 3392 {16 * 1024, 1}, 3393 }, 3394 .block_erase = erase_block_82802ab, 3395 }, { 3396 .eraseblocks = { 3397 {64 * 1024, 8}, 3398 }, 3399 .block_erase = NULL, /* TODO: Implement. */ 3400 }, 3401 }, 3402 .printlock = printlock_regspace2_block_eraser_0, 3403 .unlock = unlock_regspace2_block_eraser_0, 3404 .write = write_82802ab, 3405 .read = read_memmapped, 3406 .voltage = {3000, 3600}, 3407 }, 3408 3409 { 3410 .vendor = "Atmel", 3411 .name = "AT49LH00B4", 3412 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3413 .manufacture_id = ATMEL_ID, 3414 .model_id = ATMEL_AT49LH00B4, 3415 .total_size = 512, 3416 .page_size = 0, /* unused */ 3417 .feature_bits = FEATURE_REGISTERMAP, 3418 .tested = TEST_UNTESTED, 3419 .probe = probe_82802ab, 3420 .probe_timing = TIMING_ZERO, 3421 .block_erasers = 3422 { 3423 { 3424 .eraseblocks = { 3425 {8 * 1024, 2}, 3426 {16 * 1024, 1}, 3427 {32 * 1024, 1}, 3428 {64 * 1024, 7}, 3429 }, 3430 .block_erase = NULL, /* TODO: Implement. */ 3431 }, { 3432 .eraseblocks = { 3433 {64 * 1024, 8}, 3434 }, 3435 .block_erase = erase_block_82802ab, 3436 }, 3437 }, 3438 .printlock = printlock_regspace2_block_eraser_0, 3439 .unlock = unlock_regspace2_block_eraser_0, 3440 .write = write_82802ab, 3441 .read = read_memmapped, 3442 .voltage = {3000, 3600}, 3443 }, 3444 3445 { 3446 .vendor = "Bright", 3447 .name = "BM29F040", 3448 .bustype = BUS_PARALLEL, 3449 .manufacture_id = BRIGHT_ID, 3450 .model_id = BRIGHT_BM29F040, 3451 .total_size = 512, 3452 .page_size = 64 * 1024, 3453 .feature_bits = FEATURE_EITHER_RESET, 3454 .tested = TEST_OK_PR, 3455 .probe = probe_jedec, 3456 .probe_timing = TIMING_ZERO, 3457 .block_erasers = 3458 { 3459 { 3460 .eraseblocks = { {64 * 1024, 8} }, 3461 .block_erase = erase_sector_jedec, 3462 }, { 3463 .eraseblocks = { {512 * 1024, 1} }, 3464 .block_erase = erase_chip_block_jedec, 3465 }, 3466 }, 3467 .write = write_jedec_1, 3468 .read = read_memmapped, 3469 .voltage = {4500, 5500}, 3470 }, 3471 3472 { 3473 .vendor = "Catalyst", 3474 .name = "CAT28F512", 3475 .bustype = BUS_PARALLEL, 3476 .manufacture_id = CATALYST_ID, 3477 .model_id = CATALYST_CAT28F512, 3478 .total_size = 64, 3479 .page_size = 0, /* unused */ 3480 .feature_bits = 0, 3481 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD}, 3482 .probe = probe_jedec, /* FIXME! */ 3483 .probe_timing = TIMING_ZERO, 3484 .block_erasers = 3485 { 3486 { 3487 .eraseblocks = { {64 * 1024, 1} }, 3488 .block_erase = NULL, /* TODO */ 3489 }, 3490 }, 3491 .write = NULL, /* TODO */ 3492 .read = read_memmapped, 3493 .voltage = {4500, 5500}, 3494 }, 3495 3496 { 3497 .vendor = "ENE", 3498 .name = "KB9012 (EDI)", 3499 .bustype = BUS_SPI, 3500 .total_size = 128, 3501 .page_size = 128, 3502 .feature_bits = FEATURE_ERASED_ZERO, 3503 .tested = TEST_OK_PREW, 3504 .spi_cmd_set = SPI_EDI, 3505 .probe = edi_probe_kb9012, 3506 .probe_timing = TIMING_ZERO, 3507 .block_erasers = 3508 { 3509 { 3510 .eraseblocks = { {128, 1024} }, 3511 .block_erase = edi_chip_block_erase, 3512 }, 3513 }, 3514 .write = edi_chip_write, 3515 .read = edi_chip_read, 3516 .voltage = {2700, 3600}, 3517 .gran = write_gran_128bytes, 3518 }, 3519 3520 { 3521 .vendor = "ESI", 3522 .name = "ES25P16", 3523 .bustype = BUS_SPI, 3524 .manufacture_id = EXCEL_ID_NOPREFIX, 3525 .model_id = EXCEL_ES25P16, 3526 .total_size = 2 * 1024, 3527 .page_size = 256, 3528 /* 256-byte parameter page separate from memory array: 3529 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3530 .feature_bits = FEATURE_WRSR_WREN, 3531 .tested = TEST_UNTESTED, 3532 .probe = probe_spi_rdid, 3533 .probe_timing = TIMING_ZERO, 3534 .block_erasers = 3535 { 3536 { 3537 .eraseblocks = { {64 * 1024, 32} }, 3538 .block_erase = spi_block_erase_d8, 3539 }, { 3540 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3541 .block_erase = spi_block_erase_c7, 3542 } 3543 }, 3544 .printlock = spi_prettyprint_status_register_bp2_srwd, 3545 .unlock = spi_disable_blockprotect_bp2_srwd, 3546 .write = spi_chip_write_256, 3547 .read = spi_chip_read, /* Fast Read (0x0B) supported */ 3548 .voltage = {2700, 3600}, 3549 }, 3550 3551 { 3552 .vendor = "ESI", 3553 .name = "ES25P40", 3554 .bustype = BUS_SPI, 3555 .manufacture_id = EXCEL_ID_NOPREFIX, 3556 .model_id = EXCEL_ES25P40, 3557 .total_size = 512, 3558 .page_size = 256, 3559 /* 256-byte parameter page separate from memory array: 3560 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3561 .feature_bits = FEATURE_WRSR_WREN, 3562 .tested = TEST_UNTESTED, 3563 .probe = probe_spi_rdid, 3564 .probe_timing = TIMING_ZERO, 3565 .block_erasers = 3566 { 3567 { 3568 .eraseblocks = { {64 * 1024, 8} }, 3569 .block_erase = spi_block_erase_d8, 3570 }, { 3571 .eraseblocks = { {512 * 1024, 1} }, 3572 .block_erase = spi_block_erase_c7, 3573 } 3574 }, 3575 .printlock = spi_prettyprint_status_register_bp2_srwd, 3576 .unlock = spi_disable_blockprotect_bp2_srwd, 3577 .write = spi_chip_write_256, 3578 .read = spi_chip_read, /* Fast Read (0x0B) supported */ 3579 .voltage = {2700, 3600}, 3580 }, 3581 3582 { 3583 .vendor = "ESI", 3584 .name = "ES25P80", 3585 .bustype = BUS_SPI, 3586 .manufacture_id = EXCEL_ID_NOPREFIX, 3587 .model_id = EXCEL_ES25P80, 3588 .total_size = 1024, 3589 .page_size = 256, 3590 /* 256-byte parameter page separate from memory array: 3591 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3592 .feature_bits = FEATURE_WRSR_WREN, 3593 .tested = TEST_UNTESTED, 3594 .probe = probe_spi_rdid, 3595 .probe_timing = TIMING_ZERO, 3596 .block_erasers = 3597 { 3598 { 3599 .eraseblocks = { {64 * 1024, 16} }, 3600 .block_erase = spi_block_erase_d8, 3601 }, { 3602 .eraseblocks = { {1024 * 1024, 1} }, 3603 .block_erase = spi_block_erase_c7, 3604 } 3605 }, 3606 .printlock = spi_prettyprint_status_register_bp2_srwd, 3607 .unlock = spi_disable_blockprotect_bp2_srwd, 3608 .write = spi_chip_write_256, 3609 .read = spi_chip_read, /* Fast Read (0x0B) supported */ 3610 .voltage = {2700, 3600}, 3611 }, 3612 3613 { 3614 .vendor = "ESMT", 3615 .name = "F25L008A", 3616 .bustype = BUS_SPI, 3617 .manufacture_id = ESMT_ID, 3618 .model_id = ESMT_F25L008A, 3619 .total_size = 1024, 3620 .page_size = 256, 3621 .feature_bits = FEATURE_WRSR_EITHER, 3622 .tested = TEST_OK_PREW, 3623 .probe = probe_spi_rdid, 3624 .probe_timing = TIMING_ZERO, 3625 .block_erasers = 3626 { 3627 { 3628 .eraseblocks = { {4 * 1024, 256} }, 3629 .block_erase = spi_block_erase_20, 3630 }, { 3631 .eraseblocks = { {64 * 1024, 16} }, 3632 .block_erase = spi_block_erase_d8, 3633 }, { 3634 .eraseblocks = { {1024 * 1024, 1} }, 3635 .block_erase = spi_block_erase_60, 3636 }, { 3637 .eraseblocks = { {1024 * 1024, 1} }, 3638 .block_erase = spi_block_erase_c7, 3639 } 3640 }, 3641 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3642 .unlock = spi_disable_blockprotect, 3643 .write = spi_chip_write_1, 3644 .read = spi_chip_read, 3645 .voltage = {2700, 3600}, 3646 }, 3647 3648 { 3649 .vendor = "ESMT", 3650 .name = "F25L32PA", 3651 .bustype = BUS_SPI, 3652 .manufacture_id = ESMT_ID, 3653 .model_id = ESMT_F25L32PA, 3654 .total_size = 4096, 3655 .page_size = 256, 3656 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP, 3657 .tested = TEST_UNTESTED, 3658 .probe = probe_spi_rdid, 3659 .probe_timing = TIMING_ZERO, 3660 .block_erasers = 3661 { 3662 { 3663 .eraseblocks = { {4 * 1024, 1024} }, 3664 .block_erase = spi_block_erase_20, 3665 }, { 3666 .eraseblocks = { {64 * 1024, 64} }, 3667 .block_erase = spi_block_erase_d8, 3668 }, { 3669 .eraseblocks = { {4 * 1024 * 1024, 1} }, 3670 .block_erase = spi_block_erase_60, 3671 }, { 3672 .eraseblocks = { {4 * 1024 * 1024, 1} }, 3673 .block_erase = spi_block_erase_c7, 3674 } 3675 }, 3676 .printlock = spi_prettyprint_status_register_bp2_bpl, 3677 .unlock = spi_disable_blockprotect, 3678 .write = spi_chip_write_256, 3679 .read = spi_chip_read, 3680 .voltage = {2700, 3600}, 3681 }, 3682 3683 { 3684 .vendor = "ESMT", 3685 .name = "F49B002UA", 3686 .bustype = BUS_PARALLEL, 3687 .manufacture_id = ESMT_ID, 3688 .model_id = ESMT_F49B002UA, 3689 .total_size = 256, 3690 .page_size = 4096, 3691 .feature_bits = FEATURE_EITHER_RESET, 3692 .tested = TEST_UNTESTED, 3693 .probe = probe_jedec, 3694 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3695 .block_erasers = 3696 { 3697 { 3698 .eraseblocks = { 3699 {128 * 1024, 1}, 3700 {96 * 1024, 1}, 3701 {8 * 1024, 2}, 3702 {16 * 1024, 1}, 3703 }, 3704 .block_erase = erase_sector_jedec, 3705 }, { 3706 .eraseblocks = { {256 * 1024, 1} }, 3707 .block_erase = erase_chip_block_jedec, 3708 } 3709 }, 3710 .write = write_jedec_1, 3711 .read = read_memmapped, 3712 .voltage = {4500, 5500}, 3713 }, 3714 3715 { 3716 .vendor = "Eon", 3717 .name = "EN25B05", 3718 .bustype = BUS_SPI, 3719 .manufacture_id = EON_ID_NOPREFIX, 3720 .model_id = EON_EN25B05, 3721 .total_size = 64, 3722 .page_size = 256, 3723 .feature_bits = FEATURE_WRSR_WREN, 3724 .tested = TEST_UNTESTED, 3725 .probe = probe_spi_rdid, 3726 .probe_timing = TIMING_ZERO, 3727 .block_erasers = 3728 { 3729 { 3730 .eraseblocks = { 3731 {4 * 1024, 2}, 3732 {8 * 1024, 1}, 3733 {16 * 1024, 1}, 3734 {32 * 1024, 1}, 3735 }, 3736 .block_erase = spi_block_erase_d8, 3737 }, { 3738 .eraseblocks = { {64 * 1024, 1} }, 3739 .block_erase = spi_block_erase_c7, 3740 } 3741 }, 3742 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3743 .unlock = spi_disable_blockprotect, 3744 .write = spi_chip_write_256, 3745 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3746 .voltage = {2700, 3600}, 3747 }, 3748 3749 { 3750 .vendor = "Eon", 3751 .name = "EN25B05T", 3752 .bustype = BUS_SPI, 3753 .manufacture_id = EON_ID_NOPREFIX, 3754 .model_id = EON_EN25B05, 3755 .total_size = 64, 3756 .page_size = 256, 3757 .feature_bits = FEATURE_WRSR_WREN, 3758 .tested = TEST_UNTESTED, 3759 .probe = probe_spi_rdid, 3760 .probe_timing = TIMING_ZERO, 3761 .block_erasers = 3762 { 3763 { 3764 .eraseblocks = { 3765 {32 * 1024, 1}, 3766 {16 * 1024, 1}, 3767 {8 * 1024, 1}, 3768 {4 * 1024, 2}, 3769 }, 3770 .block_erase = spi_block_erase_d8, 3771 }, { 3772 .eraseblocks = { {64 * 1024, 1} }, 3773 .block_erase = spi_block_erase_c7, 3774 } 3775 }, 3776 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3777 .unlock = spi_disable_blockprotect, 3778 .write = spi_chip_write_256, 3779 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3780 .voltage = {2700, 3600}, 3781 }, 3782 3783 { 3784 .vendor = "Eon", 3785 .name = "EN25B10", 3786 .bustype = BUS_SPI, 3787 .manufacture_id = EON_ID_NOPREFIX, 3788 .model_id = EON_EN25B10, 3789 .total_size = 128, 3790 .page_size = 256, 3791 .feature_bits = FEATURE_WRSR_WREN, 3792 .tested = TEST_UNTESTED, 3793 .probe = probe_spi_rdid, 3794 .probe_timing = TIMING_ZERO, 3795 .block_erasers = 3796 { 3797 { 3798 .eraseblocks = { 3799 {4 * 1024, 2}, 3800 {8 * 1024, 1}, 3801 {16 * 1024, 1}, 3802 {32 * 1024, 3}, 3803 }, 3804 .block_erase = spi_block_erase_d8, 3805 }, { 3806 .eraseblocks = { {128 * 1024, 1} }, 3807 .block_erase = spi_block_erase_c7, 3808 } 3809 }, 3810 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3811 .unlock = spi_disable_blockprotect, 3812 .write = spi_chip_write_256, 3813 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3814 .voltage = {2700, 3600}, 3815 }, 3816 3817 { 3818 .vendor = "Eon", 3819 .name = "EN25B10T", 3820 .bustype = BUS_SPI, 3821 .manufacture_id = EON_ID_NOPREFIX, 3822 .model_id = EON_EN25B10, 3823 .total_size = 128, 3824 .page_size = 256, 3825 .feature_bits = FEATURE_WRSR_WREN, 3826 .tested = TEST_OK_PREW, 3827 .probe = probe_spi_rdid, 3828 .probe_timing = TIMING_ZERO, 3829 .block_erasers = 3830 { 3831 { 3832 .eraseblocks = { 3833 {32 * 1024, 3}, 3834 {16 * 1024, 1}, 3835 {8 * 1024, 1}, 3836 {4 * 1024, 2}, 3837 }, 3838 .block_erase = spi_block_erase_d8, 3839 }, { 3840 .eraseblocks = { {128 * 1024, 1} }, 3841 .block_erase = spi_block_erase_c7, 3842 } 3843 }, 3844 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3845 .unlock = spi_disable_blockprotect, 3846 .write = spi_chip_write_256, 3847 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3848 .voltage = {2700, 3600}, 3849 }, 3850 3851 { 3852 .vendor = "Eon", 3853 .name = "EN25B16", 3854 .bustype = BUS_SPI, 3855 .manufacture_id = EON_ID_NOPREFIX, 3856 .model_id = EON_EN25B16, 3857 .total_size = 2048, 3858 .page_size = 256, 3859 .feature_bits = FEATURE_WRSR_WREN, 3860 .tested = TEST_UNTESTED, 3861 .probe = probe_spi_rdid, 3862 .probe_timing = TIMING_ZERO, 3863 .block_erasers = 3864 { 3865 { 3866 .eraseblocks = { 3867 {4 * 1024, 2}, 3868 {8 * 1024, 1}, 3869 {16 * 1024, 1}, 3870 {32 * 1024, 1}, 3871 {64 * 1024, 31}, 3872 }, 3873 .block_erase = spi_block_erase_d8, 3874 }, { 3875 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3876 .block_erase = spi_block_erase_c7, 3877 } 3878 }, 3879 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3880 .unlock = spi_disable_blockprotect, 3881 .write = spi_chip_write_256, 3882 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3883 .voltage = {2700, 3600}, 3884 }, 3885 3886 { 3887 .vendor = "Eon", 3888 .name = "EN25B16T", 3889 .bustype = BUS_SPI, 3890 .manufacture_id = EON_ID_NOPREFIX, 3891 .model_id = EON_EN25B16, 3892 .total_size = 2048, 3893 .page_size = 256, 3894 .feature_bits = FEATURE_WRSR_WREN, 3895 .tested = TEST_UNTESTED, 3896 .probe = probe_spi_rdid, 3897 .probe_timing = TIMING_ZERO, 3898 .block_erasers = 3899 { 3900 { 3901 .eraseblocks = { 3902 {64 * 1024, 31}, 3903 {32 * 1024, 1}, 3904 {16 * 1024, 1}, 3905 {8 * 1024, 1}, 3906 {4 * 1024, 2}, 3907 }, 3908 .block_erase = spi_block_erase_d8, 3909 }, { 3910 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3911 .block_erase = spi_block_erase_c7, 3912 } 3913 }, 3914 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3915 .unlock = spi_disable_blockprotect, 3916 .write = spi_chip_write_256, 3917 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3918 .voltage = {2700, 3600}, 3919 }, 3920 3921 { 3922 .vendor = "Eon", 3923 .name = "EN25B20", 3924 .bustype = BUS_SPI, 3925 .manufacture_id = EON_ID_NOPREFIX, 3926 .model_id = EON_EN25B20, 3927 .total_size = 256, 3928 .page_size = 256, 3929 .feature_bits = FEATURE_WRSR_WREN, 3930 .tested = TEST_UNTESTED, 3931 .probe = probe_spi_rdid, 3932 .probe_timing = TIMING_ZERO, 3933 .block_erasers = 3934 { 3935 { 3936 .eraseblocks = { 3937 {4 * 1024, 2}, 3938 {8 * 1024, 1}, 3939 {16 * 1024, 1}, 3940 {32 * 1024, 1}, 3941 {64 * 1024, 3} 3942 }, 3943 .block_erase = spi_block_erase_d8, 3944 }, { 3945 .eraseblocks = { {256 * 1024, 1} }, 3946 .block_erase = spi_block_erase_c7, 3947 } 3948 }, 3949 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3950 .unlock = spi_disable_blockprotect, 3951 .write = spi_chip_write_256, 3952 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3953 .voltage = {2700, 3600}, 3954 }, 3955 3956 { 3957 .vendor = "Eon", 3958 .name = "EN25B20T", 3959 .bustype = BUS_SPI, 3960 .manufacture_id = EON_ID_NOPREFIX, 3961 .model_id = EON_EN25B20, 3962 .total_size = 256, 3963 .page_size = 256, 3964 .feature_bits = FEATURE_WRSR_WREN, 3965 .tested = TEST_UNTESTED, 3966 .probe = probe_spi_rdid, 3967 .probe_timing = TIMING_ZERO, 3968 .block_erasers = 3969 { 3970 { 3971 .eraseblocks = { 3972 {64 * 1024, 3}, 3973 {32 * 1024, 1}, 3974 {16 * 1024, 1}, 3975 {8 * 1024, 1}, 3976 {4 * 1024, 2}, 3977 }, 3978 .block_erase = spi_block_erase_d8, 3979 }, { 3980 .eraseblocks = { {256 * 1024, 1} }, 3981 .block_erase = spi_block_erase_c7, 3982 } 3983 }, 3984 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 3985 .unlock = spi_disable_blockprotect, 3986 .write = spi_chip_write_256, 3987 .read = spi_chip_read, /* Fast read (0x0B) supported */ 3988 .voltage = {2700, 3600}, 3989 }, 3990 3991 { 3992 .vendor = "Eon", 3993 .name = "EN25B32", 3994 .bustype = BUS_SPI, 3995 .manufacture_id = EON_ID_NOPREFIX, 3996 .model_id = EON_EN25B32, 3997 .total_size = 4096, 3998 .page_size = 256, 3999 /* OTP: 512B total; enter 0x3A */ 4000 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4001 .tested = TEST_UNTESTED, 4002 .probe = probe_spi_rdid, 4003 .probe_timing = TIMING_ZERO, 4004 .block_erasers = 4005 { 4006 { 4007 .eraseblocks = { 4008 {4 * 1024, 2}, 4009 {8 * 1024, 1}, 4010 {16 * 1024, 1}, 4011 {32 * 1024, 1}, 4012 {64 * 1024, 63}, 4013 }, 4014 .block_erase = spi_block_erase_d8, 4015 }, { 4016 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4017 .block_erase = spi_block_erase_c7, 4018 } 4019 }, 4020 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4021 .unlock = spi_disable_blockprotect, 4022 .write = spi_chip_write_256, 4023 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4024 .voltage = {2700, 3600}, 4025 }, 4026 4027 { 4028 .vendor = "Eon", 4029 .name = "EN25B32T", 4030 .bustype = BUS_SPI, 4031 .manufacture_id = EON_ID_NOPREFIX, 4032 .model_id = EON_EN25B32, 4033 .total_size = 4096, 4034 .page_size = 256, 4035 /* OTP: 512B total; enter 0x3A */ 4036 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4037 .tested = TEST_UNTESTED, 4038 .probe = probe_spi_rdid, 4039 .probe_timing = TIMING_ZERO, 4040 .block_erasers = 4041 { 4042 { 4043 .eraseblocks = { 4044 {64 * 1024, 63}, 4045 {32 * 1024, 1}, 4046 {16 * 1024, 1}, 4047 {8 * 1024, 1}, 4048 {4 * 1024, 2}, 4049 }, 4050 .block_erase = spi_block_erase_d8, 4051 }, { 4052 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4053 .block_erase = spi_block_erase_c7, 4054 } 4055 }, 4056 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4057 .unlock = spi_disable_blockprotect, 4058 .write = spi_chip_write_256, 4059 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4060 .voltage = {2700, 3600}, 4061 }, 4062 4063 { 4064 .vendor = "Eon", 4065 .name = "EN25B40", 4066 .bustype = BUS_SPI, 4067 .manufacture_id = EON_ID_NOPREFIX, 4068 .model_id = EON_EN25B40, 4069 .total_size = 512, 4070 .page_size = 256, 4071 .feature_bits = FEATURE_WRSR_WREN, 4072 .tested = TEST_UNTESTED, 4073 .probe = probe_spi_rdid, 4074 .probe_timing = TIMING_ZERO, 4075 .block_erasers = 4076 { 4077 { 4078 .eraseblocks = { 4079 {4 * 1024, 2}, 4080 {8 * 1024, 1}, 4081 {16 * 1024, 1}, 4082 {32 * 1024, 1}, 4083 {64 * 1024, 7} 4084 }, 4085 .block_erase = spi_block_erase_d8, 4086 }, { 4087 .eraseblocks = { {512 * 1024, 1} }, 4088 .block_erase = spi_block_erase_c7, 4089 } 4090 }, 4091 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4092 .unlock = spi_disable_blockprotect, 4093 .write = spi_chip_write_256, 4094 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4095 .voltage = {2700, 3600}, 4096 }, 4097 4098 { 4099 .vendor = "Eon", 4100 .name = "EN25B40T", 4101 .bustype = BUS_SPI, 4102 .manufacture_id = EON_ID_NOPREFIX, 4103 .model_id = EON_EN25B40, 4104 .total_size = 512, 4105 .page_size = 256, 4106 .feature_bits = FEATURE_WRSR_WREN, 4107 .tested = TEST_UNTESTED, 4108 .probe = probe_spi_rdid, 4109 .probe_timing = TIMING_ZERO, 4110 .block_erasers = 4111 { 4112 { 4113 .eraseblocks = { 4114 {64 * 1024, 7}, 4115 {32 * 1024, 1}, 4116 {16 * 1024, 1}, 4117 {8 * 1024, 1}, 4118 {4 * 1024, 2}, 4119 }, 4120 .block_erase = spi_block_erase_d8, 4121 }, { 4122 .eraseblocks = { {512 * 1024, 1} }, 4123 .block_erase = spi_block_erase_c7, 4124 } 4125 }, 4126 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4127 .unlock = spi_disable_blockprotect, 4128 .write = spi_chip_write_256, 4129 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4130 .voltage = {2700, 3600}, 4131 }, 4132 4133 { 4134 .vendor = "Eon", 4135 .name = "EN25B64", 4136 .bustype = BUS_SPI, 4137 .manufacture_id = EON_ID_NOPREFIX, 4138 .model_id = EON_EN25B64, 4139 .total_size = 8192, 4140 .page_size = 256, 4141 /* OTP: 512B total; enter 0x3A */ 4142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4143 .tested = TEST_UNTESTED, 4144 .probe = probe_spi_rdid, 4145 .probe_timing = TIMING_ZERO, 4146 .block_erasers = 4147 { 4148 { 4149 .eraseblocks = { 4150 {4 * 1024, 2}, 4151 {8 * 1024, 1}, 4152 {16 * 1024, 1}, 4153 {32 * 1024, 1}, 4154 {64 * 1024, 127}, 4155 }, 4156 .block_erase = spi_block_erase_d8, 4157 }, { 4158 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4159 .block_erase = spi_block_erase_c7, 4160 } 4161 }, 4162 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4163 .unlock = spi_disable_blockprotect, 4164 .write = spi_chip_write_256, 4165 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4166 .voltage = {2700, 3600}, 4167 }, 4168 4169 { 4170 .vendor = "Eon", 4171 .name = "EN25B64T", 4172 .bustype = BUS_SPI, 4173 .manufacture_id = EON_ID_NOPREFIX, 4174 .model_id = EON_EN25B64, 4175 .total_size = 8192, 4176 .page_size = 256, 4177 /* OTP: 512B total; enter 0x3A */ 4178 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4179 .tested = TEST_UNTESTED, 4180 .probe = probe_spi_rdid, 4181 .probe_timing = TIMING_ZERO, 4182 .block_erasers = 4183 { 4184 { 4185 .eraseblocks = { 4186 {64 * 1024, 127}, 4187 {32 * 1024, 1}, 4188 {16 * 1024, 1}, 4189 {8 * 1024, 1}, 4190 {4 * 1024, 2}, 4191 }, 4192 .block_erase = spi_block_erase_d8, 4193 }, { 4194 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4195 .block_erase = spi_block_erase_c7, 4196 } 4197 }, 4198 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4199 .unlock = spi_disable_blockprotect, 4200 .write = spi_chip_write_256, 4201 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4202 .voltage = {2700, 3600}, 4203 }, 4204 4205 { 4206 .vendor = "Eon", 4207 .name = "EN25B80", 4208 .bustype = BUS_SPI, 4209 .manufacture_id = EON_ID_NOPREFIX, 4210 .model_id = EON_EN25B80, 4211 .total_size = 1024, 4212 .page_size = 256, 4213 .feature_bits = FEATURE_WRSR_WREN, 4214 .tested = TEST_UNTESTED, 4215 .probe = probe_spi_rdid, 4216 .probe_timing = TIMING_ZERO, 4217 .block_erasers = 4218 { 4219 { 4220 .eraseblocks = { 4221 {4 * 1024, 2}, 4222 {8 * 1024, 1}, 4223 {16 * 1024, 1}, 4224 {32 * 1024, 1}, 4225 {64 * 1024, 15} 4226 }, 4227 .block_erase = spi_block_erase_d8, 4228 }, { 4229 .eraseblocks = { {1024 * 1024, 1} }, 4230 .block_erase = spi_block_erase_c7, 4231 } 4232 }, 4233 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4234 .unlock = spi_disable_blockprotect, 4235 .write = spi_chip_write_256, 4236 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4237 .voltage = {2700, 3600}, 4238 }, 4239 4240 { 4241 .vendor = "Eon", 4242 .name = "EN25B80T", 4243 .bustype = BUS_SPI, 4244 .manufacture_id = EON_ID_NOPREFIX, 4245 .model_id = EON_EN25B80, 4246 .total_size = 1024, 4247 .page_size = 256, 4248 .feature_bits = FEATURE_WRSR_WREN, 4249 .tested = TEST_UNTESTED, 4250 .probe = probe_spi_rdid, 4251 .probe_timing = TIMING_ZERO, 4252 .block_erasers = 4253 { 4254 { 4255 .eraseblocks = { 4256 {64 * 1024, 15}, 4257 {32 * 1024, 1}, 4258 {16 * 1024, 1}, 4259 {8 * 1024, 1}, 4260 {4 * 1024, 2}, 4261 }, 4262 .block_erase = spi_block_erase_d8, 4263 }, { 4264 .eraseblocks = { {1024 * 1024, 1} }, 4265 .block_erase = spi_block_erase_c7, 4266 } 4267 }, 4268 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4269 .unlock = spi_disable_blockprotect, 4270 .write = spi_chip_write_256, 4271 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4272 .voltage = {2700, 3600}, 4273 }, 4274 4275 { 4276 .vendor = "Eon", 4277 .name = "EN25F05", 4278 .bustype = BUS_SPI, 4279 .manufacture_id = EON_ID_NOPREFIX, 4280 .model_id = EON_EN25F05, 4281 .total_size = 64, 4282 .page_size = 256, 4283 .feature_bits = FEATURE_WRSR_WREN, 4284 .tested = TEST_OK_PREW, 4285 .probe = probe_spi_rdid, 4286 .probe_timing = TIMING_ZERO, 4287 .block_erasers = 4288 { 4289 { 4290 .eraseblocks = { {4 * 1024, 16} }, 4291 .block_erase = spi_block_erase_20, 4292 }, { 4293 .eraseblocks = { {32 * 1024, 2} }, 4294 .block_erase = spi_block_erase_d8, 4295 }, { 4296 .eraseblocks = { {32 * 1024, 2} }, 4297 .block_erase = spi_block_erase_52, 4298 }, { 4299 .eraseblocks = { {64 * 1024, 1} }, 4300 .block_erase = spi_block_erase_60, 4301 }, { 4302 .eraseblocks = { {64 * 1024, 1} }, 4303 .block_erase = spi_block_erase_c7, 4304 } 4305 }, 4306 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4307 .unlock = spi_disable_blockprotect, 4308 .write = spi_chip_write_256, 4309 .read = spi_chip_read, 4310 .voltage = {2700, 3600}, 4311 }, 4312 4313 { 4314 .vendor = "Eon", 4315 .name = "EN25F10", 4316 .bustype = BUS_SPI, 4317 .manufacture_id = EON_ID_NOPREFIX, 4318 .model_id = EON_EN25F10, 4319 .total_size = 128, 4320 .page_size = 256, 4321 .feature_bits = FEATURE_WRSR_WREN, 4322 .tested = TEST_UNTESTED, 4323 .probe = probe_spi_rdid, 4324 .probe_timing = TIMING_ZERO, 4325 .block_erasers = 4326 { 4327 { 4328 .eraseblocks = { {4 * 1024, 32} }, 4329 .block_erase = spi_block_erase_20, 4330 }, { 4331 .eraseblocks = { {32 * 1024, 4} }, 4332 .block_erase = spi_block_erase_d8, 4333 }, { 4334 .eraseblocks = { {32 * 1024, 4} }, 4335 .block_erase = spi_block_erase_52, 4336 }, { 4337 .eraseblocks = { {128 * 1024, 1} }, 4338 .block_erase = spi_block_erase_60, 4339 }, { 4340 .eraseblocks = { {128 * 1024, 1} }, 4341 .block_erase = spi_block_erase_c7, 4342 } 4343 }, 4344 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4345 .unlock = spi_disable_blockprotect, 4346 .write = spi_chip_write_256, 4347 .read = spi_chip_read, 4348 .voltage = {2700, 3600}, 4349 }, 4350 4351 { 4352 .vendor = "Eon", 4353 .name = "EN25F16", 4354 .bustype = BUS_SPI, 4355 .manufacture_id = EON_ID_NOPREFIX, 4356 .model_id = EON_EN25F16, 4357 .total_size = 2048, 4358 .page_size = 256, 4359 .feature_bits = FEATURE_WRSR_WREN, 4360 .tested = TEST_OK_PREW, 4361 .probe = probe_spi_rdid, 4362 .probe_timing = TIMING_ZERO, 4363 .block_erasers = 4364 { 4365 { 4366 .eraseblocks = { {4 * 1024, 512} }, 4367 .block_erase = spi_block_erase_20, 4368 }, { 4369 .eraseblocks = { {64 * 1024, 32} }, 4370 .block_erase = spi_block_erase_d8, 4371 }, { 4372 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4373 .block_erase = spi_block_erase_60, 4374 }, { 4375 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4376 .block_erase = spi_block_erase_c7, 4377 } 4378 }, 4379 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4380 .unlock = spi_disable_blockprotect, 4381 .write = spi_chip_write_256, 4382 .read = spi_chip_read, 4383 .voltage = {2700, 3600}, 4384 }, 4385 4386 { 4387 .vendor = "Eon", 4388 .name = "EN25F20", 4389 .bustype = BUS_SPI, 4390 .manufacture_id = EON_ID_NOPREFIX, 4391 .model_id = EON_EN25F20, 4392 .total_size = 256, 4393 .page_size = 256, 4394 .feature_bits = FEATURE_WRSR_WREN, 4395 .tested = TEST_UNTESTED, 4396 .probe = probe_spi_rdid, 4397 .probe_timing = TIMING_ZERO, 4398 .block_erasers = 4399 { 4400 { 4401 .eraseblocks = { {4 * 1024, 64} }, 4402 .block_erase = spi_block_erase_20, 4403 }, { 4404 .eraseblocks = { {64 * 1024, 4} }, 4405 .block_erase = spi_block_erase_d8, 4406 }, { 4407 .eraseblocks = { {64 * 1024, 4} }, 4408 .block_erase = spi_block_erase_52, 4409 }, { 4410 .eraseblocks = { {256 * 1024, 1} }, 4411 .block_erase = spi_block_erase_60, 4412 }, { 4413 .eraseblocks = { {256 * 1024, 1} }, 4414 .block_erase = spi_block_erase_c7, 4415 } 4416 }, 4417 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4418 .unlock = spi_disable_blockprotect, 4419 .write = spi_chip_write_256, 4420 .read = spi_chip_read, 4421 .voltage = {2700, 3600}, 4422 }, 4423 4424 { 4425 .vendor = "Eon", 4426 .name = "EN25F32", 4427 .bustype = BUS_SPI, 4428 .manufacture_id = EON_ID_NOPREFIX, 4429 .model_id = EON_EN25F32, 4430 .total_size = 4096, 4431 .page_size = 256, 4432 .feature_bits = FEATURE_WRSR_WREN, 4433 .tested = TEST_OK_PREW, 4434 .probe = probe_spi_rdid, 4435 .probe_timing = TIMING_ZERO, 4436 .block_erasers = 4437 { 4438 { 4439 .eraseblocks = { {4 * 1024, 1024} }, 4440 .block_erase = spi_block_erase_20, 4441 }, { 4442 .eraseblocks = { {64 * 1024, 64} }, 4443 .block_erase = spi_block_erase_d8, 4444 }, { 4445 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4446 .block_erase = spi_block_erase_60, 4447 }, { 4448 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4449 .block_erase = spi_block_erase_c7, 4450 } 4451 }, 4452 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4453 .unlock = spi_disable_blockprotect, 4454 .write = spi_chip_write_256, 4455 .read = spi_chip_read, 4456 .voltage = {2700, 3600}, 4457 }, 4458 4459 { 4460 .vendor = "Eon", 4461 .name = "EN25F40", 4462 .bustype = BUS_SPI, 4463 .manufacture_id = EON_ID_NOPREFIX, 4464 .model_id = EON_EN25F40, 4465 .total_size = 512, 4466 .page_size = 256, 4467 .feature_bits = FEATURE_WRSR_WREN, 4468 .tested = TEST_OK_PREW, 4469 .probe = probe_spi_rdid, 4470 .probe_timing = TIMING_ZERO, 4471 .block_erasers = 4472 { 4473 { 4474 .eraseblocks = { {4 * 1024, 128} }, 4475 .block_erase = spi_block_erase_20, 4476 }, { 4477 .eraseblocks = { {64 * 1024, 8} }, 4478 .block_erase = spi_block_erase_d8, 4479 }, { 4480 .eraseblocks = { {512 * 1024, 1} }, 4481 .block_erase = spi_block_erase_60, 4482 }, { 4483 .eraseblocks = { {512 * 1024, 1} }, 4484 .block_erase = spi_block_erase_c7, 4485 }, 4486 }, 4487 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4488 .unlock = spi_disable_blockprotect, 4489 .write = spi_chip_write_256, 4490 .read = spi_chip_read, 4491 .voltage = {2700, 3600}, 4492 }, 4493 4494 { 4495 .vendor = "Eon", 4496 .name = "EN25F64", 4497 .bustype = BUS_SPI, 4498 .manufacture_id = EON_ID_NOPREFIX, 4499 .model_id = EON_EN25F64, 4500 .total_size = 8192, 4501 .page_size = 256, 4502 .feature_bits = FEATURE_WRSR_WREN, 4503 .tested = TEST_OK_PREW, 4504 .probe = probe_spi_rdid, 4505 .probe_timing = TIMING_ZERO, 4506 .block_erasers = 4507 { 4508 { 4509 .eraseblocks = { {4 * 1024, 2048} }, 4510 .block_erase = spi_block_erase_20, 4511 }, { 4512 .eraseblocks = { {64 * 1024, 128} }, 4513 .block_erase = spi_block_erase_d8, 4514 }, { 4515 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4516 .block_erase = spi_block_erase_60, 4517 }, { 4518 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4519 .block_erase = spi_block_erase_c7, 4520 } 4521 }, 4522 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4523 .unlock = spi_disable_blockprotect, 4524 .write = spi_chip_write_256, 4525 .read = spi_chip_read, 4526 .voltage = {2700, 3600}, 4527 }, 4528 4529 { 4530 .vendor = "Eon", 4531 .name = "EN25F80", 4532 .bustype = BUS_SPI, 4533 .manufacture_id = EON_ID_NOPREFIX, 4534 .model_id = EON_EN25F80, 4535 .total_size = 1024, 4536 .page_size = 256, 4537 .feature_bits = FEATURE_WRSR_WREN, 4538 .tested = TEST_OK_PREW, 4539 .probe = probe_spi_rdid, 4540 .probe_timing = TIMING_ZERO, 4541 .block_erasers = 4542 { 4543 { 4544 .eraseblocks = { {4 * 1024, 256} }, 4545 .block_erase = spi_block_erase_20, 4546 }, { 4547 .eraseblocks = { {64 * 1024, 16} }, 4548 .block_erase = spi_block_erase_d8, 4549 }, { 4550 .eraseblocks = { {1024 * 1024, 1} }, 4551 .block_erase = spi_block_erase_60, 4552 }, { 4553 .eraseblocks = { {1024 * 1024, 1} }, 4554 .block_erase = spi_block_erase_c7, 4555 } 4556 }, 4557 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4558 .unlock = spi_disable_blockprotect, 4559 .write = spi_chip_write_256, 4560 .read = spi_chip_read, 4561 .voltage = {2700, 3600}, 4562 }, 4563 4564 { 4565 .vendor = "Eon", 4566 .name = "EN25P05", 4567 .bustype = BUS_SPI, 4568 .manufacture_id = EON_ID_NOPREFIX, 4569 .model_id = EON_EN25B05, 4570 .total_size = 64, 4571 .page_size = 256, 4572 .feature_bits = FEATURE_WRSR_WREN, 4573 .tested = TEST_UNTESTED, 4574 .probe = probe_spi_rdid, 4575 .probe_timing = TIMING_ZERO, 4576 .block_erasers = 4577 { 4578 { 4579 .eraseblocks = { 4580 {32 * 1024, 2} }, 4581 .block_erase = spi_block_erase_d8, 4582 }, { 4583 .eraseblocks = { {64 * 1024, 1} }, 4584 .block_erase = spi_block_erase_c7, 4585 } 4586 }, 4587 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4588 .unlock = spi_disable_blockprotect, 4589 .write = spi_chip_write_256, 4590 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4591 .voltage = {2700, 3600}, 4592 }, 4593 4594 { 4595 .vendor = "Eon", 4596 .name = "EN25P10", 4597 .bustype = BUS_SPI, 4598 .manufacture_id = EON_ID_NOPREFIX, 4599 .model_id = EON_EN25B10, 4600 .total_size = 128, 4601 .page_size = 256, 4602 .feature_bits = FEATURE_WRSR_WREN, 4603 .tested = TEST_UNTESTED, 4604 .probe = probe_spi_rdid, 4605 .probe_timing = TIMING_ZERO, 4606 .block_erasers = 4607 { 4608 { 4609 .eraseblocks = { {32 * 1024, 4} }, 4610 .block_erase = spi_block_erase_d8, 4611 }, { 4612 .eraseblocks = { {128 * 1024, 1} }, 4613 .block_erase = spi_block_erase_c7, 4614 } 4615 }, 4616 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4617 .unlock = spi_disable_blockprotect, 4618 .write = spi_chip_write_256, 4619 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4620 .voltage = {2700, 3600}, 4621 }, 4622 4623 { 4624 .vendor = "Eon", 4625 .name = "EN25P16", 4626 .bustype = BUS_SPI, 4627 .manufacture_id = EON_ID_NOPREFIX, 4628 .model_id = EON_EN25B16, 4629 .total_size = 2048, 4630 .page_size = 256, 4631 .feature_bits = FEATURE_WRSR_WREN, 4632 .tested = TEST_UNTESTED, 4633 .probe = probe_spi_rdid, 4634 .probe_timing = TIMING_ZERO, 4635 .block_erasers = 4636 { 4637 { 4638 .eraseblocks = { {64 * 1024, 32} }, 4639 .block_erase = spi_block_erase_d8, 4640 }, { 4641 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4642 .block_erase = spi_block_erase_c7, 4643 } 4644 }, 4645 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4646 .unlock = spi_disable_blockprotect, 4647 .write = spi_chip_write_256, 4648 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4649 .voltage = {2700, 3600}, 4650 }, 4651 4652 { 4653 .vendor = "Eon", 4654 .name = "EN25P20", 4655 .bustype = BUS_SPI, 4656 .manufacture_id = EON_ID_NOPREFIX, 4657 .model_id = EON_EN25B20, 4658 .total_size = 256, 4659 .page_size = 256, 4660 .feature_bits = FEATURE_WRSR_WREN, 4661 .tested = TEST_UNTESTED, 4662 .probe = probe_spi_rdid, 4663 .probe_timing = TIMING_ZERO, 4664 .block_erasers = 4665 { 4666 { 4667 .eraseblocks = { {64 * 1024, 4} }, 4668 .block_erase = spi_block_erase_d8, 4669 }, { 4670 .eraseblocks = { {256 * 1024, 1} }, 4671 .block_erase = spi_block_erase_c7, 4672 } 4673 }, 4674 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4675 .unlock = spi_disable_blockprotect, 4676 .write = spi_chip_write_256, 4677 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4678 .voltage = {2700, 3600}, 4679 }, 4680 4681 { 4682 .vendor = "Eon", 4683 .name = "EN25P32", /* Uniform version of EN25B32 */ 4684 .bustype = BUS_SPI, 4685 .manufacture_id = EON_ID_NOPREFIX, 4686 .model_id = EON_EN25B32, 4687 .total_size = 4096, 4688 .page_size = 256, 4689 /* OTP: 512B total; enter 0x3A */ 4690 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4691 .tested = TEST_UNTESTED, 4692 .probe = probe_spi_rdid, 4693 .probe_timing = TIMING_ZERO, 4694 .block_erasers = 4695 { 4696 { 4697 .eraseblocks = { {64 * 1024, 64} }, 4698 .block_erase = spi_block_erase_d8, 4699 }, { 4700 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4701 .block_erase = spi_block_erase_c7, 4702 } 4703 }, 4704 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4705 .unlock = spi_disable_blockprotect, 4706 .write = spi_chip_write_256, 4707 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4708 .voltage = {2700, 3600}, 4709 }, 4710 4711 { 4712 .vendor = "Eon", 4713 .name = "EN25P40", 4714 .bustype = BUS_SPI, 4715 .manufacture_id = EON_ID_NOPREFIX, 4716 .model_id = EON_EN25B40, 4717 .total_size = 512, 4718 .page_size = 256, 4719 .feature_bits = FEATURE_WRSR_WREN, 4720 .tested = TEST_UNTESTED, 4721 .probe = probe_spi_rdid, 4722 .probe_timing = TIMING_ZERO, 4723 .block_erasers = 4724 { 4725 { 4726 .eraseblocks = { {64 * 1024, 8} }, 4727 .block_erase = spi_block_erase_d8, 4728 }, { 4729 .eraseblocks = { {512 * 1024, 1} }, 4730 .block_erase = spi_block_erase_c7, 4731 } 4732 }, 4733 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4734 .unlock = spi_disable_blockprotect, 4735 .write = spi_chip_write_256, 4736 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4737 .voltage = {2700, 3600}, 4738 }, 4739 4740 { 4741 .vendor = "Eon", 4742 .name = "EN25P64", 4743 .bustype = BUS_SPI, 4744 .manufacture_id = EON_ID_NOPREFIX, 4745 .model_id = EON_EN25B64, 4746 .total_size = 8192, 4747 .page_size = 256, 4748 /* OTP: 512B total; enter 0x3A */ 4749 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4750 .tested = TEST_UNTESTED, 4751 .probe = probe_spi_rdid, 4752 .probe_timing = TIMING_ZERO, 4753 .block_erasers = 4754 { 4755 { 4756 .eraseblocks = { {64 * 1024, 128} }, 4757 .block_erase = spi_block_erase_d8, 4758 }, { 4759 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4760 .block_erase = spi_block_erase_c7, 4761 } 4762 }, 4763 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4764 .unlock = spi_disable_blockprotect, 4765 .write = spi_chip_write_256, 4766 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4767 .voltage = {2700, 3600}, 4768 }, 4769 4770 { 4771 .vendor = "Eon", 4772 .name = "EN25P80", 4773 .bustype = BUS_SPI, 4774 .manufacture_id = EON_ID_NOPREFIX, 4775 .model_id = EON_EN25B80, 4776 .total_size = 1024, 4777 .page_size = 256, 4778 .feature_bits = FEATURE_WRSR_WREN, 4779 .tested = TEST_UNTESTED, 4780 .probe = probe_spi_rdid, 4781 .probe_timing = TIMING_ZERO, 4782 .block_erasers = 4783 { 4784 { 4785 .eraseblocks = { {64 * 1024, 16} }, 4786 .block_erase = spi_block_erase_d8, 4787 }, { 4788 .eraseblocks = { {1024 * 1024, 1} }, 4789 .block_erase = spi_block_erase_c7, 4790 } 4791 }, 4792 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4793 .unlock = spi_disable_blockprotect, 4794 .write = spi_chip_write_256, 4795 .read = spi_chip_read, /* Fast read (0x0B) supported */ 4796 .voltage = {2700, 3600}, 4797 }, 4798 4799 { 4800 .vendor = "Eon", 4801 .name = "EN25Q128", 4802 .bustype = BUS_SPI, 4803 .manufacture_id = EON_ID_NOPREFIX, 4804 .model_id = EON_EN25Q128, 4805 .total_size = 16384, 4806 .page_size = 256, 4807 /* OTP: 512B total; enter 0x3A */ 4808 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4809 .tested = TEST_OK_PREW, 4810 .probe = probe_spi_rdid, 4811 .probe_timing = TIMING_ZERO, 4812 .block_erasers = 4813 { 4814 { 4815 .eraseblocks = { {4 * 1024, 4096} }, 4816 .block_erase = spi_block_erase_20, 4817 }, { 4818 .eraseblocks = { {64 * 1024, 256} }, 4819 .block_erase = spi_block_erase_d8, 4820 }, { 4821 .eraseblocks = { {16 * 1024 * 1024, 1} }, 4822 .block_erase = spi_block_erase_60, 4823 }, { 4824 .eraseblocks = { {16 * 1024 * 1024, 1} }, 4825 .block_erase = spi_block_erase_c7, 4826 } 4827 }, 4828 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4829 .unlock = spi_disable_blockprotect, 4830 .write = spi_chip_write_256, 4831 .read = spi_chip_read, 4832 }, 4833 4834 { 4835 /* Note: EN25D16 is an evil twin which shares the model ID 4836 but has different write protection capabilities */ 4837 .vendor = "Eon", 4838 .name = "EN25Q16", 4839 .bustype = BUS_SPI, 4840 .manufacture_id = EON_ID_NOPREFIX, 4841 .model_id = EON_EN25Q16, 4842 .total_size = 2048, 4843 .page_size = 256, 4844 /* OTP: D16 512B/Q16 128B total; enter 0x3A */ 4845 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4846 .tested = TEST_UNTESTED, 4847 .probe = probe_spi_rdid, 4848 .probe_timing = TIMING_ZERO, 4849 .block_erasers = 4850 { 4851 { 4852 .eraseblocks = { {4 * 1024, 512} }, 4853 .block_erase = spi_block_erase_20, 4854 }, { 4855 .eraseblocks = { {64 * 1024, 32} }, 4856 .block_erase = spi_block_erase_d8, 4857 }, { 4858 /* not supported by Q16 version */ 4859 .eraseblocks = { {64 * 1024, 32} }, 4860 .block_erase = spi_block_erase_52, 4861 }, { 4862 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4863 .block_erase = spi_block_erase_60, 4864 }, { 4865 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4866 .block_erase = spi_block_erase_c7, 4867 } 4868 }, 4869 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4870 .unlock = spi_disable_blockprotect, 4871 .write = spi_chip_write_256, 4872 .read = spi_chip_read, 4873 .voltage = {2700, 3600}, 4874 }, 4875 4876 { 4877 .vendor = "Eon", 4878 .name = "EN25Q32(A/B)", 4879 .bustype = BUS_SPI, 4880 .manufacture_id = EON_ID_NOPREFIX, 4881 .model_id = EON_EN25Q32, 4882 .total_size = 4096, 4883 .page_size = 256, 4884 /* OTP: 512B total; enter 0x3A */ 4885 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4886 .tested = TEST_OK_PREW, 4887 .probe = probe_spi_rdid, 4888 .probe_timing = TIMING_ZERO, 4889 .block_erasers = 4890 { 4891 { 4892 .eraseblocks = { {4 * 1024, 1024} }, 4893 .block_erase = spi_block_erase_20, 4894 }, { 4895 .eraseblocks = { {64 * 1024, 64} }, 4896 .block_erase = spi_block_erase_d8, 4897 }, { 4898 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4899 .block_erase = spi_block_erase_60, 4900 }, { 4901 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4902 .block_erase = spi_block_erase_c7, 4903 } 4904 }, 4905 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4906 .unlock = spi_disable_blockprotect, 4907 .write = spi_chip_write_256, 4908 .read = spi_chip_read, 4909 .voltage = {2700, 3600}, 4910 }, 4911 4912 { 4913 .vendor = "Eon", 4914 .name = "EN25Q40", 4915 .bustype = BUS_SPI, 4916 .manufacture_id = EON_ID_NOPREFIX, 4917 .model_id = EON_EN25Q40, 4918 .total_size = 512, 4919 .page_size = 256, 4920 /* OTP: 256B total; enter 0x3A */ 4921 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4922 .tested = TEST_UNTESTED, 4923 .probe = probe_spi_rdid, 4924 .probe_timing = TIMING_ZERO, 4925 .block_erasers = 4926 { 4927 { 4928 .eraseblocks = { {4 * 1024, 128} }, 4929 .block_erase = spi_block_erase_20, 4930 }, { 4931 .eraseblocks = { {64 * 1024, 8} }, 4932 .block_erase = spi_block_erase_d8, 4933 }, { 4934 .eraseblocks = { {512 * 1024, 1} }, 4935 .block_erase = spi_block_erase_60, 4936 }, { 4937 .eraseblocks = { {512 * 1024, 1} }, 4938 .block_erase = spi_block_erase_c7, 4939 } 4940 }, 4941 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4942 .unlock = spi_disable_blockprotect, 4943 .write = spi_chip_write_256, 4944 .read = spi_chip_read, 4945 .voltage = {2700, 3600}, 4946 }, 4947 4948 { 4949 .vendor = "Eon", 4950 .name = "EN25Q64", 4951 .bustype = BUS_SPI, 4952 .manufacture_id = EON_ID_NOPREFIX, 4953 .model_id = EON_EN25Q64, 4954 .total_size = 8192, 4955 .page_size = 256, 4956 /* OTP: 512B total; enter 0x3A */ 4957 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4958 .tested = TEST_OK_PREW, 4959 .probe = probe_spi_rdid, 4960 .probe_timing = TIMING_ZERO, 4961 .block_erasers = 4962 { 4963 { 4964 .eraseblocks = { {4 * 1024, 2048} }, 4965 .block_erase = spi_block_erase_20, 4966 }, { 4967 .eraseblocks = { {64 * 1024, 128} }, 4968 .block_erase = spi_block_erase_d8, 4969 }, { 4970 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4971 .block_erase = spi_block_erase_60, 4972 }, { 4973 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4974 .block_erase = spi_block_erase_c7, 4975 } 4976 }, 4977 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 4978 .unlock = spi_disable_blockprotect, 4979 .write = spi_chip_write_256, 4980 .read = spi_chip_read, 4981 .voltage = {2700, 3600}, 4982 }, 4983 4984 { 4985 .vendor = "Eon", 4986 .name = "EN25Q80(A)", 4987 .bustype = BUS_SPI, 4988 .manufacture_id = EON_ID_NOPREFIX, 4989 .model_id = EON_EN25Q80, 4990 .total_size = 1024, 4991 .page_size = 256, 4992 /* OTP: 256B total; enter 0x3A */ 4993 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4994 .tested = TEST_UNTESTED, 4995 .probe = probe_spi_rdid, 4996 .probe_timing = TIMING_ZERO, 4997 .block_erasers = 4998 { 4999 { 5000 .eraseblocks = { {4 * 1024, 256} }, 5001 .block_erase = spi_block_erase_20, 5002 }, { 5003 .eraseblocks = { {64 * 1024, 16} }, 5004 .block_erase = spi_block_erase_d8, 5005 }, { 5006 .eraseblocks = { {1024 * 1024, 1} }, 5007 .block_erase = spi_block_erase_60, 5008 }, { 5009 .eraseblocks = { {1024 * 1024, 1} }, 5010 .block_erase = spi_block_erase_c7, 5011 } 5012 }, 5013 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 5014 .unlock = spi_disable_blockprotect, 5015 .write = spi_chip_write_256, 5016 .read = spi_chip_read, 5017 .voltage = {2700, 3600}, 5018 }, 5019 5020 { 5021 .vendor = "Eon", 5022 .name = "EN25QH128", 5023 .bustype = BUS_SPI, 5024 .manufacture_id = EON_ID_NOPREFIX, 5025 .model_id = EON_EN25QH128, 5026 .total_size = 16384, 5027 .page_size = 256, 5028 /* supports SFDP */ 5029 /* OTP: 512B total; enter 0x3A */ 5030 /* QPI enable 0x38, disable 0xFF */ 5031 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5032 .tested = TEST_UNTESTED, 5033 .probe = probe_spi_rdid, 5034 .probe_timing = TIMING_ZERO, 5035 .block_erasers = 5036 { 5037 { 5038 .eraseblocks = { {4 * 1024, 4096} }, 5039 .block_erase = spi_block_erase_20, 5040 }, { 5041 .eraseblocks = { {64 * 1024, 256} }, 5042 .block_erase = spi_block_erase_d8, 5043 }, { 5044 .eraseblocks = { { 16384 * 1024, 1} }, 5045 .block_erase = spi_block_erase_60, 5046 }, { 5047 .eraseblocks = { { 16384 * 1024, 1} }, 5048 .block_erase = spi_block_erase_c7, 5049 } 5050 }, 5051 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 5052 .unlock = spi_disable_blockprotect_bp3_srwd, 5053 .write = spi_chip_write_256, 5054 .read = spi_chip_read, 5055 .voltage = {2700, 3600}, 5056 }, 5057 5058 { 5059 .vendor = "Eon", 5060 .name = "EN25QH16", 5061 .bustype = BUS_SPI, 5062 .manufacture_id = EON_ID_NOPREFIX, 5063 .model_id = EON_EN25QH16, 5064 .total_size = 2048, 5065 .page_size = 256, 5066 /* supports SFDP */ 5067 /* OTP: 512B total; enter 0x3A */ 5068 /* QPI enable 0x38, disable 0xFF */ 5069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5070 .tested = TEST_OK_PREW, 5071 .probe = probe_spi_rdid, 5072 .probe_timing = TIMING_ZERO, 5073 .block_erasers = 5074 { 5075 { 5076 .eraseblocks = { {4 * 1024, 512} }, 5077 .block_erase = spi_block_erase_20, 5078 }, { 5079 .eraseblocks = { {64 * 1024, 32} }, 5080 .block_erase = spi_block_erase_d8, 5081 }, { 5082 .eraseblocks = { {1024 * 2048, 1} }, 5083 .block_erase = spi_block_erase_60, 5084 }, { 5085 .eraseblocks = { {1024 * 2048, 1} }, 5086 .block_erase = spi_block_erase_c7, 5087 } 5088 }, 5089 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 5090 .unlock = spi_disable_blockprotect_bp3_srwd, 5091 .write = spi_chip_write_256, 5092 .read = spi_chip_read, 5093 .voltage = {2700, 3600}, 5094 }, 5095 5096 { 5097 .vendor = "Eon", 5098 .name = "EN25QH32", 5099 .bustype = BUS_SPI, 5100 .manufacture_id = EON_ID_NOPREFIX, 5101 .model_id = EON_EN25QH32, 5102 .total_size = 4096, 5103 .page_size = 256, 5104 /* supports SFDP */ 5105 /* OTP: 512B total; enter 0x3A */ 5106 /* QPI enable 0x38, disable 0xFF */ 5107 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5108 .tested = TEST_OK_PREW, 5109 .probe = probe_spi_rdid, 5110 .probe_timing = TIMING_ZERO, 5111 .block_erasers = 5112 { 5113 { 5114 .eraseblocks = { {4 * 1024, 1024} }, 5115 .block_erase = spi_block_erase_20, 5116 }, { 5117 .eraseblocks = { {64 * 1024, 64} }, 5118 .block_erase = spi_block_erase_d8, 5119 }, { 5120 .eraseblocks = { {1024 * 4096, 1} }, 5121 .block_erase = spi_block_erase_60, 5122 }, { 5123 .eraseblocks = { {1024 * 4096, 1} }, 5124 .block_erase = spi_block_erase_c7, 5125 } 5126 }, 5127 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 5128 .unlock = spi_disable_blockprotect_bp3_srwd, 5129 .write = spi_chip_write_256, 5130 .read = spi_chip_read, 5131 .voltage = {2700, 3600}, 5132 }, 5133 5134 { 5135 .vendor = "Eon", 5136 .name = "EN25QH64", 5137 .bustype = BUS_SPI, 5138 .manufacture_id = EON_ID_NOPREFIX, 5139 .model_id = EON_EN25QH64, 5140 .total_size = 8192, 5141 .page_size = 256, 5142 /* supports SFDP */ 5143 /* OTP: 512B total; enter 0x3A */ 5144 /* QPI enable 0x38, disable 0xFF */ 5145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5146 .tested = TEST_OK_PREW, 5147 .probe = probe_spi_rdid, 5148 .probe_timing = TIMING_ZERO, 5149 .block_erasers = 5150 { 5151 { 5152 .eraseblocks = { {4 * 1024, 2048} }, 5153 .block_erase = spi_block_erase_20, 5154 }, { 5155 .eraseblocks = { {64 * 1024, 128} }, 5156 .block_erase = spi_block_erase_d8, 5157 }, { 5158 .eraseblocks = { { 8192 * 1024, 1} }, 5159 .block_erase = spi_block_erase_60, 5160 }, { 5161 .eraseblocks = { { 8192 * 1024, 1} }, 5162 .block_erase = spi_block_erase_c7, 5163 } 5164 }, 5165 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 5166 .unlock = spi_disable_blockprotect_bp3_srwd, 5167 .write = spi_chip_write_256, 5168 .read = spi_chip_read, 5169 .voltage = {2700, 3600}, 5170 }, 5171 5172 { 5173 .vendor = "Eon", 5174 .name = "EN25S10", 5175 .bustype = BUS_SPI, 5176 .manufacture_id = EON_ID_NOPREFIX, 5177 .model_id = EON_EN25S10, 5178 .total_size = 128, 5179 .page_size = 256, 5180 /* OTP: 256B total; enter 0x3A */ 5181 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5182 .tested = TEST_UNTESTED, 5183 .probe = probe_spi_rdid, 5184 .probe_timing = TIMING_ZERO, 5185 .block_erasers = 5186 { 5187 { 5188 .eraseblocks = { {4 * 1024, 32} }, 5189 .block_erase = spi_block_erase_20, 5190 }, { 5191 .eraseblocks = { {32 * 1024, 4} }, 5192 .block_erase = spi_block_erase_52, 5193 }, { 5194 .eraseblocks = { {128 * 1024, 1} }, 5195 .block_erase = spi_block_erase_60, 5196 }, { 5197 .eraseblocks = { {128 * 1024, 1} }, 5198 .block_erase = spi_block_erase_c7, 5199 } 5200 }, 5201 .printlock = spi_prettyprint_status_register_bp2_srwd, 5202 .unlock = spi_disable_blockprotect, 5203 .write = spi_chip_write_256, 5204 .read = spi_chip_read, 5205 .voltage = {1650, 1950}, 5206 }, 5207 5208 { 5209 .vendor = "Eon", 5210 .name = "EN25S16", 5211 .bustype = BUS_SPI, 5212 .manufacture_id = EON_ID_NOPREFIX, 5213 .model_id = EON_EN25S16, 5214 .total_size = 2048, 5215 .page_size = 256, 5216 /* OTP: 512B total; enter 0x3A */ 5217 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5218 .tested = TEST_UNTESTED, 5219 .probe = probe_spi_rdid, 5220 .probe_timing = TIMING_ZERO, 5221 .block_erasers = 5222 { 5223 { 5224 .eraseblocks = { {4 * 1024, 512} }, 5225 .block_erase = spi_block_erase_20, 5226 }, { 5227 .eraseblocks = { {64 * 1024, 32} }, 5228 .block_erase = spi_block_erase_52, 5229 }, { 5230 .eraseblocks = { {32 * 1024, 64} }, 5231 .block_erase = spi_block_erase_d8, 5232 }, { 5233 .eraseblocks = { {2048 * 1024, 1} }, 5234 .block_erase = spi_block_erase_60, 5235 }, { 5236 .eraseblocks = { {2048 * 1024, 1} }, 5237 .block_erase = spi_block_erase_c7, 5238 } 5239 }, 5240 .printlock = spi_prettyprint_status_register_en25s_wp, 5241 .unlock = spi_disable_blockprotect_bp3_srwd, 5242 .write = spi_chip_write_256, 5243 .read = spi_chip_read, 5244 .voltage = {1650, 1950}, 5245 }, 5246 5247 { 5248 .vendor = "Eon", 5249 .name = "EN25S20", 5250 .bustype = BUS_SPI, 5251 .manufacture_id = EON_ID_NOPREFIX, 5252 .model_id = EON_EN25S20, 5253 .total_size = 256, 5254 .page_size = 256, 5255 /* OTP: 256B total; enter 0x3A */ 5256 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5257 .tested = TEST_UNTESTED, 5258 .probe = probe_spi_rdid, 5259 .probe_timing = TIMING_ZERO, 5260 .block_erasers = 5261 { 5262 { 5263 .eraseblocks = { {4 * 1024, 64} }, 5264 .block_erase = spi_block_erase_20, 5265 }, { 5266 .eraseblocks = { {64 * 1024, 4} }, 5267 .block_erase = spi_block_erase_d8, 5268 }, { 5269 .eraseblocks = { {256 * 1024, 1} }, 5270 .block_erase = spi_block_erase_60, 5271 }, { 5272 .eraseblocks = { {256 * 1024, 1} }, 5273 .block_erase = spi_block_erase_c7, 5274 } 5275 }, 5276 .printlock = spi_prettyprint_status_register_bp2_srwd, 5277 .unlock = spi_disable_blockprotect, 5278 .write = spi_chip_write_256, 5279 .read = spi_chip_read, 5280 .voltage = {1650, 1950}, 5281 }, 5282 5283 { 5284 .vendor = "Eon", 5285 .name = "EN25S32", 5286 .bustype = BUS_SPI, 5287 .manufacture_id = EON_ID_NOPREFIX, 5288 .model_id = EON_EN25S32, 5289 .total_size = 4096, 5290 .page_size = 256, 5291 /* OTP: 512B total; enter 0x3A */ 5292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5293 .tested = TEST_UNTESTED, 5294 .probe = probe_spi_rdid, 5295 .probe_timing = TIMING_ZERO, 5296 .block_erasers = 5297 { 5298 { 5299 .eraseblocks = { {4 * 1024, 1024} }, 5300 .block_erase = spi_block_erase_20, 5301 }, { 5302 .eraseblocks = { {32 * 1024, 128} }, 5303 .block_erase = spi_block_erase_52, 5304 }, { 5305 .eraseblocks = { {64 * 1024, 64} }, 5306 .block_erase = spi_block_erase_d8, 5307 }, { 5308 .eraseblocks = { {4096 * 1024, 1} }, 5309 .block_erase = spi_block_erase_60, 5310 }, { 5311 .eraseblocks = { {4096 * 1024, 1} }, 5312 .block_erase = spi_block_erase_c7, 5313 } 5314 }, 5315 .printlock = spi_prettyprint_status_register_en25s_wp, 5316 .unlock = spi_disable_blockprotect_bp3_srwd, 5317 .write = spi_chip_write_256, 5318 .read = spi_chip_read, 5319 .voltage = {1650, 1950}, 5320 }, 5321 5322 { 5323 .vendor = "Eon", 5324 .name = "EN25S40", 5325 .bustype = BUS_SPI, 5326 .manufacture_id = EON_ID_NOPREFIX, 5327 .model_id = EON_EN25S40, 5328 .total_size = 512, 5329 .page_size = 256, 5330 /* OTP: 256B total; enter 0x3A */ 5331 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5332 .tested = TEST_OK_PREW, 5333 .probe = probe_spi_rdid, 5334 .probe_timing = TIMING_ZERO, 5335 .block_erasers = 5336 { 5337 { 5338 .eraseblocks = { {4 * 1024, 128} }, 5339 .block_erase = spi_block_erase_20, 5340 }, { 5341 .eraseblocks = { {64 * 1024, 8} }, 5342 .block_erase = spi_block_erase_d8, 5343 }, { 5344 .eraseblocks = { {512 * 1024, 1} }, 5345 .block_erase = spi_block_erase_60, 5346 }, { 5347 .eraseblocks = { {512 * 1024, 1} }, 5348 .block_erase = spi_block_erase_c7, 5349 } 5350 }, 5351 .printlock = spi_prettyprint_status_register_bp2_srwd, 5352 .unlock = spi_disable_blockprotect, 5353 .write = spi_chip_write_256, 5354 .read = spi_chip_read, 5355 .voltage = {1650, 1950}, 5356 }, 5357 5358 { 5359 .vendor = "Eon", 5360 .name = "EN25S64", 5361 .bustype = BUS_SPI, 5362 .manufacture_id = EON_ID_NOPREFIX, 5363 .model_id = EON_EN25S64, 5364 .total_size = 8192, 5365 .page_size = 256, 5366 /* OTP: 512B total; enter 0x3A */ 5367 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5368 .tested = TEST_UNTESTED, 5369 .probe = probe_spi_rdid, 5370 .probe_timing = TIMING_ZERO, 5371 .block_erasers = 5372 { 5373 { 5374 .eraseblocks = { {4 * 1024, 2048} }, 5375 .block_erase = spi_block_erase_20, 5376 }, { 5377 .eraseblocks = { {64 * 1024, 128} }, 5378 .block_erase = spi_block_erase_d8, 5379 }, { 5380 .eraseblocks = { {8192 * 1024, 1} }, 5381 .block_erase = spi_block_erase_60, 5382 }, { 5383 .eraseblocks = { {8192 * 1024, 1} }, 5384 .block_erase = spi_block_erase_c7, 5385 } 5386 }, 5387 .printlock = spi_prettyprint_status_register_en25s_wp, 5388 .unlock = spi_disable_blockprotect_bp3_srwd, 5389 .write = spi_chip_write_256, 5390 .read = spi_chip_read, 5391 .voltage = {1650, 1950}, 5392 }, 5393 5394 { 5395 .vendor = "Eon", 5396 .name = "EN25S80", 5397 .bustype = BUS_SPI, 5398 .manufacture_id = EON_ID_NOPREFIX, 5399 .model_id = EON_EN25S80, 5400 .total_size = 1024, 5401 .page_size = 256, 5402 /* OTP: 256B total; enter 0x3A */ 5403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5404 .tested = TEST_UNTESTED, 5405 .probe = probe_spi_rdid, 5406 .probe_timing = TIMING_ZERO, 5407 .block_erasers = 5408 { 5409 { 5410 .eraseblocks = { {4 * 1024, 256} }, 5411 .block_erase = spi_block_erase_20, 5412 }, { 5413 .eraseblocks = { {64 * 1024, 16} }, 5414 .block_erase = spi_block_erase_d8, 5415 }, { 5416 .eraseblocks = { {1024 * 1024, 1} }, 5417 .block_erase = spi_block_erase_60, 5418 }, { 5419 .eraseblocks = { {1024 * 1024, 1} }, 5420 .block_erase = spi_block_erase_c7, 5421 } 5422 }, 5423 .printlock = spi_prettyprint_status_register_bp2_srwd, 5424 .unlock = spi_disable_blockprotect, 5425 .write = spi_chip_write_256, 5426 .read = spi_chip_read, 5427 .voltage = {1650, 1950}, 5428 }, 5429 5430 { 5431 .vendor = "Eon", 5432 .name = "EN29F002(A)(N)B", 5433 .bustype = BUS_PARALLEL, 5434 .manufacture_id = EON_ID, 5435 .model_id = EON_EN29F002B, 5436 .total_size = 256, 5437 .page_size = 256, 5438 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 5439 .tested = TEST_OK_PREW, 5440 .probe = probe_jedec, 5441 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5442 .block_erasers = 5443 { 5444 { 5445 .eraseblocks = { 5446 {16 * 1024, 1}, 5447 {8 * 1024, 2}, 5448 {32 * 1024, 1}, 5449 {64 * 1024, 3}, 5450 }, 5451 .block_erase = erase_sector_jedec, 5452 }, { 5453 .eraseblocks = { {256 * 1024, 1} }, 5454 .block_erase = erase_chip_block_jedec, 5455 }, 5456 }, 5457 .write = write_jedec_1, 5458 .read = read_memmapped, 5459 .voltage = {4500, 5500}, 5460 }, 5461 5462 { 5463 .vendor = "Eon", 5464 .name = "EN29F002(A)(N)T", 5465 .bustype = BUS_PARALLEL, 5466 .manufacture_id = EON_ID, 5467 .model_id = EON_EN29F002T, 5468 .total_size = 256, 5469 .page_size = 256, 5470 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 5471 .tested = TEST_OK_PREW, 5472 .probe = probe_jedec, 5473 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5474 .block_erasers = 5475 { 5476 { 5477 .eraseblocks = { 5478 {64 * 1024, 3}, 5479 {32 * 1024, 1}, 5480 {8 * 1024, 2}, 5481 {16 * 1024, 1}, 5482 }, 5483 .block_erase = erase_sector_jedec, 5484 }, { 5485 .eraseblocks = { {256 * 1024, 1} }, 5486 .block_erase = erase_chip_block_jedec, 5487 }, 5488 }, 5489 .write = write_jedec_1, 5490 .read = read_memmapped, 5491 .voltage = {4500, 5500}, 5492 }, 5493 5494 { 5495 .vendor = "Eon", 5496 .name = "EN29F010", 5497 .bustype = BUS_PARALLEL, 5498 .manufacture_id = EON_ID, 5499 .model_id = EON_EN29F010, 5500 .total_size = 128, 5501 .page_size = 128, 5502 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 5503 .tested = TEST_OK_PRE, 5504 .probe = probe_jedec, 5505 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5506 .block_erasers = 5507 { 5508 { 5509 .eraseblocks = { {16 * 1024, 8} }, 5510 .block_erase = erase_sector_jedec, 5511 }, 5512 { 5513 .eraseblocks = { {128 * 1024, 1} }, 5514 .block_erase = erase_chip_block_jedec, 5515 }, 5516 }, 5517 .write = write_jedec_1, 5518 .read = read_memmapped, 5519 .voltage = {4500, 5500}, 5520 }, 5521 5522 { 5523 .vendor = "Eon", 5524 .name = "EN29GL064(A)B", 5525 .bustype = BUS_PARALLEL, 5526 .manufacture_id = EON_ID, 5527 .model_id = EON_EN29GL064B, 5528 .total_size = 8192, 5529 .page_size = 128 * 1024, /* actual page size is 16 */ 5530 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5531 .tested = TEST_UNTESTED, 5532 .probe = probe_jedec_29gl, 5533 .probe_timing = TIMING_ZERO, 5534 .block_erasers = 5535 { 5536 { 5537 .eraseblocks = { 5538 {8 * 1024, 8}, 5539 {64 * 1024, 127}, 5540 }, 5541 .block_erase = erase_sector_jedec, 5542 }, { 5543 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5544 .block_erase = erase_chip_block_jedec, 5545 }, 5546 }, 5547 .write = write_jedec_1, 5548 .read = read_memmapped, 5549 .voltage = {2700, 3600}, 5550 }, 5551 5552 { 5553 .vendor = "Eon", 5554 .name = "EN29GL064(A)T", 5555 .bustype = BUS_PARALLEL, 5556 .manufacture_id = EON_ID, 5557 .model_id = EON_EN29GL064T, 5558 .total_size = 8192, 5559 .page_size = 128 * 1024, /* actual page size is 16 */ 5560 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5561 .tested = TEST_UNTESTED, 5562 .probe = probe_jedec_29gl, 5563 .probe_timing = TIMING_ZERO, 5564 .block_erasers = 5565 { 5566 { 5567 .eraseblocks = { 5568 {64 * 1024, 127}, 5569 {8 * 1024, 8}, 5570 }, 5571 .block_erase = erase_sector_jedec, 5572 }, { 5573 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5574 .block_erase = erase_chip_block_jedec, 5575 }, 5576 }, 5577 .write = write_jedec_1, 5578 .read = read_memmapped, 5579 .voltage = {2700, 3600}, 5580 }, 5581 5582 { 5583 .vendor = "Eon", 5584 .name = "EN29GL064H/L", 5585 .bustype = BUS_PARALLEL, 5586 .manufacture_id = EON_ID, 5587 .model_id = EON_EN29GL064HL, 5588 .total_size = 8192, 5589 .page_size = 128 * 1024, /* actual page size is 16 */ 5590 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5591 .tested = TEST_UNTESTED, 5592 .probe = probe_jedec_29gl, 5593 .probe_timing = TIMING_ZERO, 5594 .block_erasers = 5595 { 5596 { 5597 .eraseblocks = { {64 * 1024, 128} }, 5598 .block_erase = erase_sector_jedec, 5599 }, { 5600 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5601 .block_erase = erase_chip_block_jedec, 5602 }, 5603 }, 5604 .write = write_jedec_1, 5605 .read = read_memmapped, 5606 .voltage = {2700, 3600}, 5607 }, 5608 5609 { 5610 .vendor = "Eon", 5611 .name = "EN29GL128", 5612 .bustype = BUS_PARALLEL, 5613 .manufacture_id = EON_ID, 5614 .model_id = EON_EN29GL128HL, 5615 .total_size = 16384, 5616 .page_size = 128 * 1024, /* actual page size is 16 */ 5617 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5618 .tested = TEST_UNTESTED, 5619 .probe = probe_jedec_29gl, 5620 .probe_timing = TIMING_ZERO, 5621 .block_erasers = 5622 { 5623 { 5624 .eraseblocks = { {128 * 1024, 128} }, 5625 .block_erase = erase_sector_jedec, 5626 }, { 5627 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5628 .block_erase = erase_chip_block_jedec, 5629 }, 5630 }, 5631 .write = write_jedec_1, 5632 .read = read_memmapped, 5633 .voltage = {2700, 3600}, 5634 }, 5635 5636 { 5637 .vendor = "Eon", 5638 .name = "EN29LV040(A)", 5639 .bustype = BUS_PARALLEL, 5640 .manufacture_id = EON_ID, 5641 .model_id = EON_EN29LV040, 5642 .total_size = 512, 5643 .page_size = 4 * 1024, 5644 .tested = TEST_OK_PREW, 5645 .probe = probe_jedec, 5646 .probe_timing = TIMING_ZERO, 5647 .block_erasers = 5648 { 5649 { 5650 .eraseblocks = { {64 * 1024, 8} }, 5651 .block_erase = erase_sector_jedec, 5652 }, 5653 { 5654 .eraseblocks = { {512 * 1024, 1} }, 5655 .block_erase = erase_chip_block_jedec, 5656 }, 5657 }, 5658 .write = write_jedec_1, 5659 .read = read_memmapped, 5660 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */ 5661 }, 5662 5663 { 5664 .vendor = "Eon", 5665 .name = "EN29LV640B", 5666 .bustype = BUS_PARALLEL, 5667 .manufacture_id = EON_ID, 5668 .model_id = EON_EN29LV640B, 5669 .total_size = 8192, 5670 .page_size = 8192, 5671 .feature_bits = FEATURE_ADDR_SHIFTED, 5672 .tested = TEST_OK_PREW, 5673 .probe = probe_en29lv640b, 5674 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5675 .block_erasers = 5676 { 5677 { 5678 .eraseblocks = { 5679 {8 * 1024, 8}, 5680 {64 * 1024, 127}, 5681 }, 5682 .block_erase = erase_block_jedec, 5683 }, { 5684 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5685 .block_erase = erase_chip_block_jedec, 5686 }, 5687 }, 5688 .write = write_en29lv640b, 5689 .read = read_memmapped, 5690 .voltage = {2700, 3600}, 5691 }, 5692 5693 { 5694 .vendor = "Fujitsu", 5695 .name = "MBM29F004BC", 5696 .bustype = BUS_PARALLEL, 5697 .manufacture_id = FUJITSU_ID, 5698 .model_id = FUJITSU_MBM29F004BC, 5699 .total_size = 512, 5700 .page_size = 64 * 1024, 5701 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 5702 .tested = TEST_UNTESTED, 5703 .probe = probe_jedec, 5704 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5705 .block_erasers = 5706 { 5707 { 5708 .eraseblocks = { 5709 {16 * 1024, 1}, 5710 {8 * 1024, 2}, 5711 {32 * 1024, 1}, 5712 {64 * 1024, 7}, 5713 }, 5714 .block_erase = erase_sector_jedec, 5715 }, { 5716 .eraseblocks = { {512 * 1024, 1} }, 5717 .block_erase = erase_chip_block_jedec, 5718 }, 5719 }, 5720 .write = NULL, 5721 .read = read_memmapped, 5722 .voltage = {4500, 5500}, 5723 }, 5724 5725 { 5726 .vendor = "Fujitsu", 5727 .name = "MBM29F004TC", 5728 .bustype = BUS_PARALLEL, 5729 .manufacture_id = FUJITSU_ID, 5730 .model_id = FUJITSU_MBM29F004TC, 5731 .total_size = 512, 5732 .page_size = 64 * 1024, 5733 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 5734 .tested = TEST_UNTESTED, 5735 .probe = probe_jedec, 5736 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5737 .block_erasers = 5738 { 5739 { 5740 .eraseblocks = { 5741 {64 * 1024, 7}, 5742 {32 * 1024, 1}, 5743 {8 * 1024, 2}, 5744 {16 * 1024, 1}, 5745 }, 5746 .block_erase = erase_sector_jedec, 5747 }, { 5748 .eraseblocks = { {512 * 1024, 1} }, 5749 .block_erase = erase_chip_block_jedec, 5750 }, 5751 }, 5752 .write = NULL, 5753 .read = read_memmapped, 5754 .voltage = {4500, 5500}, 5755 }, 5756 5757 { 5758 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 5759 .vendor = "Fujitsu", 5760 .name = "MBM29F400BC", 5761 .bustype = BUS_PARALLEL, 5762 .manufacture_id = FUJITSU_ID, 5763 .model_id = FUJITSU_MBM29F400BC, 5764 .total_size = 512, 5765 .page_size = 64 * 1024, 5766 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 5767 .tested = TEST_UNTESTED, 5768 .probe = probe_jedec, 5769 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 5770 .block_erasers = 5771 { 5772 { 5773 .eraseblocks = { 5774 {16 * 1024, 1}, 5775 {8 * 1024, 2}, 5776 {32 * 1024, 1}, 5777 {64 * 1024, 7}, 5778 }, 5779 .block_erase = erase_sector_jedec, 5780 }, { 5781 .eraseblocks = { {512 * 1024, 1} }, 5782 .block_erase = erase_chip_block_jedec, 5783 }, 5784 }, 5785 .write = write_jedec_1, 5786 .read = read_memmapped, 5787 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 5788 }, 5789 5790 { 5791 .vendor = "Fujitsu", 5792 .name = "MBM29F400TC", 5793 .bustype = BUS_PARALLEL, 5794 .manufacture_id = FUJITSU_ID, 5795 .model_id = FUJITSU_MBM29F400TC, 5796 .total_size = 512, 5797 .page_size = 64 * 1024, 5798 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 5799 .tested = TEST_UNTESTED, 5800 .probe = probe_jedec, 5801 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 5802 .block_erasers = 5803 { 5804 { 5805 .eraseblocks = { 5806 {64 * 1024, 7}, 5807 {32 * 1024, 1}, 5808 {8 * 1024, 2}, 5809 {16 * 1024, 1}, 5810 }, 5811 .block_erase = erase_sector_jedec, 5812 }, { 5813 .eraseblocks = { {512 * 1024, 1} }, 5814 .block_erase = erase_chip_block_jedec, 5815 }, 5816 }, 5817 .write = write_jedec_1, 5818 .read = read_memmapped, 5819 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 5820 }, 5821 5822 { 5823 .vendor = "Fujitsu", 5824 .name = "MBM29LV160BE", 5825 .bustype = BUS_PARALLEL, 5826 .manufacture_id = FUJITSU_ID, 5827 .model_id = FUJITSU_MBM29LV160BE, 5828 .total_size = 2 * 1024, 5829 .page_size = 0, 5830 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET, 5831 .tested = TEST_UNTESTED, 5832 .probe = probe_jedec, 5833 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 5834 .block_erasers = 5835 { 5836 { 5837 .eraseblocks = { 5838 {16 * 1024, 1}, 5839 {8 * 1024, 2}, 5840 {32 * 1024, 1}, 5841 {64 * 1024, 31}, 5842 }, 5843 .block_erase = erase_block_jedec, 5844 }, { 5845 .eraseblocks = { {2048 * 1024, 1} }, 5846 .block_erase = erase_chip_block_jedec, 5847 }, 5848 }, 5849 .write = write_jedec_1, /* Supports a fast mode too */ 5850 .read = read_memmapped, 5851 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */ 5852 }, 5853 5854 { 5855 .vendor = "Fujitsu", 5856 .name = "MBM29LV160TE", 5857 .bustype = BUS_PARALLEL, 5858 .manufacture_id = FUJITSU_ID, 5859 .model_id = FUJITSU_MBM29LV160TE, 5860 .total_size = 2 * 1024, 5861 .page_size = 0, 5862 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET, 5863 .tested = TEST_UNTESTED, 5864 .probe = probe_jedec, 5865 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 5866 .block_erasers = 5867 { 5868 { 5869 .eraseblocks = { 5870 {64 * 1024, 31}, 5871 {32 * 1024, 1}, 5872 {8 * 1024, 2}, 5873 {16 * 1024, 1}, 5874 }, 5875 .block_erase = erase_block_jedec, 5876 }, { 5877 .eraseblocks = { {2048 * 1024, 1} }, 5878 .block_erase = erase_chip_block_jedec, 5879 }, 5880 }, 5881 .write = write_jedec_1, /* Supports a fast mode too */ 5882 .read = read_memmapped, 5883 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */ 5884 }, 5885 5886 { 5887 .vendor = "GigaDevice", 5888 .name = "GD25B128B/GD25Q128B", 5889 .bustype = BUS_SPI, 5890 .manufacture_id = GIGADEVICE_ID, 5891 .model_id = GIGADEVICE_GD25Q128, 5892 .total_size = 16384, 5893 .page_size = 256, 5894 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 5895 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5896 .tested = TEST_OK_PREW, 5897 .probe = probe_spi_rdid, 5898 .probe_timing = TIMING_ZERO, 5899 .block_erasers = 5900 { 5901 { 5902 .eraseblocks = { {4 * 1024, 4096} }, 5903 .block_erase = spi_block_erase_20, 5904 }, { 5905 .eraseblocks = { {32 * 1024, 512} }, 5906 .block_erase = spi_block_erase_52, 5907 }, { 5908 .eraseblocks = { {64 * 1024, 256} }, 5909 .block_erase = spi_block_erase_d8, 5910 }, { 5911 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5912 .block_erase = spi_block_erase_60, 5913 }, { 5914 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5915 .block_erase = spi_block_erase_c7, 5916 } 5917 }, 5918 .printlock = spi_prettyprint_status_register_bp4_srwd, 5919 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 5920 .write = spi_chip_write_256, 5921 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 5922 .voltage = {2700, 3600}, 5923 }, 5924 5925 { 5926 .vendor = "GigaDevice", 5927 .name = "GD25LQ128C/GD25LQ128D", 5928 .bustype = BUS_SPI, 5929 .manufacture_id = GIGADEVICE_ID, 5930 .model_id = GIGADEVICE_GD25LQ128CD, 5931 .total_size = 16384, 5932 .page_size = 256, 5933 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 5934 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5935 .tested = TEST_UNTESTED, 5936 .probe = probe_spi_rdid, 5937 .probe_timing = TIMING_ZERO, 5938 .block_erasers = 5939 { 5940 { 5941 .eraseblocks = { {4 * 1024, 4096} }, 5942 .block_erase = spi_block_erase_20, 5943 }, { 5944 .eraseblocks = { {32 * 1024, 512} }, 5945 .block_erase = spi_block_erase_52, 5946 }, { 5947 .eraseblocks = { {64 * 1024, 256} }, 5948 .block_erase = spi_block_erase_d8, 5949 }, { 5950 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5951 .block_erase = spi_block_erase_60, 5952 }, { 5953 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5954 .block_erase = spi_block_erase_c7, 5955 } 5956 }, 5957 .printlock = spi_prettyprint_status_register_bp4_srwd, 5958 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 5959 .write = spi_chip_write_256, 5960 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 5961 .voltage = {1695, 1950}, 5962 }, 5963 5964 { 5965 .vendor = "GigaDevice", 5966 .name = "GD25LQ16", 5967 .bustype = BUS_SPI, 5968 .manufacture_id = GIGADEVICE_ID, 5969 .model_id = GIGADEVICE_GD25LQ16, 5970 .total_size = 2048, 5971 .page_size = 256, 5972 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 5973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5974 .tested = TEST_UNTESTED, 5975 .probe = probe_spi_rdid, 5976 .probe_timing = TIMING_ZERO, 5977 .block_erasers = 5978 { 5979 { 5980 .eraseblocks = { {4 * 1024, 512} }, 5981 .block_erase = spi_block_erase_20, 5982 }, { 5983 .eraseblocks = { {32 * 1024, 64} }, 5984 .block_erase = spi_block_erase_52, 5985 }, { 5986 .eraseblocks = { {64 * 1024, 32} }, 5987 .block_erase = spi_block_erase_d8, 5988 }, { 5989 .eraseblocks = { {2 * 1024 * 1024, 1} }, 5990 .block_erase = spi_block_erase_60, 5991 }, { 5992 .eraseblocks = { {2 * 1024 * 1024, 1} }, 5993 .block_erase = spi_block_erase_c7, 5994 } 5995 }, 5996 .printlock = spi_prettyprint_status_register_bp4_srwd, 5997 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 5998 .write = spi_chip_write_256, 5999 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6000 .voltage = {1695, 1950}, 6001 }, 6002 6003 { 6004 .vendor = "GigaDevice", 6005 .name = "GD25LQ32", 6006 .bustype = BUS_SPI, 6007 .manufacture_id = GIGADEVICE_ID, 6008 .model_id = GIGADEVICE_GD25LQ32, 6009 .total_size = 4096, 6010 .page_size = 256, 6011 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6012 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6013 .tested = TEST_OK_PREW, 6014 .probe = probe_spi_rdid, 6015 .probe_timing = TIMING_ZERO, 6016 .block_erasers = 6017 { 6018 { 6019 .eraseblocks = { {4 * 1024, 1024} }, 6020 .block_erase = spi_block_erase_20, 6021 }, { 6022 .eraseblocks = { {32 * 1024, 128} }, 6023 .block_erase = spi_block_erase_52, 6024 }, { 6025 .eraseblocks = { {64 * 1024, 64} }, 6026 .block_erase = spi_block_erase_d8, 6027 }, { 6028 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6029 .block_erase = spi_block_erase_60, 6030 }, { 6031 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6032 .block_erase = spi_block_erase_c7, 6033 } 6034 }, 6035 .printlock = spi_prettyprint_status_register_bp4_srwd, 6036 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6037 .write = spi_chip_write_256, 6038 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6039 .voltage = {1695, 1950}, 6040 }, 6041 6042 { 6043 .vendor = "GigaDevice", 6044 .name = "GD25LQ40", 6045 .bustype = BUS_SPI, 6046 .manufacture_id = GIGADEVICE_ID, 6047 .model_id = GIGADEVICE_GD25LQ40, 6048 .total_size = 512, 6049 .page_size = 256, 6050 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6051 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6052 .tested = TEST_UNTESTED, 6053 .probe = probe_spi_rdid, 6054 .probe_timing = TIMING_ZERO, 6055 .block_erasers = 6056 { 6057 { 6058 .eraseblocks = { {4 * 1024, 128} }, 6059 .block_erase = spi_block_erase_20, 6060 }, { 6061 .eraseblocks = { {32 * 1024, 16} }, 6062 .block_erase = spi_block_erase_52, 6063 }, { 6064 .eraseblocks = { {64 * 1024, 8} }, 6065 .block_erase = spi_block_erase_d8, 6066 }, { 6067 .eraseblocks = { {512 * 1024, 1} }, 6068 .block_erase = spi_block_erase_60, 6069 }, { 6070 .eraseblocks = { {512 * 1024, 1} }, 6071 .block_erase = spi_block_erase_c7, 6072 } 6073 }, 6074 .printlock = spi_prettyprint_status_register_bp4_srwd, 6075 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6076 .write = spi_chip_write_256, 6077 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6078 .voltage = {1695, 1950}, 6079 }, 6080 6081 { 6082 .vendor = "GigaDevice", 6083 .name = "GD25LQ64(B)", 6084 .bustype = BUS_SPI, 6085 .manufacture_id = GIGADEVICE_ID, 6086 .model_id = GIGADEVICE_GD25LQ64, 6087 .total_size = 8192, 6088 .page_size = 256, 6089 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6090 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6091 .tested = TEST_OK_PREW, 6092 .probe = probe_spi_rdid, 6093 .probe_timing = TIMING_ZERO, 6094 .block_erasers = 6095 { 6096 { 6097 .eraseblocks = { {4 * 1024, 2048} }, 6098 .block_erase = spi_block_erase_20, 6099 }, { 6100 .eraseblocks = { {32 * 1024, 256} }, 6101 .block_erase = spi_block_erase_52, 6102 }, { 6103 .eraseblocks = { {64 * 1024, 128} }, 6104 .block_erase = spi_block_erase_d8, 6105 }, { 6106 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6107 .block_erase = spi_block_erase_60, 6108 }, { 6109 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6110 .block_erase = spi_block_erase_c7, 6111 } 6112 }, 6113 .printlock = spi_prettyprint_status_register_bp4_srwd, 6114 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6115 .write = spi_chip_write_256, 6116 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6117 .voltage = {1695, 1950}, 6118 }, 6119 6120 { 6121 .vendor = "GigaDevice", 6122 .name = "GD25LQ80", 6123 .bustype = BUS_SPI, 6124 .manufacture_id = GIGADEVICE_ID, 6125 .model_id = GIGADEVICE_GD25LQ80, 6126 .total_size = 1024, 6127 .page_size = 256, 6128 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6129 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6130 .tested = TEST_UNTESTED, 6131 .probe = probe_spi_rdid, 6132 .probe_timing = TIMING_ZERO, 6133 .block_erasers = 6134 { 6135 { 6136 .eraseblocks = { {4 * 1024, 256} }, 6137 .block_erase = spi_block_erase_20, 6138 }, { 6139 .eraseblocks = { {32 * 1024, 32} }, 6140 .block_erase = spi_block_erase_52, 6141 }, { 6142 .eraseblocks = { {64 * 1024, 16} }, 6143 .block_erase = spi_block_erase_d8, 6144 }, { 6145 .eraseblocks = { {1 * 1024 * 1024, 1} }, 6146 .block_erase = spi_block_erase_60, 6147 }, { 6148 .eraseblocks = { {1 * 1024 * 1024, 1} }, 6149 .block_erase = spi_block_erase_c7, 6150 } 6151 }, 6152 .printlock = spi_prettyprint_status_register_bp4_srwd, 6153 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6154 .write = spi_chip_write_256, 6155 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6156 .voltage = {1695, 1950}, 6157 }, 6158 6159 { 6160 .vendor = "GigaDevice", 6161 .name = "GD25Q10", 6162 .bustype = BUS_SPI, 6163 .manufacture_id = GIGADEVICE_ID, 6164 .model_id = GIGADEVICE_GD25Q10, 6165 .total_size = 128, 6166 .page_size = 256, 6167 .feature_bits = FEATURE_WRSR_WREN, 6168 .tested = TEST_UNTESTED, 6169 .probe = probe_spi_rdid, 6170 .probe_timing = TIMING_ZERO, 6171 .block_erasers = 6172 { 6173 { 6174 .eraseblocks = { {4 * 1024, 32} }, 6175 .block_erase = spi_block_erase_20, 6176 }, { 6177 .eraseblocks = { {32 * 1024, 4} }, 6178 .block_erase = spi_block_erase_52, 6179 }, { 6180 .eraseblocks = { {64 * 1024, 2} }, 6181 .block_erase = spi_block_erase_d8, 6182 }, { 6183 .eraseblocks = { {128 * 1024, 1} }, 6184 .block_erase = spi_block_erase_60, 6185 }, { 6186 .eraseblocks = { {128 * 1024, 1} }, 6187 .block_erase = spi_block_erase_c7, 6188 } 6189 }, 6190 .printlock = spi_prettyprint_status_register_bp4_srwd, 6191 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6192 .write = spi_chip_write_256, 6193 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6194 .voltage = {2700, 3600}, 6195 }, 6196 6197 { 6198 .vendor = "GigaDevice", 6199 .name = "GD25Q127C/GD25Q128C", 6200 .bustype = BUS_SPI, 6201 .manufacture_id = GIGADEVICE_ID, 6202 .model_id = GIGADEVICE_GD25Q128, 6203 .total_size = 16384, 6204 .page_size = 256, 6205 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */ 6206 /* QPI: enable 0x38, disable 0xFF */ 6207 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6208 .tested = TEST_OK_PREW, 6209 .probe = probe_spi_rdid, 6210 .probe_timing = TIMING_ZERO, 6211 .block_erasers = 6212 { 6213 { 6214 .eraseblocks = { {4 * 1024, 4096} }, 6215 .block_erase = spi_block_erase_20, 6216 }, { 6217 .eraseblocks = { {32 * 1024, 512} }, 6218 .block_erase = spi_block_erase_52, 6219 }, { 6220 .eraseblocks = { {64 * 1024, 256} }, 6221 .block_erase = spi_block_erase_d8, 6222 }, { 6223 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6224 .block_erase = spi_block_erase_60, 6225 }, { 6226 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6227 .block_erase = spi_block_erase_c7, 6228 } 6229 }, 6230 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */ 6231 .printlock = spi_prettyprint_status_register_bp4_srwd, 6232 .unlock = spi_disable_blockprotect_bp4_srwd, 6233 .write = spi_chip_write_256, 6234 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6235 .voltage = {2700, 3600}, 6236 }, 6237 6238 { 6239 .vendor = "GigaDevice", 6240 .name = "GD25Q16(B)", 6241 .bustype = BUS_SPI, 6242 .manufacture_id = GIGADEVICE_ID, 6243 .model_id = GIGADEVICE_GD25Q16, 6244 .total_size = 2048, 6245 .page_size = 256, 6246 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ 6247 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6248 .tested = TEST_OK_PREW, 6249 .probe = probe_spi_rdid, 6250 .probe_timing = TIMING_ZERO, 6251 .block_erasers = 6252 { 6253 { 6254 .eraseblocks = { {4 * 1024, 512} }, 6255 .block_erase = spi_block_erase_20, 6256 }, { 6257 .eraseblocks = { {32 * 1024, 64} }, 6258 .block_erase = spi_block_erase_52, 6259 }, { 6260 .eraseblocks = { {64 * 1024, 32} }, 6261 .block_erase = spi_block_erase_d8, 6262 }, { 6263 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6264 .block_erase = spi_block_erase_60, 6265 }, { 6266 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6267 .block_erase = spi_block_erase_c7, 6268 } 6269 }, 6270 .printlock = spi_prettyprint_status_register_bp4_srwd, 6271 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6272 .write = spi_chip_write_256, 6273 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6274 .voltage = {2700, 3600}, 6275 }, 6276 6277 { 6278 .vendor = "GigaDevice", 6279 .name = "GD25Q20(B)", 6280 .bustype = BUS_SPI, 6281 .manufacture_id = GIGADEVICE_ID, 6282 .model_id = GIGADEVICE_GD25Q20, 6283 .total_size = 256, 6284 .page_size = 256, 6285 .feature_bits = FEATURE_WRSR_WREN, 6286 .tested = TEST_OK_PREW, 6287 .probe = probe_spi_rdid, 6288 .probe_timing = TIMING_ZERO, 6289 .block_erasers = 6290 { 6291 { 6292 .eraseblocks = { {4 * 1024, 64} }, 6293 .block_erase = spi_block_erase_20, 6294 }, { 6295 .eraseblocks = { {32 * 1024, 8} }, 6296 .block_erase = spi_block_erase_52, 6297 }, { 6298 .eraseblocks = { {64 * 1024, 4} }, 6299 .block_erase = spi_block_erase_d8, 6300 }, { 6301 .eraseblocks = { {256 * 1024, 1} }, 6302 .block_erase = spi_block_erase_60, 6303 }, { 6304 .eraseblocks = { {256 * 1024, 1} }, 6305 .block_erase = spi_block_erase_c7, 6306 } 6307 }, 6308 .printlock = spi_prettyprint_status_register_bp4_srwd, 6309 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6310 .write = spi_chip_write_256, 6311 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6312 .voltage = {2700, 3600}, 6313 }, 6314 6315 { 6316 .vendor = "GigaDevice", 6317 .name = "GD25Q256D", 6318 .bustype = BUS_SPI, 6319 .manufacture_id = GIGADEVICE_ID, 6320 .model_id = GIGADEVICE_GD25Q256D, 6321 .total_size = 32768, 6322 .page_size = 256, 6323 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 6324 .tested = TEST_UNTESTED, 6325 .probe = probe_spi_rdid, 6326 .probe_timing = TIMING_ZERO, 6327 .block_erasers = 6328 { 6329 { 6330 .eraseblocks = { {4 * 1024, 8192} }, 6331 .block_erase = spi_block_erase_21, 6332 }, { 6333 .eraseblocks = { {4 * 1024, 8192} }, 6334 .block_erase = spi_block_erase_20, 6335 }, { 6336 .eraseblocks = { {32 * 1024, 1024} }, 6337 .block_erase = spi_block_erase_5c, 6338 }, { 6339 .eraseblocks = { {32 * 1024, 1024} }, 6340 .block_erase = spi_block_erase_52, 6341 }, { 6342 .eraseblocks = { {64 * 1024, 512} }, 6343 .block_erase = spi_block_erase_dc, 6344 }, { 6345 .eraseblocks = { {64 * 1024, 512} }, 6346 .block_erase = spi_block_erase_d8, 6347 }, { 6348 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6349 .block_erase = spi_block_erase_60, 6350 }, { 6351 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6352 .block_erase = spi_block_erase_c7, 6353 } 6354 }, 6355 .printlock = spi_prettyprint_status_register_bp3_srwd, 6356 .unlock = spi_disable_blockprotect, 6357 .write = spi_chip_write_256, 6358 .read = spi_chip_read, 6359 .voltage = {2700, 3600}, 6360 }, 6361 6362 { 6363 .vendor = "GigaDevice", 6364 .name = "GD25Q32(B)", 6365 .bustype = BUS_SPI, 6366 .manufacture_id = GIGADEVICE_ID, 6367 .model_id = GIGADEVICE_GD25Q32, 6368 .total_size = 4096, 6369 .page_size = 256, 6370 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6371 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6372 .tested = TEST_OK_PREW, 6373 .probe = probe_spi_rdid, 6374 .probe_timing = TIMING_ZERO, 6375 .block_erasers = 6376 { 6377 { 6378 .eraseblocks = { {4 * 1024, 1024} }, 6379 .block_erase = spi_block_erase_20, 6380 }, { 6381 .eraseblocks = { {32 * 1024, 128} }, 6382 .block_erase = spi_block_erase_52, 6383 }, { 6384 .eraseblocks = { {64 * 1024, 64} }, 6385 .block_erase = spi_block_erase_d8, 6386 }, { 6387 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6388 .block_erase = spi_block_erase_60, 6389 }, { 6390 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6391 .block_erase = spi_block_erase_c7, 6392 } 6393 }, 6394 .printlock = spi_prettyprint_status_register_bp4_srwd, 6395 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6396 .write = spi_chip_write_256, 6397 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6398 .voltage = {2700, 3600}, 6399 }, 6400 6401 { 6402 .vendor = "GigaDevice", 6403 .name = "GD25Q40(B)", 6404 .bustype = BUS_SPI, 6405 .manufacture_id = GIGADEVICE_ID, 6406 .model_id = GIGADEVICE_GD25Q40, 6407 .total_size = 512, 6408 .page_size = 256, 6409 .feature_bits = FEATURE_WRSR_WREN, 6410 .tested = TEST_UNTESTED, 6411 .probe = probe_spi_rdid, 6412 .probe_timing = TIMING_ZERO, 6413 .block_erasers = 6414 { 6415 { 6416 .eraseblocks = { {4 * 1024, 128} }, 6417 .block_erase = spi_block_erase_20, 6418 }, { 6419 .eraseblocks = { {32 * 1024, 16} }, 6420 .block_erase = spi_block_erase_52, 6421 }, { 6422 .eraseblocks = { {64 * 1024, 8} }, 6423 .block_erase = spi_block_erase_d8, 6424 }, { 6425 .eraseblocks = { {512 * 1024, 1} }, 6426 .block_erase = spi_block_erase_60, 6427 }, { 6428 .eraseblocks = { {512 * 1024, 1} }, 6429 .block_erase = spi_block_erase_c7, 6430 } 6431 }, 6432 .printlock = spi_prettyprint_status_register_bp4_srwd, 6433 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6434 .write = spi_chip_write_256, 6435 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6436 .voltage = {2700, 3600}, 6437 }, 6438 6439 { 6440 .vendor = "GigaDevice", 6441 .name = "GD25Q512", 6442 .bustype = BUS_SPI, 6443 .manufacture_id = GIGADEVICE_ID, 6444 .model_id = GIGADEVICE_GD25Q512, 6445 .total_size = 64, 6446 .page_size = 256, 6447 .feature_bits = FEATURE_WRSR_WREN, 6448 .tested = TEST_OK_PREW, 6449 .probe = probe_spi_rdid, 6450 .probe_timing = TIMING_ZERO, 6451 .block_erasers = 6452 { 6453 { 6454 .eraseblocks = { {4 * 1024, 16} }, 6455 .block_erase = spi_block_erase_20, 6456 }, { 6457 .eraseblocks = { {32 * 1024, 2} }, 6458 .block_erase = spi_block_erase_52, 6459 }, { 6460 .eraseblocks = { {64 * 1024, 1} }, 6461 .block_erase = spi_block_erase_60, 6462 }, { 6463 .eraseblocks = { {64 * 1024, 1} }, 6464 .block_erase = spi_block_erase_c7, 6465 } 6466 }, 6467 .printlock = spi_prettyprint_status_register_bp4_srwd, 6468 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6469 .write = spi_chip_write_256, 6470 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6471 .voltage = {2700, 3600}, 6472 }, 6473 6474 { 6475 .vendor = "GigaDevice", 6476 .name = "GD25Q64(B)", 6477 .bustype = BUS_SPI, 6478 .manufacture_id = GIGADEVICE_ID, 6479 .model_id = GIGADEVICE_GD25Q64, 6480 .total_size = 8192, 6481 .page_size = 256, 6482 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6483 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6484 .tested = TEST_OK_PREW, 6485 .probe = probe_spi_rdid, 6486 .probe_timing = TIMING_ZERO, 6487 .block_erasers = 6488 { 6489 { 6490 .eraseblocks = { {4 * 1024, 2048} }, 6491 .block_erase = spi_block_erase_20, 6492 }, { 6493 .eraseblocks = { {32 * 1024, 256} }, 6494 .block_erase = spi_block_erase_52, 6495 }, { 6496 .eraseblocks = { {64 * 1024, 128} }, 6497 .block_erase = spi_block_erase_d8, 6498 }, { 6499 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6500 .block_erase = spi_block_erase_60, 6501 }, { 6502 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6503 .block_erase = spi_block_erase_c7, 6504 } 6505 }, 6506 .printlock = spi_prettyprint_status_register_bp4_srwd, 6507 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6508 .write = spi_chip_write_256, 6509 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6510 .voltage = {2700, 3600}, 6511 }, 6512 6513 { 6514 .vendor = "GigaDevice", 6515 .name = "GD25Q80(B)", 6516 .bustype = BUS_SPI, 6517 .manufacture_id = GIGADEVICE_ID, 6518 .model_id = GIGADEVICE_GD25Q80, 6519 .total_size = 1024, 6520 .page_size = 256, 6521 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ 6522 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6523 .tested = TEST_OK_PREW, 6524 .probe = probe_spi_rdid, 6525 .probe_timing = TIMING_ZERO, 6526 .block_erasers = 6527 { 6528 { 6529 .eraseblocks = { {4 * 1024, 256} }, 6530 .block_erase = spi_block_erase_20, 6531 }, { 6532 .eraseblocks = { {32 * 1024, 32} }, 6533 .block_erase = spi_block_erase_52, 6534 }, { 6535 .eraseblocks = { {64 * 1024, 16} }, 6536 .block_erase = spi_block_erase_d8, 6537 }, { 6538 .eraseblocks = { {1024 * 1024, 1} }, 6539 .block_erase = spi_block_erase_60, 6540 }, { 6541 .eraseblocks = { {1024 * 1024, 1} }, 6542 .block_erase = spi_block_erase_c7, 6543 } 6544 }, 6545 .printlock = spi_prettyprint_status_register_bp4_srwd, 6546 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6547 .write = spi_chip_write_256, 6548 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6549 .voltage = {2700, 3600}, 6550 }, 6551 6552 { 6553 .vendor = "GigaDevice", 6554 .name = "GD25T80", 6555 .bustype = BUS_SPI, 6556 .manufacture_id = GIGADEVICE_ID, 6557 .model_id = GIGADEVICE_GD25T80, 6558 .total_size = 1024, 6559 .page_size = 256, 6560 /* OTP: 256B total; enter 0x3A */ 6561 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6562 .tested = TEST_UNTESTED, 6563 .probe = probe_spi_rdid, 6564 .probe_timing = TIMING_ZERO, 6565 .block_erasers = 6566 { 6567 { 6568 .eraseblocks = { {4 * 1024, 256} }, 6569 .block_erase = spi_block_erase_20, 6570 }, { 6571 .eraseblocks = { {64 * 1024, 16} }, 6572 .block_erase = spi_block_erase_52, 6573 }, { 6574 .eraseblocks = { {64 * 1024, 16} }, 6575 .block_erase = spi_block_erase_d8, 6576 }, { 6577 .eraseblocks = { {1024 * 1024, 1} }, 6578 .block_erase = spi_block_erase_60, 6579 }, { 6580 .eraseblocks = { {1024 * 1024, 1} }, 6581 .block_erase = spi_block_erase_c7, 6582 } 6583 }, 6584 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 6585 .unlock = spi_disable_blockprotect, 6586 .write = spi_chip_write_256, 6587 .read = spi_chip_read, 6588 .voltage = {2700, 3600}, 6589 }, 6590 6591 { 6592 .vendor = "GigaDevice", 6593 .name = "GD25VQ16C", 6594 .bustype = BUS_SPI, 6595 .manufacture_id = GIGADEVICE_ID, 6596 .model_id = GIGADEVICE_GD25VQ16C, 6597 .total_size = 2 * 1024, 6598 .page_size = 256, 6599 /* Supports SFDP */ 6600 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 6601 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6602 .tested = TEST_UNTESTED, 6603 .probe = probe_spi_rdid, 6604 .probe_timing = TIMING_ZERO, 6605 .block_erasers = 6606 { 6607 { 6608 .eraseblocks = { { 4 * 1024, 512} }, 6609 .block_erase = spi_block_erase_20, 6610 }, { 6611 .eraseblocks = { { 32 * 1024, 64} }, 6612 .block_erase = spi_block_erase_52, 6613 }, { 6614 .eraseblocks = { { 64 * 1024, 32} }, 6615 .block_erase = spi_block_erase_d8, 6616 }, { 6617 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6618 .block_erase = spi_block_erase_60, 6619 }, { 6620 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6621 .block_erase = spi_block_erase_c7, 6622 } 6623 }, 6624 .printlock = spi_prettyprint_status_register_bp4_srwd, 6625 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6626 .write = spi_chip_write_256, 6627 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6628 .voltage = {2300, 3600}, 6629 }, 6630 6631 { 6632 .vendor = "GigaDevice", 6633 .name = "GD25VQ21B", 6634 .bustype = BUS_SPI, 6635 .manufacture_id = GIGADEVICE_ID, 6636 .model_id = GIGADEVICE_GD25VQ21B, 6637 .total_size = 256, 6638 .page_size = 256, 6639 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */ 6640 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6641 .tested = TEST_UNTESTED, 6642 .probe = probe_spi_rdid, 6643 .probe_timing = TIMING_ZERO, 6644 .block_erasers = 6645 { 6646 { 6647 .eraseblocks = { { 4 * 1024, 64} }, 6648 .block_erase = spi_block_erase_20, 6649 }, { 6650 .eraseblocks = { { 32 * 1024, 8} }, 6651 .block_erase = spi_block_erase_52, 6652 }, { 6653 .eraseblocks = { { 64 * 1024, 4} }, 6654 .block_erase = spi_block_erase_d8, 6655 }, { 6656 .eraseblocks = { {256 * 1024, 1} }, 6657 .block_erase = spi_block_erase_60, 6658 }, { 6659 .eraseblocks = { {256 * 1024, 1} }, 6660 .block_erase = spi_block_erase_c7, 6661 } 6662 }, 6663 .printlock = spi_prettyprint_status_register_bp4_srwd, 6664 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6665 .write = spi_chip_write_256, 6666 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6667 .voltage = {2300, 3600}, 6668 }, 6669 6670 { 6671 .vendor = "GigaDevice", 6672 .name = "GD25VQ40C", 6673 .bustype = BUS_SPI, 6674 .manufacture_id = GIGADEVICE_ID, 6675 .model_id = GIGADEVICE_GD25VQ41B, 6676 .total_size = 512, 6677 .page_size = 256, 6678 /* Supports SFDP */ 6679 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 6680 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6681 .tested = TEST_UNTESTED, 6682 .probe = probe_spi_rdid, 6683 .probe_timing = TIMING_ZERO, 6684 .block_erasers = 6685 { 6686 { 6687 .eraseblocks = { { 4 * 1024, 128} }, 6688 .block_erase = spi_block_erase_20, 6689 }, { 6690 .eraseblocks = { { 32 * 1024, 16} }, 6691 .block_erase = spi_block_erase_52, 6692 }, { 6693 .eraseblocks = { { 64 * 1024, 8} }, 6694 .block_erase = spi_block_erase_d8, 6695 }, { 6696 .eraseblocks = { {512 * 1024, 1} }, 6697 .block_erase = spi_block_erase_60, 6698 }, { 6699 .eraseblocks = { {512 * 1024, 1} }, 6700 .block_erase = spi_block_erase_c7, 6701 } 6702 }, 6703 .printlock = spi_prettyprint_status_register_bp4_srwd, 6704 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6705 .write = spi_chip_write_256, 6706 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6707 .voltage = {2300, 3600}, 6708 }, 6709 6710 { 6711 .vendor = "GigaDevice", 6712 .name = "GD25VQ41B", 6713 .bustype = BUS_SPI, 6714 .manufacture_id = GIGADEVICE_ID, 6715 .model_id = GIGADEVICE_GD25VQ41B, 6716 .total_size = 512, 6717 .page_size = 256, 6718 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */ 6719 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6720 .tested = TEST_OK_PREW, 6721 .probe = probe_spi_rdid, 6722 .probe_timing = TIMING_ZERO, 6723 .block_erasers = 6724 { 6725 { 6726 .eraseblocks = { { 4 * 1024, 128} }, 6727 .block_erase = spi_block_erase_20, 6728 }, { 6729 .eraseblocks = { { 32 * 1024, 16} }, 6730 .block_erase = spi_block_erase_52, 6731 }, { 6732 .eraseblocks = { { 64 * 1024, 8} }, 6733 .block_erase = spi_block_erase_d8, 6734 }, { 6735 .eraseblocks = { {512 * 1024, 1} }, 6736 .block_erase = spi_block_erase_60, 6737 }, { 6738 .eraseblocks = { {512 * 1024, 1} }, 6739 .block_erase = spi_block_erase_c7, 6740 } 6741 }, 6742 .printlock = spi_prettyprint_status_register_bp4_srwd, 6743 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6744 .write = spi_chip_write_256, 6745 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6746 .voltage = {2300, 3600}, 6747 }, 6748 6749 { 6750 .vendor = "GigaDevice", 6751 .name = "GD25VQ80C", 6752 .bustype = BUS_SPI, 6753 .manufacture_id = GIGADEVICE_ID, 6754 .model_id = GIGADEVICE_GD25VQ80C, 6755 .total_size = 1024, 6756 .page_size = 256, 6757 /* Supports SFDP */ 6758 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 6759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6760 .tested = TEST_UNTESTED, 6761 .probe = probe_spi_rdid, 6762 .probe_timing = TIMING_ZERO, 6763 .block_erasers = 6764 { 6765 { 6766 .eraseblocks = { { 4 * 1024, 256} }, 6767 .block_erase = spi_block_erase_20, 6768 }, { 6769 .eraseblocks = { { 32 * 1024, 32} }, 6770 .block_erase = spi_block_erase_52, 6771 }, { 6772 .eraseblocks = { { 64 * 1024, 16} }, 6773 .block_erase = spi_block_erase_d8, 6774 }, { 6775 .eraseblocks = { {1024 * 1024, 1} }, 6776 .block_erase = spi_block_erase_60, 6777 }, { 6778 .eraseblocks = { {1024 * 1024, 1} }, 6779 .block_erase = spi_block_erase_c7, 6780 } 6781 }, 6782 .printlock = spi_prettyprint_status_register_bp4_srwd, 6783 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */ 6784 .write = spi_chip_write_256, 6785 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 6786 .voltage = {2300, 3600}, 6787 }, 6788 6789 { 6790 .vendor = "Hyundai", 6791 .name = "HY29F002B", 6792 .bustype = BUS_PARALLEL, 6793 .manufacture_id = HYUNDAI_ID, 6794 .model_id = HYUNDAI_HY29F002B, 6795 .total_size = 256, 6796 .page_size = 256 * 1024, 6797 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ 6798 .tested = TEST_UNTESTED, 6799 .probe = probe_jedec, 6800 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 6801 .block_erasers = 6802 { 6803 { 6804 .eraseblocks = { 6805 {16 * 1024, 1}, 6806 {8 * 1024, 2}, 6807 {32 * 1024, 1}, 6808 {64 * 1024, 3}, 6809 }, 6810 .block_erase = erase_sector_jedec, 6811 }, { 6812 .eraseblocks = { {256 * 1024, 1} }, 6813 .block_erase = erase_chip_block_jedec, 6814 }, 6815 }, 6816 .write = write_jedec_1, 6817 .read = read_memmapped, 6818 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */ 6819 }, 6820 6821 { 6822 .vendor = "Hyundai", 6823 .name = "HY29F002T", 6824 .bustype = BUS_PARALLEL, 6825 .manufacture_id = HYUNDAI_ID, 6826 .model_id = HYUNDAI_HY29F002T, 6827 .total_size = 256, 6828 .page_size = 256 * 1024, 6829 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ 6830 .tested = TEST_OK_PRE, 6831 .probe = probe_jedec, 6832 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 6833 .block_erasers = 6834 { 6835 { 6836 .eraseblocks = { 6837 {64 * 1024, 3}, 6838 {32 * 1024, 1}, 6839 {8 * 1024, 2}, 6840 {16 * 1024, 1}, 6841 }, 6842 .block_erase = erase_sector_jedec, 6843 }, { 6844 .eraseblocks = { {256 * 1024, 1} }, 6845 .block_erase = erase_chip_block_jedec, 6846 }, 6847 }, 6848 .write = write_jedec_1, 6849 .read = read_memmapped, 6850 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */ 6851 }, 6852 6853 { 6854 .vendor = "Hyundai", 6855 .name = "HY29F040A", 6856 .bustype = BUS_PARALLEL, 6857 .manufacture_id = HYUNDAI_ID, 6858 .model_id = HYUNDAI_HY29F040A, 6859 .total_size = 512, 6860 .page_size = 64 * 1024, 6861 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 6862 .tested = TEST_UNTESTED, 6863 .probe = probe_jedec, 6864 .probe_timing = TIMING_ZERO, 6865 .block_erasers = 6866 { 6867 { 6868 .eraseblocks = { {64 * 1024, 8} }, 6869 .block_erase = erase_sector_jedec, 6870 }, { 6871 .eraseblocks = { {512 * 1024, 1} }, 6872 .block_erase = erase_chip_block_jedec, 6873 }, 6874 }, 6875 .write = write_jedec_1, 6876 .read = read_memmapped, 6877 .voltage = {4500, 5500}, 6878 }, 6879 6880 { 6881 .vendor = "ISSI", 6882 .name = "IS25LP064", 6883 .bustype = BUS_SPI, 6884 .manufacture_id = ISSI_ID_SPI, 6885 .model_id = ISSI_IS25LP064, 6886 .total_size = 8192, 6887 .page_size = 256, 6888 /* OTP: 1024B total; read 0x48; write 0x42 */ 6889 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6890 .tested = TEST_UNTESTED, 6891 .probe = probe_spi_rdid, 6892 .probe_timing = TIMING_ZERO, 6893 .block_erasers = 6894 { 6895 { 6896 .eraseblocks = { {4 * 1024, 2048} }, 6897 .block_erase = spi_block_erase_20, 6898 }, { 6899 .eraseblocks = { {4 * 1024, 2048} }, 6900 .block_erase = spi_block_erase_d7, 6901 }, { 6902 .eraseblocks = { {32 * 1024, 256} }, 6903 .block_erase = spi_block_erase_52, 6904 }, { 6905 .eraseblocks = { {64 * 1024, 128} }, 6906 .block_erase = spi_block_erase_d8, 6907 }, { 6908 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6909 .block_erase = spi_block_erase_60, 6910 }, { 6911 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6912 .block_erase = spi_block_erase_c7, 6913 } 6914 }, 6915 .unlock = spi_disable_blockprotect, 6916 .write = spi_chip_write_256, 6917 .read = spi_chip_read, 6918 .voltage = {2300, 3600}, 6919 }, 6920 6921 { 6922 .vendor = "ISSI", 6923 .name = "IS25LP128", 6924 .bustype = BUS_SPI, 6925 .manufacture_id = ISSI_ID_SPI, 6926 .model_id = ISSI_IS25LP128, 6927 .total_size = 16384, 6928 .page_size = 256, 6929 /* OTP: 1024B total; read 0x48; write 0x42 */ 6930 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6931 .tested = TEST_OK_PREW, 6932 .probe = probe_spi_rdid, 6933 .probe_timing = TIMING_ZERO, 6934 .block_erasers = 6935 { 6936 { 6937 .eraseblocks = { {4 * 1024, 4096} }, 6938 .block_erase = spi_block_erase_20, 6939 }, { 6940 .eraseblocks = { {4 * 1024, 4096} }, 6941 .block_erase = spi_block_erase_d7, 6942 }, { 6943 .eraseblocks = { {32 * 1024, 512} }, 6944 .block_erase = spi_block_erase_52, 6945 }, { 6946 .eraseblocks = { {64 * 1024, 256} }, 6947 .block_erase = spi_block_erase_d8, 6948 }, { 6949 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6950 .block_erase = spi_block_erase_60, 6951 }, { 6952 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6953 .block_erase = spi_block_erase_c7, 6954 } 6955 }, 6956 .unlock = spi_disable_blockprotect, 6957 .write = spi_chip_write_256, 6958 .read = spi_chip_read, 6959 .voltage = {2300, 3600}, 6960 }, 6961 6962 { 6963 .vendor = "ISSI", 6964 .name = "IS25LP256", 6965 .bustype = BUS_SPI, 6966 .manufacture_id = ISSI_ID_SPI, 6967 .model_id = ISSI_IS25LP256, 6968 .total_size = 32768, 6969 .page_size = 256, 6970 /* supports SFDP */ 6971 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */ 6972 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 6973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7, 6974 .tested = TEST_OK_PREW, 6975 .probe = probe_spi_rdid, 6976 .probe_timing = TIMING_ZERO, 6977 .block_erasers = 6978 { 6979 { 6980 .eraseblocks = { {4 * 1024, 8192} }, 6981 .block_erase = spi_block_erase_21, 6982 }, { 6983 .eraseblocks = { {4 * 1024, 8192} }, 6984 .block_erase = spi_block_erase_20, 6985 /* could also use spi_block_erase_d7 */ 6986 }, { 6987 .eraseblocks = { {32 * 1024, 1024} }, 6988 .block_erase = spi_block_erase_5c, 6989 }, { 6990 .eraseblocks = { {32 * 1024, 1024} }, 6991 .block_erase = spi_block_erase_52, 6992 }, { 6993 .eraseblocks = { {64 * 1024, 512} }, 6994 .block_erase = spi_block_erase_dc, 6995 }, { 6996 .eraseblocks = { {64 * 1024, 512} }, 6997 .block_erase = spi_block_erase_d8, 6998 }, { 6999 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7000 .block_erase = spi_block_erase_60, 7001 }, { 7002 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7003 .block_erase = spi_block_erase_c7, 7004 } 7005 }, 7006 .unlock = spi_disable_blockprotect, 7007 .write = spi_chip_write_256, 7008 .read = spi_chip_read, 7009 .voltage = {2300, 3600}, 7010 }, 7011 7012 { 7013 .vendor = "ISSI", 7014 .name = "IS25WP032", 7015 .bustype = BUS_SPI, 7016 .manufacture_id = ISSI_ID_SPI, 7017 .model_id = ISSI_IS25WP032, 7018 .total_size = 4096, 7019 .page_size = 256, 7020 /* OTP: 1024B total; read 0x48; write 0x42 */ 7021 /* QPI enable 0x35, disable 0xF5 */ 7022 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7023 .tested = TEST_UNTESTED, 7024 .probe = probe_spi_rdid, 7025 .probe_timing = TIMING_ZERO, 7026 .block_erasers = 7027 { 7028 { 7029 .eraseblocks = { {4 * 1024, 1024} }, 7030 .block_erase = spi_block_erase_20, 7031 }, { 7032 .eraseblocks = { {4 * 1024, 1024} }, 7033 .block_erase = spi_block_erase_d7, 7034 }, { 7035 .eraseblocks = { {32 * 1024, 128} }, 7036 .block_erase = spi_block_erase_52, 7037 }, { 7038 .eraseblocks = { {64 * 1024, 64} }, 7039 .block_erase = spi_block_erase_d8, 7040 }, { 7041 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7042 .block_erase = spi_block_erase_60, 7043 }, { 7044 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7045 .block_erase = spi_block_erase_c7, 7046 } 7047 }, 7048 .unlock = spi_disable_blockprotect, 7049 .write = spi_chip_write_256, 7050 .read = spi_chip_read, 7051 .voltage = {1650, 1950}, 7052 }, 7053 7054 { 7055 .vendor = "ISSI", 7056 .name = "IS25WP064", 7057 .bustype = BUS_SPI, 7058 .manufacture_id = ISSI_ID_SPI, 7059 .model_id = ISSI_IS25WP064, 7060 .total_size = 8192, 7061 .page_size = 256, 7062 /* OTP: 1024B total; read 0x48; write 0x42 */ 7063 /* QPI enable 0x35, disable 0xF5 */ 7064 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7065 .tested = TEST_OK_PREW, 7066 .probe = probe_spi_rdid, 7067 .probe_timing = TIMING_ZERO, 7068 .block_erasers = 7069 { 7070 { 7071 .eraseblocks = { {4 * 1024, 2048} }, 7072 .block_erase = spi_block_erase_20, 7073 }, { 7074 .eraseblocks = { {4 * 1024, 2048} }, 7075 .block_erase = spi_block_erase_d7, 7076 }, { 7077 .eraseblocks = { {32 * 1024, 256} }, 7078 .block_erase = spi_block_erase_52, 7079 }, { 7080 .eraseblocks = { {64 * 1024, 128} }, 7081 .block_erase = spi_block_erase_d8, 7082 }, { 7083 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7084 .block_erase = spi_block_erase_60, 7085 }, { 7086 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7087 .block_erase = spi_block_erase_c7, 7088 } 7089 }, 7090 .unlock = spi_disable_blockprotect, 7091 .write = spi_chip_write_256, 7092 .read = spi_chip_read, 7093 .voltage = {1650, 1950}, 7094 }, 7095 7096 { 7097 .vendor = "ISSI", 7098 .name = "IS25WP128", 7099 .bustype = BUS_SPI, 7100 .manufacture_id = ISSI_ID_SPI, 7101 .model_id = ISSI_IS25WP128, 7102 .total_size = 16384, 7103 .page_size = 256, 7104 /* OTP: 1024B total; read 0x48; write 0x42 */ 7105 /* QPI enable 0x35, disable 0xF5 */ 7106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7107 .tested = TEST_OK_PREW, 7108 .probe = probe_spi_rdid, 7109 .probe_timing = TIMING_ZERO, 7110 .block_erasers = 7111 { 7112 { 7113 .eraseblocks = { {4 * 1024, 4096} }, 7114 .block_erase = spi_block_erase_20, 7115 }, { 7116 .eraseblocks = { {4 * 1024, 4096} }, 7117 .block_erase = spi_block_erase_d7, 7118 }, { 7119 .eraseblocks = { {32 * 1024, 512} }, 7120 .block_erase = spi_block_erase_52, 7121 }, { 7122 .eraseblocks = { {64 * 1024, 256} }, 7123 .block_erase = spi_block_erase_d8, 7124 }, { 7125 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7126 .block_erase = spi_block_erase_60, 7127 }, { 7128 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7129 .block_erase = spi_block_erase_c7, 7130 } 7131 }, 7132 .unlock = spi_disable_blockprotect, 7133 .write = spi_chip_write_256, 7134 .read = spi_chip_read, 7135 .voltage = {1650, 1950}, 7136 }, 7137 7138 { 7139 .vendor = "ISSI", 7140 .name = "IS25WP256", 7141 .bustype = BUS_SPI, 7142 .manufacture_id = ISSI_ID_SPI, 7143 .model_id = ISSI_IS25WP256, 7144 .total_size = 32768, 7145 .page_size = 256, 7146 /* supports SFDP */ 7147 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */ 7148 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 7149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7, 7150 .tested = TEST_OK_PREW, 7151 .probe = probe_spi_rdid, 7152 .probe_timing = TIMING_ZERO, 7153 .block_erasers = 7154 { 7155 { 7156 .eraseblocks = { {4 * 1024, 8192} }, 7157 .block_erase = spi_block_erase_21, 7158 }, { 7159 .eraseblocks = { {4 * 1024, 8192} }, 7160 .block_erase = spi_block_erase_20, 7161 /* could also use spi_block_erase_d7 */ 7162 }, { 7163 .eraseblocks = { {32 * 1024, 1024} }, 7164 .block_erase = spi_block_erase_5c, 7165 }, { 7166 .eraseblocks = { {32 * 1024, 1024} }, 7167 .block_erase = spi_block_erase_52, 7168 }, { 7169 .eraseblocks = { {64 * 1024, 512} }, 7170 .block_erase = spi_block_erase_dc, 7171 }, { 7172 .eraseblocks = { {64 * 1024, 512} }, 7173 .block_erase = spi_block_erase_d8, 7174 }, { 7175 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7176 .block_erase = spi_block_erase_60, 7177 }, { 7178 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7179 .block_erase = spi_block_erase_c7, 7180 } 7181 }, 7182 .unlock = spi_disable_blockprotect, 7183 .write = spi_chip_write_256, 7184 .read = spi_chip_read, 7185 .voltage = {1650, 1950}, 7186 }, 7187 7188 { 7189 .vendor = "ISSI", 7190 .name = "IS29GL064B", 7191 .bustype = BUS_PARALLEL, 7192 .manufacture_id = ISSI_ID, 7193 .model_id = ISSI_PMC_IS29GL064B, 7194 .total_size = 8192, 7195 .page_size = 128 * 1024, /* actual page size is 16 */ 7196 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 7197 .tested = TEST_UNTESTED, 7198 .probe = probe_jedec_29gl, 7199 .probe_timing = TIMING_ZERO, 7200 .block_erasers = 7201 { 7202 { 7203 .eraseblocks = { 7204 {8 * 1024, 8}, 7205 {64 * 1024, 127}, 7206 }, 7207 .block_erase = erase_sector_jedec, 7208 }, { 7209 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7210 .block_erase = erase_chip_block_jedec, 7211 }, 7212 }, 7213 .write = write_jedec_1, 7214 .read = read_memmapped, 7215 .voltage = {2700, 3600}, 7216 }, 7217 7218 { 7219 .vendor = "ISSI", 7220 .name = "IS29GL064H/L", 7221 .bustype = BUS_PARALLEL, 7222 .manufacture_id = ISSI_ID, 7223 .model_id = ISSI_PMC_IS29GL064HL, 7224 .total_size = 8192, 7225 .page_size = 128 * 1024, /* actual page size is 16 */ 7226 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 7227 .tested = TEST_UNTESTED, 7228 .probe = probe_jedec_29gl, 7229 .probe_timing = TIMING_ZERO, 7230 .block_erasers = 7231 { 7232 { 7233 .eraseblocks = { {64 * 1024, 128} }, 7234 .block_erase = erase_sector_jedec, 7235 }, { 7236 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7237 .block_erase = erase_chip_block_jedec, 7238 }, 7239 }, 7240 .write = write_jedec_1, 7241 .read = read_memmapped, 7242 .voltage = {2700, 3600}, 7243 }, 7244 7245 { 7246 .vendor = "ISSI", 7247 .name = "IS29GL064T", 7248 .bustype = BUS_PARALLEL, 7249 .manufacture_id = ISSI_ID, 7250 .model_id = ISSI_PMC_IS29GL064T, 7251 .total_size = 8192, 7252 .page_size = 128 * 1024, /* actual page size is 16 */ 7253 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 7254 .tested = TEST_UNTESTED, 7255 .probe = probe_jedec_29gl, 7256 .probe_timing = TIMING_ZERO, 7257 .block_erasers = 7258 { 7259 { 7260 .eraseblocks = { 7261 {64 * 1024, 127}, 7262 {8 * 1024, 8}, 7263 }, 7264 .block_erase = erase_sector_jedec, 7265 }, { 7266 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7267 .block_erase = erase_chip_block_jedec, 7268 }, 7269 }, 7270 .write = write_jedec_1, 7271 .read = read_memmapped, 7272 .voltage = {2700, 3600}, 7273 }, 7274 7275 { 7276 .vendor = "ISSI", 7277 .name = "IS29GL128H/L", 7278 .bustype = BUS_PARALLEL, 7279 .manufacture_id = ISSI_ID, 7280 .model_id = ISSI_PMC_IS29GL128HL, 7281 .total_size = 16384, 7282 .page_size = 128 * 1024, /* actual page size is 16 */ 7283 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 7284 .tested = TEST_UNTESTED, 7285 .probe = probe_jedec_29gl, 7286 .probe_timing = TIMING_ZERO, 7287 .block_erasers = 7288 { 7289 { 7290 .eraseblocks = { {128 * 1024, 128} }, 7291 .block_erase = erase_sector_jedec, 7292 }, { 7293 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7294 .block_erase = erase_chip_block_jedec, 7295 }, 7296 }, 7297 .write = write_jedec_1, 7298 .read = read_memmapped, 7299 .voltage = {2700, 3600}, 7300 }, 7301 7302 { 7303 .vendor = "Intel", 7304 .name = "25F160S33B8", 7305 .bustype = BUS_SPI, 7306 .manufacture_id = INTEL_ID, 7307 .model_id = INTEL_25F160S33B8, 7308 .total_size = 2048, 7309 .page_size = 256, 7310 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7311 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7312 .tested = TEST_UNTESTED, 7313 .probe = probe_spi_rdid, 7314 .probe_timing = TIMING_ZERO, 7315 .block_erasers = 7316 { 7317 { 7318 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7319 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7320 * have no effect on the memory contents, but sets a flag in the SR. 7321 .eraseblocks = { 7322 {8 * 1024, 8}, 7323 {64 * 1024, 31} // inaccessible 7324 }, 7325 .block_erase = spi_block_erase_40, 7326 }, { */ 7327 .eraseblocks = { {64 * 1024, 32} }, 7328 .block_erase = spi_block_erase_d8, 7329 }, { 7330 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7331 .block_erase = spi_block_erase_c7, 7332 } 7333 }, 7334 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7335 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7336 .write = spi_chip_write_256, 7337 .read = spi_chip_read, /* also fast read 0x0B */ 7338 .voltage = {2700, 3600}, 7339 }, 7340 7341 { 7342 .vendor = "Intel", 7343 .name = "25F160S33T8", 7344 .bustype = BUS_SPI, 7345 .manufacture_id = INTEL_ID, 7346 .model_id = INTEL_25F160S33T8, 7347 .total_size = 2048, 7348 .page_size = 256, 7349 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7350 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7351 .tested = TEST_UNTESTED, 7352 .probe = probe_spi_rdid, 7353 .probe_timing = TIMING_ZERO, 7354 .block_erasers = 7355 { 7356 { 7357 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7358 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7359 * have no effect on the memory contents, but sets a flag in the SR. 7360 .eraseblocks = { 7361 {64 * 1024, 31}, // inaccessible 7362 {8 * 1024, 8} 7363 }, 7364 .block_erase = spi_block_erase_40, 7365 }, { */ 7366 .eraseblocks = { {64 * 1024, 32} }, 7367 .block_erase = spi_block_erase_d8, 7368 }, { 7369 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7370 .block_erase = spi_block_erase_c7, 7371 } 7372 }, 7373 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7374 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7375 .write = spi_chip_write_256, 7376 .read = spi_chip_read, /* also fast read 0x0B */ 7377 .voltage = {2700, 3600}, 7378 }, 7379 7380 { 7381 .vendor = "Intel", 7382 .name = "25F320S33B8", 7383 .bustype = BUS_SPI, 7384 .manufacture_id = INTEL_ID, 7385 .model_id = INTEL_25F320S33B8, 7386 .total_size = 4096, 7387 .page_size = 256, 7388 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7389 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7390 .tested = TEST_UNTESTED, 7391 .probe = probe_spi_rdid, 7392 .probe_timing = TIMING_ZERO, 7393 .block_erasers = 7394 { 7395 { 7396 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7397 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7398 * have no effect on the memory contents, but sets a flag in the SR. 7399 .eraseblocks = { 7400 {8 * 1024, 8}, 7401 {64 * 1024, 63} // inaccessible 7402 }, 7403 .block_erase = spi_block_erase_40, 7404 }, { */ 7405 .eraseblocks = { {64 * 1024, 64} }, 7406 .block_erase = spi_block_erase_d8, 7407 }, { 7408 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7409 .block_erase = spi_block_erase_c7, 7410 } 7411 }, 7412 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7413 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7414 .write = spi_chip_write_256, 7415 .read = spi_chip_read, /* also fast read 0x0B */ 7416 .voltage = {2700, 3600}, 7417 }, 7418 7419 { 7420 .vendor = "Intel", 7421 .name = "25F320S33T8", 7422 .bustype = BUS_SPI, 7423 .manufacture_id = INTEL_ID, 7424 .model_id = INTEL_25F320S33T8, 7425 .total_size = 4096, 7426 .page_size = 256, 7427 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7428 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7429 .tested = TEST_UNTESTED, 7430 .probe = probe_spi_rdid, 7431 .probe_timing = TIMING_ZERO, 7432 .block_erasers = 7433 { 7434 { 7435 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7436 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7437 * have no effect on the memory contents, but sets a flag in the SR. 7438 .eraseblocks = { 7439 {64 * 1024, 63}, // inaccessible 7440 {8 * 1024, 8} 7441 }, 7442 .block_erase = spi_block_erase_40, 7443 }, { */ 7444 .eraseblocks = { {64 * 1024, 64} }, 7445 .block_erase = spi_block_erase_d8, 7446 }, { 7447 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7448 .block_erase = spi_block_erase_c7, 7449 } 7450 }, 7451 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7452 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7453 .write = spi_chip_write_256, 7454 .read = spi_chip_read, /* also fast read 0x0B */ 7455 .voltage = {2700, 3600}, 7456 }, 7457 7458 { 7459 .vendor = "Intel", 7460 .name = "25F640S33B8", 7461 .bustype = BUS_SPI, 7462 .manufacture_id = INTEL_ID, 7463 .model_id = INTEL_25F640S33B8, 7464 .total_size = 8192, 7465 .page_size = 256, 7466 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7467 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7468 .tested = TEST_UNTESTED, 7469 .probe = probe_spi_rdid, 7470 .probe_timing = TIMING_ZERO, 7471 .block_erasers = 7472 { 7473 { 7474 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7475 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7476 * have no effect on the memory contents, but sets a flag in the SR. 7477 .eraseblocks = { 7478 {8 * 1024, 8}, 7479 {64 * 1024, 127} // inaccessible 7480 }, 7481 .block_erase = spi_block_erase_40, 7482 }, { */ 7483 .eraseblocks = { {64 * 1024, 128} }, 7484 .block_erase = spi_block_erase_d8, 7485 }, { 7486 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7487 .block_erase = spi_block_erase_c7, 7488 } 7489 }, 7490 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7491 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7492 .write = spi_chip_write_256, 7493 .read = spi_chip_read, /* also fast read 0x0B */ 7494 .voltage = {2700, 3600}, 7495 }, 7496 7497 { 7498 .vendor = "Intel", 7499 .name = "25F640S33T8", 7500 .bustype = BUS_SPI, 7501 .manufacture_id = INTEL_ID, 7502 .model_id = INTEL_25F640S33T8, 7503 .total_size = 8192, 7504 .page_size = 256, 7505 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 7506 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7507 .tested = TEST_UNTESTED, 7508 .probe = probe_spi_rdid, 7509 .probe_timing = TIMING_ZERO, 7510 .block_erasers = 7511 { 7512 { 7513 /* This chip supports erasing of the 8 so-called "parameter blocks" with 7514 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 7515 * have no effect on the memory contents, but sets a flag in the SR. 7516 .eraseblocks = { 7517 {64 * 1024, 127}, // inaccessible 7518 {8 * 1024, 8} 7519 }, 7520 .block_erase = spi_block_erase_40, 7521 }, { */ 7522 .eraseblocks = { {64 * 1024, 128} }, 7523 .block_erase = spi_block_erase_d8, 7524 }, { 7525 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7526 .block_erase = spi_block_erase_c7, 7527 } 7528 }, 7529 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, 7530 .unlock = spi_disable_blockprotect_bp2_ep_srwd, 7531 .write = spi_chip_write_256, 7532 .read = spi_chip_read, /* also fast read 0x0B */ 7533 .voltage = {2700, 3600}, 7534 }, 7535 7536 { 7537 .vendor = "Intel", 7538 .name = "28F001BN/BX-B", 7539 .bustype = BUS_PARALLEL, 7540 .manufacture_id = INTEL_ID, 7541 .model_id = INTEL_28F001B, 7542 .total_size = 128, 7543 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ 7544 .tested = TEST_UNTESTED, 7545 .probe = probe_jedec, 7546 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7547 .block_erasers = 7548 { 7549 { 7550 .eraseblocks = { 7551 {8 * 1024, 1}, 7552 {4 * 1024, 2}, 7553 {112 * 1024, 1}, 7554 }, 7555 .block_erase = erase_block_82802ab, 7556 }, 7557 }, 7558 .write = write_82802ab, 7559 .read = read_memmapped, 7560 .voltage = {4500, 5500}, 7561 }, 7562 7563 { 7564 .vendor = "Intel", 7565 .name = "28F001BN/BX-T", 7566 .bustype = BUS_PARALLEL, 7567 .manufacture_id = INTEL_ID, 7568 .model_id = INTEL_28F001T, 7569 .total_size = 128, 7570 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ 7571 .tested = TEST_OK_PREW, 7572 .probe = probe_jedec, 7573 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7574 .block_erasers = 7575 { 7576 { 7577 .eraseblocks = { 7578 {112 * 1024, 1}, 7579 {4 * 1024, 2}, 7580 {8 * 1024, 1}, 7581 }, 7582 .block_erase = erase_block_82802ab, 7583 }, 7584 }, 7585 .write = write_82802ab, 7586 .read = read_memmapped, 7587 .voltage = {4500, 5500}, 7588 }, 7589 7590 { 7591 .vendor = "Intel", 7592 .name = "28F002BC/BL/BV/BX-T", 7593 .bustype = BUS_PARALLEL, 7594 .manufacture_id = INTEL_ID, 7595 .model_id = INTEL_28F002T, 7596 .total_size = 256, 7597 .page_size = 256 * 1024, 7598 .tested = TEST_OK_PRE, 7599 .probe = probe_82802ab, 7600 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7601 .block_erasers = 7602 { 7603 { 7604 .eraseblocks = { 7605 {128 * 1024, 1}, 7606 {96 * 1024, 1}, 7607 {8 * 1024, 2}, 7608 {16 * 1024, 1}, 7609 }, 7610 .block_erase = erase_block_82802ab, 7611 }, 7612 }, 7613 .write = write_82802ab, 7614 .read = read_memmapped, 7615 }, 7616 7617 { 7618 .vendor = "Intel", 7619 .name = "28F004B5/BE/BV/BX-B", 7620 .bustype = BUS_PARALLEL, 7621 .manufacture_id = INTEL_ID, 7622 .model_id = INTEL_28F004B, 7623 .total_size = 512, 7624 .page_size = 128 * 1024, /* maximal block size */ 7625 .tested = TEST_UNTESTED, 7626 .probe = probe_82802ab, 7627 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7628 .block_erasers = 7629 { 7630 { 7631 .eraseblocks = { 7632 {16 * 1024, 1}, 7633 {8 * 1024, 2}, 7634 {96 * 1024, 1}, 7635 {128 * 1024, 3}, 7636 }, 7637 .block_erase = erase_block_82802ab, 7638 }, 7639 }, 7640 .write = write_82802ab, 7641 .read = read_memmapped, 7642 }, 7643 7644 { 7645 .vendor = "Intel", 7646 .name = "28F004B5/BE/BV/BX-T", 7647 .bustype = BUS_PARALLEL, 7648 .manufacture_id = INTEL_ID, 7649 .model_id = INTEL_28F004T, 7650 .total_size = 512, 7651 .page_size = 128 * 1024, /* maximal block size */ 7652 .tested = TEST_UNTESTED, 7653 .probe = probe_82802ab, 7654 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7655 .block_erasers = 7656 { 7657 { 7658 .eraseblocks = { 7659 {128 * 1024, 3}, 7660 {96 * 1024, 1}, 7661 {8 * 1024, 2}, 7662 {16 * 1024, 1}, 7663 }, 7664 .block_erase = erase_block_82802ab, 7665 }, 7666 }, 7667 .write = write_82802ab, 7668 .read = read_memmapped, 7669 }, 7670 7671 { 7672 .vendor = "Intel", 7673 .name = "28F008S3/S5/SC", 7674 .bustype = BUS_PARALLEL, 7675 .manufacture_id = INTEL_ID, 7676 .model_id = INTEL_28F004S3, 7677 .total_size = 512, 7678 .page_size = 256, 7679 .tested = TEST_UNTESTED, 7680 .probe = probe_82802ab, 7681 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7682 .block_erasers = 7683 { 7684 { 7685 .eraseblocks = { {64 * 1024, 8} }, 7686 .block_erase = erase_block_82802ab, 7687 }, 7688 }, 7689 .unlock = unlock_28f004s5, 7690 .write = write_82802ab, 7691 .read = read_memmapped, 7692 }, 7693 7694 { 7695 .vendor = "Intel", 7696 .name = "28F400BV/BX/CE/CV-B", 7697 .bustype = BUS_PARALLEL, 7698 .manufacture_id = INTEL_ID, 7699 .model_id = INTEL_28F400B, 7700 .total_size = 512, 7701 .page_size = 128 * 1024, /* maximal block size */ 7702 .feature_bits = FEATURE_ADDR_SHIFTED, 7703 .tested = TEST_UNTESTED, 7704 .probe = probe_82802ab, 7705 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7706 .block_erasers = 7707 { 7708 { 7709 .eraseblocks = { 7710 {16 * 1024, 1}, 7711 {8 * 1024, 2}, 7712 {96 * 1024, 1}, 7713 {128 * 1024, 3}, 7714 }, 7715 .block_erase = erase_block_82802ab, 7716 }, 7717 }, 7718 .write = write_82802ab, 7719 .read = read_memmapped, 7720 }, 7721 7722 { 7723 .vendor = "Intel", 7724 .name = "28F400BV/BX/CE/CV-T", 7725 .bustype = BUS_PARALLEL, 7726 .manufacture_id = INTEL_ID, 7727 .model_id = INTEL_28F400T, 7728 .total_size = 512, 7729 .page_size = 128 * 1024, /* maximal block size */ 7730 .feature_bits = FEATURE_ADDR_SHIFTED, 7731 .tested = TEST_UNTESTED, 7732 .probe = probe_82802ab, 7733 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 7734 .block_erasers = 7735 { 7736 { 7737 .eraseblocks = { 7738 {128 * 1024, 3}, 7739 {96 * 1024, 1}, 7740 {8 * 1024, 2}, 7741 {16 * 1024, 1}, 7742 }, 7743 .block_erase = erase_block_82802ab, 7744 }, 7745 }, 7746 .write = write_82802ab, 7747 .read = read_memmapped, 7748 }, 7749 7750 { 7751 .vendor = "Intel", 7752 .name = "82802AB", 7753 .bustype = BUS_FWH, 7754 .manufacture_id = INTEL_ID, 7755 .model_id = INTEL_82802AB, 7756 .total_size = 512, 7757 .page_size = 64 * 1024, 7758 .feature_bits = FEATURE_REGISTERMAP, 7759 .tested = TEST_OK_PREW, 7760 .probe = probe_82802ab, 7761 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ 7762 .block_erasers = 7763 { 7764 { 7765 .eraseblocks = { {64 * 1024, 8} }, 7766 .block_erase = erase_block_82802ab, 7767 }, 7768 }, 7769 .unlock = unlock_regspace2_uniform_64k, 7770 .write = write_82802ab, 7771 .read = read_memmapped, 7772 .voltage = {3000, 3600}, 7773 }, 7774 7775 { 7776 .vendor = "Intel", 7777 .name = "82802AC", 7778 .bustype = BUS_FWH, 7779 .manufacture_id = INTEL_ID, 7780 .model_id = INTEL_82802AC, 7781 .total_size = 1024, 7782 .page_size = 64 * 1024, 7783 .feature_bits = FEATURE_REGISTERMAP, 7784 .tested = TEST_OK_PR, 7785 .probe = probe_82802ab, 7786 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ 7787 .block_erasers = 7788 { 7789 { 7790 .eraseblocks = { {64 * 1024, 16} }, 7791 .block_erase = erase_block_82802ab, 7792 }, 7793 }, 7794 .unlock = unlock_regspace2_uniform_64k, 7795 .write = write_82802ab, 7796 .read = read_memmapped, 7797 .voltage = {3000, 3600}, 7798 }, 7799 7800 { 7801 .vendor = "Macronix", 7802 .name = "MX23L12854", 7803 .bustype = BUS_SPI, 7804 .manufacture_id = MACRONIX_ID, 7805 .model_id = MACRONIX_MX23L12854, 7806 .total_size = 16384, 7807 .page_size = 256, 7808 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA}, 7809 .probe = probe_spi_rdid, 7810 .probe_timing = TIMING_ZERO, 7811 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */ 7812 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7813 .voltage = {3000, 3600}, 7814 }, 7815 7816 { 7817 .vendor = "Macronix", 7818 .name = "MX23L1654", 7819 .bustype = BUS_SPI, 7820 .manufacture_id = MACRONIX_ID, 7821 .model_id = MACRONIX_MX23L1654, 7822 .total_size = 2048, 7823 .page_size = 256, 7824 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA}, 7825 .probe = probe_spi_rdid, 7826 .probe_timing = TIMING_ZERO, 7827 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */ 7828 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7829 .voltage = {3000, 3600}, 7830 }, 7831 7832 { 7833 .vendor = "Macronix", 7834 .name = "MX23L3254", 7835 .bustype = BUS_SPI, 7836 .manufacture_id = MACRONIX_ID, 7837 .model_id = MACRONIX_MX23L3254, 7838 .total_size = 4096, 7839 .page_size = 256, 7840 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA}, 7841 .probe = probe_spi_rdid, 7842 .probe_timing = TIMING_ZERO, 7843 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */ 7844 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7845 .voltage = {3000, 3600}, 7846 }, 7847 7848 { 7849 .vendor = "Macronix", 7850 .name = "MX23L6454", 7851 .bustype = BUS_SPI, 7852 .manufacture_id = MACRONIX_ID, 7853 .model_id = MACRONIX_MX23L6454, 7854 .total_size = 8192, 7855 .page_size = 256, 7856 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA}, 7857 .probe = probe_spi_rdid, 7858 .probe_timing = TIMING_ZERO, 7859 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */ 7860 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7861 .voltage = {3000, 3600}, 7862 }, 7863 7864 { 7865 .vendor = "Macronix", 7866 .name = "MX25L1005(C)/MX25L1006E", 7867 .bustype = BUS_SPI, 7868 .manufacture_id = MACRONIX_ID, 7869 .model_id = MACRONIX_MX25L1005, 7870 .total_size = 128, 7871 .page_size = 256, 7872 /* MX25L1006E supports SFDP */ 7873 .feature_bits = FEATURE_WRSR_WREN, 7874 .tested = TEST_OK_PREW, 7875 .probe = probe_spi_rdid, 7876 .probe_timing = TIMING_ZERO, 7877 .block_erasers = 7878 { 7879 { 7880 .eraseblocks = { {4 * 1024, 32} }, 7881 .block_erase = spi_block_erase_20, 7882 }, { 7883 .eraseblocks = { {64 * 1024, 2} }, 7884 .block_erase = spi_block_erase_d8, 7885 }, { 7886 .eraseblocks = { {128 * 1024, 1} }, 7887 .block_erase = spi_block_erase_60, 7888 }, { 7889 .eraseblocks = { {128 * 1024, 1} }, 7890 .block_erase = spi_block_erase_c7, 7891 }, 7892 }, 7893 .printlock = spi_prettyprint_status_register_bp1_srwd, 7894 .unlock = spi_disable_blockprotect, 7895 .write = spi_chip_write_256, 7896 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */ 7897 .voltage = {2700, 3600}, 7898 }, 7899 7900 { 7901 .vendor = "Macronix", 7902 .name = "MX25L12805D", 7903 .bustype = BUS_SPI, 7904 .manufacture_id = MACRONIX_ID, 7905 .model_id = MACRONIX_MX25L12805D, 7906 .total_size = 16384, 7907 .page_size = 256, 7908 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 7909 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7910 .tested = TEST_OK_PREW, 7911 .probe = probe_spi_rdid, 7912 .probe_timing = TIMING_ZERO, 7913 .block_erasers = 7914 { 7915 { 7916 .eraseblocks = { {4 * 1024, 4096} }, 7917 .block_erase = spi_block_erase_20, 7918 }, { 7919 .eraseblocks = { {64 * 1024, 256} }, 7920 .block_erase = spi_block_erase_d8, 7921 }, { 7922 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7923 .block_erase = spi_block_erase_60, 7924 }, { 7925 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7926 .block_erase = spi_block_erase_c7, 7927 } 7928 }, 7929 .printlock = spi_prettyprint_status_register_bp3_srwd, 7930 .unlock = spi_disable_blockprotect_bp3_srwd, 7931 .write = spi_chip_write_256, 7932 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7933 .voltage = {2700, 3600}, 7934 }, 7935 7936 { 7937 .vendor = "Macronix", 7938 .name = "MX25L12835F/MX25L12845E/MX25L12865E", 7939 .bustype = BUS_SPI, 7940 .manufacture_id = MACRONIX_ID, 7941 .model_id = MACRONIX_MX25L12805D, 7942 .total_size = 16384, 7943 .page_size = 256, 7944 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 7945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7946 .tested = TEST_OK_PREW, 7947 .probe = probe_spi_rdid, 7948 .probe_timing = TIMING_ZERO, 7949 .block_erasers = 7950 { 7951 { 7952 .eraseblocks = { {4 * 1024, 4096} }, 7953 .block_erase = spi_block_erase_20, 7954 }, { 7955 .eraseblocks = { {32 * 1024, 512} }, 7956 .block_erase = spi_block_erase_52, 7957 }, { 7958 .eraseblocks = { {64 * 1024, 256} }, 7959 .block_erase = spi_block_erase_d8, 7960 }, { 7961 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7962 .block_erase = spi_block_erase_60, 7963 }, { 7964 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7965 .block_erase = spi_block_erase_c7, 7966 } 7967 }, 7968 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */ 7969 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 7970 .unlock = spi_disable_blockprotect_bp3_srwd, 7971 .write = spi_chip_write_256, 7972 .read = spi_chip_read, /* Fast read (0x0B) supported */ 7973 .voltage = {2700, 3600}, 7974 }, 7975 7976 { 7977 .vendor = "Macronix", 7978 .name = "MX25L1605", 7979 .bustype = BUS_SPI, 7980 .manufacture_id = MACRONIX_ID, 7981 .model_id = MACRONIX_MX25L1605, 7982 .total_size = 2048, 7983 .page_size = 256, 7984 .feature_bits = FEATURE_WRSR_WREN, 7985 .tested = TEST_OK_PREW, 7986 .probe = probe_spi_rdid, 7987 .probe_timing = TIMING_ZERO, 7988 .block_erasers = 7989 { 7990 { 7991 .eraseblocks = { {64 * 1024, 32} }, 7992 .block_erase = spi_block_erase_20, 7993 }, { 7994 .eraseblocks = { {64 * 1024, 32} }, 7995 .block_erase = spi_block_erase_d8, 7996 }, { 7997 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7998 .block_erase = spi_block_erase_60, 7999 }, { 8000 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8001 .block_erase = spi_block_erase_c7, 8002 }, 8003 }, 8004 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */ 8005 .unlock = spi_disable_blockprotect, 8006 .write = spi_chip_write_256, 8007 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8008 .voltage = {2700, 3600}, 8009 }, 8010 8011 { 8012 .vendor = "Macronix", 8013 .name = "MX25L1605A/MX25L1606E/MX25L1608E", 8014 .bustype = BUS_SPI, 8015 .manufacture_id = MACRONIX_ID, 8016 .model_id = MACRONIX_MX25L1605, 8017 .total_size = 2048, 8018 .page_size = 256, 8019 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */ 8020 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8021 .tested = TEST_OK_PREW, 8022 .probe = probe_spi_rdid, 8023 .probe_timing = TIMING_ZERO, 8024 .block_erasers = 8025 { 8026 { 8027 .eraseblocks = { {4 * 1024, 512} }, 8028 .block_erase = spi_block_erase_20, 8029 }, { 8030 .eraseblocks = { {64 * 1024, 32} }, 8031 .block_erase = spi_block_erase_52, 8032 }, { 8033 .eraseblocks = { {64 * 1024, 32} }, 8034 .block_erase = spi_block_erase_d8, 8035 }, { 8036 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8037 .block_erase = spi_block_erase_60, 8038 }, { 8039 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8040 .block_erase = spi_block_erase_c7, 8041 }, 8042 }, 8043 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */ 8044 .unlock = spi_disable_blockprotect_bp3_srwd, 8045 .write = spi_chip_write_256, 8046 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */ 8047 .voltage = {2700, 3600}, 8048 }, 8049 8050 { 8051 .vendor = "Macronix", 8052 .name = "MX25L1605D/MX25L1608D/MX25L1673E", 8053 .bustype = BUS_SPI, 8054 .manufacture_id = MACRONIX_ID, 8055 .model_id = MACRONIX_MX25L1605, 8056 .total_size = 2048, 8057 .page_size = 256, 8058 .feature_bits = FEATURE_WRSR_WREN, 8059 .tested = TEST_OK_PREW, 8060 .probe = probe_spi_rdid, 8061 .probe_timing = TIMING_ZERO, 8062 .block_erasers = 8063 { 8064 { 8065 .eraseblocks = { {4 * 1024, 512} }, 8066 .block_erase = spi_block_erase_20, 8067 }, { 8068 .eraseblocks = { {64 * 1024, 32} }, 8069 .block_erase = spi_block_erase_d8, 8070 }, { 8071 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8072 .block_erase = spi_block_erase_60, 8073 }, { 8074 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8075 .block_erase = spi_block_erase_c7, 8076 }, 8077 }, 8078 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */ 8079 .unlock = spi_disable_blockprotect_bp3_srwd, 8080 .write = spi_chip_write_256, 8081 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 8082 .voltage = {2700, 3600}, 8083 }, 8084 8085 { 8086 .vendor = "Macronix", 8087 .name = "MX25L1635D", 8088 .bustype = BUS_SPI, 8089 .manufacture_id = MACRONIX_ID, 8090 .model_id = MACRONIX_MX25L1635D, 8091 .total_size = 2048, 8092 .page_size = 256, 8093 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8094 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8095 .tested = TEST_UNTESTED, 8096 .probe = probe_spi_rdid, 8097 .probe_timing = TIMING_ZERO, 8098 .block_erasers = 8099 { 8100 { 8101 .eraseblocks = { {4 * 1024, 512} }, 8102 .block_erase = spi_block_erase_20, 8103 }, { 8104 .eraseblocks = { {64 * 1024, 32} }, 8105 .block_erase = spi_block_erase_d8, 8106 }, { 8107 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8108 .block_erase = spi_block_erase_60, 8109 }, { 8110 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8111 .block_erase = spi_block_erase_c7, 8112 } 8113 }, 8114 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8115 .unlock = spi_disable_blockprotect_bp3_srwd, 8116 .write = spi_chip_write_256, 8117 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8118 .voltage = {2700, 3600}, 8119 }, 8120 8121 { 8122 .vendor = "Macronix", 8123 .name = "MX25L1635E", 8124 .bustype = BUS_SPI, 8125 .manufacture_id = MACRONIX_ID, 8126 .model_id = MACRONIX_MX25L1635E, 8127 .total_size = 2048, 8128 .page_size = 256, 8129 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8130 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8131 .tested = TEST_UNTESTED, 8132 .probe = probe_spi_rdid, 8133 .probe_timing = TIMING_ZERO, 8134 .block_erasers = 8135 { 8136 { 8137 .eraseblocks = { {4 * 1024, 512} }, 8138 .block_erase = spi_block_erase_20, 8139 }, { 8140 .eraseblocks = { {64 * 1024, 32} }, 8141 .block_erase = spi_block_erase_d8, 8142 }, { 8143 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8144 .block_erase = spi_block_erase_60, 8145 }, { 8146 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8147 .block_erase = spi_block_erase_c7, 8148 } 8149 }, 8150 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8151 .unlock = spi_disable_blockprotect_bp3_srwd, 8152 .write = spi_chip_write_256, 8153 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8154 .voltage = {2700, 3600}, 8155 }, 8156 8157 { 8158 .vendor = "Macronix", 8159 .name = "MX25L2005(C)/MX25L2006E", 8160 .bustype = BUS_SPI, 8161 .manufacture_id = MACRONIX_ID, 8162 .model_id = MACRONIX_MX25L2005, 8163 .total_size = 256, 8164 .page_size = 256, 8165 .feature_bits = FEATURE_WRSR_WREN, 8166 .tested = TEST_OK_PREW, 8167 .probe = probe_spi_rdid, 8168 .probe_timing = TIMING_ZERO, 8169 .block_erasers = 8170 { 8171 { 8172 .eraseblocks = { {4 * 1024, 64} }, 8173 .block_erase = spi_block_erase_20, 8174 }, { 8175 .eraseblocks = { {64 * 1024, 4} }, 8176 .block_erase = spi_block_erase_52, 8177 }, { 8178 .eraseblocks = { {64 * 1024, 4} }, 8179 .block_erase = spi_block_erase_d8, 8180 }, { 8181 .eraseblocks = { {256 * 1024, 1} }, 8182 .block_erase = spi_block_erase_60, 8183 }, { 8184 .eraseblocks = { {256 * 1024, 1} }, 8185 .block_erase = spi_block_erase_c7, 8186 }, 8187 }, 8188 .printlock = spi_prettyprint_status_register_bp1_srwd, 8189 .unlock = spi_disable_blockprotect, 8190 .write = spi_chip_write_256, 8191 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8192 .voltage = {2700, 3600}, 8193 }, 8194 8195 { 8196 .vendor = "Macronix", 8197 .name = "MX25L25635F/MX25L25645G", 8198 .bustype = BUS_SPI, 8199 .manufacture_id = MACRONIX_ID, 8200 .model_id = MACRONIX_MX25L25635F, 8201 .total_size = 32768, 8202 .page_size = 256, 8203 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 8205 .tested = TEST_OK_PREW, 8206 .probe = probe_spi_rdid, 8207 .probe_timing = TIMING_ZERO, 8208 .block_erasers = 8209 { 8210 { 8211 .eraseblocks = { {4 * 1024, 8192} }, 8212 .block_erase = spi_block_erase_21, 8213 }, { 8214 .eraseblocks = { {4 * 1024, 8192} }, 8215 .block_erase = spi_block_erase_20, 8216 }, { 8217 .eraseblocks = { {32 * 1024, 1024} }, 8218 .block_erase = spi_block_erase_5c, 8219 }, { 8220 .eraseblocks = { {32 * 1024, 1024} }, 8221 .block_erase = spi_block_erase_52, 8222 }, { 8223 .eraseblocks = { {64 * 1024, 512} }, 8224 .block_erase = spi_block_erase_dc, 8225 }, { 8226 .eraseblocks = { {64 * 1024, 512} }, 8227 .block_erase = spi_block_erase_d8, 8228 }, { 8229 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8230 .block_erase = spi_block_erase_60, 8231 }, { 8232 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8233 .block_erase = spi_block_erase_c7, 8234 } 8235 }, 8236 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */ 8237 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8238 .unlock = spi_disable_blockprotect_bp3_srwd, 8239 .write = spi_chip_write_256, 8240 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8241 .voltage = {2700, 3600}, 8242 }, 8243 8244 { 8245 .vendor = "Macronix", 8246 .name = "MX25L3205(A)", 8247 .bustype = BUS_SPI, 8248 .manufacture_id = MACRONIX_ID, 8249 .model_id = MACRONIX_MX25L3205, 8250 .total_size = 4096, 8251 .page_size = 256, 8252 .feature_bits = FEATURE_WRSR_WREN, 8253 .tested = TEST_OK_PREW, 8254 .probe = probe_spi_rdid, 8255 .probe_timing = TIMING_ZERO, 8256 .block_erasers = 8257 { 8258 { 8259 .eraseblocks = { {64 * 1024, 64} }, 8260 .block_erase = spi_block_erase_20, 8261 }, { 8262 .eraseblocks = { {64 * 1024, 64} }, 8263 .block_erase = spi_block_erase_d8, 8264 }, { 8265 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8266 .block_erase = spi_block_erase_60, 8267 }, { 8268 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8269 .block_erase = spi_block_erase_c7, 8270 }, 8271 }, 8272 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */ 8273 .unlock = spi_disable_blockprotect, 8274 .write = spi_chip_write_256, 8275 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8276 .voltage = {2700, 3600}, 8277 }, 8278 8279 { 8280 .vendor = "Macronix", 8281 .name = "MX25L3205D/MX25L3208D", 8282 .bustype = BUS_SPI, 8283 .manufacture_id = MACRONIX_ID, 8284 .model_id = MACRONIX_MX25L3205, 8285 .total_size = 4096, 8286 .page_size = 256, 8287 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8288 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8289 .tested = TEST_OK_PREW, 8290 .probe = probe_spi_rdid, 8291 .probe_timing = TIMING_ZERO, 8292 .block_erasers = 8293 { 8294 { 8295 .eraseblocks = { {4 * 1024, 1024} }, 8296 .block_erase = spi_block_erase_20, 8297 }, { 8298 .eraseblocks = { {64 * 1024, 64} }, 8299 .block_erase = spi_block_erase_d8, 8300 }, { 8301 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8302 .block_erase = spi_block_erase_60, 8303 }, { 8304 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8305 .block_erase = spi_block_erase_c7, 8306 }, 8307 }, 8308 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */ 8309 .unlock = spi_disable_blockprotect_bp3_srwd, 8310 .write = spi_chip_write_256, 8311 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */ 8312 .voltage = {2700, 3600}, 8313 }, 8314 8315 { 8316 .vendor = "Macronix", 8317 .name = "MX25L3206E/MX25L3208E", 8318 .bustype = BUS_SPI, 8319 .manufacture_id = MACRONIX_ID, 8320 .model_id = MACRONIX_MX25L3205, 8321 .total_size = 4096, 8322 .page_size = 256, 8323 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8324 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8325 .tested = TEST_OK_PREW, 8326 .probe = probe_spi_rdid, 8327 .probe_timing = TIMING_ZERO, 8328 .block_erasers = 8329 { 8330 { 8331 .eraseblocks = { {4 * 1024, 1024} }, 8332 .block_erase = spi_block_erase_20, 8333 }, { 8334 .eraseblocks = { {64 * 1024, 64} }, 8335 .block_erase = spi_block_erase_d8, 8336 }, { 8337 .eraseblocks = { {64 * 1024, 64} }, 8338 .block_erase = spi_block_erase_52, 8339 }, { 8340 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8341 .block_erase = spi_block_erase_60, 8342 }, { 8343 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8344 .block_erase = spi_block_erase_c7, 8345 }, 8346 }, 8347 .printlock = spi_prettyprint_status_register_bp3_srwd, 8348 .unlock = spi_disable_blockprotect_bp3_srwd, 8349 .write = spi_chip_write_256, 8350 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */ 8351 .voltage = {2700, 3600}, 8352 }, 8353 8354 { 8355 .vendor = "Macronix", 8356 .name = "MX25L3235D", 8357 .bustype = BUS_SPI, 8358 .manufacture_id = MACRONIX_ID, 8359 .model_id = MACRONIX_MX25L3235D, 8360 .total_size = 4096, 8361 .page_size = 256, 8362 /* OTP: 256B total; enter 0xB1, exit 0xC1 */ 8363 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8364 .tested = TEST_UNTESTED, 8365 .probe = probe_spi_rdid, 8366 .probe_timing = TIMING_ZERO, 8367 .block_erasers = 8368 { 8369 { 8370 .eraseblocks = { {4 * 1024, 1024} }, 8371 .block_erase = spi_block_erase_20, 8372 }, { 8373 .eraseblocks = { {64 * 1024, 64} }, 8374 .block_erase = spi_block_erase_d8, 8375 }, { 8376 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8377 .block_erase = spi_block_erase_60, 8378 }, { 8379 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8380 .block_erase = spi_block_erase_c7, 8381 } 8382 }, 8383 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8384 .unlock = spi_disable_blockprotect_bp3_srwd, 8385 .write = spi_chip_write_256, 8386 .read = spi_chip_read, 8387 .voltage = {2700, 3600}, 8388 }, 8389 8390 { 8391 .vendor = "Macronix", 8392 .name = "MX25L3273E", 8393 .bustype = BUS_SPI, 8394 .manufacture_id = MACRONIX_ID, 8395 .model_id = MACRONIX_MX25L3205, 8396 .total_size = 4096, 8397 .page_size = 256, 8398 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8399 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8400 .tested = TEST_OK_PREW, 8401 .probe = probe_spi_rdid, 8402 .probe_timing = TIMING_ZERO, 8403 .block_erasers = 8404 { 8405 { 8406 .eraseblocks = { {4 * 1024, 1024} }, 8407 .block_erase = spi_block_erase_20, 8408 }, { 8409 .eraseblocks = { {32 * 1024, 128} }, 8410 .block_erase = spi_block_erase_52, 8411 }, { 8412 .eraseblocks = { {64 * 1024, 64} }, 8413 .block_erase = spi_block_erase_d8, 8414 }, { 8415 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8416 .block_erase = spi_block_erase_60, 8417 }, { 8418 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8419 .block_erase = spi_block_erase_c7, 8420 }, 8421 }, 8422 .printlock = spi_prettyprint_status_register_bp3_srwd, 8423 .unlock = spi_disable_blockprotect_bp3_srwd, 8424 .write = spi_chip_write_256, 8425 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */ 8426 .voltage = {2700, 3600}, 8427 }, 8428 8429 { 8430 .vendor = "Macronix", 8431 .name = "MX25L4005(A/C)/MX25L4006E", 8432 .bustype = BUS_SPI, 8433 .manufacture_id = MACRONIX_ID, 8434 .model_id = MACRONIX_MX25L4005, 8435 .total_size = 512, 8436 .page_size = 256, 8437 .feature_bits = FEATURE_WRSR_WREN, 8438 .tested = TEST_OK_PREW, 8439 .probe = probe_spi_rdid, 8440 .probe_timing = TIMING_ZERO, 8441 .block_erasers = 8442 { 8443 { 8444 .eraseblocks = { {4 * 1024, 128} }, 8445 .block_erase = spi_block_erase_20, 8446 }, { 8447 .eraseblocks = { {64 * 1024, 8} }, 8448 .block_erase = spi_block_erase_52, 8449 }, { 8450 .eraseblocks = { {64 * 1024, 8} }, 8451 .block_erase = spi_block_erase_d8, 8452 }, { 8453 .eraseblocks = { {512 * 1024, 1} }, 8454 .block_erase = spi_block_erase_60, 8455 }, { 8456 .eraseblocks = { {512 * 1024, 1} }, 8457 .block_erase = spi_block_erase_c7, 8458 }, 8459 }, 8460 .printlock = spi_prettyprint_status_register_bp2_srwd, 8461 .unlock = spi_disable_blockprotect, 8462 .write = spi_chip_write_256, 8463 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8464 .voltage = {2700, 3600}, 8465 }, 8466 8467 { 8468 .vendor = "Macronix", 8469 .name = "MX25L512(E)/MX25V512(C)", 8470 .bustype = BUS_SPI, 8471 .manufacture_id = MACRONIX_ID, 8472 .model_id = MACRONIX_MX25L512, 8473 .total_size = 64, 8474 .page_size = 256, 8475 /* MX25L512E supports SFDP */ 8476 .feature_bits = FEATURE_WRSR_WREN, 8477 .tested = TEST_OK_PREW, 8478 .probe = probe_spi_rdid, 8479 .probe_timing = TIMING_ZERO, 8480 .block_erasers = 8481 { 8482 { 8483 .eraseblocks = { {4 * 1024, 16} }, 8484 .block_erase = spi_block_erase_20, 8485 }, { 8486 .eraseblocks = { {64 * 1024, 1} }, 8487 .block_erase = spi_block_erase_52, 8488 }, { 8489 .eraseblocks = { {64 * 1024, 1} }, 8490 .block_erase = spi_block_erase_d8, 8491 }, { 8492 .eraseblocks = { {64 * 1024, 1} }, 8493 .block_erase = spi_block_erase_60, 8494 }, { 8495 .eraseblocks = { {64 * 1024, 1} }, 8496 .block_erase = spi_block_erase_c7, 8497 }, 8498 }, 8499 .printlock = spi_prettyprint_status_register_bp1_srwd, 8500 .unlock = spi_disable_blockprotect, 8501 .write = spi_chip_write_256, 8502 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */ 8503 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */ 8504 }, 8505 8506 { 8507 .vendor = "Macronix", 8508 .name = "MX25L6405", 8509 .bustype = BUS_SPI, 8510 .manufacture_id = MACRONIX_ID, 8511 .model_id = MACRONIX_MX25L6405, 8512 .total_size = 8192, 8513 .page_size = 256, 8514 /* Has an additional 512B EEPROM sector */ 8515 .feature_bits = FEATURE_WRSR_WREN, 8516 .tested = TEST_OK_PREW, 8517 .probe = probe_spi_rdid, 8518 .probe_timing = TIMING_ZERO, 8519 .block_erasers = 8520 { 8521 { 8522 .eraseblocks = { {64 * 1024, 128} }, 8523 .block_erase = spi_block_erase_20, 8524 }, { 8525 .eraseblocks = { {64 * 1024, 128} }, 8526 .block_erase = spi_block_erase_d8, 8527 }, { 8528 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8529 .block_erase = spi_block_erase_60, 8530 }, { 8531 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8532 .block_erase = spi_block_erase_c7, 8533 } 8534 }, 8535 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */ 8536 .unlock = spi_disable_blockprotect_bp3_srwd, 8537 .write = spi_chip_write_256, 8538 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8539 .voltage = {2700, 3600}, 8540 }, 8541 8542 { 8543 .vendor = "Macronix", 8544 .name = "MX25L6405D", 8545 .bustype = BUS_SPI, 8546 .manufacture_id = MACRONIX_ID, 8547 .model_id = MACRONIX_MX25L6405, 8548 .total_size = 8192, 8549 .page_size = 256, 8550 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 8551 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8552 .tested = TEST_OK_PREW, 8553 .probe = probe_spi_rdid, 8554 .probe_timing = TIMING_ZERO, 8555 .block_erasers = 8556 { 8557 { 8558 .eraseblocks = { {4 * 1024, 2048} }, 8559 .block_erase = spi_block_erase_20, 8560 }, { 8561 .eraseblocks = { {64 * 1024, 128} }, 8562 .block_erase = spi_block_erase_d8, 8563 }, { 8564 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8565 .block_erase = spi_block_erase_60, 8566 }, { 8567 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8568 .block_erase = spi_block_erase_c7, 8569 } 8570 }, 8571 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */ 8572 .unlock = spi_disable_blockprotect_bp3_srwd, 8573 .write = spi_chip_write_256, 8574 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */ 8575 .voltage = {2700, 3600}, 8576 }, 8577 8578 { 8579 .vendor = "Macronix", 8580 .name = "MX25L6406E/MX25L6408E", 8581 .bustype = BUS_SPI, 8582 .manufacture_id = MACRONIX_ID, 8583 .model_id = MACRONIX_MX25L6405, 8584 .total_size = 8192, 8585 .page_size = 256, 8586 /* MX25L6406E supports SFDP */ 8587 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */ 8588 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8589 .tested = TEST_OK_PREW, 8590 .probe = probe_spi_rdid, 8591 .probe_timing = TIMING_ZERO, 8592 .block_erasers = 8593 { 8594 { 8595 .eraseblocks = { {4 * 1024, 2048} }, 8596 .block_erase = spi_block_erase_20, 8597 }, { 8598 .eraseblocks = { {64 * 1024, 128} }, 8599 .block_erase = spi_block_erase_52, 8600 }, { 8601 .eraseblocks = { {64 * 1024, 128} }, 8602 .block_erase = spi_block_erase_d8, 8603 }, { 8604 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8605 .block_erase = spi_block_erase_60, 8606 }, { 8607 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8608 .block_erase = spi_block_erase_c7, 8609 } 8610 }, 8611 .printlock = spi_prettyprint_status_register_bp3_srwd, 8612 .unlock = spi_disable_blockprotect_bp3_srwd, 8613 .write = spi_chip_write_256, 8614 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */ 8615 .voltage = {2700, 3600}, 8616 }, 8617 8618 { 8619 .vendor = "Macronix", 8620 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F", 8621 .bustype = BUS_SPI, 8622 .manufacture_id = MACRONIX_ID, 8623 .model_id = MACRONIX_MX25L6405, 8624 .total_size = 8192, 8625 .page_size = 256, 8626 /* supports SFDP */ 8627 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8628 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8629 .tested = TEST_OK_PREW, 8630 .probe = probe_spi_rdid, 8631 .probe_timing = TIMING_ZERO, 8632 .block_erasers = 8633 { 8634 { 8635 .eraseblocks = { {4 * 1024, 2048} }, 8636 .block_erase = spi_block_erase_20, 8637 }, { 8638 .eraseblocks = { {32 * 1024, 256} }, 8639 .block_erase = spi_block_erase_52, 8640 }, { 8641 .eraseblocks = { {64 * 1024, 128} }, 8642 .block_erase = spi_block_erase_d8, 8643 }, { 8644 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8645 .block_erase = spi_block_erase_60, 8646 }, { 8647 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8648 .block_erase = spi_block_erase_c7, 8649 } 8650 }, 8651 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8652 .unlock = spi_disable_blockprotect_bp3_srwd, 8653 .write = spi_chip_write_256, 8654 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8655 .voltage = {2700, 3600}, 8656 }, 8657 8658 { 8659 .vendor = "Macronix", 8660 .name = "MX25L6495F", 8661 .bustype = BUS_SPI, 8662 .manufacture_id = MACRONIX_ID, 8663 .model_id = MACRONIX_MX25L6495F, 8664 .total_size = 8192, 8665 .page_size = 256, 8666 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 8667 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8668 .tested = TEST_OK_PREW, 8669 .probe = probe_spi_rdid, 8670 .probe_timing = TIMING_ZERO, 8671 .block_erasers = 8672 { 8673 { 8674 .eraseblocks = { {4 * 1024, 2048} }, 8675 .block_erase = spi_block_erase_20, 8676 }, { 8677 .eraseblocks = { {64 * 1024, 128} }, 8678 .block_erase = spi_block_erase_d8, 8679 }, { 8680 .eraseblocks = { {32 * 1024, 256} }, 8681 .block_erase = spi_block_erase_52, 8682 }, { 8683 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8684 .block_erase = spi_block_erase_60, 8685 }, { 8686 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8687 .block_erase = spi_block_erase_c7, 8688 } 8689 }, 8690 .unlock = spi_disable_blockprotect, 8691 .write = spi_chip_write_256, 8692 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8693 .voltage = {2700, 3600}, 8694 }, 8695 8696 { 8697 .vendor = "Macronix", 8698 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005", 8699 .bustype = BUS_SPI, 8700 .manufacture_id = MACRONIX_ID, 8701 .model_id = MACRONIX_MX25L8005, 8702 .total_size = 1024, 8703 .page_size = 256, 8704 /* MX25L8006E, MX25L8008E support SFDP */ 8705 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */ 8706 .feature_bits = FEATURE_WRSR_WREN, 8707 .tested = TEST_OK_PREW, 8708 .probe = probe_spi_rdid, 8709 .probe_timing = TIMING_ZERO, 8710 .block_erasers = 8711 { 8712 { 8713 .eraseblocks = { {4 * 1024, 256} }, 8714 .block_erase = spi_block_erase_20, 8715 }, { 8716 .eraseblocks = { {64 * 1024, 16} }, 8717 .block_erase = spi_block_erase_52, 8718 }, { 8719 .eraseblocks = { {64 * 1024, 16} }, 8720 .block_erase = spi_block_erase_d8, 8721 }, { 8722 .eraseblocks = { {1024 * 1024, 1} }, 8723 .block_erase = spi_block_erase_60, 8724 }, { 8725 .eraseblocks = { {1024 * 1024, 1} }, 8726 .block_erase = spi_block_erase_c7, 8727 }, 8728 }, 8729 .printlock = spi_prettyprint_status_register_bp2_srwd, 8730 .unlock = spi_disable_blockprotect, 8731 .write = spi_chip_write_256, 8732 .read = spi_chip_read, /* Fast read (0x0B) supported */ 8733 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */ 8734 }, 8735 8736 { 8737 .vendor = "Macronix", 8738 .name = "MX25R6435F", 8739 .bustype = BUS_SPI, 8740 .manufacture_id = MACRONIX_ID, 8741 .model_id = MACRONIX_MX25R6435F, 8742 .total_size = 8192, 8743 .page_size = 256, 8744 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 8745 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8746 .tested = TEST_OK_PREW, 8747 .probe = probe_spi_rdid, 8748 .probe_timing = TIMING_ZERO, 8749 .block_erasers = 8750 { 8751 { 8752 .eraseblocks = { {4 * 1024, 2048} }, 8753 .block_erase = spi_block_erase_20, 8754 }, { 8755 .eraseblocks = { {64 * 1024, 128} }, 8756 .block_erase = spi_block_erase_d8, 8757 }, { 8758 .eraseblocks = { {32 * 1024, 256} }, 8759 .block_erase = spi_block_erase_52, 8760 }, { 8761 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8762 .block_erase = spi_block_erase_60, 8763 }, { 8764 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8765 .block_erase = spi_block_erase_c7, 8766 } 8767 }, 8768 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8769 .unlock = spi_disable_blockprotect_bp3_srwd, 8770 .write = spi_chip_write_256, 8771 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8772 .voltage = {1650, 3600}, 8773 }, 8774 8775 { 8776 .vendor = "Macronix", 8777 .name = "MX25U12835F", 8778 .bustype = BUS_SPI, 8779 .manufacture_id = MACRONIX_ID, 8780 .model_id = MACRONIX_MX25U12835E, 8781 .total_size = 16384, 8782 .page_size = 256, 8783 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8784 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8785 .tested = TEST_OK_PREW, 8786 .probe = probe_spi_rdid, 8787 .probe_timing = TIMING_ZERO, 8788 .block_erasers = 8789 { 8790 { 8791 .eraseblocks = { {4 * 1024, 4096} }, 8792 .block_erase = spi_block_erase_20, 8793 }, { 8794 .eraseblocks = { {32 * 1024, 512} }, 8795 .block_erase = spi_block_erase_52, 8796 }, { 8797 .eraseblocks = { {64 * 1024, 256} }, 8798 .block_erase = spi_block_erase_d8, 8799 }, { 8800 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8801 .block_erase = spi_block_erase_60, 8802 }, { 8803 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8804 .block_erase = spi_block_erase_c7, 8805 } 8806 }, 8807 /* TODO: security register */ 8808 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8809 .unlock = spi_disable_blockprotect_bp3_srwd, 8810 .write = spi_chip_write_256, /* Multi I/O supported */ 8811 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8812 .voltage = {1650, 2000}, 8813 }, 8814 8815 { 8816 .vendor = "Macronix", 8817 .name = "MX25U1635E", 8818 .bustype = BUS_SPI, 8819 .manufacture_id = MACRONIX_ID, 8820 .model_id = MACRONIX_MX25U1635E, 8821 .total_size = 2048, 8822 .page_size = 256, 8823 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8824 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 8825 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8826 .tested = TEST_OK_PR, 8827 .probe = probe_spi_rdid, 8828 .probe_timing = TIMING_ZERO, 8829 .block_erasers = 8830 { 8831 { 8832 .eraseblocks = { {4 * 1024, 512} }, 8833 .block_erase = spi_block_erase_20, 8834 }, { 8835 .eraseblocks = { {32 * 1024, 64} }, 8836 .block_erase = spi_block_erase_52, 8837 }, { 8838 .eraseblocks = { {64 * 1024, 32} }, 8839 .block_erase = spi_block_erase_d8, 8840 }, { 8841 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8842 .block_erase = spi_block_erase_60, 8843 }, { 8844 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8845 .block_erase = spi_block_erase_c7, 8846 } 8847 }, 8848 /* TODO: security register */ 8849 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8850 .unlock = spi_disable_blockprotect_bp3_srwd, 8851 .write = spi_chip_write_256, 8852 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8853 .voltage = {1650, 2000}, 8854 }, 8855 8856 { 8857 .vendor = "Macronix", 8858 .name = "MX25U25635F", 8859 .bustype = BUS_SPI, 8860 .manufacture_id = MACRONIX_ID, 8861 .model_id = MACRONIX_MX25U25635F, 8862 .total_size = 32768, 8863 .page_size = 256, 8864 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8865 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 8866 .tested = TEST_OK_PR, 8867 .probe = probe_spi_rdid, 8868 .probe_timing = TIMING_ZERO, 8869 .block_erasers = 8870 { 8871 { 8872 .eraseblocks = { {4 * 1024, 8192} }, 8873 .block_erase = spi_block_erase_21, 8874 }, { 8875 .eraseblocks = { {4 * 1024, 8192} }, 8876 .block_erase = spi_block_erase_20, 8877 }, { 8878 .eraseblocks = { {32 * 1024, 1024} }, 8879 .block_erase = spi_block_erase_5c, 8880 }, { 8881 .eraseblocks = { {32 * 1024, 1024} }, 8882 .block_erase = spi_block_erase_52, 8883 }, { 8884 .eraseblocks = { {64 * 1024, 512} }, 8885 .block_erase = spi_block_erase_dc, 8886 }, { 8887 .eraseblocks = { {64 * 1024, 512} }, 8888 .block_erase = spi_block_erase_d8, 8889 }, { 8890 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8891 .block_erase = spi_block_erase_60, 8892 }, { 8893 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8894 .block_erase = spi_block_erase_c7, 8895 } 8896 }, 8897 /* TODO: security register */ 8898 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8899 .unlock = spi_disable_blockprotect_bp3_srwd, 8900 .write = spi_chip_write_256, /* Multi I/O supported */ 8901 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8902 .voltage = {1650, 2000}, 8903 }, 8904 8905 { 8906 .vendor = "Macronix", 8907 .name = "MX25U3235E/F", 8908 .bustype = BUS_SPI, 8909 .manufacture_id = MACRONIX_ID, 8910 .model_id = MACRONIX_MX25U3235E, 8911 .total_size = 4096, 8912 .page_size = 256, 8913 /* F model supports SFDP */ 8914 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 8915 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 8916 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8917 .tested = TEST_OK_PREW, 8918 .probe = probe_spi_rdid, 8919 .probe_timing = TIMING_ZERO, 8920 .block_erasers = 8921 { 8922 { 8923 .eraseblocks = { {4 * 1024, 1024} }, 8924 .block_erase = spi_block_erase_20, 8925 }, { 8926 .eraseblocks = { {32 * 1024, 128} }, 8927 .block_erase = spi_block_erase_52, 8928 }, { 8929 .eraseblocks = { {64 * 1024, 64} }, 8930 .block_erase = spi_block_erase_d8, 8931 }, { 8932 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8933 .block_erase = spi_block_erase_60, 8934 }, { 8935 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8936 .block_erase = spi_block_erase_c7, 8937 } 8938 }, 8939 /* TODO: security register */ 8940 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8941 .unlock = spi_disable_blockprotect_bp3_srwd, 8942 .write = spi_chip_write_256, 8943 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8944 .voltage = {1650, 2000}, 8945 }, 8946 8947 { 8948 .vendor = "Macronix", 8949 .name = "MX25U51245G", 8950 .bustype = BUS_SPI, 8951 .manufacture_id = MACRONIX_ID, 8952 .model_id = MACRONIX_MX25U51245G, 8953 .total_size = 65536, 8954 .page_size = 256, 8955 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */ 8956 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 8957 .tested = TEST_OK_PREW, 8958 .probe = probe_spi_rdid, 8959 .probe_timing = TIMING_ZERO, 8960 .block_erasers = 8961 { 8962 { 8963 .eraseblocks = { {4 * 1024, 16384} }, 8964 .block_erase = spi_block_erase_21, 8965 }, { 8966 .eraseblocks = { {4 * 1024, 16384} }, 8967 .block_erase = spi_block_erase_20, 8968 }, { 8969 .eraseblocks = { {32 * 1024, 2048} }, 8970 .block_erase = spi_block_erase_5c, 8971 }, { 8972 .eraseblocks = { {32 * 1024, 2048} }, 8973 .block_erase = spi_block_erase_52, 8974 }, { 8975 .eraseblocks = { {64 * 1024, 1024} }, 8976 .block_erase = spi_block_erase_dc, 8977 }, { 8978 .eraseblocks = { {64 * 1024, 1024} }, 8979 .block_erase = spi_block_erase_d8, 8980 }, { 8981 .eraseblocks = { {64 * 1024 * 1024, 1} }, 8982 .block_erase = spi_block_erase_60, 8983 }, { 8984 .eraseblocks = { {64 * 1024 * 1024, 1} }, 8985 .block_erase = spi_block_erase_c7, 8986 } 8987 }, 8988 /* TODO: security register */ 8989 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 8990 .unlock = spi_disable_blockprotect_bp3_srwd, 8991 .write = spi_chip_write_256, /* Multi I/O supported */ 8992 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 8993 .voltage = {1650, 2000}, 8994 }, 8995 8996 { 8997 .vendor = "Macronix", 8998 .name = "MX25U6435E/F", 8999 .bustype = BUS_SPI, 9000 .manufacture_id = MACRONIX_ID, 9001 .model_id = MACRONIX_MX25U6435E, 9002 .total_size = 8192, 9003 .page_size = 256, 9004 /* F model supports SFDP */ 9005 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 9006 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 9007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 9008 .tested = TEST_OK_PREW, 9009 .probe = probe_spi_rdid, 9010 .probe_timing = TIMING_ZERO, 9011 .block_erasers = 9012 { 9013 { 9014 .eraseblocks = { {4 * 1024, 2048} }, 9015 .block_erase = spi_block_erase_20, 9016 }, { 9017 .eraseblocks = { {32 * 1024, 256} }, 9018 .block_erase = spi_block_erase_52, 9019 }, { 9020 .eraseblocks = { {64 * 1024, 128} }, 9021 .block_erase = spi_block_erase_d8, 9022 }, { 9023 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9024 .block_erase = spi_block_erase_60, 9025 }, { 9026 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9027 .block_erase = spi_block_erase_c7, 9028 } 9029 }, 9030 /* TODO: security register */ 9031 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 9032 .unlock = spi_disable_blockprotect_bp3_srwd, 9033 .write = spi_chip_write_256, 9034 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 9035 .voltage = {1650, 2000}, 9036 }, 9037 9038 { 9039 .vendor = "Macronix", 9040 .name = "MX25U8032E", 9041 .bustype = BUS_SPI, 9042 .manufacture_id = MACRONIX_ID, 9043 .model_id = MACRONIX_MX25U8032E, 9044 .total_size = 1024, 9045 .page_size = 256, 9046 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 9047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9048 .tested = TEST_OK_PREW, 9049 .probe = probe_spi_rdid, 9050 .probe_timing = TIMING_ZERO, 9051 .block_erasers = 9052 { 9053 { 9054 .eraseblocks = { {4 * 1024, 256} }, 9055 .block_erase = spi_block_erase_20, 9056 }, { 9057 .eraseblocks = { {32 * 1024, 32} }, 9058 .block_erase = spi_block_erase_52, 9059 }, { 9060 .eraseblocks = { {64 * 1024, 16} }, 9061 .block_erase = spi_block_erase_d8, 9062 }, { 9063 .eraseblocks = { {1024 * 1024, 1} }, 9064 .block_erase = spi_block_erase_60, 9065 }, { 9066 .eraseblocks = { {1024 * 1024, 1} }, 9067 .block_erase = spi_block_erase_c7, 9068 } 9069 }, 9070 /* TODO: security register */ 9071 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 9072 .unlock = spi_disable_blockprotect_bp3_srwd, 9073 .write = spi_chip_write_256, 9074 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 9075 .voltage = {1650, 2000}, 9076 }, 9077 9078 { 9079 .vendor = "Macronix", 9080 .name = "MX29F001B", 9081 .bustype = BUS_PARALLEL, 9082 .manufacture_id = MACRONIX_ID, 9083 .model_id = MACRONIX_MX29F001B, 9084 .total_size = 128, 9085 .page_size = 32 * 1024, 9086 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9087 .tested = TEST_UNTESTED, 9088 .probe = probe_jedec, 9089 .probe_timing = TIMING_ZERO, 9090 .block_erasers = 9091 { 9092 { 9093 .eraseblocks = { 9094 {8 * 1024, 1}, 9095 {4 * 1024, 2}, 9096 {8 * 1024, 2}, 9097 {32 * 1024, 1}, 9098 {64 * 1024, 1}, 9099 }, 9100 .block_erase = erase_sector_jedec, 9101 }, { 9102 .eraseblocks = { {128 * 1024, 1} }, 9103 .block_erase = erase_chip_block_jedec, 9104 } 9105 }, 9106 .write = write_jedec_1, 9107 .read = read_memmapped, 9108 .voltage = {4500, 5500}, 9109 }, 9110 9111 { 9112 .vendor = "Macronix", 9113 .name = "MX29F001T", 9114 .bustype = BUS_PARALLEL, 9115 .manufacture_id = MACRONIX_ID, 9116 .model_id = MACRONIX_MX29F001T, 9117 .total_size = 128, 9118 .page_size = 32 * 1024, 9119 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9120 .tested = TEST_OK_PREW, 9121 .probe = probe_jedec, 9122 .probe_timing = TIMING_ZERO, 9123 .block_erasers = 9124 { 9125 { 9126 .eraseblocks = { 9127 {64 * 1024, 1}, 9128 {32 * 1024, 1}, 9129 {8 * 1024, 2}, 9130 {4 * 1024, 2}, 9131 {8 * 1024, 1}, 9132 }, 9133 .block_erase = erase_sector_jedec, 9134 }, { 9135 .eraseblocks = { {128 * 1024, 1} }, 9136 .block_erase = erase_chip_block_jedec, 9137 } 9138 }, 9139 .write = write_jedec_1, 9140 .read = read_memmapped, 9141 .voltage = {4500, 5500}, 9142 }, 9143 9144 { 9145 .vendor = "Macronix", 9146 .name = "MX29F002(N)B", 9147 .bustype = BUS_PARALLEL, 9148 .manufacture_id = MACRONIX_ID, 9149 .model_id = MACRONIX_MX29F002B, 9150 .total_size = 256, 9151 .page_size = 64 * 1024, 9152 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9153 .tested = TEST_UNTESTED, 9154 .probe = probe_jedec, 9155 .probe_timing = TIMING_ZERO, 9156 .block_erasers = 9157 { 9158 { 9159 .eraseblocks = { 9160 {16 * 1024, 1}, 9161 {8 * 1024, 2}, 9162 {32 * 1024, 1}, 9163 {64 * 1024, 3}, 9164 }, 9165 .block_erase = erase_sector_jedec, 9166 }, { 9167 .eraseblocks = { {256 * 1024, 1} }, 9168 .block_erase = erase_chip_block_jedec, 9169 }, 9170 }, 9171 .write = write_jedec_1, 9172 .read = read_memmapped, 9173 .voltage = {4500, 5500}, 9174 }, 9175 9176 { 9177 .vendor = "Macronix", 9178 .name = "MX29F002(N)T", 9179 .bustype = BUS_PARALLEL, 9180 .manufacture_id = MACRONIX_ID, 9181 .model_id = MACRONIX_MX29F002T, 9182 .total_size = 256, 9183 .page_size = 64 * 1024, 9184 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9185 .tested = TEST_OK_PREW, 9186 .probe = probe_jedec, 9187 .probe_timing = TIMING_ZERO, 9188 .block_erasers = 9189 { 9190 { 9191 .eraseblocks = { 9192 {64 * 1024, 3}, 9193 {32 * 1024, 1}, 9194 {8 * 1024, 2}, 9195 {16 * 1024, 1}, 9196 }, 9197 .block_erase = erase_sector_jedec, 9198 }, { 9199 .eraseblocks = { {256 * 1024, 1} }, 9200 .block_erase = erase_chip_block_jedec, 9201 }, 9202 }, 9203 .write = write_jedec_1, 9204 .read = read_memmapped, 9205 .voltage = {4500, 5500}, 9206 }, 9207 9208 { 9209 .vendor = "Macronix", 9210 .name = "MX29F022(N)B", 9211 .bustype = BUS_PARALLEL, 9212 .manufacture_id = MACRONIX_ID, 9213 .model_id = MACRONIX_MX29F022B, 9214 .total_size = 256, 9215 .page_size = 0, /* unused */ 9216 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9217 .tested = TEST_UNTESTED, 9218 .probe = probe_jedec, 9219 .probe_timing = TIMING_ZERO, 9220 .block_erasers = 9221 { 9222 { 9223 .eraseblocks = { 9224 {16 * 1024, 1}, 9225 {8 * 1024, 2}, 9226 {32 * 1024, 1}, 9227 {64 * 1024, 3}, 9228 }, 9229 .block_erase = erase_sector_jedec, 9230 }, { 9231 .eraseblocks = { {256 * 1024, 1} }, 9232 .block_erase = erase_chip_block_jedec, 9233 } 9234 }, 9235 .write = write_jedec_1, 9236 .read = read_memmapped, 9237 .voltage = {4500, 5500}, 9238 }, 9239 9240 { 9241 .vendor = "Macronix", 9242 .name = "MX29F022(N)T", 9243 .bustype = BUS_PARALLEL, 9244 .manufacture_id = MACRONIX_ID, 9245 .model_id = MACRONIX_MX29F022T, 9246 .total_size = 256, 9247 .page_size = 0, /* unused */ 9248 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9249 .tested = TEST_OK_PREW, 9250 .probe = probe_jedec, 9251 .probe_timing = TIMING_ZERO, 9252 .block_erasers = 9253 { 9254 { 9255 .eraseblocks = { 9256 {64 * 1024, 3}, 9257 {32 * 1024, 1}, 9258 {8 * 1024, 2}, 9259 {16 * 1024, 1}, 9260 }, 9261 .block_erase = erase_sector_jedec, 9262 }, { 9263 .eraseblocks = { {256 * 1024, 1} }, 9264 .block_erase = erase_chip_block_jedec, 9265 } 9266 }, 9267 .write = write_jedec_1, 9268 .read = read_memmapped, 9269 .voltage = {4500, 5500}, 9270 }, 9271 9272 { 9273 .vendor = "Macronix", 9274 .name = "MX29F040", 9275 .bustype = BUS_PARALLEL, 9276 .manufacture_id = MACRONIX_ID, 9277 .model_id = MACRONIX_MX29F040, 9278 .total_size = 512, 9279 .page_size = 64 * 1024, 9280 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9281 .tested = TEST_UNTESTED, 9282 .probe = probe_jedec, 9283 .probe_timing = TIMING_ZERO, 9284 .block_erasers = 9285 { 9286 { 9287 .eraseblocks = { {64 * 1024, 8} }, 9288 .block_erase = erase_sector_jedec, 9289 }, { 9290 .eraseblocks = { {512 * 1024, 1} }, 9291 .block_erase = erase_chip_block_jedec, 9292 }, 9293 }, 9294 .write = write_jedec_1, 9295 .read = read_memmapped, 9296 .voltage = {4500, 5500}, 9297 }, 9298 9299 { 9300 .vendor = "Macronix", 9301 .name = "MX29GL128F", 9302 .bustype = BUS_PARALLEL, 9303 .manufacture_id = MACRONIX_ID, 9304 .model_id = MACRONIX_MX29GL128F, 9305 .total_size = 16384, 9306 .page_size = 128 * 1024, /* actual page size is 16 */ 9307 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9308 .tested = TEST_UNTESTED, 9309 .probe = probe_jedec_29gl, 9310 .probe_timing = TIMING_ZERO, 9311 .block_erasers = 9312 { 9313 { 9314 .eraseblocks = { {128 * 1024, 128} }, 9315 .block_erase = erase_sector_jedec, 9316 }, { 9317 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9318 .block_erase = erase_chip_block_jedec, 9319 }, 9320 }, 9321 .write = write_jedec_1, 9322 .read = read_memmapped, 9323 .voltage = {2700, 3600}, 9324 }, 9325 9326 { 9327 .vendor = "Macronix", 9328 .name = "MX29GL320EB", 9329 .bustype = BUS_PARALLEL, 9330 .manufacture_id = MACRONIX_ID, 9331 .model_id = MACRONIX_MX29GL320EB, 9332 .total_size = 4096, 9333 .page_size = 128 * 1024, /* actual page size is 16 */ 9334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9335 .tested = TEST_UNTESTED, 9336 .probe = probe_jedec_29gl, 9337 .probe_timing = TIMING_ZERO, 9338 .block_erasers = 9339 { 9340 { 9341 .eraseblocks = { 9342 {8 * 1024, 8}, 9343 {64 * 1024, 63}, 9344 }, 9345 .block_erase = erase_sector_jedec, 9346 }, { 9347 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9348 .block_erase = erase_chip_block_jedec, 9349 }, 9350 }, 9351 .write = write_jedec_1, 9352 .read = read_memmapped, 9353 .voltage = {2700, 3600}, 9354 }, 9355 9356 { 9357 .vendor = "Macronix", 9358 .name = "MX29GL320EH/L", 9359 .bustype = BUS_PARALLEL, 9360 .manufacture_id = MACRONIX_ID, 9361 .model_id = MACRONIX_MX29GL320EHL, 9362 .total_size = 4096, 9363 .page_size = 128 * 1024, /* actual page size is 16 */ 9364 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9365 .tested = TEST_UNTESTED, 9366 .probe = probe_jedec_29gl, 9367 .probe_timing = TIMING_ZERO, 9368 .block_erasers = 9369 { 9370 { 9371 .eraseblocks = { {64 * 1024, 64} }, 9372 .block_erase = erase_sector_jedec, 9373 }, { 9374 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9375 .block_erase = erase_chip_block_jedec, 9376 }, 9377 }, 9378 .write = write_jedec_1, 9379 .read = read_memmapped, 9380 .voltage = {2700, 3600}, 9381 }, 9382 9383 { 9384 .vendor = "Macronix", 9385 .name = "MX29GL320ET", 9386 .bustype = BUS_PARALLEL, 9387 .manufacture_id = MACRONIX_ID, 9388 .model_id = MACRONIX_MX29GL320ET, 9389 .total_size = 4096, 9390 .page_size = 128 * 1024, /* actual page size is 16 */ 9391 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9392 .tested = TEST_UNTESTED, 9393 .probe = probe_jedec_29gl, 9394 .probe_timing = TIMING_ZERO, 9395 .block_erasers = 9396 { 9397 { 9398 .eraseblocks = { 9399 {64 * 1024, 63}, 9400 {8 * 1024, 8}, 9401 }, 9402 .block_erase = erase_sector_jedec, 9403 }, { 9404 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9405 .block_erase = erase_chip_block_jedec, 9406 }, 9407 }, 9408 .write = write_jedec_1, 9409 .read = read_memmapped, 9410 .voltage = {2700, 3600}, 9411 }, 9412 9413 { 9414 .vendor = "Macronix", 9415 .name = "MX29GL640EB", 9416 .bustype = BUS_PARALLEL, 9417 .manufacture_id = MACRONIX_ID, 9418 .model_id = MACRONIX_MX29GL640EB, 9419 .total_size = 8192, 9420 .page_size = 128 * 1024, /* actual page size is 16 */ 9421 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9422 .tested = TEST_UNTESTED, 9423 .probe = probe_jedec_29gl, 9424 .probe_timing = TIMING_ZERO, 9425 .block_erasers = 9426 { 9427 { 9428 .eraseblocks = { 9429 {8 * 1024, 8}, 9430 {64 * 1024, 127}, 9431 }, 9432 .block_erase = erase_sector_jedec, 9433 }, { 9434 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9435 .block_erase = erase_chip_block_jedec, 9436 }, 9437 }, 9438 .write = write_jedec_1, 9439 .read = read_memmapped, 9440 .voltage = {2700, 3600}, 9441 }, 9442 9443 { 9444 .vendor = "Macronix", 9445 .name = "MX29GL640EH/L", 9446 .bustype = BUS_PARALLEL, 9447 .manufacture_id = MACRONIX_ID, 9448 .model_id = MACRONIX_MX29GL640EHL, 9449 .total_size = 8192, 9450 .page_size = 128 * 1024, /* actual page size is 16 */ 9451 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9452 .tested = TEST_UNTESTED, 9453 .probe = probe_jedec_29gl, 9454 .probe_timing = TIMING_ZERO, 9455 .block_erasers = 9456 { 9457 { 9458 .eraseblocks = { {64 * 1024, 128} }, 9459 .block_erase = erase_sector_jedec, 9460 }, { 9461 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9462 .block_erase = erase_chip_block_jedec, 9463 }, 9464 }, 9465 .write = write_jedec_1, 9466 .read = read_memmapped, 9467 .voltage = {2700, 3600}, 9468 }, 9469 9470 { 9471 .vendor = "Macronix", 9472 .name = "MX29GL640ET", 9473 .bustype = BUS_PARALLEL, 9474 .manufacture_id = MACRONIX_ID, 9475 .model_id = MACRONIX_MX29GL640ET, 9476 .total_size = 8192, 9477 .page_size = 128 * 1024, /* actual page size is 16 */ 9478 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9479 .tested = TEST_UNTESTED, 9480 .probe = probe_jedec_29gl, 9481 .probe_timing = TIMING_ZERO, 9482 .block_erasers = 9483 { 9484 { 9485 .eraseblocks = { 9486 {64 * 1024, 127}, 9487 {8 * 1024, 8}, 9488 }, 9489 .block_erase = erase_sector_jedec, 9490 }, { 9491 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9492 .block_erase = erase_chip_block_jedec, 9493 }, 9494 }, 9495 .write = write_jedec_1, 9496 .read = read_memmapped, 9497 .voltage = {2700, 3600}, 9498 }, 9499 9500 { 9501 .vendor = "Macronix", 9502 .name = "MX29LV040", 9503 .bustype = BUS_PARALLEL, 9504 .manufacture_id = MACRONIX_ID, 9505 .model_id = MACRONIX_MX29LV040, 9506 .total_size = 512, 9507 .page_size = 64 * 1024, 9508 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9509 .tested = TEST_UNTESTED, 9510 .probe = probe_jedec, 9511 .probe_timing = TIMING_ZERO, 9512 .block_erasers = 9513 { 9514 { 9515 .eraseblocks = { {64 * 1024, 8} }, 9516 .block_erase = erase_sector_jedec, 9517 }, { 9518 .eraseblocks = { {512 * 1024, 1} }, 9519 .block_erase = erase_chip_block_jedec, 9520 }, 9521 }, 9522 .write = write_jedec_1, 9523 .read = read_memmapped, 9524 .voltage = {2700, 3600}, 9525 }, 9526 9527 { 9528 .vendor = "Macronix", 9529 .name = "MX66L51235F/MX25L51245G", 9530 .bustype = BUS_SPI, 9531 .manufacture_id = MACRONIX_ID, 9532 .model_id = MACRONIX_MX66L51235F, 9533 .total_size = 65536, 9534 .page_size = 256, 9535 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 9536 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 9537 .tested = TEST_OK_PREW, 9538 .probe = probe_spi_rdid, 9539 .probe_timing = TIMING_ZERO, 9540 .block_erasers = 9541 { 9542 { 9543 .eraseblocks = { {4 * 1024, 16384} }, 9544 .block_erase = spi_block_erase_21, 9545 }, { 9546 .eraseblocks = { {4 * 1024, 16384} }, 9547 .block_erase = spi_block_erase_20, 9548 }, { 9549 .eraseblocks = { {32 * 1024, 2048} }, 9550 .block_erase = spi_block_erase_5c, 9551 }, { 9552 .eraseblocks = { {32 * 1024, 2048} }, 9553 .block_erase = spi_block_erase_52, 9554 }, { 9555 .eraseblocks = { {64 * 1024, 1024} }, 9556 .block_erase = spi_block_erase_dc, 9557 }, { 9558 .eraseblocks = { {64 * 1024, 1024} }, 9559 .block_erase = spi_block_erase_d8, 9560 }, { 9561 .eraseblocks = { {64 * 1024 * 1024, 1} }, 9562 .block_erase = spi_block_erase_60, 9563 }, { 9564 .eraseblocks = { {64 * 1024 * 1024, 1} }, 9565 .block_erase = spi_block_erase_c7, 9566 } 9567 }, 9568 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */ 9569 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 9570 .unlock = spi_disable_blockprotect_bp3_srwd, 9571 .write = spi_chip_write_256, 9572 .read = spi_chip_read, /* Fast read (0x0B) supported */ 9573 .voltage = {2700, 3600}, 9574 }, 9575 9576 /* The ST M25P05 is a bit of a problem. It has the same ID as the 9577 * ST M25P05-A in RES mode, but supports only 128 byte writes instead 9578 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1 9579 * only is successful if RDID does not work. 9580 */ 9581 { 9582 .vendor = "Micron/Numonyx/ST", 9583 .name = "M25P05", 9584 .bustype = BUS_SPI, 9585 .manufacture_id = 0, /* Not used. */ 9586 .model_id = ST_M25P05_RES, 9587 .total_size = 64, 9588 .page_size = 256, 9589 .feature_bits = FEATURE_WRSR_WREN, 9590 .tested = TEST_UNTESTED, 9591 .probe = probe_spi_res1, 9592 .probe_timing = TIMING_ZERO, 9593 .block_erasers = 9594 { 9595 { 9596 .eraseblocks = { {32 * 1024, 2} }, 9597 .block_erase = spi_block_erase_d8, 9598 }, { 9599 .eraseblocks = { {64 * 1024, 1} }, 9600 .block_erase = spi_block_erase_c7, 9601 } 9602 }, 9603 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9604 .unlock = spi_disable_blockprotect_bp3_srwd, 9605 .write = spi_chip_write_1, /* 128 */ 9606 .read = spi_chip_read, 9607 .voltage = {2700, 3600}, 9608 }, 9609 9610 { 9611 .vendor = "Micron/Numonyx/ST", 9612 .name = "M25P05-A", 9613 .bustype = BUS_SPI, 9614 .manufacture_id = ST_ID, 9615 .model_id = ST_M25P05A, 9616 .total_size = 64, 9617 .page_size = 256, 9618 .feature_bits = FEATURE_WRSR_WREN, 9619 .tested = TEST_OK_PREW, 9620 .probe = probe_spi_rdid, 9621 .probe_timing = TIMING_ZERO, 9622 .block_erasers = 9623 { 9624 { 9625 .eraseblocks = { {32 * 1024, 2} }, 9626 .block_erase = spi_block_erase_d8, 9627 }, { 9628 .eraseblocks = { {64 * 1024, 1} }, 9629 .block_erase = spi_block_erase_c7, 9630 } 9631 }, 9632 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9633 .unlock = spi_disable_blockprotect_bp3_srwd, 9634 .write = spi_chip_write_256, 9635 .read = spi_chip_read, 9636 .voltage = {2700, 3600}, 9637 }, 9638 9639 /* The ST M25P10 has the same problem as the M25P05. */ 9640 { 9641 .vendor = "Micron/Numonyx/ST", 9642 .name = "M25P10", 9643 .bustype = BUS_SPI, 9644 .manufacture_id = 0, /* Not used. */ 9645 .model_id = ST_M25P10_RES, 9646 .total_size = 128, 9647 .page_size = 256, 9648 .feature_bits = FEATURE_WRSR_WREN, 9649 .tested = TEST_UNTESTED, 9650 .probe = probe_spi_res1, 9651 .probe_timing = TIMING_ZERO, 9652 .block_erasers = 9653 { 9654 { 9655 .eraseblocks = { {32 * 1024, 4} }, 9656 .block_erase = spi_block_erase_d8, 9657 }, { 9658 .eraseblocks = { {128 * 1024, 1} }, 9659 .block_erase = spi_block_erase_c7, 9660 } 9661 }, 9662 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9663 .unlock = spi_disable_blockprotect_bp3_srwd, 9664 .write = spi_chip_write_1, /* 128 */ 9665 .read = spi_chip_read, 9666 .voltage = {2700, 3600}, 9667 }, 9668 9669 { 9670 .vendor = "Micron/Numonyx/ST", 9671 .name = "M25P10-A", 9672 .bustype = BUS_SPI, 9673 .manufacture_id = ST_ID, 9674 .model_id = ST_M25P10A, 9675 .total_size = 128, 9676 .page_size = 256, 9677 .feature_bits = FEATURE_WRSR_WREN, 9678 .tested = TEST_OK_PREW, 9679 .probe = probe_spi_rdid, 9680 .probe_timing = TIMING_ZERO, 9681 .block_erasers = 9682 { 9683 { 9684 .eraseblocks = { {32 * 1024, 4} }, 9685 .block_erase = spi_block_erase_d8, 9686 }, { 9687 .eraseblocks = { {128 * 1024, 1} }, 9688 .block_erase = spi_block_erase_c7, 9689 } 9690 }, 9691 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9692 .unlock = spi_disable_blockprotect_bp3_srwd, 9693 .write = spi_chip_write_256, 9694 .read = spi_chip_read, 9695 .voltage = {2700, 3600}, 9696 }, 9697 9698 { 9699 .vendor = "Micron/Numonyx/ST", 9700 .name = "M25P128", 9701 .bustype = BUS_SPI, 9702 .manufacture_id = ST_ID, 9703 .model_id = ST_M25P128, 9704 .total_size = 16384, 9705 .page_size = 256, 9706 .feature_bits = FEATURE_WRSR_WREN, 9707 .tested = TEST_OK_PREW, 9708 .probe = probe_spi_rdid, 9709 .probe_timing = TIMING_ZERO, 9710 .block_erasers = 9711 { 9712 { 9713 .eraseblocks = { {256 * 1024, 64} }, 9714 .block_erase = spi_block_erase_d8, 9715 }, { 9716 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9717 .block_erase = spi_block_erase_c7, 9718 } 9719 }, 9720 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9721 .unlock = spi_disable_blockprotect_bp3_srwd, 9722 .write = spi_chip_write_256, 9723 .read = spi_chip_read, 9724 .voltage = {2700, 3600}, 9725 }, 9726 9727 { 9728 .vendor = "Micron/Numonyx/ST", 9729 .name = "M25P16", 9730 .bustype = BUS_SPI, 9731 .manufacture_id = ST_ID, 9732 .model_id = ST_M25P16, 9733 .total_size = 2048, 9734 .page_size = 256, 9735 .feature_bits = FEATURE_WRSR_WREN, 9736 .tested = TEST_OK_PREW, 9737 .probe = probe_spi_rdid, 9738 .probe_timing = TIMING_ZERO, 9739 .block_erasers = 9740 { 9741 { 9742 .eraseblocks = { {64 * 1024, 32} }, 9743 .block_erase = spi_block_erase_d8, 9744 }, { 9745 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9746 .block_erase = spi_block_erase_c7, 9747 } 9748 }, 9749 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9750 .unlock = spi_disable_blockprotect_bp3_srwd, 9751 .write = spi_chip_write_256, 9752 .read = spi_chip_read, 9753 .voltage = {2700, 3600}, 9754 }, 9755 9756 { 9757 .vendor = "Micron/Numonyx/ST", /* Numonyx */ 9758 .name = "M25P20", 9759 .bustype = BUS_SPI, 9760 .manufacture_id = ST_ID, 9761 .model_id = ST_M25P20, 9762 .total_size = 256, 9763 .page_size = 256, 9764 .feature_bits = FEATURE_WRSR_WREN, 9765 .tested = TEST_UNTESTED, 9766 .probe = probe_spi_rdid, 9767 .probe_timing = TIMING_ZERO, 9768 .block_erasers = 9769 { 9770 { 9771 .eraseblocks = { {64 * 1024, 4} }, 9772 .block_erase = spi_block_erase_d8, 9773 }, { 9774 .eraseblocks = { {256 * 1024, 1} }, 9775 .block_erase = spi_block_erase_c7, 9776 } 9777 }, 9778 .printlock = spi_prettyprint_status_register_bp1_srwd, 9779 .unlock = spi_disable_blockprotect, 9780 .write = spi_chip_write_256, 9781 .read = spi_chip_read, /* Fast read (0x0B) supported */ 9782 .voltage = {2700, 3600}, 9783 }, 9784 9785 { 9786 .vendor = "Micron/Numonyx/ST", 9787 .name = "M25P20-old", 9788 .bustype = BUS_SPI, 9789 .manufacture_id = 0, /* Not used. */ 9790 .model_id = ST_M25P20_RES, 9791 .total_size = 256, 9792 .page_size = 256, 9793 .feature_bits = FEATURE_WRSR_WREN, 9794 .tested = TEST_OK_PREW, 9795 .probe = probe_spi_res1, 9796 .probe_timing = TIMING_ZERO, 9797 .block_erasers = 9798 { 9799 { 9800 .eraseblocks = { {64 * 1024, 4} }, 9801 .block_erase = spi_block_erase_d8, 9802 }, { 9803 .eraseblocks = { {256 * 1024, 1} }, 9804 .block_erase = spi_block_erase_c7, 9805 } 9806 }, 9807 .printlock = spi_prettyprint_status_register_bp1_srwd, 9808 .unlock = spi_disable_blockprotect, 9809 .write = spi_chip_write_256, 9810 .read = spi_chip_read, /* Fast read (0x0B) supported */ 9811 .voltage = {2700, 3600}, 9812 }, 9813 9814 { 9815 .vendor = "Micron/Numonyx/ST", 9816 .name = "M25P32", 9817 .bustype = BUS_SPI, 9818 .manufacture_id = ST_ID, 9819 .model_id = ST_M25P32, 9820 .total_size = 4096, 9821 .page_size = 256, 9822 .feature_bits = FEATURE_WRSR_WREN, 9823 .tested = TEST_OK_PREW, 9824 .probe = probe_spi_rdid, 9825 .probe_timing = TIMING_ZERO, 9826 .block_erasers = 9827 { 9828 { 9829 .eraseblocks = { {64 * 1024, 64} }, 9830 .block_erase = spi_block_erase_d8, 9831 }, { 9832 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9833 .block_erase = spi_block_erase_c7, 9834 } 9835 }, 9836 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9837 .unlock = spi_disable_blockprotect_bp3_srwd, 9838 .write = spi_chip_write_256, 9839 .read = spi_chip_read, 9840 .voltage = {2700, 3600}, 9841 }, 9842 9843 { 9844 .vendor = "Micron/Numonyx/ST", /* Numonyx */ 9845 .name = "M25P40", 9846 .bustype = BUS_SPI, 9847 .manufacture_id = ST_ID, 9848 .model_id = ST_M25P40, 9849 .total_size = 512, 9850 .page_size = 256, 9851 .feature_bits = FEATURE_WRSR_WREN, 9852 .tested = TEST_OK_PREW, 9853 .probe = probe_spi_rdid, 9854 .probe_timing = TIMING_ZERO, 9855 .block_erasers = 9856 { 9857 { 9858 .eraseblocks = { {64 * 1024, 8} }, 9859 .block_erase = spi_block_erase_d8, 9860 }, { 9861 .eraseblocks = { {512 * 1024, 1} }, 9862 .block_erase = spi_block_erase_c7, 9863 } 9864 }, 9865 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9866 .unlock = spi_disable_blockprotect_bp3_srwd, 9867 .write = spi_chip_write_256, 9868 .read = spi_chip_read, 9869 .voltage = {2700, 3600}, 9870 }, 9871 9872 { 9873 .vendor = "Micron/Numonyx/ST", 9874 .name = "M25P40-old", 9875 .bustype = BUS_SPI, 9876 .manufacture_id = 0, /* Not used. */ 9877 .model_id = ST_M25P40_RES, 9878 .total_size = 512, 9879 .page_size = 256, 9880 .feature_bits = FEATURE_WRSR_WREN, 9881 .tested = TEST_UNTESTED, 9882 .probe = probe_spi_res1, 9883 .probe_timing = TIMING_ZERO, 9884 .block_erasers = 9885 { 9886 { 9887 .eraseblocks = { {64 * 1024, 8} }, 9888 .block_erase = spi_block_erase_d8, 9889 }, { 9890 .eraseblocks = { {512 * 1024, 1} }, 9891 .block_erase = spi_block_erase_c7, 9892 } 9893 }, 9894 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9895 .unlock = spi_disable_blockprotect_bp3_srwd, 9896 .write = spi_chip_write_256, 9897 .read = spi_chip_read, 9898 }, 9899 9900 { 9901 .vendor = "Micron/Numonyx/ST", 9902 .name = "M25P64", 9903 .bustype = BUS_SPI, 9904 .manufacture_id = ST_ID, 9905 .model_id = ST_M25P64, 9906 .total_size = 8192, 9907 .page_size = 256, 9908 .feature_bits = FEATURE_WRSR_WREN, 9909 .tested = TEST_OK_PREW, 9910 .probe = probe_spi_rdid, 9911 .probe_timing = TIMING_ZERO, 9912 .block_erasers = 9913 { 9914 { 9915 .eraseblocks = { {64 * 1024, 128} }, 9916 .block_erase = spi_block_erase_d8, 9917 }, { 9918 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9919 .block_erase = spi_block_erase_c7, 9920 } 9921 }, 9922 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9923 .unlock = spi_disable_blockprotect_bp3_srwd, 9924 .write = spi_chip_write_256, 9925 .read = spi_chip_read, 9926 .voltage = {2700, 3600}, 9927 }, 9928 9929 { 9930 .vendor = "Micron/Numonyx/ST", 9931 .name = "M25P80", 9932 .bustype = BUS_SPI, 9933 .manufacture_id = ST_ID, 9934 .model_id = ST_M25P80, 9935 .total_size = 1024, 9936 .page_size = 256, 9937 .feature_bits = FEATURE_WRSR_WREN, 9938 .tested = TEST_OK_PREW, 9939 .probe = probe_spi_rdid, 9940 .probe_timing = TIMING_ZERO, 9941 .block_erasers = 9942 { 9943 { 9944 .eraseblocks = { {64 * 1024, 16} }, 9945 .block_erase = spi_block_erase_d8, 9946 }, { 9947 .eraseblocks = { {1024 * 1024, 1} }, 9948 .block_erase = spi_block_erase_c7, 9949 } 9950 }, 9951 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */ 9952 .unlock = spi_disable_blockprotect_bp3_srwd, 9953 .write = spi_chip_write_256, 9954 .read = spi_chip_read, 9955 .voltage = {2700, 3600}, 9956 }, 9957 9958 { 9959 .vendor = "Micron/Numonyx/ST", 9960 .name = "M25PE10", 9961 .bustype = BUS_SPI, 9962 .manufacture_id = ST_ID, 9963 .model_id = ST_M25PE10, 9964 .total_size = 128, 9965 .page_size = 256, 9966 .feature_bits = FEATURE_WRSR_WREN, 9967 .tested = TEST_UNTESTED, 9968 .probe = probe_spi_rdid, 9969 .probe_timing = TIMING_ZERO, 9970 .block_erasers = 9971 { 9972 { 9973 .eraseblocks = { {4 * 1024, 32} }, 9974 .block_erase = spi_block_erase_20, 9975 }, { 9976 .eraseblocks = { {64 * 1024, 2} }, 9977 .block_erase = spi_block_erase_d8, 9978 }, { 9979 .eraseblocks = { {128 * 1024, 1} }, 9980 .block_erase = spi_block_erase_c7, 9981 } 9982 }, 9983 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 9984 .unlock = spi_disable_blockprotect, 9985 .write = spi_chip_write_256, 9986 .read = spi_chip_read, 9987 .voltage = {2700, 3600}, 9988 }, 9989 9990 { 9991 .vendor = "Micron/Numonyx/ST", 9992 .name = "M25PE16", 9993 .bustype = BUS_SPI, 9994 .manufacture_id = ST_ID, 9995 .model_id = ST_M25PE16, 9996 .total_size = 2048, 9997 .page_size = 256, 9998 .feature_bits = FEATURE_WRSR_WREN, 9999 .tested = TEST_UNTESTED, 10000 .probe = probe_spi_rdid, 10001 .probe_timing = TIMING_ZERO, 10002 .block_erasers = 10003 { 10004 { 10005 .eraseblocks = { {4 * 1024, 512} }, 10006 .block_erase = spi_block_erase_20, 10007 }, { 10008 .eraseblocks = { {64 * 1024, 32} }, 10009 .block_erase = spi_block_erase_d8, 10010 }, { 10011 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10012 .block_erase = spi_block_erase_c7, 10013 } 10014 }, 10015 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 10016 .unlock = spi_disable_blockprotect, 10017 .write = spi_chip_write_256, 10018 .read = spi_chip_read, 10019 .voltage = {2700, 3600}, 10020 }, 10021 10022 { 10023 .vendor = "Micron/Numonyx/ST", 10024 .name = "M25PE20", 10025 .bustype = BUS_SPI, 10026 .manufacture_id = ST_ID, 10027 .model_id = ST_M25PE20, 10028 .total_size = 256, 10029 .page_size = 256, 10030 .feature_bits = FEATURE_WRSR_WREN, 10031 .tested = TEST_UNTESTED, 10032 .probe = probe_spi_rdid, 10033 .probe_timing = TIMING_ZERO, 10034 .block_erasers = 10035 { 10036 { 10037 .eraseblocks = { {4 * 1024, 64} }, 10038 .block_erase = spi_block_erase_20, 10039 }, { 10040 .eraseblocks = { {64 * 1024, 4} }, 10041 .block_erase = spi_block_erase_d8, 10042 }, { 10043 .eraseblocks = { {256 * 1024, 1} }, 10044 .block_erase = spi_block_erase_c7, 10045 } 10046 }, 10047 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 10048 .unlock = spi_disable_blockprotect, 10049 .write = spi_chip_write_256, 10050 .read = spi_chip_read, 10051 .voltage = {2700, 3600}, 10052 }, 10053 10054 { 10055 .vendor = "Micron/Numonyx/ST", 10056 .name = "M25PE40", 10057 .bustype = BUS_SPI, 10058 .manufacture_id = ST_ID, 10059 .model_id = ST_M25PE40, 10060 .total_size = 512, 10061 .page_size = 256, 10062 .feature_bits = FEATURE_WRSR_WREN, 10063 .tested = TEST_OK_PREW, 10064 .probe = probe_spi_rdid, 10065 .probe_timing = TIMING_ZERO, 10066 .block_erasers = 10067 { 10068 { 10069 .eraseblocks = { {4 * 1024, 128} }, 10070 .block_erase = spi_block_erase_20, 10071 }, { 10072 .eraseblocks = { {64 * 1024, 8} }, 10073 .block_erase = spi_block_erase_d8, 10074 }, { 10075 .eraseblocks = { {512 * 1024, 1} }, 10076 .block_erase = spi_block_erase_c7, 10077 } 10078 }, 10079 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 10080 .unlock = spi_disable_blockprotect, 10081 .write = spi_chip_write_256, 10082 .read = spi_chip_read, 10083 .voltage = {2700, 3600}, 10084 }, 10085 10086 { 10087 .vendor = "Micron/Numonyx/ST", 10088 .name = "M25PE80", 10089 .bustype = BUS_SPI, 10090 .manufacture_id = ST_ID, 10091 .model_id = ST_M25PE80, 10092 .total_size = 1024, 10093 .page_size = 256, 10094 .feature_bits = FEATURE_WRSR_WREN, 10095 .tested = TEST_OK_PREW, 10096 .probe = probe_spi_rdid, 10097 .probe_timing = TIMING_ZERO, 10098 .block_erasers = 10099 { 10100 { 10101 .eraseblocks = { {4 * 1024, 256} }, 10102 .block_erase = spi_block_erase_20, 10103 }, { 10104 .eraseblocks = { {64 * 1024, 16} }, 10105 .block_erase = spi_block_erase_d8, 10106 }, { 10107 .eraseblocks = { {1024 * 1024, 1} }, 10108 .block_erase = spi_block_erase_c7, 10109 } 10110 }, 10111 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 10112 .unlock = spi_disable_blockprotect, 10113 .write = spi_chip_write_256, 10114 .read = spi_chip_read, 10115 .voltage = {2700, 3600}, 10116 }, 10117 10118 { 10119 .vendor = "Micron/Numonyx/ST", 10120 .name = "M25PX16", 10121 .bustype = BUS_SPI, 10122 .manufacture_id = ST_ID, 10123 .model_id = ST_M25PX16, 10124 .total_size = 2048, 10125 .page_size = 256, 10126 /* OTP: 64B total; read 0x4B; write 0x42 */ 10127 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10128 .tested = TEST_OK_PREW, 10129 .probe = probe_spi_rdid, 10130 .probe_timing = TIMING_ZERO, 10131 .block_erasers = 10132 { 10133 { 10134 .eraseblocks = { { 4 * 1024, 512 } }, 10135 .block_erase = spi_block_erase_20, 10136 }, { 10137 .eraseblocks = { {64 * 1024, 32} }, 10138 .block_erase = spi_block_erase_d8, 10139 }, { 10140 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10141 .block_erase = spi_block_erase_c7, 10142 } 10143 }, 10144 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */ 10145 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ 10146 .write = spi_chip_write_256, 10147 .read = spi_chip_read, 10148 .voltage = {2300, 3600}, 10149 }, 10150 10151 { 10152 .vendor = "Micron/Numonyx/ST", 10153 .name = "M25PX32", 10154 .bustype = BUS_SPI, 10155 .manufacture_id = ST_ID, 10156 .model_id = ST_M25PX32, 10157 .total_size = 4096, 10158 .page_size = 256, 10159 /* OTP: 64B total; read 0x4B; write 0x42 */ 10160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10161 .tested = TEST_OK_PRE, 10162 .probe = probe_spi_rdid, 10163 .probe_timing = TIMING_ZERO, 10164 .block_erasers = 10165 { 10166 { 10167 .eraseblocks = { { 4 * 1024, 1024 } }, 10168 .block_erase = spi_block_erase_20, 10169 }, { 10170 .eraseblocks = { {64 * 1024, 64} }, 10171 .block_erase = spi_block_erase_d8, 10172 }, { 10173 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10174 .block_erase = spi_block_erase_c7, 10175 } 10176 }, 10177 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */ 10178 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ 10179 .write = spi_chip_write_256, 10180 .read = spi_chip_read, 10181 .voltage = {2700, 3600}, 10182 }, 10183 10184 { 10185 .vendor = "Micron/Numonyx/ST", 10186 .name = "M25PX64", 10187 .bustype = BUS_SPI, 10188 .manufacture_id = ST_ID, 10189 .model_id = ST_M25PX64, 10190 .total_size = 8192, 10191 .page_size = 256, 10192 /* OTP: 64B total; read 0x4B; write 0x42 */ 10193 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10194 .tested = TEST_OK_PREW, 10195 .probe = probe_spi_rdid, 10196 .probe_timing = TIMING_ZERO, 10197 .block_erasers = 10198 { 10199 { 10200 .eraseblocks = { { 4 * 1024, 2048 } }, 10201 .block_erase = spi_block_erase_20, 10202 }, { 10203 .eraseblocks = { {64 * 1024, 128} }, 10204 .block_erase = spi_block_erase_d8, 10205 }, { 10206 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10207 .block_erase = spi_block_erase_c7, 10208 } 10209 }, 10210 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */ 10211 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ 10212 .write = spi_chip_write_256, 10213 .read = spi_chip_read, 10214 .voltage = {2700, 3600}, 10215 }, 10216 10217 { 10218 .vendor = "Micron/Numonyx/ST", 10219 .name = "M25PX80", 10220 .bustype = BUS_SPI, 10221 .manufacture_id = ST_ID, 10222 .model_id = ST_M25PX80, 10223 .total_size = 1024, 10224 .page_size = 256, 10225 /* OTP: 64B total; read 0x4B, write 0x42 */ 10226 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10227 .tested = TEST_OK_PREW, 10228 .probe = probe_spi_rdid, 10229 .probe_timing = TIMING_ZERO, 10230 .block_erasers = 10231 { 10232 { 10233 .eraseblocks = { { 4 * 1024, 256 } }, 10234 .block_erase = spi_block_erase_20, 10235 }, { 10236 .eraseblocks = { {64 * 1024, 16} }, 10237 .block_erase = spi_block_erase_d8, 10238 }, { 10239 .eraseblocks = { {1024 * 1024, 1} }, 10240 .block_erase = spi_block_erase_c7, 10241 } 10242 }, 10243 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */ 10244 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */ 10245 .write = spi_chip_write_256, 10246 .read = spi_chip_read, 10247 .voltage = {2700, 3600}, 10248 }, 10249 10250 { 10251 .vendor = "Micron/Numonyx/ST", 10252 .name = "M45PE10", 10253 .bustype = BUS_SPI, 10254 .manufacture_id = ST_ID, 10255 .model_id = ST_M45PE10, 10256 .total_size = 128, 10257 .page_size = 256, 10258 .tested = TEST_UNTESTED, 10259 .probe = probe_spi_rdid, 10260 .probe_timing = TIMING_ZERO, 10261 .block_erasers = 10262 { 10263 { 10264 .eraseblocks = { {256, 512} }, 10265 .block_erase = spi_block_erase_db, 10266 }, { 10267 .eraseblocks = { {64 * 1024, 2} }, 10268 .block_erase = spi_block_erase_d8, 10269 } 10270 }, 10271 .printlock = spi_prettyprint_status_register_default_welwip, 10272 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 10273 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ 10274 .read = spi_chip_read, /* Fast read (0x0B) supported */ 10275 .voltage = {2700, 3600}, 10276 }, 10277 10278 { 10279 .vendor = "Micron/Numonyx/ST", 10280 .name = "M45PE16", 10281 .bustype = BUS_SPI, 10282 .manufacture_id = ST_ID, 10283 .model_id = ST_M45PE16, 10284 .total_size = 2048, 10285 .page_size = 256, 10286 .tested = TEST_UNTESTED, 10287 .probe = probe_spi_rdid, 10288 .probe_timing = TIMING_ZERO, 10289 .block_erasers = 10290 { 10291 { 10292 .eraseblocks = { {256, 8192} }, 10293 .block_erase = spi_block_erase_db, 10294 }, { 10295 .eraseblocks = { {64 * 1024, 32} }, 10296 .block_erase = spi_block_erase_d8, 10297 } 10298 }, 10299 .printlock = spi_prettyprint_status_register_default_welwip, 10300 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 10301 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ 10302 .read = spi_chip_read, /* Fast read (0x0B) supported */ 10303 .voltage = {2700, 3600}, 10304 }, 10305 10306 { 10307 .vendor = "Micron/Numonyx/ST", 10308 .name = "M45PE20", 10309 .bustype = BUS_SPI, 10310 .manufacture_id = ST_ID, 10311 .model_id = ST_M45PE20, 10312 .total_size = 256, 10313 .page_size = 256, 10314 .tested = TEST_UNTESTED, 10315 .probe = probe_spi_rdid, 10316 .probe_timing = TIMING_ZERO, 10317 .block_erasers = 10318 { 10319 { 10320 .eraseblocks = { {256, 1024} }, 10321 .block_erase = spi_block_erase_db, 10322 }, { 10323 .eraseblocks = { {64 * 1024, 4} }, 10324 .block_erase = spi_block_erase_d8, 10325 } 10326 }, 10327 .printlock = spi_prettyprint_status_register_default_welwip, 10328 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 10329 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ 10330 .read = spi_chip_read, /* Fast read (0x0B) supported */ 10331 .voltage = {2700, 3600}, 10332 }, 10333 10334 { 10335 .vendor = "Micron/Numonyx/ST", 10336 .name = "M45PE40", 10337 .bustype = BUS_SPI, 10338 .manufacture_id = ST_ID, 10339 .model_id = ST_M45PE40, 10340 .total_size = 512, 10341 .page_size = 256, 10342 .tested = TEST_UNTESTED, 10343 .probe = probe_spi_rdid, 10344 .probe_timing = TIMING_ZERO, 10345 .block_erasers = 10346 { 10347 { 10348 .eraseblocks = { {256, 2048} }, 10349 .block_erase = spi_block_erase_db, 10350 }, { 10351 .eraseblocks = { {64 * 1024, 8} }, 10352 .block_erase = spi_block_erase_d8, 10353 } 10354 }, 10355 .printlock = spi_prettyprint_status_register_default_welwip, 10356 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 10357 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */ 10358 .read = spi_chip_read, /* Fast read (0x0B) supported */ 10359 .voltage = {2700, 3600}, 10360 }, 10361 10362 { 10363 .vendor = "Micron/Numonyx/ST", 10364 .name = "M45PE80", 10365 .bustype = BUS_SPI, 10366 .manufacture_id = ST_ID, 10367 .model_id = ST_M45PE80, 10368 .total_size = 1024, 10369 .page_size = 256, 10370 .tested = TEST_UNTESTED, 10371 .probe = probe_spi_rdid, 10372 .probe_timing = TIMING_ZERO, 10373 .block_erasers = 10374 { 10375 { 10376 .eraseblocks = { {256, 4096} }, 10377 .block_erase = spi_block_erase_db, 10378 }, { 10379 .eraseblocks = { {64 * 1024, 16} }, 10380 .block_erase = spi_block_erase_d8, 10381 } 10382 }, 10383 .printlock = spi_prettyprint_status_register_default_welwip, 10384 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 10385 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */ 10386 .read = spi_chip_read, /* Fast read (0x0B) supported */ 10387 .voltage = {2700, 3600}, 10388 }, 10389 10390 { 10391 .vendor = "Micron/Numonyx/ST", 10392 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */ 10393 .bustype = BUS_SPI, 10394 .manufacture_id = ST_ID, 10395 .model_id = ST_N25Q00A__1G, 10396 .total_size = 131072, 10397 .page_size = 256, 10398 /* supports SFDP */ 10399 /* OTP: 64B total; read 0x4B, write 0x42 */ 10400 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10401 .tested = TEST_UNTESTED, 10402 .probe = probe_spi_rdid, 10403 .probe_timing = TIMING_ZERO, 10404 .block_erasers = 10405 { 10406 { 10407 .eraseblocks = { {4 * 1024, 32768} }, 10408 .block_erase = spi_block_erase_21, 10409 }, { 10410 .eraseblocks = { {4 * 1024, 32768} }, 10411 .block_erase = spi_block_erase_20, 10412 }, { 10413 .eraseblocks = { {64 * 1024, 2048} }, 10414 .block_erase = spi_block_erase_dc, 10415 }, { 10416 .eraseblocks = { {64 * 1024, 2048} }, 10417 .block_erase = spi_block_erase_d8, 10418 }, { 10419 .eraseblocks = { {32768 * 1024, 4} }, 10420 .block_erase = spi_block_erase_c4, 10421 } 10422 }, 10423 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10424 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10425 .write = spi_chip_write_256, /* Multi I/O supported */ 10426 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10427 .voltage = {1700, 2000}, 10428 }, 10429 10430 { 10431 .vendor = "Micron/Numonyx/ST", 10432 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ 10433 .bustype = BUS_SPI, 10434 .manufacture_id = ST_ID, 10435 .model_id = ST_N25Q00A__3G, 10436 .total_size = 131072, 10437 .page_size = 256, 10438 /* supports SFDP */ 10439 /* OTP: 64B total; read 0x4B, write 0x42 */ 10440 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10441 .tested = TEST_UNTESTED, 10442 .probe = probe_spi_rdid, 10443 .probe_timing = TIMING_ZERO, 10444 .block_erasers = 10445 { 10446 { 10447 .eraseblocks = { {4 * 1024, 32768} }, 10448 .block_erase = spi_block_erase_21, 10449 }, { 10450 .eraseblocks = { {4 * 1024, 32768} }, 10451 .block_erase = spi_block_erase_20, 10452 }, { 10453 .eraseblocks = { {64 * 1024, 2048} }, 10454 .block_erase = spi_block_erase_dc, 10455 }, { 10456 .eraseblocks = { {64 * 1024, 2048} }, 10457 .block_erase = spi_block_erase_d8, 10458 }, { 10459 .eraseblocks = { {32768 * 1024, 4} }, 10460 .block_erase = spi_block_erase_c4, 10461 } 10462 }, 10463 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10464 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10465 .write = spi_chip_write_256, /* Multi I/O supported */ 10466 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10467 .voltage = {2700, 3600}, 10468 }, 10469 10470 { 10471 .vendor = "Micron/Numonyx/ST", 10472 .name = "N25Q016", 10473 .bustype = BUS_SPI, 10474 .manufacture_id = ST_ID, 10475 .model_id = ST_N25Q016__1E, 10476 .total_size = 2048, 10477 .page_size = 256, 10478 /* supports SFDP */ 10479 /* OTP: 64B total; read 0x4B, write 0x42 */ 10480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10481 .tested = TEST_UNTESTED, 10482 .probe = probe_spi_rdid, 10483 .probe_timing = TIMING_ZERO, 10484 .block_erasers = 10485 { 10486 { 10487 .eraseblocks = { {4 * 1024, 512} }, 10488 .block_erase = spi_block_erase_20, 10489 }, { 10490 .eraseblocks = { {32 * 1024, 64} }, 10491 .block_erase = spi_block_erase_52, 10492 }, { 10493 .eraseblocks = { {64 * 1024, 32} }, 10494 .block_erase = spi_block_erase_d8, 10495 }, { 10496 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10497 .block_erase = spi_block_erase_c7, 10498 } 10499 }, 10500 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10501 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10502 .write = spi_chip_write_256, /* Multi I/O supported */ 10503 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10504 .voltage = {1700, 2000}, 10505 }, 10506 10507 { 10508 .vendor = "Micron/Numonyx/ST", 10509 .name = "N25Q032..1E", 10510 .bustype = BUS_SPI, 10511 .manufacture_id = ST_ID, 10512 .model_id = ST_N25Q032__1E, 10513 .total_size = 4096, 10514 .page_size = 256, 10515 /* supports SFDP */ 10516 /* OTP: 64B total; read 0x4B, write 0x42 */ 10517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10518 .tested = TEST_UNTESTED, 10519 .probe = probe_spi_rdid, 10520 .probe_timing = TIMING_ZERO, 10521 .block_erasers = 10522 { 10523 { 10524 .eraseblocks = { {4 * 1024, 1024} }, 10525 .block_erase = spi_block_erase_20, 10526 }, { 10527 .eraseblocks = { {64 * 1024, 64} }, 10528 .block_erase = spi_block_erase_d8, 10529 }, { 10530 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10531 .block_erase = spi_block_erase_c7, 10532 } 10533 }, 10534 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10535 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10536 .write = spi_chip_write_256, /* Multi I/O supported */ 10537 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10538 .voltage = {1700, 2000}, 10539 }, 10540 10541 { 10542 .vendor = "Micron/Numonyx/ST", 10543 .name = "N25Q032..3E", 10544 .bustype = BUS_SPI, 10545 .manufacture_id = ST_ID, 10546 .model_id = ST_N25Q032__3E, 10547 .total_size = 4096, 10548 .page_size = 256, 10549 /* supports SFDP */ 10550 /* OTP: 64B total; read 0x4B, write 0x42 */ 10551 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10552 .tested = TEST_OK_PREW, 10553 .probe = probe_spi_rdid, 10554 .probe_timing = TIMING_ZERO, 10555 .block_erasers = 10556 { 10557 { 10558 .eraseblocks = { {4 * 1024, 1024} }, 10559 .block_erase = spi_block_erase_20, 10560 }, { 10561 .eraseblocks = { {64 * 1024, 64} }, 10562 .block_erase = spi_block_erase_d8, 10563 }, { 10564 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10565 .block_erase = spi_block_erase_c7, 10566 } 10567 }, 10568 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10569 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10570 .write = spi_chip_write_256, /* Multi I/O supported */ 10571 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10572 .voltage = {2700, 3600}, 10573 }, 10574 10575 { 10576 .vendor = "Micron/Numonyx/ST", 10577 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 10578 .bustype = BUS_SPI, 10579 .manufacture_id = ST_ID, 10580 .model_id = ST_N25Q064__1E, 10581 .total_size = 8192, 10582 .page_size = 256, 10583 /* supports SFDP */ 10584 /* OTP: 64B total; read 0x4B, write 0x42 */ 10585 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10586 .tested = TEST_OK_PREW, 10587 .probe = probe_spi_rdid, 10588 .probe_timing = TIMING_ZERO, 10589 .block_erasers = 10590 { 10591 { 10592 .eraseblocks = { {4 * 1024, 2048 } }, 10593 .block_erase = spi_block_erase_20, 10594 }, { 10595 .eraseblocks = { {64 * 1024, 128} }, 10596 .block_erase = spi_block_erase_d8, 10597 }, { 10598 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10599 .block_erase = spi_block_erase_c7, 10600 } 10601 }, 10602 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10603 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10604 .write = spi_chip_write_256, /* Multi I/O supported */ 10605 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10606 .voltage = {1700, 2000}, 10607 }, 10608 10609 { 10610 .vendor = "Micron/Numonyx/ST", 10611 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 10612 .bustype = BUS_SPI, 10613 .manufacture_id = ST_ID, 10614 .model_id = ST_N25Q064__3E, 10615 .total_size = 8192, 10616 .page_size = 256, 10617 /* supports SFDP */ 10618 /* OTP: 64B total; read 0x4B, write 0x42 */ 10619 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10620 .tested = TEST_OK_PREW, 10621 .probe = probe_spi_rdid, 10622 .probe_timing = TIMING_ZERO, 10623 .block_erasers = 10624 { 10625 { 10626 .eraseblocks = { {4 * 1024, 2048 } }, 10627 .block_erase = spi_block_erase_20, 10628 }, { 10629 .eraseblocks = { {64 * 1024, 128} }, 10630 .block_erase = spi_block_erase_d8, 10631 }, { 10632 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10633 .block_erase = spi_block_erase_c7, 10634 } 10635 }, 10636 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10637 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10638 .write = spi_chip_write_256, /* Multi I/O supported */ 10639 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10640 .voltage = {2700, 3600}, 10641 }, 10642 10643 { 10644 .vendor = "Micron/Numonyx/ST", 10645 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 10646 .bustype = BUS_SPI, 10647 .manufacture_id = ST_ID, 10648 .model_id = ST_N25Q128__1E, 10649 .total_size = 16384, 10650 .page_size = 256, 10651 /* supports SFDP */ 10652 /* OTP: 64B total; read 0x4B, write 0x42 */ 10653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10654 .tested = TEST_OK_PREW, 10655 .probe = probe_spi_rdid, 10656 .probe_timing = TIMING_ZERO, 10657 .block_erasers = 10658 { 10659 { 10660 .eraseblocks = { {4 * 1024, 4096 } }, 10661 .block_erase = spi_block_erase_20, 10662 }, { 10663 .eraseblocks = { {64 * 1024, 256} }, 10664 .block_erase = spi_block_erase_d8, 10665 }, { 10666 .eraseblocks = { {16384 * 1024, 1} }, 10667 .block_erase = spi_block_erase_c7, 10668 } 10669 }, 10670 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10671 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10672 .write = spi_chip_write_256, /* Multi I/O supported */ 10673 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10674 .voltage = {1700, 2000}, 10675 }, 10676 10677 { 10678 .vendor = "Micron/Numonyx/ST", 10679 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 10680 .bustype = BUS_SPI, 10681 .manufacture_id = ST_ID, 10682 .model_id = ST_N25Q128__3E, 10683 .total_size = 16384, 10684 .page_size = 256, 10685 /* supports SFDP */ 10686 /* OTP: 64B total; read 0x4B, write 0x42 */ 10687 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10688 .tested = TEST_OK_PREW, 10689 .probe = probe_spi_rdid, 10690 .probe_timing = TIMING_ZERO, 10691 .block_erasers = 10692 { 10693 { 10694 .eraseblocks = { {4 * 1024, 4096 } }, 10695 .block_erase = spi_block_erase_20, 10696 }, { 10697 .eraseblocks = { {64 * 1024, 256} }, 10698 .block_erase = spi_block_erase_d8, 10699 }, { 10700 .eraseblocks = { {16384 * 1024, 1} }, 10701 .block_erase = spi_block_erase_c7, 10702 } 10703 }, 10704 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10705 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10706 .write = spi_chip_write_256, /* Multi I/O supported */ 10707 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10708 .voltage = {2700, 3600}, 10709 }, 10710 10711 { 10712 .vendor = "Micron/Numonyx/ST", 10713 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 10714 .bustype = BUS_SPI, 10715 .manufacture_id = ST_ID, 10716 .model_id = ST_N25Q256__1E, 10717 .total_size = 32768, 10718 .page_size = 256, 10719 /* supports SFDP */ 10720 /* OTP: 64B total; read 0x4B, write 0x42 */ 10721 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10722 .tested = TEST_UNTESTED, 10723 .probe = probe_spi_rdid, 10724 .probe_timing = TIMING_ZERO, 10725 .block_erasers = 10726 { 10727 { 10728 .eraseblocks = { {4 * 1024, 8192} }, 10729 .block_erase = spi_block_erase_21, 10730 }, { 10731 .eraseblocks = { {4 * 1024, 8192} }, 10732 .block_erase = spi_block_erase_20, 10733 }, { 10734 .eraseblocks = { {64 * 1024, 512} }, 10735 .block_erase = spi_block_erase_dc, 10736 }, { 10737 .eraseblocks = { {64 * 1024, 512} }, 10738 .block_erase = spi_block_erase_d8, 10739 }, { 10740 .eraseblocks = { {32768 * 1024, 1} }, 10741 .block_erase = spi_block_erase_c7, 10742 } 10743 }, 10744 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10745 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10746 .write = spi_chip_write_256, /* Multi I/O supported */ 10747 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10748 .voltage = {1700, 2000}, 10749 }, 10750 10751 { 10752 .vendor = "Micron/Numonyx/ST", 10753 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 10754 .bustype = BUS_SPI, 10755 .manufacture_id = ST_ID, 10756 .model_id = ST_N25Q256__3E, 10757 .total_size = 32768, 10758 .page_size = 256, 10759 /* supports SFDP */ 10760 /* OTP: 64B total; read 0x4B, write 0x42 */ 10761 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10762 .tested = TEST_UNTESTED, 10763 .probe = probe_spi_rdid, 10764 .probe_timing = TIMING_ZERO, 10765 .block_erasers = 10766 { 10767 { 10768 .eraseblocks = { {4 * 1024, 8192} }, 10769 .block_erase = spi_block_erase_21, 10770 }, { 10771 .eraseblocks = { {4 * 1024, 8192} }, 10772 .block_erase = spi_block_erase_20, 10773 }, { 10774 .eraseblocks = { {64 * 1024, 512} }, 10775 .block_erase = spi_block_erase_dc, 10776 }, { 10777 .eraseblocks = { {64 * 1024, 512} }, 10778 .block_erase = spi_block_erase_d8, 10779 }, { 10780 .eraseblocks = { {32768 * 1024, 1} }, 10781 .block_erase = spi_block_erase_c7, 10782 } 10783 }, 10784 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10785 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10786 .write = spi_chip_write_256, /* Multi I/O supported */ 10787 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10788 .voltage = {2700, 3600}, 10789 }, 10790 10791 { 10792 .vendor = "Micron/Numonyx/ST", 10793 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */ 10794 .bustype = BUS_SPI, 10795 .manufacture_id = ST_ID, 10796 .model_id = ST_N25Q512__1G, 10797 .total_size = 65536, 10798 .page_size = 256, 10799 /* supports SFDP */ 10800 /* OTP: 64B total; read 0x4B, write 0x42 */ 10801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10802 .tested = TEST_UNTESTED, 10803 .probe = probe_spi_rdid, 10804 .probe_timing = TIMING_ZERO, 10805 .block_erasers = 10806 { 10807 { 10808 .eraseblocks = { {4 * 1024, 16384} }, 10809 .block_erase = spi_block_erase_21, 10810 }, { 10811 .eraseblocks = { {4 * 1024, 16384} }, 10812 .block_erase = spi_block_erase_20, 10813 }, { 10814 .eraseblocks = { {64 * 1024, 1024} }, 10815 .block_erase = spi_block_erase_dc, 10816 }, { 10817 .eraseblocks = { {64 * 1024, 1024} }, 10818 .block_erase = spi_block_erase_d8, 10819 }, { 10820 .eraseblocks = { {32768 * 1024, 2} }, 10821 .block_erase = spi_block_erase_c4, 10822 } 10823 }, 10824 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10825 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10826 .write = spi_chip_write_256, /* Multi I/O supported */ 10827 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10828 .voltage = {1700, 2000}, 10829 }, 10830 10831 { 10832 .vendor = "Micron/Numonyx/ST", 10833 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ 10834 .bustype = BUS_SPI, 10835 .manufacture_id = ST_ID, 10836 .model_id = ST_N25Q512__3G, 10837 .total_size = 65536, 10838 .page_size = 256, 10839 /* supports SFDP */ 10840 /* OTP: 64B total; read 0x4B, write 0x42 */ 10841 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10842 .tested = TEST_OK_PREW, 10843 .probe = probe_spi_rdid, 10844 .probe_timing = TIMING_ZERO, 10845 .block_erasers = 10846 { 10847 { 10848 .eraseblocks = { {4 * 1024, 16384} }, 10849 .block_erase = spi_block_erase_21, 10850 }, { 10851 .eraseblocks = { {4 * 1024, 16384} }, 10852 .block_erase = spi_block_erase_20, 10853 }, { 10854 .eraseblocks = { {64 * 1024, 1024} }, 10855 .block_erase = spi_block_erase_dc, 10856 }, { 10857 .eraseblocks = { {64 * 1024, 1024} }, 10858 .block_erase = spi_block_erase_d8, 10859 }, { 10860 .eraseblocks = { {32768 * 1024, 2} }, 10861 .block_erase = spi_block_erase_c4, 10862 } 10863 }, 10864 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10865 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10866 .write = spi_chip_write_256, /* Multi I/O supported */ 10867 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10868 .voltage = {2700, 3600}, 10869 }, 10870 10871 { 10872 .vendor = "Micron", 10873 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 10874 .bustype = BUS_SPI, 10875 .manufacture_id = ST_ID, 10876 .model_id = ST_N25Q00A__3G, 10877 .total_size = 131072, 10878 .page_size = 256, 10879 /* supports SFDP */ 10880 /* OTP: 64B total; read 0x4B, write 0x42 */ 10881 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10882 .tested = TEST_OK_PREW, 10883 .probe = probe_spi_rdid, 10884 .probe_timing = TIMING_ZERO, 10885 .block_erasers = 10886 { 10887 { 10888 .eraseblocks = { {4 * 1024, 32768} }, 10889 .block_erase = spi_block_erase_21, 10890 }, { 10891 .eraseblocks = { {4 * 1024, 32768} }, 10892 .block_erase = spi_block_erase_20, 10893 }, { 10894 .eraseblocks = { {32 * 1024, 4096} }, 10895 .block_erase = spi_block_erase_5c, 10896 }, { 10897 .eraseblocks = { {32 * 1024, 4096} }, 10898 .block_erase = spi_block_erase_52, 10899 }, { 10900 .eraseblocks = { {64 * 1024, 2048} }, 10901 .block_erase = spi_block_erase_dc, 10902 }, { 10903 .eraseblocks = { {64 * 1024, 2048} }, 10904 .block_erase = spi_block_erase_d8, 10905 }, { 10906 .eraseblocks = { {65536 * 1024, 2} }, 10907 .block_erase = spi_block_erase_c4, 10908 } 10909 }, 10910 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10911 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10912 .write = spi_chip_write_256, /* Multi I/O supported */ 10913 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10914 .voltage = {2700, 3600}, 10915 }, 10916 10917 { 10918 .vendor = "Micron", 10919 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 10920 .bustype = BUS_SPI, 10921 .manufacture_id = ST_ID, 10922 .model_id = ST_N25Q00A__1G, 10923 .total_size = 131072, 10924 .page_size = 256, 10925 /* supports SFDP */ 10926 /* OTP: 64B total; read 0x4B, write 0x42 */ 10927 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10928 .tested = TEST_UNTESTED, 10929 .probe = probe_spi_rdid, 10930 .probe_timing = TIMING_ZERO, 10931 .block_erasers = 10932 { 10933 { 10934 .eraseblocks = { {4 * 1024, 32768} }, 10935 .block_erase = spi_block_erase_21, 10936 }, { 10937 .eraseblocks = { {4 * 1024, 32768} }, 10938 .block_erase = spi_block_erase_20, 10939 }, { 10940 .eraseblocks = { {32 * 1024, 4096} }, 10941 .block_erase = spi_block_erase_5c, 10942 }, { 10943 .eraseblocks = { {32 * 1024, 4096} }, 10944 .block_erase = spi_block_erase_52, 10945 }, { 10946 .eraseblocks = { {64 * 1024, 2048} }, 10947 .block_erase = spi_block_erase_dc, 10948 }, { 10949 .eraseblocks = { {64 * 1024, 2048} }, 10950 .block_erase = spi_block_erase_d8, 10951 }, { 10952 .eraseblocks = { {65536 * 1024, 2} }, 10953 .block_erase = spi_block_erase_c4, 10954 } 10955 }, 10956 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 10957 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 10958 .write = spi_chip_write_256, /* Multi I/O supported */ 10959 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 10960 .voltage = {1700, 2000}, 10961 }, 10962 10963 { 10964 .vendor = "Micron", 10965 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 10966 .bustype = BUS_SPI, 10967 .manufacture_id = ST_ID, 10968 .model_id = ST_MT25QL02G, 10969 .total_size = 262144, 10970 .page_size = 256, 10971 /* supports SFDP */ 10972 /* OTP: 64B total; read 0x4B, write 0x42 */ 10973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 10974 .tested = TEST_UNTESTED, 10975 .probe = probe_spi_rdid, 10976 .probe_timing = TIMING_ZERO, 10977 .block_erasers = 10978 { 10979 { 10980 .eraseblocks = { {4 * 1024, 65536} }, 10981 .block_erase = spi_block_erase_21, 10982 }, { 10983 .eraseblocks = { {4 * 1024, 65536} }, 10984 .block_erase = spi_block_erase_20, 10985 }, { 10986 .eraseblocks = { {32 * 1024, 8192} }, 10987 .block_erase = spi_block_erase_5c, 10988 }, { 10989 .eraseblocks = { {32 * 1024, 8192} }, 10990 .block_erase = spi_block_erase_52, 10991 }, { 10992 .eraseblocks = { {64 * 1024, 4096} }, 10993 .block_erase = spi_block_erase_dc, 10994 }, { 10995 .eraseblocks = { {64 * 1024, 4096} }, 10996 .block_erase = spi_block_erase_d8, 10997 }, { 10998 .eraseblocks = { {65536 * 1024, 4} }, 10999 .block_erase = spi_block_erase_c4, 11000 } 11001 }, 11002 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11003 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11004 .write = spi_chip_write_256, /* Multi I/O supported */ 11005 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11006 .voltage = {2700, 3600}, 11007 }, 11008 11009 { 11010 .vendor = "Micron", 11011 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 11012 .bustype = BUS_SPI, 11013 .manufacture_id = ST_ID, 11014 .model_id = ST_MT25QU02G, 11015 .total_size = 262144, 11016 .page_size = 256, 11017 /* supports SFDP */ 11018 /* OTP: 64B total; read 0x4B, write 0x42 */ 11019 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11020 .tested = TEST_UNTESTED, 11021 .probe = probe_spi_rdid, 11022 .probe_timing = TIMING_ZERO, 11023 .block_erasers = 11024 { 11025 { 11026 .eraseblocks = { {4 * 1024, 65536} }, 11027 .block_erase = spi_block_erase_21, 11028 }, { 11029 .eraseblocks = { {4 * 1024, 65536} }, 11030 .block_erase = spi_block_erase_20, 11031 }, { 11032 .eraseblocks = { {32 * 1024, 8192} }, 11033 .block_erase = spi_block_erase_5c, 11034 }, { 11035 .eraseblocks = { {32 * 1024, 8192} }, 11036 .block_erase = spi_block_erase_52, 11037 }, { 11038 .eraseblocks = { {64 * 1024, 4096} }, 11039 .block_erase = spi_block_erase_dc, 11040 }, { 11041 .eraseblocks = { {64 * 1024, 4096} }, 11042 .block_erase = spi_block_erase_d8, 11043 }, { 11044 .eraseblocks = { {65536 * 1024, 4} }, 11045 .block_erase = spi_block_erase_c4, 11046 } 11047 }, 11048 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11049 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11050 .write = spi_chip_write_256, /* Multi I/O supported */ 11051 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11052 .voltage = {1700, 2000}, 11053 }, 11054 11055 { 11056 .vendor = "Micron", 11057 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 11058 .bustype = BUS_SPI, 11059 .manufacture_id = ST_ID, 11060 .model_id = ST_N25Q128__1E, 11061 .total_size = 16384, 11062 .page_size = 256, 11063 /* supports SFDP */ 11064 /* OTP: 64B total; read 0x4B, write 0x42 */ 11065 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11066 .tested = TEST_UNTESTED, 11067 .probe = probe_spi_rdid, 11068 .probe_timing = TIMING_ZERO, 11069 .block_erasers = 11070 { 11071 { 11072 .eraseblocks = { {4 * 1024, 4096} }, 11073 .block_erase = spi_block_erase_20, 11074 }, { 11075 .eraseblocks = { {32 * 1024, 512} }, 11076 .block_erase = spi_block_erase_52, 11077 }, { 11078 .eraseblocks = { {64 * 1024, 256} }, 11079 .block_erase = spi_block_erase_d8, 11080 }, { 11081 .eraseblocks = { {16384 * 1024, 1} }, 11082 .block_erase = spi_block_erase_c7, 11083 }, { 11084 .eraseblocks = { {16384 * 1024, 1} }, 11085 .block_erase = spi_block_erase_60, 11086 } 11087 }, 11088 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11089 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11090 .write = spi_chip_write_256, /* Multi I/O supported */ 11091 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11092 .voltage = {1700, 2000}, 11093 }, 11094 11095 { 11096 .vendor = "Micron", 11097 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 11098 .bustype = BUS_SPI, 11099 .manufacture_id = ST_ID, 11100 .model_id = ST_N25Q128__3E, 11101 .total_size = 16384, 11102 .page_size = 256, 11103 /* supports SFDP */ 11104 /* OTP: 64B total; read 0x4B, write 0x42 */ 11105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11106 .tested = TEST_UNTESTED, 11107 .probe = probe_spi_rdid, 11108 .probe_timing = TIMING_ZERO, 11109 .block_erasers = 11110 { 11111 { 11112 .eraseblocks = { {4 * 1024, 4096} }, 11113 .block_erase = spi_block_erase_20, 11114 }, { 11115 .eraseblocks = { {32 * 1024, 512} }, 11116 .block_erase = spi_block_erase_52, 11117 }, { 11118 .eraseblocks = { {64 * 1024, 256} }, 11119 .block_erase = spi_block_erase_d8, 11120 }, { 11121 .eraseblocks = { {16384 * 1024, 1} }, 11122 .block_erase = spi_block_erase_c7, 11123 }, { 11124 .eraseblocks = { {16384 * 1024, 1} }, 11125 .block_erase = spi_block_erase_60, 11126 } 11127 }, 11128 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11129 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11130 .write = spi_chip_write_256, /* Multi I/O supported */ 11131 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11132 .voltage = {2700, 3600}, 11133 }, 11134 11135 { 11136 .vendor = "Micron", 11137 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 11138 .bustype = BUS_SPI, 11139 .manufacture_id = ST_ID, 11140 .model_id = ST_N25Q256__3E, 11141 .total_size = 32768, 11142 .page_size = 256, 11143 /* supports SFDP */ 11144 /* OTP: 64B total; read 0x4B, write 0x42 */ 11145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11146 .tested = TEST_UNTESTED, 11147 .probe = probe_spi_rdid, 11148 .probe_timing = TIMING_ZERO, 11149 .block_erasers = 11150 { 11151 { 11152 .eraseblocks = { {4 * 1024, 8192} }, 11153 .block_erase = spi_block_erase_21, 11154 }, { 11155 .eraseblocks = { {4 * 1024, 8192} }, 11156 .block_erase = spi_block_erase_20, 11157 }, { 11158 .eraseblocks = { {32 * 1024, 1024} }, 11159 .block_erase = spi_block_erase_5c, 11160 }, { 11161 .eraseblocks = { {32 * 1024, 1024} }, 11162 .block_erase = spi_block_erase_52, 11163 }, { 11164 .eraseblocks = { {64 * 1024, 512} }, 11165 .block_erase = spi_block_erase_dc, 11166 }, { 11167 .eraseblocks = { {64 * 1024, 512} }, 11168 .block_erase = spi_block_erase_d8, 11169 }, { 11170 .eraseblocks = { {32768 * 1024, 1} }, 11171 .block_erase = spi_block_erase_c7, 11172 }, { 11173 .eraseblocks = { {32768 * 1024, 1} }, 11174 .block_erase = spi_block_erase_60, 11175 } 11176 }, 11177 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11178 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11179 .write = spi_chip_write_256, /* Multi I/O supported */ 11180 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11181 .voltage = {2700, 3600}, 11182 }, 11183 11184 { 11185 .vendor = "Micron", 11186 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 11187 .bustype = BUS_SPI, 11188 .manufacture_id = ST_ID, 11189 .model_id = ST_N25Q256__1E, 11190 .total_size = 32768, 11191 .page_size = 256, 11192 /* supports SFDP */ 11193 /* OTP: 64B total; read 0x4B, write 0x42 */ 11194 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11195 .tested = TEST_UNTESTED, 11196 .probe = probe_spi_rdid, 11197 .probe_timing = TIMING_ZERO, 11198 .block_erasers = 11199 { 11200 { 11201 .eraseblocks = { {4 * 1024, 8192} }, 11202 .block_erase = spi_block_erase_21, 11203 }, { 11204 .eraseblocks = { {4 * 1024, 8192} }, 11205 .block_erase = spi_block_erase_20, 11206 }, { 11207 .eraseblocks = { {32 * 1024, 1024} }, 11208 .block_erase = spi_block_erase_5c, 11209 }, { 11210 .eraseblocks = { {32 * 1024, 1024} }, 11211 .block_erase = spi_block_erase_52, 11212 }, { 11213 .eraseblocks = { {64 * 1024, 512} }, 11214 .block_erase = spi_block_erase_dc, 11215 }, { 11216 .eraseblocks = { {64 * 1024, 512} }, 11217 .block_erase = spi_block_erase_d8, 11218 }, { 11219 .eraseblocks = { {32768 * 1024, 1} }, 11220 .block_erase = spi_block_erase_c7, 11221 }, { 11222 .eraseblocks = { {32768 * 1024, 1} }, 11223 .block_erase = spi_block_erase_60, 11224 } 11225 }, 11226 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11227 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11228 .write = spi_chip_write_256, /* Multi I/O supported */ 11229 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11230 .voltage = {1700, 2000}, 11231 }, 11232 11233 { 11234 .vendor = "Micron", 11235 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 11236 .bustype = BUS_SPI, 11237 .manufacture_id = ST_ID, 11238 .model_id = ST_N25Q512__3G, 11239 .total_size = 65536, 11240 .page_size = 256, 11241 /* supports SFDP */ 11242 /* OTP: 64B total; read 0x4B, write 0x42 */ 11243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11244 .tested = TEST_OK_PREW, 11245 .probe = probe_spi_rdid, 11246 .probe_timing = TIMING_ZERO, 11247 .block_erasers = 11248 { 11249 { 11250 .eraseblocks = { {4 * 1024, 16384} }, 11251 .block_erase = spi_block_erase_21, 11252 }, { 11253 .eraseblocks = { {4 * 1024, 16384} }, 11254 .block_erase = spi_block_erase_20, 11255 }, { 11256 .eraseblocks = { {32 * 1024, 2048} }, 11257 .block_erase = spi_block_erase_5c, 11258 }, { 11259 .eraseblocks = { {32 * 1024, 2048} }, 11260 .block_erase = spi_block_erase_52, 11261 }, { 11262 .eraseblocks = { {64 * 1024, 1024} }, 11263 .block_erase = spi_block_erase_dc, 11264 }, { 11265 .eraseblocks = { {64 * 1024, 1024} }, 11266 .block_erase = spi_block_erase_d8, 11267 }, { 11268 .eraseblocks = { {65536 * 1024, 1} }, 11269 .block_erase = spi_block_erase_c7, 11270 }, { 11271 .eraseblocks = { {65536 * 1024, 1} }, 11272 .block_erase = spi_block_erase_60, 11273 } 11274 }, 11275 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11276 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11277 .write = spi_chip_write_256, /* Multi I/O supported */ 11278 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11279 .voltage = {2700, 3600}, 11280 }, 11281 11282 { 11283 .vendor = "Micron", 11284 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 11285 .bustype = BUS_SPI, 11286 .manufacture_id = ST_ID, 11287 .model_id = ST_N25Q512__1G, 11288 .total_size = 65536, 11289 .page_size = 256, 11290 /* supports SFDP */ 11291 /* OTP: 64B total; read 0x4B, write 0x42 */ 11292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 11293 .tested = TEST_OK_PREW, 11294 .probe = probe_spi_rdid, 11295 .probe_timing = TIMING_ZERO, 11296 .block_erasers = 11297 { 11298 { 11299 .eraseblocks = { {4 * 1024, 16384} }, 11300 .block_erase = spi_block_erase_21, 11301 }, { 11302 .eraseblocks = { {4 * 1024, 16384} }, 11303 .block_erase = spi_block_erase_20, 11304 }, { 11305 .eraseblocks = { {32 * 1024, 2048} }, 11306 .block_erase = spi_block_erase_5c, 11307 }, { 11308 .eraseblocks = { {32 * 1024, 2048} }, 11309 .block_erase = spi_block_erase_52, 11310 }, { 11311 .eraseblocks = { {64 * 1024, 1024} }, 11312 .block_erase = spi_block_erase_dc, 11313 }, { 11314 .eraseblocks = { {64 * 1024, 1024} }, 11315 .block_erase = spi_block_erase_d8, 11316 }, { 11317 .eraseblocks = { {65536 * 1024, 1} }, 11318 .block_erase = spi_block_erase_c7, 11319 }, { 11320 .eraseblocks = { {65536 * 1024, 1} }, 11321 .block_erase = spi_block_erase_60, 11322 } 11323 }, 11324 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */ 11325 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */ 11326 .write = spi_chip_write_256, /* Multi I/O supported */ 11327 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11328 .voltage = {1700, 2000}, 11329 }, 11330 11331 { 11332 .vendor = "MoselVitelic", 11333 .name = "V29C51000B", 11334 .bustype = BUS_PARALLEL, 11335 .manufacture_id = SYNCMOS_MVC_ID, 11336 .model_id = MVC_V29C51000B, 11337 .total_size = 64, 11338 .page_size = 512, 11339 .feature_bits = FEATURE_EITHER_RESET, 11340 .tested = TEST_UNTESTED, 11341 .probe = probe_jedec, 11342 .probe_timing = TIMING_ZERO, 11343 .block_erasers = 11344 { 11345 { 11346 .eraseblocks = { {512, 128} }, 11347 .block_erase = erase_sector_jedec, 11348 }, { 11349 .eraseblocks = { {64 * 1024, 1} }, 11350 .block_erase = erase_chip_block_jedec, 11351 }, 11352 }, 11353 .write = write_jedec_1, 11354 .read = read_memmapped, 11355 .voltage = {4500, 5500}, 11356 }, 11357 11358 { 11359 .vendor = "MoselVitelic", 11360 .name = "V29C51000T", 11361 .bustype = BUS_PARALLEL, 11362 .manufacture_id = SYNCMOS_MVC_ID, 11363 .model_id = MVC_V29C51000T, 11364 .total_size = 64, 11365 .page_size = 512, 11366 .feature_bits = FEATURE_EITHER_RESET, 11367 .tested = TEST_UNTESTED, 11368 .probe = probe_jedec, 11369 .probe_timing = TIMING_ZERO, 11370 .block_erasers = 11371 { 11372 { 11373 .eraseblocks = { {512, 128} }, 11374 .block_erase = erase_sector_jedec, 11375 }, { 11376 .eraseblocks = { {64 * 1024, 1} }, 11377 .block_erase = erase_chip_block_jedec, 11378 }, 11379 }, 11380 .write = write_jedec_1, 11381 .read = read_memmapped, 11382 .voltage = {4500, 5500}, 11383 }, 11384 11385 { 11386 .vendor = "MoselVitelic", 11387 .name = "V29C51400B", 11388 .bustype = BUS_PARALLEL, 11389 .manufacture_id = SYNCMOS_MVC_ID, 11390 .model_id = MVC_V29C51400B, 11391 .total_size = 512, 11392 .page_size = 1024, 11393 .feature_bits = FEATURE_EITHER_RESET, 11394 .tested = TEST_UNTESTED, 11395 .probe = probe_jedec, 11396 .probe_timing = TIMING_ZERO, 11397 .block_erasers = 11398 { 11399 { 11400 .eraseblocks = { {1024, 512} }, 11401 .block_erase = erase_sector_jedec, 11402 }, { 11403 .eraseblocks = { {512 * 1024, 1} }, 11404 .block_erase = erase_chip_block_jedec, 11405 }, 11406 }, 11407 .write = write_jedec_1, 11408 .read = read_memmapped, 11409 .voltage = {4500, 5500}, 11410 }, 11411 11412 { 11413 .vendor = "MoselVitelic", 11414 .name = "V29C51400T", 11415 .bustype = BUS_PARALLEL, 11416 .manufacture_id = SYNCMOS_MVC_ID, 11417 .model_id = MVC_V29C51400T, 11418 .total_size = 512, 11419 .page_size = 1024, 11420 .feature_bits = FEATURE_EITHER_RESET, 11421 .tested = TEST_UNTESTED, 11422 .probe = probe_jedec, 11423 .probe_timing = TIMING_ZERO, 11424 .block_erasers = 11425 { 11426 { 11427 .eraseblocks = { {1024, 512} }, 11428 .block_erase = erase_sector_jedec, 11429 }, { 11430 .eraseblocks = { {512 * 1024, 1} }, 11431 .block_erase = erase_chip_block_jedec, 11432 }, 11433 }, 11434 .write = write_jedec_1, 11435 .read = read_memmapped, 11436 .voltage = {4500, 5500}, 11437 }, 11438 11439 { 11440 .vendor = "MoselVitelic", 11441 .name = "V29LC51000", 11442 .bustype = BUS_PARALLEL, 11443 .manufacture_id = SYNCMOS_MVC_ID, 11444 .model_id = MVC_V29LC51000, 11445 .total_size = 64, 11446 .page_size = 512, 11447 .feature_bits = FEATURE_EITHER_RESET, 11448 .tested = TEST_UNTESTED, 11449 .probe = probe_jedec, 11450 .probe_timing = TIMING_ZERO, 11451 .block_erasers = 11452 { 11453 { 11454 .eraseblocks = { {512, 128} }, 11455 .block_erase = erase_sector_jedec, 11456 }, { 11457 .eraseblocks = { {64 * 1024, 1} }, 11458 .block_erase = erase_chip_block_jedec, 11459 }, 11460 }, 11461 .write = write_jedec_1, 11462 .read = read_memmapped, 11463 .voltage = {4500, 5500}, 11464 }, 11465 11466 { 11467 .vendor = "MoselVitelic", 11468 .name = "V29LC51001", 11469 .bustype = BUS_PARALLEL, 11470 .manufacture_id = SYNCMOS_MVC_ID, 11471 .model_id = MVC_V29LC51001, 11472 .total_size = 128, 11473 .page_size = 512, 11474 .feature_bits = FEATURE_EITHER_RESET, 11475 .tested = TEST_UNTESTED, 11476 .probe = probe_jedec, 11477 .probe_timing = TIMING_ZERO, 11478 .block_erasers = 11479 { 11480 { 11481 .eraseblocks = { {512, 256} }, 11482 .block_erase = erase_sector_jedec, 11483 }, { 11484 .eraseblocks = { {128 * 1024, 1} }, 11485 .block_erase = erase_chip_block_jedec, 11486 }, 11487 }, 11488 .write = write_jedec_1, 11489 .read = read_memmapped, 11490 .voltage = {4500, 5500}, 11491 }, 11492 11493 { 11494 .vendor = "MoselVitelic", 11495 .name = "V29LC51002", 11496 .bustype = BUS_PARALLEL, 11497 .manufacture_id = SYNCMOS_MVC_ID, 11498 .model_id = MVC_V29LC51002, 11499 .total_size = 256, 11500 .page_size = 512, 11501 .feature_bits = FEATURE_EITHER_RESET, 11502 .tested = TEST_UNTESTED, 11503 .probe = probe_jedec, 11504 .probe_timing = TIMING_ZERO, 11505 .block_erasers = 11506 { 11507 { 11508 .eraseblocks = { {512, 512} }, 11509 .block_erase = erase_sector_jedec, 11510 }, { 11511 .eraseblocks = { {256 * 1024, 1} }, 11512 .block_erase = erase_chip_block_jedec, 11513 }, 11514 }, 11515 .write = write_jedec_1, 11516 .read = read_memmapped, 11517 .voltage = {4500, 5500}, 11518 }, 11519 11520 { 11521 .vendor = "Nantronics", 11522 .name = "N25S10", 11523 .bustype = BUS_SPI, 11524 .manufacture_id = NANTRONICS_ID_NOPREFIX, 11525 .model_id = NANTRONICS_N25S10, 11526 .total_size = 128, 11527 .page_size = 256, 11528 .feature_bits = FEATURE_WRSR_WREN, 11529 .tested = TEST_UNTESTED, 11530 .probe = probe_spi_rdid, 11531 .probe_timing = TIMING_ZERO, 11532 .block_erasers = 11533 { 11534 { 11535 .eraseblocks = { {4 * 1024, 32} }, 11536 .block_erase = spi_block_erase_20, 11537 }, { 11538 .eraseblocks = { {4 * 1024, 32} }, 11539 .block_erase = spi_block_erase_d7, 11540 }, { 11541 .eraseblocks = { {32 * 1024, 4} }, 11542 .block_erase = spi_block_erase_52, 11543 }, { 11544 .eraseblocks = { {64 * 1024, 2} }, 11545 .block_erase = spi_block_erase_d8, 11546 }, { 11547 .eraseblocks = { {128 * 1024, 1} }, 11548 .block_erase = spi_block_erase_60, 11549 }, { 11550 .eraseblocks = { {128 * 1024, 1} }, 11551 .block_erase = spi_block_erase_c7, 11552 } 11553 }, 11554 .printlock = spi_prettyprint_status_register_bp3_srwd, 11555 .unlock = spi_disable_blockprotect_bp3_srwd, 11556 .write = spi_chip_write_256, 11557 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 11558 .voltage = {2700, 3600}, 11559 }, 11560 11561 { 11562 .vendor = "Nantronics", 11563 .name = "N25S16", 11564 .bustype = BUS_SPI, 11565 .manufacture_id = NANTRONICS_ID_NOPREFIX, 11566 .model_id = NANTRONICS_N25S16, 11567 .total_size = 2048, 11568 .page_size = 256, 11569 .feature_bits = FEATURE_WRSR_WREN, 11570 .tested = TEST_UNTESTED, 11571 .probe = probe_spi_rdid, 11572 .probe_timing = TIMING_ZERO, 11573 .block_erasers = 11574 { 11575 { 11576 .eraseblocks = { {4 * 1024, 512} }, 11577 .block_erase = spi_block_erase_20, 11578 }, { 11579 .eraseblocks = { {64 * 1024, 32} }, 11580 .block_erase = spi_block_erase_d8, 11581 }, { 11582 .eraseblocks = { {2048 * 1024, 1} }, 11583 .block_erase = spi_block_erase_60, 11584 }, { 11585 .eraseblocks = { {2048 * 1024, 1} }, 11586 .block_erase = spi_block_erase_c7, 11587 } 11588 }, 11589 .printlock = spi_prettyprint_status_register_bp3_srwd, 11590 .unlock = spi_disable_blockprotect_bp3_srwd, 11591 .write = spi_chip_write_256, 11592 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 11593 .voltage = {2700, 3600}, 11594 }, 11595 11596 { 11597 .vendor = "Nantronics", 11598 .name = "N25S20", 11599 .bustype = BUS_SPI, 11600 .manufacture_id = NANTRONICS_ID_NOPREFIX, 11601 .model_id = NANTRONICS_N25S20, 11602 .total_size = 256, 11603 .page_size = 256, 11604 .feature_bits = FEATURE_WRSR_WREN, 11605 .tested = TEST_UNTESTED, 11606 .probe = probe_spi_rdid, 11607 .probe_timing = TIMING_ZERO, 11608 .block_erasers = 11609 { 11610 { 11611 .eraseblocks = { {4 * 1024, 64} }, 11612 .block_erase = spi_block_erase_20, 11613 }, { 11614 .eraseblocks = { {4 * 1024, 64} }, 11615 .block_erase = spi_block_erase_d7, 11616 }, { 11617 .eraseblocks = { {32 * 1024, 8} }, 11618 .block_erase = spi_block_erase_52, 11619 }, { 11620 .eraseblocks = { {64 * 1024, 4} }, 11621 .block_erase = spi_block_erase_d8, 11622 }, { 11623 .eraseblocks = { {256 * 1024, 1} }, 11624 .block_erase = spi_block_erase_60, 11625 }, { 11626 .eraseblocks = { {256 * 1024, 1} }, 11627 .block_erase = spi_block_erase_c7, 11628 } 11629 }, 11630 .printlock = spi_prettyprint_status_register_bp3_srwd, 11631 .unlock = spi_disable_blockprotect_bp3_srwd, 11632 .write = spi_chip_write_256, 11633 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 11634 .voltage = {2700, 3600}, 11635 }, 11636 11637 { 11638 .vendor = "Nantronics", 11639 .name = "N25S40", 11640 .bustype = BUS_SPI, 11641 .manufacture_id = NANTRONICS_ID_NOPREFIX, 11642 .model_id = NANTRONICS_N25S40, 11643 .total_size = 512, 11644 .page_size = 256, 11645 .feature_bits = FEATURE_WRSR_WREN, 11646 .tested = TEST_UNTESTED, 11647 .probe = probe_spi_rdid, 11648 .probe_timing = TIMING_ZERO, 11649 .block_erasers = 11650 { 11651 { 11652 .eraseblocks = { {4 * 1024, 128} }, 11653 .block_erase = spi_block_erase_20, 11654 }, { 11655 .eraseblocks = { {4 * 1024, 128} }, 11656 .block_erase = spi_block_erase_d7, 11657 }, { 11658 .eraseblocks = { {32 * 1024, 16} }, 11659 .block_erase = spi_block_erase_52, 11660 }, { 11661 .eraseblocks = { {64 * 1024, 8} }, 11662 .block_erase = spi_block_erase_d8, 11663 }, { 11664 .eraseblocks = { {512 * 1024, 1} }, 11665 .block_erase = spi_block_erase_60, 11666 }, { 11667 .eraseblocks = { {512 * 1024, 1} }, 11668 .block_erase = spi_block_erase_c7, 11669 } 11670 }, 11671 .printlock = spi_prettyprint_status_register_bp3_srwd, 11672 .unlock = spi_disable_blockprotect_bp3_srwd, 11673 .write = spi_chip_write_256, 11674 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 11675 .voltage = {2700, 3600}, 11676 }, 11677 11678 { 11679 .vendor = "Nantronics", 11680 .name = "N25S80", 11681 .bustype = BUS_SPI, 11682 .manufacture_id = NANTRONICS_ID_NOPREFIX, 11683 .model_id = NANTRONICS_N25S80, 11684 .total_size = 1024, 11685 .page_size = 256, 11686 .feature_bits = FEATURE_WRSR_WREN, 11687 .tested = TEST_UNTESTED, 11688 .probe = probe_spi_rdid, 11689 .probe_timing = TIMING_ZERO, 11690 .block_erasers = 11691 { 11692 { 11693 .eraseblocks = { {4 * 1024, 256} }, 11694 .block_erase = spi_block_erase_20, 11695 }, { 11696 .eraseblocks = { {32 * 1024, 32} }, 11697 .block_erase = spi_block_erase_52, 11698 }, { 11699 .eraseblocks = { {64 * 1024, 16} }, 11700 .block_erase = spi_block_erase_d8, 11701 }, { 11702 .eraseblocks = { {1024 * 1024, 1} }, 11703 .block_erase = spi_block_erase_60, 11704 }, { 11705 .eraseblocks = { {1024 * 1024, 1} }, 11706 .block_erase = spi_block_erase_c7, 11707 } 11708 }, 11709 .printlock = spi_prettyprint_status_register_bp3_srwd, 11710 .unlock = spi_disable_blockprotect_bp3_srwd, 11711 .write = spi_chip_write_256, 11712 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 11713 .voltage = {2700, 3600}, 11714 }, 11715 11716 { 11717 .vendor = "PMC", 11718 .name = "Pm25LD010(C)", 11719 .bustype = BUS_SPI, 11720 .manufacture_id = PMC_ID, 11721 .model_id = PMC_PM25LD010, 11722 .total_size = 128, 11723 .page_size = 256, 11724 .feature_bits = FEATURE_WRSR_WREN, 11725 .tested = TEST_OK_PREW, 11726 .probe = probe_spi_rdid, 11727 .probe_timing = TIMING_ZERO, 11728 .block_erasers = 11729 { 11730 { 11731 .eraseblocks = { {4 * 1024, 32} }, 11732 .block_erase = spi_block_erase_20, 11733 }, { 11734 .eraseblocks = { {4 * 1024, 32} }, 11735 .block_erase = spi_block_erase_d7, 11736 }, { 11737 .eraseblocks = { {32 * 1024, 4} }, 11738 .block_erase = spi_block_erase_d8, 11739 }, { 11740 .eraseblocks = { {128 * 1024, 1} }, 11741 .block_erase = spi_block_erase_60, 11742 }, { 11743 .eraseblocks = { {128 * 1024, 1} }, 11744 .block_erase = spi_block_erase_c7, 11745 } 11746 }, 11747 .printlock = spi_prettyprint_status_register_bp2_srwd, 11748 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ 11749 .write = spi_chip_write_256, 11750 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 11751 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */ 11752 }, 11753 11754 { 11755 .vendor = "PMC", 11756 .name = "Pm25LD020(C)", 11757 .bustype = BUS_SPI, 11758 .manufacture_id = PMC_ID, 11759 .model_id = PMC_PM25LD020, 11760 .total_size = 256, 11761 .page_size = 256, 11762 .feature_bits = FEATURE_WRSR_WREN, 11763 .tested = TEST_OK_PREW, 11764 .probe = probe_spi_rdid, 11765 .probe_timing = TIMING_ZERO, 11766 .block_erasers = 11767 { 11768 { 11769 .eraseblocks = { {4 * 1024, 64} }, 11770 .block_erase = spi_block_erase_20, 11771 }, { 11772 .eraseblocks = { {4 * 1024, 64} }, 11773 .block_erase = spi_block_erase_d7, 11774 }, { 11775 .eraseblocks = { {64 * 1024, 4} }, 11776 .block_erase = spi_block_erase_d8, 11777 }, { 11778 .eraseblocks = { {256 * 1024, 1} }, 11779 .block_erase = spi_block_erase_60, 11780 }, { 11781 .eraseblocks = { {256 * 1024, 1} }, 11782 .block_erase = spi_block_erase_c7, 11783 } 11784 }, 11785 .printlock = spi_prettyprint_status_register_bp2_srwd, 11786 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ 11787 .write = spi_chip_write_256, 11788 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 11789 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */ 11790 }, 11791 11792 { 11793 .vendor = "PMC", 11794 .name = "Pm25LD040(C)", 11795 .bustype = BUS_SPI, 11796 .manufacture_id = PMC_ID, 11797 .model_id = PMC_PM25LV040, 11798 .total_size = 512, 11799 .page_size = 256, 11800 .feature_bits = FEATURE_WRSR_WREN, 11801 .tested = TEST_OK_PREW, 11802 .probe = probe_spi_rdid, 11803 .probe_timing = TIMING_ZERO, 11804 .block_erasers = 11805 { 11806 { 11807 .eraseblocks = { {4 * 1024, 128} }, 11808 .block_erase = spi_block_erase_20, 11809 }, { 11810 .eraseblocks = { {4 * 1024, 128} }, 11811 .block_erase = spi_block_erase_d7, 11812 }, { 11813 .eraseblocks = { {64 * 1024, 8} }, 11814 .block_erase = spi_block_erase_d8, 11815 }, { 11816 .eraseblocks = { {512 * 1024, 1} }, 11817 .block_erase = spi_block_erase_60, 11818 }, { 11819 .eraseblocks = { {512 * 1024, 1} }, 11820 .block_erase = spi_block_erase_c7, 11821 } 11822 }, 11823 .printlock = spi_prettyprint_status_register_bp2_srwd, 11824 .unlock = spi_disable_blockprotect, 11825 .write = spi_chip_write_256, 11826 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 11827 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */ 11828 }, 11829 11830 { 11831 .vendor = "PMC", 11832 .name = "Pm25LD256C", 11833 .bustype = BUS_SPI, 11834 .manufacture_id = PMC_ID, 11835 .model_id = PMC_PM25LD256C, 11836 .total_size = 32, 11837 .page_size = 256, 11838 .feature_bits = FEATURE_WRSR_WREN, 11839 .tested = TEST_UNTESTED, 11840 .probe = probe_spi_rdid, 11841 .probe_timing = TIMING_ZERO, 11842 .block_erasers = 11843 { 11844 { 11845 .eraseblocks = { {4 * 1024, 8} }, 11846 .block_erase = spi_block_erase_20, 11847 }, { 11848 .eraseblocks = { {4 * 1024, 8} }, 11849 .block_erase = spi_block_erase_d7, 11850 }, { 11851 .eraseblocks = { {32 * 1024, 1} }, 11852 .block_erase = spi_block_erase_d8, 11853 }, { 11854 .eraseblocks = { {32 * 1024, 1} }, 11855 .block_erase = spi_block_erase_60, 11856 }, { 11857 .eraseblocks = { {32 * 1024, 1} }, 11858 .block_erase = spi_block_erase_c7, 11859 } 11860 }, 11861 .printlock = spi_prettyprint_status_register_bp2_srwd, 11862 .unlock = spi_disable_blockprotect, 11863 .write = spi_chip_write_256, 11864 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 11865 .voltage = {2700, 3600}, 11866 }, 11867 11868 { 11869 .vendor = "PMC", 11870 .name = "Pm25LD512(C)", 11871 .bustype = BUS_SPI, 11872 .manufacture_id = PMC_ID, 11873 .model_id = PMC_PM25LD512, 11874 .total_size = 64, 11875 .page_size = 256, 11876 .feature_bits = FEATURE_WRSR_WREN, 11877 .tested = TEST_OK_PREW, 11878 .probe = probe_spi_rdid, 11879 .probe_timing = TIMING_ZERO, 11880 .block_erasers = 11881 { 11882 { 11883 .eraseblocks = { {4 * 1024, 16} }, 11884 .block_erase = spi_block_erase_20, 11885 }, { 11886 .eraseblocks = { {4 * 1024, 16} }, 11887 .block_erase = spi_block_erase_d7, 11888 }, { 11889 .eraseblocks = { {32 * 1024, 2} }, 11890 .block_erase = spi_block_erase_d8, 11891 }, { 11892 .eraseblocks = { {64 * 1024, 1} }, 11893 .block_erase = spi_block_erase_60, 11894 }, { 11895 .eraseblocks = { {64 * 1024, 1} }, 11896 .block_erase = spi_block_erase_c7, 11897 } 11898 }, 11899 .printlock = spi_prettyprint_status_register_bp2_srwd, 11900 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */ 11901 .write = spi_chip_write_256, 11902 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */ 11903 .voltage = {2300, 3600}, 11904 }, 11905 11906 { 11907 .vendor = "PMC", 11908 .name = "Pm25LQ016", 11909 .bustype = BUS_SPI, 11910 .manufacture_id = PMC_ID, 11911 .model_id = PMC_PM25LQ016, 11912 .total_size = 2048, 11913 .page_size = 256, 11914 /* OTP: 256B total; read 0x4B, write 0xB1 */ 11915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11916 .tested = TEST_UNTESTED, 11917 .probe = probe_spi_rdid, 11918 .probe_timing = TIMING_ZERO, 11919 .block_erasers = 11920 { 11921 { 11922 .eraseblocks = { {4 * 1024, 512} }, 11923 .block_erase = spi_block_erase_20, 11924 }, { 11925 .eraseblocks = { {4 * 1024, 512} }, 11926 .block_erase = spi_block_erase_d7, 11927 }, { 11928 .eraseblocks = { {64 * 1024, 32} }, 11929 .block_erase = spi_block_erase_d8, 11930 }, { 11931 .eraseblocks = { {2048 * 1024, 1} }, 11932 .block_erase = spi_block_erase_60, 11933 }, { 11934 .eraseblocks = { {2048 * 1024, 1} }, 11935 .block_erase = spi_block_erase_c7, 11936 } 11937 }, 11938 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 11939 .unlock = spi_disable_blockprotect_bp3_srwd, 11940 .write = spi_chip_write_256, 11941 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 11942 .voltage = {2300, 3600}, 11943 }, 11944 11945 { 11946 .vendor = "PMC", 11947 .name = "Pm25LQ020", 11948 .bustype = BUS_SPI, 11949 .manufacture_id = PMC_ID, 11950 .model_id = PMC_PM25LQ020, 11951 .total_size = 256, 11952 .page_size = 256, 11953 /* OTP: 256B total; read 0x4B, write 0xB1 */ 11954 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11955 .tested = TEST_UNTESTED, 11956 .probe = probe_spi_rdid, 11957 .probe_timing = TIMING_ZERO, 11958 .block_erasers = 11959 { 11960 { 11961 .eraseblocks = { {4 * 1024, 64} }, 11962 .block_erase = spi_block_erase_20, 11963 }, { 11964 .eraseblocks = { {4 * 1024, 64} }, 11965 .block_erase = spi_block_erase_d7, 11966 }, { 11967 .eraseblocks = { {64 * 1024, 4} }, 11968 .block_erase = spi_block_erase_d8, 11969 }, { 11970 .eraseblocks = { {256 * 1024, 1} }, 11971 .block_erase = spi_block_erase_60, 11972 }, { 11973 .eraseblocks = { {256 * 1024, 1} }, 11974 .block_erase = spi_block_erase_c7, 11975 } 11976 }, 11977 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 11978 .unlock = spi_disable_blockprotect_bp3_srwd, 11979 .write = spi_chip_write_256, 11980 .read = spi_chip_read, 11981 .voltage = {2300, 3600}, 11982 }, 11983 11984 { 11985 .vendor = "PMC", 11986 .name = "Pm25LQ032C", 11987 .bustype = BUS_SPI, 11988 .manufacture_id = PMC_ID, 11989 .model_id = PMC_PM25LQ032C, 11990 .total_size = 4096, 11991 .page_size = 256, 11992 /* OTP: 64B total; read 0x4B, write 0xB1 */ 11993 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11994 .tested = TEST_OK_PREW, 11995 .probe = probe_spi_rdid, 11996 .probe_timing = TIMING_ZERO, 11997 .block_erasers = 11998 { 11999 { 12000 .eraseblocks = { {4 * 1024, 1024} }, 12001 .block_erase = spi_block_erase_20, 12002 }, { 12003 .eraseblocks = { {4 * 1024, 1024} }, 12004 .block_erase = spi_block_erase_d7, 12005 }, { 12006 .eraseblocks = { {64 * 1024, 64} }, 12007 .block_erase = spi_block_erase_d8, 12008 }, { 12009 .eraseblocks = { {4096 * 1024, 1} }, 12010 .block_erase = spi_block_erase_60, 12011 }, { 12012 .eraseblocks = { {4096 * 1024, 1} }, 12013 .block_erase = spi_block_erase_c7, 12014 } 12015 }, 12016 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 12017 .unlock = spi_disable_blockprotect_bp3_srwd, 12018 .write = spi_chip_write_256, 12019 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 12020 .voltage = {2700, 3600}, 12021 }, 12022 12023 { 12024 .vendor = "PMC", 12025 .name = "Pm25LQ040", 12026 .bustype = BUS_SPI, 12027 .manufacture_id = PMC_ID, 12028 .model_id = PMC_PM25LQ040, 12029 .total_size = 512, 12030 .page_size = 256, 12031 /* OTP: 256B total; read 0x4B, write 0xB1 */ 12032 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 12033 .tested = TEST_UNTESTED, 12034 .probe = probe_spi_rdid, 12035 .probe_timing = TIMING_ZERO, 12036 .block_erasers = 12037 { 12038 { 12039 .eraseblocks = { {4 * 1024, 128} }, 12040 .block_erase = spi_block_erase_20, 12041 }, { 12042 .eraseblocks = { {4 * 1024, 128} }, 12043 .block_erase = spi_block_erase_d7, 12044 }, { 12045 .eraseblocks = { {64 * 1024, 8} }, 12046 .block_erase = spi_block_erase_d8, 12047 }, { 12048 .eraseblocks = { {512 * 1024, 1} }, 12049 .block_erase = spi_block_erase_60, 12050 }, { 12051 .eraseblocks = { {512 * 1024, 1} }, 12052 .block_erase = spi_block_erase_c7, 12053 } 12054 }, 12055 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 12056 .unlock = spi_disable_blockprotect_bp3_srwd, 12057 .write = spi_chip_write_256, 12058 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 12059 .voltage = {2300, 3600}, 12060 }, 12061 12062 { 12063 .vendor = "PMC", 12064 .name = "Pm25LQ080", 12065 .bustype = BUS_SPI, 12066 .manufacture_id = PMC_ID, 12067 .model_id = PMC_PM25LQ080, 12068 .total_size = 1024, 12069 .page_size = 256, 12070 /* OTP: 64B total; read 0x4B, write 0xB1 */ 12071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 12072 .tested = TEST_UNTESTED, 12073 .probe = probe_spi_rdid, 12074 .probe_timing = TIMING_ZERO, 12075 .block_erasers = 12076 { 12077 { 12078 .eraseblocks = { {4 * 1024, 256} }, 12079 .block_erase = spi_block_erase_20, 12080 }, { 12081 .eraseblocks = { {4 * 1024, 256} }, 12082 .block_erase = spi_block_erase_d7, 12083 }, { 12084 .eraseblocks = { {64 * 1024, 16} }, 12085 .block_erase = spi_block_erase_d8, 12086 }, { 12087 .eraseblocks = { {1024 * 1024, 1} }, 12088 .block_erase = spi_block_erase_60, 12089 }, { 12090 .eraseblocks = { {1024 * 1024, 1} }, 12091 .block_erase = spi_block_erase_c7, 12092 } 12093 }, 12094 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */ 12095 .unlock = spi_disable_blockprotect_bp3_srwd, 12096 .write = spi_chip_write_256, 12097 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 12098 .voltage = {2300, 3600}, 12099 }, 12100 12101 { 12102 .vendor = "PMC", 12103 .name = "Pm25LV010", 12104 .bustype = BUS_SPI, 12105 .manufacture_id = PMC_ID_NOPREFIX, 12106 .model_id = PMC_PM25LV010, 12107 .total_size = 128, 12108 .page_size = 256, 12109 .feature_bits = FEATURE_WRSR_WREN, 12110 .tested = TEST_OK_PREW, 12111 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */ 12112 .probe_timing = TIMING_ZERO, 12113 .block_erasers = 12114 { 12115 { 12116 .eraseblocks = { {4 * 1024, 32} }, 12117 .block_erase = spi_block_erase_d7, 12118 }, { 12119 .eraseblocks = { {32 * 1024, 4} }, 12120 .block_erase = spi_block_erase_d8, 12121 }, { 12122 .eraseblocks = { {128 * 1024, 1} }, 12123 .block_erase = spi_block_erase_c7, 12124 } 12125 }, 12126 .printlock = spi_prettyprint_status_register_bp1_srwd, 12127 .unlock = spi_disable_blockprotect, 12128 .write = spi_chip_write_256, 12129 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12130 .voltage = {2700, 3600}, 12131 }, 12132 12133 { 12134 .vendor = "PMC", 12135 .name = "Pm25LV010A", 12136 .bustype = BUS_SPI, 12137 .manufacture_id = PMC_ID, 12138 .model_id = PMC_PM25LV010, 12139 .total_size = 128, 12140 .page_size = 256, 12141 .feature_bits = FEATURE_WRSR_WREN, 12142 .tested = TEST_OK_PREW, 12143 .probe = probe_spi_rdid, 12144 .probe_timing = TIMING_ZERO, 12145 .block_erasers = 12146 { 12147 { 12148 .eraseblocks = { {4 * 1024, 32} }, 12149 .block_erase = spi_block_erase_d7, 12150 }, { 12151 .eraseblocks = { {32 * 1024, 4} }, 12152 .block_erase = spi_block_erase_d8, 12153 }, { 12154 .eraseblocks = { {128 * 1024, 1} }, 12155 .block_erase = spi_block_erase_c7, 12156 } 12157 }, 12158 .printlock = spi_prettyprint_status_register_bp1_srwd, 12159 .unlock = spi_disable_blockprotect, 12160 .write = spi_chip_write_256, 12161 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12162 .voltage = {2700, 3600}, 12163 }, 12164 12165 { 12166 .vendor = "PMC", 12167 .name = "Pm25LV016B", 12168 .bustype = BUS_SPI, 12169 .manufacture_id = PMC_ID, 12170 .model_id = PMC_PM25LV016B, 12171 .total_size = 2048, 12172 .page_size = 256, 12173 .feature_bits = FEATURE_WRSR_WREN, 12174 .tested = TEST_UNTESTED, 12175 .probe = probe_spi_rdid, 12176 .probe_timing = TIMING_ZERO, 12177 .block_erasers = 12178 { 12179 { 12180 .eraseblocks = { {4 * 1024, 512} }, 12181 .block_erase = spi_block_erase_d7, 12182 }, { 12183 .eraseblocks = { {4 * 1024, 512} }, 12184 .block_erase = spi_block_erase_20, 12185 }, { 12186 .eraseblocks = { {64 * 1024, 32} }, 12187 .block_erase = spi_block_erase_d8, 12188 }, { 12189 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12190 .block_erase = spi_block_erase_60, 12191 }, { 12192 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12193 .block_erase = spi_block_erase_c7, 12194 } 12195 }, 12196 .printlock = spi_prettyprint_status_register_bp2_srwd, 12197 .unlock = spi_disable_blockprotect, 12198 .write = spi_chip_write_256, 12199 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12200 .voltage = {2700, 3600}, 12201 }, 12202 12203 { 12204 .vendor = "PMC", 12205 .name = "Pm25LV020", 12206 .bustype = BUS_SPI, 12207 .manufacture_id = PMC_ID, 12208 .model_id = PMC_PM25LV020, 12209 .total_size = 256, 12210 .page_size = 256, 12211 .feature_bits = FEATURE_WRSR_WREN, 12212 .tested = TEST_UNTESTED, 12213 .probe = probe_spi_rdid, 12214 .probe_timing = TIMING_ZERO, 12215 .block_erasers = 12216 { 12217 { 12218 .eraseblocks = { {4 * 1024, 64} }, 12219 .block_erase = spi_block_erase_d7, 12220 }, { 12221 .eraseblocks = { {64 * 1024, 4} }, 12222 .block_erase = spi_block_erase_d8, 12223 }, { 12224 .eraseblocks = { {256 * 1024, 1} }, 12225 .block_erase = spi_block_erase_c7, 12226 } 12227 }, 12228 .printlock = spi_prettyprint_status_register_bp2_srwd, 12229 .unlock = spi_disable_blockprotect, 12230 .write = spi_chip_write_256, 12231 .read = spi_chip_read, 12232 .voltage = {2700, 3600}, 12233 }, 12234 12235 { 12236 .vendor = "PMC", 12237 .name = "Pm25LV040", 12238 .bustype = BUS_SPI, 12239 .manufacture_id = PMC_ID, 12240 .model_id = PMC_PM25LV040, 12241 .total_size = 512, 12242 .page_size = 256, 12243 .feature_bits = FEATURE_WRSR_WREN, 12244 .tested = TEST_OK_PREW, 12245 .probe = probe_spi_rdid, 12246 .probe_timing = TIMING_ZERO, 12247 .block_erasers = 12248 { 12249 { 12250 .eraseblocks = { {4 * 1024, 128} }, 12251 .block_erase = spi_block_erase_d7, 12252 }, { 12253 .eraseblocks = { {64 * 1024, 8} }, 12254 .block_erase = spi_block_erase_d8, 12255 }, { 12256 .eraseblocks = { {512 * 1024, 1} }, 12257 .block_erase = spi_block_erase_c7, 12258 } 12259 }, 12260 .printlock = spi_prettyprint_status_register_bp2_srwd, 12261 .unlock = spi_disable_blockprotect, 12262 .write = spi_chip_write_256, 12263 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12264 .voltage = {2700, 3600}, 12265 }, 12266 12267 { 12268 .vendor = "PMC", 12269 .name = "Pm25LV080B", 12270 .bustype = BUS_SPI, 12271 .manufacture_id = PMC_ID, 12272 .model_id = PMC_PM25LV080B, 12273 .total_size = 1024, 12274 .page_size = 256, 12275 .feature_bits = FEATURE_WRSR_WREN, 12276 .tested = TEST_UNTESTED, 12277 .probe = probe_spi_rdid, 12278 .probe_timing = TIMING_ZERO, 12279 .block_erasers = 12280 { 12281 { 12282 .eraseblocks = { {4 * 1024, 256} }, 12283 .block_erase = spi_block_erase_d7, 12284 }, { 12285 .eraseblocks = { {4 * 1024, 256} }, 12286 .block_erase = spi_block_erase_20, 12287 }, { 12288 .eraseblocks = { {64 * 1024, 16} }, 12289 .block_erase = spi_block_erase_d8, 12290 }, { 12291 .eraseblocks = { {1024 * 1024, 1} }, 12292 .block_erase = spi_block_erase_60, 12293 }, { 12294 .eraseblocks = { {1024 * 1024, 1} }, 12295 .block_erase = spi_block_erase_c7, 12296 } 12297 }, 12298 .printlock = spi_prettyprint_status_register_bp2_srwd, 12299 .unlock = spi_disable_blockprotect, 12300 .write = spi_chip_write_256, 12301 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12302 .voltage = {2700, 3600}, 12303 }, 12304 12305 { 12306 .vendor = "PMC", 12307 .name = "Pm25LV512(A)", 12308 .bustype = BUS_SPI, 12309 .manufacture_id = PMC_ID_NOPREFIX, 12310 .model_id = PMC_PM25LV512, 12311 .total_size = 64, 12312 .page_size = 256, 12313 .feature_bits = FEATURE_WRSR_WREN, 12314 .tested = TEST_OK_PREW, 12315 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */ 12316 .probe_timing = TIMING_ZERO, 12317 .block_erasers = 12318 { 12319 { 12320 .eraseblocks = { {4 * 1024, 16} }, 12321 .block_erase = spi_block_erase_d7, 12322 }, { 12323 .eraseblocks = { {32 * 1024, 2} }, 12324 .block_erase = spi_block_erase_d8, 12325 }, { 12326 .eraseblocks = { {64 * 1024, 1} }, 12327 .block_erase = spi_block_erase_c7, 12328 } 12329 }, 12330 .printlock = spi_prettyprint_status_register_bp1_srwd, 12331 .unlock = spi_disable_blockprotect, 12332 .write = spi_chip_write_256, 12333 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12334 .voltage = {2700, 3600}, 12335 }, 12336 12337 { 12338 .vendor = "PMC", 12339 .name = "Pm29F002B", 12340 .bustype = BUS_PARALLEL, 12341 .manufacture_id = PMC_ID_NOPREFIX, 12342 .model_id = PMC_PM29F002B, 12343 .total_size = 256, 12344 .page_size = 8 * 1024, 12345 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12346 .tested = TEST_UNTESTED, 12347 .probe = probe_jedec, 12348 .probe_timing = TIMING_FIXME, 12349 .block_erasers = 12350 { 12351 { 12352 .eraseblocks = { 12353 {16 * 1024, 1}, 12354 {8 * 1024, 2}, 12355 {96 * 1024, 1}, 12356 {128 * 1024, 1}, 12357 }, 12358 .block_erase = erase_sector_jedec, 12359 }, { 12360 .eraseblocks = { {256 * 1024, 1} }, 12361 .block_erase = erase_chip_block_jedec, 12362 }, 12363 }, 12364 .write = write_jedec_1, 12365 .read = read_memmapped, 12366 .voltage = {4500, 5500}, 12367 }, 12368 12369 { 12370 .vendor = "PMC", 12371 .name = "Pm29F002T", 12372 .bustype = BUS_PARALLEL, 12373 .manufacture_id = PMC_ID_NOPREFIX, 12374 .model_id = PMC_PM29F002T, 12375 .total_size = 256, 12376 .page_size = 8 * 1024, 12377 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12378 .tested = TEST_OK_PREW, 12379 .probe = probe_jedec, 12380 .probe_timing = TIMING_FIXME, 12381 .block_erasers = 12382 { 12383 { 12384 .eraseblocks = { 12385 {128 * 1024, 1}, 12386 {96 * 1024, 1}, 12387 {8 * 1024, 2}, 12388 {16 * 1024, 1}, 12389 }, 12390 .block_erase = erase_sector_jedec, 12391 }, { 12392 .eraseblocks = { {256 * 1024, 1} }, 12393 .block_erase = erase_chip_block_jedec, 12394 }, 12395 }, 12396 .write = write_jedec_1, 12397 .read = read_memmapped, 12398 .voltage = {4500, 5500}, 12399 }, 12400 12401 { 12402 .vendor = "PMC", 12403 .name = "Pm39LV010", 12404 .bustype = BUS_PARALLEL, 12405 .manufacture_id = PMC_ID_NOPREFIX, 12406 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */ 12407 .total_size = 128, 12408 .page_size = 4096, 12409 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12410 .tested = TEST_OK_PREW, 12411 .probe = probe_jedec, 12412 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 12413 .block_erasers = 12414 { 12415 { 12416 .eraseblocks = { {4 * 1024, 32} }, 12417 .block_erase = erase_sector_jedec, 12418 }, { 12419 .eraseblocks = { {64 * 1024, 2} }, 12420 .block_erase = erase_block_jedec, 12421 }, { 12422 .eraseblocks = { {128 * 1024, 1} }, 12423 .block_erase = erase_chip_block_jedec, 12424 } 12425 }, 12426 .write = write_jedec_1, 12427 .read = read_memmapped, 12428 .voltage = {2700, 3600}, 12429 }, 12430 12431 { 12432 .vendor = "PMC", 12433 .name = "Pm39LV020", 12434 .bustype = BUS_PARALLEL, 12435 .manufacture_id = PMC_ID_NOPREFIX, 12436 .model_id = PMC_PM39LV020, 12437 .total_size = 256, 12438 .page_size = 4096, 12439 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12440 .tested = TEST_UNTESTED, 12441 .probe = probe_jedec, 12442 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 12443 .block_erasers = 12444 { 12445 { 12446 .eraseblocks = { {4 * 1024, 64} }, 12447 .block_erase = erase_sector_jedec, 12448 }, { 12449 .eraseblocks = { {64 * 1024, 4} }, 12450 .block_erase = erase_block_jedec, 12451 }, { 12452 .eraseblocks = { {256 * 1024, 1} }, 12453 .block_erase = erase_chip_block_jedec, 12454 } 12455 }, 12456 .write = write_jedec_1, 12457 .read = read_memmapped, 12458 .voltage = {2700, 3600}, 12459 }, 12460 12461 { 12462 .vendor = "PMC", 12463 .name = "Pm39LV040", 12464 .bustype = BUS_PARALLEL, 12465 .manufacture_id = PMC_ID_NOPREFIX, 12466 .model_id = PMC_PM39LV040, 12467 .total_size = 512, 12468 .page_size = 4096, 12469 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12470 .tested = TEST_OK_PR, 12471 .probe = probe_jedec, 12472 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 12473 .block_erasers = 12474 { 12475 { 12476 .eraseblocks = { {4 * 1024, 128} }, 12477 .block_erase = erase_sector_jedec, 12478 }, { 12479 .eraseblocks = { {64 * 1024, 8} }, 12480 .block_erase = erase_block_jedec, 12481 }, { 12482 .eraseblocks = { {512 * 1024, 1} }, 12483 .block_erase = erase_chip_block_jedec, 12484 } 12485 }, 12486 .write = write_jedec_1, 12487 .read = read_memmapped, 12488 .voltage = {2700, 3600}, 12489 }, 12490 12491 { 12492 .vendor = "PMC", 12493 .name = "Pm39LV512", 12494 .bustype = BUS_PARALLEL, 12495 .manufacture_id = PMC_ID_NOPREFIX, 12496 .model_id = PMC_PM39LV512, 12497 .total_size = 64, 12498 .page_size = 4096, 12499 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 12500 .tested = TEST_OK_PREW, 12501 .probe = probe_jedec, 12502 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 12503 .block_erasers = 12504 { 12505 { 12506 .eraseblocks = { {4 * 1024, 16} }, 12507 .block_erase = erase_sector_jedec, 12508 }, { 12509 .eraseblocks = { {64 * 1024, 1} }, 12510 .block_erase = erase_block_jedec, 12511 }, { 12512 .eraseblocks = { {64 * 1024, 1} }, 12513 .block_erase = erase_chip_block_jedec, 12514 } 12515 }, 12516 .write = write_jedec_1, 12517 .read = read_memmapped, 12518 .voltage = {2700, 3600}, 12519 }, 12520 12521 { 12522 .vendor = "PMC", 12523 .name = "Pm49FL002", 12524 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 12525 .manufacture_id = PMC_ID_NOPREFIX, 12526 .model_id = PMC_PM49FL002, 12527 .total_size = 256, 12528 .page_size = 16 * 1024, 12529 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 12530 .tested = TEST_OK_PR, 12531 .probe = probe_jedec, 12532 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */ 12533 .block_erasers = 12534 { 12535 { 12536 .eraseblocks = { {4 * 1024, 64} }, 12537 .block_erase = erase_sector_jedec, 12538 }, { 12539 .eraseblocks = { {16 * 1024, 16} }, 12540 .block_erase = erase_block_jedec, 12541 }, { 12542 .eraseblocks = { {256 * 1024, 1} }, 12543 .block_erase = erase_chip_block_jedec, 12544 } 12545 }, 12546 .unlock = unlock_regspace2_uniform_32k, 12547 .write = write_jedec_1, 12548 .read = read_memmapped, 12549 .voltage = {3000, 3600}, 12550 }, 12551 12552 { 12553 .vendor = "PMC", 12554 .name = "Pm49FL004", 12555 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 12556 .manufacture_id = PMC_ID_NOPREFIX, 12557 .model_id = PMC_PM49FL004, 12558 .total_size = 512, 12559 .page_size = 64 * 1024, 12560 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 12561 .tested = TEST_OK_PREW, 12562 .probe = probe_jedec, 12563 .probe_timing = TIMING_ZERO, 12564 .block_erasers = 12565 { 12566 { 12567 .eraseblocks = { {4 * 1024, 128} }, 12568 .block_erase = erase_sector_jedec, 12569 }, { 12570 .eraseblocks = { {64 * 1024, 8} }, 12571 .block_erase = erase_block_jedec, 12572 }, { 12573 .eraseblocks = { {512 * 1024, 1} }, 12574 .block_erase = erase_chip_block_jedec, 12575 } 12576 }, 12577 .unlock = unlock_regspace2_uniform_64k, 12578 .write = write_jedec_1, 12579 .read = read_memmapped, 12580 .voltage = {3000, 3600}, 12581 }, 12582 12583 { 12584 .vendor = "SST", 12585 .name = "SST25LF020A", 12586 .bustype = BUS_SPI, 12587 .manufacture_id = SST_ID, 12588 .model_id = SST_SST25VF020_REMS, 12589 .total_size = 256, 12590 .page_size = 256, 12591 .feature_bits = FEATURE_WRSR_EWSR, 12592 .tested = TEST_OK_PREW, 12593 .probe = probe_spi_rems, 12594 .probe_timing = TIMING_ZERO, 12595 .block_erasers = 12596 { 12597 { 12598 .eraseblocks = { {4 * 1024, 64} }, 12599 .block_erase = spi_block_erase_20, 12600 }, { 12601 .eraseblocks = { {32 * 1024, 8} }, 12602 .block_erase = spi_block_erase_52, 12603 }, { 12604 .eraseblocks = { {256 * 1024, 1} }, 12605 .block_erase = spi_block_erase_60, 12606 }, 12607 }, 12608 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */ 12609 .unlock = spi_disable_blockprotect, 12610 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12611 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12612 .voltage = {2700, 3600}, 12613 }, 12614 12615 { 12616 .vendor = "SST", 12617 .name = "SST25LF040A", 12618 .bustype = BUS_SPI, 12619 .manufacture_id = SST_ID, 12620 .model_id = SST_SST25VF040_REMS, 12621 .total_size = 512, 12622 .page_size = 256, 12623 .feature_bits = FEATURE_WRSR_EWSR, 12624 .tested = TEST_OK_PREW, 12625 .probe = probe_spi_res2, 12626 .probe_timing = TIMING_ZERO, 12627 .block_erasers = 12628 { 12629 { 12630 .eraseblocks = { {4 * 1024, 128} }, 12631 .block_erase = spi_block_erase_20, 12632 }, { 12633 .eraseblocks = { {32 * 1024, 16} }, 12634 .block_erase = spi_block_erase_52, 12635 }, { 12636 .eraseblocks = { {512 * 1024, 1} }, 12637 .block_erase = spi_block_erase_60, 12638 }, 12639 }, 12640 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 12641 .unlock = spi_disable_blockprotect, 12642 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12643 .read = spi_chip_read, 12644 .voltage = {3000, 3600}, 12645 }, 12646 12647 { 12648 .vendor = "SST", 12649 .name = "SST25LF080(A)", 12650 .bustype = BUS_SPI, 12651 .manufacture_id = SST_ID, 12652 .model_id = SST_SST25VF080_REMS, 12653 .total_size = 1024, 12654 .page_size = 256, 12655 .feature_bits = FEATURE_WRSR_EITHER, 12656 .tested = TEST_UNTESTED, 12657 .probe = probe_spi_res2, 12658 .probe_timing = TIMING_ZERO, 12659 .block_erasers = 12660 { 12661 { 12662 .eraseblocks = { {4 * 1024, 256} }, 12663 .block_erase = spi_block_erase_20, 12664 }, { 12665 .eraseblocks = { {32 * 1024, 32} }, 12666 .block_erase = spi_block_erase_52, 12667 }, { 12668 .eraseblocks = { {1024 * 1024, 1} }, 12669 .block_erase = spi_block_erase_60, 12670 }, 12671 }, 12672 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 12673 .unlock = spi_disable_blockprotect, 12674 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12675 .read = spi_chip_read, 12676 .voltage = {3000, 3600}, 12677 }, 12678 12679 { 12680 .vendor = "SST", 12681 .name = "SST25VF010(A)", 12682 .bustype = BUS_SPI, 12683 .manufacture_id = SST_ID, 12684 .model_id = SST_SST25VF010_REMS, 12685 .total_size = 128, 12686 .page_size = 256, 12687 .feature_bits = FEATURE_WRSR_EWSR, 12688 .tested = TEST_OK_PREW, 12689 .probe = probe_spi_rems, 12690 .probe_timing = TIMING_ZERO, 12691 .block_erasers = 12692 { 12693 { 12694 .eraseblocks = { {4 * 1024, 32} }, 12695 .block_erase = spi_block_erase_20, 12696 }, { 12697 .eraseblocks = { {32 * 1024, 4} }, 12698 .block_erase = spi_block_erase_52, 12699 }, { 12700 .eraseblocks = { {32 * 1024, 4} }, 12701 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */ 12702 }, { 12703 .eraseblocks = { {128 * 1024, 1} }, 12704 .block_erase = spi_block_erase_60, 12705 }, { 12706 .eraseblocks = { {128 * 1024, 1} }, 12707 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */ 12708 }, 12709 }, 12710 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */ 12711 .unlock = spi_disable_blockprotect, 12712 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12713 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */ 12714 .voltage = {2700, 3600}, 12715 }, 12716 12717 { 12718 .vendor = "SST", 12719 .name = "SST25VF016B", 12720 .bustype = BUS_SPI, 12721 .manufacture_id = SST_ID, 12722 .model_id = SST_SST25VF016B, 12723 .total_size = 2048, 12724 .page_size = 256, 12725 .feature_bits = FEATURE_WRSR_EITHER, 12726 .tested = TEST_OK_PREW, 12727 .probe = probe_spi_rdid, 12728 .probe_timing = TIMING_ZERO, 12729 .block_erasers = 12730 { 12731 { 12732 .eraseblocks = { {4 * 1024, 512} }, 12733 .block_erase = spi_block_erase_20, 12734 }, { 12735 .eraseblocks = { {32 * 1024, 64} }, 12736 .block_erase = spi_block_erase_52, 12737 }, { 12738 .eraseblocks = { {64 * 1024, 32} }, 12739 .block_erase = spi_block_erase_d8, 12740 }, { 12741 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12742 .block_erase = spi_block_erase_60, 12743 }, { 12744 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12745 .block_erase = spi_block_erase_c7, 12746 }, 12747 }, 12748 .printlock = spi_prettyprint_status_register_sst25vf016, 12749 .unlock = spi_disable_blockprotect, 12750 .write = spi_aai_write, 12751 .read = spi_chip_read, 12752 .voltage = {2700, 3600}, 12753 }, 12754 12755 { 12756 .vendor = "SST", 12757 .name = "SST25VF020", 12758 .bustype = BUS_SPI, 12759 .manufacture_id = SST_ID, 12760 .model_id = SST_SST25VF020_REMS, 12761 .total_size = 256, 12762 .page_size = 256, 12763 .feature_bits = FEATURE_WRSR_EWSR, 12764 .tested = TEST_UNTESTED, 12765 .probe = probe_spi_rems, 12766 .probe_timing = TIMING_ZERO, 12767 .block_erasers = 12768 { 12769 { 12770 .eraseblocks = { {4 * 1024, 64} }, 12771 .block_erase = spi_block_erase_20, 12772 }, { 12773 .eraseblocks = { {32 * 1024, 8} }, 12774 .block_erase = spi_block_erase_52, 12775 }, { 12776 .eraseblocks = { {256 * 1024, 1} }, 12777 .block_erase = spi_block_erase_60, 12778 }, 12779 }, 12780 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */ 12781 .unlock = spi_disable_blockprotect, 12782 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12783 .read = spi_chip_read, /* only */ 12784 .voltage = {2700, 3600}, 12785 }, 12786 12787 { 12788 .vendor = "SST", 12789 .name = "SST25VF020B", 12790 .bustype = BUS_SPI, 12791 .manufacture_id = SST_ID, 12792 .model_id = SST_SST25VF020B, 12793 .total_size = 256, 12794 .page_size = 256, 12795 .feature_bits = FEATURE_WRSR_EWSR, 12796 .tested = TEST_OK_PREW, 12797 .probe = probe_spi_rdid, 12798 .probe_timing = TIMING_ZERO, 12799 .block_erasers = 12800 { 12801 { 12802 .eraseblocks = { {4 * 1024, 64} }, 12803 .block_erase = spi_block_erase_20, 12804 }, { 12805 .eraseblocks = { {32 * 1024, 8} }, 12806 .block_erase = spi_block_erase_52, 12807 }, { 12808 .eraseblocks = { {64 * 1024, 4} }, 12809 .block_erase = spi_block_erase_d8, 12810 }, { 12811 .eraseblocks = { {256 * 1024, 1} }, 12812 .block_erase = spi_block_erase_60, 12813 }, { 12814 .eraseblocks = { {256 * 1024, 1} }, 12815 .block_erase = spi_block_erase_c7, 12816 }, 12817 }, 12818 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */ 12819 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */ 12820 .write = spi_aai_write, /* AAI supported (0xAD) */ 12821 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12822 .voltage = {2700, 3600}, 12823 }, 12824 12825 { 12826 .vendor = "SST", 12827 .name = "SST25VF032B", 12828 .bustype = BUS_SPI, 12829 .manufacture_id = SST_ID, 12830 .model_id = SST_SST25VF032B, 12831 .total_size = 4096, 12832 .page_size = 256, 12833 .feature_bits = FEATURE_WRSR_EWSR, 12834 .tested = TEST_OK_PREW, 12835 .probe = probe_spi_rdid, 12836 .probe_timing = TIMING_ZERO, 12837 .block_erasers = 12838 { 12839 { 12840 .eraseblocks = { {4 * 1024, 1024} }, 12841 .block_erase = spi_block_erase_20, 12842 }, { 12843 .eraseblocks = { {32 * 1024, 128} }, 12844 .block_erase = spi_block_erase_52, 12845 }, { 12846 .eraseblocks = { {64 * 1024, 64} }, 12847 .block_erase = spi_block_erase_d8, 12848 }, { 12849 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12850 .block_erase = spi_block_erase_60, 12851 }, { 12852 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12853 .block_erase = spi_block_erase_c7, 12854 }, 12855 }, 12856 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 12857 .unlock = spi_disable_blockprotect, 12858 .write = spi_aai_write, 12859 .read = spi_chip_read, 12860 .voltage = {2700, 3600}, 12861 }, 12862 12863 { 12864 .vendor = "SST", 12865 .name = "SST25VF040", 12866 .bustype = BUS_SPI, 12867 .manufacture_id = SST_ID, 12868 .model_id = SST_SST25VF040_REMS, 12869 .total_size = 512, 12870 .page_size = 256, 12871 .feature_bits = FEATURE_WRSR_EWSR, 12872 .tested = TEST_OK_PR, 12873 .probe = probe_spi_rems, 12874 .probe_timing = TIMING_ZERO, 12875 .block_erasers = 12876 { 12877 { 12878 .eraseblocks = { {4 * 1024, 128} }, 12879 .block_erase = spi_block_erase_20, 12880 }, { 12881 .eraseblocks = { {32 * 1024, 16} }, 12882 .block_erase = spi_block_erase_52, 12883 }, { 12884 .eraseblocks = { {512 * 1024, 1} }, 12885 .block_erase = spi_block_erase_60, 12886 }, 12887 }, 12888 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 12889 .unlock = spi_disable_blockprotect, 12890 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 12891 .read = spi_chip_read, 12892 .voltage = {2700, 3600}, 12893 }, 12894 12895 { 12896 .vendor = "SST", 12897 .name = "SST25VF040B", 12898 .bustype = BUS_SPI, 12899 .manufacture_id = SST_ID, 12900 .model_id = SST_SST25VF040B, 12901 .total_size = 512, 12902 .page_size = 256, 12903 .feature_bits = FEATURE_WRSR_EWSR, 12904 .tested = TEST_OK_PREW, 12905 .probe = probe_spi_rdid, 12906 .probe_timing = TIMING_ZERO, 12907 .block_erasers = 12908 { 12909 { 12910 .eraseblocks = { {4 * 1024, 128} }, 12911 .block_erase = spi_block_erase_20, 12912 }, { 12913 .eraseblocks = { {32 * 1024, 16} }, 12914 .block_erase = spi_block_erase_52, 12915 }, { 12916 .eraseblocks = { {64 * 1024, 8} }, 12917 .block_erase = spi_block_erase_d8, 12918 }, { 12919 .eraseblocks = { {512 * 1024, 1} }, 12920 .block_erase = spi_block_erase_60, 12921 }, { 12922 .eraseblocks = { {512 * 1024, 1} }, 12923 .block_erase = spi_block_erase_c7, 12924 }, 12925 }, 12926 .printlock = spi_prettyprint_status_register_sst25vf040b, 12927 .unlock = spi_disable_blockprotect, 12928 .write = spi_aai_write, /* AAI supported (0xAD) */ 12929 .read = spi_chip_read, /* Fast read (0x0B) supported */ 12930 .voltage = {2700, 3600}, 12931 }, 12932 12933 { 12934 .vendor = "SST", 12935 .name = "SST25VF040B.REMS", 12936 .bustype = BUS_SPI, 12937 .manufacture_id = SST_ID, 12938 .model_id = SST_SST25VF040B_REMS, 12939 .total_size = 512, 12940 .page_size = 256, 12941 .feature_bits = FEATURE_WRSR_EWSR, 12942 .tested = TEST_OK_PREW, 12943 .probe = probe_spi_rems, 12944 .probe_timing = TIMING_ZERO, 12945 .block_erasers = 12946 { 12947 { 12948 .eraseblocks = { {4 * 1024, 128} }, 12949 .block_erase = spi_block_erase_20, 12950 }, { 12951 .eraseblocks = { {32 * 1024, 16} }, 12952 .block_erase = spi_block_erase_52, 12953 }, { 12954 .eraseblocks = { {64 * 1024, 8} }, 12955 .block_erase = spi_block_erase_d8, 12956 }, { 12957 .eraseblocks = { {512 * 1024, 1} }, 12958 .block_erase = spi_block_erase_60, 12959 }, { 12960 .eraseblocks = { {512 * 1024, 1} }, 12961 .block_erase = spi_block_erase_c7, 12962 }, 12963 }, 12964 .printlock = spi_prettyprint_status_register_sst25vf040b, 12965 .unlock = spi_disable_blockprotect, 12966 .write = spi_aai_write, 12967 .read = spi_chip_read, 12968 .voltage = {2700, 3600}, 12969 }, 12970 12971 { 12972 .vendor = "SST", 12973 .name = "SST25VF064C", 12974 .bustype = BUS_SPI, 12975 .manufacture_id = SST_ID, 12976 .model_id = SST_SST25VF064C, 12977 .total_size = 8192, 12978 .page_size = 256, 12979 .feature_bits = FEATURE_WRSR_EWSR, 12980 .tested = TEST_OK_PREW, 12981 .probe = probe_spi_rdid, 12982 .probe_timing = TIMING_ZERO, 12983 .block_erasers = 12984 { 12985 { 12986 .eraseblocks = { {4 * 1024, 2048} }, 12987 .block_erase = spi_block_erase_20, 12988 }, { 12989 .eraseblocks = { {32 * 1024, 256} }, 12990 .block_erase = spi_block_erase_52, 12991 }, { 12992 .eraseblocks = { {64 * 1024, 128} }, 12993 .block_erase = spi_block_erase_d8, 12994 }, { 12995 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12996 .block_erase = spi_block_erase_60, 12997 }, { 12998 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12999 .block_erase = spi_block_erase_c7, 13000 }, 13001 }, 13002 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 13003 .unlock = spi_disable_blockprotect, 13004 .write = spi_chip_write_256, 13005 .read = spi_chip_read, 13006 .voltage = {2700, 3600}, 13007 }, 13008 13009 { 13010 .vendor = "SST", 13011 .name = "SST25VF080B", 13012 .bustype = BUS_SPI, 13013 .manufacture_id = SST_ID, 13014 .model_id = SST_SST25VF080B, 13015 .total_size = 1024, 13016 .page_size = 256, 13017 .feature_bits = FEATURE_WRSR_EWSR, 13018 .tested = TEST_OK_PREW, 13019 .probe = probe_spi_rdid, 13020 .probe_timing = TIMING_ZERO, 13021 .block_erasers = 13022 { 13023 { 13024 .eraseblocks = { {4 * 1024, 256} }, 13025 .block_erase = spi_block_erase_20, 13026 }, { 13027 .eraseblocks = { {32 * 1024, 32} }, 13028 .block_erase = spi_block_erase_52, 13029 }, { 13030 .eraseblocks = { {64 * 1024, 16} }, 13031 .block_erase = spi_block_erase_d8, 13032 }, { 13033 .eraseblocks = { {1024 * 1024, 1} }, 13034 .block_erase = spi_block_erase_60, 13035 }, { 13036 .eraseblocks = { {1024 * 1024, 1} }, 13037 .block_erase = spi_block_erase_c7, 13038 }, 13039 }, 13040 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */ 13041 .unlock = spi_disable_blockprotect, 13042 .write = spi_aai_write, 13043 .read = spi_chip_read, 13044 .voltage = {2700, 3600}, 13045 }, 13046 13047 { 13048 .vendor = "SST", 13049 .name = "SST25VF512(A)", 13050 .bustype = BUS_SPI, 13051 .manufacture_id = SST_ID, 13052 .model_id = SST_SST25VF512_REMS, 13053 .total_size = 64, 13054 .page_size = 256, 13055 .feature_bits = FEATURE_WRSR_EWSR, 13056 .tested = TEST_OK_PREW, 13057 .probe = probe_spi_rems, 13058 .probe_timing = TIMING_ZERO, 13059 .block_erasers = 13060 { 13061 { 13062 .eraseblocks = { {4 * 1024, 16} }, 13063 .block_erase = spi_block_erase_20, 13064 }, { 13065 .eraseblocks = { {32 * 1024, 2} }, 13066 .block_erase = spi_block_erase_52, 13067 }, { 13068 .eraseblocks = { {32 * 1024, 2} }, 13069 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */ 13070 }, { 13071 .eraseblocks = { {64 * 1024, 1} }, 13072 .block_erase = spi_block_erase_60, 13073 }, { 13074 .eraseblocks = { {64 * 1024, 1} }, 13075 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */ 13076 }, 13077 }, 13078 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */ 13079 .unlock = spi_disable_blockprotect, 13080 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */ 13081 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */ 13082 .voltage = {2700, 3600}, 13083 }, 13084 13085 { 13086 .vendor = "SST", 13087 .name = "SST25WF010", 13088 .bustype = BUS_SPI, 13089 .manufacture_id = SST_ID, 13090 .model_id = SST_SST25WF010, 13091 .total_size = 128, 13092 .page_size = 256, 13093 .feature_bits = FEATURE_WRSR_EITHER, 13094 .tested = TEST_UNTESTED, 13095 .probe = probe_spi_rdid, 13096 .probe_timing = TIMING_ZERO, 13097 .block_erasers = 13098 { 13099 { 13100 .eraseblocks = { {4 * 1024, 32} }, 13101 .block_erase = spi_block_erase_20, 13102 }, { 13103 .eraseblocks = { {32 * 1024, 4} }, 13104 .block_erase = spi_block_erase_52, 13105 }, { 13106 .eraseblocks = { {1024 * 128, 1} }, 13107 .block_erase = spi_block_erase_60, 13108 }, { 13109 .eraseblocks = { {1024 * 128, 1} }, 13110 .block_erase = spi_block_erase_c7, 13111 }, 13112 }, 13113 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */ 13114 .unlock = spi_disable_blockprotect_bp2_srwd, 13115 .write = spi_aai_write, 13116 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13117 .voltage = {1650, 1950}, 13118 }, 13119 13120 { 13121 .vendor = "SST", 13122 .name = "SST25WF020", 13123 .bustype = BUS_SPI, 13124 .manufacture_id = SST_ID, 13125 .model_id = SST_SST25WF020, 13126 .total_size = 256, 13127 .page_size = 256, 13128 .feature_bits = FEATURE_WRSR_EITHER, 13129 .tested = TEST_UNTESTED, 13130 .probe = probe_spi_rdid, 13131 .probe_timing = TIMING_ZERO, 13132 .block_erasers = 13133 { 13134 { 13135 .eraseblocks = { {4 * 1024, 64} }, 13136 .block_erase = spi_block_erase_20, 13137 }, { 13138 .eraseblocks = { {32 * 1024, 8} }, 13139 .block_erase = spi_block_erase_52, 13140 }, { 13141 .eraseblocks = { {64 * 1024, 4} }, 13142 .block_erase = spi_block_erase_d8, 13143 }, { 13144 .eraseblocks = { {1024 * 256, 1} }, 13145 .block_erase = spi_block_erase_60, 13146 }, { 13147 .eraseblocks = { {1024 * 256, 1} }, 13148 .block_erase = spi_block_erase_c7, 13149 }, 13150 }, 13151 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */ 13152 .unlock = spi_disable_blockprotect_bp2_srwd, 13153 .write = spi_aai_write, 13154 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13155 .voltage = {1650, 1950}, 13156 }, 13157 13158 { 13159 .vendor = "SST", 13160 .name = "SST25WF020A", 13161 .bustype = BUS_SPI, 13162 .manufacture_id = SANYO_ID, /* See flashchips.h */ 13163 .model_id = SST_SST25WF020A, 13164 .total_size = 256, 13165 .page_size = 256, 13166 .feature_bits = FEATURE_WRSR_WREN, 13167 .tested = TEST_UNTESTED, 13168 .probe = probe_spi_rdid, 13169 .probe_timing = TIMING_ZERO, 13170 .block_erasers = 13171 { 13172 { 13173 .eraseblocks = { {4 * 1024, 64} }, 13174 .block_erase = spi_block_erase_20, 13175 }, { 13176 .eraseblocks = { {64 * 1024, 4} }, 13177 .block_erase = spi_block_erase_d8, 13178 }, { 13179 .eraseblocks = { {256 * 1024, 1} }, 13180 .block_erase = spi_block_erase_60, 13181 }, { 13182 .eraseblocks = { {256 * 1024, 1} }, 13183 .block_erase = spi_block_erase_c7, 13184 }, 13185 }, 13186 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, 13187 .unlock = spi_disable_blockprotect_bp2_srwd, 13188 .write = spi_chip_write_256, 13189 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13190 .voltage = {1650, 1950}, 13191 }, 13192 13193 { 13194 .vendor = "SST", 13195 .name = "SST25WF040", 13196 .bustype = BUS_SPI, 13197 .manufacture_id = SST_ID, 13198 .model_id = SST_SST25WF040, 13199 .total_size = 512, 13200 .page_size = 256, 13201 .feature_bits = FEATURE_WRSR_EITHER, 13202 .tested = TEST_UNTESTED, 13203 .probe = probe_spi_rdid, 13204 .probe_timing = TIMING_ZERO, 13205 .block_erasers = 13206 { 13207 { 13208 .eraseblocks = { {4 * 1024, 128} }, 13209 .block_erase = spi_block_erase_20, 13210 }, { 13211 .eraseblocks = { {32 * 1024, 16} }, 13212 .block_erase = spi_block_erase_52, 13213 }, { 13214 .eraseblocks = { {64 * 1024, 8} }, 13215 .block_erase = spi_block_erase_d8, 13216 }, { 13217 .eraseblocks = { {1024 * 512, 1} }, 13218 .block_erase = spi_block_erase_60, 13219 }, { 13220 .eraseblocks = { {1024 * 512, 1} }, 13221 .block_erase = spi_block_erase_c7, 13222 }, 13223 }, 13224 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */ 13225 .unlock = spi_disable_blockprotect_bp2_srwd, 13226 .write = spi_aai_write, 13227 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13228 .voltage = {1650, 1950}, 13229 }, 13230 13231 { 13232 .vendor = "SST", 13233 .name = "SST25WF040B", 13234 .bustype = BUS_SPI, 13235 .manufacture_id = SANYO_ID, /* See flashchips.h */ 13236 .model_id = SST_SST25WF040B, 13237 .total_size = 512, 13238 .page_size = 256, 13239 .feature_bits = FEATURE_WRSR_WREN, 13240 .tested = TEST_UNTESTED, 13241 .probe = probe_spi_rdid, 13242 .probe_timing = TIMING_ZERO, 13243 .block_erasers = 13244 { 13245 { 13246 .eraseblocks = { {4 * 1024, 128} }, 13247 .block_erase = spi_block_erase_20, 13248 }, { 13249 .eraseblocks = { {64 * 1024, 8} }, 13250 .block_erase = spi_block_erase_d8, 13251 }, { 13252 .eraseblocks = { {512 * 1024, 1} }, 13253 .block_erase = spi_block_erase_60, 13254 }, { 13255 .eraseblocks = { {512 * 1024, 1} }, 13256 .block_erase = spi_block_erase_c7, 13257 }, 13258 }, 13259 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, 13260 .unlock = spi_disable_blockprotect_bp2_srwd, 13261 .write = spi_chip_write_256, 13262 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */ 13263 .voltage = {1650, 1950}, 13264 }, 13265 13266 { 13267 .vendor = "SST", 13268 .name = "SST25WF080", 13269 .bustype = BUS_SPI, 13270 .manufacture_id = SST_ID, 13271 .model_id = SST_SST25WF080, 13272 .total_size = 1024, 13273 .page_size = 256, 13274 .feature_bits = FEATURE_WRSR_EITHER, 13275 .tested = TEST_OK_PREW, 13276 .probe = probe_spi_rdid, 13277 .probe_timing = TIMING_ZERO, 13278 .block_erasers = 13279 { 13280 { 13281 .eraseblocks = { {4 * 1024, 256} }, 13282 .block_erase = spi_block_erase_20, 13283 }, { 13284 .eraseblocks = { {32 * 1024, 32} }, 13285 .block_erase = spi_block_erase_52, 13286 }, { 13287 .eraseblocks = { {64 * 1024, 16} }, 13288 .block_erase = spi_block_erase_d8, 13289 }, { 13290 .eraseblocks = { {1024 * 1024, 1} }, 13291 .block_erase = spi_block_erase_60, 13292 }, { 13293 .eraseblocks = { {1024 * 1024, 1} }, 13294 .block_erase = spi_block_erase_c7, 13295 }, 13296 }, 13297 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */ 13298 .unlock = spi_disable_blockprotect_bp3_srwd, 13299 .write = spi_aai_write, 13300 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13301 .voltage = {1650, 1950}, 13302 }, 13303 13304 { 13305 .vendor = "SST", 13306 .name = "SST25WF080B", 13307 .bustype = BUS_SPI, 13308 .manufacture_id = SANYO_ID, /* See flashchips.h */ 13309 .model_id = SST_SST25WF080B, 13310 .total_size = 1024, 13311 .page_size = 256, 13312 .feature_bits = FEATURE_WRSR_WREN, 13313 .tested = TEST_OK_PREW, 13314 .probe = probe_spi_rdid, 13315 .probe_timing = TIMING_ZERO, 13316 .block_erasers = 13317 { 13318 { 13319 .eraseblocks = { {4 * 1024, 256} }, 13320 .block_erase = spi_block_erase_20, 13321 }, { 13322 .eraseblocks = { {64 * 1024, 16} }, 13323 .block_erase = spi_block_erase_d8, 13324 }, { 13325 .eraseblocks = { {1024 * 1024, 1} }, 13326 .block_erase = spi_block_erase_60, 13327 }, { 13328 .eraseblocks = { {1024 * 1024, 1} }, 13329 .block_erase = spi_block_erase_c7, 13330 }, 13331 }, 13332 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, 13333 .unlock = spi_disable_blockprotect_bp2_srwd, 13334 .write = spi_chip_write_256, 13335 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */ 13336 .voltage = {1650, 1950}, 13337 }, 13338 13339 { 13340 .vendor = "SST", 13341 .name = "SST25WF512", 13342 .bustype = BUS_SPI, 13343 .manufacture_id = SST_ID, 13344 .model_id = SST_SST25WF512, 13345 .total_size = 64, 13346 .page_size = 256, 13347 .feature_bits = FEATURE_WRSR_EITHER, 13348 .tested = TEST_UNTESTED, 13349 .probe = probe_spi_rdid, 13350 .probe_timing = TIMING_ZERO, 13351 .block_erasers = 13352 { 13353 { 13354 .eraseblocks = { {4 * 1024, 16} }, 13355 .block_erase = spi_block_erase_20, 13356 }, { 13357 .eraseblocks = { {32 * 1024, 2} }, 13358 .block_erase = spi_block_erase_52, 13359 }, { 13360 .eraseblocks = { {1024 * 64, 1} }, 13361 .block_erase = spi_block_erase_60, 13362 }, { 13363 .eraseblocks = { {1024 * 64, 1} }, 13364 .block_erase = spi_block_erase_c7, 13365 }, 13366 }, 13367 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */ 13368 .unlock = spi_disable_blockprotect_bp2_srwd, 13369 .write = spi_aai_write, 13370 .read = spi_chip_read, /* Fast read (0x0B) supported */ 13371 .voltage = {1650, 1950}, 13372 }, 13373 13374 { 13375 .vendor = "SST", 13376 .name = "SST26VF016B(A)", 13377 .bustype = BUS_SPI, 13378 .manufacture_id = SST_ID, 13379 .model_id = SST_SST26VF016B, 13380 .total_size = 2048, 13381 .page_size = 256, 13382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13383 .tested = TEST_OK_PREW, 13384 .probe = probe_spi_rdid, 13385 .probe_timing = TIMING_ZERO, 13386 .block_erasers = 13387 { 13388 { 13389 .eraseblocks = { {4 * 1024, 512} }, 13390 .block_erase = spi_block_erase_20, 13391 }, { 13392 .eraseblocks = { 13393 {8 * 1024, 4}, 13394 {32 * 1024, 1}, 13395 {64 * 1024, 30}, 13396 {32 * 1024, 1}, 13397 {8 * 1024, 4}, 13398 }, 13399 .block_erase = spi_block_erase_d8, 13400 }, { 13401 .eraseblocks = { {2 * 1024 * 1024, 1} }, 13402 .block_erase = spi_block_erase_c7, 13403 }, 13404 }, 13405 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 13406 .unlock = spi_disable_blockprotect_sst26_global_unprotect, 13407 .write = spi_chip_write_256, /* Multi I/O supported */ 13408 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 13409 .voltage = {2700, 3600}, 13410 }, 13411 13412 { 13413 .vendor = "SST", 13414 .name = "SST26VF032B(A)", 13415 .bustype = BUS_SPI, 13416 .manufacture_id = SST_ID, 13417 .model_id = SST_SST26VF032B, 13418 .total_size = 4096, 13419 .page_size = 256, 13420 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13421 .tested = TEST_UNTESTED, 13422 .probe = probe_spi_rdid, 13423 .probe_timing = TIMING_ZERO, 13424 .block_erasers = 13425 { 13426 { 13427 .eraseblocks = { {4 * 1024, 1024} }, 13428 .block_erase = spi_block_erase_20, 13429 }, { 13430 .eraseblocks = { 13431 {8 * 1024, 4}, 13432 {32 * 1024, 1}, 13433 {64 * 1024, 62}, 13434 {32 * 1024, 1}, 13435 {8 * 1024, 4}, 13436 }, 13437 .block_erase = spi_block_erase_d8, 13438 }, { 13439 .eraseblocks = { {4 * 1024 * 1024, 1} }, 13440 .block_erase = spi_block_erase_c7, 13441 }, 13442 }, 13443 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 13444 .unlock = spi_disable_blockprotect_sst26_global_unprotect, 13445 .write = spi_chip_write_256, /* Multi I/O supported */ 13446 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 13447 .voltage = {2700, 3600}, 13448 }, 13449 13450 { 13451 .vendor = "SST", 13452 .name = "SST26VF064B(A)", 13453 .bustype = BUS_SPI, 13454 .manufacture_id = SST_ID, 13455 .model_id = SST_SST26VF064B, 13456 .total_size = 8192, 13457 .page_size = 256, 13458 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13459 .tested = TEST_OK_PREW, 13460 .probe = probe_spi_rdid, 13461 .probe_timing = TIMING_ZERO, 13462 .block_erasers = 13463 { 13464 { 13465 .eraseblocks = { {4 * 1024, 2048} }, 13466 .block_erase = spi_block_erase_20, 13467 }, { 13468 .eraseblocks = { 13469 {8 * 1024, 4}, 13470 {32 * 1024, 1}, 13471 {64 * 1024, 126}, 13472 {32 * 1024, 1}, 13473 {8 * 1024, 4}, 13474 }, 13475 .block_erase = spi_block_erase_d8, 13476 }, { 13477 .eraseblocks = { {8 * 1024 * 1024, 1} }, 13478 .block_erase = spi_block_erase_c7, 13479 }, 13480 }, 13481 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 13482 .unlock = spi_disable_blockprotect_sst26_global_unprotect, 13483 .write = spi_chip_write_256, /* Multi I/O supported */ 13484 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 13485 .voltage = {2700, 3600}, 13486 }, 13487 13488 { 13489 .vendor = "SST", 13490 .name = "SST28SF040A", 13491 .bustype = BUS_PARALLEL, 13492 .manufacture_id = SST_ID, 13493 .model_id = SST_SST28SF040, 13494 .total_size = 512, 13495 .page_size = 256, 13496 .feature_bits = 0, 13497 .tested = TEST_UNTESTED, 13498 .probe = probe_82802ab, 13499 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */ 13500 .block_erasers = 13501 { 13502 { 13503 .eraseblocks = { {128, 4096} }, 13504 .block_erase = erase_sector_28sf040, 13505 }, { 13506 .eraseblocks = { {512 * 1024, 1} }, 13507 .block_erase = erase_chip_28sf040, 13508 } 13509 }, 13510 .unlock = unprotect_28sf040, 13511 .write = write_28sf040, 13512 .read = read_memmapped, 13513 .voltage = {4500, 5500}, 13514 }, 13515 13516 { 13517 .vendor = "SST", 13518 .name = "SST29EE010", 13519 .bustype = BUS_PARALLEL, 13520 .manufacture_id = SST_ID, 13521 .model_id = SST_SST29EE010, 13522 .total_size = 128, 13523 .page_size = 128, 13524 .feature_bits = FEATURE_LONG_RESET, 13525 .tested = TEST_OK_PR, 13526 .probe = probe_jedec, 13527 .probe_timing = 10, 13528 .block_erasers = 13529 { 13530 { 13531 .eraseblocks = { {128 * 1024, 1} }, 13532 .block_erase = erase_chip_block_jedec, 13533 } 13534 }, 13535 .write = write_jedec, 13536 .read = read_memmapped, 13537 .voltage = {4500, 5500}, 13538 }, 13539 13540 { 13541 .vendor = "SST", 13542 .name = "SST29EE020A", 13543 .bustype = BUS_PARALLEL, 13544 .manufacture_id = SST_ID, 13545 .model_id = SST_SST29EE020A, 13546 .total_size = 256, 13547 .page_size = 128, 13548 .feature_bits = FEATURE_LONG_RESET, 13549 .tested = TEST_OK_PRE, 13550 .probe = probe_jedec, 13551 .probe_timing = 10, 13552 .block_erasers = 13553 { 13554 { 13555 .eraseblocks = { {256 * 1024, 1} }, 13556 .block_erase = erase_chip_block_jedec, 13557 } 13558 }, 13559 .write = write_jedec, 13560 .read = read_memmapped, 13561 .voltage = {4500, 5500}, 13562 }, 13563 13564 { 13565 .vendor = "SST", 13566 .name = "SST29LE010", 13567 .bustype = BUS_PARALLEL, 13568 .manufacture_id = SST_ID, 13569 .model_id = SST_SST29LE010, 13570 .total_size = 128, 13571 .page_size = 128, 13572 .feature_bits = FEATURE_LONG_RESET, 13573 .tested = TEST_UNTESTED, 13574 .probe = probe_jedec, 13575 .probe_timing = 10, 13576 .block_erasers = 13577 { 13578 { 13579 .eraseblocks = { {128 * 1024, 1} }, 13580 .block_erase = erase_chip_block_jedec, 13581 } 13582 }, 13583 .write = write_jedec, 13584 .read = read_memmapped, 13585 .voltage = {3000, 3600}, 13586 }, 13587 13588 { 13589 .vendor = "SST", 13590 .name = "SST29LE020", 13591 .bustype = BUS_PARALLEL, 13592 .manufacture_id = SST_ID, 13593 .model_id = SST_SST29LE020, 13594 .total_size = 256, 13595 .page_size = 128, 13596 .feature_bits = FEATURE_LONG_RESET, 13597 .tested = TEST_OK_PRE, 13598 .probe = probe_jedec, 13599 .probe_timing = 10, 13600 .block_erasers = 13601 { 13602 { 13603 .eraseblocks = { {256 * 1024, 1} }, 13604 .block_erase = erase_chip_block_jedec, 13605 } 13606 }, 13607 .write = write_jedec, 13608 .read = read_memmapped, 13609 .voltage = {3000, 3600}, 13610 }, 13611 13612 { 13613 .vendor = "SST", 13614 .name = "SST39SF010A", 13615 .bustype = BUS_PARALLEL, 13616 .manufacture_id = SST_ID, 13617 .model_id = SST_SST39SF010, 13618 .total_size = 128, 13619 .page_size = 4096, 13620 .feature_bits = FEATURE_EITHER_RESET, 13621 .tested = TEST_OK_PREW, 13622 .probe = probe_jedec, 13623 .probe_timing = 1, /* 150 ns */ 13624 .block_erasers = 13625 { 13626 { 13627 .eraseblocks = { {4 * 1024, 32} }, 13628 .block_erase = erase_sector_jedec, 13629 }, { 13630 .eraseblocks = { {128 * 1024, 1} }, 13631 .block_erase = erase_chip_block_jedec, 13632 } 13633 }, 13634 .write = write_jedec_1, 13635 .read = read_memmapped, 13636 .voltage = {4500, 5500}, 13637 }, 13638 13639 { 13640 .vendor = "SST", 13641 .name = "SST39SF020A", 13642 .bustype = BUS_PARALLEL, 13643 .manufacture_id = SST_ID, 13644 .model_id = SST_SST39SF020, 13645 .total_size = 256, 13646 .page_size = 4096, 13647 .feature_bits = FEATURE_EITHER_RESET, 13648 .tested = TEST_OK_PREW, 13649 .probe = probe_jedec, 13650 .probe_timing = 1, /* 150 ns */ 13651 .block_erasers = 13652 { 13653 { 13654 .eraseblocks = { {4 * 1024, 64} }, 13655 .block_erase = erase_sector_jedec, 13656 }, { 13657 .eraseblocks = { {256 * 1024, 1} }, 13658 .block_erase = erase_chip_block_jedec, 13659 } 13660 }, 13661 .write = write_jedec_1, 13662 .read = read_memmapped, 13663 .voltage = {4500, 5500}, 13664 }, 13665 13666 { 13667 .vendor = "SST", 13668 .name = "SST39SF040", 13669 .bustype = BUS_PARALLEL, 13670 .manufacture_id = SST_ID, 13671 .model_id = SST_SST39SF040, 13672 .total_size = 512, 13673 .page_size = 4096, 13674 .feature_bits = FEATURE_EITHER_RESET, 13675 .tested = TEST_OK_PREW, 13676 .probe = probe_jedec, 13677 .probe_timing = 1, /* 150 ns */ 13678 .block_erasers = 13679 { 13680 { 13681 .eraseblocks = { {4 * 1024, 128} }, 13682 .block_erase = erase_sector_jedec, 13683 }, { 13684 .eraseblocks = { {512 * 1024, 1} }, 13685 .block_erase = erase_chip_block_jedec, 13686 } 13687 }, 13688 .write = write_jedec_1, 13689 .read = read_memmapped, 13690 .voltage = {4500, 5500}, 13691 }, 13692 13693 { 13694 .vendor = "SST", 13695 .name = "SST39SF512", 13696 .bustype = BUS_PARALLEL, 13697 .manufacture_id = SST_ID, 13698 .model_id = SST_SST39SF512, 13699 .total_size = 64, 13700 .page_size = 4096, 13701 .feature_bits = FEATURE_EITHER_RESET, 13702 .tested = TEST_OK_PREW, 13703 .probe = probe_jedec, 13704 .probe_timing = 1, /* 150 ns */ 13705 .block_erasers = 13706 { 13707 { 13708 .eraseblocks = { {4 * 1024, 16} }, 13709 .block_erase = erase_sector_jedec, 13710 }, { 13711 .eraseblocks = { {64 * 1024, 1} }, 13712 .block_erase = erase_chip_block_jedec, 13713 } 13714 }, 13715 .write = write_jedec_1, 13716 .read = read_memmapped, 13717 .voltage = {4500, 5500}, 13718 }, 13719 13720 { 13721 .vendor = "SST", 13722 .name = "SST39VF010", 13723 .bustype = BUS_PARALLEL, 13724 .manufacture_id = SST_ID, 13725 .model_id = SST_SST39VF010, 13726 .total_size = 128, 13727 .page_size = 4096, 13728 .feature_bits = FEATURE_EITHER_RESET, 13729 .tested = TEST_OK_PREW, 13730 .probe = probe_jedec, 13731 .probe_timing = 1, /* 150 ns */ 13732 .block_erasers = 13733 { 13734 { 13735 .eraseblocks = { {4 * 1024, 32} }, 13736 .block_erase = erase_sector_jedec, 13737 }, { 13738 .eraseblocks = { {128 * 1024, 1} }, 13739 .block_erase = erase_chip_block_jedec, 13740 } 13741 }, 13742 .write = write_jedec_1, 13743 .read = read_memmapped, 13744 .voltage = {2700, 3600}, 13745 }, 13746 13747 { 13748 .vendor = "SST", 13749 .name = "SST39VF020", 13750 .bustype = BUS_PARALLEL, 13751 .manufacture_id = SST_ID, 13752 .model_id = SST_SST39VF020, 13753 .total_size = 256, 13754 .page_size = 4096, 13755 .feature_bits = FEATURE_EITHER_RESET, 13756 .tested = TEST_OK_PREW, 13757 .probe = probe_jedec, 13758 .probe_timing = 1, /* 150 ns */ 13759 .block_erasers = 13760 { 13761 { 13762 .eraseblocks = { {4 * 1024, 64} }, 13763 .block_erase = erase_sector_jedec, 13764 }, { 13765 .eraseblocks = { {256 * 1024, 1} }, 13766 .block_erase = erase_chip_block_jedec, 13767 } 13768 }, 13769 .write = write_jedec_1, 13770 .read = read_memmapped, 13771 .voltage = {2700, 3600}, 13772 }, 13773 13774 { 13775 .vendor = "SST", 13776 .name = "SST39VF040", 13777 .bustype = BUS_PARALLEL, 13778 .manufacture_id = SST_ID, 13779 .model_id = SST_SST39VF040, 13780 .total_size = 512, 13781 .page_size = 4096, 13782 .feature_bits = FEATURE_EITHER_RESET, 13783 .tested = TEST_OK_PREW, 13784 .probe = probe_jedec, 13785 .probe_timing = 1, /* 150 ns */ 13786 .block_erasers = 13787 { 13788 { 13789 .eraseblocks = { {4 * 1024, 128} }, 13790 .block_erase = erase_sector_jedec, 13791 }, { 13792 .eraseblocks = { {512 * 1024, 1} }, 13793 .block_erase = erase_chip_block_jedec, 13794 } 13795 }, 13796 .write = write_jedec_1, 13797 .read = read_memmapped, 13798 .voltage = {2700, 3600}, 13799 }, 13800 13801 { 13802 .vendor = "SST", 13803 .name = "SST39VF080", 13804 .bustype = BUS_PARALLEL, 13805 .manufacture_id = SST_ID, 13806 .model_id = SST_SST39VF080, 13807 .total_size = 1024, 13808 .page_size = 4096, 13809 .feature_bits = FEATURE_EITHER_RESET, 13810 .tested = TEST_UNTESTED, 13811 .probe = probe_jedec, 13812 .probe_timing = 1, /* 150 ns */ 13813 .block_erasers = 13814 { 13815 { 13816 .eraseblocks = { {4 * 1024, 256} }, 13817 .block_erase = erase_sector_jedec, 13818 }, { 13819 .eraseblocks = { {64 * 1024, 16} }, 13820 .block_erase = erase_block_jedec, 13821 }, { 13822 .eraseblocks = { {1024 * 1024, 1} }, 13823 .block_erase = erase_chip_block_jedec, 13824 } 13825 }, 13826 .write = write_jedec_1, 13827 .read = read_memmapped, 13828 .voltage = {2700, 3600}, 13829 }, 13830 13831 { 13832 .vendor = "SST", 13833 .name = "SST39VF512", 13834 .bustype = BUS_PARALLEL, 13835 .manufacture_id = SST_ID, 13836 .model_id = SST_SST39VF512, 13837 .total_size = 64, 13838 .page_size = 4096, 13839 .feature_bits = FEATURE_EITHER_RESET, 13840 .tested = TEST_OK_PREW, 13841 .probe = probe_jedec, 13842 .probe_timing = 1, /* 150 ns */ 13843 .block_erasers = 13844 { 13845 { 13846 .eraseblocks = { {4 * 1024, 16} }, 13847 .block_erase = erase_sector_jedec, 13848 }, { 13849 .eraseblocks = { {64 * 1024, 1} }, 13850 .block_erase = erase_chip_block_jedec, 13851 } 13852 }, 13853 .write = write_jedec_1, 13854 .read = read_memmapped, 13855 .voltage = {2700, 3600}, 13856 }, 13857 13858 { 13859 .vendor = "SST", 13860 .name = "SST49LF002A/B", 13861 .bustype = BUS_FWH, /* A/A Mux */ 13862 .manufacture_id = SST_ID, 13863 .model_id = SST_SST49LF002A, 13864 .total_size = 256, 13865 .page_size = 16 * 1024, 13866 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 13867 .tested = TEST_OK_PREW, 13868 .probe = probe_jedec, 13869 .probe_timing = 1, /* 150 ns */ 13870 .block_erasers = 13871 { 13872 { 13873 .eraseblocks = { {4 * 1024, 64} }, 13874 .block_erase = erase_sector_jedec, 13875 }, { 13876 .eraseblocks = { {16 * 1024, 16} }, 13877 .block_erase = erase_block_jedec, 13878 }, { 13879 .eraseblocks = { {256 * 1024, 1} }, 13880 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */ 13881 } 13882 }, 13883 .printlock = printlock_sst_fwhub, 13884 .unlock = unlock_sst_fwhub, 13885 .write = write_jedec_1, 13886 .read = read_memmapped, 13887 .voltage = {3000, 3600}, 13888 }, 13889 13890 { 13891 .vendor = "SST", 13892 .name = "SST49LF003A/B", 13893 .bustype = BUS_FWH, /* A/A Mux */ 13894 .manufacture_id = SST_ID, 13895 .model_id = SST_SST49LF003A, 13896 .total_size = 384, 13897 .page_size = 64 * 1024, 13898 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 13899 .tested = TEST_OK_PREW, 13900 .probe = probe_jedec, 13901 .probe_timing = 1, /* 150 ns */ 13902 .block_erasers = 13903 { 13904 { 13905 .eraseblocks = { {4 * 1024, 96} }, 13906 .block_erase = erase_sector_jedec, 13907 }, { 13908 .eraseblocks = { {64 * 1024, 6} }, 13909 .block_erase = erase_block_jedec, 13910 }, { 13911 .eraseblocks = { {384 * 1024, 1} }, 13912 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */ 13913 } 13914 }, 13915 .printlock = printlock_sst_fwhub, 13916 .unlock = unlock_sst_fwhub, 13917 .write = write_jedec_1, 13918 .read = read_memmapped, 13919 .voltage = {3000, 3600}, 13920 }, 13921 13922 { 13923 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB) 13924 * and is only honored for 64k block erase, but not 4k sector erase. 13925 */ 13926 .vendor = "SST", 13927 .name = "SST49LF004A/B", 13928 .bustype = BUS_FWH, /* A/A Mux */ 13929 .manufacture_id = SST_ID, 13930 .model_id = SST_SST49LF004A, 13931 .total_size = 512, 13932 .page_size = 64 * 1024, 13933 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 13934 .tested = TEST_OK_PREW, 13935 .probe = probe_jedec, 13936 .probe_timing = 1, /* 150 ns */ 13937 .block_erasers = 13938 { 13939 { 13940 .eraseblocks = { {4 * 1024, 128} }, 13941 .block_erase = erase_sector_jedec, 13942 }, { 13943 .eraseblocks = { {64 * 1024, 8} }, 13944 .block_erase = erase_block_jedec, 13945 }, { 13946 .eraseblocks = { {512 * 1024, 1} }, 13947 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */ 13948 }, 13949 }, 13950 .printlock = printlock_sst_fwhub, 13951 .unlock = unlock_sst_fwhub, 13952 .write = write_jedec_1, 13953 .read = read_memmapped, 13954 .voltage = {3000, 3600}, 13955 }, 13956 13957 { 13958 .vendor = "SST", 13959 .name = "SST49LF004C", 13960 .bustype = BUS_FWH, 13961 .manufacture_id = SST_ID, 13962 .model_id = SST_SST49LF004C, 13963 .total_size = 512, 13964 .page_size = 4 * 1024, 13965 .feature_bits = FEATURE_REGISTERMAP, 13966 .tested = TEST_UNTESTED, 13967 .probe = probe_82802ab, 13968 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 13969 .block_erasers = 13970 { 13971 { 13972 .eraseblocks = { {4 * 1024, 128} }, 13973 .block_erase = erase_sector_49lfxxxc, 13974 }, { 13975 .eraseblocks = { 13976 {64 * 1024, 7}, 13977 {32 * 1024, 1}, 13978 {8 * 1024, 2}, 13979 {16 * 1024, 1}, 13980 }, 13981 .block_erase = erase_block_82802ab, 13982 } 13983 }, 13984 .printlock = printlock_regspace2_block_eraser_1, 13985 .unlock = unlock_regspace2_block_eraser_1, 13986 .write = write_82802ab, 13987 .read = read_memmapped, 13988 .voltage = {3000, 3600}, 13989 }, 13990 13991 { 13992 .vendor = "SST", 13993 .name = "SST49LF008A", 13994 .bustype = BUS_FWH, /* A/A Mux */ 13995 .manufacture_id = SST_ID, 13996 .model_id = SST_SST49LF008A, 13997 .total_size = 1024, 13998 .page_size = 64 * 1024, 13999 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 14000 .tested = TEST_OK_PREW, 14001 .probe = probe_jedec, 14002 .probe_timing = 1, /* 150 ns */ 14003 .block_erasers = 14004 { 14005 { 14006 .eraseblocks = { {4 * 1024, 256} }, 14007 .block_erase = erase_sector_jedec, 14008 }, { 14009 .eraseblocks = { {64 * 1024, 16} }, 14010 .block_erase = erase_block_jedec, 14011 }, { 14012 .eraseblocks = { {1024 * 1024, 1} }, 14013 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */ 14014 } 14015 }, 14016 .printlock = printlock_sst_fwhub, 14017 .unlock = unlock_sst_fwhub, 14018 .write = write_jedec_1, 14019 .read = read_memmapped, 14020 .voltage = {3000, 3600}, 14021 }, 14022 14023 { 14024 .vendor = "SST", 14025 .name = "SST49LF008C", 14026 .bustype = BUS_FWH, 14027 .manufacture_id = SST_ID, 14028 .model_id = SST_SST49LF008C, 14029 .total_size = 1024, 14030 .page_size = 4 * 1024, 14031 .feature_bits = FEATURE_REGISTERMAP, 14032 .tested = TEST_UNTESTED, 14033 .probe = probe_82802ab, 14034 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 14035 .block_erasers = 14036 { 14037 { 14038 .eraseblocks = { {4 * 1024, 256} }, 14039 .block_erase = erase_sector_49lfxxxc, 14040 }, { 14041 .eraseblocks = { 14042 {64 * 1024, 15}, 14043 {32 * 1024, 1}, 14044 {8 * 1024, 2}, 14045 {16 * 1024, 1}, 14046 }, 14047 .block_erase = erase_block_82802ab, 14048 } 14049 }, 14050 .printlock = printlock_regspace2_block_eraser_1, 14051 .unlock = unlock_regspace2_block_eraser_1, 14052 .write = write_82802ab, 14053 .read = read_memmapped, 14054 .voltage = {3000, 3600}, 14055 }, 14056 14057 { 14058 .vendor = "SST", 14059 .name = "SST49LF016C", 14060 .bustype = BUS_FWH, 14061 .manufacture_id = SST_ID, 14062 .model_id = SST_SST49LF016C, 14063 .total_size = 2048, 14064 .page_size = 4 * 1024, 14065 .feature_bits = FEATURE_REGISTERMAP, 14066 .tested = TEST_OK_PREW, 14067 .probe = probe_82802ab, 14068 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 14069 .block_erasers = 14070 { 14071 { 14072 .eraseblocks = { {4 * 1024, 512} }, 14073 .block_erase = erase_sector_49lfxxxc, 14074 }, { 14075 .eraseblocks = { 14076 {64 * 1024, 31}, 14077 {32 * 1024, 1}, 14078 {8 * 1024, 2}, 14079 {16 * 1024, 1}, 14080 }, 14081 .block_erase = erase_block_82802ab, 14082 } 14083 }, 14084 .printlock = printlock_regspace2_block_eraser_1, 14085 .unlock = unlock_regspace2_block_eraser_1, 14086 .write = write_82802ab, 14087 .read = read_memmapped, 14088 .voltage = {3000, 3600}, 14089 }, 14090 14091 { 14092 .vendor = "SST", 14093 .name = "SST49LF020", 14094 .bustype = BUS_LPC, 14095 .manufacture_id = SST_ID, 14096 .model_id = SST_SST49LF020, 14097 .total_size = 256, 14098 .page_size = 16 * 1024, 14099 .feature_bits = FEATURE_EITHER_RESET, 14100 .tested = TEST_OK_PREW, 14101 .probe = probe_jedec, 14102 .probe_timing = 1, /* 150 ns */ 14103 .block_erasers = 14104 { 14105 { 14106 .eraseblocks = { {4 * 1024, 64} }, 14107 .block_erase = erase_sector_jedec, 14108 }, { 14109 .eraseblocks = { {16 * 1024, 16} }, 14110 .block_erase = erase_block_jedec, 14111 }, { 14112 .eraseblocks = { {256 * 1024, 1} }, 14113 .block_erase = NULL, 14114 } 14115 }, 14116 .write = write_jedec_1, 14117 .read = read_memmapped, 14118 .voltage = {3000, 3600}, 14119 }, 14120 14121 { 14122 .vendor = "SST", 14123 .name = "SST49LF020A", 14124 .bustype = BUS_LPC, 14125 .manufacture_id = SST_ID, 14126 .model_id = SST_SST49LF020A, 14127 .total_size = 256, 14128 .page_size = 4 * 1024, 14129 .feature_bits = FEATURE_EITHER_RESET, 14130 .tested = TEST_OK_PRE, 14131 .probe = probe_jedec, 14132 .probe_timing = 1, /* 150 ns */ 14133 .block_erasers = 14134 { 14135 { 14136 .eraseblocks = { {4 * 1024, 64} }, 14137 .block_erase = erase_sector_jedec, 14138 }, { 14139 .eraseblocks = { {16 * 1024, 16} }, 14140 .block_erase = erase_block_jedec, 14141 }, { 14142 .eraseblocks = { {256 * 1024, 1} }, 14143 .block_erase = NULL, 14144 } 14145 }, 14146 .write = write_jedec_1, 14147 .read = read_memmapped, 14148 .voltage = {3000, 3600}, 14149 }, 14150 14151 { 14152 .vendor = "SST", 14153 .name = "SST49LF040", 14154 .bustype = BUS_LPC, 14155 .manufacture_id = SST_ID, 14156 .model_id = SST_SST49LF040, 14157 .total_size = 512, 14158 .page_size = 4096, 14159 .feature_bits = FEATURE_EITHER_RESET, 14160 .tested = TEST_OK_PREW, 14161 .probe = probe_jedec, 14162 .probe_timing = 1, /* 150 ns */ 14163 .block_erasers = 14164 { 14165 { 14166 .eraseblocks = { {4 * 1024, 128} }, 14167 .block_erase = erase_sector_jedec, 14168 }, { 14169 .eraseblocks = { {64 * 1024, 8} }, 14170 .block_erase = erase_block_jedec, 14171 }, { 14172 .eraseblocks = { {512 * 1024, 1} }, 14173 .block_erase = NULL, 14174 } 14175 }, 14176 .write = write_jedec_1, 14177 .read = read_memmapped, 14178 .voltage = {3000, 3600}, 14179 }, 14180 14181 { 14182 .vendor = "SST", 14183 .name = "SST49LF040B", 14184 .bustype = BUS_LPC, /* A/A Mux */ 14185 .manufacture_id = SST_ID, 14186 .model_id = SST_SST49LF040B, 14187 .total_size = 512, 14188 .page_size = 64 * 1024, 14189 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP, 14190 .tested = TEST_OK_PREW, 14191 .probe = probe_jedec, 14192 .probe_timing = 1, /* 150ns */ 14193 .block_erasers = 14194 { 14195 { 14196 .eraseblocks = { {4 * 1024, 128} }, 14197 .block_erase = erase_sector_jedec, 14198 }, { 14199 .eraseblocks = { {64 * 1024, 8} }, 14200 .block_erase = erase_block_jedec, 14201 }, { 14202 .eraseblocks = { {512 * 1024, 1} }, 14203 .block_erase = NULL, 14204 } 14205 }, 14206 .unlock = unlock_regspace2_uniform_64k, 14207 .write = write_jedec_1, 14208 .read = read_memmapped, 14209 .voltage = {3000, 3600}, 14210 }, 14211 14212 { 14213 .vendor = "SST", 14214 .name = "SST49LF080A", 14215 .bustype = BUS_LPC, /* A/A Mux */ 14216 .manufacture_id = SST_ID, 14217 .model_id = SST_SST49LF080A, 14218 .total_size = 1024, 14219 .page_size = 4096, 14220 .feature_bits = FEATURE_EITHER_RESET, 14221 .tested = TEST_OK_PREW, 14222 .probe = probe_jedec, 14223 .probe_timing = TIMING_FIXME, 14224 .block_erasers = 14225 { 14226 { 14227 .eraseblocks = { {4 * 1024, 256} }, 14228 .block_erase = erase_sector_jedec, 14229 }, { 14230 .eraseblocks = { {64 * 1024, 16} }, 14231 .block_erase = erase_block_jedec, 14232 }, { 14233 .eraseblocks = { {1024 * 1024, 1} }, 14234 .block_erase = NULL, 14235 } 14236 }, 14237 .write = write_jedec_1, 14238 .read = read_memmapped, 14239 .voltage = {3000, 3600}, 14240 }, 14241 14242 { 14243 .vendor = "SST", 14244 .name = "SST49LF160C", 14245 .bustype = BUS_LPC, 14246 .manufacture_id = SST_ID, 14247 .model_id = SST_SST49LF160C, 14248 .total_size = 2048, 14249 .page_size = 4 * 1024, 14250 .feature_bits = FEATURE_REGISTERMAP, 14251 .tested = TEST_OK_PR, 14252 .probe = probe_82802ab, 14253 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 14254 .block_erasers = 14255 { 14256 { 14257 .eraseblocks = { {4 * 1024, 512} }, 14258 .block_erase = erase_sector_49lfxxxc, 14259 }, { 14260 .eraseblocks = { 14261 {64 * 1024, 31}, 14262 {32 * 1024, 1}, 14263 {8 * 1024, 2}, 14264 {16 * 1024, 1}, 14265 }, 14266 .block_erase = erase_block_82802ab, 14267 } 14268 }, 14269 .printlock = printlock_regspace2_block_eraser_1, 14270 .unlock = unlock_regspace2_block_eraser_1, 14271 .write = write_82802ab, 14272 .read = read_memmapped, 14273 .voltage = {3000, 3600}, 14274 }, 14275 14276 { 14277 .vendor = "ST", 14278 .name = "M29F002B", 14279 .bustype = BUS_PARALLEL, 14280 .manufacture_id = ST_ID, 14281 .model_id = ST_M29F002B, 14282 .total_size = 256, 14283 .page_size = 64 * 1024, 14284 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 14285 .tested = TEST_UNTESTED, 14286 .probe = probe_jedec, 14287 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14288 .block_erasers = 14289 { 14290 { 14291 .eraseblocks = { 14292 {16 * 1024, 1}, 14293 {8 * 1024, 2}, 14294 {32 * 1024, 1}, 14295 {64 * 1024, 3}, 14296 }, 14297 .block_erase = erase_sector_jedec, 14298 }, { 14299 .eraseblocks = { {256 * 1024, 1} }, 14300 .block_erase = erase_chip_block_jedec, 14301 } 14302 }, 14303 .write = write_jedec_1, 14304 .read = read_memmapped, 14305 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */ 14306 }, 14307 14308 { 14309 .vendor = "ST", 14310 .name = "M29F002T/NT", 14311 .bustype = BUS_PARALLEL, 14312 .manufacture_id = ST_ID, 14313 .model_id = ST_M29F002T, 14314 .total_size = 256, 14315 .page_size = 64 * 1024, 14316 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 14317 .tested = TEST_OK_PREW, 14318 .probe = probe_jedec, 14319 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14320 .block_erasers = 14321 { 14322 { 14323 .eraseblocks = { 14324 {64 * 1024, 3}, 14325 {32 * 1024, 1}, 14326 {8 * 1024, 2}, 14327 {16 * 1024, 1}, 14328 }, 14329 .block_erase = erase_sector_jedec, 14330 }, { 14331 .eraseblocks = { {256 * 1024, 1} }, 14332 .block_erase = erase_chip_block_jedec, 14333 } 14334 }, 14335 .write = write_jedec_1, 14336 .read = read_memmapped, 14337 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */ 14338 }, 14339 14340 { 14341 .vendor = "ST", 14342 .name = "M29F040B", 14343 .bustype = BUS_PARALLEL, 14344 .manufacture_id = ST_ID, 14345 .model_id = ST_M29F040B, 14346 .total_size = 512, 14347 .page_size = 64 * 1024, 14348 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14349 .tested = TEST_UNTESTED, 14350 .probe = probe_jedec, 14351 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */ 14352 .block_erasers = 14353 { 14354 { 14355 .eraseblocks = { {64 * 1024, 8} }, 14356 .block_erase = erase_sector_jedec, 14357 }, { 14358 .eraseblocks = { {512 * 1024, 1} }, 14359 .block_erase = erase_chip_block_jedec, 14360 } 14361 }, 14362 .write = write_jedec_1, 14363 .read = read_memmapped, 14364 .voltage = {4500, 5500}, 14365 }, 14366 14367 { 14368 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 14369 .vendor = "ST", 14370 .name = "M29F400BB", 14371 .bustype = BUS_PARALLEL, 14372 .manufacture_id = ST_ID, 14373 .model_id = ST_M29F400BB, 14374 .total_size = 512, 14375 .page_size = 64 * 1024, 14376 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14377 .tested = TEST_UNTESTED, 14378 .probe = probe_jedec, 14379 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 14380 .block_erasers = 14381 { 14382 { 14383 .eraseblocks = { 14384 {16 * 1024, 1}, 14385 {8 * 1024, 2}, 14386 {32 * 1024, 1}, 14387 {64 * 1024, 7}, 14388 }, 14389 .block_erase = erase_sector_jedec, 14390 }, { 14391 .eraseblocks = { {512 * 1024, 1} }, 14392 .block_erase = erase_chip_block_jedec, 14393 } 14394 }, 14395 .write = write_jedec_1, 14396 .read = read_memmapped, 14397 .voltage = {4500, 5500}, 14398 }, 14399 14400 { 14401 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 14402 .vendor = "ST", 14403 .name = "M29F400BT", 14404 .bustype = BUS_PARALLEL, 14405 .manufacture_id = ST_ID, 14406 .model_id = ST_M29F400BT, 14407 .total_size = 512, 14408 .page_size = 64 * 1024, 14409 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14410 .tested = TEST_UNTESTED, 14411 .probe = probe_jedec, 14412 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 14413 .block_erasers = 14414 { 14415 { 14416 .eraseblocks = { 14417 {64 * 1024, 7}, 14418 {32 * 1024, 1}, 14419 {8 * 1024, 2}, 14420 {16 * 1024, 1}, 14421 }, 14422 .block_erase = erase_sector_jedec, 14423 }, { 14424 .eraseblocks = { {512 * 1024, 1} }, 14425 .block_erase = erase_chip_block_jedec, 14426 } 14427 }, 14428 .write = write_jedec_1, 14429 .read = read_memmapped, 14430 .voltage = {4500, 5500}, 14431 }, 14432 14433 { 14434 .vendor = "ST", 14435 .name = "M29W010B", 14436 .bustype = BUS_PARALLEL, 14437 .manufacture_id = ST_ID, 14438 .model_id = ST_M29W010B, 14439 .total_size = 128, 14440 .page_size = 16 * 1024, 14441 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14442 .tested = TEST_UNTESTED, 14443 .probe = probe_jedec, 14444 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14445 .block_erasers = 14446 { 14447 { 14448 .eraseblocks = { {16 * 1024, 8} }, 14449 .block_erase = erase_sector_jedec, 14450 }, { 14451 .eraseblocks = { {128 * 1024, 1} }, 14452 .block_erase = erase_chip_block_jedec, 14453 } 14454 }, 14455 .write = write_jedec_1, 14456 .read = read_memmapped, 14457 .voltage = {2700, 3600}, 14458 }, 14459 14460 { 14461 .vendor = "ST", 14462 .name = "M29W040B", 14463 .bustype = BUS_PARALLEL, 14464 .manufacture_id = ST_ID, 14465 .model_id = ST_M29W040B, 14466 .total_size = 512, 14467 .page_size = 64 * 1024, 14468 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14469 .tested = TEST_UNTESTED, 14470 .probe = probe_jedec, 14471 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14472 .block_erasers = 14473 { 14474 { 14475 .eraseblocks = { {64 * 1024, 8} }, 14476 .block_erase = erase_sector_jedec, 14477 }, { 14478 .eraseblocks = { {512 * 1024, 1} }, 14479 .block_erase = erase_chip_block_jedec, 14480 } 14481 }, 14482 .write = write_jedec_1, 14483 .read = read_memmapped, 14484 .voltage = {2700, 3600}, 14485 }, 14486 14487 { 14488 .vendor = "ST", 14489 .name = "M29W512B", 14490 .bustype = BUS_PARALLEL, 14491 .manufacture_id = ST_ID, 14492 .model_id = ST_M29W512B, 14493 .total_size = 64, 14494 .page_size = 64 * 1024, 14495 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 14496 .tested = TEST_OK_PREW, 14497 .probe = probe_jedec, 14498 .probe_timing = TIMING_ZERO, 14499 .block_erasers = 14500 { 14501 { 14502 .eraseblocks = { {64 * 1024, 1} }, 14503 .block_erase = erase_chip_block_jedec, 14504 } 14505 }, 14506 .write = write_jedec_1, 14507 .read = read_memmapped, 14508 .voltage = {2700, 3600}, 14509 }, 14510 14511 { 14512 .vendor = "ST", 14513 .name = "M50FLW040A", 14514 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 14515 .manufacture_id = ST_ID, 14516 .model_id = ST_M50FLW040A, 14517 .total_size = 512, 14518 .page_size = 0, 14519 .feature_bits = FEATURE_REGISTERMAP, 14520 .tested = TEST_UNTESTED, 14521 .probe = probe_82802ab, 14522 .probe_timing = TIMING_FIXME, 14523 .block_erasers = 14524 { 14525 { 14526 .eraseblocks = { 14527 {4 * 1024, 16}, /* sector */ 14528 {64 * 1024, 5}, /* block */ 14529 {4 * 1024, 16}, /* sector */ 14530 {4 * 1024, 16}, /* sector */ 14531 }, 14532 .block_erase = erase_sector_stm50, 14533 }, { 14534 .eraseblocks = { {64 * 1024, 8} }, 14535 .block_erase = erase_block_82802ab, 14536 } 14537 }, 14538 .unlock = unlock_regspace2_uniform_64k, 14539 .write = write_82802ab, 14540 .read = read_memmapped, 14541 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14542 }, 14543 14544 { 14545 .vendor = "ST", 14546 .name = "M50FLW040B", 14547 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 14548 .manufacture_id = ST_ID, 14549 .model_id = ST_M50FLW040B, 14550 .total_size = 512, 14551 .page_size = 0, 14552 .feature_bits = FEATURE_REGISTERMAP, 14553 .tested = TEST_UNTESTED, 14554 .probe = probe_82802ab, 14555 .probe_timing = TIMING_FIXME, 14556 .block_erasers = 14557 { 14558 { 14559 .eraseblocks = { 14560 {4 * 1024, 16}, /* sector */ 14561 {4 * 1024, 16}, /* sector */ 14562 {64 * 1024, 5}, /* block */ 14563 {4 * 1024, 16}, /* sector */ 14564 }, 14565 .block_erase = erase_sector_stm50, 14566 }, { 14567 .eraseblocks = { {64 * 1024, 8} }, 14568 .block_erase = erase_block_82802ab, 14569 } 14570 }, 14571 .unlock = unlock_regspace2_uniform_64k, 14572 .write = write_82802ab, 14573 .read = read_memmapped, 14574 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14575 }, 14576 14577 { 14578 .vendor = "ST", 14579 .name = "M50FLW080A", 14580 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 14581 .manufacture_id = ST_ID, 14582 .model_id = ST_M50FLW080A, 14583 .total_size = 1024, 14584 .page_size = 0, 14585 .feature_bits = FEATURE_REGISTERMAP, 14586 .tested = TEST_OK_PR, 14587 .probe = probe_82802ab, 14588 .probe_timing = TIMING_FIXME, 14589 .block_erasers = 14590 { 14591 { 14592 .eraseblocks = { 14593 {4 * 1024, 16}, /* sector */ 14594 {64 * 1024, 13}, /* block */ 14595 {4 * 1024, 16}, /* sector */ 14596 {4 * 1024, 16}, /* sector */ 14597 }, 14598 .block_erase = erase_sector_stm50, 14599 }, { 14600 .eraseblocks = { {64 * 1024, 16} }, 14601 .block_erase = erase_block_82802ab, 14602 } 14603 }, 14604 .printlock = printlock_regspace2_block_eraser_0, 14605 .unlock = unlock_regspace2_block_eraser_0, 14606 .write = write_82802ab, 14607 .read = read_memmapped, 14608 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14609 }, 14610 14611 { 14612 .vendor = "ST", 14613 .name = "M50FLW080B", 14614 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 14615 .manufacture_id = ST_ID, 14616 .model_id = ST_M50FLW080B, 14617 .total_size = 1024, 14618 .page_size = 0, 14619 .feature_bits = FEATURE_REGISTERMAP, 14620 .tested = TEST_UNTESTED, 14621 .probe = probe_82802ab, 14622 .probe_timing = TIMING_FIXME, 14623 .block_erasers = 14624 { 14625 { 14626 .eraseblocks = { 14627 {4 * 1024, 16}, /* sector */ 14628 {4 * 1024, 16}, /* sector */ 14629 {64 * 1024, 13}, /* block */ 14630 {4 * 1024, 16}, /* sector */ 14631 }, 14632 .block_erase = erase_sector_stm50, 14633 }, { 14634 .eraseblocks = { {64 * 1024, 16} }, 14635 .block_erase = erase_block_82802ab, 14636 } 14637 }, 14638 .printlock = printlock_regspace2_block_eraser_0, 14639 .unlock = unlock_regspace2_block_eraser_0, 14640 .write = write_82802ab, 14641 .read = read_memmapped, 14642 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14643 }, 14644 14645 { 14646 .vendor = "ST", 14647 .name = "M50FW002", 14648 .bustype = BUS_FWH, /* A/A Mux */ 14649 .manufacture_id = ST_ID, 14650 .model_id = ST_M50FW002, 14651 .total_size = 256, 14652 .page_size = 0, 14653 .feature_bits = FEATURE_REGISTERMAP, 14654 .tested = TEST_OK_PR, 14655 .probe = probe_82802ab, 14656 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 14657 .block_erasers = 14658 { 14659 { 14660 .eraseblocks = { 14661 {64 * 1024, 3}, 14662 {32 * 1024, 1}, 14663 {8 * 1024, 2}, 14664 {16 * 1024, 1}, 14665 }, 14666 .block_erase = erase_block_82802ab, 14667 }, { 14668 .eraseblocks = { {256 * 1024, 1} }, 14669 .block_erase = NULL, /* Only in A/A mux mode */ 14670 } 14671 }, 14672 .printlock = printlock_regspace2_block_eraser_0, 14673 .unlock = unlock_regspace2_block_eraser_0, 14674 .write = write_82802ab, 14675 .read = read_memmapped, 14676 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14677 }, 14678 14679 { 14680 .vendor = "ST", 14681 .name = "M50FW016", 14682 .bustype = BUS_FWH, /* A/A Mux */ 14683 .manufacture_id = ST_ID, 14684 .model_id = ST_M50FW016, 14685 .total_size = 2048, 14686 .page_size = 0, 14687 .feature_bits = FEATURE_REGISTERMAP, 14688 .tested = TEST_UNTESTED, 14689 .probe = probe_82802ab, 14690 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 14691 .block_erasers = 14692 { 14693 { 14694 .eraseblocks = { {64 * 1024, 32} }, 14695 .block_erase = erase_block_82802ab, 14696 } 14697 }, 14698 .unlock = unlock_regspace2_uniform_64k, 14699 .write = write_82802ab, 14700 .read = read_memmapped, 14701 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14702 }, 14703 14704 { 14705 .vendor = "ST", 14706 .name = "M50FW040", 14707 .bustype = BUS_FWH, /* A/A Mux */ 14708 .manufacture_id = ST_ID, 14709 .model_id = ST_M50FW040, 14710 .total_size = 512, 14711 .page_size = 0, 14712 .feature_bits = FEATURE_REGISTERMAP, 14713 .tested = TEST_OK_PR, 14714 .probe = probe_82802ab, 14715 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 14716 .block_erasers = 14717 { 14718 { 14719 .eraseblocks = { {64 * 1024, 8} }, 14720 .block_erase = erase_block_82802ab, 14721 } 14722 }, 14723 .unlock = unlock_regspace2_uniform_64k, 14724 .write = write_82802ab, 14725 .read = read_memmapped, 14726 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14727 }, 14728 14729 { 14730 .vendor = "ST", 14731 .name = "M50FW080", 14732 .bustype = BUS_FWH, /* A/A Mux */ 14733 .manufacture_id = ST_ID, 14734 .model_id = ST_M50FW080, 14735 .total_size = 1024, 14736 .page_size = 0, 14737 .feature_bits = FEATURE_REGISTERMAP, 14738 .tested = TEST_OK_PR, 14739 .probe = probe_82802ab, 14740 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 14741 .block_erasers = 14742 { 14743 { 14744 .eraseblocks = { {64 * 1024, 16} }, 14745 .block_erase = erase_block_82802ab, 14746 } 14747 }, 14748 .unlock = unlock_regspace2_uniform_64k, 14749 .write = write_82802ab, 14750 .read = read_memmapped, 14751 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14752 }, 14753 14754 { 14755 .vendor = "ST", 14756 .name = "M50LPW080", 14757 .bustype = BUS_LPC, /* A/A Mux */ 14758 .manufacture_id = ST_ID, 14759 .model_id = ST_M50LPW080, 14760 .total_size = 1024, 14761 .page_size = 0, 14762 .feature_bits = FEATURE_REGISTERMAP, 14763 .tested = TEST_UNTESTED, 14764 .probe = probe_82802ab, 14765 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14766 .block_erasers = 14767 { 14768 { 14769 .eraseblocks = { {64 * 1024, 16} }, 14770 .block_erase = erase_block_82802ab, 14771 } 14772 }, 14773 .unlock = unlock_regspace2_uniform_64k, 14774 .write = write_82802ab, 14775 .read = read_memmapped, 14776 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14777 }, 14778 14779 { 14780 .vendor = "ST", 14781 .name = "M50LPW116", 14782 .bustype = BUS_LPC, /* A/A Mux */ 14783 .manufacture_id = ST_ID, 14784 .model_id = ST_M50LPW116, 14785 .total_size = 2048, 14786 .page_size = 0, 14787 .feature_bits = FEATURE_REGISTERMAP, 14788 .tested = TEST_UNTESTED, 14789 .probe = probe_82802ab, 14790 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 14791 .block_erasers = 14792 { 14793 { 14794 .eraseblocks = { 14795 {4 * 1024, 16}, 14796 {64 * 1024, 30}, 14797 {32 * 1024, 1}, 14798 {8 * 1024, 2}, 14799 {16 * 1024, 1}, 14800 }, 14801 .block_erase = erase_block_82802ab, 14802 } 14803 }, 14804 .printlock = printlock_regspace2_block_eraser_0, 14805 .unlock = unlock_regspace2_block_eraser_0, 14806 .write = write_82802ab, 14807 .read = read_memmapped, 14808 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 14809 }, 14810 14811 { 14812 .vendor = "ST", 14813 .name = "M95M02", 14814 .bustype = BUS_SPI, 14815 .manufacture_id = ST_ID, 14816 .model_id = ST_M95M02, 14817 .total_size = 256, 14818 .page_size = 256, 14819 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO, 14820 .tested = TEST_OK_PREW, 14821 .probe = probe_spi_st95, 14822 .probe_timing = TIMING_ZERO, 14823 .block_erasers = 14824 { 14825 { 14826 .eraseblocks = { {256 * 1024, 1} }, 14827 .block_erase = spi_block_erase_emulation, 14828 } 14829 }, 14830 14831 .printlock = spi_prettyprint_status_register_bp1_srwd, 14832 .unlock = spi_disable_blockprotect_bp1_srwd, 14833 .write = spi_chip_write_256, 14834 .read = spi_chip_read, 14835 .voltage = {2500, 5500}, 14836 }, 14837 14838 { 14839 .vendor = "Sanyo", 14840 .name = "LE25FU106B", 14841 .bustype = BUS_SPI, 14842 .manufacture_id = SANYO_ID, 14843 .model_id = SANYO_LE25FU106B, 14844 .total_size = 128, 14845 .page_size = 256, 14846 .feature_bits = FEATURE_WRSR_WREN, 14847 .tested = TEST_UNTESTED, 14848 .probe = probe_spi_res2, 14849 .probe_timing = TIMING_ZERO, 14850 .block_erasers = 14851 { 14852 /* FIXME: Is this correct? 14853 { 14854 .eraseblocks = { {2 * 1024, 64} }, 14855 .block_erase = spi_block_erase_d7, 14856 },*/ 14857 { 14858 .eraseblocks = { {32 * 1024, 4} }, 14859 .block_erase = spi_block_erase_d8, 14860 }, { 14861 .eraseblocks = { {128 * 1024, 1} }, 14862 .block_erase = spi_block_erase_c7, 14863 } 14864 }, 14865 .printlock = spi_prettyprint_status_register_bp1_srwd, 14866 .unlock = spi_disable_blockprotect_bp1_srwd, 14867 .write = spi_chip_write_256, 14868 .read = spi_chip_read, 14869 .voltage = {2300, 3600}, 14870 }, 14871 14872 { 14873 .vendor = "Sanyo", 14874 .name = "LE25FU206", 14875 .bustype = BUS_SPI, 14876 .manufacture_id = SANYO_ID, 14877 .model_id = SANYO_LE25FU206, 14878 .total_size = 256, 14879 .page_size = 256, 14880 .feature_bits = FEATURE_WRSR_WREN, 14881 .tested = TEST_UNTESTED, 14882 .probe = probe_spi_res2, 14883 .probe_timing = TIMING_ZERO, 14884 .block_erasers = 14885 { 14886 { 14887 .eraseblocks = { {4 * 1024, 64} }, 14888 .block_erase = spi_block_erase_d7, 14889 }, { 14890 .eraseblocks = { {64 * 1024, 4} }, 14891 .block_erase = spi_block_erase_d8, 14892 }, { 14893 .eraseblocks = { {256 * 1024, 1} }, 14894 .block_erase = spi_block_erase_c7, 14895 } 14896 }, 14897 .printlock = spi_prettyprint_status_register_bp1_srwd, 14898 .unlock = spi_disable_blockprotect_bp1_srwd, 14899 .write = spi_chip_write_256, 14900 .read = spi_chip_read, 14901 .voltage = {2300, 3600}, 14902 }, 14903 14904 { 14905 .vendor = "Sanyo", 14906 .name = "LE25FU206A", 14907 .bustype = BUS_SPI, 14908 .manufacture_id = SANYO_ID, 14909 .model_id = SANYO_LE25FU206A, 14910 .total_size = 256, 14911 .page_size = 256, 14912 .tested = TEST_UNTESTED, 14913 .probe = probe_spi_rdid, 14914 .probe_timing = TIMING_ZERO, 14915 .block_erasers = 14916 { 14917 { 14918 .eraseblocks = { {4 * 1024, 64} }, 14919 .block_erase = spi_block_erase_20, 14920 }, { 14921 .eraseblocks = { {4 * 1024, 64} }, 14922 .block_erase = spi_block_erase_d7, 14923 }, { 14924 .eraseblocks = { {64 * 1024, 4} }, 14925 .block_erase = spi_block_erase_d8, 14926 }, { 14927 .eraseblocks = { {256 * 1024, 1} }, 14928 .block_erase = spi_block_erase_60, 14929 }, { 14930 .eraseblocks = { {256 * 1024, 1} }, 14931 .block_erase = spi_block_erase_c7, 14932 } 14933 }, 14934 .printlock = spi_prettyprint_status_register_bp2_srwd, 14935 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */ 14936 .write = spi_chip_write_256, 14937 .read = spi_chip_read, 14938 .voltage = {2300, 3600}, 14939 }, 14940 14941 { 14942 .vendor = "Sanyo", 14943 .name = "LE25FU406B", 14944 .bustype = BUS_SPI, 14945 .manufacture_id = SANYO_ID, 14946 .model_id = SANYO_LE25FU406B, 14947 .total_size = 512, 14948 .page_size = 256, 14949 .feature_bits = FEATURE_WRSR_WREN, 14950 .tested = TEST_OK_PREW, 14951 .probe = probe_spi_res2, 14952 .probe_timing = TIMING_ZERO, 14953 .block_erasers = 14954 { 14955 { 14956 .eraseblocks = { {4 * 1024, 128} }, 14957 .block_erase = spi_block_erase_d7, 14958 }, { 14959 .eraseblocks = { {64 * 1024, 8} }, 14960 .block_erase = spi_block_erase_d8, 14961 }, { 14962 .eraseblocks = { {512 * 1024, 1} }, 14963 .block_erase = spi_block_erase_c7, 14964 } 14965 }, 14966 .printlock = spi_prettyprint_status_register_bp2_srwd, 14967 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */ 14968 .write = spi_chip_write_256, 14969 .read = spi_chip_read, 14970 .voltage = {2300, 3600}, 14971 }, 14972 14973 { 14974 .vendor = "Sanyo", 14975 .name = "LE25FU406C/LE25U40CMC", 14976 .bustype = BUS_SPI, 14977 .manufacture_id = SANYO_ID, 14978 .model_id = SANYO_LE25FU406C, 14979 .total_size = 512, 14980 .page_size = 256, 14981 .feature_bits = FEATURE_WRSR_WREN, 14982 .tested = TEST_OK_PREW, 14983 .probe = probe_spi_rdid, 14984 .probe_timing = TIMING_ZERO, 14985 .block_erasers = 14986 { 14987 { 14988 .eraseblocks = { {4 * 1024, 128} }, 14989 .block_erase = spi_block_erase_20, 14990 }, { 14991 .eraseblocks = { {4 * 1024, 128} }, 14992 .block_erase = spi_block_erase_d7, 14993 }, { 14994 .eraseblocks = { {64 * 1024, 8} }, 14995 .block_erase = spi_block_erase_d8, 14996 }, { 14997 .eraseblocks = { {512 * 1024, 1} }, 14998 .block_erase = spi_block_erase_60, 14999 }, { 15000 .eraseblocks = { {512 * 1024, 1} }, 15001 .block_erase = spi_block_erase_c7, 15002 } 15003 }, 15004 .printlock = spi_prettyprint_status_register_bp2_srwd, 15005 .unlock = spi_disable_blockprotect_bp2_srwd, 15006 .write = spi_chip_write_256, 15007 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */ 15008 .voltage = {2300, 3600}, 15009 }, 15010 15011 { 15012 .vendor = "Sanyo", 15013 .name = "LE25FW106", 15014 .bustype = BUS_SPI, 15015 .manufacture_id = SANYO_ID, 15016 .model_id = SANYO_LE25FW106, 15017 .total_size = 128, 15018 .page_size = 256, 15019 .feature_bits = FEATURE_WRSR_WREN, 15020 .tested = TEST_OK_PREW, 15021 .probe = probe_spi_res2, 15022 .probe_timing = TIMING_ZERO, 15023 .block_erasers = 15024 { 15025 { 15026 .eraseblocks = { {2 * 1024, 64} }, 15027 .block_erase = spi_block_erase_d7, 15028 }, { 15029 .eraseblocks = { {32 * 1024, 4} }, 15030 .block_erase = spi_block_erase_d8, 15031 }, { 15032 .eraseblocks = { {128 * 1024, 1} }, 15033 .block_erase = spi_block_erase_c7, 15034 } 15035 }, 15036 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */ 15037 .unlock = spi_disable_blockprotect_bp1_srwd, 15038 .write = spi_chip_write_256, 15039 .read = spi_chip_read, 15040 .voltage = {2700, 3600}, 15041 }, 15042 15043 { 15044 .vendor = "Sanyo", 15045 .name = "LE25FW203A", 15046 .bustype = BUS_SPI, 15047 .manufacture_id = SANYO_ID, 15048 .model_id = SANYO_LE25FW203A, 15049 .total_size = 256, 15050 .page_size = 256, 15051 .tested = TEST_UNTESTED, 15052 .probe = probe_spi_rdid, 15053 .probe_timing = TIMING_ZERO, 15054 .block_erasers = 15055 { 15056 { 15057 .eraseblocks = { {256, 1024} }, 15058 .block_erase = spi_block_erase_db, 15059 }, { 15060 .eraseblocks = { {64 * 1024, 4} }, 15061 .block_erase = spi_block_erase_d8, 15062 }, { 15063 .eraseblocks = { {256 * 1024, 1} }, 15064 .block_erase = spi_block_erase_c7, 15065 } 15066 }, 15067 .printlock = spi_prettyprint_status_register_default_welwip, 15068 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 15069 .write = spi_chip_write_256, 15070 .read = spi_chip_read, 15071 .voltage = {2700, 3600}, 15072 }, 15073 15074 { 15075 .vendor = "Sanyo", 15076 .name = "LE25FW403A", 15077 .bustype = BUS_SPI, 15078 .manufacture_id = SANYO_ID, 15079 .model_id = SANYO_LE25FW403A, 15080 .total_size = 512, 15081 .page_size = 256, 15082 .tested = TEST_UNTESTED, 15083 .probe = probe_spi_rdid, 15084 .probe_timing = TIMING_ZERO, 15085 .block_erasers = 15086 { 15087 { 15088 .eraseblocks = { {256, 2 * 1024} }, 15089 .block_erase = spi_block_erase_db, 15090 }, { 15091 .eraseblocks = { {64 * 1024, 8} }, 15092 .block_erase = spi_block_erase_d8, 15093 }, { 15094 .eraseblocks = { {512 * 1024, 1} }, 15095 .block_erase = spi_block_erase_c7, 15096 } 15097 }, 15098 .printlock = spi_prettyprint_status_register_default_welwip, 15099 .unlock = NULL, /* #WP pin write-protects lower 64kB. */ 15100 .write = spi_chip_write_256, 15101 .read = spi_chip_read, 15102 .voltage = {2700, 3600}, 15103 }, 15104 15105 { 15106 .vendor = "Sanyo", 15107 .name = "LE25FW406A", 15108 .bustype = BUS_SPI, 15109 .manufacture_id = SANYO_ID, 15110 .model_id = SANYO_LE25FW406A, 15111 .total_size = 512, 15112 .page_size = 256, 15113 .feature_bits = FEATURE_WRSR_WREN, 15114 .tested = TEST_OK_PREW, 15115 .probe = probe_spi_res2, 15116 .probe_timing = TIMING_ZERO, 15117 .block_erasers = 15118 { 15119 { 15120 .eraseblocks = { {4 * 1024, 128} }, 15121 .block_erase = spi_block_erase_d7, 15122 }, { 15123 .eraseblocks = { {64 * 1024, 8} }, 15124 .block_erase = spi_block_erase_d8, 15125 }, { 15126 .eraseblocks = { {512 * 1024, 1} }, 15127 .block_erase = spi_block_erase_c7, 15128 } 15129 }, 15130 .printlock = spi_prettyprint_status_register_plain, 15131 .unlock = spi_disable_blockprotect, 15132 .write = spi_chip_write_256, 15133 .read = spi_chip_read, 15134 .voltage = {2700, 3600}, 15135 }, 15136 15137 { 15138 .vendor = "Sanyo", 15139 .name = "LE25FW418A", 15140 .bustype = BUS_SPI, 15141 .manufacture_id = SANYO_ID, 15142 .model_id = SANYO_LE25FW418A, 15143 .total_size = 512, 15144 .page_size = 256, 15145 .feature_bits = FEATURE_WRSR_WREN, 15146 .tested = TEST_UNTESTED, 15147 .probe = probe_spi_res2, 15148 .probe_timing = TIMING_ZERO, 15149 .block_erasers = 15150 { 15151 { 15152 .eraseblocks = { {4 * 1024, 128} }, 15153 .block_erase = spi_block_erase_d7, 15154 }, { 15155 .eraseblocks = { {64 * 1024, 8} }, 15156 .block_erase = spi_block_erase_d8, 15157 }, { 15158 .eraseblocks = { {512 * 1024, 1} }, 15159 .block_erase = spi_block_erase_c7, 15160 } 15161 }, 15162 .printlock = spi_prettyprint_status_register_bp2_srwd, 15163 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */ 15164 .write = spi_chip_write_256, 15165 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */ 15166 .voltage = {2700, 3600}, 15167 }, 15168 15169 { 15170 .vendor = "Sanyo", 15171 .name = "LE25FW806", 15172 .bustype = BUS_SPI, 15173 .manufacture_id = SANYO_ID, 15174 .model_id = SANYO_LE25FW806, 15175 .total_size = 1024, 15176 .page_size = 256, 15177 .feature_bits = FEATURE_WRSR_WREN, 15178 .tested = TEST_UNTESTED, 15179 .probe = probe_spi_res2, 15180 .probe_timing = TIMING_ZERO, 15181 .block_erasers = 15182 { 15183 { 15184 .eraseblocks = { {4 * 1024, 256} }, 15185 .block_erase = spi_block_erase_20, 15186 }, { 15187 .eraseblocks = { {4 * 1024, 256} }, 15188 .block_erase = spi_block_erase_d7, 15189 }, { 15190 .eraseblocks = { {64 * 1024, 16} }, 15191 .block_erase = spi_block_erase_d8, 15192 }, { 15193 .eraseblocks = { {1024 * 1024, 1} }, 15194 .block_erase = spi_block_erase_c7, 15195 } 15196 }, 15197 .printlock = spi_prettyprint_status_register_bp2_srwd, 15198 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */ 15199 .write = spi_chip_write_256, 15200 .read = spi_chip_read, 15201 .voltage = {2700, 3600}, 15202 }, 15203 15204 { 15205 .vendor = "Sanyo", 15206 .name = "LE25FW808", 15207 .bustype = BUS_SPI, 15208 .manufacture_id = SANYO_ID, 15209 .model_id = SANYO_LE25FW808, 15210 .total_size = 1024, 15211 .page_size = 256, 15212 .feature_bits = FEATURE_WRSR_WREN, 15213 .tested = TEST_UNTESTED, 15214 .probe = probe_spi_res2, 15215 .probe_timing = TIMING_ZERO, 15216 .block_erasers = 15217 { 15218 { 15219 .eraseblocks = { {8 * 1024, 128} }, 15220 .block_erase = spi_block_erase_d7, 15221 }, { 15222 .eraseblocks = { {64 * 1024, 16} }, 15223 .block_erase = spi_block_erase_d8, 15224 }, { 15225 .eraseblocks = { {1024 * 1024, 1} }, 15226 .block_erase = spi_block_erase_c7, 15227 } 15228 }, 15229 .printlock = spi_prettyprint_status_register_bp2_srwd, 15230 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */ 15231 .write = spi_chip_write_256, 15232 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */ 15233 .voltage = {2700, 3600}, 15234 }, 15235 15236 { 15237 .vendor = "Sharp", 15238 .name = "LH28F008BJT-BTLZ1", 15239 .bustype = BUS_PARALLEL, 15240 .manufacture_id = SHARP_ID, 15241 .model_id = SHARP_LH28F008BJ__PB, 15242 .total_size = 1024, 15243 .page_size = 64 * 1024, 15244 .tested = TEST_OK_PREW, 15245 .probe = probe_82802ab, 15246 .probe_timing = TIMING_ZERO, 15247 .block_erasers = 15248 { 15249 { 15250 .eraseblocks = { 15251 {8 * 1024, 8}, 15252 {64 * 1024, 15} 15253 }, 15254 .block_erase = erase_block_82802ab, 15255 }, { 15256 .eraseblocks = { {1024 * 1024, 1} }, 15257 .block_erase = erase_sector_49lfxxxc, 15258 } 15259 }, 15260 .unlock = unlock_lh28f008bjt, 15261 .write = write_82802ab, 15262 .read = read_memmapped, 15263 .voltage = {2700, 3600}, 15264 }, 15265 15266 { 15267 .vendor = "Sharp", 15268 .name = "LHF00L04", 15269 .bustype = BUS_FWH, /* A/A Mux */ 15270 .manufacture_id = SHARP_ID, 15271 .model_id = SHARP_LHF00L04, 15272 .total_size = 1024, 15273 .page_size = 64 * 1024, 15274 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP, 15275 .tested = TEST_UNTESTED, 15276 .probe = probe_82802ab, 15277 .probe_timing = TIMING_ZERO, 15278 .block_erasers = 15279 { 15280 { 15281 .eraseblocks = { 15282 {64 * 1024, 15}, 15283 {8 * 1024, 8} 15284 }, 15285 .block_erase = erase_block_82802ab, 15286 }, { 15287 .eraseblocks = { 15288 {1024 * 1024, 1} 15289 }, 15290 .block_erase = NULL, /* 30 D0, only in A/A mux mode */ 15291 }, 15292 }, 15293 .unlock = unlock_regspace2_uniform_64k, 15294 .write = write_82802ab, 15295 .read = read_memmapped, 15296 .voltage = {3000, 3600}, 15297 }, 15298 15299 { 15300 .vendor = "Spansion", 15301 .name = "S25FL004A", 15302 .bustype = BUS_SPI, 15303 .manufacture_id = SPANSION_ID, 15304 .model_id = SPANSION_S25FL004A, 15305 .total_size = 512, 15306 .page_size = 256, 15307 .feature_bits = FEATURE_WRSR_WREN, 15308 .tested = TEST_UNTESTED, 15309 .probe = probe_spi_rdid, 15310 .probe_timing = TIMING_ZERO, 15311 .block_erasers = 15312 { 15313 { 15314 .eraseblocks = { {64 * 1024, 8} }, 15315 .block_erase = spi_block_erase_d8, 15316 }, { 15317 .eraseblocks = { {512 * 1024, 1} }, 15318 .block_erase = spi_block_erase_c7, 15319 } 15320 }, 15321 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 15322 .unlock = spi_disable_blockprotect, 15323 .write = spi_chip_write_256, 15324 .read = spi_chip_read, 15325 .voltage = {2700, 3600}, 15326 }, 15327 15328 { 15329 .vendor = "Spansion", 15330 .name = "S25FL008A", 15331 .bustype = BUS_SPI, 15332 .manufacture_id = SPANSION_ID, 15333 .model_id = SPANSION_S25FL008A, 15334 .total_size = 1024, 15335 .page_size = 256, 15336 .feature_bits = FEATURE_WRSR_WREN, 15337 .tested = TEST_OK_PRE, 15338 .probe = probe_spi_rdid, 15339 .probe_timing = TIMING_ZERO, 15340 .block_erasers = 15341 { 15342 { 15343 .eraseblocks = { {64 * 1024, 16} }, 15344 .block_erase = spi_block_erase_d8, 15345 }, { 15346 .eraseblocks = { {1024 * 1024, 1} }, 15347 .block_erase = spi_block_erase_c7, 15348 } 15349 }, 15350 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 15351 .unlock = spi_disable_blockprotect, 15352 .write = spi_chip_write_256, 15353 .read = spi_chip_read, 15354 .voltage = {2700, 3600}, 15355 }, 15356 15357 { 15358 .vendor = "Spansion", 15359 .name = "S25FL016A", 15360 .bustype = BUS_SPI, 15361 .manufacture_id = SPANSION_ID, 15362 .model_id = SPANSION_S25FL016A, 15363 .total_size = 2048, 15364 .page_size = 256, 15365 .feature_bits = FEATURE_WRSR_WREN, 15366 .tested = TEST_OK_PREW, 15367 .probe = probe_spi_rdid, 15368 .probe_timing = TIMING_ZERO, 15369 .block_erasers = 15370 { 15371 { 15372 .eraseblocks = { {64 * 1024, 32} }, 15373 .block_erase = spi_block_erase_d8, 15374 }, { 15375 .eraseblocks = { {2 * 1024 * 1024, 1} }, 15376 .block_erase = spi_block_erase_c7, 15377 } 15378 }, 15379 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 15380 .unlock = spi_disable_blockprotect, 15381 .write = spi_chip_write_256, 15382 .read = spi_chip_read, 15383 .voltage = {2700, 3600}, 15384 }, 15385 15386 { 15387 .vendor = "Spansion", 15388 .name = "S25FL032A/P", 15389 .bustype = BUS_SPI, 15390 .manufacture_id = SPANSION_ID, 15391 .model_id = SPANSION_S25FL032A, 15392 .total_size = 4096, 15393 .page_size = 256, 15394 .feature_bits = FEATURE_WRSR_WREN, 15395 .tested = TEST_OK_PREW, 15396 .probe = probe_spi_rdid, 15397 .probe_timing = TIMING_ZERO, 15398 .block_erasers = 15399 { 15400 { 15401 .eraseblocks = { {64 * 1024, 64} }, 15402 .block_erase = spi_block_erase_d8, 15403 }, { 15404 .eraseblocks = { {4 * 1024 * 1024, 1} }, 15405 .block_erase = spi_block_erase_c7, 15406 } 15407 }, 15408 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 15409 .unlock = spi_disable_blockprotect, 15410 .write = spi_chip_write_256, 15411 .read = spi_chip_read, 15412 .voltage = {2700, 3600}, 15413 }, 15414 15415 { 15416 .vendor = "Spansion", 15417 .name = "S25FL064A/P", 15418 .bustype = BUS_SPI, 15419 .manufacture_id = SPANSION_ID, 15420 .model_id = SPANSION_S25FL064A, 15421 .total_size = 8192, 15422 .page_size = 256, 15423 .feature_bits = FEATURE_WRSR_WREN, 15424 .tested = TEST_OK_PREW, 15425 .probe = probe_spi_rdid, 15426 .probe_timing = TIMING_ZERO, 15427 .block_erasers = 15428 { 15429 { 15430 .eraseblocks = { {64 * 1024, 128} }, 15431 .block_erase = spi_block_erase_d8, 15432 }, { 15433 .eraseblocks = { {8 * 1024 * 1024, 1} }, 15434 .block_erase = spi_block_erase_c7, 15435 } 15436 }, 15437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 15438 .unlock = spi_disable_blockprotect, 15439 .write = spi_chip_write_256, 15440 .read = spi_chip_read, 15441 .voltage = {2700, 3600}, 15442 }, 15443 15444 { 15445 .vendor = "Spansion", 15446 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */ 15447 .bustype = BUS_SPI, 15448 .manufacture_id = SPANSION_ID, 15449 .model_id = SPANSION_S25FL216, 15450 .total_size = 2048, 15451 .page_size = 256, 15452 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */ 15453 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15454 .tested = TEST_UNTESTED, 15455 .probe = probe_spi_rdid, 15456 .probe_timing = TIMING_ZERO, 15457 .block_erasers = 15458 { 15459 { 15460 .eraseblocks = { {4 * 1024, 512} }, 15461 .block_erase = spi_block_erase_20, 15462 }, { 15463 .eraseblocks = { {64 * 1024, 32} }, 15464 .block_erase = spi_block_erase_d8, 15465 }, { 15466 .eraseblocks = { { 2048 * 1024, 1} }, 15467 .block_erase = spi_block_erase_60, 15468 }, { 15469 .eraseblocks = { { 2048 * 1024, 1} }, 15470 .block_erase = spi_block_erase_c7, 15471 } 15472 }, 15473 .printlock = spi_prettyprint_status_register_bp3_srwd, 15474 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */ 15475 .write = spi_chip_write_256, 15476 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 15477 .voltage = {2700, 3600}, 15478 }, 15479 15480 { 15481 .vendor = "Spansion", 15482 .name = "S25FL127S-256kB", /* uniform 256kB sectors */ 15483 .bustype = BUS_SPI, 15484 .manufacture_id = SPANSION_ID, 15485 .model_id = SPANSION_S25FL128, 15486 .total_size = 16384, 15487 .page_size = 512, 15488 /* supports 4B addressing */ 15489 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15490 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15491 .tested = TEST_UNTESTED, 15492 .probe = probe_spi_rdid, 15493 .probe_timing = TIMING_ZERO, 15494 .block_erasers = 15495 { 15496 { 15497 .eraseblocks = { {256 * 1024, 64} }, 15498 .block_erase = spi_block_erase_d8, 15499 }, { 15500 .eraseblocks = { { 16384 * 1024, 1} }, 15501 .block_erase = spi_block_erase_60, 15502 }, { 15503 .eraseblocks = { { 16384 * 1024, 1} }, 15504 .block_erase = spi_block_erase_c7, 15505 } 15506 }, 15507 .printlock = spi_prettyprint_status_register_bp2_srwd, 15508 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */ 15509 .write = spi_chip_write_256, /* Multi I/O supported */ 15510 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15511 .voltage = {2700, 3600}, 15512 }, 15513 15514 { 15515 .vendor = "Spansion", 15516 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 15517 .bustype = BUS_SPI, 15518 .manufacture_id = SPANSION_ID, 15519 .model_id = SPANSION_S25FL128, 15520 .total_size = 16384, 15521 .page_size = 256, 15522 /* supports 4B addressing */ 15523 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15525 .tested = TEST_OK_PREW, 15526 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */ 15527 .probe = probe_spi_rdid, 15528 .probe_timing = TIMING_ZERO, 15529 .block_erasers = 15530 { 15531 { 15532 /* This chip supports erasing of 32 so-called "parameter sectors" with 15533 * opcode 0x20 which may be configured to be on top or bottom of the address 15534 * space. Trying to access an address outside these 4kB blocks does have no 15535 * effect on the memory contents, e.g. 15536 .eraseblocks = { 15537 {4 * 1024, 32}, 15538 {64 * 1024, 254} // inaccessible 15539 }, 15540 .block_erase = spi_block_erase_20, 15541 }, { */ 15542 .eraseblocks = { { 64 * 1024, 256} }, 15543 .block_erase = spi_block_erase_d8, 15544 }, { 15545 .eraseblocks = { { 16384 * 1024, 1} }, 15546 .block_erase = spi_block_erase_60, 15547 }, { 15548 .eraseblocks = { { 16384 * 1024, 1} }, 15549 .block_erase = spi_block_erase_c7, 15550 } 15551 }, 15552 .printlock = spi_prettyprint_status_register_bp2_srwd, 15553 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */ 15554 .write = spi_chip_write_256, /* Multi I/O supported */ 15555 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15556 .voltage = {2700, 3600}, 15557 }, 15558 15559 { 15560 .vendor = "Spansion", 15561 .name = "S25FL128P......0", /* uniform 64 kB sectors */ 15562 .bustype = BUS_SPI, 15563 .manufacture_id = SPANSION_ID, 15564 .model_id = SPANSION_S25FL128, 15565 .total_size = 16384, 15566 .page_size = 256, 15567 .feature_bits = FEATURE_WRSR_WREN, 15568 .tested = TEST_OK_PREW, 15569 .probe = probe_spi_rdid, 15570 .probe_timing = TIMING_ZERO, 15571 .block_erasers = 15572 { 15573 { 15574 .eraseblocks = { {64 * 1024, 256} }, 15575 .block_erase = spi_block_erase_20, 15576 }, { 15577 .eraseblocks = { {64 * 1024, 256} }, 15578 .block_erase = spi_block_erase_d8, 15579 }, { 15580 .eraseblocks = { { 16384 * 1024, 1} }, 15581 .block_erase = spi_block_erase_60, 15582 }, { 15583 .eraseblocks = { { 16384 * 1024, 1} }, 15584 .block_erase = spi_block_erase_c7, 15585 } 15586 }, 15587 .printlock = spi_prettyprint_status_register_bp3_srwd, 15588 .unlock = spi_disable_blockprotect_bp3_srwd, 15589 .write = spi_chip_write_256, 15590 .read = spi_chip_read, /* Fast read (0x0B) supported */ 15591 .voltage = {2700, 3600}, 15592 }, 15593 15594 { 15595 .vendor = "Spansion", 15596 .name = "S25FL128P......1", /* uniform 256kB sectors */ 15597 .bustype = BUS_SPI, 15598 .manufacture_id = SPANSION_ID, 15599 .model_id = SPANSION_S25FL128, 15600 .total_size = 16384, 15601 .page_size = 256, 15602 .feature_bits = FEATURE_WRSR_WREN, 15603 .tested = TEST_UNTESTED, 15604 .probe = probe_spi_rdid, 15605 .probe_timing = TIMING_ZERO, 15606 .block_erasers = 15607 { 15608 { 15609 .eraseblocks = { {256 * 1024, 64} }, 15610 .block_erase = spi_block_erase_d8, 15611 }, { 15612 .eraseblocks = { { 16384 * 1024, 1} }, 15613 .block_erase = spi_block_erase_c7, 15614 } 15615 }, 15616 .printlock = spi_prettyprint_status_register_bp2_srwd, 15617 .unlock = spi_disable_blockprotect_bp2_srwd, 15618 .write = spi_chip_write_256, 15619 .read = spi_chip_read, /* Fast read (0x0B) supported */ 15620 .voltage = {2700, 3600}, 15621 }, 15622 15623 { 15624 .vendor = "Spansion", 15625 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 15626 .bustype = BUS_SPI, 15627 .manufacture_id = SPANSION_ID, 15628 .model_id = SPANSION_S25FL128, 15629 .total_size = 16384, 15630 .page_size = 256, 15631 /* supports 4B addressing */ 15632 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15633 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15634 .tested = TEST_OK_PREW, 15635 .probe = probe_spi_rdid, 15636 .probe_timing = TIMING_ZERO, 15637 .block_erasers = 15638 { 15639 { 15640 /* This chip supports erasing of the 32 so-called "parameter sectors" with 15641 * opcode 0x20. Trying to access an address outside these 4kB blocks does 15642 * have no effect on the memory contents, but sets a flag in the SR. 15643 .eraseblocks = { 15644 {4 * 1024, 32}, 15645 {64 * 1024, 254} // inaccessible 15646 }, 15647 .block_erase = spi_block_erase_20, 15648 }, { */ 15649 .eraseblocks = { { 64 * 1024, 256} }, 15650 .block_erase = spi_block_erase_d8, 15651 }, { 15652 .eraseblocks = { { 16384 * 1024, 1} }, 15653 .block_erase = spi_block_erase_60, 15654 }, { 15655 .eraseblocks = { { 16384 * 1024, 1} }, 15656 .block_erase = spi_block_erase_c7, 15657 } 15658 }, 15659 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ 15660 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ 15661 .write = spi_chip_write_256, /* Multi I/O supported */ 15662 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15663 .voltage = {2700, 3600}, 15664 }, 15665 15666 { 15667 .vendor = "Spansion", 15668 .name = "S25FL128S......1", /* uniform 256 kB sectors */ 15669 .bustype = BUS_SPI, 15670 .manufacture_id = SPANSION_ID, 15671 .model_id = SPANSION_S25FL128, 15672 .total_size = 16384, 15673 .page_size = 512, 15674 /* supports 4B addressing */ 15675 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15676 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15677 .tested = TEST_UNTESTED, 15678 .probe = probe_spi_rdid, 15679 .probe_timing = TIMING_ZERO, 15680 .block_erasers = 15681 { 15682 { 15683 .eraseblocks = { {256 * 1024, 64} }, 15684 .block_erase = spi_block_erase_d8, 15685 }, { 15686 .eraseblocks = { { 16384 * 1024, 1} }, 15687 .block_erase = spi_block_erase_60, 15688 }, { 15689 .eraseblocks = { { 16384 * 1024, 1} }, 15690 .block_erase = spi_block_erase_c7, 15691 } 15692 }, 15693 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ 15694 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ 15695 .write = spi_chip_write_256, /* Multi I/O supported */ 15696 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15697 .voltage = {2700, 3600}, 15698 }, 15699 15700 { 15701 .vendor = "Spansion", 15702 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 15703 .bustype = BUS_SPI, 15704 .manufacture_id = SPANSION_ID, 15705 .model_id = SPANSION_S25FL128, 15706 .total_size = 16384, 15707 .page_size = 256, 15708 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */ 15709 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15710 .tested = TEST_OK_PREW, 15711 .probe = probe_spi_rdid, 15712 .probe_timing = TIMING_ZERO, 15713 .block_erasers = 15714 { 15715 { 15716 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with 15717 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no 15718 * effect on the memory contents, but sets a flag in the SR. 15719 .eraseblocks = { 15720 {4 * 1024, 32}, 15721 {64 * 1024, 254} // inaccessible 15722 }, 15723 .block_erase = spi_block_erase_20, 15724 }, { */ 15725 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs 15726 .eraseblocks = { 15727 {8 * 1024, 16}, 15728 {64 * 1024, 254} // inaccessible 15729 }, 15730 .block_erase = spi_block_erase_40, 15731 }, { */ 15732 .eraseblocks = { { 64 * 1024, 256} }, 15733 .block_erase = spi_block_erase_d8, 15734 }, { 15735 .eraseblocks = { { 16384 * 1024, 1} }, 15736 .block_erase = spi_block_erase_60, 15737 }, { 15738 .eraseblocks = { { 16384 * 1024, 1} }, 15739 .block_erase = spi_block_erase_c7, 15740 } 15741 }, 15742 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */ 15743 .unlock = spi_disable_blockprotect_bp2_srwd, 15744 .write = spi_chip_write_256, /* Multi I/O supported */ 15745 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15746 .voltage = {2700, 3600}, 15747 }, 15748 15749 { 15750 .vendor = "Spansion", 15751 .name = "S25FL129P......1", /* uniform 256 kB sectors */ 15752 .bustype = BUS_SPI, 15753 .manufacture_id = SPANSION_ID, 15754 .model_id = SPANSION_S25FL128, 15755 .total_size = 16384, 15756 .page_size = 256, 15757 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */ 15758 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15759 .tested = TEST_UNTESTED, 15760 .probe = probe_spi_rdid, 15761 .probe_timing = TIMING_ZERO, 15762 .block_erasers = 15763 { 15764 { 15765 .eraseblocks = { {256 * 1024, 64} }, 15766 .block_erase = spi_block_erase_d8, 15767 }, { 15768 .eraseblocks = { { 16384 * 1024, 1} }, 15769 .block_erase = spi_block_erase_60, 15770 }, { 15771 .eraseblocks = { { 16384 * 1024, 1} }, 15772 .block_erase = spi_block_erase_c7, 15773 } 15774 }, 15775 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */ 15776 .unlock = spi_disable_blockprotect_bp2_srwd, 15777 .write = spi_chip_write_256, /* Multi I/O supported */ 15778 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15779 .voltage = {2700, 3600}, 15780 }, 15781 15782 { 15783 .vendor = "Spansion", 15784 .name = "S25FL132K", 15785 .bustype = BUS_SPI, 15786 .manufacture_id = SPANSION_ID, 15787 .model_id = SPANSION_S25FL132K, 15788 .total_size = 4096, 15789 .page_size = 256, 15790 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 15791 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15792 .tested = TEST_UNTESTED, 15793 .probe = probe_spi_rdid, 15794 .probe_timing = TIMING_ZERO, 15795 .block_erasers = 15796 { 15797 { 15798 .eraseblocks = { {4 * 1024, 1024} }, 15799 .block_erase = spi_block_erase_20, 15800 }, { 15801 .eraseblocks = { {64 * 1024, 64} }, 15802 .block_erase = spi_block_erase_d8, 15803 }, { 15804 .eraseblocks = { { 4096 * 1024, 1} }, 15805 .block_erase = spi_block_erase_60, 15806 }, { 15807 .eraseblocks = { { 4096 * 1024, 1} }, 15808 .block_erase = spi_block_erase_c7, 15809 } 15810 }, 15811 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */ 15812 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */ 15813 .write = spi_chip_write_256, 15814 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15815 .voltage = {2700, 3600}, 15816 }, 15817 15818 { 15819 .vendor = "Spansion", 15820 .name = "S25FL164K", 15821 .bustype = BUS_SPI, 15822 .manufacture_id = SPANSION_ID, 15823 .model_id = SPANSION_S25FL164K, 15824 .total_size = 8192, 15825 .page_size = 256, 15826 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 15827 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15828 .tested = TEST_OK_PREW, 15829 .probe = probe_spi_rdid, 15830 .probe_timing = TIMING_ZERO, 15831 .block_erasers = 15832 { 15833 { 15834 .eraseblocks = { {4 * 1024, 2048} }, 15835 .block_erase = spi_block_erase_20, 15836 }, { 15837 .eraseblocks = { {64 * 1024, 128} }, 15838 .block_erase = spi_block_erase_d8, 15839 }, { 15840 .eraseblocks = { { 8192 * 1024, 1} }, 15841 .block_erase = spi_block_erase_60, 15842 }, { 15843 .eraseblocks = { { 8192 * 1024, 1} }, 15844 .block_erase = spi_block_erase_c7, 15845 } 15846 }, 15847 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */ 15848 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */ 15849 .write = spi_chip_write_256, 15850 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15851 .voltage = {2700, 3600}, 15852 }, 15853 15854 { 15855 .vendor = "Spansion", 15856 .name = "S25FL204K", 15857 .bustype = BUS_SPI, 15858 .manufacture_id = SPANSION_ID, 15859 .model_id = SPANSION_S25FL204, 15860 .total_size = 512, 15861 .page_size = 256, 15862 .feature_bits = FEATURE_WRSR_WREN, 15863 .tested = TEST_OK_PR, 15864 .probe = probe_spi_rdid, 15865 .probe_timing = TIMING_ZERO, 15866 .block_erasers = 15867 { 15868 { 15869 .eraseblocks = { {4 * 1024, 128} }, 15870 .block_erase = spi_block_erase_20, 15871 }, { 15872 .eraseblocks = { {64 * 1024, 8} }, 15873 .block_erase = spi_block_erase_d8, 15874 }, { 15875 .eraseblocks = { { 512 * 1024, 1} }, 15876 .block_erase = spi_block_erase_60, 15877 }, { 15878 .eraseblocks = { { 512 * 1024, 1} }, 15879 .block_erase = spi_block_erase_c7, 15880 } 15881 }, 15882 .printlock = spi_prettyprint_status_register_bp3_srwd, 15883 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */ 15884 .write = spi_chip_write_256, 15885 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 15886 .voltage = {2700, 3600}, 15887 }, 15888 15889 { 15890 .vendor = "Spansion", 15891 .name = "S25FL208K", 15892 .bustype = BUS_SPI, 15893 .manufacture_id = SPANSION_ID, 15894 .model_id = SPANSION_S25FL208, 15895 .total_size = 1024, 15896 .page_size = 256, 15897 .feature_bits = FEATURE_WRSR_WREN, 15898 .tested = TEST_OK_PREW, 15899 .probe = probe_spi_rdid, 15900 .probe_timing = TIMING_ZERO, 15901 .block_erasers = 15902 { 15903 { 15904 .eraseblocks = { {4 * 1024, 256} }, 15905 .block_erase = spi_block_erase_20, 15906 }, { 15907 .eraseblocks = { {64 * 1024, 16} }, 15908 .block_erase = spi_block_erase_d8, 15909 }, { 15910 .eraseblocks = { { 1024 * 1024, 1} }, 15911 .block_erase = spi_block_erase_60, 15912 }, { 15913 .eraseblocks = { { 1024 * 1024, 1} }, 15914 .block_erase = spi_block_erase_c7, 15915 } 15916 }, 15917 .printlock = spi_prettyprint_status_register_bp3_srwd, 15918 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */ 15919 .write = spi_chip_write_256, 15920 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 15921 .voltage = {2700, 3600}, 15922 }, 15923 15924 { 15925 .vendor = "Spansion", 15926 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 15927 .bustype = BUS_SPI, 15928 .manufacture_id = SPANSION_ID, 15929 .model_id = SPANSION_S25FL256, 15930 .total_size = 32768, 15931 .page_size = 256, 15932 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15933 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7, 15934 .tested = TEST_OK_PREW, 15935 .probe = probe_spi_rdid, 15936 .probe_timing = TIMING_ZERO, 15937 .block_erasers = 15938 { 15939 { 15940 /* This chip supports erasing of the 32 so-called "parameter sectors" with 15941 * opcode 0x20. Trying to access an address outside these 4kB blocks does 15942 * have no effect on the memory contents, but sets a flag in the SR. 15943 .eraseblocks = { 15944 {4 * 1024, 32}, 15945 {64 * 1024, 254} // inaccessible 15946 }, 15947 .block_erase = spi_block_erase_20, 15948 }, { */ 15949 .eraseblocks = { { 64 * 1024, 512} }, 15950 .block_erase = spi_block_erase_dc, 15951 }, { 15952 .eraseblocks = { { 64 * 1024, 512} }, 15953 .block_erase = spi_block_erase_d8, 15954 }, { 15955 .eraseblocks = { { 32768 * 1024, 1} }, 15956 .block_erase = spi_block_erase_60, 15957 }, { 15958 .eraseblocks = { { 32768 * 1024, 1} }, 15959 .block_erase = spi_block_erase_c7, 15960 } 15961 }, 15962 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ 15963 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ 15964 .write = spi_chip_write_256, /* Multi I/O supported */ 15965 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 15966 .voltage = {2700, 3600}, 15967 .wrea_override = 0x17, 15968 }, 15969 15970 { 15971 .vendor = "Spansion", 15972 .name = "S25FL512S", 15973 .bustype = BUS_SPI, 15974 .manufacture_id = SPANSION_ID, 15975 .model_id = SPANSION_S25FL512, 15976 .total_size = 65536, /* 512 Mb (=> 64 MB)) */ 15977 .page_size = 256, 15978 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 15979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE, 15980 .tested = TEST_OK_PREW, 15981 .probe = probe_spi_rdid, 15982 .probe_timing = TIMING_ZERO, 15983 .block_erasers = 15984 { 15985 { 15986 .eraseblocks = { { 256 * 1024, 256} }, 15987 .block_erase = spi_block_erase_dc, 15988 }, { 15989 .eraseblocks = { { 65536 * 1024, 1} }, 15990 .block_erase = spi_block_erase_60, 15991 }, { 15992 .eraseblocks = { { 65536 * 1024, 1} }, 15993 .block_erase = spi_block_erase_c7, 15994 } 15995 }, 15996 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */ 15997 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */ 15998 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */ 15999 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 16000 .voltage = {2700, 3600}, 16001 }, 16002 16003 { 16004 .vendor = "SyncMOS/MoselVitelic", 16005 .name = "{F,S,V}29C51001B", 16006 .bustype = BUS_PARALLEL, 16007 .manufacture_id = SYNCMOS_MVC_ID, 16008 .model_id = SM_MVC_29C51001B, 16009 .total_size = 128, 16010 .page_size = 512, 16011 .feature_bits = FEATURE_EITHER_RESET, 16012 .tested = TEST_UNTESTED, 16013 .probe = probe_jedec, 16014 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16015 .block_erasers = 16016 { 16017 { 16018 .eraseblocks = { {512, 256} }, 16019 .block_erase = erase_sector_jedec, 16020 }, { 16021 .eraseblocks = { {128 * 1024, 1} }, 16022 .block_erase = erase_chip_block_jedec, 16023 }, 16024 }, 16025 .write = write_jedec_1, 16026 .read = read_memmapped, 16027 .voltage = {4500, 5500}, 16028 }, 16029 16030 { 16031 .vendor = "SyncMOS/MoselVitelic", 16032 .name = "{F,S,V}29C51001T", 16033 .bustype = BUS_PARALLEL, 16034 .manufacture_id = SYNCMOS_MVC_ID, 16035 .model_id = SM_MVC_29C51001T, 16036 .total_size = 128, 16037 .page_size = 512, 16038 .feature_bits = FEATURE_EITHER_RESET, 16039 .tested = TEST_UNTESTED, 16040 .probe = probe_jedec, 16041 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16042 .block_erasers = 16043 { 16044 { 16045 .eraseblocks = { {512, 256} }, 16046 .block_erase = erase_sector_jedec, 16047 }, { 16048 .eraseblocks = { {128 * 1024, 1} }, 16049 .block_erase = erase_chip_block_jedec, 16050 }, 16051 }, 16052 .write = write_jedec_1, 16053 .read = read_memmapped, 16054 .voltage = {4500, 5500}, 16055 }, 16056 16057 { 16058 .vendor = "SyncMOS/MoselVitelic", 16059 .name = "{F,S,V}29C51002B", 16060 .bustype = BUS_PARALLEL, 16061 .manufacture_id = SYNCMOS_MVC_ID, 16062 .model_id = SM_MVC_29C51002B, 16063 .total_size = 256, 16064 .page_size = 512, 16065 .feature_bits = FEATURE_EITHER_RESET, 16066 .tested = TEST_UNTESTED, 16067 .probe = probe_jedec, 16068 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16069 .block_erasers = 16070 { 16071 { 16072 .eraseblocks = { {512, 512} }, 16073 .block_erase = erase_sector_jedec, 16074 }, { 16075 .eraseblocks = { {256 * 1024, 1} }, 16076 .block_erase = erase_chip_block_jedec, 16077 }, 16078 }, 16079 .write = write_jedec_1, 16080 .read = read_memmapped, 16081 }, 16082 16083 { 16084 .vendor = "SyncMOS/MoselVitelic", 16085 .name = "{F,S,V}29C51002T", 16086 .bustype = BUS_PARALLEL, 16087 .manufacture_id = SYNCMOS_MVC_ID, 16088 .model_id = SM_MVC_29C51002T, 16089 .total_size = 256, 16090 .page_size = 512, 16091 .feature_bits = FEATURE_EITHER_RESET, 16092 .tested = TEST_OK_PREW, 16093 .probe = probe_jedec, 16094 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16095 .block_erasers = 16096 { 16097 { 16098 .eraseblocks = { {512, 512} }, 16099 .block_erase = erase_sector_jedec, 16100 }, { 16101 .eraseblocks = { {256 * 1024, 1} }, 16102 .block_erase = erase_chip_block_jedec, 16103 }, 16104 }, 16105 .write = write_jedec_1, 16106 .read = read_memmapped, 16107 }, 16108 16109 { 16110 .vendor = "SyncMOS/MoselVitelic", 16111 .name = "{F,S,V}29C51004B", 16112 .bustype = BUS_PARALLEL, 16113 .manufacture_id = SYNCMOS_MVC_ID, 16114 .model_id = SM_MVC_29C51004B, 16115 .total_size = 512, 16116 .page_size = 1024, 16117 .feature_bits = FEATURE_EITHER_RESET, 16118 .tested = TEST_UNTESTED, 16119 .probe = probe_jedec, 16120 .probe_timing = TIMING_ZERO, 16121 .block_erasers = 16122 { 16123 { 16124 .eraseblocks = { {1024, 512} }, 16125 .block_erase = erase_sector_jedec, 16126 }, { 16127 .eraseblocks = { {512 * 1024, 1} }, 16128 .block_erase = erase_chip_block_jedec, 16129 }, 16130 }, 16131 .write = write_jedec_1, 16132 .read = read_memmapped, 16133 .voltage = {4500, 5500}, 16134 }, 16135 16136 { 16137 .vendor = "SyncMOS/MoselVitelic", 16138 .name = "{F,S,V}29C51004T", 16139 .bustype = BUS_PARALLEL, 16140 .manufacture_id = SYNCMOS_MVC_ID, 16141 .model_id = SM_MVC_29C51004T, 16142 .total_size = 512, 16143 .page_size = 1024, 16144 .feature_bits = FEATURE_EITHER_RESET, 16145 .tested = TEST_UNTESTED, 16146 .probe = probe_jedec, 16147 .probe_timing = TIMING_ZERO, 16148 .block_erasers = 16149 { 16150 { 16151 .eraseblocks = { {1024, 512} }, 16152 .block_erase = erase_sector_jedec, 16153 }, { 16154 .eraseblocks = { {512 * 1024, 1} }, 16155 .block_erase = erase_chip_block_jedec, 16156 }, 16157 }, 16158 .write = write_jedec_1, 16159 .read = read_memmapped, 16160 .voltage = {4500, 5500}, 16161 }, 16162 16163 { 16164 .vendor = "SyncMOS/MoselVitelic", 16165 .name = "{S,V}29C31004B", 16166 .bustype = BUS_PARALLEL, 16167 .manufacture_id = SYNCMOS_MVC_ID, 16168 .model_id = SM_MVC_29C31004B, 16169 .total_size = 512, 16170 .page_size = 1024, 16171 .feature_bits = FEATURE_EITHER_RESET, 16172 .tested = TEST_UNTESTED, 16173 .probe = probe_jedec, 16174 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16175 .block_erasers = 16176 { 16177 { 16178 .eraseblocks = { {1024, 512} }, 16179 .block_erase = erase_sector_jedec, 16180 }, { 16181 .eraseblocks = { {512 * 1024, 1} }, 16182 .block_erase = erase_chip_block_jedec, 16183 }, 16184 }, 16185 .write = write_jedec_1, 16186 .read = read_memmapped, 16187 .voltage = {3000, 3600}, 16188 }, 16189 16190 { 16191 .vendor = "SyncMOS/MoselVitelic", 16192 .name = "{S,V}29C31004T", 16193 .bustype = BUS_PARALLEL, 16194 .manufacture_id = SYNCMOS_MVC_ID, 16195 .model_id = SM_MVC_29C31004T, 16196 .total_size = 512, 16197 .page_size = 1024, 16198 .feature_bits = FEATURE_EITHER_RESET, 16199 .tested = TEST_UNTESTED, 16200 .probe = probe_jedec, 16201 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16202 .block_erasers = 16203 { 16204 { 16205 .eraseblocks = { {1024, 512} }, 16206 .block_erase = erase_sector_jedec, 16207 }, { 16208 .eraseblocks = { {512 * 1024, 1} }, 16209 .block_erase = erase_chip_block_jedec, 16210 }, 16211 }, 16212 .write = write_jedec_1, 16213 .read = read_memmapped, 16214 .voltage = {3000, 3600}, 16215 }, 16216 16217 { 16218 .vendor = "TI", 16219 .name = "TMS29F002RB", 16220 .bustype = BUS_PARALLEL, 16221 .manufacture_id = TI_OLD_ID, 16222 .model_id = TI_TMS29F002RB, 16223 .total_size = 256, 16224 .page_size = 16384, /* Non-uniform sectors */ 16225 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 16226 .tested = TEST_UNTESTED, 16227 .probe = probe_jedec, 16228 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16229 .block_erasers = 16230 { 16231 { 16232 .eraseblocks = { 16233 {16 * 1024, 1}, 16234 {8 * 1024, 2}, 16235 {32 * 1024, 1}, 16236 {64 * 1024, 3}, 16237 }, 16238 .block_erase = erase_sector_jedec, 16239 }, { 16240 .eraseblocks = { {256 * 1024, 1} }, 16241 .block_erase = erase_chip_block_jedec, 16242 }, 16243 }, 16244 .write = write_jedec_1, 16245 .read = read_memmapped, 16246 .voltage = {4500, 5500}, 16247 }, 16248 16249 { 16250 .vendor = "TI", 16251 .name = "TMS29F002RT", 16252 .bustype = BUS_PARALLEL, 16253 .manufacture_id = TI_OLD_ID, 16254 .model_id = TI_TMS29F002RT, 16255 .total_size = 256, 16256 .page_size = 16384, /* Non-uniform sectors */ 16257 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 16258 .tested = TEST_UNTESTED, 16259 .probe = probe_jedec, 16260 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 16261 .block_erasers = 16262 { 16263 { 16264 .eraseblocks = { 16265 {64 * 1024, 3}, 16266 {32 * 1024, 1}, 16267 {8 * 1024, 2}, 16268 {16 * 1024, 1}, 16269 }, 16270 .block_erase = erase_sector_jedec, 16271 }, { 16272 .eraseblocks = { {256 * 1024, 1} }, 16273 .block_erase = erase_chip_block_jedec, 16274 }, 16275 }, 16276 .write = write_jedec_1, 16277 .read = read_memmapped, 16278 .voltage = {4500, 5500}, 16279 }, 16280 16281 { 16282 .vendor = "Winbond", 16283 .name = "W25P16", 16284 .bustype = BUS_SPI, 16285 .manufacture_id = WINBOND_NEX_ID, 16286 .model_id = WINBOND_NEX_W25P16, 16287 .total_size = 2048, 16288 .page_size = 256, 16289 .feature_bits = FEATURE_WRSR_WREN, 16290 .tested = TEST_UNTESTED, 16291 .probe = probe_spi_rdid, 16292 .probe_timing = TIMING_ZERO, 16293 .block_erasers = 16294 { 16295 { 16296 .eraseblocks = { {64 * 1024, 32} }, 16297 .block_erase = spi_block_erase_d8, 16298 }, { 16299 .eraseblocks = { {2048 * 1024, 1} }, 16300 .block_erase = spi_block_erase_c7, 16301 } 16302 }, 16303 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16304 .unlock = spi_disable_blockprotect, 16305 .write = spi_chip_write_256, 16306 .read = spi_chip_read, /* Fast read (0x0B) supported */ 16307 .voltage = {2700, 3600}, 16308 }, 16309 16310 { 16311 .vendor = "Winbond", 16312 .name = "W25P32", 16313 .bustype = BUS_SPI, 16314 .manufacture_id = WINBOND_NEX_ID, 16315 .model_id = WINBOND_NEX_W25P32, 16316 .total_size = 4096, 16317 .page_size = 256, 16318 .feature_bits = FEATURE_WRSR_WREN, 16319 .tested = TEST_UNTESTED, 16320 .probe = probe_spi_rdid, 16321 .probe_timing = TIMING_ZERO, 16322 .block_erasers = 16323 { 16324 { 16325 .eraseblocks = { {64 * 1024, 64} }, 16326 .block_erase = spi_block_erase_d8, 16327 }, { 16328 .eraseblocks = { {4096 * 1024, 1} }, 16329 .block_erase = spi_block_erase_c7, 16330 } 16331 }, 16332 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16333 .unlock = spi_disable_blockprotect, 16334 .write = spi_chip_write_256, 16335 .read = spi_chip_read, /* Fast read (0x0B) supported */ 16336 .voltage = {2700, 3600}, 16337 }, 16338 16339 { 16340 .vendor = "Winbond", 16341 .name = "W25P80", 16342 .bustype = BUS_SPI, 16343 .manufacture_id = WINBOND_NEX_ID, 16344 .model_id = WINBOND_NEX_W25P80, 16345 .total_size = 1024, 16346 .page_size = 256, 16347 .feature_bits = FEATURE_WRSR_WREN, 16348 .tested = TEST_UNTESTED, 16349 .probe = probe_spi_rdid, 16350 .probe_timing = TIMING_ZERO, 16351 .block_erasers = 16352 { 16353 { 16354 .eraseblocks = { {64 * 1024, 16} }, 16355 .block_erase = spi_block_erase_d8, 16356 }, { 16357 .eraseblocks = { {1024 * 1024, 1} }, 16358 .block_erase = spi_block_erase_c7, 16359 } 16360 }, 16361 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16362 .unlock = spi_disable_blockprotect, 16363 .write = spi_chip_write_256, 16364 .read = spi_chip_read, /* Fast read (0x0B) supported */ 16365 .voltage = {2700, 3600}, 16366 }, 16367 16368 { 16369 .vendor = "Winbond", 16370 .name = "W25Q128.V", 16371 .bustype = BUS_SPI, 16372 .manufacture_id = WINBOND_NEX_ID, 16373 .model_id = WINBOND_NEX_W25Q128_V, 16374 .total_size = 16384, 16375 .page_size = 256, 16376 /* supports SFDP */ 16377 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16378 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16379 .tested = TEST_OK_PREW, 16380 .probe = probe_spi_rdid, 16381 .probe_timing = TIMING_ZERO, 16382 .block_erasers = 16383 { 16384 { 16385 .eraseblocks = { {4 * 1024, 4096} }, 16386 .block_erase = spi_block_erase_20, 16387 }, { 16388 .eraseblocks = { {32 * 1024, 512} }, 16389 .block_erase = spi_block_erase_52, 16390 }, { 16391 .eraseblocks = { {64 * 1024, 256} }, 16392 .block_erase = spi_block_erase_d8, 16393 }, { 16394 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16395 .block_erase = spi_block_erase_60, 16396 }, { 16397 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16398 .block_erase = spi_block_erase_c7, 16399 } 16400 }, 16401 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16402 .unlock = spi_disable_blockprotect, 16403 .write = spi_chip_write_256, 16404 .read = spi_chip_read, 16405 .voltage = {2700, 3600}, 16406 }, 16407 16408 { 16409 .vendor = "Winbond", 16410 .name = "W25Q128.V..M", 16411 .bustype = BUS_SPI, 16412 .manufacture_id = WINBOND_NEX_ID, 16413 .model_id = WINBOND_NEX_W25Q128_V_M, 16414 .total_size = 16384, 16415 .page_size = 256, 16416 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16417 .tested = TEST_OK_PREW, 16418 .probe = probe_spi_rdid, 16419 .probe_timing = TIMING_ZERO, 16420 .block_erasers = 16421 { 16422 { 16423 .eraseblocks = { {4 * 1024, 4096} }, 16424 .block_erase = spi_block_erase_20, 16425 }, { 16426 .eraseblocks = { {32 * 1024, 512} }, 16427 .block_erase = spi_block_erase_52, 16428 }, { 16429 .eraseblocks = { {64 * 1024, 256} }, 16430 .block_erase = spi_block_erase_d8, 16431 }, { 16432 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16433 .block_erase = spi_block_erase_60, 16434 }, { 16435 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16436 .block_erase = spi_block_erase_c7, 16437 } 16438 }, 16439 .printlock = spi_prettyprint_status_register_plain, 16440 .unlock = spi_disable_blockprotect, 16441 .write = spi_chip_write_256, 16442 .read = spi_chip_read, 16443 .voltage = {2700, 3600}, 16444 }, 16445 16446 { 16447 .vendor = "Winbond", 16448 .name = "W25Q128.W", 16449 .bustype = BUS_SPI, 16450 .manufacture_id = WINBOND_NEX_ID, 16451 .model_id = WINBOND_NEX_W25Q128_W, 16452 .total_size = 16384, 16453 .page_size = 256, 16454 /* supports SFDP */ 16455 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16457 .tested = TEST_OK_PREW, 16458 .probe = probe_spi_rdid, 16459 .probe_timing = TIMING_ZERO, 16460 .block_erasers = 16461 { 16462 { 16463 .eraseblocks = { {4 * 1024, 4096} }, 16464 .block_erase = spi_block_erase_20, 16465 }, { 16466 .eraseblocks = { {32 * 1024, 512} }, 16467 .block_erase = spi_block_erase_52, 16468 }, { 16469 .eraseblocks = { {64 * 1024, 256} }, 16470 .block_erase = spi_block_erase_d8, 16471 }, { 16472 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16473 .block_erase = spi_block_erase_60, 16474 }, { 16475 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16476 .block_erase = spi_block_erase_c7, 16477 } 16478 }, 16479 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16480 .unlock = spi_disable_blockprotect, 16481 .write = spi_chip_write_256, 16482 .read = spi_chip_read, 16483 .voltage = {1650, 1950}, 16484 }, 16485 16486 { 16487 .vendor = "Winbond", 16488 .name = "W25Q128.JW.DTR", 16489 .bustype = BUS_SPI, 16490 .manufacture_id = WINBOND_NEX_ID, 16491 .model_id = WINBOND_NEX_W25Q128_DTR, 16492 .total_size = 16384, 16493 .page_size = 256, 16494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16495 .tested = TEST_OK_PREW, 16496 .probe = probe_spi_rdid, 16497 .probe_timing = TIMING_ZERO, 16498 .block_erasers = 16499 { 16500 { 16501 .eraseblocks = { {4 * 1024, 4096} }, 16502 .block_erase = spi_block_erase_20, 16503 }, { 16504 .eraseblocks = { {32 * 1024, 512} }, 16505 .block_erase = spi_block_erase_52, 16506 }, { 16507 .eraseblocks = { {64 * 1024, 256} }, 16508 .block_erase = spi_block_erase_d8, 16509 }, { 16510 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16511 .block_erase = spi_block_erase_60, 16512 }, { 16513 .eraseblocks = { {16 * 1024 * 1024, 1} }, 16514 .block_erase = spi_block_erase_c7, 16515 } 16516 }, 16517 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16518 .unlock = spi_disable_blockprotect, 16519 .write = spi_chip_write_256, 16520 .read = spi_chip_read, 16521 .voltage = {1650, 1950}, 16522 }, 16523 16524 { 16525 .vendor = "Winbond", 16526 .name = "W25Q16.V", 16527 .bustype = BUS_SPI, 16528 .manufacture_id = WINBOND_NEX_ID, 16529 .model_id = WINBOND_NEX_W25Q16_V, 16530 .total_size = 2048, 16531 .page_size = 256, 16532 /* supports SFDP */ 16533 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16534 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16535 .tested = TEST_OK_PREW, 16536 .probe = probe_spi_rdid, 16537 .probe_timing = TIMING_ZERO, 16538 .block_erasers = 16539 { 16540 { 16541 .eraseblocks = { {4 * 1024, 512} }, 16542 .block_erase = spi_block_erase_20, 16543 }, { 16544 .eraseblocks = { {32 * 1024, 64} }, 16545 .block_erase = spi_block_erase_52, 16546 }, { 16547 .eraseblocks = { {64 * 1024, 32} }, 16548 .block_erase = spi_block_erase_d8, 16549 }, { 16550 .eraseblocks = { {2 * 1024 * 1024, 1} }, 16551 .block_erase = spi_block_erase_60, 16552 }, { 16553 .eraseblocks = { {2 * 1024 * 1024, 1} }, 16554 .block_erase = spi_block_erase_c7, 16555 } 16556 }, 16557 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16558 .unlock = spi_disable_blockprotect, 16559 .write = spi_chip_write_256, 16560 .read = spi_chip_read, 16561 .voltage = {2700, 3600}, 16562 }, 16563 16564 { 16565 .vendor = "Winbond", 16566 .name = "W25Q16.W", 16567 .bustype = BUS_SPI, 16568 .manufacture_id = WINBOND_NEX_ID, 16569 .model_id = WINBOND_NEX_W25Q16_W, 16570 .total_size = 2048, 16571 .page_size = 256, 16572 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16573 /* QPI enable 0x38, disable 0xFF */ 16574 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16575 .tested = TEST_UNTESTED, 16576 .probe = probe_spi_rdid, 16577 .probe_timing = TIMING_ZERO, 16578 .block_erasers = 16579 { 16580 { 16581 .eraseblocks = { {4 * 1024, 512} }, 16582 .block_erase = spi_block_erase_20, 16583 }, { 16584 .eraseblocks = { {32 * 1024, 64} }, 16585 .block_erase = spi_block_erase_52, 16586 }, { 16587 .eraseblocks = { {64 * 1024, 32} }, 16588 .block_erase = spi_block_erase_d8, 16589 }, { 16590 .eraseblocks = { {2 * 1024 * 1024, 1} }, 16591 .block_erase = spi_block_erase_60, 16592 }, { 16593 .eraseblocks = { {2 * 1024 * 1024, 1} }, 16594 .block_erase = spi_block_erase_c7, 16595 } 16596 }, 16597 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16598 .unlock = spi_disable_blockprotect, 16599 .write = spi_chip_write_256, 16600 .read = spi_chip_read, 16601 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 16602 }, 16603 16604 { 16605 .vendor = "Winbond", 16606 .name = "W25Q20.W", 16607 .bustype = BUS_SPI, 16608 .manufacture_id = WINBOND_NEX_ID, 16609 .model_id = WINBOND_NEX_W25Q20_W, 16610 .total_size = 256, 16611 .page_size = 256, 16612 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16613 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16614 .tested = TEST_UNTESTED, 16615 .probe = probe_spi_rdid, 16616 .probe_timing = TIMING_ZERO, 16617 .block_erasers = 16618 { 16619 { 16620 .eraseblocks = { {4 * 1024, 64} }, 16621 .block_erase = spi_block_erase_20, 16622 }, { 16623 .eraseblocks = { {32 * 1024, 8} }, 16624 .block_erase = spi_block_erase_52, 16625 }, { 16626 .eraseblocks = { {64 * 1024, 4} }, 16627 .block_erase = spi_block_erase_d8, 16628 }, { 16629 .eraseblocks = { {256 * 1024, 1} }, 16630 .block_erase = spi_block_erase_60, 16631 }, { 16632 .eraseblocks = { {256 * 1024, 1} }, 16633 .block_erase = spi_block_erase_c7, 16634 } 16635 }, 16636 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16637 .unlock = spi_disable_blockprotect, 16638 .write = spi_chip_write_256, 16639 .read = spi_chip_read, 16640 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 16641 }, 16642 16643 { 16644 .vendor = "Winbond", 16645 .name = "W25Q256.V", 16646 .bustype = BUS_SPI, 16647 .manufacture_id = WINBOND_NEX_ID, 16648 .model_id = WINBOND_NEX_W25Q256_V, 16649 .total_size = 32768, 16650 .page_size = 256, 16651 /* supports SFDP */ 16652 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16653 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 16654 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN 16655 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ, 16656 .tested = TEST_OK_PREW, 16657 .probe = probe_spi_rdid, 16658 .probe_timing = TIMING_ZERO, 16659 .block_erasers = 16660 { 16661 { 16662 .eraseblocks = { {4 * 1024, 8192} }, 16663 .block_erase = spi_block_erase_20, 16664 }, { 16665 .eraseblocks = { {32 * 1024, 1024} }, 16666 .block_erase = spi_block_erase_52, 16667 }, { 16668 .eraseblocks = { {64 * 1024, 512} }, 16669 .block_erase = spi_block_erase_d8, 16670 }, { 16671 .eraseblocks = { {32 * 1024 * 1024, 1} }, 16672 .block_erase = spi_block_erase_60, 16673 }, { 16674 .eraseblocks = { {32 * 1024 * 1024, 1} }, 16675 .block_erase = spi_block_erase_c7, 16676 } 16677 }, 16678 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16679 .unlock = spi_disable_blockprotect, 16680 .write = spi_chip_write_256, 16681 .read = spi_chip_read, 16682 .voltage = {2700, 3600}, 16683 }, 16684 16685 { 16686 .vendor = "Winbond", 16687 .name = "W25Q256JV_M", 16688 .bustype = BUS_SPI, 16689 .manufacture_id = WINBOND_NEX_ID, 16690 .model_id = WINBOND_NEX_W25Q256JV_M, 16691 .total_size = 32768, 16692 .page_size = 256, 16693 /* supports SFDP */ 16694 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16695 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 16696 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 16697 .tested = TEST_OK_PREW, 16698 .probe = probe_spi_rdid, 16699 .probe_timing = TIMING_ZERO, 16700 .block_erasers = 16701 { 16702 { 16703 .eraseblocks = { {4 * 1024, 8192} }, 16704 .block_erase = spi_block_erase_21, 16705 }, { 16706 .eraseblocks = { {4 * 1024, 8192} }, 16707 .block_erase = spi_block_erase_20, 16708 }, { 16709 .eraseblocks = { {32 * 1024, 1024} }, 16710 .block_erase = spi_block_erase_52, 16711 }, { 16712 .eraseblocks = { {64 * 1024, 512} }, 16713 .block_erase = spi_block_erase_dc, 16714 }, { 16715 .eraseblocks = { {64 * 1024, 512} }, 16716 .block_erase = spi_block_erase_d8, 16717 }, { 16718 .eraseblocks = { {32 * 1024 * 1024, 1} }, 16719 .block_erase = spi_block_erase_60, 16720 }, { 16721 .eraseblocks = { {32 * 1024 * 1024, 1} }, 16722 .block_erase = spi_block_erase_c7, 16723 } 16724 }, 16725 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16726 .unlock = spi_disable_blockprotect, 16727 .write = spi_chip_write_256, 16728 .read = spi_chip_read, 16729 .voltage = {2700, 3600}, 16730 }, 16731 16732 { 16733 .vendor = "Winbond", 16734 .name = "W25Q32.V", 16735 .bustype = BUS_SPI, 16736 .manufacture_id = WINBOND_NEX_ID, 16737 .model_id = WINBOND_NEX_W25Q32_V, 16738 .total_size = 4096, 16739 .page_size = 256, 16740 /* supports SFDP */ 16741 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16742 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16743 .tested = TEST_OK_PREW, 16744 .probe = probe_spi_rdid, 16745 .probe_timing = TIMING_ZERO, 16746 .block_erasers = 16747 { 16748 { 16749 .eraseblocks = { {4 * 1024, 1024} }, 16750 .block_erase = spi_block_erase_20, 16751 }, { 16752 .eraseblocks = { {32 * 1024, 128} }, 16753 .block_erase = spi_block_erase_52, 16754 }, { 16755 .eraseblocks = { {64 * 1024, 64} }, 16756 .block_erase = spi_block_erase_d8, 16757 }, { 16758 .eraseblocks = { {4 * 1024 * 1024, 1} }, 16759 .block_erase = spi_block_erase_60, 16760 }, { 16761 .eraseblocks = { {4 * 1024 * 1024, 1} }, 16762 .block_erase = spi_block_erase_c7, 16763 } 16764 }, 16765 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16766 .unlock = spi_disable_blockprotect, 16767 .write = spi_chip_write_256, 16768 .read = spi_chip_read, 16769 .voltage = {2700, 3600}, 16770 }, 16771 16772 { 16773 .vendor = "Winbond", 16774 .name = "W25Q32.W", 16775 .bustype = BUS_SPI, 16776 .manufacture_id = WINBOND_NEX_ID, 16777 .model_id = WINBOND_NEX_W25Q32_W, 16778 .total_size = 4096, 16779 .page_size = 256, 16780 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16781 /* QPI enable 0x38, disable 0xFF */ 16782 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16783 .tested = TEST_OK_PREW, 16784 .probe = probe_spi_rdid, 16785 .probe_timing = TIMING_ZERO, 16786 .block_erasers = 16787 { 16788 { 16789 .eraseblocks = { {4 * 1024, 1024} }, 16790 .block_erase = spi_block_erase_20, 16791 }, { 16792 .eraseblocks = { {32 * 1024, 128} }, 16793 .block_erase = spi_block_erase_52, 16794 }, { 16795 .eraseblocks = { {64 * 1024, 64} }, 16796 .block_erase = spi_block_erase_d8, 16797 }, { 16798 .eraseblocks = { {4 * 1024 * 1024, 1} }, 16799 .block_erase = spi_block_erase_60, 16800 }, { 16801 .eraseblocks = { {4 * 1024 * 1024, 1} }, 16802 .block_erase = spi_block_erase_c7, 16803 } 16804 }, 16805 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16806 .unlock = spi_disable_blockprotect, 16807 .write = spi_chip_write_256, 16808 .read = spi_chip_read, 16809 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 16810 }, 16811 16812 { 16813 .vendor = "Winbond", 16814 .name = "W25Q40.V", 16815 .bustype = BUS_SPI, 16816 .manufacture_id = WINBOND_NEX_ID, 16817 .model_id = WINBOND_NEX_W25Q40_V, 16818 .total_size = 512, 16819 .page_size = 256, 16820 /* supports SFDP */ 16821 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16822 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16823 .tested = TEST_OK_PREW, 16824 .probe = probe_spi_rdid, 16825 .probe_timing = TIMING_ZERO, 16826 .block_erasers = 16827 { 16828 { 16829 .eraseblocks = { {4 * 1024, 128} }, 16830 .block_erase = spi_block_erase_20, 16831 }, { 16832 .eraseblocks = { {32 * 1024, 16} }, 16833 .block_erase = spi_block_erase_52, 16834 }, { 16835 .eraseblocks = { {64 * 1024, 8} }, 16836 .block_erase = spi_block_erase_d8, 16837 }, { 16838 .eraseblocks = { {512 * 1024, 1} }, 16839 .block_erase = spi_block_erase_60, 16840 }, { 16841 .eraseblocks = { {512 * 1024, 1} }, 16842 .block_erase = spi_block_erase_c7, 16843 } 16844 }, 16845 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16846 .unlock = spi_disable_blockprotect, 16847 .write = spi_chip_write_256, /* Multi I/O supported */ 16848 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */ 16849 .voltage = {2700, 3600}, 16850 }, 16851 16852 { 16853 .vendor = "Winbond", 16854 .name = "W25Q40BW", 16855 .bustype = BUS_SPI, 16856 .manufacture_id = WINBOND_NEX_ID, 16857 .model_id = WINBOND_NEX_W25Q40BW, 16858 .total_size = 512, 16859 .page_size = 256, 16860 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16861 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16862 .tested = TEST_OK_PREW, 16863 .probe = probe_spi_rdid, 16864 .probe_timing = TIMING_ZERO, 16865 .block_erasers = 16866 { 16867 { 16868 .eraseblocks = { {4 * 1024, 128} }, 16869 .block_erase = spi_block_erase_20, 16870 }, { 16871 .eraseblocks = { {32 * 1024, 16} }, 16872 .block_erase = spi_block_erase_52, 16873 }, { 16874 .eraseblocks = { {64 * 1024, 8} }, 16875 .block_erase = spi_block_erase_d8, 16876 }, { 16877 .eraseblocks = { {512 * 1024, 1} }, 16878 .block_erase = spi_block_erase_60, 16879 }, { 16880 .eraseblocks = { {512 * 1024, 1} }, 16881 .block_erase = spi_block_erase_c7, 16882 } 16883 }, 16884 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16885 .unlock = spi_disable_blockprotect, 16886 .write = spi_chip_write_256, 16887 .read = spi_chip_read, 16888 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 16889 }, 16890 16891 { 16892 .vendor = "Winbond", 16893 .name = "W25Q40EW", 16894 .bustype = BUS_SPI, 16895 .manufacture_id = WINBOND_NEX_ID, 16896 .model_id = WINBOND_NEX_W25Q40EW, 16897 .total_size = 512, 16898 .page_size = 256, 16899 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16900 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16901 .tested = TEST_OK_PREW, 16902 .probe = probe_spi_rdid, 16903 .probe_timing = TIMING_ZERO, 16904 .block_erasers = 16905 { 16906 { 16907 .eraseblocks = { {4 * 1024, 128} }, 16908 .block_erase = spi_block_erase_20, 16909 }, { 16910 .eraseblocks = { {32 * 1024, 16} }, 16911 .block_erase = spi_block_erase_52, 16912 }, { 16913 .eraseblocks = { {64 * 1024, 8} }, 16914 .block_erase = spi_block_erase_d8, 16915 }, { 16916 .eraseblocks = { {512 * 1024, 1} }, 16917 .block_erase = spi_block_erase_60, 16918 }, { 16919 .eraseblocks = { {512 * 1024, 1} }, 16920 .block_erase = spi_block_erase_c7, 16921 } 16922 }, 16923 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16924 .unlock = spi_disable_blockprotect, 16925 .write = spi_chip_write_256, 16926 .read = spi_chip_read, 16927 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ 16928 }, 16929 16930 { 16931 .vendor = "Winbond", 16932 .name = "W25Q64.V", 16933 .bustype = BUS_SPI, 16934 .manufacture_id = WINBOND_NEX_ID, 16935 .model_id = WINBOND_NEX_W25Q64_V, 16936 .total_size = 8192, 16937 .page_size = 256, 16938 /* supports SFDP */ 16939 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16940 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16941 .tested = TEST_OK_PREW, 16942 .probe = probe_spi_rdid, 16943 .probe_timing = TIMING_ZERO, 16944 .block_erasers = 16945 { 16946 { 16947 .eraseblocks = { {4 * 1024, 2048} }, 16948 .block_erase = spi_block_erase_20, 16949 }, { 16950 .eraseblocks = { {32 * 1024, 256} }, 16951 .block_erase = spi_block_erase_52, 16952 }, { 16953 .eraseblocks = { {64 * 1024, 128} }, 16954 .block_erase = spi_block_erase_d8, 16955 }, { 16956 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16957 .block_erase = spi_block_erase_60, 16958 }, { 16959 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16960 .block_erase = spi_block_erase_c7, 16961 } 16962 }, 16963 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 16964 .unlock = spi_disable_blockprotect, 16965 .write = spi_chip_write_256, 16966 .read = spi_chip_read, 16967 .voltage = {2700, 3600}, 16968 }, 16969 16970 { 16971 .vendor = "Winbond", 16972 .name = "W25Q64.W", 16973 .bustype = BUS_SPI, 16974 .manufacture_id = WINBOND_NEX_ID, 16975 .model_id = WINBOND_NEX_W25Q64_W, 16976 .total_size = 8192, 16977 .page_size = 256, 16978 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 16979 /* QPI enable 0x38, disable 0xFF */ 16980 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 16981 .tested = TEST_OK_PREW, 16982 .probe = probe_spi_rdid, 16983 .probe_timing = TIMING_ZERO, 16984 .block_erasers = 16985 { 16986 { 16987 .eraseblocks = { {4 * 1024, 2048} }, 16988 .block_erase = spi_block_erase_20, 16989 }, { 16990 .eraseblocks = { {32 * 1024, 256} }, 16991 .block_erase = spi_block_erase_52, 16992 }, { 16993 .eraseblocks = { {64 * 1024, 128} }, 16994 .block_erase = spi_block_erase_d8, 16995 }, { 16996 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16997 .block_erase = spi_block_erase_60, 16998 }, { 16999 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17000 .block_erase = spi_block_erase_c7, 17001 } 17002 }, 17003 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17004 .unlock = spi_disable_blockprotect, 17005 .write = spi_chip_write_256, 17006 .read = spi_chip_read, 17007 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 17008 }, 17009 17010 { 17011 .vendor = "Winbond", 17012 .name = "W25Q80.V", 17013 .bustype = BUS_SPI, 17014 .manufacture_id = WINBOND_NEX_ID, 17015 .model_id = WINBOND_NEX_W25Q80_V, 17016 .total_size = 1024, 17017 .page_size = 256, 17018 /* supports SFDP */ 17019 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 17020 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 17021 .tested = TEST_OK_PREW, 17022 .probe = probe_spi_rdid, 17023 .probe_timing = TIMING_ZERO, 17024 .block_erasers = 17025 { 17026 { 17027 .eraseblocks = { {4 * 1024, 256} }, 17028 .block_erase = spi_block_erase_20, 17029 }, { 17030 .eraseblocks = { {32 * 1024, 32} }, 17031 .block_erase = spi_block_erase_52, 17032 }, { 17033 .eraseblocks = { {64 * 1024, 16} }, 17034 .block_erase = spi_block_erase_d8, 17035 }, { 17036 .eraseblocks = { {1024 * 1024, 1} }, 17037 .block_erase = spi_block_erase_60, 17038 }, { 17039 .eraseblocks = { {1024 * 1024, 1} }, 17040 .block_erase = spi_block_erase_c7, 17041 } 17042 }, 17043 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17044 .unlock = spi_disable_blockprotect, 17045 .write = spi_chip_write_256, 17046 .read = spi_chip_read, 17047 .voltage = {2700, 3600}, 17048 }, 17049 17050 { 17051 .vendor = "Winbond", 17052 .name = "W25Q80BW", 17053 .bustype = BUS_SPI, 17054 .manufacture_id = WINBOND_NEX_ID, 17055 .model_id = WINBOND_NEX_W25Q80BW, 17056 .total_size = 1024, 17057 .page_size = 256, 17058 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 17059 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 17060 .tested = TEST_OK_PREW, 17061 .probe = probe_spi_rdid, 17062 .probe_timing = TIMING_ZERO, 17063 .block_erasers = 17064 { 17065 { 17066 .eraseblocks = { {4 * 1024, 256} }, 17067 .block_erase = spi_block_erase_20, 17068 }, { 17069 .eraseblocks = { {32 * 1024, 32} }, 17070 .block_erase = spi_block_erase_52, 17071 }, { 17072 .eraseblocks = { {64 * 1024, 16} }, 17073 .block_erase = spi_block_erase_d8, 17074 }, { 17075 .eraseblocks = { {1 * 1024 * 1024, 1} }, 17076 .block_erase = spi_block_erase_60, 17077 }, { 17078 .eraseblocks = { {1 * 1024 * 1024, 1} }, 17079 .block_erase = spi_block_erase_c7, 17080 } 17081 }, 17082 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17083 .unlock = spi_disable_blockprotect, 17084 .write = spi_chip_write_256, 17085 .read = spi_chip_read, 17086 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 17087 }, 17088 17089 { 17090 .vendor = "Winbond", 17091 .name = "W25Q80EW", 17092 .bustype = BUS_SPI, 17093 .manufacture_id = WINBOND_NEX_ID, 17094 .model_id = WINBOND_NEX_W25Q80EW, 17095 .total_size = 1024, 17096 .page_size = 256, 17097 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 17098 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 17099 .tested = TEST_OK_PREW, 17100 .probe = probe_spi_rdid, 17101 .probe_timing = TIMING_ZERO, 17102 .block_erasers = 17103 { 17104 { 17105 .eraseblocks = { {4 * 1024, 256} }, 17106 .block_erase = spi_block_erase_20, 17107 }, { 17108 .eraseblocks = { {32 * 1024, 32} }, 17109 .block_erase = spi_block_erase_52, 17110 }, { 17111 .eraseblocks = { {64 * 1024, 16} }, 17112 .block_erase = spi_block_erase_d8, 17113 }, { 17114 .eraseblocks = { {1 * 1024 * 1024, 1} }, 17115 .block_erase = spi_block_erase_60, 17116 }, { 17117 .eraseblocks = { {1 * 1024 * 1024, 1} }, 17118 .block_erase = spi_block_erase_c7, 17119 } 17120 }, 17121 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17122 .unlock = spi_disable_blockprotect, 17123 .write = spi_chip_write_256, 17124 .read = spi_chip_read, 17125 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ 17126 }, 17127 17128 { 17129 .vendor = "Winbond", 17130 .name = "W25X10", 17131 .bustype = BUS_SPI, 17132 .manufacture_id = WINBOND_NEX_ID, 17133 .model_id = WINBOND_NEX_W25X10, 17134 .total_size = 128, 17135 .page_size = 256, 17136 .feature_bits = FEATURE_WRSR_WREN, 17137 .tested = TEST_OK_PREW, 17138 .probe = probe_spi_rdid, 17139 .probe_timing = TIMING_ZERO, 17140 .block_erasers = 17141 { 17142 { 17143 .eraseblocks = { {4 * 1024, 32} }, 17144 .block_erase = spi_block_erase_20, 17145 }, { 17146 .eraseblocks = { {64 * 1024, 2} }, 17147 .block_erase = spi_block_erase_d8, 17148 }, { 17149 .eraseblocks = { {128 * 1024, 1} }, 17150 .block_erase = spi_block_erase_c7, 17151 } 17152 }, 17153 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17154 .unlock = spi_disable_blockprotect, 17155 .write = spi_chip_write_256, 17156 .read = spi_chip_read, 17157 .voltage = {2700, 3600}, 17158 }, 17159 17160 { 17161 .vendor = "Winbond", 17162 .name = "W25X16", 17163 .bustype = BUS_SPI, 17164 .manufacture_id = WINBOND_NEX_ID, 17165 .model_id = WINBOND_NEX_W25X16, 17166 .total_size = 2048, 17167 .page_size = 256, 17168 .feature_bits = FEATURE_WRSR_WREN, 17169 .tested = TEST_OK_PREW, 17170 .probe = probe_spi_rdid, 17171 .probe_timing = TIMING_ZERO, 17172 .block_erasers = 17173 { 17174 { 17175 .eraseblocks = { {4 * 1024, 512} }, 17176 .block_erase = spi_block_erase_20, 17177 }, { 17178 .eraseblocks = { {32 * 1024, 64} }, 17179 .block_erase = spi_block_erase_52, 17180 }, { 17181 .eraseblocks = { {64 * 1024, 32} }, 17182 .block_erase = spi_block_erase_d8, 17183 }, { 17184 .eraseblocks = { {2 * 1024 * 1024, 1} }, 17185 .block_erase = spi_block_erase_60, 17186 }, { 17187 .eraseblocks = { {2 * 1024 * 1024, 1} }, 17188 .block_erase = spi_block_erase_c7, 17189 } 17190 }, 17191 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17192 .unlock = spi_disable_blockprotect, 17193 .write = spi_chip_write_256, 17194 .read = spi_chip_read, 17195 .voltage = {2700, 3600}, 17196 }, 17197 17198 { 17199 .vendor = "Winbond", 17200 .name = "W25X20", 17201 .bustype = BUS_SPI, 17202 .manufacture_id = WINBOND_NEX_ID, 17203 .model_id = WINBOND_NEX_W25X20, 17204 .total_size = 256, 17205 .page_size = 256, 17206 .feature_bits = FEATURE_WRSR_WREN, 17207 .tested = TEST_OK_PREW, 17208 .probe = probe_spi_rdid, 17209 .probe_timing = TIMING_ZERO, 17210 .block_erasers = 17211 { 17212 { 17213 .eraseblocks = { {4 * 1024, 64} }, 17214 .block_erase = spi_block_erase_20, 17215 }, { 17216 .eraseblocks = { {64 * 1024, 4} }, 17217 .block_erase = spi_block_erase_d8, 17218 }, { 17219 .eraseblocks = { {256 * 1024, 1} }, 17220 .block_erase = spi_block_erase_c7, 17221 } 17222 }, 17223 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17224 .unlock = spi_disable_blockprotect, 17225 .write = spi_chip_write_256, 17226 .read = spi_chip_read, 17227 .voltage = {2700, 3600}, 17228 }, 17229 17230 { 17231 .vendor = "Winbond", 17232 .name = "W25X32", 17233 .bustype = BUS_SPI, 17234 .manufacture_id = WINBOND_NEX_ID, 17235 .model_id = WINBOND_NEX_W25X32, 17236 .total_size = 4096, 17237 .page_size = 256, 17238 .feature_bits = FEATURE_WRSR_WREN, 17239 .tested = TEST_OK_PREW, 17240 .probe = probe_spi_rdid, 17241 .probe_timing = TIMING_ZERO, 17242 .block_erasers = 17243 { 17244 { 17245 .eraseblocks = { {4 * 1024, 1024} }, 17246 .block_erase = spi_block_erase_20, 17247 }, { 17248 .eraseblocks = { {32 * 1024, 128} }, 17249 .block_erase = spi_block_erase_52, 17250 }, { 17251 .eraseblocks = { {64 * 1024, 64} }, 17252 .block_erase = spi_block_erase_d8, 17253 }, { 17254 .eraseblocks = { {4 * 1024 * 1024, 1} }, 17255 .block_erase = spi_block_erase_60, 17256 }, { 17257 .eraseblocks = { {4 * 1024 * 1024, 1} }, 17258 .block_erase = spi_block_erase_c7, 17259 } 17260 }, 17261 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17262 .unlock = spi_disable_blockprotect, 17263 .write = spi_chip_write_256, 17264 .read = spi_chip_read, 17265 .voltage = {2700, 3600}, 17266 }, 17267 17268 { 17269 .vendor = "Winbond", 17270 .name = "W25X40", 17271 .bustype = BUS_SPI, 17272 .manufacture_id = WINBOND_NEX_ID, 17273 .model_id = WINBOND_NEX_W25X40, 17274 .total_size = 512, 17275 .page_size = 256, 17276 .feature_bits = FEATURE_WRSR_WREN, 17277 .tested = TEST_OK_PREW, 17278 .probe = probe_spi_rdid, 17279 .probe_timing = TIMING_ZERO, 17280 .block_erasers = 17281 { 17282 { 17283 .eraseblocks = { {4 * 1024, 128} }, 17284 .block_erase = spi_block_erase_20, 17285 }, { 17286 .eraseblocks = { {64 * 1024, 8} }, 17287 .block_erase = spi_block_erase_d8, 17288 }, { 17289 .eraseblocks = { {512 * 1024, 1} }, 17290 .block_erase = spi_block_erase_c7, 17291 } 17292 }, 17293 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17294 .unlock = spi_disable_blockprotect, 17295 .write = spi_chip_write_256, 17296 .read = spi_chip_read, 17297 .voltage = {2700, 3600}, 17298 }, 17299 17300 { 17301 .vendor = "Winbond", 17302 .name = "W25X64", 17303 .bustype = BUS_SPI, 17304 .manufacture_id = WINBOND_NEX_ID, 17305 .model_id = WINBOND_NEX_W25X64, 17306 .total_size = 8192, 17307 .page_size = 256, 17308 .feature_bits = FEATURE_WRSR_WREN, 17309 .tested = TEST_OK_PREW, 17310 .probe = probe_spi_rdid, 17311 .probe_timing = TIMING_ZERO, 17312 .block_erasers = 17313 { 17314 { 17315 .eraseblocks = { {4 * 1024, 2048} }, 17316 .block_erase = spi_block_erase_20, 17317 }, { 17318 .eraseblocks = { {32 * 1024, 256} }, 17319 .block_erase = spi_block_erase_52, 17320 }, { 17321 .eraseblocks = { {64 * 1024, 128} }, 17322 .block_erase = spi_block_erase_d8, 17323 }, { 17324 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17325 .block_erase = spi_block_erase_60, 17326 }, { 17327 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17328 .block_erase = spi_block_erase_c7, 17329 } 17330 }, 17331 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17332 .unlock = spi_disable_blockprotect, 17333 .write = spi_chip_write_256, 17334 .read = spi_chip_read, 17335 .voltage = {2700, 3600}, 17336 }, 17337 17338 { 17339 .vendor = "Winbond", 17340 .name = "W25X80", 17341 .bustype = BUS_SPI, 17342 .manufacture_id = WINBOND_NEX_ID, 17343 .model_id = WINBOND_NEX_W25X80, 17344 .total_size = 1024, 17345 .page_size = 256, 17346 .feature_bits = FEATURE_WRSR_WREN, 17347 .tested = TEST_OK_PREW, 17348 .probe = probe_spi_rdid, 17349 .probe_timing = TIMING_ZERO, 17350 .block_erasers = 17351 { 17352 { 17353 .eraseblocks = { {4 * 1024, 256} }, 17354 .block_erase = spi_block_erase_20, 17355 }, { 17356 .eraseblocks = { {64 * 1024, 16} }, 17357 .block_erase = spi_block_erase_d8, 17358 }, { 17359 .eraseblocks = { {1024 * 1024, 1} }, 17360 .block_erase = spi_block_erase_c7, 17361 } 17362 }, 17363 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 17364 .unlock = spi_disable_blockprotect, 17365 .write = spi_chip_write_256, 17366 .read = spi_chip_read, 17367 .voltage = {2700, 3600}, 17368 }, 17369 17370 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */ 17371 { 17372 .vendor = "Winbond", 17373 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012", 17374 .bustype = BUS_PARALLEL, 17375 .manufacture_id = WINBOND_ID, 17376 .model_id = WINBOND_W29C010, 17377 .total_size = 128, 17378 .page_size = 128, 17379 .feature_bits = FEATURE_LONG_RESET, 17380 .tested = TEST_OK_PREW, 17381 .probe = probe_jedec, 17382 .probe_timing = 10, /* used datasheet for the W29C011A */ 17383 .block_erasers = 17384 { 17385 { 17386 .eraseblocks = { {128 * 1024, 1} }, 17387 .block_erase = erase_chip_block_jedec, 17388 } 17389 }, 17390 .write = write_jedec, 17391 .read = read_memmapped, 17392 }, 17393 17394 { 17395 .vendor = "Winbond", 17396 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old", 17397 .bustype = BUS_PARALLEL, 17398 .manufacture_id = WINBOND_ID, 17399 .model_id = WINBOND_W29C010, 17400 .total_size = 128, 17401 .page_size = 128, 17402 .feature_bits = FEATURE_LONG_RESET, 17403 .tested = TEST_OK_PREW, 17404 .probe = probe_w29ee011, 17405 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */ 17406 .block_erasers = 17407 { 17408 { 17409 .eraseblocks = { {128 * 1024, 1} }, 17410 .block_erase = erase_chip_block_jedec, 17411 } 17412 }, 17413 .write = write_jedec, 17414 .read = read_memmapped, 17415 }, 17416 17417 { 17418 .vendor = "Winbond", 17419 .name = "W29C020(C)/W29C022", 17420 .bustype = BUS_PARALLEL, 17421 .manufacture_id = WINBOND_ID, 17422 .model_id = WINBOND_W29C020, 17423 .total_size = 256, 17424 .page_size = 128, 17425 .feature_bits = FEATURE_LONG_RESET, 17426 .tested = TEST_OK_PREW, 17427 .probe = probe_jedec, 17428 .probe_timing = 10, 17429 .block_erasers = 17430 { 17431 { 17432 .eraseblocks = { {256 * 1024, 1} }, 17433 .block_erase = erase_chip_block_jedec, 17434 } 17435 }, 17436 .write = write_jedec, 17437 .read = read_memmapped, 17438 .voltage = {4500, 5500}, 17439 }, 17440 17441 { 17442 .vendor = "Winbond", 17443 .name = "W29C040/P", 17444 .bustype = BUS_PARALLEL, 17445 .manufacture_id = WINBOND_ID, 17446 .model_id = WINBOND_W29C040, 17447 .total_size = 512, 17448 .page_size = 256, 17449 .feature_bits = FEATURE_LONG_RESET, 17450 .tested = TEST_UNTESTED, 17451 .probe = probe_jedec, 17452 .probe_timing = 10, 17453 .block_erasers = 17454 { 17455 { 17456 .eraseblocks = { {512 * 1024, 1} }, 17457 .block_erase = erase_chip_block_jedec, 17458 } 17459 }, 17460 .write = write_jedec, 17461 .read = read_memmapped, 17462 .voltage = {4500, 5500}, 17463 }, 17464 17465 { 17466 .vendor = "Winbond", 17467 .name = "W29C512A/W29EE512", 17468 .bustype = BUS_PARALLEL, 17469 .manufacture_id = WINBOND_ID, 17470 .model_id = WINBOND_W29C512A, 17471 .total_size = 64, 17472 .page_size = 128, 17473 .feature_bits = FEATURE_LONG_RESET, 17474 .tested = TEST_OK_PREW, 17475 .probe = probe_jedec, 17476 .probe_timing = 10, 17477 .block_erasers = 17478 { 17479 { 17480 .eraseblocks = { {64 * 1024, 1} }, 17481 .block_erase = erase_chip_block_jedec, 17482 } 17483 }, 17484 .write = write_jedec, 17485 .read = read_memmapped, 17486 .voltage = {4500, 5500}, 17487 }, 17488 17489 { 17490 .vendor = "Winbond", 17491 .name = "W29GL032CB", 17492 .bustype = BUS_PARALLEL, 17493 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17494 .model_id = WINBOND_W29GL032CB, 17495 .total_size = 4096, 17496 .page_size = 128 * 1024, /* actual page size is 16 */ 17497 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17498 .tested = TEST_UNTESTED, 17499 .probe = probe_jedec_29gl, 17500 .probe_timing = TIMING_ZERO, 17501 .block_erasers = 17502 { 17503 { 17504 .eraseblocks = { 17505 {8 * 1024, 8}, 17506 {64 * 1024, 63}, 17507 }, 17508 .block_erase = erase_sector_jedec, 17509 }, { 17510 .eraseblocks = { {4 * 1024 * 1024, 1} }, 17511 .block_erase = erase_chip_block_jedec, 17512 }, 17513 }, 17514 .write = write_jedec_1, 17515 .read = read_memmapped, 17516 .voltage = {2700, 3600}, 17517 }, 17518 17519 { 17520 .vendor = "Winbond", 17521 .name = "W29GL032CH/L", 17522 .bustype = BUS_PARALLEL, 17523 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17524 .model_id = WINBOND_W29GL032CHL, 17525 .total_size = 4096, 17526 .page_size = 128 * 1024, /* actual page size is 16 */ 17527 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17528 .tested = TEST_UNTESTED, 17529 .probe = probe_jedec_29gl, 17530 .probe_timing = TIMING_ZERO, 17531 .block_erasers = 17532 { 17533 { 17534 .eraseblocks = { {64 * 1024, 64} }, 17535 .block_erase = erase_sector_jedec, 17536 }, { 17537 .eraseblocks = { {4 * 1024 * 1024, 1} }, 17538 .block_erase = erase_chip_block_jedec, 17539 }, 17540 }, 17541 .write = write_jedec_1, 17542 .read = read_memmapped, 17543 .voltage = {2700, 3600}, 17544 }, 17545 17546 { 17547 .vendor = "Winbond", 17548 .name = "W29GL032CT", 17549 .bustype = BUS_PARALLEL, 17550 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17551 .model_id = WINBOND_W29GL032CT, 17552 .total_size = 4096, 17553 .page_size = 128 * 1024, /* actual page size is 16 */ 17554 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17555 .tested = TEST_UNTESTED, 17556 .probe = probe_jedec_29gl, 17557 .probe_timing = TIMING_ZERO, 17558 .block_erasers = 17559 { 17560 { 17561 .eraseblocks = { 17562 {64 * 1024, 63}, 17563 {8 * 1024, 8}, 17564 }, 17565 .block_erase = erase_sector_jedec, 17566 }, { 17567 .eraseblocks = { {4 * 1024 * 1024, 1} }, 17568 .block_erase = erase_chip_block_jedec, 17569 }, 17570 }, 17571 .write = write_jedec_1, 17572 .read = read_memmapped, 17573 .voltage = {2700, 3600}, 17574 }, 17575 17576 { 17577 .vendor = "Winbond", 17578 .name = "W29GL064CB", 17579 .bustype = BUS_PARALLEL, 17580 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17581 .model_id = WINBOND_W29GL064CB, 17582 .total_size = 8192, 17583 .page_size = 128 * 1024, /* actual page size is 16 */ 17584 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17585 .tested = TEST_UNTESTED, 17586 .probe = probe_jedec_29gl, 17587 .probe_timing = TIMING_ZERO, 17588 .block_erasers = 17589 { 17590 { 17591 .eraseblocks = { 17592 {8 * 1024, 8}, 17593 {64 * 1024, 127}, 17594 }, 17595 .block_erase = erase_sector_jedec, 17596 }, { 17597 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17598 .block_erase = erase_chip_block_jedec, 17599 }, 17600 }, 17601 .write = write_jedec_1, 17602 .read = read_memmapped, 17603 .voltage = {2700, 3600}, 17604 }, 17605 17606 { 17607 .vendor = "Winbond", 17608 .name = "W29GL064CH/L", 17609 .bustype = BUS_PARALLEL, 17610 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17611 .model_id = WINBOND_W29GL064CHL, 17612 .total_size = 8192, 17613 .page_size = 128 * 1024, /* actual page size is 16 */ 17614 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17615 .tested = TEST_UNTESTED, 17616 .probe = probe_jedec_29gl, 17617 .probe_timing = TIMING_ZERO, 17618 .block_erasers = 17619 { 17620 { 17621 .eraseblocks = { {64 * 1024, 128} }, 17622 .block_erase = erase_sector_jedec, 17623 }, { 17624 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17625 .block_erase = erase_chip_block_jedec, 17626 }, 17627 }, 17628 .write = write_jedec_1, 17629 .read = read_memmapped, 17630 .voltage = {2700, 3600}, 17631 }, 17632 17633 { 17634 .vendor = "Winbond", 17635 .name = "W29GL064CT", 17636 .bustype = BUS_PARALLEL, 17637 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17638 .model_id = WINBOND_W29GL064CT, 17639 .total_size = 8192, 17640 .page_size = 128 * 1024, /* actual page size is 16 */ 17641 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17642 .tested = TEST_UNTESTED, 17643 .probe = probe_jedec_29gl, 17644 .probe_timing = TIMING_ZERO, 17645 .block_erasers = 17646 { 17647 { 17648 .eraseblocks = { 17649 {64 * 1024, 127}, 17650 {8 * 1024, 8}, 17651 }, 17652 .block_erase = erase_sector_jedec, 17653 }, { 17654 .eraseblocks = { {8 * 1024 * 1024, 1} }, 17655 .block_erase = erase_chip_block_jedec, 17656 }, 17657 }, 17658 .write = write_jedec_1, 17659 .read = read_memmapped, 17660 .voltage = {2700, 3600}, 17661 }, 17662 17663 { 17664 .vendor = "Winbond", 17665 .name = "W29GL128C", 17666 .bustype = BUS_PARALLEL, 17667 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 17668 .model_id = WINBOND_W29GL128CHL, 17669 .total_size = 16384, 17670 .page_size = 128 * 1024, /* actual page size is 16 */ 17671 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 17672 .tested = TEST_UNTESTED, 17673 .probe = probe_jedec_29gl, 17674 .probe_timing = TIMING_ZERO, 17675 .block_erasers = 17676 { 17677 { 17678 .eraseblocks = { {128 * 1024, 128} }, 17679 .block_erase = erase_sector_jedec, 17680 }, { 17681 .eraseblocks = { {16 * 1024 * 1024, 1} }, 17682 .block_erase = erase_chip_block_jedec, 17683 }, 17684 }, 17685 .write = write_jedec_1, 17686 .read = read_memmapped, 17687 .voltage = {2700, 3600}, 17688 }, 17689 17690 { 17691 .vendor = "Winbond", 17692 .name = "W39F010", 17693 .bustype = BUS_PARALLEL, 17694 .manufacture_id = WINBOND_ID, 17695 .model_id = WINBOND_W39F010, 17696 .total_size = 128, 17697 .page_size = 4 * 1024, 17698 .feature_bits = FEATURE_EITHER_RESET, 17699 .tested = TEST_OK_PREW, 17700 .probe = probe_jedec, 17701 .probe_timing = 10, 17702 .block_erasers = 17703 { 17704 { 17705 .eraseblocks = { {4 * 1024, 32} }, 17706 .block_erase = erase_block_jedec, 17707 }, { 17708 .eraseblocks = { {128 * 1024, 1} }, 17709 .block_erase = erase_chip_block_jedec, 17710 } 17711 }, 17712 .printlock = printlock_w39f010, 17713 .write = write_jedec_1, 17714 .read = read_memmapped, 17715 .voltage = {4500, 5500}, 17716 }, 17717 17718 { 17719 .vendor = "Winbond", 17720 .name = "W39L010", 17721 .bustype = BUS_PARALLEL, 17722 .manufacture_id = WINBOND_ID, 17723 .model_id = WINBOND_W39L010, 17724 .total_size = 128, 17725 .page_size = 4 * 1024, 17726 .feature_bits = FEATURE_EITHER_RESET, 17727 .tested = TEST_UNTESTED, 17728 .probe = probe_jedec, 17729 .probe_timing = 10, 17730 .block_erasers = 17731 { 17732 { 17733 .eraseblocks = { {4 * 1024, 32} }, 17734 .block_erase = erase_block_jedec, 17735 }, { 17736 .eraseblocks = { {128 * 1024, 1} }, 17737 .block_erase = erase_chip_block_jedec, 17738 } 17739 }, 17740 .printlock = printlock_w39l010, 17741 .write = write_jedec_1, 17742 .read = read_memmapped, 17743 .voltage = {3000, 3600}, 17744 }, 17745 17746 { 17747 .vendor = "Winbond", 17748 .name = "W39L020", 17749 .bustype = BUS_PARALLEL, 17750 .manufacture_id = WINBOND_ID, 17751 .model_id = WINBOND_W39L020, 17752 .total_size = 256, 17753 .page_size = 4 * 1024, 17754 .feature_bits = FEATURE_EITHER_RESET, 17755 .tested = TEST_UNTESTED, 17756 .probe = probe_jedec, 17757 .probe_timing = 10, 17758 .block_erasers = 17759 { 17760 { 17761 .eraseblocks = { {4 * 1024, 64} }, 17762 .block_erase = erase_block_jedec, 17763 }, { 17764 .eraseblocks = { {64 * 1024, 4} }, 17765 .block_erase = erase_sector_jedec, 17766 }, { 17767 .eraseblocks = { {256 * 1024, 1} }, 17768 .block_erase = erase_chip_block_jedec, 17769 } 17770 }, 17771 .printlock = printlock_w39l020, 17772 .write = write_jedec_1, 17773 .read = read_memmapped, 17774 .voltage = {3000, 3600}, 17775 }, 17776 17777 { 17778 .vendor = "Winbond", 17779 .name = "W39L040", 17780 .bustype = BUS_PARALLEL, 17781 .manufacture_id = WINBOND_ID, 17782 .model_id = WINBOND_W39L040, 17783 .total_size = 512, 17784 .page_size = 64 * 1024, 17785 .feature_bits = FEATURE_EITHER_RESET, 17786 .tested = TEST_OK_PR, 17787 .probe = probe_jedec, 17788 .probe_timing = 10, 17789 .block_erasers = 17790 { 17791 { 17792 .eraseblocks = { {4 * 1024, 128} }, 17793 .block_erase = erase_block_jedec, 17794 }, { 17795 .eraseblocks = { {64 * 1024, 8} }, 17796 .block_erase = erase_sector_jedec, 17797 }, { 17798 .eraseblocks = { {512 * 1024, 1} }, 17799 .block_erase = erase_chip_block_jedec, 17800 } 17801 }, 17802 .printlock = printlock_w39l040, 17803 .write = write_jedec_1, 17804 .read = read_memmapped, 17805 .voltage = {3000, 3600}, 17806 }, 17807 17808 { 17809 .vendor = "Winbond", 17810 .name = "W39V040A", 17811 .bustype = BUS_LPC, 17812 .manufacture_id = WINBOND_ID, 17813 .model_id = WINBOND_W39V040A, 17814 .total_size = 512, 17815 .page_size = 64 * 1024, 17816 .feature_bits = FEATURE_EITHER_RESET, 17817 .tested = TEST_OK_PREW, 17818 .probe = probe_jedec, 17819 .probe_timing = 10, 17820 .block_erasers = 17821 { 17822 { 17823 .eraseblocks = { {64 * 1024, 8} }, 17824 .block_erase = erase_sector_jedec, 17825 }, { 17826 .eraseblocks = { {512 * 1024, 1} }, 17827 .block_erase = erase_chip_block_jedec, 17828 } 17829 }, 17830 .printlock = printlock_w39v040a, 17831 .write = write_jedec_1, 17832 .read = read_memmapped, 17833 .voltage = {3000, 3600}, 17834 }, 17835 17836 { 17837 .vendor = "Winbond", 17838 .name = "W39V040B", 17839 .bustype = BUS_LPC, 17840 .manufacture_id = WINBOND_ID, 17841 .model_id = WINBOND_W39V040B, 17842 .total_size = 512, 17843 .page_size = 64 * 1024, 17844 .feature_bits = FEATURE_EITHER_RESET, 17845 .tested = TEST_OK_PREW, 17846 .probe = probe_jedec, 17847 .probe_timing = 10, 17848 .block_erasers = 17849 { 17850 { 17851 .eraseblocks = { {64 * 1024, 8} }, 17852 .block_erase = erase_sector_jedec, 17853 }, { 17854 .eraseblocks = { {512 * 1024, 1} }, 17855 .block_erase = erase_chip_block_jedec, 17856 } 17857 }, 17858 .printlock = printlock_w39v040b, 17859 .write = write_jedec_1, 17860 .read = read_memmapped, 17861 .voltage = {3000, 3600}, 17862 }, 17863 17864 { 17865 .vendor = "Winbond", 17866 .name = "W39V040C", 17867 .bustype = BUS_LPC, 17868 .manufacture_id = WINBOND_ID, 17869 .model_id = WINBOND_W39V040C, 17870 .total_size = 512, 17871 .page_size = 64 * 1024, 17872 .feature_bits = FEATURE_EITHER_RESET, 17873 .tested = TEST_OK_PREW, 17874 .probe = probe_jedec, 17875 .probe_timing = 10, 17876 .block_erasers = 17877 { 17878 { 17879 .eraseblocks = { {64 * 1024, 8} }, 17880 .block_erase = erase_sector_jedec, 17881 }, { 17882 .eraseblocks = { {512 * 1024, 1} }, 17883 .block_erase = erase_chip_block_jedec, 17884 } 17885 }, 17886 .printlock = printlock_w39v040c, 17887 .write = write_jedec_1, 17888 .read = read_memmapped, 17889 .voltage = {3000, 3600}, 17890 }, 17891 17892 { 17893 .vendor = "Winbond", 17894 .name = "W39V040FA", 17895 .bustype = BUS_FWH, 17896 .manufacture_id = WINBOND_ID, 17897 .model_id = WINBOND_W39V040FA, 17898 .total_size = 512, 17899 .page_size = 64 * 1024, 17900 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 17901 .tested = TEST_OK_PREW, 17902 .probe = probe_jedec, 17903 .probe_timing = 10, 17904 .block_erasers = 17905 { 17906 { 17907 .eraseblocks = { {4 * 1024, 128} }, 17908 .block_erase = erase_block_jedec, 17909 }, { 17910 .eraseblocks = { {64 * 1024, 8} }, 17911 .block_erase = erase_sector_jedec, 17912 }, { 17913 .eraseblocks = { {512 * 1024, 1} }, 17914 .block_erase = erase_chip_block_jedec, 17915 } 17916 }, 17917 .printlock = printlock_w39v040fa, 17918 .unlock = unlock_regspace2_uniform_64k, 17919 .write = write_jedec_1, 17920 .read = read_memmapped, 17921 .voltage = {3000, 3600}, 17922 }, 17923 17924 { 17925 .vendor = "Winbond", 17926 .name = "W39V040FB", 17927 .bustype = BUS_FWH, 17928 .manufacture_id = WINBOND_ID, 17929 .model_id = WINBOND_W39V040B, 17930 .total_size = 512, 17931 .page_size = 64 * 1024, 17932 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 17933 .tested = TEST_OK_PREW, 17934 .probe = probe_jedec, 17935 .probe_timing = 10, 17936 .block_erasers = 17937 { 17938 { 17939 .eraseblocks = { {64 * 1024, 8} }, 17940 .block_erase = erase_sector_jedec, 17941 }, { 17942 .eraseblocks = { {512 * 1024, 1} }, 17943 .block_erase = erase_chip_block_jedec, 17944 } 17945 }, 17946 .printlock = printlock_w39v040fb, 17947 .unlock = unlock_regspace2_uniform_64k, 17948 .write = write_jedec_1, 17949 .read = read_memmapped, 17950 .voltage = {3000, 3600}, /* Also has 12V fast program */ 17951 }, 17952 17953 { 17954 .vendor = "Winbond", 17955 .name = "W39V040FC", 17956 .bustype = BUS_FWH, 17957 .manufacture_id = WINBOND_ID, 17958 .model_id = WINBOND_W39V040C, 17959 .total_size = 512, 17960 .page_size = 64 * 1024, 17961 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 17962 .tested = TEST_OK_PREW, 17963 .probe = probe_jedec, 17964 .probe_timing = 10, 17965 .block_erasers = 17966 { 17967 { 17968 .eraseblocks = { {64 * 1024, 8} }, 17969 .block_erase = erase_sector_jedec, 17970 }, { 17971 .eraseblocks = { {512 * 1024, 1} }, 17972 .block_erase = erase_chip_block_jedec, 17973 } 17974 }, 17975 .printlock = printlock_w39v040fc, 17976 .write = write_jedec_1, 17977 .read = read_memmapped, 17978 .voltage = {3000, 3600}, /* Also has 12V fast program */ 17979 }, 17980 17981 { 17982 .vendor = "Winbond", 17983 .name = "W39V080A", 17984 .bustype = BUS_LPC, 17985 .manufacture_id = WINBOND_ID, 17986 .model_id = WINBOND_W39V080A, 17987 .total_size = 1024, 17988 .page_size = 64 * 1024, 17989 .feature_bits = FEATURE_EITHER_RESET, 17990 .tested = TEST_OK_PREW, 17991 .probe = probe_jedec, 17992 .probe_timing = 10, 17993 .block_erasers = 17994 { 17995 { 17996 .eraseblocks = { {64 * 1024, 16} }, 17997 .block_erase = erase_sector_jedec, 17998 }, { 17999 .eraseblocks = { {1024 * 1024, 1} }, 18000 .block_erase = erase_chip_block_jedec, 18001 } 18002 }, 18003 .printlock = printlock_w39v080a, 18004 .write = write_jedec_1, 18005 .read = read_memmapped, 18006 .voltage = {3000, 3600}, 18007 }, 18008 18009 { 18010 .vendor = "Winbond", 18011 .name = "W39V080FA", 18012 .bustype = BUS_FWH, 18013 .manufacture_id = WINBOND_ID, 18014 .model_id = WINBOND_W39V080FA, 18015 .total_size = 1024, 18016 .page_size = 64 * 1024, 18017 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 18018 .tested = TEST_OK_PREW, 18019 .probe = probe_jedec, 18020 .probe_timing = 10, 18021 .block_erasers = 18022 { 18023 { 18024 .eraseblocks = { {64 * 1024, 16} }, 18025 .block_erase = erase_sector_jedec, 18026 }, { 18027 .eraseblocks = { {1024 * 1024, 1} }, 18028 .block_erase = erase_chip_block_jedec, 18029 } 18030 }, 18031 .printlock = printlock_w39v080fa, 18032 .unlock = unlock_regspace2_uniform_64k, 18033 .write = write_jedec_1, 18034 .read = read_memmapped, 18035 .voltage = {3000, 3600}, /* Also has 12V fast program */ 18036 }, 18037 18038 { 18039 .vendor = "Winbond", 18040 .name = "W39V080FA (dual mode)", 18041 .bustype = BUS_FWH, 18042 .manufacture_id = WINBOND_ID, 18043 .model_id = WINBOND_W39V080FA_DM, 18044 .total_size = 512, 18045 .page_size = 64 * 1024, 18046 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 18047 .tested = TEST_UNTESTED, 18048 .probe = probe_jedec, 18049 .probe_timing = 10, 18050 .block_erasers = 18051 { 18052 { 18053 .eraseblocks = { {64 * 1024, 8} }, 18054 .block_erase = erase_sector_jedec, 18055 }, { 18056 .eraseblocks = { {512 * 1024, 1} }, 18057 .block_erase = erase_chip_block_jedec, 18058 } 18059 }, 18060 .printlock = printlock_w39v080fa_dual, 18061 .write = write_jedec_1, 18062 .read = read_memmapped, 18063 .voltage = {3000, 3600}, /* Also has 12V fast program */ 18064 }, 18065 18066 { 18067 .vendor = "Winbond", 18068 .name = "W49F002U/N", 18069 .bustype = BUS_PARALLEL, 18070 .manufacture_id = WINBOND_ID, 18071 .model_id = WINBOND_W49F002U, 18072 .total_size = 256, 18073 .page_size = 128, 18074 .feature_bits = FEATURE_EITHER_RESET, 18075 .tested = TEST_OK_PREW, 18076 .probe = probe_jedec, 18077 .probe_timing = 10, 18078 .block_erasers = 18079 { 18080 { 18081 .eraseblocks = { 18082 {128 * 1024, 1}, 18083 {96 * 1024, 1}, 18084 {8 * 1024, 2}, 18085 {16 * 1024, 1}, 18086 }, 18087 .block_erase = erase_sector_jedec, 18088 }, { 18089 .eraseblocks = { {256 * 1024, 1} }, 18090 .block_erase = erase_chip_block_jedec, 18091 } 18092 }, 18093 .write = write_jedec_1, 18094 .read = read_memmapped, 18095 .voltage = {4500, 5500}, 18096 }, 18097 18098 { 18099 .vendor = "Winbond", 18100 .name = "W49F020", 18101 .bustype = BUS_PARALLEL, 18102 .manufacture_id = WINBOND_ID, 18103 .model_id = WINBOND_W49F020, 18104 .total_size = 256, 18105 .page_size = 128, 18106 .feature_bits = FEATURE_EITHER_RESET, 18107 .tested = TEST_OK_PROBE, 18108 .probe = probe_jedec, 18109 .probe_timing = 10, 18110 .block_erasers = 18111 { 18112 { 18113 .eraseblocks = { {256 * 1024, 1} }, 18114 .block_erase = erase_chip_block_jedec, 18115 } 18116 }, 18117 .write = write_jedec_1, 18118 .read = read_memmapped, 18119 .voltage = {4500, 5500}, 18120 }, 18121 18122 { 18123 .vendor = "Winbond", 18124 .name = "W49V002A", 18125 .bustype = BUS_LPC, 18126 .manufacture_id = WINBOND_ID, 18127 .model_id = WINBOND_W49V002A, 18128 .total_size = 256, 18129 .page_size = 128, 18130 .feature_bits = FEATURE_EITHER_RESET, 18131 .tested = TEST_OK_PREW, 18132 .probe = probe_jedec, 18133 .probe_timing = 10, 18134 .block_erasers = 18135 { 18136 { 18137 .eraseblocks = { 18138 {64 * 1024, 3}, 18139 {32 * 1024, 1}, 18140 {8 * 1024, 2}, 18141 {16 * 1024, 1}, 18142 }, 18143 .block_erase = erase_sector_jedec, 18144 }, { 18145 .eraseblocks = { {256 * 1024, 1} }, 18146 .block_erase = erase_chip_block_jedec, 18147 } 18148 }, 18149 .write = write_jedec_1, 18150 .read = read_memmapped, 18151 .voltage = {3000, 3600}, 18152 }, 18153 18154 { 18155 .vendor = "Winbond", 18156 .name = "W49V002FA", 18157 .bustype = BUS_FWH, 18158 .manufacture_id = WINBOND_ID, 18159 .model_id = WINBOND_W49V002FA, 18160 .total_size = 256, 18161 .page_size = 128, 18162 .feature_bits = FEATURE_EITHER_RESET, 18163 .tested = TEST_OK_PREW, 18164 .probe = probe_jedec, 18165 .probe_timing = 10, 18166 .block_erasers = 18167 { 18168 { 18169 .eraseblocks = { 18170 {64 * 1024, 3}, 18171 {32 * 1024, 1}, 18172 {8 * 1024, 2}, 18173 {16 * 1024, 1}, 18174 }, 18175 .block_erase = erase_sector_jedec, 18176 }, { 18177 .eraseblocks = { {256 * 1024, 1} }, 18178 .block_erase = erase_chip_block_jedec, 18179 } 18180 }, 18181 .write = write_jedec_1, 18182 .read = read_memmapped, 18183 .voltage = {3000, 3600}, 18184 }, 18185 18186 { 18187 .vendor = "Zetta Device", 18188 .name = "ZD25D20", 18189 .bustype = BUS_SPI, 18190 .manufacture_id = ZETTADEVICE_ID, 18191 .model_id = ZETTADEVICE_ZD25D20, 18192 .total_size = 256, 18193 .page_size = 256, 18194 .feature_bits = FEATURE_WRSR_WREN, 18195 .tested = TEST_UNTESTED, 18196 .probe = probe_spi_rdid, 18197 .probe_timing = TIMING_ZERO, 18198 .block_erasers = 18199 { 18200 { 18201 .eraseblocks = { {4 * 1024, 64} }, 18202 .block_erase = spi_block_erase_20, 18203 }, { 18204 .eraseblocks = { {32 * 1024, 8} }, 18205 .block_erase = spi_block_erase_52, 18206 }, { 18207 .eraseblocks = { {64 * 1024, 4} }, 18208 .block_erase = spi_block_erase_d8, 18209 }, { 18210 .eraseblocks = { {256 * 1024, 1} }, 18211 .block_erase = spi_block_erase_60, 18212 }, { 18213 .eraseblocks = { {256 * 1024, 1} }, 18214 .block_erase = spi_block_erase_c7, 18215 } 18216 }, 18217 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 18218 .unlock = spi_disable_blockprotect, 18219 .write = spi_chip_write_256, 18220 .read = spi_chip_read, 18221 .voltage = {2700, 3600}, 18222 }, 18223 18224 { 18225 .vendor = "Zetta Device", 18226 .name = "ZD25D40", 18227 .bustype = BUS_SPI, 18228 .manufacture_id = ZETTADEVICE_ID, 18229 .model_id = ZETTADEVICE_ZD25D40, 18230 .total_size = 512, 18231 .page_size = 256, 18232 .feature_bits = FEATURE_WRSR_WREN, 18233 .tested = TEST_UNTESTED, 18234 .probe = probe_spi_rdid, 18235 .probe_timing = TIMING_ZERO, 18236 .block_erasers = 18237 { 18238 { 18239 .eraseblocks = { {4 * 1024, 128} }, 18240 .block_erase = spi_block_erase_20, 18241 }, { 18242 .eraseblocks = { {32 * 1024, 16} }, 18243 .block_erase = spi_block_erase_52, 18244 }, { 18245 .eraseblocks = { {64 * 1024, 8} }, 18246 .block_erase = spi_block_erase_d8, 18247 }, { 18248 .eraseblocks = { {512 * 1024, 1} }, 18249 .block_erase = spi_block_erase_60, 18250 }, { 18251 .eraseblocks = { {512 * 1024, 1} }, 18252 .block_erase = spi_block_erase_c7, 18253 } 18254 }, 18255 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */ 18256 .unlock = spi_disable_blockprotect, 18257 .write = spi_chip_write_256, 18258 .read = spi_chip_read, 18259 .voltage = {2700, 3600}, 18260 }, 18261 18262 { 18263 .vendor = "Unknown", 18264 .name = "SFDP-capable chip", 18265 .bustype = BUS_SPI, 18266 .manufacture_id = GENERIC_MANUF_ID, 18267 .model_id = SFDP_DEVICE_ID, 18268 .total_size = 0, /* set by probing function */ 18269 .page_size = 0, /* set by probing function */ 18270 .feature_bits = 0, /* set by probing function */ 18271 /* We present our own "report this" text hence we do not */ 18272 /* want the default "This flash part has status UNTESTED..." */ 18273 /* text to be printed. */ 18274 .tested = TEST_OK_PREW, 18275 .probe = probe_spi_sfdp, 18276 .block_erasers = {}, /* set by probing function */ 18277 .unlock = spi_disable_blockprotect, /* is this safe? */ 18278 .write = NULL, /* set by probing function */ 18279 .read = spi_chip_read, 18280 /* FIXME: some vendor extensions define this */ 18281 .voltage = {0}, 18282 }, 18283 18284 { 18285 .vendor = "Programmer", 18286 .name = "Opaque flash chip", 18287 .bustype = BUS_PROG, 18288 .manufacture_id = PROGMANUF_ID, 18289 .model_id = PROGDEV_ID, 18290 .total_size = 0, 18291 .page_size = 256, 18292 /* probe is assumed to work, rest will be filled in by probe */ 18293 .tested = TEST_OK_PROBE, 18294 .probe = probe_opaque, 18295 /* eraseblock sizes will be set by the probing function */ 18296 .block_erasers = 18297 { 18298 { 18299 .block_erase = erase_opaque, 18300 } 18301 }, 18302 .write = write_opaque, 18303 .read = read_opaque, 18304 }, 18305 18306 { 18307 .vendor = "AMIC", 18308 .name = "unknown AMIC SPI chip", 18309 .bustype = BUS_SPI, 18310 .manufacture_id = AMIC_ID, 18311 .model_id = GENERIC_DEVICE_ID, 18312 .total_size = 0, 18313 .page_size = 256, 18314 .tested = TEST_BAD_PREW, 18315 .probe = probe_spi_rdid4, 18316 .probe_timing = TIMING_ZERO, 18317 .write = NULL, 18318 .read = NULL, 18319 }, 18320 18321 { 18322 .vendor = "Atmel", 18323 .name = "unknown Atmel SPI chip", 18324 .bustype = BUS_SPI, 18325 .manufacture_id = ATMEL_ID, 18326 .model_id = GENERIC_DEVICE_ID, 18327 .total_size = 0, 18328 .page_size = 256, 18329 .tested = TEST_BAD_PREW, 18330 .probe = probe_spi_rdid, 18331 .probe_timing = TIMING_ZERO, 18332 .write = NULL, 18333 .read = NULL, 18334 }, 18335 18336 { 18337 .vendor = "Eon", 18338 .name = "unknown Eon SPI chip", 18339 .bustype = BUS_SPI, 18340 .manufacture_id = EON_ID_NOPREFIX, 18341 .model_id = GENERIC_DEVICE_ID, 18342 .total_size = 0, 18343 .page_size = 256, 18344 .tested = TEST_BAD_PREW, 18345 .probe = probe_spi_rdid, 18346 .probe_timing = TIMING_ZERO, 18347 .write = NULL, 18348 .read = NULL, 18349 }, 18350 18351 { 18352 .vendor = "Macronix", 18353 .name = "unknown Macronix SPI chip", 18354 .bustype = BUS_SPI, 18355 .manufacture_id = MACRONIX_ID, 18356 .model_id = GENERIC_DEVICE_ID, 18357 .total_size = 0, 18358 .page_size = 256, 18359 .tested = TEST_BAD_PREW, 18360 .probe = probe_spi_rdid, 18361 .probe_timing = TIMING_ZERO, 18362 .write = NULL, 18363 .read = NULL, 18364 }, 18365 18366 { 18367 .vendor = "PMC", 18368 .name = "unknown PMC SPI chip", 18369 .bustype = BUS_SPI, 18370 .manufacture_id = PMC_ID, 18371 .model_id = GENERIC_DEVICE_ID, 18372 .total_size = 0, 18373 .page_size = 256, 18374 .tested = TEST_BAD_PREW, 18375 .probe = probe_spi_rdid, 18376 .probe_timing = TIMING_ZERO, 18377 .write = NULL, 18378 .read = NULL, 18379 }, 18380 18381 { 18382 .vendor = "SST", 18383 .name = "unknown SST SPI chip", 18384 .bustype = BUS_SPI, 18385 .manufacture_id = SST_ID, 18386 .model_id = GENERIC_DEVICE_ID, 18387 .total_size = 0, 18388 .page_size = 256, 18389 .tested = TEST_BAD_PREW, 18390 .probe = probe_spi_rdid, 18391 .probe_timing = TIMING_ZERO, 18392 .write = NULL, 18393 .read = NULL, 18394 }, 18395 18396 { 18397 .vendor = "ST", 18398 .name = "unknown ST SPI chip", 18399 .bustype = BUS_SPI, 18400 .manufacture_id = ST_ID, 18401 .model_id = GENERIC_DEVICE_ID, 18402 .total_size = 0, 18403 .page_size = 256, 18404 .tested = TEST_BAD_PREW, 18405 .probe = probe_spi_rdid, 18406 .probe_timing = TIMING_ZERO, 18407 .write = NULL, 18408 .read = NULL, 18409 }, 18410 18411 { 18412 .vendor = "Sanyo", 18413 .name = "unknown Sanyo SPI chip", 18414 .bustype = BUS_SPI, 18415 .manufacture_id = SANYO_ID, 18416 .model_id = GENERIC_DEVICE_ID, 18417 .total_size = 0, 18418 .page_size = 256, 18419 .tested = TEST_BAD_PREW, 18420 .probe = probe_spi_rdid, 18421 .probe_timing = TIMING_ZERO, 18422 .write = NULL, 18423 .read = NULL, 18424 }, 18425 18426 { 18427 .vendor = "Winbond", 18428 .name = "unknown Winbond (ex Nexcom) SPI chip", 18429 .bustype = BUS_SPI, 18430 .manufacture_id = WINBOND_NEX_ID, 18431 .model_id = GENERIC_DEVICE_ID, 18432 .total_size = 0, 18433 .page_size = 256, 18434 .tested = TEST_BAD_PREW, 18435 .probe = probe_spi_rdid, 18436 .probe_timing = TIMING_ZERO, 18437 .write = NULL, 18438 .read = NULL, 18439 }, 18440 18441 { 18442 .vendor = "Generic", 18443 .name = "unknown SPI chip (RDID)", 18444 .bustype = BUS_SPI, 18445 .manufacture_id = GENERIC_MANUF_ID, 18446 .model_id = GENERIC_DEVICE_ID, 18447 .total_size = 0, 18448 .page_size = 256, 18449 .tested = TEST_BAD_PREW, 18450 .probe = probe_spi_rdid, 18451 .write = NULL, 18452 }, 18453 18454 { 18455 .vendor = "Generic", 18456 .name = "unknown SPI chip (REMS)", 18457 .bustype = BUS_SPI, 18458 .manufacture_id = GENERIC_MANUF_ID, 18459 .model_id = GENERIC_DEVICE_ID, 18460 .total_size = 0, 18461 .page_size = 256, 18462 .tested = TEST_BAD_PREW, 18463 .probe = probe_spi_rems, 18464 .write = NULL, 18465 }, 18466 18467 {0} 18468 }; 18469 18470 const unsigned int flashchips_size = ARRAY_SIZE(flashchips); 18471