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 <[email protected]> 7 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger 8 * Copyright (C) 2009 Sean Nelson <[email protected]> 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 /* 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 = JEDEC_SECTOR_ERASE, 81 }, { 82 .eraseblocks = { {256 * 1024, 1} }, 83 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 84 }, 85 }, 86 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 113 }, { 114 .eraseblocks = { {256 * 1024, 1} }, 115 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 116 }, 117 }, 118 .write = WRITE_JEDEC1, 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, 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 = JEDEC_SECTOR_ERASE, 140 }, { 141 .eraseblocks = { {128 * 1024, 1} }, 142 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 143 }, 144 }, 145 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 167 }, { 168 .eraseblocks = { {128 * 1024, 1} }, 169 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 170 }, 171 }, 172 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 194 }, { 195 .eraseblocks = { {2048 * 1024, 1} }, 196 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 197 }, 198 }, 199 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 221 }, { 222 .eraseblocks = { {512 * 1024, 1} }, 223 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 224 }, 225 }, 226 .write = WRITE_JEDEC1, 227 .read = READ_MEMMAPPED, 228 .voltage = {4500, 5500}, 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 = JEDEC_SECTOR_ERASE, 248 }, { 249 .eraseblocks = { {512 * 1024, 1} }, 250 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 251 }, 252 }, 253 .write = WRITE_JEDEC1, 254 .read = READ_MEMMAPPED, 255 .voltage = {4500, 5500}, 256 }, 257 258 { 259 .vendor = "AMD", 260 .name = "Am29F080", 261 .bustype = BUS_PARALLEL, 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 = JEDEC_SECTOR_ERASE, 275 }, { 276 .eraseblocks = { {1024 * 1024, 1} }, 277 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 278 }, 279 }, 280 .write = WRITE_JEDEC1, 281 .read = READ_MEMMAPPED, 282 .voltage = {4500, 5500}, 283 }, 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 = JEDEC_SECTOR_ERASE, 302 }, { 303 .eraseblocks = { {1024 * 1024, 1} }, 304 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 305 }, 306 }, 307 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 333 }, { 334 .eraseblocks = { {128 * 1024, 1} }, 335 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 336 }, 337 }, 338 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 364 }, { 365 .eraseblocks = { {128 * 1024, 1} }, 366 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 367 }, 368 }, 369 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 396 }, { 397 .eraseblocks = { {256 * 1024, 1} }, 398 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 399 }, 400 }, 401 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 428 }, { 429 .eraseblocks = { {256 * 1024, 1} }, 430 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 431 }, 432 }, 433 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 460 }, { 461 .eraseblocks = { {512 * 1024, 1} }, 462 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 463 }, 464 }, 465 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 492 }, { 493 .eraseblocks = { {512 * 1024, 1} }, 494 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 495 }, 496 }, 497 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 524 }, { 525 .eraseblocks = { {1024 * 1024, 1} }, 526 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 527 }, 528 }, 529 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 556 }, { 557 .eraseblocks = { {1024 * 1024, 1} }, 558 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 559 }, 560 }, 561 .write = WRITE_JEDEC1, 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_PREW, 576 .probe = PROBE_JEDEC, 577 .probe_timing = TIMING_ZERO, 578 .block_erasers = 579 { 580 { 581 .eraseblocks = { {64 * 1024, 8} }, 582 .block_erase = JEDEC_SECTOR_ERASE, 583 }, { 584 .eraseblocks = { {512 * 1024, 1} }, 585 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 586 }, 587 }, 588 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 610 }, { 611 .eraseblocks = { {1024 * 1024, 1} }, 612 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 613 }, 614 }, 615 .write = WRITE_JEDEC1, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_SRWD_SEC_TB_BP2_WELWIP, 749 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 750 .write = SPI_CHIP_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_WRITE256, 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_SRWD_SEC_TB_BP2_WELWIP, 1279 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 1280 .write = SPI_CHIP_WRITE256, 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_SRWD_SEC_TB_BP2_WELWIP, 1319 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 1320 .write = SPI_CHIP_WRITE256, 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_WRITE256, 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 = JEDEC_SECTOR_ERASE, 1388 }, { 1389 .eraseblocks = { {256 * 1024, 1} }, 1390 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 1391 }, 1392 }, 1393 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 1420 }, { 1421 .eraseblocks = { {256 * 1024, 1} }, 1422 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 1423 }, 1424 }, 1425 .write = WRITE_JEDEC1, 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 = JEDEC_SECTOR_ERASE, 1447 }, { 1448 .eraseblocks = { {512 * 1024, 1} }, 1449 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 1450 }, 1451 }, 1452 .write = WRITE_JEDEC1, 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 = JEDEC_BLOCK_ERASE, 1474 }, { 1475 .eraseblocks = { {512 * 1024, 1} }, 1476 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 1477 } 1478 }, 1479 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 1480 .write = WRITE_JEDEC1, 1481 .read = READ_MEMMAPPED, 1482 .voltage = {3000, 3600}, 1483 }, 1484 1485 { 1486 .vendor = "Atmel", 1487 .name = "AT25DF011", 1488 .bustype = BUS_SPI, 1489 .manufacture_id = ATMEL_ID, 1490 .model_id = ATMEL_AT25DF011, 1491 .total_size = 128, 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_OK_PREW, 1496 .probe = PROBE_SPI_RDID, 1497 .probe_timing = TIMING_ZERO, 1498 .block_erasers = 1499 { 1500 { 1501 .eraseblocks = { {4 * 1024, 32} }, 1502 .block_erase = SPI_BLOCK_ERASE_20, 1503 }, { 1504 .eraseblocks = { {32 * 1024, 4} }, 1505 .block_erase = SPI_BLOCK_ERASE_52, 1506 }, { 1507 .eraseblocks = { {32 * 1024, 4} }, 1508 .block_erase = SPI_BLOCK_ERASE_D8, 1509 }, { 1510 .eraseblocks = { {128 * 1024, 1} }, 1511 .block_erase = SPI_BLOCK_ERASE_60, 1512 }, { 1513 .eraseblocks = { {128 * 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_WRITE256, 1520 .read = SPI_CHIP_READ, 1521 .voltage = {1650, 3600}, 1522 }, 1523 1524 { 1525 .vendor = "Atmel", 1526 .name = "AT25DF021", 1527 .bustype = BUS_SPI, 1528 .manufacture_id = ATMEL_ID, 1529 .model_id = ATMEL_AT25DF021, 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_UNTESTED, 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_WRITE256, 1559 .read = SPI_CHIP_READ, 1560 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */ 1561 }, 1562 1563 { 1564 .vendor = "Atmel", 1565 .name = "AT25DF021A", 1566 .bustype = BUS_SPI, 1567 .manufacture_id = ATMEL_ID, 1568 .model_id = ATMEL_AT25DF021A, 1569 .total_size = 256, 1570 .page_size = 256, 1571 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1572 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1573 .tested = TEST_OK_PREW, 1574 .probe = PROBE_SPI_RDID, 1575 .probe_timing = TIMING_ZERO, 1576 .block_erasers = 1577 { 1578 { 1579 .eraseblocks = { {4 * 1024, 64} }, 1580 .block_erase = SPI_BLOCK_ERASE_20, 1581 }, { 1582 .eraseblocks = { {32 * 1024, 8} }, 1583 .block_erase = SPI_BLOCK_ERASE_52, 1584 }, { 1585 .eraseblocks = { {64 * 1024, 4} }, 1586 .block_erase = SPI_BLOCK_ERASE_D8, 1587 }, { 1588 .eraseblocks = { {256 * 1024, 1} }, 1589 .block_erase = SPI_BLOCK_ERASE_60, 1590 }, { 1591 .eraseblocks = { {256 * 1024, 1} }, 1592 .block_erase = SPI_BLOCK_ERASE_C7, 1593 } 1594 }, 1595 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF, 1596 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 1597 .write = SPI_CHIP_WRITE256, 1598 .read = SPI_CHIP_READ, 1599 .voltage = {1650, 3600}, 1600 }, 1601 1602 { 1603 .vendor = "Atmel", 1604 .name = "AT25DF041A", 1605 .bustype = BUS_SPI, 1606 .manufacture_id = ATMEL_ID, 1607 .model_id = ATMEL_AT25DF041A, 1608 .total_size = 512, 1609 .page_size = 256, 1610 .feature_bits = FEATURE_WRSR_WREN, 1611 .tested = TEST_OK_PREW, 1612 .probe = PROBE_SPI_RDID, 1613 .probe_timing = TIMING_ZERO, 1614 .block_erasers = 1615 { 1616 { 1617 .eraseblocks = { {4 * 1024, 128} }, 1618 .block_erase = SPI_BLOCK_ERASE_20, 1619 }, { 1620 .eraseblocks = { {32 * 1024, 16} }, 1621 .block_erase = SPI_BLOCK_ERASE_52, 1622 }, { 1623 .eraseblocks = { {64 * 1024, 8} }, 1624 .block_erase = SPI_BLOCK_ERASE_D8, 1625 }, { 1626 .eraseblocks = { {512 * 1024, 1} }, 1627 .block_erase = SPI_BLOCK_ERASE_60, 1628 }, { 1629 .eraseblocks = { {512 * 1024, 1} }, 1630 .block_erase = SPI_BLOCK_ERASE_C7, 1631 } 1632 }, 1633 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF, 1634 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 1635 .write = SPI_CHIP_WRITE256, 1636 .read = SPI_CHIP_READ, 1637 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */ 1638 }, 1639 1640 { 1641 .vendor = "Atmel", 1642 .name = "AT25DF081", 1643 .bustype = BUS_SPI, 1644 .manufacture_id = ATMEL_ID, 1645 .model_id = ATMEL_AT25DF081, 1646 .total_size = 1024, 1647 .page_size = 256, 1648 .feature_bits = FEATURE_WRSR_WREN, 1649 .tested = TEST_UNTESTED, 1650 .probe = PROBE_SPI_RDID, 1651 .probe_timing = TIMING_ZERO, 1652 .block_erasers = 1653 { 1654 { 1655 .eraseblocks = { {4 * 1024, 256} }, 1656 .block_erase = SPI_BLOCK_ERASE_20, 1657 }, { 1658 .eraseblocks = { {32 * 1024, 32} }, 1659 .block_erase = SPI_BLOCK_ERASE_52, 1660 }, { 1661 .eraseblocks = { {64 * 1024, 16} }, 1662 .block_erase = SPI_BLOCK_ERASE_D8, 1663 }, { 1664 .eraseblocks = { {1024 * 1024, 1} }, 1665 .block_erase = SPI_BLOCK_ERASE_60, 1666 }, { 1667 .eraseblocks = { {1024 * 1024, 1} }, 1668 .block_erase = SPI_BLOCK_ERASE_C7, 1669 } 1670 }, 1671 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF, 1672 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 1673 .write = SPI_CHIP_WRITE256, 1674 .read = SPI_CHIP_READ, 1675 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */ 1676 }, 1677 1678 { 1679 .vendor = "Atmel", 1680 .name = "AT25DF081A", 1681 .bustype = BUS_SPI, 1682 .manufacture_id = ATMEL_ID, 1683 .model_id = ATMEL_AT25DF081A, 1684 .total_size = 1024, 1685 .page_size = 256, 1686 .feature_bits = FEATURE_WRSR_WREN, 1687 .tested = TEST_UNTESTED, 1688 .probe = PROBE_SPI_RDID, 1689 .probe_timing = TIMING_ZERO, 1690 .block_erasers = 1691 { 1692 { 1693 .eraseblocks = { {4 * 1024, 256} }, 1694 .block_erase = SPI_BLOCK_ERASE_20, 1695 }, { 1696 .eraseblocks = { {32 * 1024, 32} }, 1697 .block_erase = SPI_BLOCK_ERASE_52, 1698 }, { 1699 .eraseblocks = { {64 * 1024, 16} }, 1700 .block_erase = SPI_BLOCK_ERASE_D8, 1701 }, { 1702 .eraseblocks = { {1024 * 1024, 1} }, 1703 .block_erase = SPI_BLOCK_ERASE_60, 1704 }, { 1705 .eraseblocks = { {1024 * 1024, 1} }, 1706 .block_erase = SPI_BLOCK_ERASE_C7, 1707 } 1708 }, 1709 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF_SEC, 1710 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT_SEC, 1711 .write = SPI_CHIP_WRITE256, 1712 .read = SPI_CHIP_READ, 1713 .voltage = {2700, 3600}, 1714 }, 1715 1716 { 1717 .vendor = "Atmel", 1718 .name = "AT25DF161", 1719 .bustype = BUS_SPI, 1720 .manufacture_id = ATMEL_ID, 1721 .model_id = ATMEL_AT25DF161, 1722 .total_size = 2048, 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, 512} }, 1732 .block_erase = SPI_BLOCK_ERASE_20, 1733 }, { 1734 .eraseblocks = { {32 * 1024, 64} }, 1735 .block_erase = SPI_BLOCK_ERASE_52, 1736 }, { 1737 .eraseblocks = { {64 * 1024, 32} }, 1738 .block_erase = SPI_BLOCK_ERASE_D8, 1739 }, { 1740 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1741 .block_erase = SPI_BLOCK_ERASE_60, 1742 }, { 1743 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1744 .block_erase = SPI_BLOCK_ERASE_C7, 1745 } 1746 }, 1747 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF_SEC, 1748 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT_SEC, 1749 .write = SPI_CHIP_WRITE256, 1750 .read = SPI_CHIP_READ, 1751 .voltage = {2700, 3600}, 1752 }, 1753 1754 /*The AT26DF321 has the same ID as the AT25DF321. */ 1755 { 1756 .vendor = "Atmel", 1757 .name = "AT25DF321", 1758 .bustype = BUS_SPI, 1759 .manufacture_id = ATMEL_ID, 1760 .model_id = ATMEL_AT25DF321, 1761 .total_size = 4096, 1762 .page_size = 256, 1763 .feature_bits = FEATURE_WRSR_WREN, 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, 1787 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 1788 .write = SPI_CHIP_WRITE256, 1789 .read = SPI_CHIP_READ, 1790 .voltage = {2700, 3600}, 1791 }, 1792 1793 { 1794 .vendor = "Atmel", 1795 .name = "AT25DF321A", 1796 .bustype = BUS_SPI, 1797 .manufacture_id = ATMEL_ID, 1798 .model_id = ATMEL_AT25DF321A, 1799 .total_size = 4096, 1800 .page_size = 256, 1801 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1802 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1803 .tested = TEST_OK_PREW, 1804 .probe = PROBE_SPI_RDID, 1805 .probe_timing = TIMING_ZERO, 1806 .block_erasers = 1807 { 1808 { 1809 .eraseblocks = { {4 * 1024, 1024} }, 1810 .block_erase = SPI_BLOCK_ERASE_20, 1811 }, { 1812 .eraseblocks = { {32 * 1024, 128} }, 1813 .block_erase = SPI_BLOCK_ERASE_52, 1814 }, { 1815 .eraseblocks = { {64 * 1024, 64} }, 1816 .block_erase = SPI_BLOCK_ERASE_D8, 1817 }, { 1818 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1819 .block_erase = SPI_BLOCK_ERASE_60, 1820 }, { 1821 .eraseblocks = { {4 * 1024 * 1024, 1} }, 1822 .block_erase = SPI_BLOCK_ERASE_C7, 1823 } 1824 }, 1825 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF_SEC, 1826 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT_SEC, 1827 .write = SPI_CHIP_WRITE256, 1828 .read = SPI_CHIP_READ, 1829 .voltage = {2700, 3600}, 1830 }, 1831 1832 { 1833 .vendor = "Atmel", 1834 .name = "AT25DF641(A)", 1835 .bustype = BUS_SPI, 1836 .manufacture_id = ATMEL_ID, 1837 .model_id = ATMEL_AT25DF641, 1838 .total_size = 8192, 1839 .page_size = 256, 1840 .feature_bits = FEATURE_WRSR_WREN, 1841 .tested = TEST_OK_PREW, 1842 .probe = PROBE_SPI_RDID, 1843 .probe_timing = TIMING_ZERO, 1844 .block_erasers = 1845 { 1846 { 1847 .eraseblocks = { {4 * 1024, 2048} }, 1848 .block_erase = SPI_BLOCK_ERASE_20, 1849 }, { 1850 .eraseblocks = { {32 * 1024, 256} }, 1851 .block_erase = SPI_BLOCK_ERASE_52, 1852 }, { 1853 .eraseblocks = { {64 * 1024, 128} }, 1854 .block_erase = SPI_BLOCK_ERASE_D8, 1855 }, { 1856 .eraseblocks = { {8 * 1024 * 1024, 1} }, 1857 .block_erase = SPI_BLOCK_ERASE_60, 1858 }, { 1859 .eraseblocks = { {8 * 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_WRITE256, 1866 .read = SPI_CHIP_READ, 1867 .voltage = {2700, 3600}, 1868 }, 1869 1870 { 1871 .vendor = "Atmel", 1872 .name = "AT25DL081", 1873 .bustype = BUS_SPI, 1874 .manufacture_id = ATMEL_ID, 1875 .model_id = ATMEL_AT25DF081, 1876 .total_size = 1024, 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, 256} }, 1887 .block_erase = SPI_BLOCK_ERASE_20, 1888 }, { 1889 .eraseblocks = { {32 * 1024, 32} }, 1890 .block_erase = SPI_BLOCK_ERASE_52, 1891 }, { 1892 .eraseblocks = { {64 * 1024, 16} }, 1893 .block_erase = SPI_BLOCK_ERASE_D8, 1894 }, { 1895 .eraseblocks = { {1 * 1024 * 1024, 1} }, 1896 .block_erase = SPI_BLOCK_ERASE_60, 1897 }, { 1898 .eraseblocks = { {1 * 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_WRITE256, /* 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 = "AT25DL161", 1912 .bustype = BUS_SPI, 1913 .manufacture_id = ATMEL_ID, 1914 .model_id = ATMEL_AT25DL161, 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_WRITE256, /* Dual I/O (0xA2) supported */ 1944 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O (0x3B) supported */ 1945 .voltage = {1650, 1950}, 1946 }, 1947 1948 { 1949 .vendor = "Atmel", 1950 .name = "AT25DQ161", 1951 .bustype = BUS_SPI, 1952 .manufacture_id = ATMEL_ID, 1953 .model_id = ATMEL_AT25DQ161, 1954 .total_size = 2048, 1955 .page_size = 256, 1956 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 1957 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 1958 .tested = TEST_UNTESTED, 1959 .probe = PROBE_SPI_RDID, 1960 .probe_timing = TIMING_ZERO, 1961 .block_erasers = 1962 { 1963 { 1964 .eraseblocks = { {4 * 1024, 512} }, 1965 .block_erase = SPI_BLOCK_ERASE_20, 1966 }, { 1967 .eraseblocks = { {32 * 1024, 64} }, 1968 .block_erase = SPI_BLOCK_ERASE_52, 1969 }, { 1970 .eraseblocks = { {64 * 1024, 32} }, 1971 .block_erase = SPI_BLOCK_ERASE_D8, 1972 }, { 1973 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1974 .block_erase = SPI_BLOCK_ERASE_60, 1975 }, { 1976 .eraseblocks = { {2 * 1024 * 1024, 1} }, 1977 .block_erase = SPI_BLOCK_ERASE_C7, 1978 } 1979 }, 1980 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF_SEC, 1981 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT_SEC, 1982 .write = SPI_CHIP_WRITE256, 1983 .read = SPI_CHIP_READ, 1984 .voltage = {2700, 3600}, 1985 }, 1986 1987 { 1988 .vendor = "Atmel", 1989 /* The A suffix indicates 33MHz instead of 20MHz clock rate. 1990 * All other properties seem to be the same.*/ 1991 .name = "AT25F1024(A)", 1992 .bustype = BUS_SPI, 1993 .manufacture_id = ATMEL_ID, 1994 .model_id = ATMEL_AT25F1024, 1995 .total_size = 128, 1996 .page_size = 256, 1997 .feature_bits = FEATURE_WRSR_WREN, 1998 .tested = TEST_OK_PREW, 1999 .probe = PROBE_SPI_AT25F, 2000 .probe_timing = TIMING_ZERO, 2001 .block_erasers = 2002 { 2003 { 2004 .eraseblocks = { {32 * 1024, 4} }, 2005 .block_erase = SPI_BLOCK_ERASE_52, 2006 }, { 2007 .eraseblocks = { {128 * 1024, 1} }, 2008 .block_erase = SPI_BLOCK_ERASE_62, 2009 } 2010 }, 2011 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F, 2012 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25F, 2013 .write = SPI_CHIP_WRITE256, 2014 .read = SPI_CHIP_READ, 2015 .voltage = {2700, 3600}, 2016 }, 2017 2018 { 2019 .vendor = "Atmel", 2020 .name = "AT25F2048", 2021 .bustype = BUS_SPI, 2022 .manufacture_id = ATMEL_ID, 2023 .model_id = ATMEL_AT25F2048, 2024 .total_size = 256, 2025 .page_size = 256, 2026 .feature_bits = FEATURE_WRSR_WREN, 2027 .tested = TEST_UNTESTED, 2028 .probe = PROBE_SPI_AT25F, 2029 .probe_timing = TIMING_ZERO, 2030 .block_erasers = 2031 { 2032 { 2033 .eraseblocks = { {64 * 1024, 4} }, 2034 .block_erase = SPI_BLOCK_ERASE_52, 2035 }, { 2036 .eraseblocks = { {256 * 1024, 1} }, 2037 .block_erase = SPI_BLOCK_ERASE_62, 2038 } 2039 }, 2040 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F, 2041 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25F, 2042 .write = SPI_CHIP_WRITE256, 2043 .read = SPI_CHIP_READ, 2044 .voltage = {2700, 3600}, 2045 }, 2046 2047 { 2048 .vendor = "Atmel", 2049 .name = "AT25F4096", 2050 .bustype = BUS_SPI, 2051 .manufacture_id = ATMEL_ID, 2052 .model_id = ATMEL_AT25F4096, 2053 .total_size = 512, 2054 .page_size = 256, 2055 .feature_bits = FEATURE_WRSR_WREN, 2056 .tested = TEST_OK_PREW, 2057 .probe = PROBE_SPI_AT25F, 2058 .probe_timing = TIMING_ZERO, 2059 .block_erasers = 2060 { 2061 { 2062 .eraseblocks = { {64 * 1024, 8} }, 2063 .block_erase = SPI_BLOCK_ERASE_52, 2064 }, { 2065 .eraseblocks = { {512 * 1024, 1} }, 2066 .block_erase = SPI_BLOCK_ERASE_62, 2067 } 2068 }, 2069 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F4096, 2070 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */ 2071 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 2072 .write = SPI_CHIP_WRITE256, 2073 .read = SPI_CHIP_READ, 2074 .voltage = {2700, 3600}, 2075 }, 2076 2077 { 2078 .vendor = "Atmel", 2079 .name = "AT25F512", 2080 .bustype = BUS_SPI, 2081 .manufacture_id = ATMEL_ID, 2082 .model_id = ATMEL_AT25F512, 2083 .total_size = 64, 2084 .page_size = 256, 2085 .feature_bits = FEATURE_WRSR_WREN, 2086 .tested = TEST_OK_PREW, 2087 .probe = PROBE_SPI_AT25F, 2088 .probe_timing = TIMING_ZERO, 2089 .block_erasers = 2090 { 2091 { 2092 .eraseblocks = { {32 * 1024, 2} }, 2093 .block_erase = SPI_BLOCK_ERASE_52, 2094 }, { 2095 .eraseblocks = { {64 * 1024, 1} }, 2096 .block_erase = SPI_BLOCK_ERASE_62, 2097 } 2098 }, 2099 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F, 2100 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25F, 2101 .write = SPI_CHIP_WRITE256, 2102 .read = SPI_CHIP_READ, 2103 .voltage = {2700, 3600}, 2104 }, 2105 2106 { 2107 .vendor = "Atmel", 2108 .name = "AT25F512A", 2109 .bustype = BUS_SPI, 2110 .manufacture_id = ATMEL_ID, 2111 .model_id = ATMEL_AT25F512A, 2112 .total_size = 64, 2113 .page_size = 128, 2114 .feature_bits = FEATURE_WRSR_WREN, 2115 .tested = TEST_OK_PREW, 2116 .probe = PROBE_SPI_AT25F, 2117 .probe_timing = TIMING_ZERO, 2118 .block_erasers = 2119 { 2120 { 2121 .eraseblocks = { {32 * 1024, 2} }, 2122 .block_erase = SPI_BLOCK_ERASE_52, 2123 }, { 2124 .eraseblocks = { {64 * 1024, 1} }, 2125 .block_erase = SPI_BLOCK_ERASE_62, 2126 } 2127 }, 2128 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F512A, 2129 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */ 2130 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25F512A, 2131 .write = SPI_CHIP_WRITE256, 2132 .read = SPI_CHIP_READ, 2133 .voltage = {2700, 3600}, 2134 }, 2135 2136 { 2137 .vendor = "Atmel", 2138 .name = "AT25F512B", 2139 .bustype = BUS_SPI, 2140 .manufacture_id = ATMEL_ID, 2141 .model_id = ATMEL_AT25F512B, 2142 .total_size = 64, 2143 .page_size = 256, 2144 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 2146 .tested = TEST_UNTESTED, 2147 .probe = PROBE_SPI_RDID, 2148 .probe_timing = TIMING_ZERO, 2149 .block_erasers = 2150 { 2151 { 2152 .eraseblocks = { {4 * 1024, 16} }, 2153 .block_erase = SPI_BLOCK_ERASE_20, 2154 }, { 2155 .eraseblocks = { {32 * 1024, 2} }, 2156 .block_erase = SPI_BLOCK_ERASE_52, 2157 }, { 2158 .eraseblocks = { {32 * 1024, 2} }, 2159 .block_erase = SPI_BLOCK_ERASE_D8, 2160 }, { 2161 .eraseblocks = { {64 * 1024, 1} }, 2162 .block_erase = SPI_BLOCK_ERASE_60, 2163 }, { 2164 .eraseblocks = { {64 * 1024, 1} }, 2165 .block_erase = SPI_BLOCK_ERASE_C7, 2166 }, { 2167 .eraseblocks = { {64 * 1024, 1} }, 2168 .block_erase = SPI_BLOCK_ERASE_62, 2169 } 2170 }, 2171 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25F512B, 2172 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25F512B, 2173 .write = SPI_CHIP_WRITE256, 2174 .read = SPI_CHIP_READ, 2175 .voltage = {2700, 3600}, 2176 }, 2177 2178 { 2179 .vendor = "Atmel", 2180 .name = "AT25FS010", 2181 .bustype = BUS_SPI, 2182 .manufacture_id = ATMEL_ID, 2183 .model_id = ATMEL_AT25FS010, 2184 .total_size = 128, 2185 .page_size = 256, 2186 .feature_bits = FEATURE_WRSR_WREN, 2187 .tested = TEST_OK_PREW, 2188 .probe = PROBE_SPI_RDID, 2189 .probe_timing = TIMING_ZERO, 2190 .block_erasers = 2191 { 2192 { 2193 .eraseblocks = { {4 * 1024, 32} }, 2194 .block_erase = SPI_BLOCK_ERASE_20, 2195 }, { 2196 .eraseblocks = { {4 * 1024, 32} }, 2197 .block_erase = SPI_BLOCK_ERASE_D7, 2198 }, { 2199 .eraseblocks = { {32 * 1024, 4} }, 2200 .block_erase = SPI_BLOCK_ERASE_52, 2201 }, { 2202 .eraseblocks = { {32 * 1024, 4} }, 2203 .block_erase = SPI_BLOCK_ERASE_D8, 2204 }, { 2205 .eraseblocks = { {128 * 1024, 1} }, 2206 .block_erase = SPI_BLOCK_ERASE_60, 2207 }, { 2208 .eraseblocks = { {128 * 1024, 1} }, 2209 .block_erase = SPI_BLOCK_ERASE_C7, 2210 } 2211 }, 2212 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25FS010, 2213 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25FS010, 2214 .write = SPI_CHIP_WRITE256, 2215 .read = SPI_CHIP_READ, 2216 .voltage = {2700, 3600}, 2217 }, 2218 2219 { 2220 .vendor = "Atmel", 2221 .name = "AT25FS040", 2222 .bustype = BUS_SPI, 2223 .manufacture_id = ATMEL_ID, 2224 .model_id = ATMEL_AT25FS040, 2225 .total_size = 512, 2226 .page_size = 256, 2227 .feature_bits = FEATURE_WRSR_WREN, 2228 .tested = TEST_UNTESTED, 2229 .probe = PROBE_SPI_RDID, 2230 .probe_timing = TIMING_ZERO, 2231 .block_erasers = 2232 { 2233 { 2234 .eraseblocks = { {4 * 1024, 128} }, 2235 .block_erase = SPI_BLOCK_ERASE_20, 2236 }, { 2237 .eraseblocks = { {64 * 1024, 8} }, 2238 .block_erase = SPI_BLOCK_ERASE_52, 2239 }, { 2240 .eraseblocks = { {64 * 1024, 8} }, 2241 .block_erase = SPI_BLOCK_ERASE_D8, 2242 }, { 2243 .eraseblocks = { {512 * 1024, 1} }, 2244 .block_erase = SPI_BLOCK_ERASE_60, 2245 }, { 2246 .eraseblocks = { {512 * 1024, 1} }, 2247 .block_erase = SPI_BLOCK_ERASE_C7, 2248 } 2249 }, 2250 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25FS040, 2251 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25FS040, 2252 .write = SPI_CHIP_WRITE256, 2253 .read = SPI_CHIP_READ, 2254 .voltage = {2700, 3600}, 2255 }, 2256 2257 { 2258 .vendor = "Atmel", 2259 .name = "AT25SF041", 2260 .bustype = BUS_SPI, 2261 .manufacture_id = ATMEL_ID, 2262 .model_id = ATMEL_AT25SF041, 2263 .total_size = 512, 2264 .page_size = 256, 2265 .feature_bits = FEATURE_WRSR_WREN, 2266 .tested = TEST_OK_PREW, 2267 .probe = PROBE_SPI_RDID, 2268 .probe_timing = TIMING_ZERO, 2269 .block_erasers = 2270 { 2271 { 2272 .eraseblocks = { {4 * 1024, 128} }, 2273 .block_erase = SPI_BLOCK_ERASE_20, 2274 }, { 2275 .eraseblocks = { {32 * 1024, 16} }, 2276 .block_erase = SPI_BLOCK_ERASE_52, 2277 }, { 2278 .eraseblocks = { {64 * 1024, 8} }, 2279 .block_erase = SPI_BLOCK_ERASE_D8, 2280 }, { 2281 .eraseblocks = { {512 * 1024, 1} }, 2282 .block_erase = SPI_BLOCK_ERASE_60, 2283 }, { 2284 .eraseblocks = { {512 * 1024, 1} }, 2285 .block_erase = SPI_BLOCK_ERASE_C7, 2286 } 2287 }, 2288 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2289 .unlock = SPI_DISABLE_BLOCKPROTECT, 2290 .write = SPI_CHIP_WRITE256, 2291 .read = SPI_CHIP_READ, 2292 .voltage = {2500, 3600}, 2293 }, 2294 2295 { 2296 .vendor = "Atmel", 2297 .name = "AT25SF081", 2298 .bustype = BUS_SPI, 2299 .manufacture_id = ATMEL_ID, 2300 .model_id = ATMEL_AT25SF081, 2301 .total_size = 1024, 2302 .page_size = 256, 2303 .feature_bits = FEATURE_WRSR_WREN, 2304 .tested = TEST_OK_PREW, 2305 .probe = PROBE_SPI_RDID, 2306 .probe_timing = TIMING_ZERO, 2307 .block_erasers = 2308 { 2309 { 2310 .eraseblocks = { {4 * 1024, 256} }, 2311 .block_erase = SPI_BLOCK_ERASE_20, 2312 }, { 2313 .eraseblocks = { {32 * 1024, 32} }, 2314 .block_erase = SPI_BLOCK_ERASE_52, 2315 }, { 2316 .eraseblocks = { {64 * 1024, 16} }, 2317 .block_erase = SPI_BLOCK_ERASE_D8, 2318 }, { 2319 .eraseblocks = { {1024 * 1024, 1} }, 2320 .block_erase = SPI_BLOCK_ERASE_60, 2321 }, { 2322 .eraseblocks = { {1024 * 1024, 1} }, 2323 .block_erase = SPI_BLOCK_ERASE_C7, 2324 } 2325 }, 2326 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2327 .unlock = SPI_DISABLE_BLOCKPROTECT, 2328 .write = SPI_CHIP_WRITE256, 2329 .read = SPI_CHIP_READ, 2330 .voltage = {2300, 3600}, 2331 }, 2332 2333 { 2334 .vendor = "Atmel", 2335 .name = "AT25SF128A", 2336 .bustype = BUS_SPI, 2337 .manufacture_id = ATMEL_ID, 2338 .model_id = ATMEL_AT25SF128A, 2339 .total_size = 16384, 2340 .page_size = 256, 2341 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 2342 .tested = TEST_OK_PR, 2343 .probe = PROBE_SPI_RDID, 2344 .probe_timing = TIMING_ZERO, 2345 .block_erasers = 2346 { 2347 { 2348 .eraseblocks = { {4 * 1024, 4096} }, 2349 .block_erase = SPI_BLOCK_ERASE_20, 2350 }, { 2351 .eraseblocks = { {32 * 1024, 512} }, 2352 .block_erase = SPI_BLOCK_ERASE_52, 2353 }, { 2354 .eraseblocks = { {64 * 1024, 256} }, 2355 .block_erase = SPI_BLOCK_ERASE_D8, 2356 }, { 2357 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2358 .block_erase = SPI_BLOCK_ERASE_60, 2359 }, { 2360 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2361 .block_erase = SPI_BLOCK_ERASE_C7, 2362 } 2363 }, 2364 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 2365 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 2366 .write = SPI_CHIP_WRITE256, 2367 .read = SPI_CHIP_READ, 2368 .voltage = {1700, 2000}, 2369 }, 2370 2371 { 2372 .vendor = "Atmel", 2373 .name = "AT25SF161", 2374 .bustype = BUS_SPI, 2375 .manufacture_id = ATMEL_ID, 2376 .model_id = ATMEL_AT25SF161, 2377 .total_size = 2048, 2378 .page_size = 256, 2379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 2380 .tested = TEST_OK_PREW, 2381 .probe = PROBE_SPI_RDID, 2382 .probe_timing = TIMING_ZERO, 2383 .block_erasers = 2384 { 2385 { 2386 .eraseblocks = { {4 * 1024, 512} }, 2387 .block_erase = SPI_BLOCK_ERASE_20, 2388 }, { 2389 .eraseblocks = { {32 * 1024, 64} }, 2390 .block_erase = SPI_BLOCK_ERASE_52, 2391 }, { 2392 .eraseblocks = { {64 * 1024, 32} }, 2393 .block_erase = SPI_BLOCK_ERASE_D8, 2394 }, { 2395 .eraseblocks = { {2048 * 1024, 1} }, 2396 .block_erase = SPI_BLOCK_ERASE_60, 2397 }, { 2398 .eraseblocks = { {2048 * 1024, 1} }, 2399 .block_erase = SPI_BLOCK_ERASE_C7, 2400 } 2401 }, 2402 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2403 .unlock = SPI_DISABLE_BLOCKPROTECT, 2404 .write = SPI_CHIP_WRITE256, 2405 .read = SPI_CHIP_READ, 2406 .voltage = {2500, 3600}, 2407 }, 2408 2409 { 2410 .vendor = "Atmel", 2411 .name = "AT25SF321", 2412 .bustype = BUS_SPI, 2413 .manufacture_id = ATMEL_ID, 2414 .model_id = ATMEL_AT25SF321, 2415 .total_size = 4096, 2416 .page_size = 256, 2417 .feature_bits = FEATURE_WRSR_WREN, 2418 .tested = TEST_OK_PR, 2419 .probe = PROBE_SPI_RDID, 2420 .probe_timing = TIMING_ZERO, 2421 .block_erasers = 2422 { 2423 { 2424 .eraseblocks = { {4 * 1024, 1024} }, 2425 .block_erase = SPI_BLOCK_ERASE_20, 2426 }, { 2427 .eraseblocks = { {32 * 1024, 128} }, 2428 .block_erase = SPI_BLOCK_ERASE_52, 2429 }, { 2430 .eraseblocks = { {64 * 1024, 64} }, 2431 .block_erase = SPI_BLOCK_ERASE_D8, 2432 }, { 2433 .eraseblocks = { {4096 * 1024, 1} }, 2434 .block_erase = SPI_BLOCK_ERASE_60, 2435 }, { 2436 .eraseblocks = { {4096 * 1024, 1} }, 2437 .block_erase = SPI_BLOCK_ERASE_C7, 2438 } 2439 }, 2440 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2441 .unlock = SPI_DISABLE_BLOCKPROTECT, 2442 .write = SPI_CHIP_WRITE256, 2443 .read = SPI_CHIP_READ, 2444 .voltage = {2500, 3600}, 2445 }, 2446 2447 { 2448 .vendor = "Atmel", 2449 .name = "AT25SL128A", 2450 .bustype = BUS_SPI, 2451 .manufacture_id = ATMEL_ID, 2452 .model_id = ATMEL_AT25SL128A, 2453 .total_size = 16384, 2454 .page_size = 256, 2455 /* supports SFDP */ 2456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 2457 .tested = TEST_OK_PREW, 2458 .probe = PROBE_SPI_RDID, 2459 .probe_timing = TIMING_ZERO, 2460 .block_erasers = 2461 { 2462 { 2463 .eraseblocks = { {4 * 1024, 4096} }, 2464 .block_erase = SPI_BLOCK_ERASE_20, 2465 }, { 2466 .eraseblocks = { {32 * 1024, 512} }, 2467 .block_erase = SPI_BLOCK_ERASE_52, 2468 }, { 2469 .eraseblocks = { {64 * 1024, 256} }, 2470 .block_erase = SPI_BLOCK_ERASE_D8, 2471 }, { 2472 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2473 .block_erase = SPI_BLOCK_ERASE_60, 2474 }, { 2475 .eraseblocks = { {16 * 1024 * 1024, 1} }, 2476 .block_erase = SPI_BLOCK_ERASE_C7, 2477 } 2478 }, 2479 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 2480 .unlock = SPI_DISABLE_BLOCKPROTECT, 2481 .write = SPI_CHIP_WRITE256, 2482 .read = SPI_CHIP_READ, 2483 .voltage = {1700, 2000}, 2484 .reg_bits = 2485 { 2486 .srp = {STATUS1, 7, RW}, 2487 .srl = {STATUS2, 0, RW}, 2488 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 2489 .tb = {STATUS1, 5, RW}, 2490 .sec = {STATUS1, 6, RW}, 2491 .cmp = {STATUS2, 6, RW}, 2492 }, 2493 .decode_range = DECODE_RANGE_SPI25, 2494 }, 2495 2496 { 2497 .vendor = "Atmel", 2498 .name = "AT26DF041", 2499 .bustype = BUS_SPI, 2500 .manufacture_id = ATMEL_ID, 2501 .model_id = ATMEL_AT26DF041, 2502 .total_size = 512, 2503 .page_size = 256, 2504 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2505 .tested = TEST_OK_PREW, 2506 .probe = PROBE_SPI_RDID, 2507 .probe_timing = TIMING_ZERO, 2508 .block_erasers = 2509 { 2510 { 2511 .eraseblocks = { {256, 2048} }, 2512 .block_erase = SPI_BLOCK_ERASE_81, 2513 }, { 2514 .eraseblocks = { {2 * 1024, 256} }, 2515 .block_erase = SPI_BLOCK_ERASE_50, 2516 }, { 2517 .eraseblocks = { {4 * 1024, 128} }, 2518 .block_erase = SPI_BLOCK_ERASE_20, 2519 } 2520 }, 2521 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2522 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */ 2523 .write = SPI_CHIP_WRITE1, 2524 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 2525 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */ 2526 }, 2527 2528 { 2529 .vendor = "Atmel", 2530 .name = "AT26DF081A", 2531 .bustype = BUS_SPI, 2532 .manufacture_id = ATMEL_ID, 2533 .model_id = ATMEL_AT26DF081A, 2534 .total_size = 1024, 2535 .page_size = 256, 2536 .feature_bits = FEATURE_WRSR_WREN, 2537 .tested = TEST_OK_PREW, 2538 .probe = PROBE_SPI_RDID, 2539 .probe_timing = TIMING_ZERO, 2540 .block_erasers = 2541 { 2542 { 2543 .eraseblocks = { {4 * 1024, 256} }, 2544 .block_erase = SPI_BLOCK_ERASE_20, 2545 }, { 2546 .eraseblocks = { {32 * 1024, 32} }, 2547 .block_erase = SPI_BLOCK_ERASE_52, 2548 }, { 2549 .eraseblocks = { {64 * 1024, 16} }, 2550 .block_erase = SPI_BLOCK_ERASE_D8, 2551 }, { 2552 .eraseblocks = { {1024 * 1024, 1} }, 2553 .block_erase = SPI_BLOCK_ERASE_60, 2554 }, { 2555 .eraseblocks = { {1024 * 1024, 1} }, 2556 .block_erase = SPI_BLOCK_ERASE_C7, 2557 } 2558 }, 2559 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT26DF081A, 2560 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 2561 .write = SPI_CHIP_WRITE256, 2562 .read = SPI_CHIP_READ, 2563 .voltage = {2700, 3600}, 2564 }, 2565 2566 { 2567 .vendor = "Atmel", 2568 .name = "AT26DF161", 2569 .bustype = BUS_SPI, 2570 .manufacture_id = ATMEL_ID, 2571 .model_id = ATMEL_AT26DF161, 2572 .total_size = 2048, 2573 .page_size = 256, 2574 .feature_bits = FEATURE_WRSR_WREN, 2575 .tested = TEST_OK_PREW, 2576 .probe = PROBE_SPI_RDID, 2577 .probe_timing = TIMING_ZERO, 2578 .block_erasers = 2579 { 2580 { 2581 .eraseblocks = { {4 * 1024, 512} }, 2582 .block_erase = SPI_BLOCK_ERASE_20, 2583 }, { 2584 .eraseblocks = { {32 * 1024, 64} }, 2585 .block_erase = SPI_BLOCK_ERASE_52, 2586 }, { 2587 .eraseblocks = { {64 * 1024, 32} }, 2588 .block_erase = SPI_BLOCK_ERASE_D8, 2589 }, { 2590 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2591 .block_erase = SPI_BLOCK_ERASE_60, 2592 }, { 2593 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2594 .block_erase = SPI_BLOCK_ERASE_C7, 2595 } 2596 }, 2597 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT25DF, 2598 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 2599 .write = SPI_CHIP_WRITE256, 2600 .read = SPI_CHIP_READ, 2601 .voltage = {2700, 3600}, 2602 }, 2603 2604 { 2605 .vendor = "Atmel", 2606 .name = "AT26DF161A", 2607 .bustype = BUS_SPI, 2608 .manufacture_id = ATMEL_ID, 2609 .model_id = ATMEL_AT26DF161A, 2610 .total_size = 2048, 2611 .page_size = 256, 2612 .feature_bits = FEATURE_WRSR_WREN, 2613 .tested = TEST_OK_PREW, 2614 .probe = PROBE_SPI_RDID, 2615 .probe_timing = TIMING_ZERO, 2616 .block_erasers = 2617 { 2618 { 2619 .eraseblocks = { {4 * 1024, 512} }, 2620 .block_erase = SPI_BLOCK_ERASE_20, 2621 }, { 2622 .eraseblocks = { {32 * 1024, 64} }, 2623 .block_erase = SPI_BLOCK_ERASE_52, 2624 }, { 2625 .eraseblocks = { {64 * 1024, 32} }, 2626 .block_erase = SPI_BLOCK_ERASE_D8, 2627 }, { 2628 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2629 .block_erase = SPI_BLOCK_ERASE_60, 2630 }, { 2631 .eraseblocks = { {2 * 1024 * 1024, 1} }, 2632 .block_erase = SPI_BLOCK_ERASE_C7, 2633 } 2634 }, 2635 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT26DF081A, 2636 .unlock = SPI_DISABLE_BLOCKPROTECT_AT2X_GLOBAL_UNPROTECT, 2637 .write = SPI_CHIP_WRITE256, 2638 .read = SPI_CHIP_READ, 2639 .voltage = {2700, 3600}, 2640 }, 2641 2642 { 2643 .vendor = "Atmel", 2644 .name = "AT26F004", 2645 .bustype = BUS_SPI, 2646 .manufacture_id = ATMEL_ID, 2647 .model_id = ATMEL_AT26F004, 2648 .total_size = 512, 2649 .page_size = 256, 2650 .feature_bits = FEATURE_WRSR_WREN, 2651 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD, .wp = NA}, 2652 .probe = PROBE_SPI_RDID, 2653 .probe_timing = TIMING_ZERO, 2654 .block_erasers = 2655 { 2656 { 2657 .eraseblocks = { {4 * 1024, 128} }, 2658 .block_erase = SPI_BLOCK_ERASE_20, 2659 }, { 2660 .eraseblocks = { {32 * 1024, 16} }, 2661 .block_erase = SPI_BLOCK_ERASE_52, 2662 }, { 2663 .eraseblocks = { {64 * 1024, 8} }, 2664 .block_erase = SPI_BLOCK_ERASE_D8, 2665 }, { 2666 .eraseblocks = { {512 * 1024, 1} }, 2667 .block_erase = SPI_BLOCK_ERASE_60, 2668 }, { 2669 .eraseblocks = { {512 * 1024, 1} }, 2670 .block_erase = SPI_BLOCK_ERASE_C7, 2671 } 2672 }, 2673 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 2674 .write = 0, /* Incompatible Page write */ 2675 .read = SPI_CHIP_READ, 2676 .voltage = {2700, 3600}, 2677 }, 2678 2679 { 2680 .vendor = "Atmel", 2681 .name = "AT29C010A", 2682 .bustype = BUS_PARALLEL, 2683 .manufacture_id = ATMEL_ID, 2684 .model_id = ATMEL_AT29C010A, 2685 .total_size = 128, 2686 .page_size = 128, 2687 .feature_bits = FEATURE_LONG_RESET, 2688 .tested = TEST_OK_PREW, 2689 .probe = PROBE_JEDEC, 2690 .probe_timing = 10000, /* 10mS, Enter=Exec */ 2691 .block_erasers = 2692 { 2693 { 2694 .eraseblocks = { {128 * 1024, 1} }, 2695 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 2696 } 2697 }, 2698 .write = WRITE_JEDEC, /* FIXME */ 2699 .read = READ_MEMMAPPED, 2700 .voltage = {4500, 5500}, 2701 }, 2702 2703 { 2704 .vendor = "Atmel", 2705 .name = "AT29C020", 2706 .bustype = BUS_PARALLEL, 2707 .manufacture_id = ATMEL_ID, 2708 .model_id = ATMEL_AT29C020, 2709 .total_size = 256, 2710 .page_size = 256, 2711 .feature_bits = FEATURE_LONG_RESET, 2712 .tested = TEST_OK_PREW, 2713 .probe = PROBE_JEDEC, 2714 .probe_timing = 10000, /* 10ms */ 2715 .block_erasers = 2716 { 2717 { 2718 .eraseblocks = { {256 * 1024, 1} }, 2719 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 2720 } 2721 }, 2722 .write = WRITE_JEDEC, 2723 .read = READ_MEMMAPPED, 2724 .voltage = {4500, 5500}, 2725 }, 2726 2727 { 2728 .vendor = "Atmel", 2729 .name = "AT29C040A", 2730 .bustype = BUS_PARALLEL, 2731 .manufacture_id = ATMEL_ID, 2732 .model_id = ATMEL_AT29C040A, 2733 .total_size = 512, 2734 .page_size = 256, 2735 .feature_bits = FEATURE_LONG_RESET, 2736 .tested = TEST_UNTESTED, 2737 .probe = PROBE_JEDEC, 2738 .probe_timing = 10000, /* 10 ms */ 2739 .block_erasers = 2740 { 2741 { 2742 .eraseblocks = { {512 * 1024, 1} }, 2743 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 2744 } 2745 }, 2746 .write = WRITE_JEDEC, 2747 .read = READ_MEMMAPPED, 2748 .voltage = {4500, 5500}, 2749 }, 2750 2751 { 2752 .vendor = "Atmel", 2753 .name = "AT29C512", 2754 .bustype = BUS_PARALLEL, 2755 .manufacture_id = ATMEL_ID, 2756 .model_id = ATMEL_AT29C512, 2757 .total_size = 64, 2758 .page_size = 128, 2759 .feature_bits = FEATURE_LONG_RESET, 2760 .tested = TEST_OK_PREW, 2761 .probe = PROBE_JEDEC, 2762 .probe_timing = 10000, /* 10mS, Enter=Exec */ 2763 .block_erasers = 2764 { 2765 { 2766 .eraseblocks = { {64 * 1024, 1} }, 2767 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 2768 } 2769 }, 2770 .write = WRITE_JEDEC, 2771 .read = READ_MEMMAPPED, 2772 .voltage = {4500, 5500}, 2773 }, 2774 2775 { 2776 .vendor = "Atmel", 2777 .name = "AT45CS1282", 2778 .bustype = BUS_SPI, 2779 .manufacture_id = ATMEL_ID, 2780 .model_id = ATMEL_AT45CS1282, 2781 .total_size = 16896, /* No power of two sizes */ 2782 .page_size = 1056, /* No power of two sizes */ 2783 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2784 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ 2785 .feature_bits = FEATURE_OTP, 2786 .tested = TEST_UNTESTED, 2787 .probe = PROBE_SPI_RDID, 2788 .probe_timing = TIMING_ZERO, 2789 .block_erasers = 2790 { 2791 { 2792 .eraseblocks = { 2793 {8 * 1056, 1}, /* sector 0a: opcode 50h */ 2794 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */ 2795 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */ 2796 }, 2797 .block_erase = SPI_ERASE_AT45CS_SECTOR, 2798 } 2799 }, 2800 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 2801 .write = SPI_WRITE_AT45DB, 2802 .read = SPI_READ_AT45DB, 2803 .voltage = {2700, 3600}, 2804 .gran = WRITE_GRAN_1056BYTES, 2805 }, 2806 2807 { 2808 .vendor = "Atmel", 2809 .name = "AT45DB011D", 2810 .bustype = BUS_SPI, 2811 .manufacture_id = ATMEL_ID, 2812 .model_id = ATMEL_AT45DB011D, 2813 .total_size = 128, /* or 132, determined from status register */ 2814 .page_size = 256, /* or 264, determined from status register */ 2815 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2816 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2817 .feature_bits = FEATURE_OTP, 2818 .tested = TEST_OK_PREW, 2819 .probe = PROBE_SPI_AT45DB, 2820 .probe_timing = TIMING_ZERO, 2821 .block_erasers = 2822 { 2823 { 2824 .eraseblocks = { {256, 512} }, 2825 .block_erase = SPI_ERASE_AT45DB_PAGE, 2826 }, { 2827 .eraseblocks = { {8 * 256, 512/8} }, 2828 .block_erase = SPI_ERASE_AT45DB_BLOCK, 2829 }, { 2830 .eraseblocks = { 2831 {8 * 256, 1}, 2832 {120 * 256, 1}, 2833 {128 * 256, 3}, 2834 }, 2835 .block_erase = SPI_ERASE_AT45DB_SECTOR 2836 }, { 2837 .eraseblocks = { {128 * 1024, 1} }, 2838 .block_erase = SPI_ERASE_AT45DB_CHIP, 2839 } 2840 }, 2841 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 2842 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 2843 /* granularity will be set by the probing function. */ 2844 .write = SPI_WRITE_AT45DB, 2845 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 2846 .voltage = {2700, 3600}, 2847 }, 2848 2849 { 2850 .vendor = "Atmel", 2851 .name = "AT45DB021D", 2852 .bustype = BUS_SPI, 2853 .manufacture_id = ATMEL_ID, 2854 .model_id = ATMEL_AT45DB021D, 2855 .total_size = 256, /* or 264, determined from status register */ 2856 .page_size = 256, /* or 264, determined from status register */ 2857 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2858 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2859 .feature_bits = FEATURE_OTP, 2860 .tested = TEST_OK_PREW, 2861 .probe = PROBE_SPI_AT45DB, 2862 .probe_timing = TIMING_ZERO, 2863 .block_erasers = 2864 { 2865 { 2866 .eraseblocks = { {256, 1024} }, 2867 .block_erase = SPI_ERASE_AT45DB_PAGE, 2868 }, { 2869 .eraseblocks = { {8 * 256, 1024/8} }, 2870 .block_erase = SPI_ERASE_AT45DB_BLOCK, 2871 }, { 2872 .eraseblocks = { 2873 {8 * 256, 1}, 2874 {120 * 256, 1}, 2875 {128 * 256, 7}, 2876 }, 2877 .block_erase = SPI_ERASE_AT45DB_SECTOR 2878 }, { 2879 .eraseblocks = { {256 * 1024, 1} }, 2880 .block_erase = SPI_ERASE_AT45DB_CHIP, 2881 } 2882 }, 2883 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 2884 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 2885 /* granularity will be set by the probing function. */ 2886 .write = SPI_WRITE_AT45DB, 2887 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 2888 .voltage = {2700, 3600}, 2889 }, 2890 2891 { 2892 .vendor = "Atmel", 2893 .name = "AT45DB041D", 2894 .bustype = BUS_SPI, 2895 .manufacture_id = ATMEL_ID, 2896 .model_id = ATMEL_AT45DB041D, 2897 .total_size = 512, /* or 528, determined from status register */ 2898 .page_size = 256, /* or 264, determined from status register */ 2899 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2900 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2901 .feature_bits = FEATURE_OTP, 2902 .tested = TEST_OK_PREW, 2903 .probe = PROBE_SPI_AT45DB, 2904 .probe_timing = TIMING_ZERO, 2905 .block_erasers = 2906 { 2907 { 2908 .eraseblocks = { {256, 2048} }, 2909 .block_erase = SPI_ERASE_AT45DB_PAGE, 2910 }, { 2911 .eraseblocks = { {8 * 256, 2048/8} }, 2912 .block_erase = SPI_ERASE_AT45DB_BLOCK, 2913 }, { 2914 .eraseblocks = { 2915 {8 * 256, 1}, 2916 {248 * 256, 1}, 2917 {256 * 256, 7}, 2918 }, 2919 .block_erase = SPI_ERASE_AT45DB_SECTOR 2920 }, { 2921 .eraseblocks = { {512 * 1024, 1} }, 2922 .block_erase = SPI_ERASE_AT45DB_CHIP, 2923 } 2924 }, 2925 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 2926 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 2927 /* granularity will be set by the probing function. */ 2928 .write = SPI_WRITE_AT45DB, 2929 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 2930 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 2931 }, 2932 2933 { 2934 .vendor = "Atmel", 2935 .name = "AT45DB081D", 2936 .bustype = BUS_SPI, 2937 .manufacture_id = ATMEL_ID, 2938 .model_id = ATMEL_AT45DB081D, 2939 .total_size = 1024, /* or 1056, determined from status register */ 2940 .page_size = 256, /* or 264, determined from status register */ 2941 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2942 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2943 .feature_bits = FEATURE_OTP, 2944 .tested = TEST_OK_PREW, 2945 .probe = PROBE_SPI_AT45DB, 2946 .probe_timing = TIMING_ZERO, 2947 .block_erasers = 2948 { 2949 { 2950 .eraseblocks = { {256, 4096} }, 2951 .block_erase = SPI_ERASE_AT45DB_PAGE, 2952 }, { 2953 .eraseblocks = { {8 * 256, 4096/8} }, 2954 .block_erase = SPI_ERASE_AT45DB_BLOCK, 2955 }, { 2956 .eraseblocks = { 2957 {8 * 256, 1}, 2958 {248 * 256, 1}, 2959 {256 * 256, 15}, 2960 }, 2961 .block_erase = SPI_ERASE_AT45DB_SECTOR 2962 }, { 2963 .eraseblocks = { {1024 * 1024, 1} }, 2964 .block_erase = SPI_ERASE_AT45DB_CHIP, 2965 } 2966 }, 2967 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 2968 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 2969 /* granularity will be set by the probing function. */ 2970 .write = SPI_WRITE_AT45DB, 2971 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 2972 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 2973 }, 2974 2975 { 2976 .vendor = "Atmel", 2977 .name = "AT45DB161D", 2978 .bustype = BUS_SPI, 2979 .manufacture_id = ATMEL_ID, 2980 .model_id = ATMEL_AT45DB161D, 2981 .total_size = 2048, /* or 2112, determined from status register */ 2982 .page_size = 512, /* or 528, determined from status register */ 2983 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 2984 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 2985 .feature_bits = FEATURE_OTP, 2986 .tested = TEST_OK_PREW, 2987 .probe = PROBE_SPI_AT45DB, 2988 .probe_timing = TIMING_ZERO, 2989 .block_erasers = 2990 { 2991 { 2992 .eraseblocks = { {512, 4096} }, 2993 .block_erase = SPI_ERASE_AT45DB_PAGE, 2994 }, { 2995 .eraseblocks = { {8 * 512, 4096/8} }, 2996 .block_erase = SPI_ERASE_AT45DB_BLOCK, 2997 }, { 2998 .eraseblocks = { 2999 {8 * 512, 1}, 3000 {248 * 512, 1}, 3001 {256 * 512, 15}, 3002 }, 3003 .block_erase = SPI_ERASE_AT45DB_SECTOR 3004 }, { 3005 .eraseblocks = { {2048 * 1024, 1} }, 3006 .block_erase = SPI_ERASE_AT45DB_CHIP, 3007 } 3008 }, 3009 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 3010 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 3011 /* granularity will be set by the probing function. */ 3012 .write = SPI_WRITE_AT45DB, 3013 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 3014 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 3015 }, 3016 3017 { 3018 .vendor = "Atmel", 3019 .name = "AT45DB321C", 3020 .bustype = BUS_SPI, 3021 .manufacture_id = ATMEL_ID, 3022 .model_id = ATMEL_AT45DB321C, 3023 .total_size = 4224, /* No power of two sizes */ 3024 .page_size = 528, /* No power of two sizes */ 3025 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3026 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */ 3027 .feature_bits = FEATURE_OTP, 3028 .tested = TEST_UNTESTED, 3029 .probe = PROBE_SPI_RDID, 3030 .probe_timing = TIMING_ZERO, 3031 .block_erasers = 3032 { 3033 { 3034 .eraseblocks = { {528, 8192} }, 3035 .block_erase = SPI_ERASE_AT45DB_PAGE, 3036 }, { 3037 .eraseblocks = { {8 * 528, 8192/8} }, 3038 .block_erase = SPI_ERASE_AT45DB_BLOCK, 3039 }, /* Although the datasheets describes sectors (which can be write protected) 3040 * there seems to be no erase functions for them. 3041 { 3042 .eraseblocks = { 3043 {8 * 528, 1}, 3044 {120 * 528, 1}, 3045 {128 * 528, 63}, 3046 }, 3047 .block_erase = SPI_ERASE_AT45DB_SECTOR 3048 }, */ { 3049 .eraseblocks = { {4224 * 1024, 1} }, 3050 .block_erase = SPI_ERASE_AT45DB_CHIP, 3051 } 3052 }, 3053 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, /* Bit 0 is undefined, no lockdown */ 3054 .write = SPI_WRITE_AT45DB, 3055 .read = SPI_READ_AT45DB_E8, /* 3 address and 4 dummy bytes */ 3056 .voltage = {2700, 3600}, 3057 .gran = WRITE_GRAN_528BYTES, 3058 }, 3059 3060 { 3061 .vendor = "Atmel", 3062 .name = "AT45DB321D", 3063 .bustype = BUS_SPI, 3064 .manufacture_id = ATMEL_ID, 3065 .model_id = ATMEL_AT45DB321D, 3066 .total_size = 4096, /* or 4224, determined from status register */ 3067 .page_size = 512, /* or 528, determined from status register */ 3068 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3069 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 3070 .feature_bits = FEATURE_OTP, 3071 .tested = TEST_OK_PREW, 3072 .probe = PROBE_SPI_AT45DB, 3073 .probe_timing = TIMING_ZERO, 3074 .block_erasers = 3075 { 3076 { 3077 .eraseblocks = { {512, 8192} }, 3078 .block_erase = SPI_ERASE_AT45DB_PAGE, 3079 }, { 3080 .eraseblocks = { {8 * 512, 8192/8} }, 3081 .block_erase = SPI_ERASE_AT45DB_BLOCK, 3082 }, { 3083 .eraseblocks = { 3084 {8 * 512, 1}, 3085 {120 * 512, 1}, 3086 {128 * 512, 63}, 3087 }, 3088 .block_erase = SPI_ERASE_AT45DB_SECTOR 3089 }, { 3090 .eraseblocks = { {4096 * 1024, 1} }, 3091 .block_erase = SPI_ERASE_AT45DB_CHIP, 3092 } 3093 }, 3094 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 3095 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 3096 /* granularity will be set by the probing function. */ 3097 .write = SPI_WRITE_AT45DB, 3098 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 3099 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */ 3100 }, 3101 3102 { 3103 .vendor = "Atmel", 3104 .name = "AT45DB321E", 3105 .bustype = BUS_SPI, 3106 .manufacture_id = ATMEL_ID, 3107 .model_id = ATMEL_AT45DB321C, 3108 .total_size = 4096, /* or 4224, determined from status register */ 3109 .page_size = 512, /* or 528, determined from status register */ 3110 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3111 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 3112 .feature_bits = FEATURE_OTP, 3113 .tested = TEST_UNTESTED, 3114 .probe = PROBE_SPI_AT45DB, 3115 .probe_timing = TIMING_ZERO, 3116 .block_erasers = 3117 { 3118 { 3119 .eraseblocks = { {512, 8192} }, 3120 .block_erase = SPI_ERASE_AT45DB_PAGE, 3121 }, { 3122 .eraseblocks = { {8 * 512, 8192/8} }, 3123 .block_erase = SPI_ERASE_AT45DB_BLOCK, 3124 }, { 3125 .eraseblocks = { 3126 {8 * 512, 1}, 3127 {120 * 512, 1}, 3128 {128 * 512, 63}, 3129 }, 3130 .block_erase = SPI_ERASE_AT45DB_SECTOR 3131 }, { 3132 .eraseblocks = { {4096 * 1024, 1} }, 3133 .block_erase = SPI_ERASE_AT45DB_CHIP, 3134 } 3135 }, 3136 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, /* has a 2nd status register */ 3137 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 3138 /* granularity will be set by the probing function. */ 3139 .write = SPI_WRITE_AT45DB, 3140 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 3141 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */ 3142 }, 3143 3144 { 3145 .vendor = "Atmel", 3146 .name = "AT45DB642D", 3147 .bustype = BUS_SPI, 3148 .manufacture_id = ATMEL_ID, 3149 .model_id = ATMEL_AT45DB642D, 3150 .total_size = 8192, /* or 8448, determined from status register */ 3151 .page_size = 1024, /* or 1056, determined from status register */ 3152 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */ 3153 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */ 3154 .feature_bits = FEATURE_OTP, 3155 .tested = TEST_OK_PREW, 3156 .probe = PROBE_SPI_AT45DB, 3157 .probe_timing = TIMING_ZERO, 3158 .block_erasers = 3159 { 3160 { 3161 .eraseblocks = { {1024, 8192} }, 3162 .block_erase = SPI_ERASE_AT45DB_PAGE, 3163 }, { 3164 .eraseblocks = { {8 * 1024, 8192/8} }, 3165 .block_erase = SPI_ERASE_AT45DB_BLOCK, 3166 }, { 3167 .eraseblocks = { 3168 {8 * 1024, 1}, 3169 {248 * 1024, 1}, 3170 {256 * 1024, 31}, 3171 }, 3172 .block_erase = SPI_ERASE_AT45DB_SECTOR 3173 }, { 3174 .eraseblocks = { {8192 * 1024, 1} }, 3175 .block_erase = SPI_ERASE_AT45DB_CHIP, 3176 } 3177 }, 3178 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_AT45DB, 3179 .unlock = SPI_DISABLE_BLOCKPROTECT_AT45DB, /* Impossible if locked down or #WP is low */ 3180 /* granularity will be set by the probing function. */ 3181 .write = SPI_WRITE_AT45DB, 3182 .read = SPI_READ_AT45DB, /* Fast read (0x0B) supported */ 3183 .voltage = {2700, 3600}, 3184 }, 3185 3186 { 3187 .vendor = "Atmel", 3188 .name = "AT49(H)F010", 3189 .bustype = BUS_PARALLEL, 3190 .manufacture_id = ATMEL_ID, 3191 .model_id = ATMEL_AT49F010, 3192 .total_size = 128, 3193 .page_size = 0, /* unused */ 3194 .feature_bits = FEATURE_EITHER_RESET, 3195 .tested = TEST_OK_PREW, 3196 .probe = PROBE_JEDEC, 3197 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3198 .block_erasers = 3199 { 3200 { 3201 .eraseblocks = { {128 * 1024, 1} }, 3202 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3203 } 3204 }, 3205 .printlock = PRINTLOCK_AT49F, 3206 .write = WRITE_JEDEC1, 3207 .read = READ_MEMMAPPED, 3208 .voltage = {4500, 5500}, 3209 }, 3210 3211 { 3212 .vendor = "Atmel", 3213 .name = "AT49BV512", 3214 .bustype = BUS_PARALLEL, 3215 .manufacture_id = ATMEL_ID, 3216 .model_id = ATMEL_AT49BV512, 3217 .total_size = 64, 3218 .page_size = 64, 3219 .feature_bits = FEATURE_EITHER_RESET, 3220 .tested = TEST_OK_PREW, 3221 .probe = PROBE_JEDEC, 3222 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3223 .block_erasers = 3224 { 3225 { 3226 .eraseblocks = { {64 * 1024, 1} }, 3227 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3228 } 3229 }, 3230 .write = WRITE_JEDEC1, 3231 .read = READ_MEMMAPPED, 3232 .voltage = {2700, 3600}, 3233 }, 3234 3235 { 3236 .vendor = "Atmel", 3237 .name = "AT49F002(N)", 3238 .bustype = BUS_PARALLEL, 3239 .manufacture_id = ATMEL_ID, 3240 .model_id = ATMEL_AT49F002N, 3241 .total_size = 256, 3242 .page_size = 256, 3243 .feature_bits = FEATURE_EITHER_RESET, 3244 .tested = TEST_UNTESTED, 3245 .probe = PROBE_JEDEC, 3246 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3247 .block_erasers = 3248 { 3249 { 3250 .eraseblocks = { 3251 {16 * 1024, 1}, 3252 {8 * 1024, 2}, 3253 {96 * 1024, 1}, 3254 {128 * 1024, 1}, 3255 }, 3256 .block_erase = JEDEC_SECTOR_ERASE, 3257 }, { 3258 .eraseblocks = { {256 * 1024, 1} }, 3259 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3260 } 3261 }, 3262 .write = WRITE_JEDEC1, 3263 .read = READ_MEMMAPPED, 3264 .voltage = {4500, 5500}, 3265 }, 3266 3267 { 3268 .vendor = "Atmel", 3269 .name = "AT49F002(N)T", 3270 .bustype = BUS_PARALLEL, 3271 .manufacture_id = ATMEL_ID, 3272 .model_id = ATMEL_AT49F002NT, 3273 .total_size = 256, 3274 .page_size = 256, 3275 .feature_bits = FEATURE_EITHER_RESET, 3276 .tested = TEST_OK_PR, 3277 .probe = PROBE_JEDEC, 3278 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3279 .block_erasers = 3280 { 3281 { 3282 .eraseblocks = { 3283 {128 * 1024, 1}, 3284 {96 * 1024, 1}, 3285 {8 * 1024, 2}, 3286 {16 * 1024, 1}, 3287 }, 3288 .block_erase = JEDEC_SECTOR_ERASE, 3289 }, { 3290 .eraseblocks = { {256 * 1024, 1} }, 3291 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3292 } 3293 }, 3294 .write = WRITE_JEDEC1, 3295 .read = READ_MEMMAPPED, 3296 .voltage = {4500, 5500}, 3297 }, 3298 3299 { 3300 .vendor = "Atmel", 3301 .name = "AT49F020", 3302 .bustype = BUS_PARALLEL, 3303 .manufacture_id = ATMEL_ID, 3304 .model_id = ATMEL_AT49F020, 3305 .total_size = 256, 3306 .page_size = 0, /* unused */ 3307 .feature_bits = FEATURE_EITHER_RESET, 3308 .tested = TEST_OK_PRE, 3309 .probe = PROBE_JEDEC, 3310 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3311 .block_erasers = 3312 { 3313 { 3314 .eraseblocks = { {256 * 1024, 1} }, 3315 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3316 } 3317 /* Chip features an optional permanent write protection 3318 * of the first 8 kB. The erase function is the same as 3319 * above, but 00000H to 01FFFH will not be erased. 3320 * FIXME: add another eraser when partial erasers are 3321 * supported. 3322 */ 3323 }, 3324 .printlock = PRINTLOCK_AT49F, 3325 .write = WRITE_JEDEC1, 3326 .read = READ_MEMMAPPED, 3327 .voltage = {4500, 5500}, 3328 }, 3329 3330 { 3331 .vendor = "Atmel", 3332 .name = "AT49F040", 3333 .bustype = BUS_PARALLEL, 3334 .manufacture_id = ATMEL_ID, 3335 .model_id = ATMEL_AT49F040, 3336 .total_size = 512, 3337 .page_size = 0, /* unused */ 3338 .feature_bits = FEATURE_EITHER_RESET, 3339 .tested = TEST_UNTESTED, 3340 .probe = PROBE_JEDEC, 3341 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3342 .block_erasers = 3343 { 3344 { 3345 .eraseblocks = { {512 * 1024, 1} }, 3346 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3347 } 3348 /* Chip features an optional permanent write protection 3349 * of the first 16 kB. The erase function is the same as 3350 * above, but 00000H to 03FFFH will not be erased. 3351 * FIXME: add another eraser when partial erasers are 3352 * supported. 3353 */ 3354 }, 3355 .printlock = PRINTLOCK_AT49F, 3356 .write = WRITE_JEDEC1, 3357 .read = READ_MEMMAPPED, 3358 .voltage = {4500, 5500}, 3359 }, 3360 3361 { 3362 .vendor = "Atmel", 3363 .name = "AT49F080", 3364 .bustype = BUS_PARALLEL, 3365 .manufacture_id = ATMEL_ID, 3366 .model_id = ATMEL_AT49F080, 3367 .total_size = 1024, 3368 .page_size = 0, /* unused */ 3369 .feature_bits = FEATURE_EITHER_RESET, 3370 .tested = TEST_UNTESTED, 3371 .probe = PROBE_JEDEC, 3372 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3373 .block_erasers = 3374 { 3375 { 3376 .eraseblocks = { {1024 * 1024, 1} }, 3377 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3378 } 3379 /* Chip features an optional permanent write protection 3380 * of the first 16 kB. The erase function is the same as 3381 * above, but 00000H to 03FFFH will not be erased. 3382 * FIXME: add another eraser when partial erasers are 3383 * supported. 3384 */ 3385 }, 3386 .printlock = PRINTLOCK_AT49F, 3387 .write = WRITE_JEDEC1, 3388 .read = READ_MEMMAPPED, 3389 .voltage = {4500, 5500}, 3390 }, 3391 3392 { 3393 /* 'top' version of AT49F080. equal in all aspects but the boot block address */ 3394 .vendor = "Atmel", 3395 .name = "AT49F080T", 3396 .bustype = BUS_PARALLEL, 3397 .manufacture_id = ATMEL_ID, 3398 .model_id = ATMEL_AT49F080T, 3399 .total_size = 1024, 3400 .page_size = 0, /* unused */ 3401 .feature_bits = FEATURE_EITHER_RESET, 3402 .tested = TEST_UNTESTED, 3403 .probe = PROBE_JEDEC, 3404 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3405 .block_erasers = 3406 { 3407 { 3408 .eraseblocks = { {1024 * 1024, 1} }, 3409 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3410 } 3411 /* Chip features an optional permanent write protection 3412 * of the first 16 kB. The erase function is the same as 3413 * above, but FC000H to FFFFFH will not be erased. 3414 * FIXME: add another eraser when partial erasers are 3415 * supported. 3416 */ 3417 }, 3418 .printlock = PRINTLOCK_AT49F, 3419 .write = WRITE_JEDEC1, 3420 .read = READ_MEMMAPPED, 3421 .voltage = {4500, 5500}, 3422 }, 3423 3424 { 3425 .vendor = "Atmel", 3426 .name = "AT49LH002", 3427 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3428 .manufacture_id = ATMEL_ID, 3429 .model_id = ATMEL_AT49LH002, 3430 .total_size = 256, 3431 .page_size = 0, /* unused */ 3432 .feature_bits = FEATURE_REGISTERMAP, 3433 .tested = TEST_UNTESTED, 3434 .probe = PROBE_AT82802AB, 3435 .probe_timing = TIMING_ZERO, 3436 .block_erasers = 3437 { 3438 { 3439 .eraseblocks = { 3440 {64 * 1024, 3}, 3441 {32 * 1024, 1}, 3442 {8 * 1024, 2}, 3443 {16 * 1024, 1}, 3444 }, 3445 .block_erase = NO_BLOCK_ERASE_FUNC, /* TODO: Implement. */ 3446 }, { 3447 .eraseblocks = { 3448 {64 * 1024, 4}, 3449 }, 3450 .block_erase = ERASE_BLOCK_82802AB, 3451 }, 3452 }, 3453 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 3454 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 3455 .write = WRITE_82802AB, 3456 .read = READ_MEMMAPPED, 3457 .voltage = {3000, 3600}, 3458 }, 3459 3460 { 3461 .vendor = "Atmel", 3462 .name = "AT49LH004", 3463 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3464 .manufacture_id = ATMEL_ID, 3465 .model_id = ATMEL_AT49LH004, 3466 .total_size = 512, 3467 .page_size = 0, /* unused */ 3468 .feature_bits = FEATURE_REGISTERMAP, 3469 .tested = TEST_UNTESTED, 3470 .probe = PROBE_AT82802AB, 3471 .probe_timing = TIMING_ZERO, 3472 .block_erasers = 3473 { 3474 { 3475 .eraseblocks = { 3476 {64 * 1024, 7}, 3477 {32 * 1024, 1}, 3478 {8 * 1024, 2}, 3479 {16 * 1024, 1}, 3480 }, 3481 .block_erase = ERASE_BLOCK_82802AB, 3482 }, { 3483 .eraseblocks = { 3484 {64 * 1024, 8}, 3485 }, 3486 .block_erase = NO_BLOCK_ERASE_FUNC, /* TODO: Implement. */ 3487 }, 3488 }, 3489 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 3490 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 3491 .write = WRITE_82802AB, 3492 .read = READ_MEMMAPPED, 3493 .voltage = {3000, 3600}, 3494 }, 3495 3496 { 3497 .vendor = "Atmel", 3498 .name = "AT49LH00B4", 3499 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 3500 .manufacture_id = ATMEL_ID, 3501 .model_id = ATMEL_AT49LH00B4, 3502 .total_size = 512, 3503 .page_size = 0, /* unused */ 3504 .feature_bits = FEATURE_REGISTERMAP, 3505 .tested = TEST_UNTESTED, 3506 .probe = PROBE_AT82802AB, 3507 .probe_timing = TIMING_ZERO, 3508 .block_erasers = 3509 { 3510 { 3511 .eraseblocks = { 3512 {8 * 1024, 2}, 3513 {16 * 1024, 1}, 3514 {32 * 1024, 1}, 3515 {64 * 1024, 7}, 3516 }, 3517 .block_erase = NO_BLOCK_ERASE_FUNC, /* TODO: Implement. */ 3518 }, { 3519 .eraseblocks = { 3520 {64 * 1024, 8}, 3521 }, 3522 .block_erase = ERASE_BLOCK_82802AB, 3523 }, 3524 }, 3525 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 3526 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 3527 .write = WRITE_82802AB, 3528 .read = READ_MEMMAPPED, 3529 .voltage = {3000, 3600}, 3530 }, 3531 3532 { 3533 .vendor = "Boya/BoHong Microelectronics", 3534 .name = "B.25D16A", 3535 .bustype = BUS_SPI, 3536 .manufacture_id = BOYA_BOHONG_ID, 3537 .model_id = BOYA_BOHONG_B_25D16A, 3538 .total_size = 2048, 3539 .page_size = 256, 3540 .feature_bits = FEATURE_WRSR_WREN, 3541 .tested = TEST_OK_PR, 3542 .probe = PROBE_SPI_RDID, 3543 .probe_timing = TIMING_ZERO, 3544 .block_erasers = 3545 { 3546 { 3547 .eraseblocks = { {4 * 1024, 512} }, 3548 .block_erase = SPI_BLOCK_ERASE_20, 3549 }, { 3550 .eraseblocks = { {32 * 1024, 64} }, 3551 .block_erase = SPI_BLOCK_ERASE_52, 3552 }, { 3553 .eraseblocks = { {64 * 1024, 32} }, 3554 .block_erase = SPI_BLOCK_ERASE_D8, 3555 }, { 3556 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3557 .block_erase = SPI_BLOCK_ERASE_60, 3558 }, { 3559 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3560 .block_erase = SPI_BLOCK_ERASE_C7, 3561 } 3562 }, 3563 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 3564 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 3565 .write = SPI_CHIP_WRITE256, 3566 .read = SPI_CHIP_READ, 3567 .voltage = {2700, 3600}, 3568 }, 3569 3570 { 3571 .vendor = "Boya/BoHong Microelectronics", 3572 .name = "B.25D80A", 3573 .bustype = BUS_SPI, 3574 .manufacture_id = BOYA_BOHONG_ID, 3575 .model_id = BOYA_BOHONG_B__25D80A, 3576 .total_size = 1024, 3577 .page_size = 256, 3578 .feature_bits = FEATURE_WRSR_WREN, 3579 .tested = TEST_OK_PR, 3580 .probe = PROBE_SPI_RDID, 3581 .probe_timing = TIMING_ZERO, 3582 .block_erasers = 3583 { 3584 { 3585 .eraseblocks = { {4 * 1024, 256} }, 3586 .block_erase = SPI_BLOCK_ERASE_20, 3587 }, { 3588 .eraseblocks = { {32 * 1024, 32} }, 3589 .block_erase = SPI_BLOCK_ERASE_52, 3590 }, { 3591 .eraseblocks = { {64 * 1024, 16} }, 3592 .block_erase = SPI_BLOCK_ERASE_D8, 3593 }, { 3594 .eraseblocks = { {1 * 1024 * 1024, 1} }, 3595 .block_erase = SPI_BLOCK_ERASE_60, 3596 }, { 3597 .eraseblocks = { {1 * 1024 * 1024, 1} }, 3598 .block_erase = SPI_BLOCK_ERASE_C7, 3599 } 3600 }, 3601 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 3602 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 3603 .write = SPI_CHIP_WRITE256, 3604 .read = SPI_CHIP_READ, 3605 .voltage = {2700, 3600}, 3606 }, 3607 3608 { 3609 .vendor = "Boya/BoHong Microelectronics", 3610 .name = "B.25Q64AS", 3611 .bustype = BUS_SPI, 3612 .manufacture_id = BOYA_BOHONG_ID, 3613 .model_id = BOYA_BOHONG_B_25Q64AS, 3614 .total_size = 8192, 3615 .page_size = 256, 3616 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 3617 .tested = TEST_OK_PREW, 3618 .probe = PROBE_SPI_RDID, 3619 .probe_timing = TIMING_ZERO, 3620 .block_erasers = 3621 { 3622 { 3623 .eraseblocks = { {4 * 1024, 2048} }, 3624 .block_erase = SPI_BLOCK_ERASE_20, 3625 }, { 3626 .eraseblocks = { {32 * 1024, 256} }, 3627 .block_erase = SPI_BLOCK_ERASE_52, 3628 }, { 3629 .eraseblocks = { {64 * 1024, 128} }, 3630 .block_erase = SPI_BLOCK_ERASE_D8, 3631 }, { 3632 .eraseblocks = { {16 * 512 * 1024, 1} }, 3633 .block_erase = SPI_BLOCK_ERASE_60, 3634 }, { 3635 .eraseblocks = { {16 * 512 * 1024, 1} }, 3636 .block_erase = SPI_BLOCK_ERASE_C7, 3637 } 3638 }, 3639 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 3640 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 3641 .write = SPI_CHIP_WRITE256, 3642 .read = SPI_CHIP_READ, 3643 .voltage = {2700, 3600}, 3644 }, 3645 3646 { 3647 .vendor = "Boya/BoHong Microelectronics", 3648 .name = "B.25Q128AS", 3649 .bustype = BUS_SPI, 3650 .manufacture_id = BOYA_BOHONG_ID, 3651 .model_id = BOYA_BOHONG_B_25Q128AS, 3652 .total_size = 16384, 3653 .page_size = 256, 3654 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 3655 .tested = TEST_OK_PREW, 3656 .probe = PROBE_SPI_RDID, 3657 .probe_timing = TIMING_ZERO, 3658 .block_erasers = 3659 { 3660 { 3661 .eraseblocks = { {4 * 1024, 4096} }, 3662 .block_erase = SPI_BLOCK_ERASE_20, 3663 }, { 3664 .eraseblocks = { {32 * 1024, 512} }, 3665 .block_erase = SPI_BLOCK_ERASE_52, 3666 }, { 3667 .eraseblocks = { {64 * 1024, 256} }, 3668 .block_erase = SPI_BLOCK_ERASE_D8, 3669 }, { 3670 .eraseblocks = { {16 * 1024 * 1024, 1} }, 3671 .block_erase = SPI_BLOCK_ERASE_60, 3672 }, { 3673 .eraseblocks = { {16 * 1024 * 1024, 1} }, 3674 .block_erase = SPI_BLOCK_ERASE_C7, 3675 } 3676 }, 3677 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 3678 .unlock = SPI_DISABLE_BLOCKPROTECT_AT25FS040, 3679 .write = SPI_CHIP_WRITE256, 3680 .read = SPI_CHIP_READ, 3681 .voltage = {2700, 3600}, 3682 }, 3683 3684 { 3685 .vendor = "Bright", 3686 .name = "BM29F040", 3687 .bustype = BUS_PARALLEL, 3688 .manufacture_id = BRIGHT_ID, 3689 .model_id = BRIGHT_BM29F040, 3690 .total_size = 512, 3691 .page_size = 64 * 1024, 3692 .feature_bits = FEATURE_EITHER_RESET, 3693 .tested = TEST_OK_PR, 3694 .probe = PROBE_JEDEC, 3695 .probe_timing = TIMING_ZERO, 3696 .block_erasers = 3697 { 3698 { 3699 .eraseblocks = { {64 * 1024, 8} }, 3700 .block_erase = JEDEC_SECTOR_ERASE, 3701 }, { 3702 .eraseblocks = { {512 * 1024, 1} }, 3703 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3704 }, 3705 }, 3706 .write = WRITE_JEDEC1, 3707 .read = READ_MEMMAPPED, 3708 .voltage = {4500, 5500}, 3709 }, 3710 3711 { 3712 .vendor = "Catalyst", 3713 .name = "CAT28F512", 3714 .bustype = BUS_PARALLEL, 3715 .manufacture_id = CATALYST_ID, 3716 .model_id = CATALYST_CAT28F512, 3717 .total_size = 64, 3718 .page_size = 0, /* unused */ 3719 .feature_bits = 0, 3720 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD, .wp = NA}, 3721 .probe = PROBE_JEDEC, /* FIXME! */ 3722 .probe_timing = TIMING_ZERO, 3723 .block_erasers = 3724 { 3725 { 3726 .eraseblocks = { {64 * 1024, 1} }, 3727 .block_erase = NO_BLOCK_ERASE_FUNC, /* TODO */ 3728 }, 3729 }, 3730 .write = 0, /* TODO */ 3731 .read = READ_MEMMAPPED, 3732 .voltage = {4500, 5500}, 3733 }, 3734 3735 { 3736 .vendor = "ENE", 3737 .name = "KB9012 (EDI)", 3738 .bustype = BUS_SPI, 3739 .total_size = 128, 3740 .page_size = 128, 3741 .feature_bits = FEATURE_ERASED_ZERO, 3742 .tested = TEST_OK_PREW, 3743 .spi_cmd_set = SPI_EDI, 3744 .probe = PROBE_EDI_KB9012, 3745 .probe_timing = TIMING_ZERO, 3746 .block_erasers = 3747 { 3748 { 3749 .eraseblocks = { {128, 1024} }, 3750 .block_erase = EDI_CHIP_BLOCK_ERASE, 3751 }, 3752 }, 3753 .write = EDI_CHIP_WRITE, 3754 .read = EDI_CHIP_READ, 3755 .voltage = {2700, 3600}, 3756 .gran = WRITE_GRAN_128BYTES, 3757 }, 3758 3759 { 3760 .vendor = "ESI", 3761 .name = "ES25P16", 3762 .bustype = BUS_SPI, 3763 .manufacture_id = EXCEL_ID_NOPREFIX, 3764 .model_id = EXCEL_ES25P16, 3765 .total_size = 2 * 1024, 3766 .page_size = 256, 3767 /* 256-byte parameter page separate from memory array: 3768 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3769 .feature_bits = FEATURE_WRSR_WREN, 3770 .tested = TEST_UNTESTED, 3771 .probe = PROBE_SPI_RDID, 3772 .probe_timing = TIMING_ZERO, 3773 .block_erasers = 3774 { 3775 { 3776 .eraseblocks = { {64 * 1024, 32} }, 3777 .block_erase = SPI_BLOCK_ERASE_D8, 3778 }, { 3779 .eraseblocks = { {2 * 1024 * 1024, 1} }, 3780 .block_erase = SPI_BLOCK_ERASE_C7, 3781 } 3782 }, 3783 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 3784 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 3785 .write = SPI_CHIP_WRITE256, 3786 .read = SPI_CHIP_READ, /* Fast Read (0x0B) supported */ 3787 .voltage = {2700, 3600}, 3788 }, 3789 3790 { 3791 .vendor = "ESI", 3792 .name = "ES25P40", 3793 .bustype = BUS_SPI, 3794 .manufacture_id = EXCEL_ID_NOPREFIX, 3795 .model_id = EXCEL_ES25P40, 3796 .total_size = 512, 3797 .page_size = 256, 3798 /* 256-byte parameter page separate from memory array: 3799 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3800 .feature_bits = FEATURE_WRSR_WREN, 3801 .tested = TEST_UNTESTED, 3802 .probe = PROBE_SPI_RDID, 3803 .probe_timing = TIMING_ZERO, 3804 .block_erasers = 3805 { 3806 { 3807 .eraseblocks = { {64 * 1024, 8} }, 3808 .block_erase = SPI_BLOCK_ERASE_D8, 3809 }, { 3810 .eraseblocks = { {512 * 1024, 1} }, 3811 .block_erase = SPI_BLOCK_ERASE_C7, 3812 } 3813 }, 3814 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 3815 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 3816 .write = SPI_CHIP_WRITE256, 3817 .read = SPI_CHIP_READ, /* Fast Read (0x0B) supported */ 3818 .voltage = {2700, 3600}, 3819 }, 3820 3821 { 3822 .vendor = "ESI", 3823 .name = "ES25P80", 3824 .bustype = BUS_SPI, 3825 .manufacture_id = EXCEL_ID_NOPREFIX, 3826 .model_id = EXCEL_ES25P80, 3827 .total_size = 1024, 3828 .page_size = 256, 3829 /* 256-byte parameter page separate from memory array: 3830 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */ 3831 .feature_bits = FEATURE_WRSR_WREN, 3832 .tested = TEST_UNTESTED, 3833 .probe = PROBE_SPI_RDID, 3834 .probe_timing = TIMING_ZERO, 3835 .block_erasers = 3836 { 3837 { 3838 .eraseblocks = { {64 * 1024, 16} }, 3839 .block_erase = SPI_BLOCK_ERASE_D8, 3840 }, { 3841 .eraseblocks = { {1024 * 1024, 1} }, 3842 .block_erase = SPI_BLOCK_ERASE_C7, 3843 } 3844 }, 3845 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 3846 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 3847 .write = SPI_CHIP_WRITE256, 3848 .read = SPI_CHIP_READ, /* Fast Read (0x0B) supported */ 3849 .voltage = {2700, 3600}, 3850 }, 3851 3852 { 3853 .vendor = "ESMT", 3854 .name = "F25L008A", 3855 .bustype = BUS_SPI, 3856 .manufacture_id = ESMT_ID, 3857 .model_id = ESMT_F25L008A, 3858 .total_size = 1024, 3859 .page_size = 256, 3860 .feature_bits = FEATURE_WRSR_EITHER, 3861 .tested = TEST_OK_PREW, 3862 .probe = PROBE_SPI_RDID, 3863 .probe_timing = TIMING_ZERO, 3864 .block_erasers = 3865 { 3866 { 3867 .eraseblocks = { {4 * 1024, 256} }, 3868 .block_erase = SPI_BLOCK_ERASE_20, 3869 }, { 3870 .eraseblocks = { {64 * 1024, 16} }, 3871 .block_erase = SPI_BLOCK_ERASE_D8, 3872 }, { 3873 .eraseblocks = { {1024 * 1024, 1} }, 3874 .block_erase = SPI_BLOCK_ERASE_60, 3875 }, { 3876 .eraseblocks = { {1024 * 1024, 1} }, 3877 .block_erase = SPI_BLOCK_ERASE_C7, 3878 } 3879 }, 3880 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 3881 .unlock = SPI_DISABLE_BLOCKPROTECT, 3882 .write = SPI_CHIP_WRITE1, 3883 .read = SPI_CHIP_READ, 3884 .voltage = {2700, 3600}, 3885 }, 3886 3887 { 3888 .vendor = "ESMT", 3889 .name = "F25L32PA", 3890 .bustype = BUS_SPI, 3891 .manufacture_id = ESMT_ID, 3892 .model_id = ESMT_F25L32PA, 3893 .total_size = 4096, 3894 .page_size = 256, 3895 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP, 3896 .tested = TEST_UNTESTED, 3897 .probe = PROBE_SPI_RDID, 3898 .probe_timing = TIMING_ZERO, 3899 .block_erasers = 3900 { 3901 { 3902 .eraseblocks = { {4 * 1024, 1024} }, 3903 .block_erase = SPI_BLOCK_ERASE_20, 3904 }, { 3905 .eraseblocks = { {64 * 1024, 64} }, 3906 .block_erase = SPI_BLOCK_ERASE_D8, 3907 }, { 3908 .eraseblocks = { {4 * 1024 * 1024, 1} }, 3909 .block_erase = SPI_BLOCK_ERASE_60, 3910 }, { 3911 .eraseblocks = { {4 * 1024 * 1024, 1} }, 3912 .block_erase = SPI_BLOCK_ERASE_C7, 3913 } 3914 }, 3915 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_BPL, 3916 .unlock = SPI_DISABLE_BLOCKPROTECT, 3917 .write = SPI_CHIP_WRITE256, 3918 .read = SPI_CHIP_READ, 3919 .voltage = {2700, 3600}, 3920 }, 3921 3922 { 3923 .vendor = "ESMT", 3924 .name = "F49B002UA", 3925 .bustype = BUS_PARALLEL, 3926 .manufacture_id = ESMT_ID, 3927 .model_id = ESMT_F49B002UA, 3928 .total_size = 256, 3929 .page_size = 4096, 3930 .feature_bits = FEATURE_EITHER_RESET, 3931 .tested = TEST_UNTESTED, 3932 .probe = PROBE_JEDEC, 3933 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 3934 .block_erasers = 3935 { 3936 { 3937 .eraseblocks = { 3938 {128 * 1024, 1}, 3939 {96 * 1024, 1}, 3940 {8 * 1024, 2}, 3941 {16 * 1024, 1}, 3942 }, 3943 .block_erase = JEDEC_SECTOR_ERASE, 3944 }, { 3945 .eraseblocks = { {256 * 1024, 1} }, 3946 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 3947 } 3948 }, 3949 .write = WRITE_JEDEC1, 3950 .read = READ_MEMMAPPED, 3951 .voltage = {4500, 5500}, 3952 }, 3953 3954 { 3955 .vendor = "Eon", 3956 .name = "EN25B05", 3957 .bustype = BUS_SPI, 3958 .manufacture_id = EON_ID_NOPREFIX, 3959 .model_id = EON_EN25B05, 3960 .total_size = 64, 3961 .page_size = 256, 3962 .feature_bits = FEATURE_WRSR_WREN, 3963 .tested = TEST_UNTESTED, 3964 .probe = PROBE_SPI_RDID, 3965 .probe_timing = TIMING_ZERO, 3966 .block_erasers = 3967 { 3968 { 3969 .eraseblocks = { 3970 {4 * 1024, 2}, 3971 {8 * 1024, 1}, 3972 {16 * 1024, 1}, 3973 {32 * 1024, 1}, 3974 }, 3975 .block_erase = SPI_BLOCK_ERASE_D8, 3976 }, { 3977 .eraseblocks = { {64 * 1024, 1} }, 3978 .block_erase = SPI_BLOCK_ERASE_C7, 3979 } 3980 }, 3981 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 3982 .unlock = SPI_DISABLE_BLOCKPROTECT, 3983 .write = SPI_CHIP_WRITE256, 3984 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 3985 .voltage = {2700, 3600}, 3986 }, 3987 3988 { 3989 .vendor = "Eon", 3990 .name = "EN25B05T", 3991 .bustype = BUS_SPI, 3992 .manufacture_id = EON_ID_NOPREFIX, 3993 .model_id = EON_EN25B05, 3994 .total_size = 64, 3995 .page_size = 256, 3996 .feature_bits = FEATURE_WRSR_WREN, 3997 .tested = TEST_UNTESTED, 3998 .probe = PROBE_SPI_RDID, 3999 .probe_timing = TIMING_ZERO, 4000 .block_erasers = 4001 { 4002 { 4003 .eraseblocks = { 4004 {32 * 1024, 1}, 4005 {16 * 1024, 1}, 4006 {8 * 1024, 1}, 4007 {4 * 1024, 2}, 4008 }, 4009 .block_erase = SPI_BLOCK_ERASE_D8, 4010 }, { 4011 .eraseblocks = { {64 * 1024, 1} }, 4012 .block_erase = SPI_BLOCK_ERASE_C7, 4013 } 4014 }, 4015 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4016 .unlock = SPI_DISABLE_BLOCKPROTECT, 4017 .write = SPI_CHIP_WRITE256, 4018 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4019 .voltage = {2700, 3600}, 4020 }, 4021 4022 { 4023 .vendor = "Eon", 4024 .name = "EN25B10", 4025 .bustype = BUS_SPI, 4026 .manufacture_id = EON_ID_NOPREFIX, 4027 .model_id = EON_EN25B10, 4028 .total_size = 128, 4029 .page_size = 256, 4030 .feature_bits = FEATURE_WRSR_WREN, 4031 .tested = TEST_UNTESTED, 4032 .probe = PROBE_SPI_RDID, 4033 .probe_timing = TIMING_ZERO, 4034 .block_erasers = 4035 { 4036 { 4037 .eraseblocks = { 4038 {4 * 1024, 2}, 4039 {8 * 1024, 1}, 4040 {16 * 1024, 1}, 4041 {32 * 1024, 3}, 4042 }, 4043 .block_erase = SPI_BLOCK_ERASE_D8, 4044 }, { 4045 .eraseblocks = { {128 * 1024, 1} }, 4046 .block_erase = SPI_BLOCK_ERASE_C7, 4047 } 4048 }, 4049 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4050 .unlock = SPI_DISABLE_BLOCKPROTECT, 4051 .write = SPI_CHIP_WRITE256, 4052 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4053 .voltage = {2700, 3600}, 4054 }, 4055 4056 { 4057 .vendor = "Eon", 4058 .name = "EN25B10T", 4059 .bustype = BUS_SPI, 4060 .manufacture_id = EON_ID_NOPREFIX, 4061 .model_id = EON_EN25B10, 4062 .total_size = 128, 4063 .page_size = 256, 4064 .feature_bits = FEATURE_WRSR_WREN, 4065 .tested = TEST_OK_PREW, 4066 .probe = PROBE_SPI_RDID, 4067 .probe_timing = TIMING_ZERO, 4068 .block_erasers = 4069 { 4070 { 4071 .eraseblocks = { 4072 {32 * 1024, 3}, 4073 {16 * 1024, 1}, 4074 {8 * 1024, 1}, 4075 {4 * 1024, 2}, 4076 }, 4077 .block_erase = SPI_BLOCK_ERASE_D8, 4078 }, { 4079 .eraseblocks = { {128 * 1024, 1} }, 4080 .block_erase = SPI_BLOCK_ERASE_C7, 4081 } 4082 }, 4083 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4084 .unlock = SPI_DISABLE_BLOCKPROTECT, 4085 .write = SPI_CHIP_WRITE256, 4086 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4087 .voltage = {2700, 3600}, 4088 }, 4089 4090 { 4091 .vendor = "Eon", 4092 .name = "EN25B16", 4093 .bustype = BUS_SPI, 4094 .manufacture_id = EON_ID_NOPREFIX, 4095 .model_id = EON_EN25B16, 4096 .total_size = 2048, 4097 .page_size = 256, 4098 .feature_bits = FEATURE_WRSR_WREN, 4099 .tested = TEST_UNTESTED, 4100 .probe = PROBE_SPI_RDID, 4101 .probe_timing = TIMING_ZERO, 4102 .block_erasers = 4103 { 4104 { 4105 .eraseblocks = { 4106 {4 * 1024, 2}, 4107 {8 * 1024, 1}, 4108 {16 * 1024, 1}, 4109 {32 * 1024, 1}, 4110 {64 * 1024, 31}, 4111 }, 4112 .block_erase = SPI_BLOCK_ERASE_D8, 4113 }, { 4114 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4115 .block_erase = SPI_BLOCK_ERASE_C7, 4116 } 4117 }, 4118 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4119 .unlock = SPI_DISABLE_BLOCKPROTECT, 4120 .write = SPI_CHIP_WRITE256, 4121 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4122 .voltage = {2700, 3600}, 4123 }, 4124 4125 { 4126 .vendor = "Eon", 4127 .name = "EN25B16T", 4128 .bustype = BUS_SPI, 4129 .manufacture_id = EON_ID_NOPREFIX, 4130 .model_id = EON_EN25B16, 4131 .total_size = 2048, 4132 .page_size = 256, 4133 .feature_bits = FEATURE_WRSR_WREN, 4134 .tested = TEST_UNTESTED, 4135 .probe = PROBE_SPI_RDID, 4136 .probe_timing = TIMING_ZERO, 4137 .block_erasers = 4138 { 4139 { 4140 .eraseblocks = { 4141 {64 * 1024, 31}, 4142 {32 * 1024, 1}, 4143 {16 * 1024, 1}, 4144 {8 * 1024, 1}, 4145 {4 * 1024, 2}, 4146 }, 4147 .block_erase = SPI_BLOCK_ERASE_D8, 4148 }, { 4149 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4150 .block_erase = SPI_BLOCK_ERASE_C7, 4151 } 4152 }, 4153 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4154 .unlock = SPI_DISABLE_BLOCKPROTECT, 4155 .write = SPI_CHIP_WRITE256, 4156 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4157 .voltage = {2700, 3600}, 4158 }, 4159 4160 { 4161 .vendor = "Eon", 4162 .name = "EN25B20", 4163 .bustype = BUS_SPI, 4164 .manufacture_id = EON_ID_NOPREFIX, 4165 .model_id = EON_EN25B20, 4166 .total_size = 256, 4167 .page_size = 256, 4168 .feature_bits = FEATURE_WRSR_WREN, 4169 .tested = TEST_UNTESTED, 4170 .probe = PROBE_SPI_RDID, 4171 .probe_timing = TIMING_ZERO, 4172 .block_erasers = 4173 { 4174 { 4175 .eraseblocks = { 4176 {4 * 1024, 2}, 4177 {8 * 1024, 1}, 4178 {16 * 1024, 1}, 4179 {32 * 1024, 1}, 4180 {64 * 1024, 3} 4181 }, 4182 .block_erase = SPI_BLOCK_ERASE_D8, 4183 }, { 4184 .eraseblocks = { {256 * 1024, 1} }, 4185 .block_erase = SPI_BLOCK_ERASE_C7, 4186 } 4187 }, 4188 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4189 .unlock = SPI_DISABLE_BLOCKPROTECT, 4190 .write = SPI_CHIP_WRITE256, 4191 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4192 .voltage = {2700, 3600}, 4193 }, 4194 4195 { 4196 .vendor = "Eon", 4197 .name = "EN25B20T", 4198 .bustype = BUS_SPI, 4199 .manufacture_id = EON_ID_NOPREFIX, 4200 .model_id = EON_EN25B20, 4201 .total_size = 256, 4202 .page_size = 256, 4203 .feature_bits = FEATURE_WRSR_WREN, 4204 .tested = TEST_UNTESTED, 4205 .probe = PROBE_SPI_RDID, 4206 .probe_timing = TIMING_ZERO, 4207 .block_erasers = 4208 { 4209 { 4210 .eraseblocks = { 4211 {64 * 1024, 3}, 4212 {32 * 1024, 1}, 4213 {16 * 1024, 1}, 4214 {8 * 1024, 1}, 4215 {4 * 1024, 2}, 4216 }, 4217 .block_erase = SPI_BLOCK_ERASE_D8, 4218 }, { 4219 .eraseblocks = { {256 * 1024, 1} }, 4220 .block_erase = SPI_BLOCK_ERASE_C7, 4221 } 4222 }, 4223 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4224 .unlock = SPI_DISABLE_BLOCKPROTECT, 4225 .write = SPI_CHIP_WRITE256, 4226 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4227 .voltage = {2700, 3600}, 4228 }, 4229 4230 { 4231 .vendor = "Eon", 4232 .name = "EN25B32", 4233 .bustype = BUS_SPI, 4234 .manufacture_id = EON_ID_NOPREFIX, 4235 .model_id = EON_EN25B32, 4236 .total_size = 4096, 4237 .page_size = 256, 4238 /* OTP: 512B total; enter 0x3A */ 4239 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4240 .tested = TEST_UNTESTED, 4241 .probe = PROBE_SPI_RDID, 4242 .probe_timing = TIMING_ZERO, 4243 .block_erasers = 4244 { 4245 { 4246 .eraseblocks = { 4247 {4 * 1024, 2}, 4248 {8 * 1024, 1}, 4249 {16 * 1024, 1}, 4250 {32 * 1024, 1}, 4251 {64 * 1024, 63}, 4252 }, 4253 .block_erase = SPI_BLOCK_ERASE_D8, 4254 }, { 4255 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4256 .block_erase = SPI_BLOCK_ERASE_C7, 4257 } 4258 }, 4259 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4260 .unlock = SPI_DISABLE_BLOCKPROTECT, 4261 .write = SPI_CHIP_WRITE256, 4262 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4263 .voltage = {2700, 3600}, 4264 }, 4265 4266 { 4267 .vendor = "Eon", 4268 .name = "EN25B32T", 4269 .bustype = BUS_SPI, 4270 .manufacture_id = EON_ID_NOPREFIX, 4271 .model_id = EON_EN25B32, 4272 .total_size = 4096, 4273 .page_size = 256, 4274 /* OTP: 512B total; enter 0x3A */ 4275 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4276 .tested = TEST_UNTESTED, 4277 .probe = PROBE_SPI_RDID, 4278 .probe_timing = TIMING_ZERO, 4279 .block_erasers = 4280 { 4281 { 4282 .eraseblocks = { 4283 {64 * 1024, 63}, 4284 {32 * 1024, 1}, 4285 {16 * 1024, 1}, 4286 {8 * 1024, 1}, 4287 {4 * 1024, 2}, 4288 }, 4289 .block_erase = SPI_BLOCK_ERASE_D8, 4290 }, { 4291 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4292 .block_erase = SPI_BLOCK_ERASE_C7, 4293 } 4294 }, 4295 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4296 .unlock = SPI_DISABLE_BLOCKPROTECT, 4297 .write = SPI_CHIP_WRITE256, 4298 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4299 .voltage = {2700, 3600}, 4300 }, 4301 4302 { 4303 .vendor = "Eon", 4304 .name = "EN25B40", 4305 .bustype = BUS_SPI, 4306 .manufacture_id = EON_ID_NOPREFIX, 4307 .model_id = EON_EN25B40, 4308 .total_size = 512, 4309 .page_size = 256, 4310 .feature_bits = FEATURE_WRSR_WREN, 4311 .tested = TEST_UNTESTED, 4312 .probe = PROBE_SPI_RDID, 4313 .probe_timing = TIMING_ZERO, 4314 .block_erasers = 4315 { 4316 { 4317 .eraseblocks = { 4318 {4 * 1024, 2}, 4319 {8 * 1024, 1}, 4320 {16 * 1024, 1}, 4321 {32 * 1024, 1}, 4322 {64 * 1024, 7} 4323 }, 4324 .block_erase = SPI_BLOCK_ERASE_D8, 4325 }, { 4326 .eraseblocks = { {512 * 1024, 1} }, 4327 .block_erase = SPI_BLOCK_ERASE_C7, 4328 } 4329 }, 4330 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4331 .unlock = SPI_DISABLE_BLOCKPROTECT, 4332 .write = SPI_CHIP_WRITE256, 4333 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4334 .voltage = {2700, 3600}, 4335 }, 4336 4337 { 4338 .vendor = "Eon", 4339 .name = "EN25B40T", 4340 .bustype = BUS_SPI, 4341 .manufacture_id = EON_ID_NOPREFIX, 4342 .model_id = EON_EN25B40, 4343 .total_size = 512, 4344 .page_size = 256, 4345 .feature_bits = FEATURE_WRSR_WREN, 4346 .tested = TEST_UNTESTED, 4347 .probe = PROBE_SPI_RDID, 4348 .probe_timing = TIMING_ZERO, 4349 .block_erasers = 4350 { 4351 { 4352 .eraseblocks = { 4353 {64 * 1024, 7}, 4354 {32 * 1024, 1}, 4355 {16 * 1024, 1}, 4356 {8 * 1024, 1}, 4357 {4 * 1024, 2}, 4358 }, 4359 .block_erase = SPI_BLOCK_ERASE_D8, 4360 }, { 4361 .eraseblocks = { {512 * 1024, 1} }, 4362 .block_erase = SPI_BLOCK_ERASE_C7, 4363 } 4364 }, 4365 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4366 .unlock = SPI_DISABLE_BLOCKPROTECT, 4367 .write = SPI_CHIP_WRITE256, 4368 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4369 .voltage = {2700, 3600}, 4370 }, 4371 4372 { 4373 .vendor = "Eon", 4374 .name = "EN25B64", 4375 .bustype = BUS_SPI, 4376 .manufacture_id = EON_ID_NOPREFIX, 4377 .model_id = EON_EN25B64, 4378 .total_size = 8192, 4379 .page_size = 256, 4380 /* OTP: 512B total; enter 0x3A */ 4381 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4382 .tested = TEST_UNTESTED, 4383 .probe = PROBE_SPI_RDID, 4384 .probe_timing = TIMING_ZERO, 4385 .block_erasers = 4386 { 4387 { 4388 .eraseblocks = { 4389 {4 * 1024, 2}, 4390 {8 * 1024, 1}, 4391 {16 * 1024, 1}, 4392 {32 * 1024, 1}, 4393 {64 * 1024, 127}, 4394 }, 4395 .block_erase = SPI_BLOCK_ERASE_D8, 4396 }, { 4397 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4398 .block_erase = SPI_BLOCK_ERASE_C7, 4399 } 4400 }, 4401 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4402 .unlock = SPI_DISABLE_BLOCKPROTECT, 4403 .write = SPI_CHIP_WRITE256, 4404 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4405 .voltage = {2700, 3600}, 4406 }, 4407 4408 { 4409 .vendor = "Eon", 4410 .name = "EN25B64T", 4411 .bustype = BUS_SPI, 4412 .manufacture_id = EON_ID_NOPREFIX, 4413 .model_id = EON_EN25B64, 4414 .total_size = 8192, 4415 .page_size = 256, 4416 /* OTP: 512B total; enter 0x3A */ 4417 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4418 .tested = TEST_UNTESTED, 4419 .probe = PROBE_SPI_RDID, 4420 .probe_timing = TIMING_ZERO, 4421 .block_erasers = 4422 { 4423 { 4424 .eraseblocks = { 4425 {64 * 1024, 127}, 4426 {32 * 1024, 1}, 4427 {16 * 1024, 1}, 4428 {8 * 1024, 1}, 4429 {4 * 1024, 2}, 4430 }, 4431 .block_erase = SPI_BLOCK_ERASE_D8, 4432 }, { 4433 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4434 .block_erase = SPI_BLOCK_ERASE_C7, 4435 } 4436 }, 4437 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4438 .unlock = SPI_DISABLE_BLOCKPROTECT, 4439 .write = SPI_CHIP_WRITE256, 4440 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4441 .voltage = {2700, 3600}, 4442 }, 4443 4444 { 4445 .vendor = "Eon", 4446 .name = "EN25B80", 4447 .bustype = BUS_SPI, 4448 .manufacture_id = EON_ID_NOPREFIX, 4449 .model_id = EON_EN25B80, 4450 .total_size = 1024, 4451 .page_size = 256, 4452 .feature_bits = FEATURE_WRSR_WREN, 4453 .tested = TEST_UNTESTED, 4454 .probe = PROBE_SPI_RDID, 4455 .probe_timing = TIMING_ZERO, 4456 .block_erasers = 4457 { 4458 { 4459 .eraseblocks = { 4460 {4 * 1024, 2}, 4461 {8 * 1024, 1}, 4462 {16 * 1024, 1}, 4463 {32 * 1024, 1}, 4464 {64 * 1024, 15} 4465 }, 4466 .block_erase = SPI_BLOCK_ERASE_D8, 4467 }, { 4468 .eraseblocks = { {1024 * 1024, 1} }, 4469 .block_erase = SPI_BLOCK_ERASE_C7, 4470 } 4471 }, 4472 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4473 .unlock = SPI_DISABLE_BLOCKPROTECT, 4474 .write = SPI_CHIP_WRITE256, 4475 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4476 .voltage = {2700, 3600}, 4477 }, 4478 4479 { 4480 .vendor = "Eon", 4481 .name = "EN25B80T", 4482 .bustype = BUS_SPI, 4483 .manufacture_id = EON_ID_NOPREFIX, 4484 .model_id = EON_EN25B80, 4485 .total_size = 1024, 4486 .page_size = 256, 4487 .feature_bits = FEATURE_WRSR_WREN, 4488 .tested = TEST_UNTESTED, 4489 .probe = PROBE_SPI_RDID, 4490 .probe_timing = TIMING_ZERO, 4491 .block_erasers = 4492 { 4493 { 4494 .eraseblocks = { 4495 {64 * 1024, 15}, 4496 {32 * 1024, 1}, 4497 {16 * 1024, 1}, 4498 {8 * 1024, 1}, 4499 {4 * 1024, 2}, 4500 }, 4501 .block_erase = SPI_BLOCK_ERASE_D8, 4502 }, { 4503 .eraseblocks = { {1024 * 1024, 1} }, 4504 .block_erase = SPI_BLOCK_ERASE_C7, 4505 } 4506 }, 4507 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4508 .unlock = SPI_DISABLE_BLOCKPROTECT, 4509 .write = SPI_CHIP_WRITE256, 4510 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4511 .voltage = {2700, 3600}, 4512 }, 4513 4514 { 4515 .vendor = "Eon", 4516 .name = "EN25F05", 4517 .bustype = BUS_SPI, 4518 .manufacture_id = EON_ID_NOPREFIX, 4519 .model_id = EON_EN25F05, 4520 .total_size = 64, 4521 .page_size = 256, 4522 .feature_bits = FEATURE_WRSR_WREN, 4523 .tested = TEST_OK_PREW, 4524 .probe = PROBE_SPI_RDID, 4525 .probe_timing = TIMING_ZERO, 4526 .block_erasers = 4527 { 4528 { 4529 .eraseblocks = { {4 * 1024, 16} }, 4530 .block_erase = SPI_BLOCK_ERASE_20, 4531 }, { 4532 .eraseblocks = { {32 * 1024, 2} }, 4533 .block_erase = SPI_BLOCK_ERASE_D8, 4534 }, { 4535 .eraseblocks = { {32 * 1024, 2} }, 4536 .block_erase = SPI_BLOCK_ERASE_52, 4537 }, { 4538 .eraseblocks = { {64 * 1024, 1} }, 4539 .block_erase = SPI_BLOCK_ERASE_60, 4540 }, { 4541 .eraseblocks = { {64 * 1024, 1} }, 4542 .block_erase = SPI_BLOCK_ERASE_C7, 4543 } 4544 }, 4545 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4546 .unlock = SPI_DISABLE_BLOCKPROTECT, 4547 .write = SPI_CHIP_WRITE256, 4548 .read = SPI_CHIP_READ, 4549 .voltage = {2700, 3600}, 4550 }, 4551 4552 { 4553 .vendor = "Eon", 4554 .name = "EN25F10", 4555 .bustype = BUS_SPI, 4556 .manufacture_id = EON_ID_NOPREFIX, 4557 .model_id = EON_EN25F10, 4558 .total_size = 128, 4559 .page_size = 256, 4560 .feature_bits = FEATURE_WRSR_WREN, 4561 .tested = TEST_OK_PREW, 4562 .probe = PROBE_SPI_RDID, 4563 .probe_timing = TIMING_ZERO, 4564 .block_erasers = 4565 { 4566 { 4567 .eraseblocks = { {4 * 1024, 32} }, 4568 .block_erase = SPI_BLOCK_ERASE_20, 4569 }, { 4570 .eraseblocks = { {32 * 1024, 4} }, 4571 .block_erase = SPI_BLOCK_ERASE_D8, 4572 }, { 4573 .eraseblocks = { {32 * 1024, 4} }, 4574 .block_erase = SPI_BLOCK_ERASE_52, 4575 }, { 4576 .eraseblocks = { {128 * 1024, 1} }, 4577 .block_erase = SPI_BLOCK_ERASE_60, 4578 }, { 4579 .eraseblocks = { {128 * 1024, 1} }, 4580 .block_erase = SPI_BLOCK_ERASE_C7, 4581 } 4582 }, 4583 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4584 .unlock = SPI_DISABLE_BLOCKPROTECT, 4585 .write = SPI_CHIP_WRITE256, 4586 .read = SPI_CHIP_READ, 4587 .voltage = {2700, 3600}, 4588 }, 4589 4590 { 4591 .vendor = "Eon", 4592 .name = "EN25F16", 4593 .bustype = BUS_SPI, 4594 .manufacture_id = EON_ID_NOPREFIX, 4595 .model_id = EON_EN25F16, 4596 .total_size = 2048, 4597 .page_size = 256, 4598 .feature_bits = FEATURE_WRSR_WREN, 4599 .tested = TEST_OK_PREW, 4600 .probe = PROBE_SPI_RDID, 4601 .probe_timing = TIMING_ZERO, 4602 .block_erasers = 4603 { 4604 { 4605 .eraseblocks = { {4 * 1024, 512} }, 4606 .block_erase = SPI_BLOCK_ERASE_20, 4607 }, { 4608 .eraseblocks = { {64 * 1024, 32} }, 4609 .block_erase = SPI_BLOCK_ERASE_D8, 4610 }, { 4611 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4612 .block_erase = SPI_BLOCK_ERASE_60, 4613 }, { 4614 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4615 .block_erase = SPI_BLOCK_ERASE_C7, 4616 } 4617 }, 4618 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4619 .unlock = SPI_DISABLE_BLOCKPROTECT, 4620 .write = SPI_CHIP_WRITE256, 4621 .read = SPI_CHIP_READ, 4622 .voltage = {2700, 3600}, 4623 }, 4624 4625 { 4626 .vendor = "Eon", 4627 .name = "EN25F20", 4628 .bustype = BUS_SPI, 4629 .manufacture_id = EON_ID_NOPREFIX, 4630 .model_id = EON_EN25F20, 4631 .total_size = 256, 4632 .page_size = 256, 4633 .feature_bits = FEATURE_WRSR_WREN, 4634 .tested = TEST_UNTESTED, 4635 .probe = PROBE_SPI_RDID, 4636 .probe_timing = TIMING_ZERO, 4637 .block_erasers = 4638 { 4639 { 4640 .eraseblocks = { {4 * 1024, 64} }, 4641 .block_erase = SPI_BLOCK_ERASE_20, 4642 }, { 4643 .eraseblocks = { {64 * 1024, 4} }, 4644 .block_erase = SPI_BLOCK_ERASE_D8, 4645 }, { 4646 .eraseblocks = { {64 * 1024, 4} }, 4647 .block_erase = SPI_BLOCK_ERASE_52, 4648 }, { 4649 .eraseblocks = { {256 * 1024, 1} }, 4650 .block_erase = SPI_BLOCK_ERASE_60, 4651 }, { 4652 .eraseblocks = { {256 * 1024, 1} }, 4653 .block_erase = SPI_BLOCK_ERASE_C7, 4654 } 4655 }, 4656 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4657 .unlock = SPI_DISABLE_BLOCKPROTECT, 4658 .write = SPI_CHIP_WRITE256, 4659 .read = SPI_CHIP_READ, 4660 .voltage = {2700, 3600}, 4661 }, 4662 4663 { 4664 .vendor = "Eon", 4665 .name = "EN25F32", 4666 .bustype = BUS_SPI, 4667 .manufacture_id = EON_ID_NOPREFIX, 4668 .model_id = EON_EN25F32, 4669 .total_size = 4096, 4670 .page_size = 256, 4671 .feature_bits = FEATURE_WRSR_WREN, 4672 .tested = TEST_OK_PREW, 4673 .probe = PROBE_SPI_RDID, 4674 .probe_timing = TIMING_ZERO, 4675 .block_erasers = 4676 { 4677 { 4678 .eraseblocks = { {4 * 1024, 1024} }, 4679 .block_erase = SPI_BLOCK_ERASE_20, 4680 }, { 4681 .eraseblocks = { {64 * 1024, 64} }, 4682 .block_erase = SPI_BLOCK_ERASE_D8, 4683 }, { 4684 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4685 .block_erase = SPI_BLOCK_ERASE_60, 4686 }, { 4687 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4688 .block_erase = SPI_BLOCK_ERASE_C7, 4689 } 4690 }, 4691 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4692 .unlock = SPI_DISABLE_BLOCKPROTECT, 4693 .write = SPI_CHIP_WRITE256, 4694 .read = SPI_CHIP_READ, 4695 .voltage = {2700, 3600}, 4696 }, 4697 4698 { 4699 .vendor = "Eon", 4700 .name = "EN25F40", 4701 .bustype = BUS_SPI, 4702 .manufacture_id = EON_ID_NOPREFIX, 4703 .model_id = EON_EN25F40, 4704 .total_size = 512, 4705 .page_size = 256, 4706 .feature_bits = FEATURE_WRSR_WREN, 4707 .tested = TEST_OK_PREW, 4708 .probe = PROBE_SPI_RDID, 4709 .probe_timing = TIMING_ZERO, 4710 .block_erasers = 4711 { 4712 { 4713 .eraseblocks = { {4 * 1024, 128} }, 4714 .block_erase = SPI_BLOCK_ERASE_20, 4715 }, { 4716 .eraseblocks = { {64 * 1024, 8} }, 4717 .block_erase = SPI_BLOCK_ERASE_D8, 4718 }, { 4719 .eraseblocks = { {512 * 1024, 1} }, 4720 .block_erase = SPI_BLOCK_ERASE_60, 4721 }, { 4722 .eraseblocks = { {512 * 1024, 1} }, 4723 .block_erase = SPI_BLOCK_ERASE_C7, 4724 }, 4725 }, 4726 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4727 .unlock = SPI_DISABLE_BLOCKPROTECT, 4728 .write = SPI_CHIP_WRITE256, 4729 .read = SPI_CHIP_READ, 4730 .voltage = {2700, 3600}, 4731 }, 4732 4733 { 4734 .vendor = "Eon", 4735 .name = "EN25F64", 4736 .bustype = BUS_SPI, 4737 .manufacture_id = EON_ID_NOPREFIX, 4738 .model_id = EON_EN25F64, 4739 .total_size = 8192, 4740 .page_size = 256, 4741 .feature_bits = FEATURE_WRSR_WREN, 4742 .tested = TEST_OK_PREW, 4743 .probe = PROBE_SPI_RDID, 4744 .probe_timing = TIMING_ZERO, 4745 .block_erasers = 4746 { 4747 { 4748 .eraseblocks = { {4 * 1024, 2048} }, 4749 .block_erase = SPI_BLOCK_ERASE_20, 4750 }, { 4751 .eraseblocks = { {64 * 1024, 128} }, 4752 .block_erase = SPI_BLOCK_ERASE_D8, 4753 }, { 4754 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4755 .block_erase = SPI_BLOCK_ERASE_60, 4756 }, { 4757 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4758 .block_erase = SPI_BLOCK_ERASE_C7, 4759 } 4760 }, 4761 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4762 .unlock = SPI_DISABLE_BLOCKPROTECT, 4763 .write = SPI_CHIP_WRITE256, 4764 .read = SPI_CHIP_READ, 4765 .voltage = {2700, 3600}, 4766 }, 4767 4768 { 4769 .vendor = "Eon", 4770 .name = "EN25F80", 4771 .bustype = BUS_SPI, 4772 .manufacture_id = EON_ID_NOPREFIX, 4773 .model_id = EON_EN25F80, 4774 .total_size = 1024, 4775 .page_size = 256, 4776 .feature_bits = FEATURE_WRSR_WREN, 4777 .tested = TEST_OK_PREW, 4778 .probe = PROBE_SPI_RDID, 4779 .probe_timing = TIMING_ZERO, 4780 .block_erasers = 4781 { 4782 { 4783 .eraseblocks = { {4 * 1024, 256} }, 4784 .block_erase = SPI_BLOCK_ERASE_20, 4785 }, { 4786 .eraseblocks = { {64 * 1024, 16} }, 4787 .block_erase = SPI_BLOCK_ERASE_D8, 4788 }, { 4789 .eraseblocks = { {1024 * 1024, 1} }, 4790 .block_erase = SPI_BLOCK_ERASE_60, 4791 }, { 4792 .eraseblocks = { {1024 * 1024, 1} }, 4793 .block_erase = SPI_BLOCK_ERASE_C7, 4794 } 4795 }, 4796 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4797 .unlock = SPI_DISABLE_BLOCKPROTECT, 4798 .write = SPI_CHIP_WRITE256, 4799 .read = SPI_CHIP_READ, 4800 .voltage = {2700, 3600}, 4801 }, 4802 4803 { 4804 .vendor = "Eon", 4805 .name = "EN25P05", 4806 .bustype = BUS_SPI, 4807 .manufacture_id = EON_ID_NOPREFIX, 4808 .model_id = EON_EN25B05, 4809 .total_size = 64, 4810 .page_size = 256, 4811 .feature_bits = FEATURE_WRSR_WREN, 4812 .tested = TEST_UNTESTED, 4813 .probe = PROBE_SPI_RDID, 4814 .probe_timing = TIMING_ZERO, 4815 .block_erasers = 4816 { 4817 { 4818 .eraseblocks = { 4819 {32 * 1024, 2} }, 4820 .block_erase = SPI_BLOCK_ERASE_D8, 4821 }, { 4822 .eraseblocks = { {64 * 1024, 1} }, 4823 .block_erase = SPI_BLOCK_ERASE_C7, 4824 } 4825 }, 4826 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4827 .unlock = SPI_DISABLE_BLOCKPROTECT, 4828 .write = SPI_CHIP_WRITE256, 4829 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4830 .voltage = {2700, 3600}, 4831 }, 4832 4833 { 4834 .vendor = "Eon", 4835 .name = "EN25P10", 4836 .bustype = BUS_SPI, 4837 .manufacture_id = EON_ID_NOPREFIX, 4838 .model_id = EON_EN25B10, 4839 .total_size = 128, 4840 .page_size = 256, 4841 .feature_bits = FEATURE_WRSR_WREN, 4842 .tested = TEST_UNTESTED, 4843 .probe = PROBE_SPI_RDID, 4844 .probe_timing = TIMING_ZERO, 4845 .block_erasers = 4846 { 4847 { 4848 .eraseblocks = { {32 * 1024, 4} }, 4849 .block_erase = SPI_BLOCK_ERASE_D8, 4850 }, { 4851 .eraseblocks = { {128 * 1024, 1} }, 4852 .block_erase = SPI_BLOCK_ERASE_C7, 4853 } 4854 }, 4855 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4856 .unlock = SPI_DISABLE_BLOCKPROTECT, 4857 .write = SPI_CHIP_WRITE256, 4858 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4859 .voltage = {2700, 3600}, 4860 }, 4861 4862 { 4863 .vendor = "Eon", 4864 .name = "EN25P16", 4865 .bustype = BUS_SPI, 4866 .manufacture_id = EON_ID_NOPREFIX, 4867 .model_id = EON_EN25B16, 4868 .total_size = 2048, 4869 .page_size = 256, 4870 .feature_bits = FEATURE_WRSR_WREN, 4871 .tested = TEST_UNTESTED, 4872 .probe = PROBE_SPI_RDID, 4873 .probe_timing = TIMING_ZERO, 4874 .block_erasers = 4875 { 4876 { 4877 .eraseblocks = { {64 * 1024, 32} }, 4878 .block_erase = SPI_BLOCK_ERASE_D8, 4879 }, { 4880 .eraseblocks = { {2 * 1024 * 1024, 1} }, 4881 .block_erase = SPI_BLOCK_ERASE_C7, 4882 } 4883 }, 4884 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4885 .unlock = SPI_DISABLE_BLOCKPROTECT, 4886 .write = SPI_CHIP_WRITE256, 4887 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4888 .voltage = {2700, 3600}, 4889 }, 4890 4891 { 4892 .vendor = "Eon", 4893 .name = "EN25P20", 4894 .bustype = BUS_SPI, 4895 .manufacture_id = EON_ID_NOPREFIX, 4896 .model_id = EON_EN25B20, 4897 .total_size = 256, 4898 .page_size = 256, 4899 .feature_bits = FEATURE_WRSR_WREN, 4900 .tested = TEST_UNTESTED, 4901 .probe = PROBE_SPI_RDID, 4902 .probe_timing = TIMING_ZERO, 4903 .block_erasers = 4904 { 4905 { 4906 .eraseblocks = { {64 * 1024, 4} }, 4907 .block_erase = SPI_BLOCK_ERASE_D8, 4908 }, { 4909 .eraseblocks = { {256 * 1024, 1} }, 4910 .block_erase = SPI_BLOCK_ERASE_C7, 4911 } 4912 }, 4913 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4914 .unlock = SPI_DISABLE_BLOCKPROTECT, 4915 .write = SPI_CHIP_WRITE256, 4916 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4917 .voltage = {2700, 3600}, 4918 }, 4919 4920 { 4921 .vendor = "Eon", 4922 .name = "EN25P32", /* Uniform version of EN25B32 */ 4923 .bustype = BUS_SPI, 4924 .manufacture_id = EON_ID_NOPREFIX, 4925 .model_id = EON_EN25B32, 4926 .total_size = 4096, 4927 .page_size = 256, 4928 /* OTP: 512B total; enter 0x3A */ 4929 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4930 .tested = TEST_UNTESTED, 4931 .probe = PROBE_SPI_RDID, 4932 .probe_timing = TIMING_ZERO, 4933 .block_erasers = 4934 { 4935 { 4936 .eraseblocks = { {64 * 1024, 64} }, 4937 .block_erase = SPI_BLOCK_ERASE_D8, 4938 }, { 4939 .eraseblocks = { {4 * 1024 * 1024, 1} }, 4940 .block_erase = SPI_BLOCK_ERASE_C7, 4941 } 4942 }, 4943 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4944 .unlock = SPI_DISABLE_BLOCKPROTECT, 4945 .write = SPI_CHIP_WRITE256, 4946 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4947 .voltage = {2700, 3600}, 4948 }, 4949 4950 { 4951 .vendor = "Eon", 4952 .name = "EN25P40", 4953 .bustype = BUS_SPI, 4954 .manufacture_id = EON_ID_NOPREFIX, 4955 .model_id = EON_EN25B40, 4956 .total_size = 512, 4957 .page_size = 256, 4958 .feature_bits = FEATURE_WRSR_WREN, 4959 .tested = TEST_UNTESTED, 4960 .probe = PROBE_SPI_RDID, 4961 .probe_timing = TIMING_ZERO, 4962 .block_erasers = 4963 { 4964 { 4965 .eraseblocks = { {64 * 1024, 8} }, 4966 .block_erase = SPI_BLOCK_ERASE_D8, 4967 }, { 4968 .eraseblocks = { {512 * 1024, 1} }, 4969 .block_erase = SPI_BLOCK_ERASE_C7, 4970 } 4971 }, 4972 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 4973 .unlock = SPI_DISABLE_BLOCKPROTECT, 4974 .write = SPI_CHIP_WRITE256, 4975 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 4976 .voltage = {2700, 3600}, 4977 }, 4978 4979 { 4980 .vendor = "Eon", 4981 .name = "EN25P64", 4982 .bustype = BUS_SPI, 4983 .manufacture_id = EON_ID_NOPREFIX, 4984 .model_id = EON_EN25B64, 4985 .total_size = 8192, 4986 .page_size = 256, 4987 /* OTP: 512B total; enter 0x3A */ 4988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 4989 .tested = TEST_UNTESTED, 4990 .probe = PROBE_SPI_RDID, 4991 .probe_timing = TIMING_ZERO, 4992 .block_erasers = 4993 { 4994 { 4995 .eraseblocks = { {64 * 1024, 128} }, 4996 .block_erase = SPI_BLOCK_ERASE_D8, 4997 }, { 4998 .eraseblocks = { {8 * 1024 * 1024, 1} }, 4999 .block_erase = SPI_BLOCK_ERASE_C7, 5000 } 5001 }, 5002 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5003 .unlock = SPI_DISABLE_BLOCKPROTECT, 5004 .write = SPI_CHIP_WRITE256, 5005 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 5006 .voltage = {2700, 3600}, 5007 }, 5008 5009 { 5010 .vendor = "Eon", 5011 .name = "EN25P80", 5012 .bustype = BUS_SPI, 5013 .manufacture_id = EON_ID_NOPREFIX, 5014 .model_id = EON_EN25B80, 5015 .total_size = 1024, 5016 .page_size = 256, 5017 .feature_bits = FEATURE_WRSR_WREN, 5018 .tested = TEST_UNTESTED, 5019 .probe = PROBE_SPI_RDID, 5020 .probe_timing = TIMING_ZERO, 5021 .block_erasers = 5022 { 5023 { 5024 .eraseblocks = { {64 * 1024, 16} }, 5025 .block_erase = SPI_BLOCK_ERASE_D8, 5026 }, { 5027 .eraseblocks = { {1024 * 1024, 1} }, 5028 .block_erase = SPI_BLOCK_ERASE_C7, 5029 } 5030 }, 5031 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5032 .unlock = SPI_DISABLE_BLOCKPROTECT, 5033 .write = SPI_CHIP_WRITE256, 5034 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 5035 .voltage = {2700, 3600}, 5036 }, 5037 5038 { 5039 .vendor = "Eon", 5040 .name = "EN25Q128", 5041 .bustype = BUS_SPI, 5042 .manufacture_id = EON_ID_NOPREFIX, 5043 .model_id = EON_EN25Q128, 5044 .total_size = 16384, 5045 .page_size = 256, 5046 /* OTP: 512B total; enter 0x3A */ 5047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5048 .tested = TEST_OK_PREW, 5049 .probe = PROBE_SPI_RDID, 5050 .probe_timing = TIMING_ZERO, 5051 .block_erasers = 5052 { 5053 { 5054 .eraseblocks = { {4 * 1024, 4096} }, 5055 .block_erase = SPI_BLOCK_ERASE_20, 5056 }, { 5057 .eraseblocks = { {64 * 1024, 256} }, 5058 .block_erase = SPI_BLOCK_ERASE_D8, 5059 }, { 5060 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5061 .block_erase = SPI_BLOCK_ERASE_60, 5062 }, { 5063 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5064 .block_erase = SPI_BLOCK_ERASE_C7, 5065 } 5066 }, 5067 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5068 .unlock = SPI_DISABLE_BLOCKPROTECT, 5069 .write = SPI_CHIP_WRITE256, 5070 .read = SPI_CHIP_READ, 5071 }, 5072 5073 { 5074 /* Note: EN25D16 is an evil twin which shares the model ID 5075 but has different write protection capabilities */ 5076 .vendor = "Eon", 5077 .name = "EN25Q16", 5078 .bustype = BUS_SPI, 5079 .manufacture_id = EON_ID_NOPREFIX, 5080 .model_id = EON_EN25Q16, 5081 .total_size = 2048, 5082 .page_size = 256, 5083 /* OTP: D16 512B/Q16 128B total; enter 0x3A */ 5084 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5085 .tested = TEST_UNTESTED, 5086 .probe = PROBE_SPI_RDID, 5087 .probe_timing = TIMING_ZERO, 5088 .block_erasers = 5089 { 5090 { 5091 .eraseblocks = { {4 * 1024, 512} }, 5092 .block_erase = SPI_BLOCK_ERASE_20, 5093 }, { 5094 .eraseblocks = { {64 * 1024, 32} }, 5095 .block_erase = SPI_BLOCK_ERASE_D8, 5096 }, { 5097 /* not supported by Q16 version */ 5098 .eraseblocks = { {64 * 1024, 32} }, 5099 .block_erase = SPI_BLOCK_ERASE_52, 5100 }, { 5101 .eraseblocks = { {2 * 1024 * 1024, 1} }, 5102 .block_erase = SPI_BLOCK_ERASE_60, 5103 }, { 5104 .eraseblocks = { {2 * 1024 * 1024, 1} }, 5105 .block_erase = SPI_BLOCK_ERASE_C7, 5106 } 5107 }, 5108 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5109 .unlock = SPI_DISABLE_BLOCKPROTECT, 5110 .write = SPI_CHIP_WRITE256, 5111 .read = SPI_CHIP_READ, 5112 .voltage = {2700, 3600}, 5113 }, 5114 5115 { 5116 .vendor = "Eon", 5117 .name = "EN25Q32(A/B)", 5118 .bustype = BUS_SPI, 5119 .manufacture_id = EON_ID_NOPREFIX, 5120 .model_id = EON_EN25Q32, 5121 .total_size = 4096, 5122 .page_size = 256, 5123 /* OTP: 512B total; enter 0x3A */ 5124 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5125 .tested = TEST_OK_PREW, 5126 .probe = PROBE_SPI_RDID, 5127 .probe_timing = TIMING_ZERO, 5128 .block_erasers = 5129 { 5130 { 5131 .eraseblocks = { {4 * 1024, 1024} }, 5132 .block_erase = SPI_BLOCK_ERASE_20, 5133 }, { 5134 .eraseblocks = { {64 * 1024, 64} }, 5135 .block_erase = SPI_BLOCK_ERASE_D8, 5136 }, { 5137 .eraseblocks = { {4 * 1024 * 1024, 1} }, 5138 .block_erase = SPI_BLOCK_ERASE_60, 5139 }, { 5140 .eraseblocks = { {4 * 1024 * 1024, 1} }, 5141 .block_erase = SPI_BLOCK_ERASE_C7, 5142 } 5143 }, 5144 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5145 .unlock = SPI_DISABLE_BLOCKPROTECT, 5146 .write = SPI_CHIP_WRITE256, 5147 .read = SPI_CHIP_READ, 5148 .voltage = {2700, 3600}, 5149 }, 5150 5151 { 5152 .vendor = "Eon", 5153 .name = "EN25Q40", 5154 .bustype = BUS_SPI, 5155 .manufacture_id = EON_ID_NOPREFIX, 5156 .model_id = EON_EN25Q40, 5157 .total_size = 512, 5158 .page_size = 256, 5159 /* OTP: 256B total; enter 0x3A */ 5160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5161 .tested = TEST_UNTESTED, 5162 .probe = PROBE_SPI_RDID, 5163 .probe_timing = TIMING_ZERO, 5164 .block_erasers = 5165 { 5166 { 5167 .eraseblocks = { {4 * 1024, 128} }, 5168 .block_erase = SPI_BLOCK_ERASE_20, 5169 }, { 5170 .eraseblocks = { {64 * 1024, 8} }, 5171 .block_erase = SPI_BLOCK_ERASE_D8, 5172 }, { 5173 .eraseblocks = { {512 * 1024, 1} }, 5174 .block_erase = SPI_BLOCK_ERASE_60, 5175 }, { 5176 .eraseblocks = { {512 * 1024, 1} }, 5177 .block_erase = SPI_BLOCK_ERASE_C7, 5178 } 5179 }, 5180 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5181 .unlock = SPI_DISABLE_BLOCKPROTECT, 5182 .write = SPI_CHIP_WRITE256, 5183 .read = SPI_CHIP_READ, 5184 .voltage = {2700, 3600}, 5185 }, 5186 5187 { 5188 .vendor = "Eon", 5189 .name = "EN25Q64", 5190 .bustype = BUS_SPI, 5191 .manufacture_id = EON_ID_NOPREFIX, 5192 .model_id = EON_EN25Q64, 5193 .total_size = 8192, 5194 .page_size = 256, 5195 /* OTP: 512B total; enter 0x3A */ 5196 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5197 .tested = TEST_OK_PREW, 5198 .probe = PROBE_SPI_RDID, 5199 .probe_timing = TIMING_ZERO, 5200 .block_erasers = 5201 { 5202 { 5203 .eraseblocks = { {4 * 1024, 2048} }, 5204 .block_erase = SPI_BLOCK_ERASE_20, 5205 }, { 5206 .eraseblocks = { {64 * 1024, 128} }, 5207 .block_erase = SPI_BLOCK_ERASE_D8, 5208 }, { 5209 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5210 .block_erase = SPI_BLOCK_ERASE_60, 5211 }, { 5212 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5213 .block_erase = SPI_BLOCK_ERASE_C7, 5214 } 5215 }, 5216 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5217 .unlock = SPI_DISABLE_BLOCKPROTECT, 5218 .write = SPI_CHIP_WRITE256, 5219 .read = SPI_CHIP_READ, 5220 .voltage = {2700, 3600}, 5221 }, 5222 5223 { 5224 .vendor = "Eon", 5225 .name = "EN25Q80(A)", 5226 .bustype = BUS_SPI, 5227 .manufacture_id = EON_ID_NOPREFIX, 5228 .model_id = EON_EN25Q80, 5229 .total_size = 1024, 5230 .page_size = 256, 5231 /* OTP: 256B total; enter 0x3A */ 5232 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5233 .tested = TEST_UNTESTED, 5234 .probe = PROBE_SPI_RDID, 5235 .probe_timing = TIMING_ZERO, 5236 .block_erasers = 5237 { 5238 { 5239 .eraseblocks = { {4 * 1024, 256} }, 5240 .block_erase = SPI_BLOCK_ERASE_20, 5241 }, { 5242 .eraseblocks = { {64 * 1024, 16} }, 5243 .block_erase = SPI_BLOCK_ERASE_D8, 5244 }, { 5245 .eraseblocks = { {1024 * 1024, 1} }, 5246 .block_erase = SPI_BLOCK_ERASE_60, 5247 }, { 5248 .eraseblocks = { {1024 * 1024, 1} }, 5249 .block_erase = SPI_BLOCK_ERASE_C7, 5250 } 5251 }, 5252 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 5253 .unlock = SPI_DISABLE_BLOCKPROTECT, 5254 .write = SPI_CHIP_WRITE256, 5255 .read = SPI_CHIP_READ, 5256 .voltage = {2700, 3600}, 5257 }, 5258 5259 { 5260 .vendor = "Eon", 5261 .name = "EN25QH128", 5262 .bustype = BUS_SPI, 5263 .manufacture_id = EON_ID_NOPREFIX, 5264 .model_id = EON_EN25QH128, 5265 .total_size = 16384, 5266 .page_size = 256, 5267 /* supports SFDP */ 5268 /* OTP: 512B total; enter 0x3A */ 5269 /* QPI enable 0x38, disable 0xFF */ 5270 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5271 .tested = TEST_OK_PREW, 5272 .probe = PROBE_SPI_RDID, 5273 .probe_timing = TIMING_ZERO, 5274 .block_erasers = 5275 { 5276 { 5277 .eraseblocks = { {4 * 1024, 4096} }, 5278 .block_erase = SPI_BLOCK_ERASE_20, 5279 }, { 5280 .eraseblocks = { {64 * 1024, 256} }, 5281 .block_erase = SPI_BLOCK_ERASE_D8, 5282 }, { 5283 .eraseblocks = { { 16384 * 1024, 1} }, 5284 .block_erase = SPI_BLOCK_ERASE_60, 5285 }, { 5286 .eraseblocks = { { 16384 * 1024, 1} }, 5287 .block_erase = SPI_BLOCK_ERASE_C7, 5288 } 5289 }, 5290 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5291 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5292 .write = SPI_CHIP_WRITE256, 5293 .read = SPI_CHIP_READ, 5294 .voltage = {2700, 3600}, 5295 .reg_bits = 5296 { 5297 .srp = {STATUS1, 7, RW}, 5298 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 5299 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 5300 }, 5301 .decode_range = DECODE_RANGE_SPI25, 5302 }, 5303 5304 { 5305 .vendor = "Eon", 5306 .name = "EN25QH16", 5307 .bustype = BUS_SPI, 5308 .manufacture_id = EON_ID_NOPREFIX, 5309 .model_id = EON_EN25QH16, 5310 .total_size = 2048, 5311 .page_size = 256, 5312 /* supports SFDP */ 5313 /* OTP: 512B total; enter 0x3A */ 5314 /* QPI enable 0x38, disable 0xFF */ 5315 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5316 .tested = TEST_OK_PREW, 5317 .probe = PROBE_SPI_RDID, 5318 .probe_timing = TIMING_ZERO, 5319 .block_erasers = 5320 { 5321 { 5322 .eraseblocks = { {4 * 1024, 512} }, 5323 .block_erase = SPI_BLOCK_ERASE_20, 5324 }, { 5325 .eraseblocks = { {64 * 1024, 32} }, 5326 .block_erase = SPI_BLOCK_ERASE_D8, 5327 }, { 5328 .eraseblocks = { {1024 * 2048, 1} }, 5329 .block_erase = SPI_BLOCK_ERASE_60, 5330 }, { 5331 .eraseblocks = { {1024 * 2048, 1} }, 5332 .block_erase = SPI_BLOCK_ERASE_C7, 5333 } 5334 }, 5335 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5336 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5337 .write = SPI_CHIP_WRITE256, 5338 .read = SPI_CHIP_READ, 5339 .voltage = {2700, 3600}, 5340 }, 5341 5342 { 5343 .vendor = "Eon", 5344 .name = "EN25QH32", 5345 .bustype = BUS_SPI, 5346 .manufacture_id = EON_ID_NOPREFIX, 5347 .model_id = EON_EN25QH32, 5348 .total_size = 4096, 5349 .page_size = 256, 5350 /* supports SFDP */ 5351 /* OTP: 512B total; enter 0x3A */ 5352 /* QPI enable 0x38, disable 0xFF */ 5353 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5354 .tested = TEST_OK_PREW, 5355 .probe = PROBE_SPI_RDID, 5356 .probe_timing = TIMING_ZERO, 5357 .block_erasers = 5358 { 5359 { 5360 .eraseblocks = { {4 * 1024, 1024} }, 5361 .block_erase = SPI_BLOCK_ERASE_20, 5362 }, { 5363 .eraseblocks = { {64 * 1024, 64} }, 5364 .block_erase = SPI_BLOCK_ERASE_D8, 5365 }, { 5366 .eraseblocks = { {1024 * 4096, 1} }, 5367 .block_erase = SPI_BLOCK_ERASE_60, 5368 }, { 5369 .eraseblocks = { {1024 * 4096, 1} }, 5370 .block_erase = SPI_BLOCK_ERASE_C7, 5371 } 5372 }, 5373 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5374 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5375 .write = SPI_CHIP_WRITE256, 5376 .read = SPI_CHIP_READ, 5377 .voltage = {2700, 3600}, 5378 .reg_bits = 5379 { 5380 .srp = {STATUS1, 7, RW}, 5381 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 5382 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 5383 }, 5384 .decode_range = DECODE_RANGE_SPI25, 5385 }, 5386 5387 { 5388 .vendor = "Eon", 5389 .name = "EN25QH32B", 5390 .bustype = BUS_SPI, 5391 .manufacture_id = EON_ID_NOPREFIX, 5392 .model_id = EON_EN25QH32, 5393 .total_size = 4096, 5394 .page_size = 256, 5395 /* supports SFDP */ 5396 /* OTP: 1536B total; enter 0x3A */ 5397 /* QPI enable 0x38, disable 0xFF */ 5398 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5399 .tested = TEST_OK_PREW, 5400 .probe = PROBE_SPI_RDID, 5401 .probe_timing = TIMING_ZERO, 5402 .block_erasers = 5403 { 5404 { 5405 .eraseblocks = { {4 * 1024, 1024} }, 5406 .block_erase = SPI_BLOCK_ERASE_20, 5407 }, { 5408 .eraseblocks = { {32 * 1024, 128} }, 5409 .block_erase = SPI_BLOCK_ERASE_52, 5410 }, { 5411 .eraseblocks = { {64 * 1024, 64} }, 5412 .block_erase = SPI_BLOCK_ERASE_D8, 5413 }, { 5414 .eraseblocks = { {1024 * 4096, 1} }, 5415 .block_erase = SPI_BLOCK_ERASE_60, 5416 }, { 5417 .eraseblocks = { {1024 * 4096, 1} }, 5418 .block_erase = SPI_BLOCK_ERASE_C7, 5419 } 5420 }, 5421 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5422 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5423 .write = SPI_CHIP_WRITE256, 5424 .read = SPI_CHIP_READ, 5425 .voltage = {2700, 3600}, 5426 }, 5427 5428 { 5429 .vendor = "Eon", 5430 .name = "EN25QH64", 5431 .bustype = BUS_SPI, 5432 .manufacture_id = EON_ID_NOPREFIX, 5433 .model_id = EON_EN25QH64, 5434 .total_size = 8192, 5435 .page_size = 256, 5436 /* supports SFDP */ 5437 /* OTP: 512B total; enter 0x3A */ 5438 /* QPI enable 0x38, disable 0xFF */ 5439 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5440 .tested = TEST_OK_PREW, 5441 .probe = PROBE_SPI_RDID, 5442 .probe_timing = TIMING_ZERO, 5443 .block_erasers = 5444 { 5445 { 5446 .eraseblocks = { {4 * 1024, 2048} }, 5447 .block_erase = SPI_BLOCK_ERASE_20, 5448 }, { 5449 .eraseblocks = { {64 * 1024, 128} }, 5450 .block_erase = SPI_BLOCK_ERASE_D8, 5451 }, { 5452 .eraseblocks = { { 8192 * 1024, 1} }, 5453 .block_erase = SPI_BLOCK_ERASE_60, 5454 }, { 5455 .eraseblocks = { { 8192 * 1024, 1} }, 5456 .block_erase = SPI_BLOCK_ERASE_C7, 5457 } 5458 }, 5459 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5460 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5461 .write = SPI_CHIP_WRITE256, 5462 .read = SPI_CHIP_READ, 5463 .voltage = {2700, 3600}, 5464 .reg_bits = 5465 { 5466 .srp = {STATUS1, 7, RW}, 5467 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 5468 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 5469 }, 5470 .decode_range = DECODE_RANGE_SPI25_64K_BLOCK, 5471 }, 5472 5473 { 5474 .vendor = "Eon", 5475 .name = "EN25QH64A", 5476 .bustype = BUS_SPI, 5477 .manufacture_id = EON_ID_NOPREFIX, 5478 .model_id = EON_EN25QH64, 5479 .total_size = 8192, 5480 .page_size = 256, 5481 /* supports SFDP */ 5482 /* OTP: 512B total; enter 0x3A */ 5483 /* QPI enable 0x38, disable 0xFF */ 5484 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5485 .tested = TEST_OK_PREW, 5486 .probe = PROBE_SPI_RDID, 5487 .probe_timing = TIMING_ZERO, 5488 .block_erasers = 5489 { 5490 { 5491 .eraseblocks = { {4 * 1024, 2048} }, 5492 .block_erase = SPI_BLOCK_ERASE_20, 5493 }, { 5494 .eraseblocks = { {32 * 1024, 256} }, 5495 .block_erase = SPI_BLOCK_ERASE_52, 5496 }, { 5497 .eraseblocks = { {64 * 1024, 128} }, 5498 .block_erase = SPI_BLOCK_ERASE_D8, 5499 }, { 5500 .eraseblocks = { { 8192 * 1024, 1} }, 5501 .block_erase = SPI_BLOCK_ERASE_60, 5502 }, { 5503 .eraseblocks = { { 8192 * 1024, 1} }, 5504 .block_erase = SPI_BLOCK_ERASE_C7, 5505 } 5506 }, 5507 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 5508 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5509 .write = SPI_CHIP_WRITE256, 5510 .read = SPI_CHIP_READ, 5511 .voltage = {2700, 3600}, 5512 }, 5513 5514 { 5515 .vendor = "Eon", 5516 .name = "EN25S10", 5517 .bustype = BUS_SPI, 5518 .manufacture_id = EON_ID_NOPREFIX, 5519 .model_id = EON_EN25S10, 5520 .total_size = 128, 5521 .page_size = 256, 5522 /* OTP: 256B total; enter 0x3A */ 5523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5524 .tested = TEST_UNTESTED, 5525 .probe = PROBE_SPI_RDID, 5526 .probe_timing = TIMING_ZERO, 5527 .block_erasers = 5528 { 5529 { 5530 .eraseblocks = { {4 * 1024, 32} }, 5531 .block_erase = SPI_BLOCK_ERASE_20, 5532 }, { 5533 .eraseblocks = { {32 * 1024, 4} }, 5534 .block_erase = SPI_BLOCK_ERASE_52, 5535 }, { 5536 .eraseblocks = { {128 * 1024, 1} }, 5537 .block_erase = SPI_BLOCK_ERASE_60, 5538 }, { 5539 .eraseblocks = { {128 * 1024, 1} }, 5540 .block_erase = SPI_BLOCK_ERASE_C7, 5541 } 5542 }, 5543 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 5544 .unlock = SPI_DISABLE_BLOCKPROTECT, 5545 .write = SPI_CHIP_WRITE256, 5546 .read = SPI_CHIP_READ, 5547 .voltage = {1650, 1950}, 5548 }, 5549 5550 { 5551 .vendor = "Eon", 5552 .name = "EN25S16", 5553 .bustype = BUS_SPI, 5554 .manufacture_id = EON_ID_NOPREFIX, 5555 .model_id = EON_EN25S16, 5556 .total_size = 2048, 5557 .page_size = 256, 5558 /* OTP: 512B total; enter 0x3A */ 5559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5560 .tested = TEST_UNTESTED, 5561 .probe = PROBE_SPI_RDID, 5562 .probe_timing = TIMING_ZERO, 5563 .block_erasers = 5564 { 5565 { 5566 .eraseblocks = { {4 * 1024, 512} }, 5567 .block_erase = SPI_BLOCK_ERASE_20, 5568 }, { 5569 .eraseblocks = { {32 * 1024, 64} }, 5570 .block_erase = SPI_BLOCK_ERASE_D8, 5571 }, { 5572 .eraseblocks = { {64 * 1024, 32} }, 5573 .block_erase = SPI_BLOCK_ERASE_52, 5574 }, { 5575 .eraseblocks = { {2048 * 1024, 1} }, 5576 .block_erase = SPI_BLOCK_ERASE_60, 5577 }, { 5578 .eraseblocks = { {2048 * 1024, 1} }, 5579 .block_erase = SPI_BLOCK_ERASE_C7, 5580 } 5581 }, 5582 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_EN25S_WP, 5583 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5584 .write = SPI_CHIP_WRITE256, 5585 .read = SPI_CHIP_READ, 5586 .voltage = {1650, 1950}, 5587 }, 5588 5589 { 5590 .vendor = "Eon", 5591 .name = "EN25S20", 5592 .bustype = BUS_SPI, 5593 .manufacture_id = EON_ID_NOPREFIX, 5594 .model_id = EON_EN25S20, 5595 .total_size = 256, 5596 .page_size = 256, 5597 /* OTP: 256B total; enter 0x3A */ 5598 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5599 .tested = TEST_UNTESTED, 5600 .probe = PROBE_SPI_RDID, 5601 .probe_timing = TIMING_ZERO, 5602 .block_erasers = 5603 { 5604 { 5605 .eraseblocks = { {4 * 1024, 64} }, 5606 .block_erase = SPI_BLOCK_ERASE_20, 5607 }, { 5608 .eraseblocks = { {64 * 1024, 4} }, 5609 .block_erase = SPI_BLOCK_ERASE_D8, 5610 }, { 5611 .eraseblocks = { {256 * 1024, 1} }, 5612 .block_erase = SPI_BLOCK_ERASE_60, 5613 }, { 5614 .eraseblocks = { {256 * 1024, 1} }, 5615 .block_erase = SPI_BLOCK_ERASE_C7, 5616 } 5617 }, 5618 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 5619 .unlock = SPI_DISABLE_BLOCKPROTECT, 5620 .write = SPI_CHIP_WRITE256, 5621 .read = SPI_CHIP_READ, 5622 .voltage = {1650, 1950}, 5623 }, 5624 5625 { 5626 .vendor = "Eon", 5627 .name = "EN25S32", 5628 .bustype = BUS_SPI, 5629 .manufacture_id = EON_ID_NOPREFIX, 5630 .model_id = EON_EN25S32, 5631 .total_size = 4096, 5632 .page_size = 256, 5633 /* OTP: 512B total; enter 0x3A */ 5634 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5635 .tested = TEST_UNTESTED, 5636 .probe = PROBE_SPI_RDID, 5637 .probe_timing = TIMING_ZERO, 5638 .block_erasers = 5639 { 5640 { 5641 .eraseblocks = { {4 * 1024, 1024} }, 5642 .block_erase = SPI_BLOCK_ERASE_20, 5643 }, { 5644 .eraseblocks = { {32 * 1024, 128} }, 5645 .block_erase = SPI_BLOCK_ERASE_52, 5646 }, { 5647 .eraseblocks = { {64 * 1024, 64} }, 5648 .block_erase = SPI_BLOCK_ERASE_D8, 5649 }, { 5650 .eraseblocks = { {4096 * 1024, 1} }, 5651 .block_erase = SPI_BLOCK_ERASE_60, 5652 }, { 5653 .eraseblocks = { {4096 * 1024, 1} }, 5654 .block_erase = SPI_BLOCK_ERASE_C7, 5655 } 5656 }, 5657 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_EN25S_WP, 5658 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5659 .write = SPI_CHIP_WRITE256, 5660 .read = SPI_CHIP_READ, 5661 .voltage = {1650, 1950}, 5662 }, 5663 5664 { 5665 .vendor = "Eon", 5666 .name = "EN25S40", 5667 .bustype = BUS_SPI, 5668 .manufacture_id = EON_ID_NOPREFIX, 5669 .model_id = EON_EN25S40, 5670 .total_size = 512, 5671 .page_size = 256, 5672 /* OTP: 256B total; enter 0x3A */ 5673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5674 .tested = TEST_OK_PREW, 5675 .probe = PROBE_SPI_RDID, 5676 .probe_timing = TIMING_ZERO, 5677 .block_erasers = 5678 { 5679 { 5680 .eraseblocks = { {4 * 1024, 128} }, 5681 .block_erase = SPI_BLOCK_ERASE_20, 5682 }, { 5683 .eraseblocks = { {64 * 1024, 8} }, 5684 .block_erase = SPI_BLOCK_ERASE_D8, 5685 }, { 5686 .eraseblocks = { {512 * 1024, 1} }, 5687 .block_erase = SPI_BLOCK_ERASE_60, 5688 }, { 5689 .eraseblocks = { {512 * 1024, 1} }, 5690 .block_erase = SPI_BLOCK_ERASE_C7, 5691 } 5692 }, 5693 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 5694 .unlock = SPI_DISABLE_BLOCKPROTECT, 5695 .write = SPI_CHIP_WRITE256, 5696 .read = SPI_CHIP_READ, 5697 .voltage = {1650, 1950}, 5698 }, 5699 5700 { 5701 .vendor = "Eon", 5702 .name = "EN25S64", 5703 .bustype = BUS_SPI, 5704 .manufacture_id = EON_ID_NOPREFIX, 5705 .model_id = EON_EN25S64, 5706 .total_size = 8192, 5707 .page_size = 256, 5708 /* OTP: 512B total; enter 0x3A */ 5709 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 5710 .tested = TEST_OK_PREW, 5711 .probe = PROBE_SPI_RDID, 5712 .probe_timing = TIMING_ZERO, 5713 .block_erasers = 5714 { 5715 { 5716 .eraseblocks = { {4 * 1024, 2048} }, 5717 .block_erase = SPI_BLOCK_ERASE_20, 5718 }, { 5719 .eraseblocks = { {64 * 1024, 128} }, 5720 .block_erase = SPI_BLOCK_ERASE_D8, 5721 }, { 5722 .eraseblocks = { {8192 * 1024, 1} }, 5723 .block_erase = SPI_BLOCK_ERASE_60, 5724 }, { 5725 .eraseblocks = { {8192 * 1024, 1} }, 5726 .block_erase = SPI_BLOCK_ERASE_C7, 5727 } 5728 }, 5729 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_EN25S_WP, 5730 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 5731 .write = SPI_CHIP_WRITE256, 5732 .read = SPI_CHIP_READ, 5733 .voltage = {1650, 1950}, 5734 }, 5735 5736 { 5737 .vendor = "Eon", 5738 .name = "EN25S80", 5739 .bustype = BUS_SPI, 5740 .manufacture_id = EON_ID_NOPREFIX, 5741 .model_id = EON_EN25S80, 5742 .total_size = 1024, 5743 .page_size = 256, 5744 /* OTP: 256B total; enter 0x3A */ 5745 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 5746 .tested = TEST_UNTESTED, 5747 .probe = PROBE_SPI_RDID, 5748 .probe_timing = TIMING_ZERO, 5749 .block_erasers = 5750 { 5751 { 5752 .eraseblocks = { {4 * 1024, 256} }, 5753 .block_erase = SPI_BLOCK_ERASE_20, 5754 }, { 5755 .eraseblocks = { {64 * 1024, 16} }, 5756 .block_erase = SPI_BLOCK_ERASE_D8, 5757 }, { 5758 .eraseblocks = { {1024 * 1024, 1} }, 5759 .block_erase = SPI_BLOCK_ERASE_60, 5760 }, { 5761 .eraseblocks = { {1024 * 1024, 1} }, 5762 .block_erase = SPI_BLOCK_ERASE_C7, 5763 } 5764 }, 5765 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 5766 .unlock = SPI_DISABLE_BLOCKPROTECT, 5767 .write = SPI_CHIP_WRITE256, 5768 .read = SPI_CHIP_READ, 5769 .voltage = {1650, 1950}, 5770 }, 5771 5772 { 5773 .vendor = "Eon", 5774 .name = "EN29F002(A)(N)B", 5775 .bustype = BUS_PARALLEL, 5776 .manufacture_id = EON_ID, 5777 .model_id = EON_EN29F002B, 5778 .total_size = 256, 5779 .page_size = 256, 5780 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 5781 .tested = TEST_OK_PREW, 5782 .probe = PROBE_JEDEC, 5783 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5784 .block_erasers = 5785 { 5786 { 5787 .eraseblocks = { 5788 {16 * 1024, 1}, 5789 {8 * 1024, 2}, 5790 {32 * 1024, 1}, 5791 {64 * 1024, 3}, 5792 }, 5793 .block_erase = JEDEC_SECTOR_ERASE, 5794 }, { 5795 .eraseblocks = { {256 * 1024, 1} }, 5796 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5797 }, 5798 }, 5799 .write = WRITE_JEDEC1, 5800 .read = READ_MEMMAPPED, 5801 .voltage = {4500, 5500}, 5802 }, 5803 5804 { 5805 .vendor = "Eon", 5806 .name = "EN29F002(A)(N)T", 5807 .bustype = BUS_PARALLEL, 5808 .manufacture_id = EON_ID, 5809 .model_id = EON_EN29F002T, 5810 .total_size = 256, 5811 .page_size = 256, 5812 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 5813 .tested = TEST_OK_PREW, 5814 .probe = PROBE_JEDEC, 5815 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5816 .block_erasers = 5817 { 5818 { 5819 .eraseblocks = { 5820 {64 * 1024, 3}, 5821 {32 * 1024, 1}, 5822 {8 * 1024, 2}, 5823 {16 * 1024, 1}, 5824 }, 5825 .block_erase = JEDEC_SECTOR_ERASE, 5826 }, { 5827 .eraseblocks = { {256 * 1024, 1} }, 5828 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5829 }, 5830 }, 5831 .write = WRITE_JEDEC1, 5832 .read = READ_MEMMAPPED, 5833 .voltage = {4500, 5500}, 5834 }, 5835 5836 { 5837 .vendor = "Eon", 5838 .name = "EN29F010", 5839 .bustype = BUS_PARALLEL, 5840 .manufacture_id = EON_ID, 5841 .model_id = EON_EN29F010, 5842 .total_size = 128, 5843 .page_size = 128, 5844 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 5845 .tested = TEST_OK_PRE, 5846 .probe = PROBE_JEDEC, 5847 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 5848 .block_erasers = 5849 { 5850 { 5851 .eraseblocks = { {16 * 1024, 8} }, 5852 .block_erase = JEDEC_SECTOR_ERASE, 5853 }, 5854 { 5855 .eraseblocks = { {128 * 1024, 1} }, 5856 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5857 }, 5858 }, 5859 .write = WRITE_JEDEC1, 5860 .read = READ_MEMMAPPED, 5861 .voltage = {4500, 5500}, 5862 }, 5863 5864 { 5865 .vendor = "Eon", 5866 .name = "EN29GL064(A)B", 5867 .bustype = BUS_PARALLEL, 5868 .manufacture_id = EON_ID, 5869 .model_id = EON_EN29GL064B, 5870 .total_size = 8192, 5871 .page_size = 128 * 1024, /* actual page size is 16 */ 5872 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5873 .tested = TEST_UNTESTED, 5874 .probe = PROBE_JEDEC_29GL, 5875 .probe_timing = TIMING_ZERO, 5876 .block_erasers = 5877 { 5878 { 5879 .eraseblocks = { 5880 {8 * 1024, 8}, 5881 {64 * 1024, 127}, 5882 }, 5883 .block_erase = JEDEC_SECTOR_ERASE, 5884 }, { 5885 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5886 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5887 }, 5888 }, 5889 .write = WRITE_JEDEC1, 5890 .read = READ_MEMMAPPED, 5891 .voltage = {2700, 3600}, 5892 }, 5893 5894 { 5895 .vendor = "Eon", 5896 .name = "EN29GL064(A)T", 5897 .bustype = BUS_PARALLEL, 5898 .manufacture_id = EON_ID, 5899 .model_id = EON_EN29GL064T, 5900 .total_size = 8192, 5901 .page_size = 128 * 1024, /* actual page size is 16 */ 5902 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5903 .tested = TEST_UNTESTED, 5904 .probe = PROBE_JEDEC_29GL, 5905 .probe_timing = TIMING_ZERO, 5906 .block_erasers = 5907 { 5908 { 5909 .eraseblocks = { 5910 {64 * 1024, 127}, 5911 {8 * 1024, 8}, 5912 }, 5913 .block_erase = JEDEC_SECTOR_ERASE, 5914 }, { 5915 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5916 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5917 }, 5918 }, 5919 .write = WRITE_JEDEC1, 5920 .read = READ_MEMMAPPED, 5921 .voltage = {2700, 3600}, 5922 }, 5923 5924 { 5925 .vendor = "Eon", 5926 .name = "EN29GL064H/L", 5927 .bustype = BUS_PARALLEL, 5928 .manufacture_id = EON_ID, 5929 .model_id = EON_EN29GL064HL, 5930 .total_size = 8192, 5931 .page_size = 128 * 1024, /* actual page size is 16 */ 5932 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5933 .tested = TEST_UNTESTED, 5934 .probe = PROBE_JEDEC_29GL, 5935 .probe_timing = TIMING_ZERO, 5936 .block_erasers = 5937 { 5938 { 5939 .eraseblocks = { {64 * 1024, 128} }, 5940 .block_erase = JEDEC_SECTOR_ERASE, 5941 }, { 5942 .eraseblocks = { {8 * 1024 * 1024, 1} }, 5943 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5944 }, 5945 }, 5946 .write = WRITE_JEDEC1, 5947 .read = READ_MEMMAPPED, 5948 .voltage = {2700, 3600}, 5949 }, 5950 5951 { 5952 .vendor = "Eon", 5953 .name = "EN29GL128", 5954 .bustype = BUS_PARALLEL, 5955 .manufacture_id = EON_ID, 5956 .model_id = EON_EN29GL128HL, 5957 .total_size = 16384, 5958 .page_size = 128 * 1024, /* actual page size is 16 */ 5959 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 5960 .tested = TEST_UNTESTED, 5961 .probe = PROBE_JEDEC_29GL, 5962 .probe_timing = TIMING_ZERO, 5963 .block_erasers = 5964 { 5965 { 5966 .eraseblocks = { {128 * 1024, 128} }, 5967 .block_erase = JEDEC_SECTOR_ERASE, 5968 }, { 5969 .eraseblocks = { {16 * 1024 * 1024, 1} }, 5970 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5971 }, 5972 }, 5973 .write = WRITE_JEDEC1, 5974 .read = READ_MEMMAPPED, 5975 .voltage = {2700, 3600}, 5976 }, 5977 5978 { 5979 .vendor = "Eon", 5980 .name = "EN29LV040(A)", 5981 .bustype = BUS_PARALLEL, 5982 .manufacture_id = EON_ID, 5983 .model_id = EON_EN29LV040, 5984 .total_size = 512, 5985 .page_size = 4 * 1024, 5986 .tested = TEST_OK_PREW, 5987 .probe = PROBE_JEDEC, 5988 .probe_timing = TIMING_ZERO, 5989 .block_erasers = 5990 { 5991 { 5992 .eraseblocks = { {64 * 1024, 8} }, 5993 .block_erase = JEDEC_SECTOR_ERASE, 5994 }, 5995 { 5996 .eraseblocks = { {512 * 1024, 1} }, 5997 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 5998 }, 5999 }, 6000 .write = WRITE_JEDEC1, 6001 .read = READ_MEMMAPPED, 6002 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */ 6003 }, 6004 6005 { 6006 .vendor = "Eon", 6007 .name = "EN29LV640B", 6008 .bustype = BUS_PARALLEL, 6009 .manufacture_id = EON_ID, 6010 .model_id = EON_EN29LV640B, 6011 .total_size = 8192, 6012 .page_size = 8192, 6013 .feature_bits = FEATURE_ADDR_SHIFTED, 6014 .tested = TEST_OK_PREW, 6015 .probe = PROBE_EN29LV640B, 6016 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 6017 .block_erasers = 6018 { 6019 { 6020 .eraseblocks = { 6021 {8 * 1024, 8}, 6022 {64 * 1024, 127}, 6023 }, 6024 .block_erase = JEDEC_BLOCK_ERASE, 6025 }, { 6026 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6027 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6028 }, 6029 }, 6030 .write = WRITE_EN29LV640B, 6031 .read = READ_MEMMAPPED, 6032 .voltage = {2700, 3600}, 6033 }, 6034 6035 { 6036 .vendor = "Fudan", 6037 .name = "FM25F005", 6038 .bustype = BUS_SPI, 6039 .manufacture_id = FUDAN_ID_NOPREFIX, 6040 .model_id = FUDAN_FM25F005, 6041 .total_size = 64, 6042 .page_size = 256, 6043 /* OTP: 256B total; enter 0x3A */ 6044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6045 .tested = TEST_UNTESTED, 6046 .probe = PROBE_SPI_RDID, 6047 .probe_timing = TIMING_ZERO, 6048 .block_erasers = { 6049 { 6050 .eraseblocks = { {4 * 1024, 16} }, 6051 .block_erase = SPI_BLOCK_ERASE_20, 6052 }, { 6053 .eraseblocks = { {32 * 1024, 2} }, 6054 .block_erase = SPI_BLOCK_ERASE_52, 6055 }, { 6056 .eraseblocks = { {64 * 1024, 1} }, 6057 .block_erase = SPI_BLOCK_ERASE_D8, 6058 }, { 6059 .eraseblocks = { {64 * 1024, 1} }, 6060 .block_erase = SPI_BLOCK_ERASE_60, 6061 }, { 6062 .eraseblocks = { {64 * 1024, 1} }, 6063 .block_erase = SPI_BLOCK_ERASE_C7, 6064 } 6065 }, 6066 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 6067 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6068 .write = SPI_CHIP_WRITE256, 6069 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O (0x3B) supported */ 6070 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */ 6071 }, 6072 6073 { 6074 .vendor = "Fudan", 6075 .name = "FM25F01", 6076 .bustype = BUS_SPI, 6077 .manufacture_id = FUDAN_ID_NOPREFIX, 6078 .model_id = FUDAN_FM25F01, 6079 .total_size = 128, 6080 .page_size = 256, 6081 /* OTP: 256B total; enter 0x3A */ 6082 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6083 .tested = TEST_OK_PREW, 6084 .probe = PROBE_SPI_RDID, 6085 .probe_timing = TIMING_ZERO, 6086 .block_erasers = { 6087 { 6088 .eraseblocks = { {4 * 1024, 32} }, 6089 .block_erase = SPI_BLOCK_ERASE_20, 6090 }, { 6091 .eraseblocks = { {32 * 1024, 4} }, 6092 .block_erase = SPI_BLOCK_ERASE_52, 6093 }, { 6094 .eraseblocks = { {64 * 1024, 2} }, 6095 .block_erase = SPI_BLOCK_ERASE_D8, 6096 }, { 6097 .eraseblocks = { {128 * 1024, 1} }, 6098 .block_erase = SPI_BLOCK_ERASE_60, 6099 }, { 6100 .eraseblocks = { {128 * 1024, 1} }, 6101 .block_erase = SPI_BLOCK_ERASE_C7, 6102 } 6103 }, 6104 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 6105 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6106 .write = SPI_CHIP_WRITE256, 6107 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O (0x3B) supported */ 6108 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */ 6109 }, 6110 6111 { 6112 .vendor = "Fudan", 6113 .name = "FM25F02(A)", 6114 .bustype = BUS_SPI, 6115 .manufacture_id = FUDAN_ID_NOPREFIX, 6116 .model_id = FUDAN_FM25F02, 6117 .total_size = 256, 6118 .page_size = 256, 6119 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */ 6120 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6121 .tested = TEST_UNTESTED, 6122 .probe = PROBE_SPI_RDID, 6123 .probe_timing = TIMING_ZERO, 6124 .block_erasers = { 6125 { 6126 .eraseblocks = { {4 * 1024, 64} }, 6127 .block_erase = SPI_BLOCK_ERASE_20, 6128 }, { 6129 .eraseblocks = { {32 * 1024, 8} }, 6130 .block_erase = SPI_BLOCK_ERASE_52, 6131 }, { 6132 .eraseblocks = { {64 * 1024, 4} }, 6133 .block_erase = SPI_BLOCK_ERASE_D8, 6134 }, { 6135 .eraseblocks = { {1024 * 256, 1} }, 6136 .block_erase = SPI_BLOCK_ERASE_60, 6137 }, { 6138 .eraseblocks = { {1024 * 256, 1} }, 6139 .block_erase = SPI_BLOCK_ERASE_C7, 6140 }, 6141 }, 6142 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 6143 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6144 .write = SPI_CHIP_WRITE256, 6145 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O (0x3B) supported */ 6146 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */ 6147 }, 6148 6149 { 6150 .vendor = "Fudan", 6151 .name = "FM25F04(A)", 6152 .bustype = BUS_SPI, 6153 .manufacture_id = FUDAN_ID_NOPREFIX, 6154 .model_id = FUDAN_FM25F04, 6155 .total_size = 512, 6156 .page_size = 256, 6157 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */ 6158 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6159 .tested = TEST_UNTESTED, 6160 .probe = PROBE_SPI_RDID, 6161 .probe_timing = TIMING_ZERO, 6162 .block_erasers = { 6163 { 6164 .eraseblocks = { {4 * 1024, 128} }, 6165 .block_erase = SPI_BLOCK_ERASE_20, 6166 }, { 6167 .eraseblocks = { {32 * 1024, 16} }, 6168 .block_erase = SPI_BLOCK_ERASE_52, 6169 }, { 6170 .eraseblocks = { {64 * 1024, 8} }, 6171 .block_erase = SPI_BLOCK_ERASE_D8, 6172 }, { 6173 .eraseblocks = { {1024 * 512, 1} }, 6174 .block_erase = SPI_BLOCK_ERASE_60, 6175 }, { 6176 .eraseblocks = { {1024 * 512, 1} }, 6177 .block_erase = SPI_BLOCK_ERASE_C7, 6178 }, 6179 }, 6180 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 6181 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6182 .write = SPI_CHIP_WRITE256, 6183 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O (0x3B) supported */ 6184 .voltage = {2700, 3600}, 6185 }, 6186 6187 { 6188 .vendor = "Fudan", 6189 .name = "FM25Q04", 6190 .bustype = BUS_SPI, 6191 .manufacture_id = FUDAN_ID_NOPREFIX, 6192 .model_id = FUDAN_FM25Q04, 6193 .total_size = 512, 6194 .page_size = 256, 6195 /* supports SFDP */ 6196 /* QPI enable 0x38, disable 0xFF */ 6197 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6198 .tested = TEST_UNTESTED, 6199 .probe = PROBE_SPI_RDID, 6200 .probe_timing = TIMING_ZERO, 6201 .block_erasers = { 6202 { 6203 /* 128 * 4KB sectors */ 6204 .eraseblocks = { {4 * 1024, 128} }, 6205 .block_erase = SPI_BLOCK_ERASE_20, 6206 }, { 6207 /* 16 * 32KB blocks */ 6208 .eraseblocks = { {32 * 1024, 16} }, 6209 .block_erase = SPI_BLOCK_ERASE_52, 6210 }, { 6211 /* 8 * 64KB blocks */ 6212 .eraseblocks = { {64 * 1024, 8} }, 6213 .block_erase = SPI_BLOCK_ERASE_D8, 6214 }, { 6215 /* Full chip erase (0x60) */ 6216 .eraseblocks = { {512 * 1024, 1} }, 6217 .block_erase = SPI_BLOCK_ERASE_60, 6218 }, { 6219 /* Full chip erase (0xC7) */ 6220 .eraseblocks = { {512 * 1024, 1} }, 6221 .block_erase = SPI_BLOCK_ERASE_C7, 6222 }, 6223 }, 6224 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 6225 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6226 .write = SPI_CHIP_WRITE256, 6227 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6228 .voltage = {2700, 3600}, 6229 }, 6230 6231 { 6232 .vendor = "Fudan", 6233 .name = "FM25Q08", 6234 .bustype = BUS_SPI, 6235 .manufacture_id = FUDAN_ID_NOPREFIX, 6236 .model_id = FUDAN_FM25Q08, 6237 .total_size = 1024, 6238 .page_size = 256, 6239 /* supports SFDP */ 6240 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 6241 /* QPI enable 0x38, disable 0xFF */ 6242 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6243 .tested = TEST_OK_PREW, 6244 .probe = PROBE_SPI_RDID, 6245 .probe_timing = TIMING_ZERO, 6246 .block_erasers = { 6247 { 6248 .eraseblocks = { {4 * 1024, 256} }, 6249 .block_erase = SPI_BLOCK_ERASE_20, 6250 }, { 6251 .eraseblocks = { {32 * 1024, 32} }, 6252 .block_erase = SPI_BLOCK_ERASE_52, 6253 }, { 6254 .eraseblocks = { {64 * 1024, 16} }, 6255 .block_erase = SPI_BLOCK_ERASE_D8, 6256 }, { 6257 .eraseblocks = { {1024 * 1024, 1} }, 6258 .block_erase = SPI_BLOCK_ERASE_60, 6259 }, { 6260 .eraseblocks = { {1024 * 1024, 1} }, 6261 .block_erase = SPI_BLOCK_ERASE_C7, 6262 }, 6263 }, 6264 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, /* bit6 selects size of protected blocks; TODO: SR2 */ 6265 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6266 .write = SPI_CHIP_WRITE256, 6267 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6268 .voltage = {2700, 3600}, 6269 }, 6270 6271 { 6272 .vendor = "Fudan", 6273 .name = "FM25Q16", 6274 .bustype = BUS_SPI, 6275 .manufacture_id = FUDAN_ID_NOPREFIX, 6276 .model_id = FUDAN_FM25Q16, 6277 .total_size = 2048, 6278 .page_size = 256, 6279 /* supports SFDP */ 6280 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 6281 /* QPI enable 0x38, disable 0xFF */ 6282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6283 .tested = TEST_OK_PR, 6284 .probe = PROBE_SPI_RDID, 6285 .probe_timing = TIMING_ZERO, 6286 .block_erasers = { 6287 { 6288 .eraseblocks = { {4 * 1024, 512} }, 6289 .block_erase = SPI_BLOCK_ERASE_20, 6290 }, { 6291 .eraseblocks = { {32 * 1024, 64} }, 6292 .block_erase = SPI_BLOCK_ERASE_52, 6293 }, { 6294 .eraseblocks = { {64 * 1024, 32} }, 6295 .block_erase = SPI_BLOCK_ERASE_D8, 6296 }, { 6297 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6298 .block_erase = SPI_BLOCK_ERASE_60, 6299 }, { 6300 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6301 .block_erase = SPI_BLOCK_ERASE_C7, 6302 } 6303 }, 6304 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, /* bit6 selects size of protected blocks; TODO: SR2 */ 6305 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6306 .write = SPI_CHIP_WRITE256, 6307 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6308 .voltage = {2700, 3600}, 6309 }, 6310 6311 { 6312 .vendor = "Fudan", 6313 .name = "FM25Q32", 6314 .bustype = BUS_SPI, 6315 .manufacture_id = FUDAN_ID_NOPREFIX, 6316 .model_id = FUDAN_FM25Q32, 6317 .total_size = 4096, 6318 .page_size = 256, 6319 /* supports SFDP */ 6320 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 6321 /* QPI enable 0x38, disable 0xFF */ 6322 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6323 .tested = TEST_UNTESTED, 6324 .probe = PROBE_SPI_RDID, 6325 .probe_timing = TIMING_ZERO, 6326 .block_erasers = { 6327 { 6328 .eraseblocks = { {4 * 1024, 1024} }, 6329 .block_erase = SPI_BLOCK_ERASE_20, 6330 }, { 6331 .eraseblocks = { {32 * 1024, 128} }, 6332 .block_erase = SPI_BLOCK_ERASE_52, 6333 }, { 6334 .eraseblocks = { {64 * 1024, 64} }, 6335 .block_erase = SPI_BLOCK_ERASE_D8, 6336 }, { 6337 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6338 .block_erase = SPI_BLOCK_ERASE_60, 6339 }, { 6340 .eraseblocks = { {4 * 1024 * 1024, 1} }, 6341 .block_erase = SPI_BLOCK_ERASE_C7, 6342 }, 6343 }, 6344 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, /* bit6 selects size of protected blocks; TODO: SR2 */ 6345 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6346 .write = SPI_CHIP_WRITE256, 6347 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6348 .voltage = {2700, 3600}, 6349 }, 6350 6351 { 6352 .vendor = "Fudan", 6353 .name = "FM25Q64", 6354 .bustype = BUS_SPI, 6355 .manufacture_id = FUDAN_ID_NOPREFIX, 6356 .model_id = FUDAN_FM25Q64, 6357 .total_size = 8192, 6358 .page_size = 256, 6359 /* supports SFDP */ 6360 /* QPI enable 0x38, disable 0xFF */ 6361 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6362 .tested = TEST_UNTESTED, 6363 .probe = PROBE_SPI_RDID, 6364 .probe_timing = TIMING_ZERO, 6365 .block_erasers = { 6366 { 6367 /* 2048 * 4KB sectors */ 6368 .eraseblocks = { {4 * 1024, 2048} }, 6369 .block_erase = SPI_BLOCK_ERASE_20, 6370 }, { 6371 /* 256 * 32KB blocks */ 6372 .eraseblocks = { {32 * 1024, 256} }, 6373 .block_erase = SPI_BLOCK_ERASE_52, 6374 }, { 6375 /* 128 * 64KB blocks */ 6376 .eraseblocks = { {64 * 1024, 128} }, 6377 .block_erase = SPI_BLOCK_ERASE_D8, 6378 }, { 6379 /* Full chip erase (0x60) */ 6380 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6381 .block_erase = SPI_BLOCK_ERASE_60, 6382 }, { 6383 /* Full chip erase (0xC7) */ 6384 .eraseblocks = { {8 * 1024 * 1024, 1} }, 6385 .block_erase = SPI_BLOCK_ERASE_C7, 6386 }, 6387 }, 6388 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, /* bit6 selects size of protected blocks; TODO: SR2 */ 6389 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6390 .write = SPI_CHIP_WRITE256, 6391 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6392 .voltage = {2700, 3600}, 6393 }, 6394 6395 { 6396 .vendor = "Fudan", 6397 .name = "FM25Q128", 6398 .bustype = BUS_SPI, 6399 .manufacture_id = FUDAN_ID_NOPREFIX, 6400 .model_id = FUDAN_FM25Q128, 6401 .total_size = 16384, 6402 .page_size = 256, 6403 /* supports SFDP */ 6404 /* QPI enable 0x38, disable 0xFF */ 6405 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 6406 .tested = TEST_OK_PR, 6407 .probe = PROBE_SPI_RDID, 6408 .probe_timing = TIMING_ZERO, 6409 .block_erasers = { 6410 { 6411 /* 4096 * 4KB sectors */ 6412 .eraseblocks = { {4 * 1024, 4096} }, 6413 .block_erase = SPI_BLOCK_ERASE_20, 6414 }, { 6415 /* 512 * 32KB blocks */ 6416 .eraseblocks = { {32 * 1024, 512} }, 6417 .block_erase = SPI_BLOCK_ERASE_52, 6418 }, { 6419 /* 256 * 64KB blocks */ 6420 .eraseblocks = { {64 * 1024, 256} }, 6421 .block_erase = SPI_BLOCK_ERASE_D8, 6422 }, { 6423 /* Full chip erase (0x60) */ 6424 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6425 .block_erase = SPI_BLOCK_ERASE_60, 6426 }, { 6427 /* Full chip erase (0xC7) */ 6428 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6429 .block_erase = SPI_BLOCK_ERASE_C7, 6430 }, 6431 }, 6432 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, /* bit6 selects size of protected blocks; TODO: SR2 */ 6433 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 6434 .write = SPI_CHIP_WRITE256, 6435 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6436 .voltage = {2700, 3600}, 6437 }, 6438 6439 { 6440 .vendor = "Fujitsu", 6441 .name = "MBM29F004BC", 6442 .bustype = BUS_PARALLEL, 6443 .manufacture_id = FUJITSU_ID, 6444 .model_id = FUJITSU_MBM29F004BC, 6445 .total_size = 512, 6446 .page_size = 64 * 1024, 6447 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 6448 .tested = TEST_UNTESTED, 6449 .probe = PROBE_JEDEC, 6450 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 6451 .block_erasers = 6452 { 6453 { 6454 .eraseblocks = { 6455 {16 * 1024, 1}, 6456 {8 * 1024, 2}, 6457 {32 * 1024, 1}, 6458 {64 * 1024, 7}, 6459 }, 6460 .block_erase = JEDEC_SECTOR_ERASE, 6461 }, { 6462 .eraseblocks = { {512 * 1024, 1} }, 6463 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6464 }, 6465 }, 6466 .write = 0, 6467 .read = READ_MEMMAPPED, 6468 .voltage = {4500, 5500}, 6469 }, 6470 6471 { 6472 .vendor = "Fujitsu", 6473 .name = "MBM29F004TC", 6474 .bustype = BUS_PARALLEL, 6475 .manufacture_id = FUJITSU_ID, 6476 .model_id = FUJITSU_MBM29F004TC, 6477 .total_size = 512, 6478 .page_size = 64 * 1024, 6479 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 6480 .tested = TEST_UNTESTED, 6481 .probe = PROBE_JEDEC, 6482 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 6483 .block_erasers = 6484 { 6485 { 6486 .eraseblocks = { 6487 {64 * 1024, 7}, 6488 {32 * 1024, 1}, 6489 {8 * 1024, 2}, 6490 {16 * 1024, 1}, 6491 }, 6492 .block_erase = JEDEC_SECTOR_ERASE, 6493 }, { 6494 .eraseblocks = { {512 * 1024, 1} }, 6495 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6496 }, 6497 }, 6498 .write = 0, 6499 .read = READ_MEMMAPPED, 6500 .voltage = {4500, 5500}, 6501 }, 6502 6503 { 6504 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 6505 .vendor = "Fujitsu", 6506 .name = "MBM29F400BC", 6507 .bustype = BUS_PARALLEL, 6508 .manufacture_id = FUJITSU_ID, 6509 .model_id = FUJITSU_MBM29F400BC, 6510 .total_size = 512, 6511 .page_size = 64 * 1024, 6512 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 6513 .tested = TEST_UNTESTED, 6514 .probe = PROBE_JEDEC, 6515 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 6516 .block_erasers = 6517 { 6518 { 6519 .eraseblocks = { 6520 {16 * 1024, 1}, 6521 {8 * 1024, 2}, 6522 {32 * 1024, 1}, 6523 {64 * 1024, 7}, 6524 }, 6525 .block_erase = JEDEC_SECTOR_ERASE, 6526 }, { 6527 .eraseblocks = { {512 * 1024, 1} }, 6528 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6529 }, 6530 }, 6531 .write = WRITE_JEDEC1, 6532 .read = READ_MEMMAPPED, 6533 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 6534 }, 6535 6536 { 6537 .vendor = "Fujitsu", 6538 .name = "MBM29F400TC", 6539 .bustype = BUS_PARALLEL, 6540 .manufacture_id = FUJITSU_ID, 6541 .model_id = FUJITSU_MBM29F400TC, 6542 .total_size = 512, 6543 .page_size = 64 * 1024, 6544 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 6545 .tested = TEST_UNTESTED, 6546 .probe = PROBE_JEDEC, 6547 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 6548 .block_erasers = 6549 { 6550 { 6551 .eraseblocks = { 6552 {64 * 1024, 7}, 6553 {32 * 1024, 1}, 6554 {8 * 1024, 2}, 6555 {16 * 1024, 1}, 6556 }, 6557 .block_erase = JEDEC_SECTOR_ERASE, 6558 }, { 6559 .eraseblocks = { {512 * 1024, 1} }, 6560 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6561 }, 6562 }, 6563 .write = WRITE_JEDEC1, 6564 .read = READ_MEMMAPPED, 6565 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */ 6566 }, 6567 6568 { 6569 .vendor = "Fujitsu", 6570 .name = "MBM29LV160BE", 6571 .bustype = BUS_PARALLEL, 6572 .manufacture_id = FUJITSU_ID, 6573 .model_id = FUJITSU_MBM29LV160BE, 6574 .total_size = 2 * 1024, 6575 .page_size = 0, 6576 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET, 6577 .tested = TEST_UNTESTED, 6578 .probe = PROBE_JEDEC, 6579 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 6580 .block_erasers = 6581 { 6582 { 6583 .eraseblocks = { 6584 {16 * 1024, 1}, 6585 {8 * 1024, 2}, 6586 {32 * 1024, 1}, 6587 {64 * 1024, 31}, 6588 }, 6589 .block_erase = JEDEC_BLOCK_ERASE, 6590 }, { 6591 .eraseblocks = { {2048 * 1024, 1} }, 6592 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6593 }, 6594 }, 6595 .write = WRITE_JEDEC1, /* Supports a fast mode too */ 6596 .read = READ_MEMMAPPED, 6597 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */ 6598 }, 6599 6600 { 6601 .vendor = "Fujitsu", 6602 .name = "MBM29LV160TE", 6603 .bustype = BUS_PARALLEL, 6604 .manufacture_id = FUJITSU_ID, 6605 .model_id = FUJITSU_MBM29LV160TE, 6606 .total_size = 2 * 1024, 6607 .page_size = 0, 6608 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET, 6609 .tested = TEST_UNTESTED, 6610 .probe = PROBE_JEDEC, 6611 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 6612 .block_erasers = 6613 { 6614 { 6615 .eraseblocks = { 6616 {64 * 1024, 31}, 6617 {32 * 1024, 1}, 6618 {8 * 1024, 2}, 6619 {16 * 1024, 1}, 6620 }, 6621 .block_erase = JEDEC_BLOCK_ERASE, 6622 }, { 6623 .eraseblocks = { {2048 * 1024, 1} }, 6624 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 6625 }, 6626 }, 6627 .write = WRITE_JEDEC1, /* Supports a fast mode too */ 6628 .read = READ_MEMMAPPED, 6629 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */ 6630 }, 6631 6632 { 6633 .vendor = "GigaDevice", 6634 .name = "GD25B128B/GD25Q128B", 6635 .bustype = BUS_SPI, 6636 .manufacture_id = GIGADEVICE_ID, 6637 .model_id = GIGADEVICE_GD25Q128, 6638 .total_size = 16384, 6639 .page_size = 256, 6640 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6641 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6642 .tested = TEST_OK_PREW, 6643 .probe = PROBE_SPI_RDID, 6644 .probe_timing = TIMING_ZERO, 6645 .block_erasers = 6646 { 6647 { 6648 .eraseblocks = { {4 * 1024, 4096} }, 6649 .block_erase = SPI_BLOCK_ERASE_20, 6650 }, { 6651 .eraseblocks = { {32 * 1024, 512} }, 6652 .block_erase = SPI_BLOCK_ERASE_52, 6653 }, { 6654 .eraseblocks = { {64 * 1024, 256} }, 6655 .block_erase = SPI_BLOCK_ERASE_D8, 6656 }, { 6657 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6658 .block_erase = SPI_BLOCK_ERASE_60, 6659 }, { 6660 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6661 .block_erase = SPI_BLOCK_ERASE_C7, 6662 } 6663 }, 6664 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 6665 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6666 .write = SPI_CHIP_WRITE256, 6667 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6668 .voltage = {2700, 3600}, 6669 }, 6670 6671 { 6672 .vendor = "GigaDevice", 6673 .name = "GD25LF128E", 6674 .bustype = BUS_SPI, 6675 .manufacture_id = GIGADEVICE_ID, 6676 .model_id = GIGADEVICE_GD25LF128E, 6677 .total_size = 16384, 6678 .page_size = 256, 6679 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6680 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, 6681 .tested = TEST_OK_PREWB, 6682 .probe = PROBE_SPI_RDID, 6683 .probe_timing = TIMING_ZERO, 6684 .block_erasers = 6685 { 6686 { 6687 .eraseblocks = { {4 * 1024, 4096} }, 6688 .block_erase = SPI_BLOCK_ERASE_20, 6689 }, { 6690 .eraseblocks = { {32 * 1024, 512} }, 6691 .block_erase = SPI_BLOCK_ERASE_52, 6692 }, { 6693 .eraseblocks = { {64 * 1024, 256} }, 6694 .block_erase = SPI_BLOCK_ERASE_D8, 6695 }, { 6696 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6697 .block_erase = SPI_BLOCK_ERASE_60, 6698 }, { 6699 .eraseblocks = { {16 * 1024 * 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_WRITE256, 6706 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6707 .voltage = {1695, 1950}, 6708 .reg_bits = 6709 { 6710 .srp = {STATUS1, 7, RW}, 6711 .srl = {STATUS2, 0, RW}, 6712 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 6713 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 6714 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 6715 .cmp = {STATUS2, 6, RW}, 6716 }, 6717 .decode_range = DECODE_RANGE_SPI25, 6718 }, 6719 6720 { 6721 .vendor = "GigaDevice", 6722 .name = "GD25LF256F", 6723 .bustype = BUS_SPI, 6724 .manufacture_id = GIGADEVICE_ID, 6725 .model_id = GIGADEVICE_GD25LF256F, 6726 .total_size = 32768, 6727 .page_size = 256, 6728 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6729 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_4BA, 6730 .tested = TEST_OK_PREWB, 6731 .probe = PROBE_SPI_RDID, 6732 .probe_timing = TIMING_ZERO, 6733 .block_erasers = 6734 { 6735 { 6736 .eraseblocks = { {4 * 1024, 8192} }, 6737 .block_erase = SPI_BLOCK_ERASE_21, 6738 }, { 6739 .eraseblocks = { {4 * 1024, 8192} }, 6740 .block_erase = SPI_BLOCK_ERASE_20, 6741 }, { 6742 .eraseblocks = { {32 * 1024, 1024} }, 6743 .block_erase = SPI_BLOCK_ERASE_5C, 6744 }, { 6745 .eraseblocks = { {32 * 1024, 1024} }, 6746 .block_erase = SPI_BLOCK_ERASE_52, 6747 }, { 6748 .eraseblocks = { {64 * 1024, 512} }, 6749 .block_erase = SPI_BLOCK_ERASE_DC, 6750 }, { 6751 .eraseblocks = { {64 * 1024, 512} }, 6752 .block_erase = SPI_BLOCK_ERASE_D8, 6753 }, { 6754 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6755 .block_erase = SPI_BLOCK_ERASE_60, 6756 }, { 6757 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6758 .block_erase = SPI_BLOCK_ERASE_C7, 6759 } 6760 }, 6761 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 6762 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6763 .write = SPI_CHIP_WRITE256, 6764 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6765 .voltage = {1650, 2000}, 6766 .reg_bits = 6767 { 6768 .srp = {STATUS1, 7, RW}, 6769 .srl = {STATUS2, 0, RW}, 6770 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 6771 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 6772 .cmp = {STATUS2, 6, RW}, 6773 }, 6774 .decode_range = DECODE_RANGE_SPI25, 6775 }, 6776 6777 { 6778 .vendor = "GigaDevice", 6779 .name = "GD25LF512MF", 6780 .bustype = BUS_SPI, 6781 .manufacture_id = GIGADEVICE_ID, 6782 .model_id = GIGADEVICE_GD25LF512MF, 6783 .total_size = 65536, 6784 .page_size = 256, 6785 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_4BA, 6786 .tested = TEST_OK_PREWB, 6787 .probe = PROBE_SPI_RDID, 6788 .probe_timing = TIMING_ZERO, 6789 .block_erasers = 6790 { 6791 { 6792 .eraseblocks = { {4 * 1024, 16384} }, 6793 .block_erase = SPI_BLOCK_ERASE_21, 6794 }, { 6795 .eraseblocks = { {4 * 1024, 16384} }, 6796 .block_erase = SPI_BLOCK_ERASE_20, 6797 }, { 6798 .eraseblocks = { {32 * 1024, 2048} }, 6799 .block_erase = SPI_BLOCK_ERASE_5C, 6800 }, { 6801 .eraseblocks = { {32 * 1024, 2048} }, 6802 .block_erase = SPI_BLOCK_ERASE_52, 6803 }, { 6804 .eraseblocks = { {64 * 1024, 1024} }, 6805 .block_erase = SPI_BLOCK_ERASE_DC, 6806 }, { 6807 .eraseblocks = { {64 * 1024, 1024} }, 6808 .block_erase = SPI_BLOCK_ERASE_D8, 6809 }, { 6810 .eraseblocks = { {64 * 1024 * 1024, 1} }, 6811 .block_erase = SPI_BLOCK_ERASE_60, 6812 }, { 6813 .eraseblocks = { {64 * 1024 * 1024, 1} }, 6814 .block_erase = SPI_BLOCK_ERASE_C7, 6815 } 6816 }, 6817 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6818 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 6819 .write = SPI_CHIP_WRITE256, 6820 .read = SPI_CHIP_READ, 6821 .voltage = {1695, 1950}, 6822 .reg_bits = 6823 { 6824 .srp = {STATUS1, 7, RW}, 6825 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 6826 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 6827 .srl = {STATUS2, 0, RW}, 6828 .cmp = {STATUS2, 6, RW}, 6829 }, 6830 .decode_range = DECODE_RANGE_SPI25, 6831 }, 6832 6833 { 6834 .vendor = "GigaDevice", 6835 .name = "GD25LQ128E/GD25LB128E/GD25LR128E/GD25LQ128D/GD25LQ128C", 6836 .bustype = BUS_SPI, 6837 .manufacture_id = GIGADEVICE_ID, 6838 .model_id = GIGADEVICE_GD25LQ128CD, 6839 .total_size = 16384, 6840 .page_size = 256, 6841 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6842 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, 6843 .tested = TEST_OK_PREWB, 6844 .probe = PROBE_SPI_RDID, 6845 .probe_timing = TIMING_ZERO, 6846 .block_erasers = 6847 { 6848 { 6849 .eraseblocks = { {4 * 1024, 4096} }, 6850 .block_erase = SPI_BLOCK_ERASE_20, 6851 }, { 6852 .eraseblocks = { {32 * 1024, 512} }, 6853 .block_erase = SPI_BLOCK_ERASE_52, 6854 }, { 6855 .eraseblocks = { {64 * 1024, 256} }, 6856 .block_erase = SPI_BLOCK_ERASE_D8, 6857 }, { 6858 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6859 .block_erase = SPI_BLOCK_ERASE_60, 6860 }, { 6861 .eraseblocks = { {16 * 1024 * 1024, 1} }, 6862 .block_erase = SPI_BLOCK_ERASE_C7, 6863 } 6864 }, 6865 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 6866 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6867 .write = SPI_CHIP_WRITE256, 6868 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6869 .voltage = {1695, 1950}, 6870 .reg_bits = 6871 { 6872 .srp = {STATUS1, 7, RW}, 6873 .srl = {STATUS2, 0, RW}, 6874 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 6875 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 6876 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 6877 .cmp = {STATUS2, 6, RW}, 6878 }, 6879 .decode_range = DECODE_RANGE_SPI25, 6880 }, 6881 6882 { 6883 .vendor = "GigaDevice", 6884 .name = "GD25LQ255E", 6885 .bustype = BUS_SPI, 6886 .manufacture_id = GIGADEVICE_ID, 6887 .model_id = GIGADEVICE_GD25LQ255E, 6888 .total_size = 32768, 6889 .page_size = 256, 6890 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6891 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_4BA, 6892 .tested = TEST_OK_PREWB, 6893 .probe = PROBE_SPI_RDID, 6894 .probe_timing = TIMING_ZERO, 6895 .block_erasers = 6896 { 6897 { 6898 .eraseblocks = { {4 * 1024, 8192} }, 6899 .block_erase = SPI_BLOCK_ERASE_21, 6900 }, { 6901 .eraseblocks = { {4 * 1024, 8192} }, 6902 .block_erase = SPI_BLOCK_ERASE_20, 6903 }, { 6904 .eraseblocks = { {32 * 1024, 1024} }, 6905 .block_erase = SPI_BLOCK_ERASE_5C, 6906 }, { 6907 .eraseblocks = { {32 * 1024, 1024} }, 6908 .block_erase = SPI_BLOCK_ERASE_52, 6909 }, { 6910 .eraseblocks = { {64 * 1024, 512} }, 6911 .block_erase = SPI_BLOCK_ERASE_DC, 6912 }, { 6913 .eraseblocks = { {64 * 1024, 512} }, 6914 .block_erase = SPI_BLOCK_ERASE_D8, 6915 }, { 6916 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6917 .block_erase = SPI_BLOCK_ERASE_60, 6918 }, { 6919 .eraseblocks = { {32 * 1024 * 1024, 1} }, 6920 .block_erase = SPI_BLOCK_ERASE_C7, 6921 } 6922 }, 6923 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 6924 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6925 .write = SPI_CHIP_WRITE256, 6926 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6927 .voltage = {1650, 2000}, 6928 .reg_bits = 6929 { 6930 .srp = {STATUS1, 7, RW}, 6931 .srl = {STATUS2, 0, RW}, 6932 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 6933 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 6934 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 6935 .cmp = {STATUS2, 6, RW}, 6936 }, 6937 .decode_range = DECODE_RANGE_SPI25, 6938 }, 6939 6940 { 6941 .vendor = "GigaDevice", 6942 .name = "GD25LQ16", 6943 .bustype = BUS_SPI, 6944 .manufacture_id = GIGADEVICE_ID, 6945 .model_id = GIGADEVICE_GD25LQ16, 6946 .total_size = 2048, 6947 .page_size = 256, 6948 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6949 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6950 .tested = TEST_UNTESTED, 6951 .probe = PROBE_SPI_RDID, 6952 .probe_timing = TIMING_ZERO, 6953 .block_erasers = 6954 { 6955 { 6956 .eraseblocks = { {4 * 1024, 512} }, 6957 .block_erase = SPI_BLOCK_ERASE_20, 6958 }, { 6959 .eraseblocks = { {32 * 1024, 64} }, 6960 .block_erase = SPI_BLOCK_ERASE_52, 6961 }, { 6962 .eraseblocks = { {64 * 1024, 32} }, 6963 .block_erase = SPI_BLOCK_ERASE_D8, 6964 }, { 6965 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6966 .block_erase = SPI_BLOCK_ERASE_60, 6967 }, { 6968 .eraseblocks = { {2 * 1024 * 1024, 1} }, 6969 .block_erase = SPI_BLOCK_ERASE_C7, 6970 } 6971 }, 6972 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 6973 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 6974 .write = SPI_CHIP_WRITE256, 6975 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 6976 .voltage = {1695, 1950}, 6977 }, 6978 6979 { 6980 .vendor = "GigaDevice", 6981 .name = "GD25LQ32", 6982 .bustype = BUS_SPI, 6983 .manufacture_id = GIGADEVICE_ID, 6984 .model_id = GIGADEVICE_GD25LQ32, 6985 .total_size = 4096, 6986 .page_size = 256, 6987 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 6988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 6989 .tested = TEST_OK_PREW, 6990 .probe = PROBE_SPI_RDID, 6991 .probe_timing = TIMING_ZERO, 6992 .block_erasers = 6993 { 6994 { 6995 .eraseblocks = { {4 * 1024, 1024} }, 6996 .block_erase = SPI_BLOCK_ERASE_20, 6997 }, { 6998 .eraseblocks = { {32 * 1024, 128} }, 6999 .block_erase = SPI_BLOCK_ERASE_52, 7000 }, { 7001 .eraseblocks = { {64 * 1024, 64} }, 7002 .block_erase = SPI_BLOCK_ERASE_D8, 7003 }, { 7004 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7005 .block_erase = SPI_BLOCK_ERASE_60, 7006 }, { 7007 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7008 .block_erase = SPI_BLOCK_ERASE_C7, 7009 } 7010 }, 7011 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7012 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7013 .write = SPI_CHIP_WRITE256, 7014 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7015 .voltage = {1695, 1950}, 7016 }, 7017 7018 { 7019 .vendor = "GigaDevice", 7020 .name = "GD25LQ40", 7021 .bustype = BUS_SPI, 7022 .manufacture_id = GIGADEVICE_ID, 7023 .model_id = GIGADEVICE_GD25LQ40, 7024 .total_size = 512, 7025 .page_size = 256, 7026 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7027 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7028 .tested = TEST_UNTESTED, 7029 .probe = PROBE_SPI_RDID, 7030 .probe_timing = TIMING_ZERO, 7031 .block_erasers = 7032 { 7033 { 7034 .eraseblocks = { {4 * 1024, 128} }, 7035 .block_erase = SPI_BLOCK_ERASE_20, 7036 }, { 7037 .eraseblocks = { {32 * 1024, 16} }, 7038 .block_erase = SPI_BLOCK_ERASE_52, 7039 }, { 7040 .eraseblocks = { {64 * 1024, 8} }, 7041 .block_erase = SPI_BLOCK_ERASE_D8, 7042 }, { 7043 .eraseblocks = { {512 * 1024, 1} }, 7044 .block_erase = SPI_BLOCK_ERASE_60, 7045 }, { 7046 .eraseblocks = { {512 * 1024, 1} }, 7047 .block_erase = SPI_BLOCK_ERASE_C7, 7048 } 7049 }, 7050 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7051 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7052 .write = SPI_CHIP_WRITE256, 7053 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7054 .voltage = {1695, 1950}, 7055 }, 7056 7057 { 7058 .vendor = "GigaDevice", 7059 .name = "GD25LQ64(B)", 7060 .bustype = BUS_SPI, 7061 .manufacture_id = GIGADEVICE_ID, 7062 .model_id = GIGADEVICE_GD25LQ64, 7063 .total_size = 8192, 7064 .page_size = 256, 7065 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, 7067 .tested = TEST_OK_PREWB, 7068 .probe = PROBE_SPI_RDID, 7069 .probe_timing = TIMING_ZERO, 7070 .block_erasers = 7071 { 7072 { 7073 .eraseblocks = { {4 * 1024, 2048} }, 7074 .block_erase = SPI_BLOCK_ERASE_20, 7075 }, { 7076 .eraseblocks = { {32 * 1024, 256} }, 7077 .block_erase = SPI_BLOCK_ERASE_52, 7078 }, { 7079 .eraseblocks = { {64 * 1024, 128} }, 7080 .block_erase = SPI_BLOCK_ERASE_D8, 7081 }, { 7082 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7083 .block_erase = SPI_BLOCK_ERASE_60, 7084 }, { 7085 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7086 .block_erase = SPI_BLOCK_ERASE_C7, 7087 } 7088 }, 7089 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7090 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7091 .write = SPI_CHIP_WRITE256, 7092 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7093 .voltage = {1695, 1950}, 7094 .reg_bits = 7095 { 7096 .srp = {STATUS1, 7, RW}, 7097 .srl = {STATUS2, 0, RW}, 7098 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 7099 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 7100 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 7101 .cmp = {STATUS2, 6, RW}, 7102 }, 7103 .decode_range = DECODE_RANGE_SPI25, 7104 }, 7105 7106 { 7107 .vendor = "GigaDevice", 7108 .name = "GD25LQ80", 7109 .bustype = BUS_SPI, 7110 .manufacture_id = GIGADEVICE_ID, 7111 .model_id = GIGADEVICE_GD25LQ80, 7112 .total_size = 1024, 7113 .page_size = 256, 7114 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7115 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7116 .tested = TEST_UNTESTED, 7117 .probe = PROBE_SPI_RDID, 7118 .probe_timing = TIMING_ZERO, 7119 .block_erasers = 7120 { 7121 { 7122 .eraseblocks = { {4 * 1024, 256} }, 7123 .block_erase = SPI_BLOCK_ERASE_20, 7124 }, { 7125 .eraseblocks = { {32 * 1024, 32} }, 7126 .block_erase = SPI_BLOCK_ERASE_52, 7127 }, { 7128 .eraseblocks = { {64 * 1024, 16} }, 7129 .block_erase = SPI_BLOCK_ERASE_D8, 7130 }, { 7131 .eraseblocks = { {1 * 1024 * 1024, 1} }, 7132 .block_erase = SPI_BLOCK_ERASE_60, 7133 }, { 7134 .eraseblocks = { {1 * 1024 * 1024, 1} }, 7135 .block_erase = SPI_BLOCK_ERASE_C7, 7136 } 7137 }, 7138 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7139 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7140 .write = SPI_CHIP_WRITE256, 7141 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7142 .voltage = {1695, 1950}, 7143 }, 7144 7145 { 7146 .vendor = "GigaDevice", 7147 .name = "GD25LB256E/GD25LR256E", 7148 .bustype = BUS_SPI, 7149 .manufacture_id = GIGADEVICE_ID, 7150 .model_id = GIGADEVICE_GD25LR256E, 7151 .total_size = 32768, 7152 .page_size = 256, 7153 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 7154 .tested = TEST_OK_PREWB, 7155 .probe = PROBE_SPI_RDID, 7156 .probe_timing = TIMING_ZERO, 7157 .block_erasers = 7158 { 7159 { 7160 .eraseblocks = { {4 * 1024, 8192} }, 7161 .block_erase = SPI_BLOCK_ERASE_21, 7162 }, { 7163 .eraseblocks = { {4 * 1024, 8192} }, 7164 .block_erase = SPI_BLOCK_ERASE_20, 7165 }, { 7166 .eraseblocks = { {32 * 1024, 1024} }, 7167 .block_erase = SPI_BLOCK_ERASE_5C, 7168 }, { 7169 .eraseblocks = { {32 * 1024, 1024} }, 7170 .block_erase = SPI_BLOCK_ERASE_52, 7171 }, { 7172 .eraseblocks = { {64 * 1024, 512} }, 7173 .block_erase = SPI_BLOCK_ERASE_DC, 7174 }, { 7175 .eraseblocks = { {64 * 1024, 512} }, 7176 .block_erase = SPI_BLOCK_ERASE_D8, 7177 }, { 7178 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7179 .block_erase = SPI_BLOCK_ERASE_60, 7180 }, { 7181 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7182 .block_erase = SPI_BLOCK_ERASE_C7, 7183 } 7184 }, 7185 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7186 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 7187 .write = SPI_CHIP_WRITE256, 7188 .read = SPI_CHIP_READ, 7189 .voltage = {1650, 2000}, 7190 .reg_bits = 7191 { 7192 .srp = {STATUS1, 7, RW}, 7193 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 7194 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 7195 }, 7196 .decode_range = DECODE_RANGE_SPI25, 7197 7198 }, 7199 7200 { 7201 .vendor = "GigaDevice", 7202 .name = "GD25LB256F/GD25LR256F", 7203 .bustype = BUS_SPI, 7204 .manufacture_id = GIGADEVICE_ID, 7205 .model_id = GIGADEVICE_GD25LQ255E, 7206 .total_size = 32768, 7207 .page_size = 256, 7208 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7209 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_4BA, 7210 .tested = TEST_OK_PREWB, 7211 .probe = PROBE_SPI_RDID, 7212 .probe_timing = TIMING_ZERO, 7213 .block_erasers = 7214 { 7215 { 7216 .eraseblocks = { {4 * 1024, 8192} }, 7217 .block_erase = SPI_BLOCK_ERASE_21, 7218 }, { 7219 .eraseblocks = { {4 * 1024, 8192} }, 7220 .block_erase = SPI_BLOCK_ERASE_20, 7221 }, { 7222 .eraseblocks = { {32 * 1024, 1024} }, 7223 .block_erase = SPI_BLOCK_ERASE_5C, 7224 }, { 7225 .eraseblocks = { {32 * 1024, 1024} }, 7226 .block_erase = SPI_BLOCK_ERASE_52, 7227 }, { 7228 .eraseblocks = { {64 * 1024, 512} }, 7229 .block_erase = SPI_BLOCK_ERASE_DC, 7230 }, { 7231 .eraseblocks = { {64 * 1024, 512} }, 7232 .block_erase = SPI_BLOCK_ERASE_D8, 7233 }, { 7234 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7235 .block_erase = SPI_BLOCK_ERASE_60, 7236 }, { 7237 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7238 .block_erase = SPI_BLOCK_ERASE_C7, 7239 } 7240 }, 7241 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7242 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7243 .write = SPI_CHIP_WRITE256, 7244 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7245 .voltage = {1650, 2000}, 7246 .reg_bits = 7247 { 7248 .srp = {STATUS1, 7, RW}, 7249 .srl = {STATUS2, 0, RW}, 7250 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 7251 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 7252 .cmp = {STATUS2, 6, RW}, 7253 }, 7254 .decode_range = DECODE_RANGE_SPI25, 7255 }, 7256 7257 { 7258 .vendor = "GigaDevice", 7259 .name = "GD25LB512MF/GD25LR512MF", 7260 .bustype = BUS_SPI, 7261 .manufacture_id = GIGADEVICE_ID, 7262 .model_id = GIGADEVICE_GD25LB512MF, 7263 .total_size = 65536, 7264 .page_size = 256, 7265 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_4BA, 7266 .tested = TEST_OK_PREWB, 7267 .probe = PROBE_SPI_RDID, 7268 .probe_timing = TIMING_ZERO, 7269 .block_erasers = 7270 { 7271 { 7272 .eraseblocks = { {4 * 1024, 16384} }, 7273 .block_erase = SPI_BLOCK_ERASE_21, 7274 }, { 7275 .eraseblocks = { {4 * 1024, 16384} }, 7276 .block_erase = SPI_BLOCK_ERASE_20, 7277 }, { 7278 .eraseblocks = { {32 * 1024, 2048} }, 7279 .block_erase = SPI_BLOCK_ERASE_5C, 7280 }, { 7281 .eraseblocks = { {32 * 1024, 2048} }, 7282 .block_erase = SPI_BLOCK_ERASE_52, 7283 }, { 7284 .eraseblocks = { {64 * 1024, 1024} }, 7285 .block_erase = SPI_BLOCK_ERASE_DC, 7286 }, { 7287 .eraseblocks = { {64 * 1024, 1024} }, 7288 .block_erase = SPI_BLOCK_ERASE_D8, 7289 }, { 7290 .eraseblocks = { {64 * 1024 * 1024, 1} }, 7291 .block_erase = SPI_BLOCK_ERASE_60, 7292 }, { 7293 .eraseblocks = { {64 * 1024 * 1024, 1} }, 7294 .block_erase = SPI_BLOCK_ERASE_C7, 7295 } 7296 }, 7297 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7298 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 7299 .write = SPI_CHIP_WRITE256, 7300 .read = SPI_CHIP_READ, 7301 .voltage = {1695, 1950}, 7302 .reg_bits = 7303 { 7304 .srp = {STATUS1, 7, RW}, 7305 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 7306 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 7307 .srl = {STATUS2, 0, RW}, 7308 .cmp = {STATUS2, 6, RW}, 7309 }, 7310 .decode_range = DECODE_RANGE_SPI25, 7311 }, 7312 7313 { 7314 .vendor = "GigaDevice", 7315 .name = "GD25LB512ME/GD25LR512ME", 7316 .bustype = BUS_SPI, 7317 .manufacture_id = GIGADEVICE_ID, 7318 .model_id = GIGADEVICE_GD25LR512ME, 7319 .total_size = 65536, 7320 .page_size = 256, 7321 /* OTP: 4096B total; read 0x48; write 0x42, erase 0x44 */ 7322 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 7323 .tested = TEST_OK_PREWB, 7324 .probe = PROBE_SPI_RDID, 7325 .probe_timing = TIMING_ZERO, 7326 .block_erasers = 7327 { 7328 { 7329 .eraseblocks = { {4 * 1024, 16384} }, 7330 .block_erase = SPI_BLOCK_ERASE_21, 7331 }, { 7332 .eraseblocks = { {4 * 1024, 16384} }, 7333 .block_erase = SPI_BLOCK_ERASE_20, 7334 }, { 7335 .eraseblocks = { {32 * 1024, 2048} }, 7336 .block_erase = SPI_BLOCK_ERASE_5C, 7337 }, { 7338 .eraseblocks = { {32 * 1024, 2048} }, 7339 .block_erase = SPI_BLOCK_ERASE_52, 7340 }, { 7341 .eraseblocks = { {64 * 1024, 1024} }, 7342 .block_erase = SPI_BLOCK_ERASE_DC, 7343 }, { 7344 .eraseblocks = { {64 * 1024, 1024} }, 7345 .block_erase = SPI_BLOCK_ERASE_D8, 7346 }, { 7347 .eraseblocks = { {64 * 1024 * 1024, 1} }, 7348 .block_erase = SPI_BLOCK_ERASE_60, 7349 }, { 7350 .eraseblocks = { {64 * 1024 * 1024, 1} }, 7351 .block_erase = SPI_BLOCK_ERASE_C7, 7352 } 7353 }, 7354 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7355 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 7356 .write = SPI_CHIP_WRITE256, 7357 .read = SPI_CHIP_READ, 7358 .voltage = {1650, 2000}, 7359 .reg_bits = 7360 { 7361 .srp = {STATUS1, 7, RW}, 7362 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 7363 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 7364 }, 7365 .decode_range = DECODE_RANGE_SPI25, 7366 }, 7367 7368 { 7369 .vendor = "GigaDevice", 7370 .name = "GD25Q10", 7371 .bustype = BUS_SPI, 7372 .manufacture_id = GIGADEVICE_ID, 7373 .model_id = GIGADEVICE_GD25Q10, 7374 .total_size = 128, 7375 .page_size = 256, 7376 .feature_bits = FEATURE_WRSR_WREN, 7377 .tested = TEST_UNTESTED, 7378 .probe = PROBE_SPI_RDID, 7379 .probe_timing = TIMING_ZERO, 7380 .block_erasers = 7381 { 7382 { 7383 .eraseblocks = { {4 * 1024, 32} }, 7384 .block_erase = SPI_BLOCK_ERASE_20, 7385 }, { 7386 .eraseblocks = { {32 * 1024, 4} }, 7387 .block_erase = SPI_BLOCK_ERASE_52, 7388 }, { 7389 .eraseblocks = { {64 * 1024, 2} }, 7390 .block_erase = SPI_BLOCK_ERASE_D8, 7391 }, { 7392 .eraseblocks = { {128 * 1024, 1} }, 7393 .block_erase = SPI_BLOCK_ERASE_60, 7394 }, { 7395 .eraseblocks = { {128 * 1024, 1} }, 7396 .block_erase = SPI_BLOCK_ERASE_C7, 7397 } 7398 }, 7399 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7400 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7401 .write = SPI_CHIP_WRITE256, 7402 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7403 .voltage = {2700, 3600}, 7404 }, 7405 7406 { 7407 .vendor = "GigaDevice", 7408 .name = "GD25Q127C/GD25Q128E", 7409 .bustype = BUS_SPI, 7410 .manufacture_id = GIGADEVICE_ID, 7411 .model_id = GIGADEVICE_GD25Q128, 7412 .total_size = 16384, 7413 .page_size = 256, 7414 /* OTP: 3072B total; read 0x48; write 0x42, erase 0x44 */ 7415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, 7416 .tested = TEST_OK_PREWB, 7417 .probe = PROBE_SPI_RDID, 7418 .probe_timing = TIMING_ZERO, 7419 .block_erasers = 7420 { 7421 { 7422 .eraseblocks = { {4 * 1024, 4096} }, 7423 .block_erase = SPI_BLOCK_ERASE_20, 7424 }, { 7425 .eraseblocks = { {32 * 1024, 512} }, 7426 .block_erase = SPI_BLOCK_ERASE_52, 7427 }, { 7428 .eraseblocks = { {64 * 1024, 256} }, 7429 .block_erase = SPI_BLOCK_ERASE_D8, 7430 }, { 7431 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7432 .block_erase = SPI_BLOCK_ERASE_60, 7433 }, { 7434 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7435 .block_erase = SPI_BLOCK_ERASE_C7, 7436 } 7437 }, 7438 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */ 7439 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7440 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 7441 .write = SPI_CHIP_WRITE256, 7442 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7443 .voltage = {2700, 3600}, 7444 .reg_bits = 7445 { 7446 .srp = {STATUS1, 7, RW}, 7447 .srl = {STATUS2, 0, RW}, 7448 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 7449 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 7450 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 7451 .cmp = {STATUS2, 6, RW}, 7452 }, 7453 .decode_range = DECODE_RANGE_SPI25, 7454 }, 7455 7456 { 7457 .vendor = "GigaDevice", 7458 .name = "GD25Q128C", 7459 .bustype = BUS_SPI, 7460 .manufacture_id = GIGADEVICE_ID, 7461 .model_id = GIGADEVICE_GD25Q128, 7462 .total_size = 16384, 7463 .page_size = 256, 7464 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */ 7465 /* QPI: enable 0x38, disable 0xFF */ 7466 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 7467 .tested = TEST_OK_PREWB, 7468 .probe = PROBE_SPI_RDID, 7469 .probe_timing = TIMING_ZERO, 7470 .block_erasers = 7471 { 7472 { 7473 .eraseblocks = { {4 * 1024, 4096} }, 7474 .block_erase = SPI_BLOCK_ERASE_20, 7475 }, { 7476 .eraseblocks = { {32 * 1024, 512} }, 7477 .block_erase = SPI_BLOCK_ERASE_52, 7478 }, { 7479 .eraseblocks = { {64 * 1024, 256} }, 7480 .block_erase = SPI_BLOCK_ERASE_D8, 7481 }, { 7482 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7483 .block_erase = SPI_BLOCK_ERASE_60, 7484 }, { 7485 .eraseblocks = { {16 * 1024 * 1024, 1} }, 7486 .block_erase = SPI_BLOCK_ERASE_C7, 7487 } 7488 }, 7489 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */ 7490 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7491 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 7492 .write = SPI_CHIP_WRITE256, 7493 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7494 .voltage = {2700, 3600}, 7495 .reg_bits = 7496 { 7497 .srp = {STATUS1, 7, RW}, 7498 .srl = {STATUS2, 0, RW}, 7499 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 7500 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 7501 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 7502 .cmp = {STATUS2, 6, RW}, 7503 }, 7504 .decode_range = DECODE_RANGE_SPI25, 7505 }, 7506 7507 { 7508 .vendor = "GigaDevice", 7509 .name = "GD25Q16(B)", 7510 .bustype = BUS_SPI, 7511 .manufacture_id = GIGADEVICE_ID, 7512 .model_id = GIGADEVICE_GD25Q16, 7513 .total_size = 2048, 7514 .page_size = 256, 7515 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ 7516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7517 .tested = TEST_OK_PREW, 7518 .probe = PROBE_SPI_RDID, 7519 .probe_timing = TIMING_ZERO, 7520 .block_erasers = 7521 { 7522 { 7523 .eraseblocks = { {4 * 1024, 512} }, 7524 .block_erase = SPI_BLOCK_ERASE_20, 7525 }, { 7526 .eraseblocks = { {32 * 1024, 64} }, 7527 .block_erase = SPI_BLOCK_ERASE_52, 7528 }, { 7529 .eraseblocks = { {64 * 1024, 32} }, 7530 .block_erase = SPI_BLOCK_ERASE_D8, 7531 }, { 7532 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7533 .block_erase = SPI_BLOCK_ERASE_60, 7534 }, { 7535 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7536 .block_erase = SPI_BLOCK_ERASE_C7, 7537 } 7538 }, 7539 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7540 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7541 .write = SPI_CHIP_WRITE256, 7542 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7543 .voltage = {2700, 3600}, 7544 }, 7545 7546 { 7547 .vendor = "GigaDevice", 7548 .name = "GD25Q20(B)", 7549 .bustype = BUS_SPI, 7550 .manufacture_id = GIGADEVICE_ID, 7551 .model_id = GIGADEVICE_GD25Q20, 7552 .total_size = 256, 7553 .page_size = 256, 7554 .feature_bits = FEATURE_WRSR_WREN, 7555 .tested = TEST_OK_PREW, 7556 .probe = PROBE_SPI_RDID, 7557 .probe_timing = TIMING_ZERO, 7558 .block_erasers = 7559 { 7560 { 7561 .eraseblocks = { {4 * 1024, 64} }, 7562 .block_erase = SPI_BLOCK_ERASE_20, 7563 }, { 7564 .eraseblocks = { {32 * 1024, 8} }, 7565 .block_erase = SPI_BLOCK_ERASE_52, 7566 }, { 7567 .eraseblocks = { {64 * 1024, 4} }, 7568 .block_erase = SPI_BLOCK_ERASE_D8, 7569 }, { 7570 .eraseblocks = { {256 * 1024, 1} }, 7571 .block_erase = SPI_BLOCK_ERASE_60, 7572 }, { 7573 .eraseblocks = { {256 * 1024, 1} }, 7574 .block_erase = SPI_BLOCK_ERASE_C7, 7575 } 7576 }, 7577 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7578 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7579 .write = SPI_CHIP_WRITE256, 7580 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7581 .voltage = {2700, 3600}, 7582 }, 7583 7584 { 7585 .vendor = "GigaDevice", 7586 .name = "GD25Q256D/GD25Q256E", 7587 .bustype = BUS_SPI, 7588 .manufacture_id = GIGADEVICE_ID, 7589 .model_id = GIGADEVICE_GD25Q256D, 7590 .total_size = 32768, 7591 .page_size = 256, 7592 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | 7593 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 7594 .tested = TEST_OK_PREWB, 7595 .probe = PROBE_SPI_RDID, 7596 .probe_timing = TIMING_ZERO, 7597 .block_erasers = 7598 { 7599 { 7600 .eraseblocks = { {4 * 1024, 8192} }, 7601 .block_erase = SPI_BLOCK_ERASE_21, 7602 }, { 7603 .eraseblocks = { {4 * 1024, 8192} }, 7604 .block_erase = SPI_BLOCK_ERASE_20, 7605 }, { 7606 .eraseblocks = { {32 * 1024, 1024} }, 7607 .block_erase = SPI_BLOCK_ERASE_5C, 7608 }, { 7609 .eraseblocks = { {32 * 1024, 1024} }, 7610 .block_erase = SPI_BLOCK_ERASE_52, 7611 }, { 7612 .eraseblocks = { {64 * 1024, 512} }, 7613 .block_erase = SPI_BLOCK_ERASE_DC, 7614 }, { 7615 .eraseblocks = { {64 * 1024, 512} }, 7616 .block_erase = SPI_BLOCK_ERASE_D8, 7617 }, { 7618 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7619 .block_erase = SPI_BLOCK_ERASE_60, 7620 }, { 7621 .eraseblocks = { {32 * 1024 * 1024, 1} }, 7622 .block_erase = SPI_BLOCK_ERASE_C7, 7623 } 7624 }, 7625 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 7626 .unlock = SPI_DISABLE_BLOCKPROTECT, 7627 .write = SPI_CHIP_WRITE256, 7628 .read = SPI_CHIP_READ, 7629 .voltage = {2700, 3600}, 7630 .reg_bits = 7631 { 7632 .srp = {STATUS1, 7, RW}, 7633 .srl = {STATUS2, 6, RW}, 7634 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 7635 .tb = {STATUS1, 6, RW}, 7636 }, 7637 .decode_range = DECODE_RANGE_SPI25, 7638 }, 7639 7640 { 7641 .vendor = "GigaDevice", 7642 .name = "GD25Q32(B)", 7643 .bustype = BUS_SPI, 7644 .manufacture_id = GIGADEVICE_ID, 7645 .model_id = GIGADEVICE_GD25Q32, 7646 .total_size = 4096, 7647 .page_size = 256, 7648 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7649 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, 7650 .tested = TEST_OK_PREWB, 7651 .probe = PROBE_SPI_RDID, 7652 .probe_timing = TIMING_ZERO, 7653 .block_erasers = 7654 { 7655 { 7656 .eraseblocks = { {4 * 1024, 1024} }, 7657 .block_erase = SPI_BLOCK_ERASE_20, 7658 }, { 7659 .eraseblocks = { {32 * 1024, 128} }, 7660 .block_erase = SPI_BLOCK_ERASE_52, 7661 }, { 7662 .eraseblocks = { {64 * 1024, 64} }, 7663 .block_erase = SPI_BLOCK_ERASE_D8, 7664 }, { 7665 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7666 .block_erase = SPI_BLOCK_ERASE_60, 7667 }, { 7668 .eraseblocks = { {4 * 1024 * 1024, 1} }, 7669 .block_erase = SPI_BLOCK_ERASE_C7, 7670 } 7671 }, 7672 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7673 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7674 .write = SPI_CHIP_WRITE256, 7675 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7676 .voltage = {2700, 3600}, 7677 .reg_bits = 7678 { 7679 .srp = {STATUS1, 7, RW}, 7680 .srl = {STATUS2, 0, RW}, 7681 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 7682 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 7683 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 7684 .cmp = {STATUS2, 6, RW}, 7685 }, 7686 .decode_range = DECODE_RANGE_SPI25, 7687 }, 7688 7689 { 7690 .vendor = "GigaDevice", 7691 .name = "GD25Q40(B)", 7692 .bustype = BUS_SPI, 7693 .manufacture_id = GIGADEVICE_ID, 7694 .model_id = GIGADEVICE_GD25Q40, 7695 .total_size = 512, 7696 .page_size = 256, 7697 .feature_bits = FEATURE_WRSR_WREN, 7698 .tested = TEST_OK_PREW, 7699 .probe = PROBE_SPI_RDID, 7700 .probe_timing = TIMING_ZERO, 7701 .block_erasers = 7702 { 7703 { 7704 .eraseblocks = { {4 * 1024, 128} }, 7705 .block_erase = SPI_BLOCK_ERASE_20, 7706 }, { 7707 .eraseblocks = { {32 * 1024, 16} }, 7708 .block_erase = SPI_BLOCK_ERASE_52, 7709 }, { 7710 .eraseblocks = { {64 * 1024, 8} }, 7711 .block_erase = SPI_BLOCK_ERASE_D8, 7712 }, { 7713 .eraseblocks = { {512 * 1024, 1} }, 7714 .block_erase = SPI_BLOCK_ERASE_60, 7715 }, { 7716 .eraseblocks = { {512 * 1024, 1} }, 7717 .block_erase = SPI_BLOCK_ERASE_C7, 7718 } 7719 }, 7720 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7721 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7722 .write = SPI_CHIP_WRITE256, 7723 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7724 .voltage = {2700, 3600}, 7725 }, 7726 7727 { 7728 .vendor = "GigaDevice", 7729 .name = "GD25Q512", 7730 .bustype = BUS_SPI, 7731 .manufacture_id = GIGADEVICE_ID, 7732 .model_id = GIGADEVICE_GD25Q512, 7733 .total_size = 64, 7734 .page_size = 256, 7735 .feature_bits = FEATURE_WRSR_WREN, 7736 .tested = TEST_OK_PREW, 7737 .probe = PROBE_SPI_RDID, 7738 .probe_timing = TIMING_ZERO, 7739 .block_erasers = 7740 { 7741 { 7742 .eraseblocks = { {4 * 1024, 16} }, 7743 .block_erase = SPI_BLOCK_ERASE_20, 7744 }, { 7745 .eraseblocks = { {32 * 1024, 2} }, 7746 .block_erase = SPI_BLOCK_ERASE_52, 7747 }, { 7748 .eraseblocks = { {64 * 1024, 1} }, 7749 .block_erase = SPI_BLOCK_ERASE_60, 7750 }, { 7751 .eraseblocks = { {64 * 1024, 1} }, 7752 .block_erase = SPI_BLOCK_ERASE_C7, 7753 } 7754 }, 7755 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7756 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7757 .write = SPI_CHIP_WRITE256, 7758 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7759 .voltage = {2700, 3600}, 7760 }, 7761 7762 { 7763 .vendor = "GigaDevice", 7764 .name = "GD25Q64(B)", 7765 .bustype = BUS_SPI, 7766 .manufacture_id = GIGADEVICE_ID, 7767 .model_id = GIGADEVICE_GD25Q64, 7768 .total_size = 8192, 7769 .page_size = 256, 7770 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 7771 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, 7772 .tested = TEST_OK_PREWB, 7773 .probe = PROBE_SPI_RDID, 7774 .probe_timing = TIMING_ZERO, 7775 .block_erasers = 7776 { 7777 { 7778 .eraseblocks = { {4 * 1024, 2048} }, 7779 .block_erase = SPI_BLOCK_ERASE_20, 7780 }, { 7781 .eraseblocks = { {32 * 1024, 256} }, 7782 .block_erase = SPI_BLOCK_ERASE_52, 7783 }, { 7784 .eraseblocks = { {64 * 1024, 128} }, 7785 .block_erase = SPI_BLOCK_ERASE_D8, 7786 }, { 7787 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7788 .block_erase = SPI_BLOCK_ERASE_60, 7789 }, { 7790 .eraseblocks = { {8 * 1024 * 1024, 1} }, 7791 .block_erase = SPI_BLOCK_ERASE_C7, 7792 } 7793 }, 7794 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7795 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7796 .write = SPI_CHIP_WRITE256, 7797 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7798 .voltage = {2700, 3600}, 7799 .reg_bits = 7800 { 7801 .srp = {STATUS1, 7, RW}, 7802 .srl = {STATUS2, 0, RW}, 7803 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 7804 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 7805 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 7806 .cmp = {STATUS2, 6, RW}, 7807 }, 7808 .decode_range = DECODE_RANGE_SPI25, 7809 }, 7810 7811 { 7812 .vendor = "GigaDevice", 7813 .name = "GD25Q80(B)", 7814 .bustype = BUS_SPI, 7815 .manufacture_id = GIGADEVICE_ID, 7816 .model_id = GIGADEVICE_GD25Q80, 7817 .total_size = 1024, 7818 .page_size = 256, 7819 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */ 7820 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7821 .tested = TEST_OK_PREW, 7822 .probe = PROBE_SPI_RDID, 7823 .probe_timing = TIMING_ZERO, 7824 .block_erasers = 7825 { 7826 { 7827 .eraseblocks = { {4 * 1024, 256} }, 7828 .block_erase = SPI_BLOCK_ERASE_20, 7829 }, { 7830 .eraseblocks = { {32 * 1024, 32} }, 7831 .block_erase = SPI_BLOCK_ERASE_52, 7832 }, { 7833 .eraseblocks = { {64 * 1024, 16} }, 7834 .block_erase = SPI_BLOCK_ERASE_D8, 7835 }, { 7836 .eraseblocks = { {1024 * 1024, 1} }, 7837 .block_erase = SPI_BLOCK_ERASE_60, 7838 }, { 7839 .eraseblocks = { {1024 * 1024, 1} }, 7840 .block_erase = SPI_BLOCK_ERASE_C7, 7841 } 7842 }, 7843 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7844 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7845 .write = SPI_CHIP_WRITE256, 7846 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7847 .voltage = {2700, 3600}, 7848 }, 7849 7850 { 7851 .vendor = "GigaDevice", 7852 .name = "GD25T80", 7853 .bustype = BUS_SPI, 7854 .manufacture_id = GIGADEVICE_ID, 7855 .model_id = GIGADEVICE_GD25T80, 7856 .total_size = 1024, 7857 .page_size = 256, 7858 /* OTP: 256B total; enter 0x3A */ 7859 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 7860 .tested = TEST_UNTESTED, 7861 .probe = PROBE_SPI_RDID, 7862 .probe_timing = TIMING_ZERO, 7863 .block_erasers = 7864 { 7865 { 7866 .eraseblocks = { {4 * 1024, 256} }, 7867 .block_erase = SPI_BLOCK_ERASE_20, 7868 }, { 7869 .eraseblocks = { {64 * 1024, 16} }, 7870 .block_erase = SPI_BLOCK_ERASE_52, 7871 }, { 7872 .eraseblocks = { {64 * 1024, 16} }, 7873 .block_erase = SPI_BLOCK_ERASE_D8, 7874 }, { 7875 .eraseblocks = { {1024 * 1024, 1} }, 7876 .block_erase = SPI_BLOCK_ERASE_60, 7877 }, { 7878 .eraseblocks = { {1024 * 1024, 1} }, 7879 .block_erase = SPI_BLOCK_ERASE_C7, 7880 } 7881 }, 7882 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 7883 .unlock = SPI_DISABLE_BLOCKPROTECT, 7884 .write = SPI_CHIP_WRITE256, 7885 .read = SPI_CHIP_READ, 7886 .voltage = {2700, 3600}, 7887 }, 7888 7889 { 7890 .vendor = "GigaDevice", 7891 .name = "GD25VQ16C", 7892 .bustype = BUS_SPI, 7893 .manufacture_id = GIGADEVICE_ID, 7894 .model_id = GIGADEVICE_GD25VQ16C, 7895 .total_size = 2 * 1024, 7896 .page_size = 256, 7897 /* Supports SFDP */ 7898 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 7899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7900 .tested = TEST_UNTESTED, 7901 .probe = PROBE_SPI_RDID, 7902 .probe_timing = TIMING_ZERO, 7903 .block_erasers = 7904 { 7905 { 7906 .eraseblocks = { { 4 * 1024, 512} }, 7907 .block_erase = SPI_BLOCK_ERASE_20, 7908 }, { 7909 .eraseblocks = { { 32 * 1024, 64} }, 7910 .block_erase = SPI_BLOCK_ERASE_52, 7911 }, { 7912 .eraseblocks = { { 64 * 1024, 32} }, 7913 .block_erase = SPI_BLOCK_ERASE_D8, 7914 }, { 7915 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7916 .block_erase = SPI_BLOCK_ERASE_60, 7917 }, { 7918 .eraseblocks = { {2 * 1024 * 1024, 1} }, 7919 .block_erase = SPI_BLOCK_ERASE_C7, 7920 } 7921 }, 7922 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7923 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7924 .write = SPI_CHIP_WRITE256, 7925 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7926 .voltage = {2300, 3600}, 7927 }, 7928 7929 { 7930 .vendor = "GigaDevice", 7931 .name = "GD25VQ21B", 7932 .bustype = BUS_SPI, 7933 .manufacture_id = GIGADEVICE_ID, 7934 .model_id = GIGADEVICE_GD25VQ21B, 7935 .total_size = 256, 7936 .page_size = 256, 7937 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */ 7938 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7939 .tested = TEST_UNTESTED, 7940 .probe = PROBE_SPI_RDID, 7941 .probe_timing = TIMING_ZERO, 7942 .block_erasers = 7943 { 7944 { 7945 .eraseblocks = { { 4 * 1024, 64} }, 7946 .block_erase = SPI_BLOCK_ERASE_20, 7947 }, { 7948 .eraseblocks = { { 32 * 1024, 8} }, 7949 .block_erase = SPI_BLOCK_ERASE_52, 7950 }, { 7951 .eraseblocks = { { 64 * 1024, 4} }, 7952 .block_erase = SPI_BLOCK_ERASE_D8, 7953 }, { 7954 .eraseblocks = { {256 * 1024, 1} }, 7955 .block_erase = SPI_BLOCK_ERASE_60, 7956 }, { 7957 .eraseblocks = { {256 * 1024, 1} }, 7958 .block_erase = SPI_BLOCK_ERASE_C7, 7959 } 7960 }, 7961 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 7962 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 7963 .write = SPI_CHIP_WRITE256, 7964 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 7965 .voltage = {2300, 3600}, 7966 }, 7967 7968 { 7969 .vendor = "GigaDevice", 7970 .name = "GD25VQ40C", 7971 .bustype = BUS_SPI, 7972 .manufacture_id = GIGADEVICE_ID, 7973 .model_id = GIGADEVICE_GD25VQ41B, 7974 .total_size = 512, 7975 .page_size = 256, 7976 /* Supports SFDP */ 7977 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 7978 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 7979 .tested = TEST_UNTESTED, 7980 .probe = PROBE_SPI_RDID, 7981 .probe_timing = TIMING_ZERO, 7982 .block_erasers = 7983 { 7984 { 7985 .eraseblocks = { { 4 * 1024, 128} }, 7986 .block_erase = SPI_BLOCK_ERASE_20, 7987 }, { 7988 .eraseblocks = { { 32 * 1024, 16} }, 7989 .block_erase = SPI_BLOCK_ERASE_52, 7990 }, { 7991 .eraseblocks = { { 64 * 1024, 8} }, 7992 .block_erase = SPI_BLOCK_ERASE_D8, 7993 }, { 7994 .eraseblocks = { {512 * 1024, 1} }, 7995 .block_erase = SPI_BLOCK_ERASE_60, 7996 }, { 7997 .eraseblocks = { {512 * 1024, 1} }, 7998 .block_erase = SPI_BLOCK_ERASE_C7, 7999 } 8000 }, 8001 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8002 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 8003 .write = SPI_CHIP_WRITE256, 8004 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 8005 .voltage = {2300, 3600}, 8006 }, 8007 8008 { 8009 .vendor = "GigaDevice", 8010 .name = "GD25VQ41B", 8011 .bustype = BUS_SPI, 8012 .manufacture_id = GIGADEVICE_ID, 8013 .model_id = GIGADEVICE_GD25VQ41B, 8014 .total_size = 512, 8015 .page_size = 256, 8016 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */ 8017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8018 .tested = TEST_OK_PREW, 8019 .probe = PROBE_SPI_RDID, 8020 .probe_timing = TIMING_ZERO, 8021 .block_erasers = 8022 { 8023 { 8024 .eraseblocks = { { 4 * 1024, 128} }, 8025 .block_erase = SPI_BLOCK_ERASE_20, 8026 }, { 8027 .eraseblocks = { { 32 * 1024, 16} }, 8028 .block_erase = SPI_BLOCK_ERASE_52, 8029 }, { 8030 .eraseblocks = { { 64 * 1024, 8} }, 8031 .block_erase = SPI_BLOCK_ERASE_D8, 8032 }, { 8033 .eraseblocks = { {512 * 1024, 1} }, 8034 .block_erase = SPI_BLOCK_ERASE_60, 8035 }, { 8036 .eraseblocks = { {512 * 1024, 1} }, 8037 .block_erase = SPI_BLOCK_ERASE_C7, 8038 } 8039 }, 8040 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8041 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 8042 .write = SPI_CHIP_WRITE256, 8043 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 8044 .voltage = {2300, 3600}, 8045 }, 8046 8047 { 8048 .vendor = "GigaDevice", 8049 .name = "GD25VQ80C", 8050 .bustype = BUS_SPI, 8051 .manufacture_id = GIGADEVICE_ID, 8052 .model_id = GIGADEVICE_GD25VQ80C, 8053 .total_size = 1024, 8054 .page_size = 256, 8055 /* Supports SFDP */ 8056 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */ 8057 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8058 .tested = TEST_UNTESTED, 8059 .probe = PROBE_SPI_RDID, 8060 .probe_timing = TIMING_ZERO, 8061 .block_erasers = 8062 { 8063 { 8064 .eraseblocks = { { 4 * 1024, 256} }, 8065 .block_erase = SPI_BLOCK_ERASE_20, 8066 }, { 8067 .eraseblocks = { { 32 * 1024, 32} }, 8068 .block_erase = SPI_BLOCK_ERASE_52, 8069 }, { 8070 .eraseblocks = { { 64 * 1024, 16} }, 8071 .block_erase = SPI_BLOCK_ERASE_D8, 8072 }, { 8073 .eraseblocks = { {1024 * 1024, 1} }, 8074 .block_erase = SPI_BLOCK_ERASE_60, 8075 }, { 8076 .eraseblocks = { {1024 * 1024, 1} }, 8077 .block_erase = SPI_BLOCK_ERASE_C7, 8078 } 8079 }, 8080 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8081 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 8082 .write = SPI_CHIP_WRITE256, 8083 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 8084 .voltage = {2300, 3600}, 8085 }, 8086 8087 { 8088 .vendor = "GigaDevice", 8089 .name = "GD25F64F", 8090 .bustype = BUS_SPI, 8091 .manufacture_id = GIGADEVICE_ID, 8092 .model_id = GIGADEVICE_GD25F64F, 8093 .total_size = 8192, 8094 .page_size = 256, 8095 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 8096 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2 | FEATURE_WRSR3, 8097 .tested = TEST_OK_PREWB, 8098 .probe = PROBE_SPI_RDID, 8099 .probe_timing = TIMING_ZERO, 8100 .block_erasers = 8101 { 8102 { 8103 .eraseblocks = { {4 * 1024, 2048} }, 8104 .block_erase = SPI_BLOCK_ERASE_20, 8105 }, { 8106 .eraseblocks = { {32 * 1024, 256} }, 8107 .block_erase = SPI_BLOCK_ERASE_52, 8108 }, { 8109 .eraseblocks = { {64 * 1024, 128} }, 8110 .block_erase = SPI_BLOCK_ERASE_D8, 8111 }, { 8112 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8113 .block_erase = SPI_BLOCK_ERASE_60, 8114 }, { 8115 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8116 .block_erase = SPI_BLOCK_ERASE_C7, 8117 } 8118 }, 8119 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8120 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 8121 .write = SPI_CHIP_WRITE256, 8122 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 8123 .voltage = {2700, 3600}, 8124 .reg_bits = 8125 { 8126 .srp = {STATUS1, 7, RW}, 8127 .srl = {STATUS2, 0, RW}, 8128 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 8129 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */ 8130 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */ 8131 .cmp = {STATUS3, 4, RW}, 8132 }, 8133 .decode_range = DECODE_RANGE_SPI25, 8134 }, 8135 8136 { 8137 .vendor = "GigaDevice", 8138 .name = "GD25F128F", 8139 .bustype = BUS_SPI, 8140 .manufacture_id = GIGADEVICE_ID, 8141 .model_id = GIGADEVICE_GD25F128F, 8142 .total_size = 16384, 8143 .page_size = 256, 8144 /* OTP: 3x2048B; read 0x48; write 0x42, erase 0x44 */ 8145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2 | FEATURE_WRSR3, 8146 .tested = TEST_OK_PREWB, 8147 .probe = PROBE_SPI_RDID, 8148 .probe_timing = TIMING_ZERO, 8149 .block_erasers = 8150 { 8151 { 8152 .eraseblocks = { {4 * 1024, 4096} }, 8153 .block_erase = SPI_BLOCK_ERASE_20, 8154 }, { 8155 .eraseblocks = { {32 * 1024, 512} }, 8156 .block_erase = SPI_BLOCK_ERASE_52, 8157 }, { 8158 .eraseblocks = { {64 * 1024, 256} }, 8159 .block_erase = SPI_BLOCK_ERASE_D8, 8160 }, { 8161 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8162 .block_erase = SPI_BLOCK_ERASE_60, 8163 }, { 8164 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8165 .block_erase = SPI_BLOCK_ERASE_C7, 8166 } 8167 }, 8168 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8169 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, /* TODO: 2nd status reg (read with 0x35) */ 8170 .write = SPI_CHIP_WRITE256, 8171 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 8172 .voltage = {2700, 3600}, 8173 .reg_bits = 8174 { 8175 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 8176 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 8177 }, 8178 .decode_range = DECODE_RANGE_SPI25, 8179 }, 8180 8181 { 8182 .vendor = "GigaDevice", 8183 .name = "GD25F256F", 8184 .bustype = BUS_SPI, 8185 .manufacture_id = GIGADEVICE_ID, 8186 .model_id = GIGADEVICE_GD25F256F, 8187 .total_size = 32768, 8188 .page_size = 256, 8189 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_4BA, 8190 .tested = TEST_OK_PREWB, 8191 .probe = PROBE_SPI_RDID, 8192 .probe_timing = TIMING_ZERO, 8193 .block_erasers = 8194 { 8195 { 8196 .eraseblocks = { {4 * 1024, 8192} }, 8197 .block_erase = SPI_BLOCK_ERASE_21, 8198 }, { 8199 .eraseblocks = { {4 * 1024, 8192} }, 8200 .block_erase = SPI_BLOCK_ERASE_20, 8201 }, { 8202 .eraseblocks = { {32 * 1024, 1024} }, 8203 .block_erase = SPI_BLOCK_ERASE_5C, 8204 }, { 8205 .eraseblocks = { {32 * 1024, 1024} }, 8206 .block_erase = SPI_BLOCK_ERASE_52, 8207 }, { 8208 .eraseblocks = { {64 * 1024, 512} }, 8209 .block_erase = SPI_BLOCK_ERASE_DC, 8210 }, { 8211 .eraseblocks = { {64 * 1024, 512} }, 8212 .block_erase = SPI_BLOCK_ERASE_D8, 8213 }, { 8214 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8215 .block_erase = SPI_BLOCK_ERASE_60, 8216 }, { 8217 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8218 .block_erase = SPI_BLOCK_ERASE_C7, 8219 } 8220 }, 8221 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8222 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 8223 .write = SPI_CHIP_WRITE256, 8224 .read = SPI_CHIP_READ, 8225 .voltage = {2700, 3600}, 8226 .reg_bits = 8227 { 8228 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 8229 .tb = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like TB */ 8230 }, 8231 .decode_range = DECODE_RANGE_SPI25, 8232 }, 8233 8234 { 8235 .vendor = "GigaDevice", 8236 .name = "GD25WQ80E", 8237 .bustype = BUS_SPI, 8238 .manufacture_id = GIGADEVICE_ID, 8239 .model_id = GIGADEVICE_GD25WQ80E, 8240 .total_size = 1024, 8241 .page_size = 256, 8242 .feature_bits = FEATURE_WRSR_WREN, 8243 .tested = TEST_OK_PREW, 8244 .probe = PROBE_SPI_RDID, 8245 .probe_timing = TIMING_ZERO, 8246 .block_erasers = 8247 { 8248 { 8249 .eraseblocks = { {4 * 1024, 256} }, 8250 .block_erase = SPI_BLOCK_ERASE_20, 8251 }, { 8252 .eraseblocks = { {32 * 1024, 32} }, 8253 .block_erase = SPI_BLOCK_ERASE_52, 8254 }, { 8255 .eraseblocks = { {64 * 1024, 16} }, 8256 .block_erase = SPI_BLOCK_ERASE_D8, 8257 }, { 8258 .eraseblocks = { {1 * 1024 * 1024, 1} }, 8259 .block_erase = SPI_BLOCK_ERASE_60, 8260 }, { 8261 .eraseblocks = { {1 * 1024 * 1024, 1} }, 8262 .block_erase = SPI_BLOCK_ERASE_C7, 8263 } 8264 }, 8265 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 8266 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 8267 .write = SPI_CHIP_WRITE256, 8268 .read = SPI_CHIP_READ, 8269 .voltage = {1650, 3600}, 8270 }, 8271 8272 { 8273 .vendor = "Hyundai", 8274 .name = "HY29F002B", 8275 .bustype = BUS_PARALLEL, 8276 .manufacture_id = HYUNDAI_ID, 8277 .model_id = HYUNDAI_HY29F002B, 8278 .total_size = 256, 8279 .page_size = 256 * 1024, 8280 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ 8281 .tested = TEST_UNTESTED, 8282 .probe = PROBE_JEDEC, 8283 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 8284 .block_erasers = 8285 { 8286 { 8287 .eraseblocks = { 8288 {16 * 1024, 1}, 8289 {8 * 1024, 2}, 8290 {32 * 1024, 1}, 8291 {64 * 1024, 3}, 8292 }, 8293 .block_erase = JEDEC_SECTOR_ERASE, 8294 }, { 8295 .eraseblocks = { {256 * 1024, 1} }, 8296 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 8297 }, 8298 }, 8299 .write = WRITE_JEDEC1, 8300 .read = READ_MEMMAPPED, 8301 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */ 8302 }, 8303 8304 { 8305 .vendor = "Hyundai", 8306 .name = "HY29F002T", 8307 .bustype = BUS_PARALLEL, 8308 .manufacture_id = HYUNDAI_ID, 8309 .model_id = HYUNDAI_HY29F002T, 8310 .total_size = 256, 8311 .page_size = 256 * 1024, 8312 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */ 8313 .tested = TEST_OK_PRE, 8314 .probe = PROBE_JEDEC, 8315 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 8316 .block_erasers = 8317 { 8318 { 8319 .eraseblocks = { 8320 {64 * 1024, 3}, 8321 {32 * 1024, 1}, 8322 {8 * 1024, 2}, 8323 {16 * 1024, 1}, 8324 }, 8325 .block_erase = JEDEC_SECTOR_ERASE, 8326 }, { 8327 .eraseblocks = { {256 * 1024, 1} }, 8328 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 8329 }, 8330 }, 8331 .write = WRITE_JEDEC1, 8332 .read = READ_MEMMAPPED, 8333 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */ 8334 }, 8335 8336 { 8337 .vendor = "Hyundai", 8338 .name = "HY29F040A", 8339 .bustype = BUS_PARALLEL, 8340 .manufacture_id = HYUNDAI_ID, 8341 .model_id = HYUNDAI_HY29F040A, 8342 .total_size = 512, 8343 .page_size = 64 * 1024, 8344 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 8345 .tested = TEST_UNTESTED, 8346 .probe = PROBE_JEDEC, 8347 .probe_timing = TIMING_ZERO, 8348 .block_erasers = 8349 { 8350 { 8351 .eraseblocks = { {64 * 1024, 8} }, 8352 .block_erase = JEDEC_SECTOR_ERASE, 8353 }, { 8354 .eraseblocks = { {512 * 1024, 1} }, 8355 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 8356 }, 8357 }, 8358 .write = WRITE_JEDEC1, 8359 .read = READ_MEMMAPPED, 8360 .voltage = {4500, 5500}, 8361 }, 8362 8363 { 8364 .vendor = "ISSI", 8365 .name = "IS25LP016", 8366 .bustype = BUS_SPI, 8367 .manufacture_id = ISSI_ID_SPI, 8368 .model_id = ISSI_IS25LP016, 8369 .total_size = 2048, 8370 .page_size = 256, 8371 /* OTP: 1024B total; read 0x48; write 0x42 */ 8372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8373 .tested = TEST_OK_PREW, 8374 .probe = PROBE_SPI_RDID, 8375 .probe_timing = TIMING_ZERO, 8376 .block_erasers = 8377 { 8378 { 8379 .eraseblocks = { {4 * 1024, 512} }, 8380 .block_erase = SPI_BLOCK_ERASE_20, 8381 }, { 8382 .eraseblocks = { {4 * 1024, 512} }, 8383 .block_erase = SPI_BLOCK_ERASE_D7, 8384 }, { 8385 .eraseblocks = { {32 * 1024, 64} }, 8386 .block_erase = SPI_BLOCK_ERASE_52, 8387 }, { 8388 .eraseblocks = { {64 * 1024, 32} }, 8389 .block_erase = SPI_BLOCK_ERASE_D8, 8390 }, { 8391 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8392 .block_erase = SPI_BLOCK_ERASE_60, 8393 }, { 8394 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8395 .block_erase = SPI_BLOCK_ERASE_C7, 8396 } 8397 }, 8398 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 8399 .write = SPI_CHIP_WRITE256, 8400 .read = SPI_CHIP_READ, 8401 .voltage = {2300, 3600}, 8402 }, 8403 8404 { 8405 .vendor = "ISSI", 8406 .name = "IS25LP064", 8407 .bustype = BUS_SPI, 8408 .manufacture_id = ISSI_ID_SPI, 8409 .model_id = ISSI_IS25LP064, 8410 .total_size = 8192, 8411 .page_size = 256, 8412 /* OTP: 1024B total; read 0x48; write 0x42 */ 8413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8414 .tested = TEST_OK_PREW, 8415 .probe = PROBE_SPI_RDID, 8416 .probe_timing = TIMING_ZERO, 8417 .block_erasers = 8418 { 8419 { 8420 .eraseblocks = { {4 * 1024, 2048} }, 8421 .block_erase = SPI_BLOCK_ERASE_20, 8422 }, { 8423 .eraseblocks = { {4 * 1024, 2048} }, 8424 .block_erase = SPI_BLOCK_ERASE_D7, 8425 }, { 8426 .eraseblocks = { {32 * 1024, 256} }, 8427 .block_erase = SPI_BLOCK_ERASE_52, 8428 }, { 8429 .eraseblocks = { {64 * 1024, 128} }, 8430 .block_erase = SPI_BLOCK_ERASE_D8, 8431 }, { 8432 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8433 .block_erase = SPI_BLOCK_ERASE_60, 8434 }, { 8435 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8436 .block_erase = SPI_BLOCK_ERASE_C7, 8437 } 8438 }, 8439 .unlock = SPI_DISABLE_BLOCKPROTECT, 8440 .write = SPI_CHIP_WRITE256, 8441 .read = SPI_CHIP_READ, 8442 .voltage = {2300, 3600}, 8443 }, 8444 8445 { 8446 .vendor = "ISSI", 8447 .name = "IS25LP128", 8448 .bustype = BUS_SPI, 8449 .manufacture_id = ISSI_ID_SPI, 8450 .model_id = ISSI_IS25LP128, 8451 .total_size = 16384, 8452 .page_size = 256, 8453 /* OTP: 1024B total; read 0x48; write 0x42 */ 8454 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 8455 .tested = TEST_OK_PREW, 8456 .probe = PROBE_SPI_RDID, 8457 .probe_timing = TIMING_ZERO, 8458 .block_erasers = 8459 { 8460 { 8461 .eraseblocks = { {4 * 1024, 4096} }, 8462 .block_erase = SPI_BLOCK_ERASE_20, 8463 }, { 8464 .eraseblocks = { {4 * 1024, 4096} }, 8465 .block_erase = SPI_BLOCK_ERASE_D7, 8466 }, { 8467 .eraseblocks = { {32 * 1024, 512} }, 8468 .block_erase = SPI_BLOCK_ERASE_52, 8469 }, { 8470 .eraseblocks = { {64 * 1024, 256} }, 8471 .block_erase = SPI_BLOCK_ERASE_D8, 8472 }, { 8473 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8474 .block_erase = SPI_BLOCK_ERASE_60, 8475 }, { 8476 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8477 .block_erase = SPI_BLOCK_ERASE_C7, 8478 } 8479 }, 8480 .unlock = SPI_DISABLE_BLOCKPROTECT, 8481 .write = SPI_CHIP_WRITE256, 8482 .read = SPI_CHIP_READ, 8483 .voltage = {2300, 3600}, 8484 }, 8485 8486 { 8487 .vendor = "ISSI", 8488 .name = "IS25LP256", 8489 .bustype = BUS_SPI, 8490 .manufacture_id = ISSI_ID_SPI, 8491 .model_id = ISSI_IS25LP256, 8492 .total_size = 32768, 8493 .page_size = 256, 8494 /* supports SFDP */ 8495 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */ 8496 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 8497 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716, 8498 .tested = TEST_OK_PREW, 8499 .probe = PROBE_SPI_RDID, 8500 .probe_timing = TIMING_ZERO, 8501 .block_erasers = 8502 { 8503 { 8504 .eraseblocks = { {4 * 1024, 8192} }, 8505 .block_erase = SPI_BLOCK_ERASE_21, 8506 }, { 8507 .eraseblocks = { {4 * 1024, 8192} }, 8508 .block_erase = SPI_BLOCK_ERASE_20, 8509 /* could also use SPI_BLOCK_ERASE_D7 */ 8510 }, { 8511 .eraseblocks = { {32 * 1024, 1024} }, 8512 .block_erase = SPI_BLOCK_ERASE_5C, 8513 }, { 8514 .eraseblocks = { {32 * 1024, 1024} }, 8515 .block_erase = SPI_BLOCK_ERASE_52, 8516 }, { 8517 .eraseblocks = { {64 * 1024, 512} }, 8518 .block_erase = SPI_BLOCK_ERASE_DC, 8519 }, { 8520 .eraseblocks = { {64 * 1024, 512} }, 8521 .block_erase = SPI_BLOCK_ERASE_D8, 8522 }, { 8523 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8524 .block_erase = SPI_BLOCK_ERASE_60, 8525 }, { 8526 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8527 .block_erase = SPI_BLOCK_ERASE_C7, 8528 } 8529 }, 8530 .unlock = SPI_DISABLE_BLOCKPROTECT, 8531 .write = SPI_CHIP_WRITE256, 8532 .read = SPI_CHIP_READ, 8533 .voltage = {2300, 3600}, 8534 }, 8535 8536 8537 { 8538 .vendor = "ISSI", 8539 .name = "IS25LQ016", 8540 .bustype = BUS_SPI, 8541 .manufacture_id = ISSI_ID_SPI, 8542 .model_id = ISSI_IS25LQ016, 8543 .total_size = 2048, 8544 .page_size = 256, 8545 /* OTP: 256B total; read 0x4b; write 0xb1 */ 8546 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8547 .tested = TEST_OK_PREW, 8548 .probe = PROBE_SPI_RDID, 8549 .probe_timing = TIMING_ZERO, 8550 .block_erasers = 8551 { 8552 { 8553 .eraseblocks = { {4 * 1024, 512} }, 8554 .block_erase = SPI_BLOCK_ERASE_20, 8555 }, { 8556 .eraseblocks = { {4 * 1024, 512} }, 8557 .block_erase = SPI_BLOCK_ERASE_D7, 8558 }, { 8559 .eraseblocks = { {64 * 1024, 32} }, 8560 .block_erase = SPI_BLOCK_ERASE_D8, 8561 }, { 8562 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8563 .block_erase = SPI_BLOCK_ERASE_60, 8564 }, { 8565 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8566 .block_erase = SPI_BLOCK_ERASE_C7, 8567 } 8568 }, 8569 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 8570 .unlock = SPI_DISABLE_BLOCKPROTECT, 8571 .write = SPI_CHIP_WRITE256, 8572 .read = SPI_CHIP_READ, 8573 .voltage = {2300, 3600}, 8574 }, 8575 8576 { 8577 .vendor = "ISSI", 8578 .name = "IS25WP016", 8579 .bustype = BUS_SPI, 8580 .manufacture_id = ISSI_ID_SPI, 8581 .model_id = ISSI_IS25WP016, 8582 .total_size = 2048, 8583 .page_size = 256, 8584 /* OTP: 1024B total; read 0x48; write 0x42 */ 8585 /* QPI enable 0x35, disable 0xF5 */ 8586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8587 .tested = TEST_OK_PREW, 8588 .probe = PROBE_SPI_RDID, 8589 .probe_timing = TIMING_ZERO, 8590 .block_erasers = 8591 { 8592 { 8593 .eraseblocks = { {4 * 1024, 512} }, 8594 .block_erase = SPI_BLOCK_ERASE_20, 8595 }, { 8596 .eraseblocks = { {4 * 1024, 512} }, 8597 .block_erase = SPI_BLOCK_ERASE_D7, 8598 }, { 8599 .eraseblocks = { {32 * 1024, 64} }, 8600 .block_erase = SPI_BLOCK_ERASE_52, 8601 }, { 8602 .eraseblocks = { {64 * 1024, 32} }, 8603 .block_erase = SPI_BLOCK_ERASE_D8, 8604 }, { 8605 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8606 .block_erase = SPI_BLOCK_ERASE_60, 8607 }, { 8608 .eraseblocks = { {2 * 1024 * 1024, 1} }, 8609 .block_erase = SPI_BLOCK_ERASE_C7, 8610 } 8611 }, 8612 .unlock = SPI_DISABLE_BLOCKPROTECT, 8613 .write = SPI_CHIP_WRITE256, 8614 .read = SPI_CHIP_READ, 8615 .voltage = {1650, 1950}, 8616 }, 8617 8618 { 8619 .vendor = "ISSI", 8620 .name = "IS25WP020", 8621 .bustype = BUS_SPI, 8622 .manufacture_id = ISSI_ID_SPI, 8623 .model_id = ISSI_IS25WP020, 8624 .total_size = 256, 8625 .page_size = 256, 8626 /* OTP: 1024B total; read 0x48; write 0x42 */ 8627 /* QPI enable 0x35, disable 0xF5 */ 8628 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8629 .tested = TEST_UNTESTED, 8630 .probe = PROBE_SPI_RDID, 8631 .probe_timing = TIMING_ZERO, 8632 .block_erasers = 8633 { 8634 { 8635 .eraseblocks = { {4 * 1024, 64} }, 8636 .block_erase = SPI_BLOCK_ERASE_20, 8637 }, { 8638 .eraseblocks = { {4 * 1024, 64} }, 8639 .block_erase = SPI_BLOCK_ERASE_D7, 8640 }, { 8641 .eraseblocks = { {32 * 1024, 8} }, 8642 .block_erase = SPI_BLOCK_ERASE_52, 8643 }, { 8644 .eraseblocks = { {64 * 1024, 4} }, 8645 .block_erase = SPI_BLOCK_ERASE_D8, 8646 }, { 8647 .eraseblocks = { {256 * 1024, 1} }, 8648 .block_erase = SPI_BLOCK_ERASE_60, 8649 }, { 8650 .eraseblocks = { {256 * 1024, 1} }, 8651 .block_erase = SPI_BLOCK_ERASE_C7, 8652 } 8653 }, 8654 .unlock = SPI_DISABLE_BLOCKPROTECT, 8655 .write = SPI_CHIP_WRITE256, 8656 .read = SPI_CHIP_READ, 8657 .voltage = {1650, 1950}, 8658 }, 8659 8660 { 8661 .vendor = "ISSI", 8662 .name = "IS25WP032", 8663 .bustype = BUS_SPI, 8664 .manufacture_id = ISSI_ID_SPI, 8665 .model_id = ISSI_IS25WP032, 8666 .total_size = 4096, 8667 .page_size = 256, 8668 /* OTP: 1024B total; read 0x48; write 0x42 */ 8669 /* QPI enable 0x35, disable 0xF5 */ 8670 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8671 .tested = TEST_UNTESTED, 8672 .probe = PROBE_SPI_RDID, 8673 .probe_timing = TIMING_ZERO, 8674 .block_erasers = 8675 { 8676 { 8677 .eraseblocks = { {4 * 1024, 1024} }, 8678 .block_erase = SPI_BLOCK_ERASE_20, 8679 }, { 8680 .eraseblocks = { {4 * 1024, 1024} }, 8681 .block_erase = SPI_BLOCK_ERASE_D7, 8682 }, { 8683 .eraseblocks = { {32 * 1024, 128} }, 8684 .block_erase = SPI_BLOCK_ERASE_52, 8685 }, { 8686 .eraseblocks = { {64 * 1024, 64} }, 8687 .block_erase = SPI_BLOCK_ERASE_D8, 8688 }, { 8689 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8690 .block_erase = SPI_BLOCK_ERASE_60, 8691 }, { 8692 .eraseblocks = { {4 * 1024 * 1024, 1} }, 8693 .block_erase = SPI_BLOCK_ERASE_C7, 8694 } 8695 }, 8696 .unlock = SPI_DISABLE_BLOCKPROTECT, 8697 .write = SPI_CHIP_WRITE256, 8698 .read = SPI_CHIP_READ, 8699 .voltage = {1650, 1950}, 8700 }, 8701 8702 { 8703 .vendor = "ISSI", 8704 .name = "IS25WP040", 8705 .bustype = BUS_SPI, 8706 .manufacture_id = ISSI_ID_SPI, 8707 .model_id = ISSI_IS25WP040, 8708 .total_size = 512, 8709 .page_size = 256, 8710 /* OTP: 1024B total; read 0x48; write 0x42 */ 8711 /* QPI enable 0x35, disable 0xF5 */ 8712 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8713 .tested = TEST_UNTESTED, 8714 .probe = PROBE_SPI_RDID, 8715 .probe_timing = TIMING_ZERO, 8716 .block_erasers = 8717 { 8718 { 8719 .eraseblocks = { {4 * 1024, 128} }, 8720 .block_erase = SPI_BLOCK_ERASE_20, 8721 }, { 8722 .eraseblocks = { {4 * 1024, 128} }, 8723 .block_erase = SPI_BLOCK_ERASE_D7, 8724 }, { 8725 .eraseblocks = { {32 * 1024, 16} }, 8726 .block_erase = SPI_BLOCK_ERASE_52, 8727 }, { 8728 .eraseblocks = { {64 * 1024, 8} }, 8729 .block_erase = SPI_BLOCK_ERASE_D8, 8730 }, { 8731 .eraseblocks = { {512 * 1024, 1} }, 8732 .block_erase = SPI_BLOCK_ERASE_60, 8733 }, { 8734 .eraseblocks = { {512 * 1024, 1} }, 8735 .block_erase = SPI_BLOCK_ERASE_C7, 8736 } 8737 }, 8738 .unlock = SPI_DISABLE_BLOCKPROTECT, 8739 .write = SPI_CHIP_WRITE256, 8740 .read = SPI_CHIP_READ, 8741 .voltage = {1650, 1950}, 8742 }, 8743 8744 { 8745 .vendor = "ISSI", 8746 .name = "IS25WP064", 8747 .bustype = BUS_SPI, 8748 .manufacture_id = ISSI_ID_SPI, 8749 .model_id = ISSI_IS25WP064, 8750 .total_size = 8192, 8751 .page_size = 256, 8752 /* OTP: 1024B total; read 0x48; write 0x42 */ 8753 /* QPI enable 0x35, disable 0xF5 */ 8754 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8755 .tested = TEST_OK_PREW, 8756 .probe = PROBE_SPI_RDID, 8757 .probe_timing = TIMING_ZERO, 8758 .block_erasers = 8759 { 8760 { 8761 .eraseblocks = { {4 * 1024, 2048} }, 8762 .block_erase = SPI_BLOCK_ERASE_20, 8763 }, { 8764 .eraseblocks = { {4 * 1024, 2048} }, 8765 .block_erase = SPI_BLOCK_ERASE_D7, 8766 }, { 8767 .eraseblocks = { {32 * 1024, 256} }, 8768 .block_erase = SPI_BLOCK_ERASE_52, 8769 }, { 8770 .eraseblocks = { {64 * 1024, 128} }, 8771 .block_erase = SPI_BLOCK_ERASE_D8, 8772 }, { 8773 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8774 .block_erase = SPI_BLOCK_ERASE_60, 8775 }, { 8776 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8777 .block_erase = SPI_BLOCK_ERASE_C7, 8778 } 8779 }, 8780 .unlock = SPI_DISABLE_BLOCKPROTECT, 8781 .write = SPI_CHIP_WRITE256, 8782 .read = SPI_CHIP_READ, 8783 .voltage = {1650, 1950}, 8784 }, 8785 8786 { 8787 .vendor = "ISSI", 8788 .name = "IS25WP080", 8789 .bustype = BUS_SPI, 8790 .manufacture_id = ISSI_ID_SPI, 8791 .model_id = ISSI_IS25WP080, 8792 .total_size = 1024, 8793 .page_size = 256, 8794 /* OTP: 1024B total; read 0x48; write 0x42 */ 8795 /* QPI enable 0x35, disable 0xF5 */ 8796 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8797 .tested = TEST_OK_PREW, 8798 .probe = PROBE_SPI_RDID, 8799 .probe_timing = TIMING_ZERO, 8800 .block_erasers = 8801 { 8802 { 8803 .eraseblocks = { {4 * 1024, 256} }, 8804 .block_erase = SPI_BLOCK_ERASE_20, 8805 }, { 8806 .eraseblocks = { {4 * 1024, 256} }, 8807 .block_erase = SPI_BLOCK_ERASE_D7, 8808 }, { 8809 .eraseblocks = { {32 * 1024, 32} }, 8810 .block_erase = SPI_BLOCK_ERASE_52, 8811 }, { 8812 .eraseblocks = { {64 * 1024, 16} }, 8813 .block_erase = SPI_BLOCK_ERASE_D8, 8814 }, { 8815 .eraseblocks = { {1024 * 1024, 1} }, 8816 .block_erase = SPI_BLOCK_ERASE_60, 8817 }, { 8818 .eraseblocks = { {1024 * 1024, 1} }, 8819 .block_erase = SPI_BLOCK_ERASE_C7, 8820 } 8821 }, 8822 .unlock = SPI_DISABLE_BLOCKPROTECT, 8823 .write = SPI_CHIP_WRITE256, 8824 .read = SPI_CHIP_READ, 8825 .voltage = {1650, 1950}, 8826 }, 8827 8828 { 8829 .vendor = "ISSI", 8830 .name = "IS25WP128", 8831 .bustype = BUS_SPI, 8832 .manufacture_id = ISSI_ID_SPI, 8833 .model_id = ISSI_IS25WP128, 8834 .total_size = 16384, 8835 .page_size = 256, 8836 /* OTP: 1024B total; read 0x48; write 0x42 */ 8837 /* QPI enable 0x35, disable 0xF5 */ 8838 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8839 .tested = TEST_OK_PREW, 8840 .probe = PROBE_SPI_RDID, 8841 .probe_timing = TIMING_ZERO, 8842 .block_erasers = 8843 { 8844 { 8845 .eraseblocks = { {4 * 1024, 4096} }, 8846 .block_erase = SPI_BLOCK_ERASE_20, 8847 }, { 8848 .eraseblocks = { {4 * 1024, 4096} }, 8849 .block_erase = SPI_BLOCK_ERASE_D7, 8850 }, { 8851 .eraseblocks = { {32 * 1024, 512} }, 8852 .block_erase = SPI_BLOCK_ERASE_52, 8853 }, { 8854 .eraseblocks = { {64 * 1024, 256} }, 8855 .block_erase = SPI_BLOCK_ERASE_D8, 8856 }, { 8857 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8858 .block_erase = SPI_BLOCK_ERASE_60, 8859 }, { 8860 .eraseblocks = { {16 * 1024 * 1024, 1} }, 8861 .block_erase = SPI_BLOCK_ERASE_C7, 8862 } 8863 }, 8864 .unlock = SPI_DISABLE_BLOCKPROTECT, 8865 .write = SPI_CHIP_WRITE256, 8866 .read = SPI_CHIP_READ, 8867 .voltage = {1650, 1950}, 8868 }, 8869 8870 { 8871 .vendor = "ISSI", 8872 .name = "IS25WP256", 8873 .bustype = BUS_SPI, 8874 .manufacture_id = ISSI_ID_SPI, 8875 .model_id = ISSI_IS25WP256, 8876 .total_size = 32768, 8877 .page_size = 256, 8878 /* supports SFDP */ 8879 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */ 8880 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 8881 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716, 8882 .tested = TEST_OK_PREW, 8883 .probe = PROBE_SPI_RDID, 8884 .probe_timing = TIMING_ZERO, 8885 .block_erasers = 8886 { 8887 { 8888 .eraseblocks = { {4 * 1024, 8192} }, 8889 .block_erase = SPI_BLOCK_ERASE_21, 8890 }, { 8891 .eraseblocks = { {4 * 1024, 8192} }, 8892 .block_erase = SPI_BLOCK_ERASE_20, 8893 /* could also use SPI_BLOCK_ERASE_D7 */ 8894 }, { 8895 .eraseblocks = { {32 * 1024, 1024} }, 8896 .block_erase = SPI_BLOCK_ERASE_5C, 8897 }, { 8898 .eraseblocks = { {32 * 1024, 1024} }, 8899 .block_erase = SPI_BLOCK_ERASE_52, 8900 }, { 8901 .eraseblocks = { {64 * 1024, 512} }, 8902 .block_erase = SPI_BLOCK_ERASE_DC, 8903 }, { 8904 .eraseblocks = { {64 * 1024, 512} }, 8905 .block_erase = SPI_BLOCK_ERASE_D8, 8906 }, { 8907 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8908 .block_erase = SPI_BLOCK_ERASE_60, 8909 }, { 8910 .eraseblocks = { {32 * 1024 * 1024, 1} }, 8911 .block_erase = SPI_BLOCK_ERASE_C7, 8912 } 8913 }, 8914 .unlock = SPI_DISABLE_BLOCKPROTECT, 8915 .write = SPI_CHIP_WRITE256, 8916 .read = SPI_CHIP_READ, 8917 .voltage = {1650, 1950}, 8918 }, 8919 8920 { 8921 .vendor = "ISSI", 8922 .name = "IS25WQ040", 8923 .bustype = BUS_SPI, 8924 .manufacture_id = ISSI_ID_SPI, 8925 .model_id = ISSI_IS25WQ040, 8926 .total_size = 512, 8927 .page_size = 256, 8928 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 8929 .tested = TEST_OK_PREW, 8930 .probe = PROBE_SPI_RDID, 8931 .probe_timing = TIMING_ZERO, 8932 .block_erasers = 8933 { 8934 { 8935 .eraseblocks = { {4 * 1024, 128} }, 8936 .block_erase = SPI_BLOCK_ERASE_20, 8937 }, { 8938 .eraseblocks = { {4 * 1024, 128} }, 8939 .block_erase = SPI_BLOCK_ERASE_D7, 8940 }, { 8941 .eraseblocks = { {32 * 1024, 16} }, 8942 .block_erase = SPI_BLOCK_ERASE_52, 8943 }, { 8944 .eraseblocks = { {64 * 1024, 8} }, 8945 .block_erase = SPI_BLOCK_ERASE_D8, 8946 }, { 8947 .eraseblocks = { {512 * 1024, 1} }, 8948 .block_erase = SPI_BLOCK_ERASE_60, 8949 }, { 8950 .eraseblocks = { {512 * 1024, 1} }, 8951 .block_erase = SPI_BLOCK_ERASE_C7, 8952 } 8953 }, 8954 .unlock = SPI_DISABLE_BLOCKPROTECT, 8955 .write = SPI_CHIP_WRITE256, 8956 .read = SPI_CHIP_READ, 8957 .voltage = {1650, 1950}, 8958 }, 8959 8960 { 8961 .vendor = "ISSI", 8962 .name = "IS29GL064B", 8963 .bustype = BUS_PARALLEL, 8964 .manufacture_id = ISSI_ID, 8965 .model_id = ISSI_PMC_IS29GL064B, 8966 .total_size = 8192, 8967 .page_size = 128 * 1024, /* actual page size is 16 */ 8968 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 8969 .tested = TEST_UNTESTED, 8970 .probe = PROBE_JEDEC_29GL, 8971 .probe_timing = TIMING_ZERO, 8972 .block_erasers = 8973 { 8974 { 8975 .eraseblocks = { 8976 {8 * 1024, 8}, 8977 {64 * 1024, 127}, 8978 }, 8979 .block_erase = JEDEC_SECTOR_ERASE, 8980 }, { 8981 .eraseblocks = { {8 * 1024 * 1024, 1} }, 8982 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 8983 }, 8984 }, 8985 .write = WRITE_JEDEC1, 8986 .read = READ_MEMMAPPED, 8987 .voltage = {2700, 3600}, 8988 }, 8989 8990 { 8991 .vendor = "ISSI", 8992 .name = "IS29GL064H/L", 8993 .bustype = BUS_PARALLEL, 8994 .manufacture_id = ISSI_ID, 8995 .model_id = ISSI_PMC_IS29GL064HL, 8996 .total_size = 8192, 8997 .page_size = 128 * 1024, /* actual page size is 16 */ 8998 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 8999 .tested = TEST_UNTESTED, 9000 .probe = PROBE_JEDEC_29GL, 9001 .probe_timing = TIMING_ZERO, 9002 .block_erasers = 9003 { 9004 { 9005 .eraseblocks = { {64 * 1024, 128} }, 9006 .block_erase = JEDEC_SECTOR_ERASE, 9007 }, { 9008 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9009 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 9010 }, 9011 }, 9012 .write = WRITE_JEDEC1, 9013 .read = READ_MEMMAPPED, 9014 .voltage = {2700, 3600}, 9015 }, 9016 9017 { 9018 .vendor = "ISSI", 9019 .name = "IS29GL064T", 9020 .bustype = BUS_PARALLEL, 9021 .manufacture_id = ISSI_ID, 9022 .model_id = ISSI_PMC_IS29GL064T, 9023 .total_size = 8192, 9024 .page_size = 128 * 1024, /* actual page size is 16 */ 9025 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9026 .tested = TEST_UNTESTED, 9027 .probe = PROBE_JEDEC_29GL, 9028 .probe_timing = TIMING_ZERO, 9029 .block_erasers = 9030 { 9031 { 9032 .eraseblocks = { 9033 {64 * 1024, 127}, 9034 {8 * 1024, 8}, 9035 }, 9036 .block_erase = JEDEC_SECTOR_ERASE, 9037 }, { 9038 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9039 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 9040 }, 9041 }, 9042 .write = WRITE_JEDEC1, 9043 .read = READ_MEMMAPPED, 9044 .voltage = {2700, 3600}, 9045 }, 9046 9047 { 9048 .vendor = "ISSI", 9049 .name = "IS29GL128H/L", 9050 .bustype = BUS_PARALLEL, 9051 .manufacture_id = ISSI_ID, 9052 .model_id = ISSI_PMC_IS29GL128HL, 9053 .total_size = 16384, 9054 .page_size = 128 * 1024, /* actual page size is 16 */ 9055 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 9056 .tested = TEST_UNTESTED, 9057 .probe = PROBE_JEDEC_29GL, 9058 .probe_timing = TIMING_ZERO, 9059 .block_erasers = 9060 { 9061 { 9062 .eraseblocks = { {128 * 1024, 128} }, 9063 .block_erase = JEDEC_SECTOR_ERASE, 9064 }, { 9065 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9066 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 9067 }, 9068 }, 9069 .write = WRITE_JEDEC1, 9070 .read = READ_MEMMAPPED, 9071 .voltage = {2700, 3600}, 9072 }, 9073 9074 { 9075 .vendor = "Intel", 9076 .name = "25F160S33B8", 9077 .bustype = BUS_SPI, 9078 .manufacture_id = INTEL_ID, 9079 .model_id = INTEL_25F160S33B8, 9080 .total_size = 2048, 9081 .page_size = 256, 9082 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9083 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9084 .tested = TEST_UNTESTED, 9085 .probe = PROBE_SPI_RDID, 9086 .probe_timing = TIMING_ZERO, 9087 .block_erasers = 9088 { 9089 { 9090 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9091 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9092 * have no effect on the memory contents, but sets a flag in the SR. 9093 .eraseblocks = { 9094 {8 * 1024, 8}, 9095 {64 * 1024, 31} // inaccessible 9096 }, 9097 .block_erase = SPI_BLOCK_ERASE_40, 9098 }, { */ 9099 .eraseblocks = { {64 * 1024, 32} }, 9100 .block_erase = SPI_BLOCK_ERASE_D8, 9101 }, { 9102 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9103 .block_erase = SPI_BLOCK_ERASE_C7, 9104 } 9105 }, 9106 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9107 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9108 .write = SPI_CHIP_WRITE256, 9109 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9110 .voltage = {2700, 3600}, 9111 }, 9112 9113 { 9114 .vendor = "Intel", 9115 .name = "25F160S33T8", 9116 .bustype = BUS_SPI, 9117 .manufacture_id = INTEL_ID, 9118 .model_id = INTEL_25F160S33T8, 9119 .total_size = 2048, 9120 .page_size = 256, 9121 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9123 .tested = TEST_UNTESTED, 9124 .probe = PROBE_SPI_RDID, 9125 .probe_timing = TIMING_ZERO, 9126 .block_erasers = 9127 { 9128 { 9129 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9130 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9131 * have no effect on the memory contents, but sets a flag in the SR. 9132 .eraseblocks = { 9133 {64 * 1024, 31}, // inaccessible 9134 {8 * 1024, 8} 9135 }, 9136 .block_erase = SPI_BLOCK_ERASE_40, 9137 }, { */ 9138 .eraseblocks = { {64 * 1024, 32} }, 9139 .block_erase = SPI_BLOCK_ERASE_D8, 9140 }, { 9141 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9142 .block_erase = SPI_BLOCK_ERASE_C7, 9143 } 9144 }, 9145 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9146 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9147 .write = SPI_CHIP_WRITE256, 9148 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9149 .voltage = {2700, 3600}, 9150 }, 9151 9152 { 9153 .vendor = "Intel", 9154 .name = "25F320S33B8", 9155 .bustype = BUS_SPI, 9156 .manufacture_id = INTEL_ID, 9157 .model_id = INTEL_25F320S33B8, 9158 .total_size = 4096, 9159 .page_size = 256, 9160 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9161 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9162 .tested = TEST_UNTESTED, 9163 .probe = PROBE_SPI_RDID, 9164 .probe_timing = TIMING_ZERO, 9165 .block_erasers = 9166 { 9167 { 9168 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9169 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9170 * have no effect on the memory contents, but sets a flag in the SR. 9171 .eraseblocks = { 9172 {8 * 1024, 8}, 9173 {64 * 1024, 63} // inaccessible 9174 }, 9175 .block_erase = SPI_BLOCK_ERASE_40, 9176 }, { */ 9177 .eraseblocks = { {64 * 1024, 64} }, 9178 .block_erase = SPI_BLOCK_ERASE_D8, 9179 }, { 9180 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9181 .block_erase = SPI_BLOCK_ERASE_C7, 9182 } 9183 }, 9184 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9185 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9186 .write = SPI_CHIP_WRITE256, 9187 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9188 .voltage = {2700, 3600}, 9189 }, 9190 9191 { 9192 .vendor = "Intel", 9193 .name = "25F320S33T8", 9194 .bustype = BUS_SPI, 9195 .manufacture_id = INTEL_ID, 9196 .model_id = INTEL_25F320S33T8, 9197 .total_size = 4096, 9198 .page_size = 256, 9199 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9200 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9201 .tested = TEST_UNTESTED, 9202 .probe = PROBE_SPI_RDID, 9203 .probe_timing = TIMING_ZERO, 9204 .block_erasers = 9205 { 9206 { 9207 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9208 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9209 * have no effect on the memory contents, but sets a flag in the SR. 9210 .eraseblocks = { 9211 {64 * 1024, 63}, // inaccessible 9212 {8 * 1024, 8} 9213 }, 9214 .block_erase = SPI_BLOCK_ERASE_40, 9215 }, { */ 9216 .eraseblocks = { {64 * 1024, 64} }, 9217 .block_erase = SPI_BLOCK_ERASE_D8, 9218 }, { 9219 .eraseblocks = { {4 * 1024 * 1024, 1} }, 9220 .block_erase = SPI_BLOCK_ERASE_C7, 9221 } 9222 }, 9223 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9224 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9225 .write = SPI_CHIP_WRITE256, 9226 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9227 .voltage = {2700, 3600}, 9228 }, 9229 9230 { 9231 .vendor = "Intel", 9232 .name = "25F640S33B8", 9233 .bustype = BUS_SPI, 9234 .manufacture_id = INTEL_ID, 9235 .model_id = INTEL_25F640S33B8, 9236 .total_size = 8192, 9237 .page_size = 256, 9238 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9239 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9240 .tested = TEST_OK_PREW, 9241 .probe = PROBE_SPI_RDID, 9242 .probe_timing = TIMING_ZERO, 9243 .block_erasers = 9244 { 9245 { 9246 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9247 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9248 * have no effect on the memory contents, but sets a flag in the SR. 9249 .eraseblocks = { 9250 {8 * 1024, 8}, 9251 {64 * 1024, 127} // inaccessible 9252 }, 9253 .block_erase = SPI_BLOCK_ERASE_40, 9254 }, { */ 9255 .eraseblocks = { {64 * 1024, 128} }, 9256 .block_erase = SPI_BLOCK_ERASE_D8, 9257 }, { 9258 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9259 .block_erase = SPI_BLOCK_ERASE_C7, 9260 } 9261 }, 9262 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9263 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9264 .write = SPI_CHIP_WRITE256, 9265 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9266 .voltage = {2700, 3600}, 9267 }, 9268 9269 { 9270 .vendor = "Intel", 9271 .name = "25F640S33T8", 9272 .bustype = BUS_SPI, 9273 .manufacture_id = INTEL_ID, 9274 .model_id = INTEL_25F640S33T8, 9275 .total_size = 8192, 9276 .page_size = 256, 9277 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */ 9278 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9279 .tested = TEST_UNTESTED, 9280 .probe = PROBE_SPI_RDID, 9281 .probe_timing = TIMING_ZERO, 9282 .block_erasers = 9283 { 9284 { 9285 /* This chip supports erasing of the 8 so-called "parameter blocks" with 9286 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does 9287 * have no effect on the memory contents, but sets a flag in the SR. 9288 .eraseblocks = { 9289 {64 * 1024, 127}, // inaccessible 9290 {8 * 1024, 8} 9291 }, 9292 .block_erase = SPI_BLOCK_ERASE_40, 9293 }, { */ 9294 .eraseblocks = { {64 * 1024, 128} }, 9295 .block_erase = SPI_BLOCK_ERASE_D8, 9296 }, { 9297 .eraseblocks = { {8 * 1024 * 1024, 1} }, 9298 .block_erase = SPI_BLOCK_ERASE_C7, 9299 } 9300 }, 9301 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, 9302 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_EP_SRWD, 9303 .write = SPI_CHIP_WRITE256, 9304 .read = SPI_CHIP_READ, /* also fast read 0x0B */ 9305 .voltage = {2700, 3600}, 9306 }, 9307 9308 { 9309 .vendor = "Intel", 9310 .name = "28F001BN/BX-B", 9311 .bustype = BUS_PARALLEL, 9312 .manufacture_id = INTEL_ID, 9313 .model_id = INTEL_28F001B, 9314 .total_size = 128, 9315 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */ 9316 .tested = TEST_UNTESTED, 9317 .probe = PROBE_JEDEC, 9318 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9319 .block_erasers = 9320 { 9321 { 9322 .eraseblocks = { 9323 {8 * 1024, 1}, 9324 {4 * 1024, 2}, 9325 {112 * 1024, 1}, 9326 }, 9327 .block_erase = ERASE_BLOCK_82802AB, 9328 }, 9329 }, 9330 .write = WRITE_82802AB, 9331 .read = READ_MEMMAPPED, 9332 .voltage = {4500, 5500}, 9333 }, 9334 9335 { 9336 .vendor = "Intel", 9337 .name = "28F001BN/BX-T", 9338 .bustype = BUS_PARALLEL, 9339 .manufacture_id = INTEL_ID, 9340 .model_id = INTEL_28F001T, 9341 .total_size = 128, 9342 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */ 9343 .tested = TEST_OK_PREW, 9344 .probe = PROBE_JEDEC, 9345 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9346 .block_erasers = 9347 { 9348 { 9349 .eraseblocks = { 9350 {112 * 1024, 1}, 9351 {4 * 1024, 2}, 9352 {8 * 1024, 1}, 9353 }, 9354 .block_erase = ERASE_BLOCK_82802AB, 9355 }, 9356 }, 9357 .write = WRITE_82802AB, 9358 .read = READ_MEMMAPPED, 9359 .voltage = {4500, 5500}, 9360 }, 9361 9362 { 9363 .vendor = "Intel", 9364 .name = "28F002BC/BL/BV/BX-T", 9365 .bustype = BUS_PARALLEL, 9366 .manufacture_id = INTEL_ID, 9367 .model_id = INTEL_28F002T, 9368 .total_size = 256, 9369 .page_size = 256 * 1024, 9370 .tested = TEST_OK_PRE, 9371 .probe = PROBE_AT82802AB, 9372 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9373 .block_erasers = 9374 { 9375 { 9376 .eraseblocks = { 9377 {128 * 1024, 1}, 9378 {96 * 1024, 1}, 9379 {8 * 1024, 2}, 9380 {16 * 1024, 1}, 9381 }, 9382 .block_erase = ERASE_BLOCK_82802AB, 9383 }, 9384 }, 9385 .write = WRITE_82802AB, 9386 .read = READ_MEMMAPPED, 9387 }, 9388 9389 { 9390 .vendor = "Intel", 9391 .name = "28F004B5/BE/BV/BX-B", 9392 .bustype = BUS_PARALLEL, 9393 .manufacture_id = INTEL_ID, 9394 .model_id = INTEL_28F004B, 9395 .total_size = 512, 9396 .page_size = 128 * 1024, /* maximal block size */ 9397 .tested = TEST_UNTESTED, 9398 .probe = PROBE_AT82802AB, 9399 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9400 .block_erasers = 9401 { 9402 { 9403 .eraseblocks = { 9404 {16 * 1024, 1}, 9405 {8 * 1024, 2}, 9406 {96 * 1024, 1}, 9407 {128 * 1024, 3}, 9408 }, 9409 .block_erase = ERASE_BLOCK_82802AB, 9410 }, 9411 }, 9412 .write = WRITE_82802AB, 9413 .read = READ_MEMMAPPED, 9414 }, 9415 9416 { 9417 .vendor = "Intel", 9418 .name = "28F004B5/BE/BV/BX-T", 9419 .bustype = BUS_PARALLEL, 9420 .manufacture_id = INTEL_ID, 9421 .model_id = INTEL_28F004T, 9422 .total_size = 512, 9423 .page_size = 128 * 1024, /* maximal block size */ 9424 .tested = TEST_UNTESTED, 9425 .probe = PROBE_AT82802AB, 9426 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9427 .block_erasers = 9428 { 9429 { 9430 .eraseblocks = { 9431 {128 * 1024, 3}, 9432 {96 * 1024, 1}, 9433 {8 * 1024, 2}, 9434 {16 * 1024, 1}, 9435 }, 9436 .block_erase = ERASE_BLOCK_82802AB, 9437 }, 9438 }, 9439 .write = WRITE_82802AB, 9440 .read = READ_MEMMAPPED, 9441 }, 9442 9443 { 9444 .vendor = "Intel", 9445 .name = "28F008S3/S5/SC", 9446 .bustype = BUS_PARALLEL, 9447 .manufacture_id = INTEL_ID, 9448 .model_id = INTEL_28F004S3, 9449 .total_size = 512, 9450 .page_size = 256, 9451 .tested = TEST_UNTESTED, 9452 .probe = PROBE_AT82802AB, 9453 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9454 .block_erasers = 9455 { 9456 { 9457 .eraseblocks = { {64 * 1024, 8} }, 9458 .block_erase = ERASE_BLOCK_82802AB, 9459 }, 9460 }, 9461 .unlock = UNLOCK_28F004S5, 9462 .write = WRITE_82802AB, 9463 .read = READ_MEMMAPPED, 9464 }, 9465 9466 { 9467 .vendor = "Intel", 9468 .name = "28F400BV/BX/CE/CV-B", 9469 .bustype = BUS_PARALLEL, 9470 .manufacture_id = INTEL_ID, 9471 .model_id = INTEL_28F400B, 9472 .total_size = 512, 9473 .page_size = 128 * 1024, /* maximal block size */ 9474 .feature_bits = FEATURE_ADDR_SHIFTED, 9475 .tested = TEST_UNTESTED, 9476 .probe = PROBE_AT82802AB, 9477 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9478 .block_erasers = 9479 { 9480 { 9481 .eraseblocks = { 9482 {16 * 1024, 1}, 9483 {8 * 1024, 2}, 9484 {96 * 1024, 1}, 9485 {128 * 1024, 3}, 9486 }, 9487 .block_erase = ERASE_BLOCK_82802AB, 9488 }, 9489 }, 9490 .write = WRITE_82802AB, 9491 .read = READ_MEMMAPPED, 9492 }, 9493 9494 { 9495 .vendor = "Intel", 9496 .name = "28F400BV/BX/CE/CV-T", 9497 .bustype = BUS_PARALLEL, 9498 .manufacture_id = INTEL_ID, 9499 .model_id = INTEL_28F400T, 9500 .total_size = 512, 9501 .page_size = 128 * 1024, /* maximal block size */ 9502 .feature_bits = FEATURE_ADDR_SHIFTED, 9503 .tested = TEST_UNTESTED, 9504 .probe = PROBE_AT82802AB, 9505 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 9506 .block_erasers = 9507 { 9508 { 9509 .eraseblocks = { 9510 {128 * 1024, 3}, 9511 {96 * 1024, 1}, 9512 {8 * 1024, 2}, 9513 {16 * 1024, 1}, 9514 }, 9515 .block_erase = ERASE_BLOCK_82802AB, 9516 }, 9517 }, 9518 .write = WRITE_82802AB, 9519 .read = READ_MEMMAPPED, 9520 }, 9521 9522 { 9523 .vendor = "Intel", 9524 .name = "AT82802AB", 9525 .bustype = BUS_FWH, 9526 .manufacture_id = INTEL_ID, 9527 .model_id = INTEL_82802AB, 9528 .total_size = 512, 9529 .page_size = 64 * 1024, 9530 .feature_bits = FEATURE_REGISTERMAP, 9531 .tested = TEST_OK_PREW, 9532 .probe = PROBE_AT82802AB, 9533 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ 9534 .block_erasers = 9535 { 9536 { 9537 .eraseblocks = { {64 * 1024, 8} }, 9538 .block_erase = ERASE_BLOCK_82802AB, 9539 }, 9540 }, 9541 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 9542 .write = WRITE_82802AB, 9543 .read = READ_MEMMAPPED, 9544 .voltage = {3000, 3600}, 9545 }, 9546 9547 { 9548 .vendor = "Intel", 9549 .name = "82802AC", 9550 .bustype = BUS_FWH, 9551 .manufacture_id = INTEL_ID, 9552 .model_id = INTEL_82802AC, 9553 .total_size = 1024, 9554 .page_size = 64 * 1024, 9555 .feature_bits = FEATURE_REGISTERMAP, 9556 .tested = TEST_OK_PR, 9557 .probe = PROBE_AT82802AB, 9558 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */ 9559 .block_erasers = 9560 { 9561 { 9562 .eraseblocks = { {64 * 1024, 16} }, 9563 .block_erase = ERASE_BLOCK_82802AB, 9564 }, 9565 }, 9566 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 9567 .write = WRITE_82802AB, 9568 .read = READ_MEMMAPPED, 9569 .voltage = {3000, 3600}, 9570 }, 9571 9572 { 9573 .vendor = "Macronix", 9574 .name = "MX23L12854", 9575 .bustype = BUS_SPI, 9576 .manufacture_id = MACRONIX_ID, 9577 .model_id = MACRONIX_MX23L12854, 9578 .total_size = 16384, 9579 .page_size = 256, 9580 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA, .wp = NA}, 9581 .probe = PROBE_SPI_RDID, 9582 .probe_timing = TIMING_ZERO, 9583 .write = 0, /* MX23L12854 is a mask ROM, so it is read-only */ 9584 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9585 .voltage = {3000, 3600}, 9586 }, 9587 9588 { 9589 .vendor = "Macronix", 9590 .name = "MX23L1654", 9591 .bustype = BUS_SPI, 9592 .manufacture_id = MACRONIX_ID, 9593 .model_id = MACRONIX_MX23L1654, 9594 .total_size = 2048, 9595 .page_size = 256, 9596 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA, .wp = NA}, 9597 .probe = PROBE_SPI_RDID, 9598 .probe_timing = TIMING_ZERO, 9599 .write = 0, /* MX23L1654 is a mask ROM, so it is read-only */ 9600 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9601 .voltage = {3000, 3600}, 9602 }, 9603 9604 { 9605 .vendor = "Macronix", 9606 .name = "MX23L3254", 9607 .bustype = BUS_SPI, 9608 .manufacture_id = MACRONIX_ID, 9609 .model_id = MACRONIX_MX23L3254, 9610 .total_size = 4096, 9611 .page_size = 256, 9612 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA, .wp = NA}, 9613 .probe = PROBE_SPI_RDID, 9614 .probe_timing = TIMING_ZERO, 9615 .write = 0, /* MX23L3254 is a mask ROM, so it is read-only */ 9616 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9617 .voltage = {3000, 3600}, 9618 }, 9619 9620 { 9621 .vendor = "Macronix", 9622 .name = "MX23L6454", 9623 .bustype = BUS_SPI, 9624 .manufacture_id = MACRONIX_ID, 9625 .model_id = MACRONIX_MX23L6454, 9626 .total_size = 8192, 9627 .page_size = 256, 9628 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA, .wp = NA}, 9629 .probe = PROBE_SPI_RDID, 9630 .probe_timing = TIMING_ZERO, 9631 .write = 0, /* MX23L6454 is a mask ROM, so it is read-only */ 9632 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9633 .voltage = {3000, 3600}, 9634 }, 9635 9636 { 9637 .vendor = "Macronix", 9638 .name = "MX25L1005(C)/MX25L1006E", 9639 .bustype = BUS_SPI, 9640 .manufacture_id = MACRONIX_ID, 9641 .model_id = MACRONIX_MX25L1005, 9642 .total_size = 128, 9643 .page_size = 256, 9644 /* MX25L1006E supports SFDP */ 9645 .feature_bits = FEATURE_WRSR_WREN, 9646 .tested = TEST_OK_PREW, 9647 .probe = PROBE_SPI_RDID, 9648 .probe_timing = TIMING_ZERO, 9649 .block_erasers = 9650 { 9651 { 9652 .eraseblocks = { {4 * 1024, 32} }, 9653 .block_erase = SPI_BLOCK_ERASE_20, 9654 }, { 9655 .eraseblocks = { {64 * 1024, 2} }, 9656 .block_erase = SPI_BLOCK_ERASE_D8, 9657 }, { 9658 .eraseblocks = { {128 * 1024, 1} }, 9659 .block_erase = SPI_BLOCK_ERASE_60, 9660 }, { 9661 .eraseblocks = { {128 * 1024, 1} }, 9662 .block_erase = SPI_BLOCK_ERASE_C7, 9663 }, 9664 }, 9665 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 9666 .unlock = SPI_DISABLE_BLOCKPROTECT, 9667 .write = SPI_CHIP_WRITE256, 9668 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */ 9669 .voltage = {2700, 3600}, 9670 }, 9671 9672 { 9673 .vendor = "Macronix", 9674 .name = "MX25L12805D", 9675 .bustype = BUS_SPI, 9676 .manufacture_id = MACRONIX_ID, 9677 .model_id = MACRONIX_MX25L12805D, 9678 .total_size = 16384, 9679 .page_size = 256, 9680 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 9681 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9682 .tested = TEST_OK_PREW, 9683 .probe = PROBE_SPI_RDID, 9684 .probe_timing = TIMING_ZERO, 9685 .block_erasers = 9686 { 9687 { 9688 .eraseblocks = { {4 * 1024, 4096} }, 9689 .block_erase = SPI_BLOCK_ERASE_20, 9690 }, { 9691 .eraseblocks = { {64 * 1024, 256} }, 9692 .block_erase = SPI_BLOCK_ERASE_D8, 9693 }, { 9694 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9695 .block_erase = SPI_BLOCK_ERASE_60, 9696 }, { 9697 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9698 .block_erase = SPI_BLOCK_ERASE_C7, 9699 } 9700 }, 9701 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 9702 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9703 .write = SPI_CHIP_WRITE256, 9704 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9705 .voltage = {2700, 3600}, 9706 }, 9707 9708 { 9709 .vendor = "Macronix", 9710 .name = "MX25L12833F", 9711 .bustype = BUS_SPI, 9712 .manufacture_id = MACRONIX_ID, 9713 .model_id = MACRONIX_MX25L12805D, 9714 .total_size = 16384, 9715 .page_size = 256, 9716 /* OTP: 1KB total; enter 0xB1, exit 0xC1 */ 9717 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR | FEATURE_SCUR, 9718 .tested = TEST_OK_PREWB, 9719 .probe = PROBE_SPI_RDID, 9720 .probe_timing = TIMING_ZERO, 9721 .block_erasers = 9722 { 9723 { 9724 .eraseblocks = { {4 * 1024, 4096} }, 9725 .block_erase = SPI_BLOCK_ERASE_20, 9726 }, { 9727 .eraseblocks = { {32 * 1024, 512} }, 9728 .block_erase = SPI_BLOCK_ERASE_52, 9729 }, { 9730 .eraseblocks = { {64 * 1024, 256} }, 9731 .block_erase = SPI_BLOCK_ERASE_D8, 9732 }, { 9733 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9734 .block_erase = SPI_BLOCK_ERASE_60, 9735 }, { 9736 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9737 .block_erase = SPI_BLOCK_ERASE_C7, 9738 } 9739 }, 9740 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 9741 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9742 .write = SPI_CHIP_WRITE256, 9743 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9744 .voltage = {2700, 3600}, 9745 .reg_bits = 9746 { 9747 .srp = {STATUS1, 7, RW}, 9748 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 9749 .tb = {CONFIG, 3, OTP}, 9750 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 9751 }, 9752 .decode_range = DECODE_RANGE_SPI25, 9753 }, 9754 9755 { 9756 .vendor = "Macronix", 9757 .name = "MX25L12835F/MX25L12873F", 9758 .bustype = BUS_SPI, 9759 .manufacture_id = MACRONIX_ID, 9760 .model_id = MACRONIX_MX25L12805D, 9761 .total_size = 16384, 9762 .page_size = 256, 9763 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 9764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR | FEATURE_SCUR, 9765 .tested = TEST_OK_PREW, 9766 .probe = PROBE_SPI_RDID, 9767 .probe_timing = TIMING_ZERO, 9768 .block_erasers = 9769 { 9770 { 9771 .eraseblocks = { {4 * 1024, 4096} }, 9772 .block_erase = SPI_BLOCK_ERASE_20, 9773 }, { 9774 .eraseblocks = { {32 * 1024, 512} }, 9775 .block_erase = SPI_BLOCK_ERASE_52, 9776 }, { 9777 .eraseblocks = { {64 * 1024, 256} }, 9778 .block_erase = SPI_BLOCK_ERASE_D8, 9779 }, { 9780 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9781 .block_erase = SPI_BLOCK_ERASE_60, 9782 }, { 9783 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9784 .block_erase = SPI_BLOCK_ERASE_C7, 9785 } 9786 }, 9787 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 9788 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9789 .write = SPI_CHIP_WRITE256, 9790 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9791 .voltage = {2700, 3600}, 9792 .reg_bits = 9793 { 9794 .srp = {STATUS1, 7, RW}, 9795 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 9796 .tb = {CONFIG, 3, OTP}, 9797 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 9798 }, 9799 .decode_range = DECODE_RANGE_SPI25, 9800 }, 9801 9802 { 9803 .vendor = "Macronix", 9804 .name = "MX25L12845E/MX25L12865E", 9805 .bustype = BUS_SPI, 9806 .manufacture_id = MACRONIX_ID, 9807 .model_id = MACRONIX_MX25L12805D, 9808 .total_size = 16384, 9809 .page_size = 256, 9810 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 9811 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_SCUR, 9812 .tested = TEST_OK_PREW, 9813 .probe = PROBE_SPI_RDID, 9814 .probe_timing = TIMING_ZERO, 9815 .block_erasers = 9816 { 9817 { 9818 .eraseblocks = { {4 * 1024, 4096} }, 9819 .block_erase = SPI_BLOCK_ERASE_20, 9820 }, { 9821 .eraseblocks = { {32 * 1024, 512} }, 9822 .block_erase = SPI_BLOCK_ERASE_52, 9823 }, { 9824 .eraseblocks = { {64 * 1024, 256} }, 9825 .block_erase = SPI_BLOCK_ERASE_D8, 9826 }, { 9827 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9828 .block_erase = SPI_BLOCK_ERASE_60, 9829 }, { 9830 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9831 .block_erase = SPI_BLOCK_ERASE_C7, 9832 } 9833 }, 9834 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 9835 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9836 .write = SPI_CHIP_WRITE256, 9837 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9838 .voltage = {2700, 3600}, 9839 .reg_bits = 9840 { 9841 .srp = {STATUS1, 7, RW}, 9842 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 9843 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 9844 }, 9845 .decode_range = DECODE_RANGE_SPI25, 9846 }, 9847 9848 { 9849 .vendor = "Macronix", 9850 .name = "MX25L12850F", 9851 .bustype = BUS_SPI, 9852 .manufacture_id = MACRONIX_ID, 9853 .model_id = MACRONIX_MX25L12805D, 9854 .total_size = 16384, 9855 .page_size = 256, 9856 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 9857 .tested = TEST_OK_PREWB, 9858 .probe = PROBE_SPI_RDID, 9859 .probe_timing = TIMING_ZERO, 9860 .block_erasers = 9861 { 9862 { 9863 .eraseblocks = { {4 * 1024, 4096} }, 9864 .block_erase = SPI_BLOCK_ERASE_20, 9865 }, { 9866 .eraseblocks = { {32 * 1024, 512} }, 9867 .block_erase = SPI_BLOCK_ERASE_52, 9868 }, { 9869 .eraseblocks = { {64 * 1024, 256} }, 9870 .block_erase = SPI_BLOCK_ERASE_D8, 9871 }, { 9872 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9873 .block_erase = SPI_BLOCK_ERASE_60, 9874 }, { 9875 .eraseblocks = { {16 * 1024 * 1024, 1} }, 9876 .block_erase = SPI_BLOCK_ERASE_C7, 9877 } 9878 }, 9879 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 9880 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9881 .write = SPI_CHIP_WRITE256, 9882 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9883 .voltage = {2700, 3600}, 9884 .reg_bits = 9885 { 9886 .srp = {STATUS1, 7, RW}, 9887 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 9888 .tb = {CONFIG, 3, OTP} 9889 }, 9890 9891 .decode_range = DECODE_RANGE_SPI25, 9892 }, 9893 9894 { 9895 .vendor = "Macronix", 9896 .name = "MX25L1605", 9897 .bustype = BUS_SPI, 9898 .manufacture_id = MACRONIX_ID, 9899 .model_id = MACRONIX_MX25L1605, 9900 .total_size = 2048, 9901 .page_size = 256, 9902 .feature_bits = FEATURE_WRSR_WREN, 9903 .tested = TEST_OK_PREW, 9904 .probe = PROBE_SPI_RDID, 9905 .probe_timing = TIMING_ZERO, 9906 .block_erasers = 9907 { 9908 { 9909 .eraseblocks = { {64 * 1024, 32} }, 9910 .block_erase = SPI_BLOCK_ERASE_20, 9911 }, { 9912 .eraseblocks = { {64 * 1024, 32} }, 9913 .block_erase = SPI_BLOCK_ERASE_D8, 9914 }, { 9915 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9916 .block_erase = SPI_BLOCK_ERASE_60, 9917 }, { 9918 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9919 .block_erase = SPI_BLOCK_ERASE_C7, 9920 }, 9921 }, 9922 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit6: error flag */ 9923 .unlock = SPI_DISABLE_BLOCKPROTECT, 9924 .write = SPI_CHIP_WRITE256, 9925 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9926 .voltage = {2700, 3600}, 9927 }, 9928 9929 { 9930 .vendor = "Macronix", 9931 .name = "MX25V16066", /* was called KH25V16066 in rev v1.3 */ 9932 .bustype = BUS_SPI, 9933 .manufacture_id = MACRONIX_ID, 9934 .model_id = MACRONIX_MX25L1605, 9935 .total_size = 2048, /* 16M-bits */ 9936 .page_size = 256, 9937 .feature_bits = FEATURE_WRSR_WREN, 9938 .tested = TEST_OK_PR, 9939 .probe = PROBE_SPI_RDID, 9940 .probe_timing = TIMING_ZERO, 9941 .block_erasers = 9942 { 9943 { 9944 .eraseblocks = { {4 * 1024, 512} }, 9945 .block_erase = SPI_BLOCK_ERASE_20, 9946 }, { 9947 .eraseblocks = { {32 * 1024, 64} }, 9948 .block_erase = SPI_BLOCK_ERASE_52, 9949 }, { 9950 .eraseblocks = { {64 * 1024, 32} }, 9951 .block_erase = SPI_BLOCK_ERASE_D8, 9952 }, { 9953 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9954 .block_erase = SPI_BLOCK_ERASE_60, 9955 }, { 9956 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9957 .block_erase = SPI_BLOCK_ERASE_C7, 9958 }, 9959 }, 9960 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 9961 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 9962 .write = SPI_CHIP_WRITE256, 9963 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 9964 .voltage = {2700, 3600}, 9965 }, 9966 9967 { 9968 .vendor = "Macronix", 9969 .name = "MX25L1605A/MX25L1606E/MX25L1608E", 9970 .bustype = BUS_SPI, 9971 .manufacture_id = MACRONIX_ID, 9972 .model_id = MACRONIX_MX25L1605, 9973 .total_size = 2048, 9974 .page_size = 256, 9975 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */ 9976 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 9977 .tested = TEST_OK_PREW, 9978 .probe = PROBE_SPI_RDID, 9979 .probe_timing = TIMING_ZERO, 9980 .block_erasers = 9981 { 9982 { 9983 .eraseblocks = { {4 * 1024, 512} }, 9984 .block_erase = SPI_BLOCK_ERASE_20, 9985 }, { 9986 .eraseblocks = { {64 * 1024, 32} }, 9987 .block_erase = SPI_BLOCK_ERASE_52, 9988 }, { 9989 .eraseblocks = { {64 * 1024, 32} }, 9990 .block_erase = SPI_BLOCK_ERASE_D8, 9991 }, { 9992 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9993 .block_erase = SPI_BLOCK_ERASE_60, 9994 }, { 9995 .eraseblocks = { {2 * 1024 * 1024, 1} }, 9996 .block_erase = SPI_BLOCK_ERASE_C7, 9997 }, 9998 }, 9999 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* MX25L1605A bp2 only */ 10000 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10001 .write = SPI_CHIP_WRITE256, 10002 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */ 10003 .voltage = {2700, 3600}, 10004 }, 10005 10006 { 10007 .vendor = "Macronix", 10008 .name = "MX25L1605D/MX25L1608D/MX25L1673E", 10009 .bustype = BUS_SPI, 10010 .manufacture_id = MACRONIX_ID, 10011 .model_id = MACRONIX_MX25L1605, 10012 .total_size = 2048, 10013 .page_size = 256, 10014 .feature_bits = FEATURE_WRSR_WREN, 10015 .tested = TEST_OK_PREW, 10016 .probe = PROBE_SPI_RDID, 10017 .probe_timing = TIMING_ZERO, 10018 .block_erasers = 10019 { 10020 { 10021 .eraseblocks = { {4 * 1024, 512} }, 10022 .block_erase = SPI_BLOCK_ERASE_20, 10023 }, { 10024 .eraseblocks = { {64 * 1024, 32} }, 10025 .block_erase = SPI_BLOCK_ERASE_D8, 10026 }, { 10027 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10028 .block_erase = SPI_BLOCK_ERASE_60, 10029 }, { 10030 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10031 .block_erase = SPI_BLOCK_ERASE_C7, 10032 }, 10033 }, 10034 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */ 10035 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10036 .write = SPI_CHIP_WRITE256, 10037 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 10038 .voltage = {2700, 3600}, 10039 }, 10040 10041 { 10042 .vendor = "Macronix", 10043 .name = "MX25L1635D", 10044 .bustype = BUS_SPI, 10045 .manufacture_id = MACRONIX_ID, 10046 .model_id = MACRONIX_MX25L1635D, 10047 .total_size = 2048, 10048 .page_size = 256, 10049 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 10050 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10051 .tested = TEST_OK_PREW, 10052 .probe = PROBE_SPI_RDID, 10053 .probe_timing = TIMING_ZERO, 10054 .block_erasers = 10055 { 10056 { 10057 .eraseblocks = { {4 * 1024, 512} }, 10058 .block_erase = SPI_BLOCK_ERASE_20, 10059 }, { 10060 .eraseblocks = { {64 * 1024, 32} }, 10061 .block_erase = SPI_BLOCK_ERASE_D8, 10062 }, { 10063 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10064 .block_erase = SPI_BLOCK_ERASE_60, 10065 }, { 10066 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10067 .block_erase = SPI_BLOCK_ERASE_C7, 10068 } 10069 }, 10070 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10071 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10072 .write = SPI_CHIP_WRITE256, 10073 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10074 .voltage = {2700, 3600}, 10075 }, 10076 10077 { 10078 .vendor = "Macronix", 10079 .name = "MX25L1633E", 10080 .bustype = BUS_SPI, 10081 .manufacture_id = MACRONIX_ID, 10082 .model_id = MACRONIX_MX25L1635D, 10083 .total_size = 2048, 10084 .page_size = 256, 10085 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 10086 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP , 10087 .tested = TEST_OK_PREWB, 10088 .probe = PROBE_SPI_RDID, 10089 .probe_timing = TIMING_ZERO, 10090 .block_erasers = 10091 { 10092 { 10093 .eraseblocks = { {4 * 1024, 512} }, 10094 .block_erase = SPI_BLOCK_ERASE_20, 10095 }, { 10096 .eraseblocks = { {64 * 1024, 32} }, 10097 .block_erase = SPI_BLOCK_ERASE_D8, 10098 }, { 10099 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10100 .block_erase = SPI_BLOCK_ERASE_60, 10101 }, { 10102 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10103 .block_erase = SPI_BLOCK_ERASE_C7, 10104 } 10105 }, 10106 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10107 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10108 .write = SPI_CHIP_WRITE256, 10109 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10110 .voltage = {2700, 3600}, 10111 .reg_bits = 10112 { 10113 .srp = {STATUS1, 7, RW}, 10114 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10115 }, 10116 10117 .decode_range = DECODE_RANGE_SPI25, 10118 }, 10119 10120 { 10121 .vendor = "Macronix", 10122 .name = "MX25L1635E/MX25L1636E", 10123 .bustype = BUS_SPI, 10124 .manufacture_id = MACRONIX_ID, 10125 .model_id = MACRONIX_MX25L1635E, 10126 .total_size = 2048, 10127 .page_size = 256, 10128 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10129 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10130 .tested = TEST_OK_PREWB, 10131 .probe = PROBE_SPI_RDID, 10132 .probe_timing = TIMING_ZERO, 10133 .block_erasers = 10134 { 10135 { 10136 .eraseblocks = { {4 * 1024, 512} }, 10137 .block_erase = SPI_BLOCK_ERASE_20, 10138 }, { 10139 .eraseblocks = { {64 * 1024, 32} }, 10140 .block_erase = SPI_BLOCK_ERASE_D8, 10141 }, { 10142 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10143 .block_erase = SPI_BLOCK_ERASE_60, 10144 }, { 10145 .eraseblocks = { {2 * 1024 * 1024, 1} }, 10146 .block_erase = SPI_BLOCK_ERASE_C7, 10147 } 10148 }, 10149 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10150 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10151 .write = SPI_CHIP_WRITE256, 10152 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10153 .voltage = {2700, 3600}, 10154 .reg_bits = 10155 { 10156 .srp = {STATUS1, 7, RW}, 10157 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10158 }, 10159 10160 .decode_range = DECODE_RANGE_SPI25, 10161 }, 10162 10163 { 10164 .vendor = "Macronix", 10165 .name = "MX25L2005(C)/MX25L2006E", 10166 .bustype = BUS_SPI, 10167 .manufacture_id = MACRONIX_ID, 10168 .model_id = MACRONIX_MX25L2005, 10169 .total_size = 256, 10170 .page_size = 256, 10171 .feature_bits = FEATURE_WRSR_WREN, 10172 .tested = TEST_OK_PREW, 10173 .probe = PROBE_SPI_RDID, 10174 .probe_timing = TIMING_ZERO, 10175 .block_erasers = 10176 { 10177 { 10178 .eraseblocks = { {4 * 1024, 64} }, 10179 .block_erase = SPI_BLOCK_ERASE_20, 10180 }, { 10181 .eraseblocks = { {64 * 1024, 4} }, 10182 .block_erase = SPI_BLOCK_ERASE_52, 10183 }, { 10184 .eraseblocks = { {64 * 1024, 4} }, 10185 .block_erase = SPI_BLOCK_ERASE_D8, 10186 }, { 10187 .eraseblocks = { {256 * 1024, 1} }, 10188 .block_erase = SPI_BLOCK_ERASE_60, 10189 }, { 10190 .eraseblocks = { {256 * 1024, 1} }, 10191 .block_erase = SPI_BLOCK_ERASE_C7, 10192 }, 10193 }, 10194 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 10195 .unlock = SPI_DISABLE_BLOCKPROTECT, 10196 .write = SPI_CHIP_WRITE256, 10197 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10198 .voltage = {2700, 3600}, 10199 }, 10200 10201 { 10202 .vendor = "Macronix", 10203 .name = "MX25L25635F/MX25L25645G", 10204 .bustype = BUS_SPI, 10205 .manufacture_id = MACRONIX_ID, 10206 .model_id = MACRONIX_MX25L25635F, 10207 .total_size = 32768, 10208 .page_size = 256, 10209 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10210 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 10211 .tested = TEST_OK_PREW, 10212 .probe = PROBE_SPI_RDID, 10213 .probe_timing = TIMING_ZERO, 10214 .block_erasers = 10215 { 10216 { 10217 .eraseblocks = { {4 * 1024, 8192} }, 10218 .block_erase = SPI_BLOCK_ERASE_21, 10219 }, { 10220 .eraseblocks = { {4 * 1024, 8192} }, 10221 .block_erase = SPI_BLOCK_ERASE_20, 10222 }, { 10223 .eraseblocks = { {32 * 1024, 1024} }, 10224 .block_erase = SPI_BLOCK_ERASE_5C, 10225 }, { 10226 .eraseblocks = { {32 * 1024, 1024} }, 10227 .block_erase = SPI_BLOCK_ERASE_52, 10228 }, { 10229 .eraseblocks = { {64 * 1024, 512} }, 10230 .block_erase = SPI_BLOCK_ERASE_DC, 10231 }, { 10232 .eraseblocks = { {64 * 1024, 512} }, 10233 .block_erase = SPI_BLOCK_ERASE_D8, 10234 }, { 10235 .eraseblocks = { {32 * 1024 * 1024, 1} }, 10236 .block_erase = SPI_BLOCK_ERASE_60, 10237 }, { 10238 .eraseblocks = { {32 * 1024 * 1024, 1} }, 10239 .block_erase = SPI_BLOCK_ERASE_C7, 10240 } 10241 }, 10242 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */ 10243 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10244 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10245 .write = SPI_CHIP_WRITE256, 10246 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10247 .voltage = {2700, 3600}, 10248 }, 10249 10250 { 10251 .vendor = "Macronix", 10252 .name = "MX25L3205(A)", 10253 .bustype = BUS_SPI, 10254 .manufacture_id = MACRONIX_ID, 10255 .model_id = MACRONIX_MX25L3205, 10256 .total_size = 4096, 10257 .page_size = 256, 10258 .feature_bits = FEATURE_WRSR_WREN, 10259 .tested = TEST_OK_PREW, 10260 .probe = PROBE_SPI_RDID, 10261 .probe_timing = TIMING_ZERO, 10262 .block_erasers = 10263 { 10264 { 10265 .eraseblocks = { {64 * 1024, 64} }, 10266 .block_erase = SPI_BLOCK_ERASE_20, 10267 }, { 10268 .eraseblocks = { {64 * 1024, 64} }, 10269 .block_erase = SPI_BLOCK_ERASE_D8, 10270 }, { 10271 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10272 .block_erase = SPI_BLOCK_ERASE_60, 10273 }, { 10274 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10275 .block_erase = SPI_BLOCK_ERASE_C7, 10276 }, 10277 }, 10278 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit6: error flag */ 10279 .unlock = SPI_DISABLE_BLOCKPROTECT, 10280 .write = SPI_CHIP_WRITE256, 10281 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10282 .voltage = {2700, 3600}, 10283 }, 10284 10285 { 10286 .vendor = "Macronix", 10287 .name = "MX25L3205D/MX25L3208D", 10288 .bustype = BUS_SPI, 10289 .manufacture_id = MACRONIX_ID, 10290 .model_id = MACRONIX_MX25L3205, 10291 .total_size = 4096, 10292 .page_size = 256, 10293 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 10294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10295 .tested = TEST_OK_PREW, 10296 .probe = PROBE_SPI_RDID, 10297 .probe_timing = TIMING_ZERO, 10298 .block_erasers = 10299 { 10300 { 10301 .eraseblocks = { {4 * 1024, 1024} }, 10302 .block_erase = SPI_BLOCK_ERASE_20, 10303 }, { 10304 .eraseblocks = { {64 * 1024, 64} }, 10305 .block_erase = SPI_BLOCK_ERASE_D8, 10306 }, { 10307 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10308 .block_erase = SPI_BLOCK_ERASE_60, 10309 }, { 10310 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10311 .block_erase = SPI_BLOCK_ERASE_C7, 10312 }, 10313 }, 10314 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6: continuously program mode */ 10315 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10316 .write = SPI_CHIP_WRITE256, 10317 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O supported */ 10318 .voltage = {2700, 3600}, 10319 }, 10320 10321 { 10322 .vendor = "Macronix", 10323 .name = "MX25L3206E/MX25L3208E", 10324 .bustype = BUS_SPI, 10325 .manufacture_id = MACRONIX_ID, 10326 .model_id = MACRONIX_MX25L3205, 10327 .total_size = 4096, 10328 .page_size = 256, 10329 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 10330 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10331 .tested = TEST_OK_PREWB, 10332 .probe = PROBE_SPI_RDID, 10333 .probe_timing = TIMING_ZERO, 10334 .block_erasers = 10335 { 10336 { 10337 .eraseblocks = { {4 * 1024, 1024} }, 10338 .block_erase = SPI_BLOCK_ERASE_20, 10339 }, { 10340 .eraseblocks = { {64 * 1024, 64} }, 10341 .block_erase = SPI_BLOCK_ERASE_D8, 10342 }, { 10343 .eraseblocks = { {64 * 1024, 64} }, 10344 .block_erase = SPI_BLOCK_ERASE_52, 10345 }, { 10346 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10347 .block_erase = SPI_BLOCK_ERASE_60, 10348 }, { 10349 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10350 .block_erase = SPI_BLOCK_ERASE_C7, 10351 }, 10352 }, 10353 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 10354 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10355 .write = SPI_CHIP_WRITE256, 10356 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O supported */ 10357 .voltage = {2700, 3600}, 10358 .reg_bits = 10359 { 10360 .srp = {STATUS1, 7, RW}, 10361 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 10362 .cmp = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like CMP */ 10363 }, 10364 .decode_range = DECODE_RANGE_SPI25_BIT_CMP, 10365 }, 10366 { 10367 .vendor = "Macronix", 10368 .name = "MX25L3273F", 10369 .bustype = BUS_SPI, 10370 .manufacture_id = MACRONIX_ID, 10371 .model_id = MACRONIX_MX25L3205, 10372 .total_size = 4096, 10373 .page_size = 256, 10374 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10375 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 10376 .tested = TEST_OK_PREWB, 10377 .probe = PROBE_SPI_RDID, 10378 .probe_timing = TIMING_ZERO, 10379 .block_erasers = 10380 { 10381 { 10382 .eraseblocks = { {4 * 1024, 1024} }, 10383 .block_erase = SPI_BLOCK_ERASE_20, 10384 }, { 10385 .eraseblocks = { {32 * 1024, 128} }, 10386 .block_erase = SPI_BLOCK_ERASE_52, 10387 }, { 10388 .eraseblocks = { {64 * 1024, 64} }, 10389 .block_erase = SPI_BLOCK_ERASE_D8, 10390 }, { 10391 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10392 .block_erase = SPI_BLOCK_ERASE_60, 10393 }, { 10394 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10395 .block_erase = SPI_BLOCK_ERASE_C7, 10396 } 10397 }, 10398 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 10399 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10400 .write = SPI_CHIP_WRITE256, 10401 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10402 .voltage = {2650, 3600}, 10403 .reg_bits = 10404 { 10405 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10406 .tb = {CONFIG, 3, OTP} 10407 }, 10408 10409 .decode_range = DECODE_RANGE_SPI25, 10410 }, 10411 10412 { 10413 .vendor = "Macronix", 10414 .name = "MX25L3239E", 10415 .bustype = BUS_SPI, 10416 .manufacture_id = MACRONIX_ID, 10417 .model_id = MACRONIX_MX25L3239E, 10418 .total_size = 4096, 10419 .page_size = 256, 10420 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10421 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR | FEATURE_SCUR , 10422 .tested = TEST_OK_PREWB, 10423 .probe = PROBE_SPI_RDID, 10424 .probe_timing = TIMING_ZERO, 10425 .block_erasers = 10426 { 10427 { 10428 .eraseblocks = { {4 * 1024, 1024} }, 10429 .block_erase = SPI_BLOCK_ERASE_20, 10430 }, { 10431 .eraseblocks = { {32 * 1024, 128} }, 10432 .block_erase = SPI_BLOCK_ERASE_52, 10433 }, { 10434 .eraseblocks = { {64 * 1024, 64} }, 10435 .block_erase = SPI_BLOCK_ERASE_D8, 10436 }, { 10437 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10438 .block_erase = SPI_BLOCK_ERASE_60, 10439 }, { 10440 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10441 .block_erase = SPI_BLOCK_ERASE_C7, 10442 } 10443 }, 10444 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 10445 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10446 .write = SPI_CHIP_WRITE256, 10447 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10448 .voltage = {2700, 3600}, 10449 .reg_bits = 10450 { 10451 .srp = {STATUS1, 7, RW}, 10452 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10453 .tb = {CONFIG, 3, OTP}, 10454 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 10455 }, 10456 10457 .decode_range = DECODE_RANGE_SPI25, 10458 }, 10459 10460 { 10461 .vendor = "Macronix", 10462 .name = "MX25L3235D", 10463 .bustype = BUS_SPI, 10464 .manufacture_id = MACRONIX_ID, 10465 .model_id = MACRONIX_MX25L3235D, 10466 .total_size = 4096, 10467 .page_size = 256, 10468 /* OTP: 256B total; enter 0xB1, exit 0xC1 */ 10469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10470 .tested = TEST_UNTESTED, 10471 .probe = PROBE_SPI_RDID, 10472 .probe_timing = TIMING_ZERO, 10473 .block_erasers = 10474 { 10475 { 10476 .eraseblocks = { {4 * 1024, 1024} }, 10477 .block_erase = SPI_BLOCK_ERASE_20, 10478 }, { 10479 .eraseblocks = { {64 * 1024, 64} }, 10480 .block_erase = SPI_BLOCK_ERASE_D8, 10481 }, { 10482 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10483 .block_erase = SPI_BLOCK_ERASE_60, 10484 }, { 10485 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10486 .block_erase = SPI_BLOCK_ERASE_C7, 10487 } 10488 }, 10489 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10490 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10491 .write = SPI_CHIP_WRITE256, 10492 .read = SPI_CHIP_READ, 10493 .voltage = {2700, 3600}, 10494 }, 10495 10496 { 10497 .vendor = "Macronix", 10498 .name = "MX25L3233F/MX25L3273E", 10499 .bustype = BUS_SPI, 10500 .manufacture_id = MACRONIX_ID, 10501 .model_id = MACRONIX_MX25L3205, 10502 .total_size = 4096, 10503 .page_size = 256, 10504 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10505 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10506 .tested = TEST_OK_PREW, 10507 .probe = PROBE_SPI_RDID, 10508 .probe_timing = TIMING_ZERO, 10509 .block_erasers = 10510 { 10511 { 10512 .eraseblocks = { {4 * 1024, 1024} }, 10513 .block_erase = SPI_BLOCK_ERASE_20, 10514 }, { 10515 .eraseblocks = { {32 * 1024, 128} }, 10516 .block_erase = SPI_BLOCK_ERASE_52, 10517 }, { 10518 .eraseblocks = { {64 * 1024, 64} }, 10519 .block_erase = SPI_BLOCK_ERASE_D8, 10520 }, { 10521 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10522 .block_erase = SPI_BLOCK_ERASE_60, 10523 }, { 10524 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10525 .block_erase = SPI_BLOCK_ERASE_C7, 10526 }, 10527 }, 10528 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 10529 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10530 .write = SPI_CHIP_WRITE256, 10531 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O supported */ 10532 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */ 10533 }, 10534 10535 { 10536 .vendor = "Macronix", 10537 .name = "MX25L3255E", 10538 .bustype = BUS_SPI, 10539 .manufacture_id = MACRONIX_ID, 10540 .model_id = MACRONIX_MX25L3255E, 10541 .total_size = 4096, 10542 .page_size = 256, 10543 /* OTP: 4K total; enter 0xB1, exit 0xC1 */ 10544 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10545 .tested = TEST_OK_PREW, 10546 .probe = PROBE_SPI_RDID, 10547 .probe_timing = TIMING_ZERO, 10548 .block_erasers = 10549 { 10550 { 10551 .eraseblocks = { {4 * 1024, 1024} }, 10552 .block_erase = SPI_BLOCK_ERASE_20, 10553 }, { 10554 .eraseblocks = { {32 * 1024, 128} }, 10555 .block_erase = SPI_BLOCK_ERASE_52, 10556 }, { 10557 .eraseblocks = { {64 * 1024, 64} }, 10558 .block_erase = SPI_BLOCK_ERASE_D8, 10559 }, { 10560 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10561 .block_erase = SPI_BLOCK_ERASE_60, 10562 }, { 10563 .eraseblocks = { {4 * 1024 * 1024, 1} }, 10564 .block_erase = SPI_BLOCK_ERASE_C7, 10565 }, 10566 }, 10567 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 10568 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10569 .write = SPI_CHIP_WRITE256, 10570 /* Fast read (0x0B), 2x and 4x I/O supported */ 10571 .read = SPI_CHIP_READ, 10572 .voltage = {2700, 3600}, 10573 }, 10574 10575 { 10576 .vendor = "Macronix", 10577 .name = "MX25L4005(A/C)/MX25L4006E", 10578 .bustype = BUS_SPI, 10579 .manufacture_id = MACRONIX_ID, 10580 .model_id = MACRONIX_MX25L4005, 10581 .total_size = 512, 10582 .page_size = 256, 10583 .feature_bits = FEATURE_WRSR_WREN, 10584 .tested = TEST_OK_PREW, 10585 .probe = PROBE_SPI_RDID, 10586 .probe_timing = TIMING_ZERO, 10587 .block_erasers = 10588 { 10589 { 10590 .eraseblocks = { {4 * 1024, 128} }, 10591 .block_erase = SPI_BLOCK_ERASE_20, 10592 }, { 10593 .eraseblocks = { {64 * 1024, 8} }, 10594 .block_erase = SPI_BLOCK_ERASE_52, 10595 }, { 10596 .eraseblocks = { {64 * 1024, 8} }, 10597 .block_erase = SPI_BLOCK_ERASE_D8, 10598 }, { 10599 .eraseblocks = { {512 * 1024, 1} }, 10600 .block_erase = SPI_BLOCK_ERASE_60, 10601 }, { 10602 .eraseblocks = { {512 * 1024, 1} }, 10603 .block_erase = SPI_BLOCK_ERASE_C7, 10604 }, 10605 }, 10606 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 10607 .unlock = SPI_DISABLE_BLOCKPROTECT, 10608 .write = SPI_CHIP_WRITE256, 10609 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10610 .voltage = {2700, 3600}, 10611 }, 10612 10613 { 10614 .vendor = "Macronix", 10615 .name = "MX25L512(E)/MX25V512(C)", 10616 .bustype = BUS_SPI, 10617 .manufacture_id = MACRONIX_ID, 10618 .model_id = MACRONIX_MX25L512, 10619 .total_size = 64, 10620 .page_size = 256, 10621 /* MX25L512E supports SFDP */ 10622 .feature_bits = FEATURE_WRSR_WREN, 10623 .tested = TEST_OK_PREW, 10624 .probe = PROBE_SPI_RDID, 10625 .probe_timing = TIMING_ZERO, 10626 .block_erasers = 10627 { 10628 { 10629 .eraseblocks = { {4 * 1024, 16} }, 10630 .block_erase = SPI_BLOCK_ERASE_20, 10631 }, { 10632 .eraseblocks = { {64 * 1024, 1} }, 10633 .block_erase = SPI_BLOCK_ERASE_52, 10634 }, { 10635 .eraseblocks = { {64 * 1024, 1} }, 10636 .block_erase = SPI_BLOCK_ERASE_D8, 10637 }, { 10638 .eraseblocks = { {64 * 1024, 1} }, 10639 .block_erase = SPI_BLOCK_ERASE_60, 10640 }, { 10641 .eraseblocks = { {64 * 1024, 1} }, 10642 .block_erase = SPI_BLOCK_ERASE_C7, 10643 }, 10644 }, 10645 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 10646 .unlock = SPI_DISABLE_BLOCKPROTECT, 10647 .write = SPI_CHIP_WRITE256, 10648 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */ 10649 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */ 10650 }, 10651 10652 { 10653 .vendor = "Macronix", 10654 .name = "MX25L5121E", 10655 .bustype = BUS_SPI, 10656 .manufacture_id = MACRONIX_ID, 10657 .model_id = MACRONIX_MX25L5121E, 10658 .total_size = 64, 10659 .page_size = 32, 10660 .feature_bits = FEATURE_WRSR_WREN, 10661 .tested = TEST_OK_PREW, 10662 .probe = PROBE_SPI_RDID, 10663 .probe_timing = TIMING_ZERO, 10664 .block_erasers = 10665 { 10666 { 10667 .eraseblocks = { {4 * 1024, 16} }, 10668 .block_erase = SPI_BLOCK_ERASE_20, 10669 }, { 10670 .eraseblocks = { {64 * 1024, 1} }, 10671 .block_erase = SPI_BLOCK_ERASE_52, 10672 }, { 10673 .eraseblocks = { {64 * 1024, 1} }, 10674 .block_erase = SPI_BLOCK_ERASE_D8, 10675 }, { 10676 .eraseblocks = { {64 * 1024, 1} }, 10677 .block_erase = SPI_BLOCK_ERASE_60, 10678 }, { 10679 .eraseblocks = { {64 * 1024, 1} }, 10680 .block_erase = SPI_BLOCK_ERASE_C7, 10681 }, 10682 }, 10683 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 10684 .unlock = SPI_DISABLE_BLOCKPROTECT, 10685 .write = SPI_CHIP_WRITE256, 10686 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10687 .voltage = {2700, 3600}, 10688 }, 10689 10690 { 10691 .vendor = "Macronix", 10692 .name = "MX25L6405", 10693 .bustype = BUS_SPI, 10694 .manufacture_id = MACRONIX_ID, 10695 .model_id = MACRONIX_MX25L6405, 10696 .total_size = 8192, 10697 .page_size = 256, 10698 /* Has an additional 512B EEPROM sector */ 10699 .feature_bits = FEATURE_WRSR_WREN, 10700 .tested = TEST_OK_PREW, 10701 .probe = PROBE_SPI_RDID, 10702 .probe_timing = TIMING_ZERO, 10703 .block_erasers = 10704 { 10705 { 10706 .eraseblocks = { {64 * 1024, 128} }, 10707 .block_erase = SPI_BLOCK_ERASE_20, 10708 }, { 10709 .eraseblocks = { {64 * 1024, 128} }, 10710 .block_erase = SPI_BLOCK_ERASE_D8, 10711 }, { 10712 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10713 .block_erase = SPI_BLOCK_ERASE_60, 10714 }, { 10715 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10716 .block_erase = SPI_BLOCK_ERASE_C7, 10717 } 10718 }, 10719 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6: error flag */ 10720 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10721 .write = SPI_CHIP_WRITE256, 10722 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 10723 .voltage = {2700, 3600}, 10724 .reg_bits = 10725 { 10726 .srp = {STATUS1, 7, RW}, 10727 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10728 }, 10729 .decode_range = DECODE_RANGE_SPI25, 10730 }, 10731 10732 { 10733 .vendor = "Macronix", 10734 .name = "MX25L6405D", 10735 .bustype = BUS_SPI, 10736 .manufacture_id = MACRONIX_ID, 10737 .model_id = MACRONIX_MX25L6405, 10738 .total_size = 8192, 10739 .page_size = 256, 10740 /* OTP: 64B total; enter 0xB1, exit 0xC1 */ 10741 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10742 .tested = TEST_OK_PREW, 10743 .probe = PROBE_SPI_RDID, 10744 .probe_timing = TIMING_ZERO, 10745 .block_erasers = 10746 { 10747 { 10748 .eraseblocks = { {4 * 1024, 2048} }, 10749 .block_erase = SPI_BLOCK_ERASE_20, 10750 }, { 10751 .eraseblocks = { {64 * 1024, 128} }, 10752 .block_erase = SPI_BLOCK_ERASE_D8, 10753 }, { 10754 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10755 .block_erase = SPI_BLOCK_ERASE_60, 10756 }, { 10757 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10758 .block_erase = SPI_BLOCK_ERASE_C7, 10759 } 10760 }, 10761 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6: continuously program mode */ 10762 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10763 .write = SPI_CHIP_WRITE256, 10764 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0xBB) supported */ 10765 .voltage = {2700, 3600}, 10766 .reg_bits = 10767 { 10768 .srp = {STATUS1, 7, RW}, 10769 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 10770 .cmp = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like CMP */ 10771 }, 10772 .decode_range = DECODE_RANGE_SPI25_BIT_CMP, 10773 }, 10774 10775 { 10776 .vendor = "Macronix", 10777 .name = "MX25L6406E/MX25L6408E", 10778 .bustype = BUS_SPI, 10779 .manufacture_id = MACRONIX_ID, 10780 .model_id = MACRONIX_MX25L6405, 10781 .total_size = 8192, 10782 .page_size = 256, 10783 /* MX25L6406E supports SFDP */ 10784 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */ 10785 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10786 .tested = TEST_OK_PREWB, 10787 .probe = PROBE_SPI_RDID, 10788 .probe_timing = TIMING_ZERO, 10789 .block_erasers = 10790 { 10791 { 10792 .eraseblocks = { {4 * 1024, 2048} }, 10793 .block_erase = SPI_BLOCK_ERASE_20, 10794 }, { 10795 .eraseblocks = { {64 * 1024, 128} }, 10796 .block_erase = SPI_BLOCK_ERASE_52, 10797 }, { 10798 .eraseblocks = { {64 * 1024, 128} }, 10799 .block_erase = SPI_BLOCK_ERASE_D8, 10800 }, { 10801 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10802 .block_erase = SPI_BLOCK_ERASE_60, 10803 }, { 10804 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10805 .block_erase = SPI_BLOCK_ERASE_C7, 10806 } 10807 }, 10808 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 10809 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10810 .write = SPI_CHIP_WRITE256, 10811 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read supported */ 10812 .voltage = {2700, 3600}, 10813 .reg_bits = 10814 { 10815 .srp = {STATUS1, 7, RW}, 10816 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 10817 .cmp = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like CMP */ 10818 }, 10819 .decode_range = DECODE_RANGE_SPI25_BIT_CMP, 10820 }, 10821 10822 { 10823 .vendor = "Macronix", 10824 .name = "MX25L6436E/MX25L6445E/MX25L6465E", 10825 .bustype = BUS_SPI, 10826 .manufacture_id = MACRONIX_ID, 10827 .model_id = MACRONIX_MX25L6405, 10828 .total_size = 8192, 10829 .page_size = 256, 10830 /* supports SFDP */ 10831 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10832 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_SCUR, 10833 .tested = TEST_OK_PREWB, 10834 .probe = PROBE_SPI_RDID, 10835 .probe_timing = TIMING_ZERO, 10836 .block_erasers = 10837 { 10838 { 10839 .eraseblocks = { {4 * 1024, 2048} }, 10840 .block_erase = SPI_BLOCK_ERASE_20, 10841 }, { 10842 .eraseblocks = { {32 * 1024, 256} }, 10843 .block_erase = SPI_BLOCK_ERASE_52, 10844 }, { 10845 .eraseblocks = { {64 * 1024, 128} }, 10846 .block_erase = SPI_BLOCK_ERASE_D8, 10847 }, { 10848 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10849 .block_erase = SPI_BLOCK_ERASE_60, 10850 }, { 10851 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10852 .block_erase = SPI_BLOCK_ERASE_C7, 10853 } 10854 }, 10855 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10856 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10857 .write = SPI_CHIP_WRITE256, 10858 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10859 .voltage = {2700, 3600}, 10860 .reg_bits = 10861 { 10862 .srp = {STATUS1, 7, RW}, 10863 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10864 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 10865 }, 10866 .decode_range = DECODE_RANGE_SPI25_2X_BLOCK, 10867 }, 10868 10869 { 10870 .vendor = "Macronix", 10871 .name = "MX25L6473E", 10872 .bustype = BUS_SPI, 10873 .manufacture_id = MACRONIX_ID, 10874 .model_id = MACRONIX_MX25L6405, 10875 .total_size = 8192, 10876 .page_size = 256, 10877 /* supports SFDP */ 10878 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2 | FEATURE_SCUR, 10880 .tested = TEST_OK_PREW, 10881 .probe = PROBE_SPI_RDID, 10882 .probe_timing = TIMING_ZERO, 10883 .block_erasers = 10884 { 10885 { 10886 .eraseblocks = { {4 * 1024, 2048} }, 10887 .block_erase = SPI_BLOCK_ERASE_20, 10888 }, { 10889 .eraseblocks = { {32 * 1024, 256} }, 10890 .block_erase = SPI_BLOCK_ERASE_52, 10891 }, { 10892 .eraseblocks = { {64 * 1024, 128} }, 10893 .block_erase = SPI_BLOCK_ERASE_D8, 10894 }, { 10895 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10896 .block_erase = SPI_BLOCK_ERASE_60, 10897 }, { 10898 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10899 .block_erase = SPI_BLOCK_ERASE_C7, 10900 } 10901 }, 10902 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10903 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10904 .write = SPI_CHIP_WRITE256, 10905 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10906 .voltage = {2700, 3600}, 10907 .reg_bits = 10908 { 10909 .srp = {STATUS1, 7, RW}, 10910 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10911 .tb = {CONFIG, 3, OTP}, 10912 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 10913 }, 10914 .decode_range = DECODE_RANGE_SPI25, 10915 }, 10916 10917 { 10918 .vendor = "Macronix", 10919 .name = "MX25L6473F", 10920 .bustype = BUS_SPI, 10921 .manufacture_id = MACRONIX_ID, 10922 .model_id = MACRONIX_MX25L6405, 10923 .total_size = 8192, 10924 .page_size = 256, 10925 /* supports SFDP */ 10926 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 10927 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, 10928 .tested = TEST_OK_PREW, 10929 .probe = PROBE_SPI_RDID, 10930 .probe_timing = TIMING_ZERO, 10931 .block_erasers = 10932 { 10933 { 10934 .eraseblocks = { {4 * 1024, 2048} }, 10935 .block_erase = SPI_BLOCK_ERASE_20, 10936 }, { 10937 .eraseblocks = { {32 * 1024, 256} }, 10938 .block_erase = SPI_BLOCK_ERASE_52, 10939 }, { 10940 .eraseblocks = { {64 * 1024, 128} }, 10941 .block_erase = SPI_BLOCK_ERASE_D8, 10942 }, { 10943 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10944 .block_erase = SPI_BLOCK_ERASE_60, 10945 }, { 10946 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10947 .block_erase = SPI_BLOCK_ERASE_C7, 10948 } 10949 }, 10950 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 10951 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 10952 .write = SPI_CHIP_WRITE256, 10953 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10954 .voltage = {2700, 3600}, 10955 .reg_bits = 10956 { 10957 .srp = {STATUS1, 7, RW}, 10958 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 10959 .tb = {CONFIG, 3, OTP}, 10960 }, 10961 .decode_range = DECODE_RANGE_SPI25, 10962 }, 10963 10964 { 10965 .vendor = "Macronix", 10966 .name = "MX25L6495F", 10967 .bustype = BUS_SPI, 10968 .manufacture_id = MACRONIX_ID, 10969 .model_id = MACRONIX_MX25L6495F, 10970 .total_size = 8192, 10971 .page_size = 256, 10972 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 10973 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 10974 .tested = TEST_OK_PREW, 10975 .probe = PROBE_SPI_RDID, 10976 .probe_timing = TIMING_ZERO, 10977 .block_erasers = 10978 { 10979 { 10980 .eraseblocks = { {4 * 1024, 2048} }, 10981 .block_erase = SPI_BLOCK_ERASE_20, 10982 }, { 10983 .eraseblocks = { {32 * 1024, 256} }, 10984 .block_erase = SPI_BLOCK_ERASE_52, 10985 }, { 10986 .eraseblocks = { {64 * 1024, 128} }, 10987 .block_erase = SPI_BLOCK_ERASE_D8, 10988 }, { 10989 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10990 .block_erase = SPI_BLOCK_ERASE_60, 10991 }, { 10992 .eraseblocks = { {8 * 1024 * 1024, 1} }, 10993 .block_erase = SPI_BLOCK_ERASE_C7, 10994 } 10995 }, 10996 .unlock = SPI_DISABLE_BLOCKPROTECT, 10997 .write = SPI_CHIP_WRITE256, 10998 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 10999 .voltage = {2700, 3600}, 11000 }, 11001 11002 { 11003 .vendor = "Macronix", 11004 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005", 11005 .bustype = BUS_SPI, 11006 .manufacture_id = MACRONIX_ID, 11007 .model_id = MACRONIX_MX25L8005, 11008 .total_size = 1024, 11009 .page_size = 256, 11010 /* MX25L8006E, MX25L8008E support SFDP */ 11011 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */ 11012 .feature_bits = FEATURE_WRSR_WREN, 11013 .tested = TEST_OK_PREW, 11014 .probe = PROBE_SPI_RDID, 11015 .probe_timing = TIMING_ZERO, 11016 .block_erasers = 11017 { 11018 { 11019 .eraseblocks = { {4 * 1024, 256} }, 11020 .block_erase = SPI_BLOCK_ERASE_20, 11021 }, { 11022 .eraseblocks = { {64 * 1024, 16} }, 11023 .block_erase = SPI_BLOCK_ERASE_52, 11024 }, { 11025 .eraseblocks = { {64 * 1024, 16} }, 11026 .block_erase = SPI_BLOCK_ERASE_D8, 11027 }, { 11028 .eraseblocks = { {1024 * 1024, 1} }, 11029 .block_erase = SPI_BLOCK_ERASE_60, 11030 }, { 11031 .eraseblocks = { {1024 * 1024, 1} }, 11032 .block_erase = SPI_BLOCK_ERASE_C7, 11033 }, 11034 }, 11035 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 11036 .unlock = SPI_DISABLE_BLOCKPROTECT, 11037 .write = SPI_CHIP_WRITE256, 11038 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 11039 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */ 11040 }, 11041 11042 { 11043 .vendor = "Macronix", 11044 .name = "MX25R1635F", 11045 .bustype = BUS_SPI, 11046 .manufacture_id = MACRONIX_ID, 11047 .model_id = MACRONIX_MX25R1635F, 11048 .total_size = 2048, 11049 .page_size = 256, 11050 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11051 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 11052 .tested = TEST_OK_PREWB, 11053 .probe = PROBE_SPI_RDID, 11054 .probe_timing = TIMING_ZERO, 11055 .block_erasers = 11056 { 11057 { 11058 .eraseblocks = { {4 * 1024, 512} }, 11059 .block_erase = SPI_BLOCK_ERASE_20, 11060 }, { 11061 .eraseblocks = { {32 * 1024, 64} }, 11062 .block_erase = SPI_BLOCK_ERASE_52, 11063 }, { 11064 .eraseblocks = { {64 * 1024, 32} }, 11065 .block_erase = SPI_BLOCK_ERASE_D8, 11066 }, { 11067 .eraseblocks = { {2 * 1024 * 1024, 1} }, 11068 .block_erase = SPI_BLOCK_ERASE_60, 11069 }, { 11070 .eraseblocks = { {2 * 1024 * 1024, 1} }, 11071 .block_erase = SPI_BLOCK_ERASE_C7, 11072 } 11073 }, 11074 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 11075 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11076 .write = SPI_CHIP_WRITE256, 11077 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11078 .voltage = {1650, 3600}, 11079 .reg_bits = 11080 { 11081 .srp = {STATUS1, 7, RW}, 11082 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11083 .tb = {CONFIG, 3, OTP} 11084 }, 11085 11086 .decode_range = DECODE_RANGE_SPI25, 11087 }, 11088 11089 { 11090 .vendor = "Macronix", 11091 .name = "MX25R2035F", 11092 .bustype = BUS_SPI, 11093 .manufacture_id = MACRONIX_ID, 11094 .model_id = MACRONIX_MX25R2035F, 11095 .total_size = 256, 11096 .page_size = 256, 11097 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11098 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 11099 .tested = TEST_OK_PREWB, 11100 .probe = PROBE_SPI_RDID, 11101 .probe_timing = TIMING_ZERO, 11102 .block_erasers = 11103 { 11104 { 11105 .eraseblocks = { {4 * 1024, 64} }, 11106 .block_erase = SPI_BLOCK_ERASE_20, 11107 }, { 11108 .eraseblocks = { {32 * 1024, 8} }, 11109 .block_erase = SPI_BLOCK_ERASE_52, 11110 }, { 11111 .eraseblocks = { {64 * 1024, 4} }, 11112 .block_erase = SPI_BLOCK_ERASE_D8, 11113 }, { 11114 .eraseblocks = { {1 * 256 * 1024, 1} }, 11115 .block_erase = SPI_BLOCK_ERASE_60, 11116 }, { 11117 .eraseblocks = { {1 * 256 * 1024, 1} }, 11118 .block_erase = SPI_BLOCK_ERASE_C7, 11119 } 11120 }, 11121 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 11122 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11123 .write = SPI_CHIP_WRITE256, 11124 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11125 .voltage = {1650, 3600}, 11126 .reg_bits = 11127 { 11128 .srp = {STATUS1, 7, RW}, 11129 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11130 .tb = {CONFIG, 3, OTP} 11131 }, 11132 11133 .decode_range = DECODE_RANGE_SPI25, 11134 }, 11135 11136 { 11137 .vendor = "Macronix", 11138 .name = "MX25R3235F", 11139 .bustype = BUS_SPI, 11140 .manufacture_id = MACRONIX_ID, 11141 .model_id = MACRONIX_MX25R3235F, 11142 .total_size = 4096, 11143 .page_size = 256, 11144 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11146 .tested = TEST_OK_PREW, 11147 .probe = PROBE_SPI_RDID, 11148 .probe_timing = TIMING_ZERO, 11149 .block_erasers = 11150 { 11151 { 11152 .eraseblocks = { {4 * 1024, 1024} }, 11153 .block_erase = SPI_BLOCK_ERASE_20, 11154 }, { 11155 .eraseblocks = { {32 * 1024, 128} }, 11156 .block_erase = SPI_BLOCK_ERASE_52, 11157 }, { 11158 .eraseblocks = { {64 * 1024, 64} }, 11159 .block_erase = SPI_BLOCK_ERASE_D8, 11160 }, { 11161 .eraseblocks = { {4 * 1024 * 1024, 1} }, 11162 .block_erase = SPI_BLOCK_ERASE_60, 11163 }, { 11164 .eraseblocks = { {4 * 1024 * 1024, 1} }, 11165 .block_erase = SPI_BLOCK_ERASE_C7, 11166 } 11167 }, 11168 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 11169 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11170 .write = SPI_CHIP_WRITE256, 11171 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11172 .voltage = {1650, 3600}, 11173 }, 11174 11175 { 11176 .vendor = "Macronix", 11177 .name = "MX25R4035F", 11178 .bustype = BUS_SPI, 11179 .manufacture_id = MACRONIX_ID, 11180 .model_id = MACRONIX_MX25R4035F, 11181 .total_size = 512, 11182 .page_size = 256, 11183 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11184 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 11185 .tested = TEST_OK_PREWB, 11186 .probe = PROBE_SPI_RDID, 11187 .probe_timing = TIMING_ZERO, 11188 .block_erasers = 11189 { 11190 { 11191 .eraseblocks = { {4 * 1024, 128} }, 11192 .block_erase = SPI_BLOCK_ERASE_20, 11193 }, { 11194 .eraseblocks = { {32 * 1024, 16} }, 11195 .block_erase = SPI_BLOCK_ERASE_52, 11196 }, { 11197 .eraseblocks = { {64 * 1024, 8} }, 11198 .block_erase = SPI_BLOCK_ERASE_D8, 11199 }, { 11200 .eraseblocks = { {1 * 512 * 1024, 1} }, 11201 .block_erase = SPI_BLOCK_ERASE_60, 11202 }, { 11203 .eraseblocks = { {1 * 512 * 1024, 1} }, 11204 .block_erase = SPI_BLOCK_ERASE_C7, 11205 } 11206 }, 11207 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 11208 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11209 .write = SPI_CHIP_WRITE256, 11210 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11211 .voltage = {1650, 3600}, 11212 .reg_bits = 11213 { 11214 .srp = {STATUS1, 7, RW}, 11215 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11216 .tb = {CONFIG, 3, OTP} 11217 }, 11218 11219 .decode_range = DECODE_RANGE_SPI25, 11220 }, 11221 11222 { 11223 .vendor = "Macronix", 11224 .name = "MX25R6435F", 11225 .bustype = BUS_SPI, 11226 .manufacture_id = MACRONIX_ID, 11227 .model_id = MACRONIX_MX25R6435F, 11228 .total_size = 8192, 11229 .page_size = 256, 11230 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11231 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11232 .tested = TEST_OK_PREW, 11233 .probe = PROBE_SPI_RDID, 11234 .probe_timing = TIMING_ZERO, 11235 .block_erasers = 11236 { 11237 { 11238 .eraseblocks = { {4 * 1024, 2048} }, 11239 .block_erase = SPI_BLOCK_ERASE_20, 11240 }, { 11241 .eraseblocks = { {32 * 1024, 256} }, 11242 .block_erase = SPI_BLOCK_ERASE_52, 11243 }, { 11244 .eraseblocks = { {64 * 1024, 128} }, 11245 .block_erase = SPI_BLOCK_ERASE_D8, 11246 }, { 11247 .eraseblocks = { {8 * 1024 * 1024, 1} }, 11248 .block_erase = SPI_BLOCK_ERASE_60, 11249 }, { 11250 .eraseblocks = { {8 * 1024 * 1024, 1} }, 11251 .block_erase = SPI_BLOCK_ERASE_C7, 11252 } 11253 }, 11254 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11255 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11256 .write = SPI_CHIP_WRITE256, 11257 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11258 .voltage = {1650, 3600}, 11259 }, 11260 11261 { 11262 .vendor = "Macronix", 11263 .name = "MX25R8035F", 11264 .bustype = BUS_SPI, 11265 .manufacture_id = MACRONIX_ID, 11266 .model_id = MACRONIX_MX25R8035F, 11267 .total_size = 1024, 11268 .page_size = 256, 11269 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11270 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR, 11271 .tested = TEST_OK_PREWB, 11272 .probe = PROBE_SPI_RDID, 11273 .probe_timing = TIMING_ZERO, 11274 .block_erasers = 11275 { 11276 { 11277 .eraseblocks = { {4 * 1024, 256} }, 11278 .block_erase = SPI_BLOCK_ERASE_20, 11279 }, { 11280 .eraseblocks = { {32 * 1024, 32} }, 11281 .block_erase = SPI_BLOCK_ERASE_52, 11282 }, { 11283 .eraseblocks = { {64 * 1024, 16} }, 11284 .block_erase = SPI_BLOCK_ERASE_D8, 11285 }, { 11286 .eraseblocks = { {1 * 1024 * 1024, 1} }, 11287 .block_erase = SPI_BLOCK_ERASE_60, 11288 }, { 11289 .eraseblocks = { {1 * 1024 * 1024, 1} }, 11290 .block_erase = SPI_BLOCK_ERASE_C7, 11291 } 11292 }, 11293 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit 6 is quad enable */ 11294 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11295 .write = SPI_CHIP_WRITE256, 11296 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11297 .voltage = {1650, 3600}, 11298 .reg_bits = 11299 { 11300 .srp = {STATUS1, 7, RW}, 11301 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11302 .tb = {CONFIG, 3, OTP} 11303 }, 11304 11305 .decode_range = DECODE_RANGE_SPI25, 11306 }, 11307 11308 { 11309 .vendor = "Macronix", 11310 .name = "MX25V4035F", 11311 .bustype = BUS_SPI, 11312 .manufacture_id = MACRONIX_ID, 11313 .model_id = MACRONIX_MX25V4035F, 11314 .total_size = 512, 11315 .page_size = 256, 11316 /* OTP: 8KiB total; enter 0xB1, exit 0xC1 */ 11317 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_SCUR, 11318 .tested = TEST_UNTESTED, 11319 .probe = PROBE_SPI_RDID, 11320 .probe_timing = TIMING_ZERO, 11321 .block_erasers = 11322 { 11323 { 11324 .eraseblocks = { { 4 * 1024, 128} }, 11325 .block_erase = SPI_BLOCK_ERASE_20, 11326 }, { 11327 .eraseblocks = { {32 * 1024, 16} }, 11328 .block_erase = SPI_BLOCK_ERASE_52, 11329 }, { 11330 .eraseblocks = { {64 * 1024, 8} }, 11331 .block_erase = SPI_BLOCK_ERASE_D8, 11332 }, { 11333 .eraseblocks = { {512 * 1024, 1} }, 11334 .block_erase = SPI_BLOCK_ERASE_C7, 11335 } 11336 }, 11337 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11338 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11339 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11340 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11341 .voltage = {2300, 3600}, 11342 }, 11343 { 11344 .vendor = "Macronix", 11345 .name = "MX25V8035F", 11346 .bustype = BUS_SPI, 11347 .manufacture_id = MACRONIX_ID, 11348 .model_id = MACRONIX_MX25V8035F, 11349 .total_size = 1024, 11350 .page_size = 256, 11351 /* OTP: 8KiB total; enter 0xB1, exit 0xC1 */ 11352 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_SCUR, 11353 .tested = TEST_UNTESTED, 11354 .probe = PROBE_SPI_RDID, 11355 .probe_timing = TIMING_ZERO, 11356 .block_erasers = 11357 { 11358 { 11359 .eraseblocks = { { 4 * 1024, 256} }, 11360 .block_erase = SPI_BLOCK_ERASE_20, 11361 }, { 11362 .eraseblocks = { {32 * 1024, 32} }, 11363 .block_erase = SPI_BLOCK_ERASE_52, 11364 }, { 11365 .eraseblocks = { {64 * 1024, 16} }, 11366 .block_erase = SPI_BLOCK_ERASE_D8, 11367 }, { 11368 .eraseblocks = { {1 * 1024 * 1024, 1} }, 11369 .block_erase = SPI_BLOCK_ERASE_C7, 11370 } 11371 }, 11372 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11373 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11374 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11375 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11376 .voltage = {2300, 3600}, 11377 }, 11378 { 11379 .vendor = "Macronix", 11380 .name = "MX25V1635F", 11381 .bustype = BUS_SPI, 11382 .manufacture_id = MACRONIX_ID, 11383 .model_id = MACRONIX_MX25V1635F, 11384 .total_size = 2048, 11385 .page_size = 256, 11386 /* OTP: 8KiB total; enter 0xB1, exit 0xC1 */ 11387 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_SCUR, 11388 .tested = TEST_OK_PREW, 11389 .probe = PROBE_SPI_RDID, 11390 .probe_timing = TIMING_ZERO, 11391 .block_erasers = 11392 { 11393 { 11394 .eraseblocks = { { 4 * 1024, 512} }, 11395 .block_erase = SPI_BLOCK_ERASE_20, 11396 }, { 11397 .eraseblocks = { {32 * 1024, 64} }, 11398 .block_erase = SPI_BLOCK_ERASE_52, 11399 }, { 11400 .eraseblocks = { {64 * 1024, 32} }, 11401 .block_erase = SPI_BLOCK_ERASE_D8, 11402 }, { 11403 .eraseblocks = { {2 * 1024 * 1024, 1} }, 11404 .block_erase = SPI_BLOCK_ERASE_60, 11405 } 11406 }, 11407 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11408 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11409 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11410 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11411 .voltage = {2300, 3600}, 11412 }, 11413 11414 { 11415 .vendor = "Macronix", 11416 .name = "MX25U12835F", 11417 .bustype = BUS_SPI, 11418 .manufacture_id = MACRONIX_ID, 11419 .model_id = MACRONIX_MX25U12835E, 11420 .total_size = 16384, 11421 .page_size = 256, 11422 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11423 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 11424 .tested = TEST_OK_PREW, 11425 .probe = PROBE_SPI_RDID, 11426 .probe_timing = TIMING_ZERO, 11427 .block_erasers = 11428 { 11429 { 11430 .eraseblocks = { {4 * 1024, 4096} }, 11431 .block_erase = SPI_BLOCK_ERASE_20, 11432 }, { 11433 .eraseblocks = { {32 * 1024, 512} }, 11434 .block_erase = SPI_BLOCK_ERASE_52, 11435 }, { 11436 .eraseblocks = { {64 * 1024, 256} }, 11437 .block_erase = SPI_BLOCK_ERASE_D8, 11438 }, { 11439 .eraseblocks = { {16 * 1024 * 1024, 1} }, 11440 .block_erase = SPI_BLOCK_ERASE_60, 11441 }, { 11442 .eraseblocks = { {16 * 1024 * 1024, 1} }, 11443 .block_erase = SPI_BLOCK_ERASE_C7, 11444 } 11445 }, 11446 /* TODO: security register */ 11447 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11448 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11449 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11450 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11451 .voltage = {1650, 2000}, 11452 }, 11453 11454 { 11455 .vendor = "Macronix", 11456 .name = "MX25U1635E", 11457 .bustype = BUS_SPI, 11458 .manufacture_id = MACRONIX_ID, 11459 .model_id = MACRONIX_MX25U1635E, 11460 .total_size = 2048, 11461 .page_size = 256, 11462 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11463 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 11464 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 11465 .tested = TEST_OK_PR, 11466 .probe = PROBE_SPI_RDID, 11467 .probe_timing = TIMING_ZERO, 11468 .block_erasers = 11469 { 11470 { 11471 .eraseblocks = { {4 * 1024, 512} }, 11472 .block_erase = SPI_BLOCK_ERASE_20, 11473 }, { 11474 .eraseblocks = { {32 * 1024, 64} }, 11475 .block_erase = SPI_BLOCK_ERASE_52, 11476 }, { 11477 .eraseblocks = { {64 * 1024, 32} }, 11478 .block_erase = SPI_BLOCK_ERASE_D8, 11479 }, { 11480 .eraseblocks = { {2 * 1024 * 1024, 1} }, 11481 .block_erase = SPI_BLOCK_ERASE_60, 11482 }, { 11483 .eraseblocks = { {2 * 1024 * 1024, 1} }, 11484 .block_erase = SPI_BLOCK_ERASE_C7, 11485 } 11486 }, 11487 /* TODO: security register */ 11488 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11489 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11490 .write = SPI_CHIP_WRITE256, 11491 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11492 .voltage = {1650, 2000}, 11493 }, 11494 11495 { 11496 .vendor = "Macronix", 11497 .name = "MX25U25635F", 11498 .bustype = BUS_SPI, 11499 .manufacture_id = MACRONIX_ID, 11500 .model_id = MACRONIX_MX25U25635F, 11501 .total_size = 32768, 11502 .page_size = 256, 11503 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11504 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 11505 .tested = TEST_OK_PREW, 11506 .probe = PROBE_SPI_RDID, 11507 .probe_timing = TIMING_ZERO, 11508 .block_erasers = 11509 { 11510 { 11511 .eraseblocks = { {4 * 1024, 8192} }, 11512 .block_erase = SPI_BLOCK_ERASE_21, 11513 }, { 11514 .eraseblocks = { {4 * 1024, 8192} }, 11515 .block_erase = SPI_BLOCK_ERASE_20, 11516 }, { 11517 .eraseblocks = { {32 * 1024, 1024} }, 11518 .block_erase = SPI_BLOCK_ERASE_5C, 11519 }, { 11520 .eraseblocks = { {32 * 1024, 1024} }, 11521 .block_erase = SPI_BLOCK_ERASE_52, 11522 }, { 11523 .eraseblocks = { {64 * 1024, 512} }, 11524 .block_erase = SPI_BLOCK_ERASE_DC, 11525 }, { 11526 .eraseblocks = { {64 * 1024, 512} }, 11527 .block_erase = SPI_BLOCK_ERASE_D8, 11528 }, { 11529 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11530 .block_erase = SPI_BLOCK_ERASE_60, 11531 }, { 11532 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11533 .block_erase = SPI_BLOCK_ERASE_C7, 11534 } 11535 }, 11536 /* TODO: security register */ 11537 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11538 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11539 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11540 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11541 .voltage = {1650, 2000}, 11542 }, 11543 11544 { 11545 .vendor = "Macronix", 11546 .name = "MX25U25643G", 11547 .bustype = BUS_SPI, 11548 .manufacture_id = MACRONIX_ID, 11549 .model_id = MACRONIX_MX25U25635F, 11550 .total_size = 32768, 11551 .page_size = 256, 11552 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11553 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA | FEATURE_CFGR | FEATURE_SCUR, 11554 .tested = TEST_OK_PREWB, 11555 .probe = PROBE_SPI_RDID, 11556 .probe_timing = TIMING_ZERO, 11557 .block_erasers = 11558 { 11559 { 11560 .eraseblocks = { {4 * 1024, 8192} }, 11561 .block_erase = SPI_BLOCK_ERASE_21, 11562 }, { 11563 .eraseblocks = { {4 * 1024, 8192} }, 11564 .block_erase = SPI_BLOCK_ERASE_20, 11565 }, { 11566 .eraseblocks = { {32 * 1024, 1024} }, 11567 .block_erase = SPI_BLOCK_ERASE_5C, 11568 }, { 11569 .eraseblocks = { {32 * 1024, 1024} }, 11570 .block_erase = SPI_BLOCK_ERASE_52, 11571 }, { 11572 .eraseblocks = { {64 * 1024, 512} }, 11573 .block_erase = SPI_BLOCK_ERASE_DC, 11574 }, { 11575 .eraseblocks = { {64 * 1024, 512} }, 11576 .block_erase = SPI_BLOCK_ERASE_D8, 11577 }, { 11578 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11579 .block_erase = SPI_BLOCK_ERASE_60, 11580 }, { 11581 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11582 .block_erase = SPI_BLOCK_ERASE_C7, 11583 } 11584 }, 11585 /* TODO: security register */ 11586 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11587 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11588 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11589 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11590 .voltage = {1650, 2000}, 11591 .reg_bits = 11592 { 11593 .srp = {STATUS1, 7, RW}, 11594 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11595 .tb = {CONFIG, 3, OTP}, 11596 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 11597 }, 11598 .decode_range = DECODE_RANGE_SPI25, 11599 }, 11600 11601 { 11602 .vendor = "Macronix", 11603 .name = "MX25U25645G", 11604 .bustype = BUS_SPI, 11605 .manufacture_id = MACRONIX_ID, 11606 .model_id = MACRONIX_MX25U25635F, 11607 .total_size = 32768, 11608 .page_size = 256, 11609 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */ 11610 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA | FEATURE_CFGR | FEATURE_SCUR, 11611 .tested = TEST_OK_PREWB, 11612 .probe = PROBE_SPI_RDID, 11613 .probe_timing = TIMING_ZERO, 11614 .block_erasers = 11615 { 11616 { 11617 .eraseblocks = { {4 * 1024, 8192} }, 11618 .block_erase = SPI_BLOCK_ERASE_21, 11619 }, { 11620 .eraseblocks = { {4 * 1024, 8192} }, 11621 .block_erase = SPI_BLOCK_ERASE_20, 11622 }, { 11623 .eraseblocks = { {32 * 1024, 1024} }, 11624 .block_erase = SPI_BLOCK_ERASE_5C, 11625 }, { 11626 .eraseblocks = { {32 * 1024, 1024} }, 11627 .block_erase = SPI_BLOCK_ERASE_52, 11628 }, { 11629 .eraseblocks = { {64 * 1024, 512} }, 11630 .block_erase = SPI_BLOCK_ERASE_DC, 11631 }, { 11632 .eraseblocks = { {64 * 1024, 512} }, 11633 .block_erase = SPI_BLOCK_ERASE_D8, 11634 }, { 11635 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11636 .block_erase = SPI_BLOCK_ERASE_60, 11637 }, { 11638 .eraseblocks = { {32 * 1024 * 1024, 1} }, 11639 .block_erase = SPI_BLOCK_ERASE_C7, 11640 } 11641 }, 11642 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11643 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11644 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11645 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11646 .voltage = {1700, 2000}, 11647 .reg_bits = 11648 { 11649 .srp = {STATUS1, 7, RW}, 11650 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 11651 .tb = {CONFIG, 3, OTP}, 11652 .wps = {SECURITY, 7, OTP}, /* This bit is set by WPSEL command */ 11653 }, 11654 .decode_range = DECODE_RANGE_SPI25, 11655 }, 11656 11657 { 11658 .vendor = "Macronix", 11659 .name = "MX25U3235E/F", 11660 .bustype = BUS_SPI, 11661 .manufacture_id = MACRONIX_ID, 11662 .model_id = MACRONIX_MX25U3235E, 11663 .total_size = 4096, 11664 .page_size = 256, 11665 /* F model supports SFDP */ 11666 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11667 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 11668 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 11669 .tested = TEST_OK_PREW, 11670 .probe = PROBE_SPI_RDID, 11671 .probe_timing = TIMING_ZERO, 11672 .block_erasers = 11673 { 11674 { 11675 .eraseblocks = { {4 * 1024, 1024} }, 11676 .block_erase = SPI_BLOCK_ERASE_20, 11677 }, { 11678 .eraseblocks = { {32 * 1024, 128} }, 11679 .block_erase = SPI_BLOCK_ERASE_52, 11680 }, { 11681 .eraseblocks = { {64 * 1024, 64} }, 11682 .block_erase = SPI_BLOCK_ERASE_D8, 11683 }, { 11684 .eraseblocks = { {4 * 1024 * 1024, 1} }, 11685 .block_erase = SPI_BLOCK_ERASE_60, 11686 }, { 11687 .eraseblocks = { {4 * 1024 * 1024, 1} }, 11688 .block_erase = SPI_BLOCK_ERASE_C7, 11689 } 11690 }, 11691 /* TODO: security register */ 11692 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11693 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11694 .write = SPI_CHIP_WRITE256, 11695 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11696 .voltage = {1650, 2000}, 11697 }, 11698 11699 { 11700 .vendor = "Macronix", 11701 .name = "MX25U51245G", 11702 .bustype = BUS_SPI, 11703 .manufacture_id = MACRONIX_ID, 11704 .model_id = MACRONIX_MX25U51245G, 11705 .total_size = 65536, 11706 .page_size = 256, 11707 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */ 11708 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA, 11709 .tested = TEST_OK_PREW, 11710 .probe = PROBE_SPI_RDID, 11711 .probe_timing = TIMING_ZERO, 11712 .block_erasers = 11713 { 11714 { 11715 .eraseblocks = { {4 * 1024, 16384} }, 11716 .block_erase = SPI_BLOCK_ERASE_21, 11717 }, { 11718 .eraseblocks = { {4 * 1024, 16384} }, 11719 .block_erase = SPI_BLOCK_ERASE_20, 11720 }, { 11721 .eraseblocks = { {32 * 1024, 2048} }, 11722 .block_erase = SPI_BLOCK_ERASE_5C, 11723 }, { 11724 .eraseblocks = { {32 * 1024, 2048} }, 11725 .block_erase = SPI_BLOCK_ERASE_52, 11726 }, { 11727 .eraseblocks = { {64 * 1024, 1024} }, 11728 .block_erase = SPI_BLOCK_ERASE_DC, 11729 }, { 11730 .eraseblocks = { {64 * 1024, 1024} }, 11731 .block_erase = SPI_BLOCK_ERASE_D8, 11732 }, { 11733 .eraseblocks = { {64 * 1024 * 1024, 1} }, 11734 .block_erase = SPI_BLOCK_ERASE_60, 11735 }, { 11736 .eraseblocks = { {64 * 1024 * 1024, 1} }, 11737 .block_erase = SPI_BLOCK_ERASE_C7, 11738 } 11739 }, 11740 /* TODO: security register */ 11741 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11742 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11743 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 11744 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11745 .voltage = {1650, 2000}, 11746 }, 11747 11748 { 11749 .vendor = "Macronix", 11750 .name = "MX25U6435E/F", 11751 .bustype = BUS_SPI, 11752 .manufacture_id = MACRONIX_ID, 11753 .model_id = MACRONIX_MX25U6435E, 11754 .total_size = 8192, 11755 .page_size = 256, 11756 /* F model supports SFDP */ 11757 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11758 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */ 11759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 11760 .tested = TEST_OK_PREW, 11761 .probe = PROBE_SPI_RDID, 11762 .probe_timing = TIMING_ZERO, 11763 .block_erasers = 11764 { 11765 { 11766 .eraseblocks = { {4 * 1024, 2048} }, 11767 .block_erase = SPI_BLOCK_ERASE_20, 11768 }, { 11769 .eraseblocks = { {32 * 1024, 256} }, 11770 .block_erase = SPI_BLOCK_ERASE_52, 11771 }, { 11772 .eraseblocks = { {64 * 1024, 128} }, 11773 .block_erase = SPI_BLOCK_ERASE_D8, 11774 }, { 11775 .eraseblocks = { {8 * 1024 * 1024, 1} }, 11776 .block_erase = SPI_BLOCK_ERASE_60, 11777 }, { 11778 .eraseblocks = { {8 * 1024 * 1024, 1} }, 11779 .block_erase = SPI_BLOCK_ERASE_C7, 11780 } 11781 }, 11782 /* TODO: security register */ 11783 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11784 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11785 .write = SPI_CHIP_WRITE256, 11786 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11787 .voltage = {1650, 2000}, 11788 }, 11789 11790 { 11791 .vendor = "Macronix", 11792 .name = "MX25U8032E", 11793 .bustype = BUS_SPI, 11794 .manufacture_id = MACRONIX_ID, 11795 .model_id = MACRONIX_MX25U8032E, 11796 .total_size = 1024, 11797 .page_size = 256, 11798 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 11799 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 11800 .tested = TEST_OK_PREW, 11801 .probe = PROBE_SPI_RDID, 11802 .probe_timing = TIMING_ZERO, 11803 .block_erasers = 11804 { 11805 { 11806 .eraseblocks = { {4 * 1024, 256} }, 11807 .block_erase = SPI_BLOCK_ERASE_20, 11808 }, { 11809 .eraseblocks = { {32 * 1024, 32} }, 11810 .block_erase = SPI_BLOCK_ERASE_52, 11811 }, { 11812 .eraseblocks = { {64 * 1024, 16} }, 11813 .block_erase = SPI_BLOCK_ERASE_D8, 11814 }, { 11815 .eraseblocks = { {1024 * 1024, 1} }, 11816 .block_erase = SPI_BLOCK_ERASE_60, 11817 }, { 11818 .eraseblocks = { {1024 * 1024, 1} }, 11819 .block_erase = SPI_BLOCK_ERASE_C7, 11820 } 11821 }, 11822 /* TODO: security register */ 11823 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 11824 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 11825 .write = SPI_CHIP_WRITE256, 11826 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 11827 .voltage = {1650, 2000}, 11828 }, 11829 11830 { 11831 .vendor = "Macronix", 11832 .name = "MX29F001B", 11833 .bustype = BUS_PARALLEL, 11834 .manufacture_id = MACRONIX_ID, 11835 .model_id = MACRONIX_MX29F001B, 11836 .total_size = 128, 11837 .page_size = 32 * 1024, 11838 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 11839 .tested = TEST_UNTESTED, 11840 .probe = PROBE_JEDEC, 11841 .probe_timing = TIMING_ZERO, 11842 .block_erasers = 11843 { 11844 { 11845 .eraseblocks = { 11846 {8 * 1024, 1}, 11847 {4 * 1024, 2}, 11848 {8 * 1024, 2}, 11849 {32 * 1024, 1}, 11850 {64 * 1024, 1}, 11851 }, 11852 .block_erase = JEDEC_SECTOR_ERASE, 11853 }, { 11854 .eraseblocks = { {128 * 1024, 1} }, 11855 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 11856 } 11857 }, 11858 .write = WRITE_JEDEC1, 11859 .read = READ_MEMMAPPED, 11860 .voltage = {4500, 5500}, 11861 }, 11862 11863 { 11864 .vendor = "Macronix", 11865 .name = "MX29F001T", 11866 .bustype = BUS_PARALLEL, 11867 .manufacture_id = MACRONIX_ID, 11868 .model_id = MACRONIX_MX29F001T, 11869 .total_size = 128, 11870 .page_size = 32 * 1024, 11871 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 11872 .tested = TEST_OK_PREW, 11873 .probe = PROBE_JEDEC, 11874 .probe_timing = TIMING_ZERO, 11875 .block_erasers = 11876 { 11877 { 11878 .eraseblocks = { 11879 {64 * 1024, 1}, 11880 {32 * 1024, 1}, 11881 {8 * 1024, 2}, 11882 {4 * 1024, 2}, 11883 {8 * 1024, 1}, 11884 }, 11885 .block_erase = JEDEC_SECTOR_ERASE, 11886 }, { 11887 .eraseblocks = { {128 * 1024, 1} }, 11888 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 11889 } 11890 }, 11891 .write = WRITE_JEDEC1, 11892 .read = READ_MEMMAPPED, 11893 .voltage = {4500, 5500}, 11894 }, 11895 11896 { 11897 .vendor = "Macronix", 11898 .name = "MX29F002(N)B", 11899 .bustype = BUS_PARALLEL, 11900 .manufacture_id = MACRONIX_ID, 11901 .model_id = MACRONIX_MX29F002B, 11902 .total_size = 256, 11903 .page_size = 64 * 1024, 11904 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 11905 .tested = TEST_UNTESTED, 11906 .probe = PROBE_JEDEC, 11907 .probe_timing = TIMING_ZERO, 11908 .block_erasers = 11909 { 11910 { 11911 .eraseblocks = { 11912 {16 * 1024, 1}, 11913 {8 * 1024, 2}, 11914 {32 * 1024, 1}, 11915 {64 * 1024, 3}, 11916 }, 11917 .block_erase = JEDEC_SECTOR_ERASE, 11918 }, { 11919 .eraseblocks = { {256 * 1024, 1} }, 11920 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 11921 }, 11922 }, 11923 .write = WRITE_JEDEC1, 11924 .read = READ_MEMMAPPED, 11925 .voltage = {4500, 5500}, 11926 }, 11927 11928 { 11929 .vendor = "Macronix", 11930 .name = "MX29F002(N)T", 11931 .bustype = BUS_PARALLEL, 11932 .manufacture_id = MACRONIX_ID, 11933 .model_id = MACRONIX_MX29F002T, 11934 .total_size = 256, 11935 .page_size = 64 * 1024, 11936 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 11937 .tested = TEST_OK_PREW, 11938 .probe = PROBE_JEDEC, 11939 .probe_timing = TIMING_ZERO, 11940 .block_erasers = 11941 { 11942 { 11943 .eraseblocks = { 11944 {64 * 1024, 3}, 11945 {32 * 1024, 1}, 11946 {8 * 1024, 2}, 11947 {16 * 1024, 1}, 11948 }, 11949 .block_erase = JEDEC_SECTOR_ERASE, 11950 }, { 11951 .eraseblocks = { {256 * 1024, 1} }, 11952 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 11953 }, 11954 }, 11955 .write = WRITE_JEDEC1, 11956 .read = READ_MEMMAPPED, 11957 .voltage = {4500, 5500}, 11958 }, 11959 11960 { 11961 .vendor = "Macronix", 11962 .name = "MX29F022(N)B", 11963 .bustype = BUS_PARALLEL, 11964 .manufacture_id = MACRONIX_ID, 11965 .model_id = MACRONIX_MX29F022B, 11966 .total_size = 256, 11967 .page_size = 0, /* unused */ 11968 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 11969 .tested = TEST_UNTESTED, 11970 .probe = PROBE_JEDEC, 11971 .probe_timing = TIMING_ZERO, 11972 .block_erasers = 11973 { 11974 { 11975 .eraseblocks = { 11976 {16 * 1024, 1}, 11977 {8 * 1024, 2}, 11978 {32 * 1024, 1}, 11979 {64 * 1024, 3}, 11980 }, 11981 .block_erase = JEDEC_SECTOR_ERASE, 11982 }, { 11983 .eraseblocks = { {256 * 1024, 1} }, 11984 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 11985 } 11986 }, 11987 .write = WRITE_JEDEC1, 11988 .read = READ_MEMMAPPED, 11989 .voltage = {4500, 5500}, 11990 }, 11991 11992 { 11993 .vendor = "Macronix", 11994 .name = "MX29F022(N)T", 11995 .bustype = BUS_PARALLEL, 11996 .manufacture_id = MACRONIX_ID, 11997 .model_id = MACRONIX_MX29F022T, 11998 .total_size = 256, 11999 .page_size = 0, /* unused */ 12000 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12001 .tested = TEST_OK_PREW, 12002 .probe = PROBE_JEDEC, 12003 .probe_timing = TIMING_ZERO, 12004 .block_erasers = 12005 { 12006 { 12007 .eraseblocks = { 12008 {64 * 1024, 3}, 12009 {32 * 1024, 1}, 12010 {8 * 1024, 2}, 12011 {16 * 1024, 1}, 12012 }, 12013 .block_erase = JEDEC_SECTOR_ERASE, 12014 }, { 12015 .eraseblocks = { {256 * 1024, 1} }, 12016 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12017 } 12018 }, 12019 .write = WRITE_JEDEC1, 12020 .read = READ_MEMMAPPED, 12021 .voltage = {4500, 5500}, 12022 }, 12023 12024 { 12025 .vendor = "Macronix", 12026 .name = "MX29F040", 12027 .bustype = BUS_PARALLEL, 12028 .manufacture_id = MACRONIX_ID, 12029 .model_id = MACRONIX_MX29F040, 12030 .total_size = 512, 12031 .page_size = 64 * 1024, 12032 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12033 .tested = TEST_UNTESTED, 12034 .probe = PROBE_JEDEC, 12035 .probe_timing = TIMING_ZERO, 12036 .block_erasers = 12037 { 12038 { 12039 .eraseblocks = { {64 * 1024, 8} }, 12040 .block_erase = JEDEC_SECTOR_ERASE, 12041 }, { 12042 .eraseblocks = { {512 * 1024, 1} }, 12043 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12044 }, 12045 }, 12046 .write = WRITE_JEDEC1, 12047 .read = READ_MEMMAPPED, 12048 .voltage = {4500, 5500}, 12049 }, 12050 12051 { 12052 .vendor = "Macronix", 12053 .name = "MX29GL128F", 12054 .bustype = BUS_PARALLEL, 12055 .manufacture_id = MACRONIX_ID, 12056 .model_id = MACRONIX_MX29GL128F, 12057 .total_size = 16384, 12058 .page_size = 128 * 1024, /* actual page size is 16 */ 12059 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12060 .tested = TEST_UNTESTED, 12061 .probe = PROBE_JEDEC_29GL, 12062 .probe_timing = TIMING_ZERO, 12063 .block_erasers = 12064 { 12065 { 12066 .eraseblocks = { {128 * 1024, 128} }, 12067 .block_erase = JEDEC_SECTOR_ERASE, 12068 }, { 12069 .eraseblocks = { {16 * 1024 * 1024, 1} }, 12070 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12071 }, 12072 }, 12073 .write = WRITE_JEDEC1, 12074 .read = READ_MEMMAPPED, 12075 .voltage = {2700, 3600}, 12076 }, 12077 12078 { 12079 .vendor = "Macronix", 12080 .name = "MX29GL320EB", 12081 .bustype = BUS_PARALLEL, 12082 .manufacture_id = MACRONIX_ID, 12083 .model_id = MACRONIX_MX29GL320EB, 12084 .total_size = 4096, 12085 .page_size = 128 * 1024, /* actual page size is 16 */ 12086 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12087 .tested = TEST_UNTESTED, 12088 .probe = PROBE_JEDEC_29GL, 12089 .probe_timing = TIMING_ZERO, 12090 .block_erasers = 12091 { 12092 { 12093 .eraseblocks = { 12094 {8 * 1024, 8}, 12095 {64 * 1024, 63}, 12096 }, 12097 .block_erase = JEDEC_SECTOR_ERASE, 12098 }, { 12099 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12100 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12101 }, 12102 }, 12103 .write = WRITE_JEDEC1, 12104 .read = READ_MEMMAPPED, 12105 .voltage = {2700, 3600}, 12106 }, 12107 12108 { 12109 .vendor = "Macronix", 12110 .name = "MX29GL320EH/L", 12111 .bustype = BUS_PARALLEL, 12112 .manufacture_id = MACRONIX_ID, 12113 .model_id = MACRONIX_MX29GL320EHL, 12114 .total_size = 4096, 12115 .page_size = 128 * 1024, /* actual page size is 16 */ 12116 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12117 .tested = TEST_UNTESTED, 12118 .probe = PROBE_JEDEC_29GL, 12119 .probe_timing = TIMING_ZERO, 12120 .block_erasers = 12121 { 12122 { 12123 .eraseblocks = { {64 * 1024, 64} }, 12124 .block_erase = JEDEC_SECTOR_ERASE, 12125 }, { 12126 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12127 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12128 }, 12129 }, 12130 .write = WRITE_JEDEC1, 12131 .read = READ_MEMMAPPED, 12132 .voltage = {2700, 3600}, 12133 }, 12134 12135 { 12136 .vendor = "Macronix", 12137 .name = "MX29GL320ET", 12138 .bustype = BUS_PARALLEL, 12139 .manufacture_id = MACRONIX_ID, 12140 .model_id = MACRONIX_MX29GL320ET, 12141 .total_size = 4096, 12142 .page_size = 128 * 1024, /* actual page size is 16 */ 12143 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12144 .tested = TEST_UNTESTED, 12145 .probe = PROBE_JEDEC_29GL, 12146 .probe_timing = TIMING_ZERO, 12147 .block_erasers = 12148 { 12149 { 12150 .eraseblocks = { 12151 {64 * 1024, 63}, 12152 {8 * 1024, 8}, 12153 }, 12154 .block_erase = JEDEC_SECTOR_ERASE, 12155 }, { 12156 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12157 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12158 }, 12159 }, 12160 .write = WRITE_JEDEC1, 12161 .read = READ_MEMMAPPED, 12162 .voltage = {2700, 3600}, 12163 }, 12164 12165 { 12166 .vendor = "Macronix", 12167 .name = "MX29GL640EB", 12168 .bustype = BUS_PARALLEL, 12169 .manufacture_id = MACRONIX_ID, 12170 .model_id = MACRONIX_MX29GL640EB, 12171 .total_size = 8192, 12172 .page_size = 128 * 1024, /* actual page size is 16 */ 12173 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12174 .tested = TEST_UNTESTED, 12175 .probe = PROBE_JEDEC_29GL, 12176 .probe_timing = TIMING_ZERO, 12177 .block_erasers = 12178 { 12179 { 12180 .eraseblocks = { 12181 {8 * 1024, 8}, 12182 {64 * 1024, 127}, 12183 }, 12184 .block_erase = JEDEC_SECTOR_ERASE, 12185 }, { 12186 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12187 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12188 }, 12189 }, 12190 .write = WRITE_JEDEC1, 12191 .read = READ_MEMMAPPED, 12192 .voltage = {2700, 3600}, 12193 }, 12194 12195 { 12196 .vendor = "Macronix", 12197 .name = "MX29GL640EH/L", 12198 .bustype = BUS_PARALLEL, 12199 .manufacture_id = MACRONIX_ID, 12200 .model_id = MACRONIX_MX29GL640EHL, 12201 .total_size = 8192, 12202 .page_size = 128 * 1024, /* actual page size is 16 */ 12203 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12204 .tested = TEST_UNTESTED, 12205 .probe = PROBE_JEDEC_29GL, 12206 .probe_timing = TIMING_ZERO, 12207 .block_erasers = 12208 { 12209 { 12210 .eraseblocks = { {64 * 1024, 128} }, 12211 .block_erase = JEDEC_SECTOR_ERASE, 12212 }, { 12213 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12214 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12215 }, 12216 }, 12217 .write = WRITE_JEDEC1, 12218 .read = READ_MEMMAPPED, 12219 .voltage = {2700, 3600}, 12220 }, 12221 12222 { 12223 .vendor = "Macronix", 12224 .name = "MX29GL640ET", 12225 .bustype = BUS_PARALLEL, 12226 .manufacture_id = MACRONIX_ID, 12227 .model_id = MACRONIX_MX29GL640ET, 12228 .total_size = 8192, 12229 .page_size = 128 * 1024, /* actual page size is 16 */ 12230 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12231 .tested = TEST_UNTESTED, 12232 .probe = PROBE_JEDEC_29GL, 12233 .probe_timing = TIMING_ZERO, 12234 .block_erasers = 12235 { 12236 { 12237 .eraseblocks = { 12238 {64 * 1024, 127}, 12239 {8 * 1024, 8}, 12240 }, 12241 .block_erase = JEDEC_SECTOR_ERASE, 12242 }, { 12243 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12244 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12245 }, 12246 }, 12247 .write = WRITE_JEDEC1, 12248 .read = READ_MEMMAPPED, 12249 .voltage = {2700, 3600}, 12250 }, 12251 12252 { 12253 .vendor = "Macronix", 12254 .name = "MX29LV040", 12255 .bustype = BUS_PARALLEL, 12256 .manufacture_id = MACRONIX_ID, 12257 .model_id = MACRONIX_MX29LV040, 12258 .total_size = 512, 12259 .page_size = 64 * 1024, 12260 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 12261 .tested = TEST_UNTESTED, 12262 .probe = PROBE_JEDEC, 12263 .probe_timing = TIMING_ZERO, 12264 .block_erasers = 12265 { 12266 { 12267 .eraseblocks = { {64 * 1024, 8} }, 12268 .block_erase = JEDEC_SECTOR_ERASE, 12269 }, { 12270 .eraseblocks = { {512 * 1024, 1} }, 12271 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 12272 }, 12273 }, 12274 .write = WRITE_JEDEC1, 12275 .read = READ_MEMMAPPED, 12276 .voltage = {2700, 3600}, 12277 }, 12278 12279 { 12280 .vendor = "Macronix", 12281 .name = "MX66L51235F/MX25L51245G", 12282 .bustype = BUS_SPI, 12283 .manufacture_id = MACRONIX_ID, 12284 .model_id = MACRONIX_MX66L51235F, 12285 .total_size = 65536, 12286 .page_size = 256, 12287 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 12288 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 12289 .tested = TEST_OK_PREW, 12290 .probe = PROBE_SPI_RDID, 12291 .probe_timing = TIMING_ZERO, 12292 .block_erasers = 12293 { 12294 { 12295 .eraseblocks = { {4 * 1024, 16384} }, 12296 .block_erase = SPI_BLOCK_ERASE_21, 12297 }, { 12298 .eraseblocks = { {4 * 1024, 16384} }, 12299 .block_erase = SPI_BLOCK_ERASE_20, 12300 }, { 12301 .eraseblocks = { {32 * 1024, 2048} }, 12302 .block_erase = SPI_BLOCK_ERASE_5C, 12303 }, { 12304 .eraseblocks = { {32 * 1024, 2048} }, 12305 .block_erase = SPI_BLOCK_ERASE_52, 12306 }, { 12307 .eraseblocks = { {64 * 1024, 1024} }, 12308 .block_erase = SPI_BLOCK_ERASE_DC, 12309 }, { 12310 .eraseblocks = { {64 * 1024, 1024} }, 12311 .block_erase = SPI_BLOCK_ERASE_D8, 12312 }, { 12313 .eraseblocks = { {64 * 1024 * 1024, 1} }, 12314 .block_erase = SPI_BLOCK_ERASE_60, 12315 }, { 12316 .eraseblocks = { {64 * 1024 * 1024, 1} }, 12317 .block_erase = SPI_BLOCK_ERASE_C7, 12318 } 12319 }, 12320 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */ 12321 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 12322 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12323 .write = SPI_CHIP_WRITE256, 12324 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12325 .voltage = {2700, 3600}, 12326 }, 12327 12328 { 12329 .vendor = "Macronix", 12330 .name = "MX66L1G45G", 12331 .bustype = BUS_SPI, 12332 .manufacture_id = MACRONIX_ID, 12333 .model_id = MACRONIX_MX66L1G45G, 12334 .total_size = 131072, 12335 .page_size = 256, 12336 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 12337 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 12338 .tested = TEST_OK_PREW, 12339 .probe = PROBE_SPI_RDID, 12340 .probe_timing = TIMING_ZERO, 12341 .block_erasers = 12342 { 12343 { 12344 .eraseblocks = { {4 * 1024, 32768} }, 12345 .block_erase = SPI_BLOCK_ERASE_21, 12346 }, { 12347 .eraseblocks = { {4 * 1024, 32768} }, 12348 .block_erase = SPI_BLOCK_ERASE_20, 12349 }, { 12350 .eraseblocks = { {32 * 1024, 4096} }, 12351 .block_erase = SPI_BLOCK_ERASE_5C, 12352 }, { 12353 .eraseblocks = { {32 * 1024, 4096} }, 12354 .block_erase = SPI_BLOCK_ERASE_52, 12355 }, { 12356 .eraseblocks = { {64 * 1024, 2048} }, 12357 .block_erase = SPI_BLOCK_ERASE_DC, 12358 }, { 12359 .eraseblocks = { {64 * 1024, 2048} }, 12360 .block_erase = SPI_BLOCK_ERASE_D8, 12361 }, { 12362 .eraseblocks = { {128 * 1024 * 1024, 1} }, 12363 .block_erase = SPI_BLOCK_ERASE_60, 12364 }, { 12365 .eraseblocks = { {128 * 1024 * 1024, 1} }, 12366 .block_erase = SPI_BLOCK_ERASE_C7, 12367 } 12368 }, 12369 /* TODO: security register and SBLK/SBULK, configuration register */ 12370 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 12371 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12372 .write = SPI_CHIP_WRITE256, 12373 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12374 .voltage = {2700, 3600}, 12375 }, 12376 12377 { 12378 .vendor = "Macronix", 12379 .name = "MX77L25650F", 12380 .bustype = BUS_SPI, 12381 .manufacture_id = MACRONIX_ID, 12382 .model_id = MACRONIX_MX77L25650F, 12383 .total_size = 32768, 12384 .page_size = 256, 12385 /* OTP: 512B total; enter 0xB1, exit 0xC1 */ 12386 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 12387 .tested = TEST_OK_PREW, 12388 .probe = PROBE_SPI_RDID, 12389 .probe_timing = TIMING_ZERO, 12390 .block_erasers = 12391 { 12392 { 12393 .eraseblocks = { {4 * 1024, 8192} }, 12394 .block_erase = SPI_BLOCK_ERASE_20, 12395 }, { 12396 .eraseblocks = { {32 * 1024, 1024} }, 12397 .block_erase = SPI_BLOCK_ERASE_52, 12398 }, { 12399 .eraseblocks = { {64 * 1024, 512} }, 12400 .block_erase = SPI_BLOCK_ERASE_D8, 12401 }, { 12402 .eraseblocks = { {32 * 1024 * 1024, 1} }, 12403 .block_erase = SPI_BLOCK_ERASE_60, 12404 }, { 12405 .eraseblocks = { {32 * 1024 * 1024, 1} }, 12406 .block_erase = SPI_BLOCK_ERASE_C7, 12407 } 12408 }, 12409 /* TODO: block WP, security register, configuration register */ 12410 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 12411 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12412 .write = SPI_CHIP_WRITE256, 12413 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12414 .voltage = {2700, 3600}, 12415 }, 12416 12417 { 12418 .vendor = "Macronix", 12419 .name = "MX77U51250F", 12420 .bustype = BUS_SPI, 12421 .manufacture_id = MACRONIX_ID, 12422 .model_id = MACRONIX_MX77U51250F, 12423 .total_size = 65536, 12424 .page_size = 256, 12425 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_CFGR | FEATURE_4BA, 12426 .tested = TEST_OK_PREW, 12427 .probe = PROBE_SPI_RDID, 12428 .probe_timing = TIMING_ZERO, 12429 .block_erasers = 12430 { 12431 { 12432 .eraseblocks = { {4 * 1024, 16384} }, 12433 .block_erase = SPI_BLOCK_ERASE_20, 12434 }, { 12435 .eraseblocks = { {32 * 1024, 2048} }, 12436 .block_erase = SPI_BLOCK_ERASE_52, 12437 }, { 12438 .eraseblocks = { {64 * 1024, 1024} }, 12439 .block_erase = SPI_BLOCK_ERASE_D8, 12440 }, { 12441 .eraseblocks = { {64 * 1024 * 1024, 1} }, 12442 .block_erase = SPI_BLOCK_ERASE_60, 12443 }, { 12444 .eraseblocks = { {64 * 1024 * 1024, 1} }, 12445 .block_erase = SPI_BLOCK_ERASE_C7, 12446 } 12447 }, 12448 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 12449 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12450 .write = SPI_CHIP_WRITE256, 12451 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12452 .voltage = {1650, 2000}, 12453 }, 12454 12455 /* The ST M25P05 is a bit of a problem. It has the same ID as the 12456 * ST M25P05-A in RES mode, but supports only 128 byte writes instead 12457 * of 256 byte writes. We rely heavily on the fact that PROBE_SPI_RES1 12458 * only is successful if RDID does not work. 12459 */ 12460 { 12461 .vendor = "Micron/Numonyx/ST", 12462 .name = "M25P05", 12463 .bustype = BUS_SPI, 12464 .manufacture_id = 0, /* Not used. */ 12465 .model_id = ST_M25P05_RES, 12466 .total_size = 64, 12467 .page_size = 256, 12468 .feature_bits = FEATURE_WRSR_WREN, 12469 .tested = TEST_UNTESTED, 12470 .probe = PROBE_SPI_RES1, 12471 .probe_timing = TIMING_ZERO, 12472 .block_erasers = 12473 { 12474 { 12475 .eraseblocks = { {32 * 1024, 2} }, 12476 .block_erase = SPI_BLOCK_ERASE_D8, 12477 }, { 12478 .eraseblocks = { {64 * 1024, 1} }, 12479 .block_erase = SPI_BLOCK_ERASE_C7, 12480 } 12481 }, 12482 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12483 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12484 .write = SPI_CHIP_WRITE1, /* 128 */ 12485 .read = SPI_CHIP_READ, 12486 .voltage = {2700, 3600}, 12487 }, 12488 12489 { 12490 .vendor = "Micron/Numonyx/ST", 12491 .name = "M25P05-A", 12492 .bustype = BUS_SPI, 12493 .manufacture_id = ST_ID, 12494 .model_id = ST_M25P05A, 12495 .total_size = 64, 12496 .page_size = 256, 12497 .feature_bits = FEATURE_WRSR_WREN, 12498 .tested = TEST_OK_PREW, 12499 .probe = PROBE_SPI_RDID, 12500 .probe_timing = TIMING_ZERO, 12501 .block_erasers = 12502 { 12503 { 12504 .eraseblocks = { {32 * 1024, 2} }, 12505 .block_erase = SPI_BLOCK_ERASE_D8, 12506 }, { 12507 .eraseblocks = { {64 * 1024, 1} }, 12508 .block_erase = SPI_BLOCK_ERASE_C7, 12509 } 12510 }, 12511 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12512 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12513 .write = SPI_CHIP_WRITE256, 12514 .read = SPI_CHIP_READ, 12515 .voltage = {2700, 3600}, 12516 }, 12517 12518 /* The ST M25P10 has the same problem as the M25P05. */ 12519 { 12520 .vendor = "Micron/Numonyx/ST", 12521 .name = "M25P10", 12522 .bustype = BUS_SPI, 12523 .manufacture_id = 0, /* Not used. */ 12524 .model_id = ST_M25P10_RES, 12525 .total_size = 128, 12526 .page_size = 256, 12527 .feature_bits = FEATURE_WRSR_WREN, 12528 .tested = TEST_UNTESTED, 12529 .probe = PROBE_SPI_RES1, 12530 .probe_timing = TIMING_ZERO, 12531 .block_erasers = 12532 { 12533 { 12534 .eraseblocks = { {32 * 1024, 4} }, 12535 .block_erase = SPI_BLOCK_ERASE_D8, 12536 }, { 12537 .eraseblocks = { {128 * 1024, 1} }, 12538 .block_erase = SPI_BLOCK_ERASE_C7, 12539 } 12540 }, 12541 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12542 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12543 .write = SPI_CHIP_WRITE1, /* 128 */ 12544 .read = SPI_CHIP_READ, 12545 .voltage = {2700, 3600}, 12546 }, 12547 12548 { 12549 .vendor = "Micron/Numonyx/ST", 12550 .name = "M25P10-A", 12551 .bustype = BUS_SPI, 12552 .manufacture_id = ST_ID, 12553 .model_id = ST_M25P10A, 12554 .total_size = 128, 12555 .page_size = 256, 12556 .feature_bits = FEATURE_WRSR_WREN, 12557 .tested = TEST_OK_PREW, 12558 .probe = PROBE_SPI_RDID, 12559 .probe_timing = TIMING_ZERO, 12560 .block_erasers = 12561 { 12562 { 12563 .eraseblocks = { {32 * 1024, 4} }, 12564 .block_erase = SPI_BLOCK_ERASE_D8, 12565 }, { 12566 .eraseblocks = { {128 * 1024, 1} }, 12567 .block_erase = SPI_BLOCK_ERASE_C7, 12568 } 12569 }, 12570 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12571 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12572 .write = SPI_CHIP_WRITE256, 12573 .read = SPI_CHIP_READ, 12574 .voltage = {2700, 3600}, 12575 }, 12576 12577 { 12578 .vendor = "Micron/Numonyx/ST", 12579 .name = "M25P128", 12580 .bustype = BUS_SPI, 12581 .manufacture_id = ST_ID, 12582 .model_id = ST_M25P128, 12583 .total_size = 16384, 12584 .page_size = 256, 12585 .feature_bits = FEATURE_WRSR_WREN, 12586 .tested = TEST_OK_PREW, 12587 .probe = PROBE_SPI_RDID, 12588 .probe_timing = TIMING_ZERO, 12589 .block_erasers = 12590 { 12591 { 12592 .eraseblocks = { {256 * 1024, 64} }, 12593 .block_erase = SPI_BLOCK_ERASE_D8, 12594 }, { 12595 .eraseblocks = { {16 * 1024 * 1024, 1} }, 12596 .block_erase = SPI_BLOCK_ERASE_C7, 12597 } 12598 }, 12599 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12600 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12601 .write = SPI_CHIP_WRITE256, 12602 .read = SPI_CHIP_READ, 12603 .voltage = {2700, 3600}, 12604 }, 12605 12606 { 12607 .vendor = "Micron/Numonyx/ST", 12608 .name = "M25P16", 12609 .bustype = BUS_SPI, 12610 .manufacture_id = ST_ID, 12611 .model_id = ST_M25P16, 12612 .total_size = 2048, 12613 .page_size = 256, 12614 .feature_bits = FEATURE_WRSR_WREN, 12615 .tested = TEST_OK_PREW, 12616 .probe = PROBE_SPI_RDID, 12617 .probe_timing = TIMING_ZERO, 12618 .block_erasers = 12619 { 12620 { 12621 .eraseblocks = { {64 * 1024, 32} }, 12622 .block_erase = SPI_BLOCK_ERASE_D8, 12623 }, { 12624 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12625 .block_erase = SPI_BLOCK_ERASE_C7, 12626 } 12627 }, 12628 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12629 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12630 .write = SPI_CHIP_WRITE256, 12631 .read = SPI_CHIP_READ, 12632 .voltage = {2700, 3600}, 12633 }, 12634 12635 { 12636 .vendor = "Micron/Numonyx/ST", /* Numonyx */ 12637 .name = "M25P20", 12638 .bustype = BUS_SPI, 12639 .manufacture_id = ST_ID, 12640 .model_id = ST_M25P20, 12641 .total_size = 256, 12642 .page_size = 256, 12643 .feature_bits = FEATURE_WRSR_WREN, 12644 .tested = TEST_UNTESTED, 12645 .probe = PROBE_SPI_RDID, 12646 .probe_timing = TIMING_ZERO, 12647 .block_erasers = 12648 { 12649 { 12650 .eraseblocks = { {64 * 1024, 4} }, 12651 .block_erase = SPI_BLOCK_ERASE_D8, 12652 }, { 12653 .eraseblocks = { {256 * 1024, 1} }, 12654 .block_erase = SPI_BLOCK_ERASE_C7, 12655 } 12656 }, 12657 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 12658 .unlock = SPI_DISABLE_BLOCKPROTECT, 12659 .write = SPI_CHIP_WRITE256, 12660 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12661 .voltage = {2700, 3600}, 12662 }, 12663 12664 { 12665 .vendor = "Micron/Numonyx/ST", 12666 .name = "M25P20-old", 12667 .bustype = BUS_SPI, 12668 .manufacture_id = 0, /* Not used. */ 12669 .model_id = ST_M25P20_RES, 12670 .total_size = 256, 12671 .page_size = 256, 12672 .feature_bits = FEATURE_WRSR_WREN, 12673 .tested = TEST_OK_PREW, 12674 .probe = PROBE_SPI_RES1, 12675 .probe_timing = TIMING_ZERO, 12676 .block_erasers = 12677 { 12678 { 12679 .eraseblocks = { {64 * 1024, 4} }, 12680 .block_erase = SPI_BLOCK_ERASE_D8, 12681 }, { 12682 .eraseblocks = { {256 * 1024, 1} }, 12683 .block_erase = SPI_BLOCK_ERASE_C7, 12684 } 12685 }, 12686 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 12687 .unlock = SPI_DISABLE_BLOCKPROTECT, 12688 .write = SPI_CHIP_WRITE256, 12689 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 12690 .voltage = {2700, 3600}, 12691 }, 12692 12693 { 12694 .vendor = "Micron/Numonyx/ST", 12695 .name = "M25P32", 12696 .bustype = BUS_SPI, 12697 .manufacture_id = ST_ID, 12698 .model_id = ST_M25P32, 12699 .total_size = 4096, 12700 .page_size = 256, 12701 .feature_bits = FEATURE_WRSR_WREN, 12702 .tested = TEST_OK_PREW, 12703 .probe = PROBE_SPI_RDID, 12704 .probe_timing = TIMING_ZERO, 12705 .block_erasers = 12706 { 12707 { 12708 .eraseblocks = { {64 * 1024, 64} }, 12709 .block_erase = SPI_BLOCK_ERASE_D8, 12710 }, { 12711 .eraseblocks = { {4 * 1024 * 1024, 1} }, 12712 .block_erase = SPI_BLOCK_ERASE_C7, 12713 } 12714 }, 12715 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12716 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12717 .write = SPI_CHIP_WRITE256, 12718 .read = SPI_CHIP_READ, 12719 .voltage = {2700, 3600}, 12720 }, 12721 12722 { 12723 .vendor = "Micron/Numonyx/ST", /* Numonyx */ 12724 .name = "M25P40", 12725 .bustype = BUS_SPI, 12726 .manufacture_id = ST_ID, 12727 .model_id = ST_M25P40, 12728 .total_size = 512, 12729 .page_size = 256, 12730 .feature_bits = FEATURE_WRSR_WREN, 12731 .tested = TEST_OK_PREW, 12732 .probe = PROBE_SPI_RDID, 12733 .probe_timing = TIMING_ZERO, 12734 .block_erasers = 12735 { 12736 { 12737 .eraseblocks = { {64 * 1024, 8} }, 12738 .block_erase = SPI_BLOCK_ERASE_D8, 12739 }, { 12740 .eraseblocks = { {512 * 1024, 1} }, 12741 .block_erase = SPI_BLOCK_ERASE_C7, 12742 } 12743 }, 12744 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12745 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12746 .write = SPI_CHIP_WRITE256, 12747 .read = SPI_CHIP_READ, 12748 .voltage = {2700, 3600}, 12749 }, 12750 12751 { 12752 .vendor = "Micron/Numonyx/ST", 12753 .name = "M25P40-old", 12754 .bustype = BUS_SPI, 12755 .manufacture_id = 0, /* Not used. */ 12756 .model_id = ST_M25P40_RES, 12757 .total_size = 512, 12758 .page_size = 256, 12759 .feature_bits = FEATURE_WRSR_WREN, 12760 .tested = TEST_UNTESTED, 12761 .probe = PROBE_SPI_RES1, 12762 .probe_timing = TIMING_ZERO, 12763 .block_erasers = 12764 { 12765 { 12766 .eraseblocks = { {64 * 1024, 8} }, 12767 .block_erase = SPI_BLOCK_ERASE_D8, 12768 }, { 12769 .eraseblocks = { {512 * 1024, 1} }, 12770 .block_erase = SPI_BLOCK_ERASE_C7, 12771 } 12772 }, 12773 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12774 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12775 .write = SPI_CHIP_WRITE256, 12776 .read = SPI_CHIP_READ, 12777 }, 12778 12779 { 12780 .vendor = "Micron/Numonyx/ST", 12781 .name = "M25P64", 12782 .bustype = BUS_SPI, 12783 .manufacture_id = ST_ID, 12784 .model_id = ST_M25P64, 12785 .total_size = 8192, 12786 .page_size = 256, 12787 .feature_bits = FEATURE_WRSR_WREN, 12788 .tested = TEST_OK_PREW, 12789 .probe = PROBE_SPI_RDID, 12790 .probe_timing = TIMING_ZERO, 12791 .block_erasers = 12792 { 12793 { 12794 .eraseblocks = { {64 * 1024, 128} }, 12795 .block_erase = SPI_BLOCK_ERASE_D8, 12796 }, { 12797 .eraseblocks = { {8 * 1024 * 1024, 1} }, 12798 .block_erase = SPI_BLOCK_ERASE_C7, 12799 } 12800 }, 12801 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12802 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12803 .write = SPI_CHIP_WRITE256, 12804 .read = SPI_CHIP_READ, 12805 .voltage = {2700, 3600}, 12806 }, 12807 12808 { 12809 .vendor = "Micron/Numonyx/ST", 12810 .name = "M25P80", 12811 .bustype = BUS_SPI, 12812 .manufacture_id = ST_ID, 12813 .model_id = ST_M25P80, 12814 .total_size = 1024, 12815 .page_size = 256, 12816 .feature_bits = FEATURE_WRSR_WREN, 12817 .tested = TEST_OK_PREW, 12818 .probe = PROBE_SPI_RDID, 12819 .probe_timing = TIMING_ZERO, 12820 .block_erasers = 12821 { 12822 { 12823 .eraseblocks = { {64 * 1024, 16} }, 12824 .block_erase = SPI_BLOCK_ERASE_D8, 12825 }, { 12826 .eraseblocks = { {1024 * 1024, 1} }, 12827 .block_erase = SPI_BLOCK_ERASE_C7, 12828 } 12829 }, 12830 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* TODO: check */ 12831 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 12832 .write = SPI_CHIP_WRITE256, 12833 .read = SPI_CHIP_READ, 12834 .voltage = {2700, 3600}, 12835 }, 12836 12837 { 12838 .vendor = "Micron/Numonyx/ST", 12839 .name = "M25PE10", 12840 .bustype = BUS_SPI, 12841 .manufacture_id = ST_ID, 12842 .model_id = ST_M25PE10, 12843 .total_size = 128, 12844 .page_size = 256, 12845 .feature_bits = FEATURE_WRSR_WREN, 12846 .tested = TEST_UNTESTED, 12847 .probe = PROBE_SPI_RDID, 12848 .probe_timing = TIMING_ZERO, 12849 .block_erasers = 12850 { 12851 { 12852 .eraseblocks = { {4 * 1024, 32} }, 12853 .block_erase = SPI_BLOCK_ERASE_20, 12854 }, { 12855 .eraseblocks = { {64 * 1024, 2} }, 12856 .block_erase = SPI_BLOCK_ERASE_D8, 12857 }, { 12858 .eraseblocks = { {128 * 1024, 1} }, 12859 .block_erase = SPI_BLOCK_ERASE_C7, 12860 } 12861 }, 12862 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 12863 .unlock = SPI_DISABLE_BLOCKPROTECT, 12864 .write = SPI_CHIP_WRITE256, 12865 .read = SPI_CHIP_READ, 12866 .voltage = {2700, 3600}, 12867 }, 12868 12869 { 12870 .vendor = "Micron/Numonyx/ST", 12871 .name = "M25PE16", 12872 .bustype = BUS_SPI, 12873 .manufacture_id = ST_ID, 12874 .model_id = ST_M25PE16, 12875 .total_size = 2048, 12876 .page_size = 256, 12877 .feature_bits = FEATURE_WRSR_WREN, 12878 .tested = TEST_UNTESTED, 12879 .probe = PROBE_SPI_RDID, 12880 .probe_timing = TIMING_ZERO, 12881 .block_erasers = 12882 { 12883 { 12884 .eraseblocks = { {4 * 1024, 512} }, 12885 .block_erase = SPI_BLOCK_ERASE_20, 12886 }, { 12887 .eraseblocks = { {64 * 1024, 32} }, 12888 .block_erase = SPI_BLOCK_ERASE_D8, 12889 }, { 12890 .eraseblocks = { {2 * 1024 * 1024, 1} }, 12891 .block_erase = SPI_BLOCK_ERASE_C7, 12892 } 12893 }, 12894 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 12895 .unlock = SPI_DISABLE_BLOCKPROTECT, 12896 .write = SPI_CHIP_WRITE256, 12897 .read = SPI_CHIP_READ, 12898 .voltage = {2700, 3600}, 12899 }, 12900 12901 { 12902 .vendor = "Micron/Numonyx/ST", 12903 .name = "M25PE20", 12904 .bustype = BUS_SPI, 12905 .manufacture_id = ST_ID, 12906 .model_id = ST_M25PE20, 12907 .total_size = 256, 12908 .page_size = 256, 12909 .feature_bits = FEATURE_WRSR_WREN, 12910 .tested = TEST_UNTESTED, 12911 .probe = PROBE_SPI_RDID, 12912 .probe_timing = TIMING_ZERO, 12913 .block_erasers = 12914 { 12915 { 12916 .eraseblocks = { {4 * 1024, 64} }, 12917 .block_erase = SPI_BLOCK_ERASE_20, 12918 }, { 12919 .eraseblocks = { {64 * 1024, 4} }, 12920 .block_erase = SPI_BLOCK_ERASE_D8, 12921 }, { 12922 .eraseblocks = { {256 * 1024, 1} }, 12923 .block_erase = SPI_BLOCK_ERASE_C7, 12924 } 12925 }, 12926 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 12927 .unlock = SPI_DISABLE_BLOCKPROTECT, 12928 .write = SPI_CHIP_WRITE256, 12929 .read = SPI_CHIP_READ, 12930 .voltage = {2700, 3600}, 12931 }, 12932 12933 { 12934 .vendor = "Micron/Numonyx/ST", 12935 .name = "M25PE40", 12936 .bustype = BUS_SPI, 12937 .manufacture_id = ST_ID, 12938 .model_id = ST_M25PE40, 12939 .total_size = 512, 12940 .page_size = 256, 12941 .feature_bits = FEATURE_WRSR_WREN, 12942 .tested = TEST_OK_PREW, 12943 .probe = PROBE_SPI_RDID, 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 = { {64 * 1024, 8} }, 12952 .block_erase = SPI_BLOCK_ERASE_D8, 12953 }, { 12954 .eraseblocks = { {512 * 1024, 1} }, 12955 .block_erase = SPI_BLOCK_ERASE_C7, 12956 } 12957 }, 12958 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 12959 .unlock = SPI_DISABLE_BLOCKPROTECT, 12960 .write = SPI_CHIP_WRITE256, 12961 .read = SPI_CHIP_READ, 12962 .voltage = {2700, 3600}, 12963 }, 12964 12965 { 12966 .vendor = "Micron/Numonyx/ST", 12967 .name = "M25PE80", 12968 .bustype = BUS_SPI, 12969 .manufacture_id = ST_ID, 12970 .model_id = ST_M25PE80, 12971 .total_size = 1024, 12972 .page_size = 256, 12973 .feature_bits = FEATURE_WRSR_WREN, 12974 .tested = TEST_OK_PREW, 12975 .probe = PROBE_SPI_RDID, 12976 .probe_timing = TIMING_ZERO, 12977 .block_erasers = 12978 { 12979 { 12980 .eraseblocks = { {4 * 1024, 256} }, 12981 .block_erase = SPI_BLOCK_ERASE_20, 12982 }, { 12983 .eraseblocks = { {64 * 1024, 16} }, 12984 .block_erase = SPI_BLOCK_ERASE_D8, 12985 }, { 12986 .eraseblocks = { {1024 * 1024, 1} }, 12987 .block_erase = SPI_BLOCK_ERASE_C7, 12988 } 12989 }, 12990 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 12991 .unlock = SPI_DISABLE_BLOCKPROTECT, 12992 .write = SPI_CHIP_WRITE256, 12993 .read = SPI_CHIP_READ, 12994 .voltage = {2700, 3600}, 12995 }, 12996 12997 { 12998 .vendor = "Micron/Numonyx/ST", 12999 .name = "M25PX16", 13000 .bustype = BUS_SPI, 13001 .manufacture_id = ST_ID, 13002 .model_id = ST_M25PX16, 13003 .total_size = 2048, 13004 .page_size = 256, 13005 /* OTP: 64B total; read 0x4B; write 0x42 */ 13006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13007 .tested = TEST_OK_PREW, 13008 .probe = PROBE_SPI_RDID, 13009 .probe_timing = TIMING_ZERO, 13010 .block_erasers = 13011 { 13012 { 13013 .eraseblocks = { { 4 * 1024, 512 } }, 13014 .block_erase = SPI_BLOCK_ERASE_20, 13015 }, { 13016 .eraseblocks = { {64 * 1024, 32} }, 13017 .block_erase = SPI_BLOCK_ERASE_D8, 13018 }, { 13019 .eraseblocks = { {2 * 1024 * 1024, 1} }, 13020 .block_erase = SPI_BLOCK_ERASE_C7, 13021 } 13022 }, 13023 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit5: T/B */ 13024 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: per 64kB sector lock registers */ 13025 .write = SPI_CHIP_WRITE256, 13026 .read = SPI_CHIP_READ, 13027 .voltage = {2300, 3600}, 13028 }, 13029 13030 { 13031 .vendor = "Micron/Numonyx/ST", 13032 .name = "M25PX32", 13033 .bustype = BUS_SPI, 13034 .manufacture_id = ST_ID, 13035 .model_id = ST_M25PX32, 13036 .total_size = 4096, 13037 .page_size = 256, 13038 /* OTP: 64B total; read 0x4B; write 0x42 */ 13039 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13040 .tested = TEST_OK_PRE, 13041 .probe = PROBE_SPI_RDID, 13042 .probe_timing = TIMING_ZERO, 13043 .block_erasers = 13044 { 13045 { 13046 .eraseblocks = { { 4 * 1024, 1024 } }, 13047 .block_erase = SPI_BLOCK_ERASE_20, 13048 }, { 13049 .eraseblocks = { {64 * 1024, 64} }, 13050 .block_erase = SPI_BLOCK_ERASE_D8, 13051 }, { 13052 .eraseblocks = { {4 * 1024 * 1024, 1} }, 13053 .block_erase = SPI_BLOCK_ERASE_C7, 13054 } 13055 }, 13056 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit5: T/B */ 13057 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: per 64kB sector lock registers */ 13058 .write = SPI_CHIP_WRITE256, 13059 .read = SPI_CHIP_READ, 13060 .voltage = {2700, 3600}, 13061 }, 13062 13063 { 13064 .vendor = "Micron/Numonyx/ST", 13065 .name = "M25PX64", 13066 .bustype = BUS_SPI, 13067 .manufacture_id = ST_ID, 13068 .model_id = ST_M25PX64, 13069 .total_size = 8192, 13070 .page_size = 256, 13071 /* OTP: 64B total; read 0x4B; write 0x42 */ 13072 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13073 .tested = TEST_OK_PREW, 13074 .probe = PROBE_SPI_RDID, 13075 .probe_timing = TIMING_ZERO, 13076 .block_erasers = 13077 { 13078 { 13079 .eraseblocks = { { 4 * 1024, 2048 } }, 13080 .block_erase = SPI_BLOCK_ERASE_20, 13081 }, { 13082 .eraseblocks = { {64 * 1024, 128} }, 13083 .block_erase = SPI_BLOCK_ERASE_D8, 13084 }, { 13085 .eraseblocks = { {8 * 1024 * 1024, 1} }, 13086 .block_erase = SPI_BLOCK_ERASE_C7, 13087 } 13088 }, 13089 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit5: T/B */ 13090 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: per 64kB sector lock registers */ 13091 .write = SPI_CHIP_WRITE256, 13092 .read = SPI_CHIP_READ, 13093 .voltage = {2700, 3600}, 13094 }, 13095 13096 { 13097 .vendor = "Micron/Numonyx/ST", 13098 .name = "M25PX80", 13099 .bustype = BUS_SPI, 13100 .manufacture_id = ST_ID, 13101 .model_id = ST_M25PX80, 13102 .total_size = 1024, 13103 .page_size = 256, 13104 /* OTP: 64B total; read 0x4B, write 0x42 */ 13105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13106 .tested = TEST_OK_PREW, 13107 .probe = PROBE_SPI_RDID, 13108 .probe_timing = TIMING_ZERO, 13109 .block_erasers = 13110 { 13111 { 13112 .eraseblocks = { { 4 * 1024, 256 } }, 13113 .block_erase = SPI_BLOCK_ERASE_20, 13114 }, { 13115 .eraseblocks = { {64 * 1024, 16} }, 13116 .block_erase = SPI_BLOCK_ERASE_D8, 13117 }, { 13118 .eraseblocks = { {1024 * 1024, 1} }, 13119 .block_erase = SPI_BLOCK_ERASE_C7, 13120 } 13121 }, 13122 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* bit5: T/B */ 13123 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: per 64kB sector lock registers */ 13124 .write = SPI_CHIP_WRITE256, 13125 .read = SPI_CHIP_READ, 13126 .voltage = {2700, 3600}, 13127 }, 13128 13129 { 13130 .vendor = "Micron/Numonyx/ST", 13131 .name = "M45PE10", 13132 .bustype = BUS_SPI, 13133 .manufacture_id = ST_ID, 13134 .model_id = ST_M45PE10, 13135 .total_size = 128, 13136 .page_size = 256, 13137 .tested = TEST_UNTESTED, 13138 .probe = PROBE_SPI_RDID, 13139 .probe_timing = TIMING_ZERO, 13140 .block_erasers = 13141 { 13142 { 13143 .eraseblocks = { {256, 512} }, 13144 .block_erase = SPI_BLOCK_ERASE_DB, 13145 }, { 13146 .eraseblocks = { {64 * 1024, 2} }, 13147 .block_erase = SPI_BLOCK_ERASE_D8, 13148 } 13149 }, 13150 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 13151 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 13152 .write = SPI_CHIP_WRITE256, /* Page write (similar to PP but allows 0->1 changes) */ 13153 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 13154 .voltage = {2700, 3600}, 13155 }, 13156 13157 { 13158 .vendor = "Micron/Numonyx/ST", 13159 .name = "M45PE16", 13160 .bustype = BUS_SPI, 13161 .manufacture_id = ST_ID, 13162 .model_id = ST_M45PE16, 13163 .total_size = 2048, 13164 .page_size = 256, 13165 .tested = TEST_UNTESTED, 13166 .probe = PROBE_SPI_RDID, 13167 .probe_timing = TIMING_ZERO, 13168 .block_erasers = 13169 { 13170 { 13171 .eraseblocks = { {256, 8192} }, 13172 .block_erase = SPI_BLOCK_ERASE_DB, 13173 }, { 13174 .eraseblocks = { {64 * 1024, 32} }, 13175 .block_erase = SPI_BLOCK_ERASE_D8, 13176 } 13177 }, 13178 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 13179 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 13180 .write = SPI_CHIP_WRITE256, /* Page write (similar to PP but allows 0->1 changes) */ 13181 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 13182 .voltage = {2700, 3600}, 13183 }, 13184 13185 { 13186 .vendor = "Micron/Numonyx/ST", 13187 .name = "M45PE20", 13188 .bustype = BUS_SPI, 13189 .manufacture_id = ST_ID, 13190 .model_id = ST_M45PE20, 13191 .total_size = 256, 13192 .page_size = 256, 13193 .tested = TEST_UNTESTED, 13194 .probe = PROBE_SPI_RDID, 13195 .probe_timing = TIMING_ZERO, 13196 .block_erasers = 13197 { 13198 { 13199 .eraseblocks = { {256, 1024} }, 13200 .block_erase = SPI_BLOCK_ERASE_DB, 13201 }, { 13202 .eraseblocks = { {64 * 1024, 4} }, 13203 .block_erase = SPI_BLOCK_ERASE_D8, 13204 } 13205 }, 13206 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 13207 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 13208 .write = SPI_CHIP_WRITE256, /* Page write (similar to PP but allows 0->1 changes) */ 13209 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 13210 .voltage = {2700, 3600}, 13211 }, 13212 13213 { 13214 .vendor = "Micron/Numonyx/ST", 13215 .name = "M45PE40", 13216 .bustype = BUS_SPI, 13217 .manufacture_id = ST_ID, 13218 .model_id = ST_M45PE40, 13219 .total_size = 512, 13220 .page_size = 256, 13221 .tested = TEST_UNTESTED, 13222 .probe = PROBE_SPI_RDID, 13223 .probe_timing = TIMING_ZERO, 13224 .block_erasers = 13225 { 13226 { 13227 .eraseblocks = { {256, 2048} }, 13228 .block_erase = SPI_BLOCK_ERASE_DB, 13229 }, { 13230 .eraseblocks = { {64 * 1024, 8} }, 13231 .block_erase = SPI_BLOCK_ERASE_D8, 13232 } 13233 }, 13234 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 13235 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 13236 .write = SPI_CHIP_WRITE256, /* Page write supported (similar to PP but allows 0->1 changes) */ 13237 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 13238 .voltage = {2700, 3600}, 13239 }, 13240 13241 { 13242 .vendor = "Micron/Numonyx/ST", 13243 .name = "M45PE80", 13244 .bustype = BUS_SPI, 13245 .manufacture_id = ST_ID, 13246 .model_id = ST_M45PE80, 13247 .total_size = 1024, 13248 .page_size = 256, 13249 .tested = TEST_UNTESTED, 13250 .probe = PROBE_SPI_RDID, 13251 .probe_timing = TIMING_ZERO, 13252 .block_erasers = 13253 { 13254 { 13255 .eraseblocks = { {256, 4096} }, 13256 .block_erase = SPI_BLOCK_ERASE_DB, 13257 }, { 13258 .eraseblocks = { {64 * 1024, 16} }, 13259 .block_erase = SPI_BLOCK_ERASE_D8, 13260 } 13261 }, 13262 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 13263 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 13264 .write = SPI_CHIP_WRITE256, /* Page write (similar to PP but allows 0->1 changes) */ 13265 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 13266 .voltage = {2700, 3600}, 13267 }, 13268 13269 { 13270 .vendor = "Micron/Numonyx/ST", 13271 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */ 13272 .bustype = BUS_SPI, 13273 .manufacture_id = ST_ID, 13274 .model_id = ST_N25Q00A__1G, 13275 .total_size = 131072, 13276 .page_size = 256, 13277 /* supports SFDP */ 13278 /* OTP: 64B total; read 0x4B, write 0x42 */ 13279 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13280 .tested = TEST_UNTESTED, 13281 .probe = PROBE_SPI_RDID, 13282 .probe_timing = TIMING_ZERO, 13283 .block_erasers = 13284 { 13285 { 13286 .eraseblocks = { {4 * 1024, 32768} }, 13287 .block_erase = SPI_BLOCK_ERASE_21, 13288 }, { 13289 .eraseblocks = { {4 * 1024, 32768} }, 13290 .block_erase = SPI_BLOCK_ERASE_20, 13291 }, { 13292 .eraseblocks = { {64 * 1024, 2048} }, 13293 .block_erase = SPI_BLOCK_ERASE_DC, 13294 }, { 13295 .eraseblocks = { {64 * 1024, 2048} }, 13296 .block_erase = SPI_BLOCK_ERASE_D8, 13297 }, { 13298 .eraseblocks = { {32768 * 1024, 4} }, 13299 .block_erase = SPI_BLOCK_ERASE_C4, 13300 } 13301 }, 13302 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13303 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13304 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13305 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13306 .voltage = {1700, 2000}, 13307 }, 13308 13309 { 13310 .vendor = "Micron/Numonyx/ST", 13311 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ 13312 .bustype = BUS_SPI, 13313 .manufacture_id = ST_ID, 13314 .model_id = ST_N25Q00A__3G, 13315 .total_size = 131072, 13316 .page_size = 256, 13317 /* supports SFDP */ 13318 /* OTP: 64B total; read 0x4B, write 0x42 */ 13319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13320 .tested = TEST_UNTESTED, 13321 .probe = PROBE_SPI_RDID, 13322 .probe_timing = TIMING_ZERO, 13323 .block_erasers = 13324 { 13325 { 13326 .eraseblocks = { {4 * 1024, 32768} }, 13327 .block_erase = SPI_BLOCK_ERASE_21, 13328 }, { 13329 .eraseblocks = { {4 * 1024, 32768} }, 13330 .block_erase = SPI_BLOCK_ERASE_20, 13331 }, { 13332 .eraseblocks = { {64 * 1024, 2048} }, 13333 .block_erase = SPI_BLOCK_ERASE_DC, 13334 }, { 13335 .eraseblocks = { {64 * 1024, 2048} }, 13336 .block_erase = SPI_BLOCK_ERASE_D8, 13337 }, { 13338 .eraseblocks = { {32768 * 1024, 4} }, 13339 .block_erase = SPI_BLOCK_ERASE_C4, 13340 } 13341 }, 13342 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13343 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13344 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13345 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13346 .voltage = {2700, 3600}, 13347 }, 13348 13349 { 13350 .vendor = "Micron/Numonyx/ST", 13351 .name = "N25Q016", 13352 .bustype = BUS_SPI, 13353 .manufacture_id = ST_ID, 13354 .model_id = ST_N25Q016__1E, 13355 .total_size = 2048, 13356 .page_size = 256, 13357 /* supports SFDP */ 13358 /* OTP: 64B total; read 0x4B, write 0x42 */ 13359 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13360 .tested = TEST_UNTESTED, 13361 .probe = PROBE_SPI_RDID, 13362 .probe_timing = TIMING_ZERO, 13363 .block_erasers = 13364 { 13365 { 13366 .eraseblocks = { {4 * 1024, 512} }, 13367 .block_erase = SPI_BLOCK_ERASE_20, 13368 }, { 13369 .eraseblocks = { {32 * 1024, 64} }, 13370 .block_erase = SPI_BLOCK_ERASE_52, 13371 }, { 13372 .eraseblocks = { {64 * 1024, 32} }, 13373 .block_erase = SPI_BLOCK_ERASE_D8, 13374 }, { 13375 .eraseblocks = { {2 * 1024 * 1024, 1} }, 13376 .block_erase = SPI_BLOCK_ERASE_C7, 13377 } 13378 }, 13379 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13380 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13381 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13382 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13383 .voltage = {1700, 2000}, 13384 }, 13385 13386 { 13387 .vendor = "Micron/Numonyx/ST", 13388 .name = "N25Q032..1E", 13389 .bustype = BUS_SPI, 13390 .manufacture_id = ST_ID, 13391 .model_id = ST_N25Q032__1E, 13392 .total_size = 4096, 13393 .page_size = 256, 13394 /* supports SFDP */ 13395 /* OTP: 64B total; read 0x4B, write 0x42 */ 13396 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13397 .tested = TEST_UNTESTED, 13398 .probe = PROBE_SPI_RDID, 13399 .probe_timing = TIMING_ZERO, 13400 .block_erasers = 13401 { 13402 { 13403 .eraseblocks = { {4 * 1024, 1024} }, 13404 .block_erase = SPI_BLOCK_ERASE_20, 13405 }, { 13406 .eraseblocks = { {64 * 1024, 64} }, 13407 .block_erase = SPI_BLOCK_ERASE_D8, 13408 }, { 13409 .eraseblocks = { {4 * 1024 * 1024, 1} }, 13410 .block_erase = SPI_BLOCK_ERASE_C7, 13411 } 13412 }, 13413 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13414 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13415 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13416 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13417 .voltage = {1700, 2000}, 13418 .reg_bits = 13419 { 13420 /* 13421 * There is also a volatile lock register per 64KiB sector, which is not 13422 * mutually exclusive with BP-based protection. 13423 */ 13424 .srp = {STATUS1, 7, RW}, 13425 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 13426 .tb = {STATUS1, 5, RW}, 13427 }, 13428 .decode_range = DECODE_RANGE_SPI25, 13429 }, 13430 13431 { 13432 .vendor = "Micron/Numonyx/ST", 13433 .name = "N25Q032..3E", 13434 .bustype = BUS_SPI, 13435 .manufacture_id = ST_ID, 13436 .model_id = ST_N25Q032__3E, 13437 .total_size = 4096, 13438 .page_size = 256, 13439 /* supports SFDP */ 13440 /* OTP: 64B total; read 0x4B, write 0x42 */ 13441 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13442 .tested = TEST_OK_PREW, 13443 .probe = PROBE_SPI_RDID, 13444 .probe_timing = TIMING_ZERO, 13445 .block_erasers = 13446 { 13447 { 13448 .eraseblocks = { {4 * 1024, 1024} }, 13449 .block_erase = SPI_BLOCK_ERASE_20, 13450 }, { 13451 .eraseblocks = { {64 * 1024, 64} }, 13452 .block_erase = SPI_BLOCK_ERASE_D8, 13453 }, { 13454 .eraseblocks = { {4 * 1024 * 1024, 1} }, 13455 .block_erase = SPI_BLOCK_ERASE_C7, 13456 } 13457 }, 13458 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13459 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13460 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13461 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13462 .voltage = {2700, 3600}, 13463 .reg_bits = 13464 { 13465 /* 13466 * There is also a volatile lock register per 64KiB sector, which is not 13467 * mutually exclusive with BP-based protection. 13468 */ 13469 .srp = {STATUS1, 7, RW}, 13470 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 13471 .tb = {STATUS1, 5, RW}, 13472 }, 13473 .decode_range = DECODE_RANGE_SPI25, 13474 }, 13475 13476 { 13477 .vendor = "Micron/Numonyx/ST", 13478 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 13479 .bustype = BUS_SPI, 13480 .manufacture_id = ST_ID, 13481 .model_id = ST_N25Q064__1E, 13482 .total_size = 8192, 13483 .page_size = 256, 13484 /* supports SFDP */ 13485 /* OTP: 64B total; read 0x4B, write 0x42 */ 13486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13487 .tested = TEST_OK_PREW, 13488 .probe = PROBE_SPI_RDID, 13489 .probe_timing = TIMING_ZERO, 13490 .block_erasers = 13491 { 13492 { 13493 .eraseblocks = { {4 * 1024, 2048 } }, 13494 .block_erase = SPI_BLOCK_ERASE_20, 13495 }, { 13496 .eraseblocks = { {64 * 1024, 128} }, 13497 .block_erase = SPI_BLOCK_ERASE_D8, 13498 }, { 13499 .eraseblocks = { {8 * 1024 * 1024, 1} }, 13500 .block_erase = SPI_BLOCK_ERASE_C7, 13501 } 13502 }, 13503 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13504 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13505 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13506 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13507 .voltage = {1700, 2000}, 13508 .reg_bits = 13509 { 13510 /* 13511 * There is also a volatile lock register per 64KiB sector, which is not 13512 * mutually exclusive with BP-based protection. 13513 */ 13514 .srp = {STATUS1, 7, RW}, 13515 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}}, 13516 .tb = {STATUS1, 5, RW}, 13517 }, 13518 .decode_range = DECODE_RANGE_SPI25, 13519 }, 13520 13521 { 13522 .vendor = "Micron/Numonyx/ST", 13523 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 13524 .bustype = BUS_SPI, 13525 .manufacture_id = ST_ID, 13526 .model_id = ST_N25Q064__3E, 13527 .total_size = 8192, 13528 .page_size = 256, 13529 /* supports SFDP */ 13530 /* OTP: 64B total; read 0x4B, write 0x42 */ 13531 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13532 .tested = TEST_OK_PREW, 13533 .probe = PROBE_SPI_RDID, 13534 .probe_timing = TIMING_ZERO, 13535 .block_erasers = 13536 { 13537 { 13538 .eraseblocks = { {4 * 1024, 2048 } }, 13539 .block_erase = SPI_BLOCK_ERASE_20, 13540 }, { 13541 .eraseblocks = { {64 * 1024, 128} }, 13542 .block_erase = SPI_BLOCK_ERASE_D8, 13543 }, { 13544 .eraseblocks = { {8 * 1024 * 1024, 1} }, 13545 .block_erase = SPI_BLOCK_ERASE_C7, 13546 } 13547 }, 13548 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13549 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13550 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13551 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13552 .voltage = {2700, 3600}, 13553 .reg_bits = 13554 { 13555 /* 13556 * There is also a volatile lock register per 64KiB sector, which is not 13557 * mutually exclusive with BP-based protection. 13558 */ 13559 .srp = {STATUS1, 7, RW}, 13560 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}}, 13561 .tb = {STATUS1, 5, RW}, 13562 }, 13563 .decode_range = DECODE_RANGE_SPI25, 13564 }, 13565 13566 { 13567 .vendor = "Micron/Numonyx/ST", 13568 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 13569 .bustype = BUS_SPI, 13570 .manufacture_id = ST_ID, 13571 .model_id = ST_N25Q128__1E, 13572 .total_size = 16384, 13573 .page_size = 256, 13574 /* supports SFDP */ 13575 /* OTP: 64B total; read 0x4B, write 0x42 */ 13576 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13577 .tested = TEST_OK_PREW, 13578 .probe = PROBE_SPI_RDID, 13579 .probe_timing = TIMING_ZERO, 13580 .block_erasers = 13581 { 13582 { 13583 .eraseblocks = { {4 * 1024, 4096 } }, 13584 .block_erase = SPI_BLOCK_ERASE_20, 13585 }, { 13586 .eraseblocks = { {64 * 1024, 256} }, 13587 .block_erase = SPI_BLOCK_ERASE_D8, 13588 }, { 13589 .eraseblocks = { {16384 * 1024, 1} }, 13590 .block_erase = SPI_BLOCK_ERASE_C7, 13591 } 13592 }, 13593 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13594 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13595 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13596 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13597 .voltage = {1700, 2000}, 13598 }, 13599 13600 { 13601 .vendor = "Micron/Numonyx/ST", 13602 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 13603 .bustype = BUS_SPI, 13604 .manufacture_id = ST_ID, 13605 .model_id = ST_N25Q128__3E, 13606 .total_size = 16384, 13607 .page_size = 256, 13608 /* supports SFDP */ 13609 /* OTP: 64B total; read 0x4B, write 0x42 */ 13610 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 13611 .tested = TEST_OK_PREW, 13612 .probe = PROBE_SPI_RDID, 13613 .probe_timing = TIMING_ZERO, 13614 .block_erasers = 13615 { 13616 { 13617 .eraseblocks = { {4 * 1024, 4096 } }, 13618 .block_erase = SPI_BLOCK_ERASE_20, 13619 }, { 13620 .eraseblocks = { {64 * 1024, 256} }, 13621 .block_erase = SPI_BLOCK_ERASE_D8, 13622 }, { 13623 .eraseblocks = { {16384 * 1024, 1} }, 13624 .block_erase = SPI_BLOCK_ERASE_C7, 13625 } 13626 }, 13627 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13628 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13629 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13630 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13631 .voltage = {2700, 3600}, 13632 }, 13633 13634 { 13635 .vendor = "Micron/Numonyx/ST", 13636 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */ 13637 .bustype = BUS_SPI, 13638 .manufacture_id = ST_ID, 13639 .model_id = ST_N25Q256__1E, 13640 .total_size = 32768, 13641 .page_size = 256, 13642 /* supports SFDP */ 13643 /* OTP: 64B total; read 0x4B, write 0x42 */ 13644 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13645 .tested = TEST_UNTESTED, 13646 .probe = PROBE_SPI_RDID, 13647 .probe_timing = TIMING_ZERO, 13648 .block_erasers = 13649 { 13650 { 13651 .eraseblocks = { {4 * 1024, 8192} }, 13652 .block_erase = SPI_BLOCK_ERASE_21, 13653 }, { 13654 .eraseblocks = { {4 * 1024, 8192} }, 13655 .block_erase = SPI_BLOCK_ERASE_20, 13656 }, { 13657 .eraseblocks = { {64 * 1024, 512} }, 13658 .block_erase = SPI_BLOCK_ERASE_DC, 13659 }, { 13660 .eraseblocks = { {64 * 1024, 512} }, 13661 .block_erase = SPI_BLOCK_ERASE_D8, 13662 }, { 13663 .eraseblocks = { {32768 * 1024, 1} }, 13664 .block_erase = SPI_BLOCK_ERASE_C7, 13665 } 13666 }, 13667 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13668 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13669 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13670 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13671 .voltage = {1700, 2000}, 13672 }, 13673 13674 { 13675 .vendor = "Micron/Numonyx/ST", 13676 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */ 13677 .bustype = BUS_SPI, 13678 .manufacture_id = ST_ID, 13679 .model_id = ST_N25Q256__3E, 13680 .total_size = 32768, 13681 .page_size = 256, 13682 /* supports SFDP */ 13683 /* OTP: 64B total; read 0x4B, write 0x42 */ 13684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13685 .tested = TEST_UNTESTED, 13686 .probe = PROBE_SPI_RDID, 13687 .probe_timing = TIMING_ZERO, 13688 .block_erasers = 13689 { 13690 { 13691 .eraseblocks = { {4 * 1024, 8192} }, 13692 .block_erase = SPI_BLOCK_ERASE_21, 13693 }, { 13694 .eraseblocks = { {4 * 1024, 8192} }, 13695 .block_erase = SPI_BLOCK_ERASE_20, 13696 }, { 13697 .eraseblocks = { {64 * 1024, 512} }, 13698 .block_erase = SPI_BLOCK_ERASE_DC, 13699 }, { 13700 .eraseblocks = { {64 * 1024, 512} }, 13701 .block_erase = SPI_BLOCK_ERASE_D8, 13702 }, { 13703 .eraseblocks = { {32768 * 1024, 1} }, 13704 .block_erase = SPI_BLOCK_ERASE_C7, 13705 } 13706 }, 13707 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13708 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13709 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13710 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13711 .voltage = {2700, 3600}, 13712 }, 13713 13714 { 13715 .vendor = "Micron/Numonyx/ST", 13716 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */ 13717 .bustype = BUS_SPI, 13718 .manufacture_id = ST_ID, 13719 .model_id = ST_N25Q512__1G, 13720 .total_size = 65536, 13721 .page_size = 256, 13722 /* supports SFDP */ 13723 /* OTP: 64B total; read 0x4B, write 0x42 */ 13724 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13725 .tested = TEST_UNTESTED, 13726 .probe = PROBE_SPI_RDID, 13727 .probe_timing = TIMING_ZERO, 13728 .block_erasers = 13729 { 13730 { 13731 .eraseblocks = { {4 * 1024, 16384} }, 13732 .block_erase = SPI_BLOCK_ERASE_21, 13733 }, { 13734 .eraseblocks = { {4 * 1024, 16384} }, 13735 .block_erase = SPI_BLOCK_ERASE_20, 13736 }, { 13737 .eraseblocks = { {64 * 1024, 1024} }, 13738 .block_erase = SPI_BLOCK_ERASE_DC, 13739 }, { 13740 .eraseblocks = { {64 * 1024, 1024} }, 13741 .block_erase = SPI_BLOCK_ERASE_D8, 13742 }, { 13743 .eraseblocks = { {32768 * 1024, 2} }, 13744 .block_erase = SPI_BLOCK_ERASE_C4, 13745 } 13746 }, 13747 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13748 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13749 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13750 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13751 .voltage = {1700, 2000}, 13752 }, 13753 13754 { 13755 .vendor = "Micron/Numonyx/ST", 13756 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */ 13757 .bustype = BUS_SPI, 13758 .manufacture_id = ST_ID, 13759 .model_id = ST_N25Q512__3G, 13760 .total_size = 65536, 13761 .page_size = 256, 13762 /* supports SFDP */ 13763 /* OTP: 64B total; read 0x4B, write 0x42 */ 13764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13765 .tested = TEST_OK_PREW, 13766 .probe = PROBE_SPI_RDID, 13767 .probe_timing = TIMING_ZERO, 13768 .block_erasers = 13769 { 13770 { 13771 .eraseblocks = { {4 * 1024, 16384} }, 13772 .block_erase = SPI_BLOCK_ERASE_21, 13773 }, { 13774 .eraseblocks = { {4 * 1024, 16384} }, 13775 .block_erase = SPI_BLOCK_ERASE_20, 13776 }, { 13777 .eraseblocks = { {64 * 1024, 1024} }, 13778 .block_erase = SPI_BLOCK_ERASE_DC, 13779 }, { 13780 .eraseblocks = { {64 * 1024, 1024} }, 13781 .block_erase = SPI_BLOCK_ERASE_D8, 13782 }, { 13783 .eraseblocks = { {32768 * 1024, 2} }, 13784 .block_erase = SPI_BLOCK_ERASE_C4, 13785 } 13786 }, 13787 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13788 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13789 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13790 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13791 .voltage = {2700, 3600}, 13792 }, 13793 13794 { 13795 .vendor = "Micron", 13796 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 13797 .bustype = BUS_SPI, 13798 .manufacture_id = ST_ID, 13799 .model_id = ST_N25Q00A__3G, 13800 .total_size = 131072, 13801 .page_size = 256, 13802 /* supports SFDP */ 13803 /* OTP: 64B total; read 0x4B, write 0x42 */ 13804 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13805 .tested = TEST_OK_PREW, 13806 .probe = PROBE_SPI_RDID, 13807 .probe_timing = TIMING_ZERO, 13808 .block_erasers = 13809 { 13810 { 13811 .eraseblocks = { {4 * 1024, 32768} }, 13812 .block_erase = SPI_BLOCK_ERASE_21, 13813 }, { 13814 .eraseblocks = { {4 * 1024, 32768} }, 13815 .block_erase = SPI_BLOCK_ERASE_20, 13816 }, { 13817 .eraseblocks = { {32 * 1024, 4096} }, 13818 .block_erase = SPI_BLOCK_ERASE_5C, 13819 }, { 13820 .eraseblocks = { {32 * 1024, 4096} }, 13821 .block_erase = SPI_BLOCK_ERASE_52, 13822 }, { 13823 .eraseblocks = { {64 * 1024, 2048} }, 13824 .block_erase = SPI_BLOCK_ERASE_DC, 13825 }, { 13826 .eraseblocks = { {64 * 1024, 2048} }, 13827 .block_erase = SPI_BLOCK_ERASE_D8, 13828 }, { 13829 .eraseblocks = { {65536 * 1024, 2} }, 13830 .block_erase = SPI_BLOCK_ERASE_C4, 13831 } 13832 }, 13833 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13834 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13835 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13836 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13837 .voltage = {2700, 3600}, 13838 }, 13839 13840 { 13841 .vendor = "Micron", 13842 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 13843 .bustype = BUS_SPI, 13844 .manufacture_id = ST_ID, 13845 .model_id = ST_N25Q00A__1G, 13846 .total_size = 131072, 13847 .page_size = 256, 13848 /* supports SFDP */ 13849 /* OTP: 64B total; read 0x4B, write 0x42 */ 13850 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13851 .tested = TEST_UNTESTED, 13852 .probe = PROBE_SPI_RDID, 13853 .probe_timing = TIMING_ZERO, 13854 .block_erasers = 13855 { 13856 { 13857 .eraseblocks = { {4 * 1024, 32768} }, 13858 .block_erase = SPI_BLOCK_ERASE_21, 13859 }, { 13860 .eraseblocks = { {4 * 1024, 32768} }, 13861 .block_erase = SPI_BLOCK_ERASE_20, 13862 }, { 13863 .eraseblocks = { {32 * 1024, 4096} }, 13864 .block_erase = SPI_BLOCK_ERASE_5C, 13865 }, { 13866 .eraseblocks = { {32 * 1024, 4096} }, 13867 .block_erase = SPI_BLOCK_ERASE_52, 13868 }, { 13869 .eraseblocks = { {64 * 1024, 2048} }, 13870 .block_erase = SPI_BLOCK_ERASE_DC, 13871 }, { 13872 .eraseblocks = { {64 * 1024, 2048} }, 13873 .block_erase = SPI_BLOCK_ERASE_D8, 13874 }, { 13875 .eraseblocks = { {65536 * 1024, 2} }, 13876 .block_erase = SPI_BLOCK_ERASE_C4, 13877 } 13878 }, 13879 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13880 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13881 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13882 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13883 .voltage = {1700, 2000}, 13884 }, 13885 13886 { 13887 .vendor = "Micron", 13888 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 13889 .bustype = BUS_SPI, 13890 .manufacture_id = ST_ID, 13891 .model_id = ST_MT25QL02G, 13892 .total_size = 262144, 13893 .page_size = 256, 13894 /* supports SFDP */ 13895 /* OTP: 64B total; read 0x4B, write 0x42 */ 13896 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13897 .tested = TEST_UNTESTED, 13898 .probe = PROBE_SPI_RDID, 13899 .probe_timing = TIMING_ZERO, 13900 .block_erasers = 13901 { 13902 { 13903 .eraseblocks = { {4 * 1024, 65536} }, 13904 .block_erase = SPI_BLOCK_ERASE_21, 13905 }, { 13906 .eraseblocks = { {4 * 1024, 65536} }, 13907 .block_erase = SPI_BLOCK_ERASE_20, 13908 }, { 13909 .eraseblocks = { {32 * 1024, 8192} }, 13910 .block_erase = SPI_BLOCK_ERASE_5C, 13911 }, { 13912 .eraseblocks = { {32 * 1024, 8192} }, 13913 .block_erase = SPI_BLOCK_ERASE_52, 13914 }, { 13915 .eraseblocks = { {64 * 1024, 4096} }, 13916 .block_erase = SPI_BLOCK_ERASE_DC, 13917 }, { 13918 .eraseblocks = { {64 * 1024, 4096} }, 13919 .block_erase = SPI_BLOCK_ERASE_D8, 13920 }, { 13921 .eraseblocks = { {65536 * 1024, 4} }, 13922 .block_erase = SPI_BLOCK_ERASE_C4, 13923 } 13924 }, 13925 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13926 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13927 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13928 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13929 .voltage = {2700, 3600}, 13930 }, 13931 13932 { 13933 .vendor = "Micron", 13934 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 13935 .bustype = BUS_SPI, 13936 .manufacture_id = ST_ID, 13937 .model_id = ST_MT25QU02G, 13938 .total_size = 262144, 13939 .page_size = 256, 13940 /* supports SFDP */ 13941 /* OTP: 64B total; read 0x4B, write 0x42 */ 13942 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13943 .tested = TEST_UNTESTED, 13944 .probe = PROBE_SPI_RDID, 13945 .probe_timing = TIMING_ZERO, 13946 .block_erasers = 13947 { 13948 { 13949 .eraseblocks = { {4 * 1024, 65536} }, 13950 .block_erase = SPI_BLOCK_ERASE_21, 13951 }, { 13952 .eraseblocks = { {4 * 1024, 65536} }, 13953 .block_erase = SPI_BLOCK_ERASE_20, 13954 }, { 13955 .eraseblocks = { {32 * 1024, 8192} }, 13956 .block_erase = SPI_BLOCK_ERASE_5C, 13957 }, { 13958 .eraseblocks = { {32 * 1024, 8192} }, 13959 .block_erase = SPI_BLOCK_ERASE_52, 13960 }, { 13961 .eraseblocks = { {64 * 1024, 4096} }, 13962 .block_erase = SPI_BLOCK_ERASE_DC, 13963 }, { 13964 .eraseblocks = { {64 * 1024, 4096} }, 13965 .block_erase = SPI_BLOCK_ERASE_D8, 13966 }, { 13967 .eraseblocks = { {65536 * 1024, 4} }, 13968 .block_erase = SPI_BLOCK_ERASE_C4, 13969 } 13970 }, 13971 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 13972 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 13973 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 13974 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 13975 .voltage = {1700, 2000}, 13976 }, 13977 13978 { 13979 .vendor = "Micron", 13980 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 13981 .bustype = BUS_SPI, 13982 .manufacture_id = ST_ID, 13983 .model_id = ST_N25Q128__1E, 13984 .total_size = 16384, 13985 .page_size = 256, 13986 /* supports SFDP */ 13987 /* OTP: 64B total; read 0x4B, write 0x42 */ 13988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 13989 .tested = TEST_UNTESTED, 13990 .probe = PROBE_SPI_RDID, 13991 .probe_timing = TIMING_ZERO, 13992 .block_erasers = 13993 { 13994 { 13995 .eraseblocks = { {4 * 1024, 4096} }, 13996 .block_erase = SPI_BLOCK_ERASE_20, 13997 }, { 13998 .eraseblocks = { {32 * 1024, 512} }, 13999 .block_erase = SPI_BLOCK_ERASE_52, 14000 }, { 14001 .eraseblocks = { {64 * 1024, 256} }, 14002 .block_erase = SPI_BLOCK_ERASE_D8, 14003 }, { 14004 .eraseblocks = { {16384 * 1024, 1} }, 14005 .block_erase = SPI_BLOCK_ERASE_C7, 14006 }, { 14007 .eraseblocks = { {16384 * 1024, 1} }, 14008 .block_erase = SPI_BLOCK_ERASE_60, 14009 } 14010 }, 14011 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14012 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14013 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14014 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14015 .voltage = {1700, 2000}, 14016 }, 14017 14018 { 14019 .vendor = "Micron", 14020 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 14021 .bustype = BUS_SPI, 14022 .manufacture_id = ST_ID, 14023 .model_id = ST_N25Q128__3E, 14024 .total_size = 16384, 14025 .page_size = 256, 14026 /* supports SFDP */ 14027 /* OTP: 64B total; read 0x4B, write 0x42 */ 14028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 14029 .tested = TEST_OK_PREW, 14030 .probe = PROBE_SPI_RDID, 14031 .probe_timing = TIMING_ZERO, 14032 .block_erasers = 14033 { 14034 { 14035 .eraseblocks = { {4 * 1024, 4096} }, 14036 .block_erase = SPI_BLOCK_ERASE_20, 14037 }, { 14038 .eraseblocks = { {32 * 1024, 512} }, 14039 .block_erase = SPI_BLOCK_ERASE_52, 14040 }, { 14041 .eraseblocks = { {64 * 1024, 256} }, 14042 .block_erase = SPI_BLOCK_ERASE_D8, 14043 }, { 14044 .eraseblocks = { {16384 * 1024, 1} }, 14045 .block_erase = SPI_BLOCK_ERASE_C7, 14046 }, { 14047 .eraseblocks = { {16384 * 1024, 1} }, 14048 .block_erase = SPI_BLOCK_ERASE_60, 14049 } 14050 }, 14051 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14052 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14053 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14054 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14055 .voltage = {2700, 3600}, 14056 }, 14057 14058 { 14059 .vendor = "Micron", 14060 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 14061 .bustype = BUS_SPI, 14062 .manufacture_id = ST_ID, 14063 .model_id = ST_N25Q256__3E, 14064 .total_size = 32768, 14065 .page_size = 256, 14066 /* supports SFDP */ 14067 /* OTP: 64B total; read 0x4B, write 0x42 */ 14068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 14069 .tested = TEST_OK_PREW, 14070 .probe = PROBE_SPI_RDID, 14071 .probe_timing = TIMING_ZERO, 14072 .block_erasers = 14073 { 14074 { 14075 .eraseblocks = { {4 * 1024, 8192} }, 14076 .block_erase = SPI_BLOCK_ERASE_21, 14077 }, { 14078 .eraseblocks = { {4 * 1024, 8192} }, 14079 .block_erase = SPI_BLOCK_ERASE_20, 14080 }, { 14081 .eraseblocks = { {32 * 1024, 1024} }, 14082 .block_erase = SPI_BLOCK_ERASE_5C, 14083 }, { 14084 .eraseblocks = { {32 * 1024, 1024} }, 14085 .block_erase = SPI_BLOCK_ERASE_52, 14086 }, { 14087 .eraseblocks = { {64 * 1024, 512} }, 14088 .block_erase = SPI_BLOCK_ERASE_DC, 14089 }, { 14090 .eraseblocks = { {64 * 1024, 512} }, 14091 .block_erase = SPI_BLOCK_ERASE_D8, 14092 }, { 14093 .eraseblocks = { {32768 * 1024, 1} }, 14094 .block_erase = SPI_BLOCK_ERASE_C7, 14095 }, { 14096 .eraseblocks = { {32768 * 1024, 1} }, 14097 .block_erase = SPI_BLOCK_ERASE_60, 14098 } 14099 }, 14100 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14101 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14102 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14103 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14104 .voltage = {2700, 3600}, 14105 }, 14106 14107 { 14108 .vendor = "Micron", 14109 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 14110 .bustype = BUS_SPI, 14111 .manufacture_id = ST_ID, 14112 .model_id = ST_N25Q256__1E, 14113 .total_size = 32768, 14114 .page_size = 256, 14115 /* supports SFDP */ 14116 /* OTP: 64B total; read 0x4B, write 0x42 */ 14117 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 14118 .tested = TEST_OK_PREW, 14119 .probe = PROBE_SPI_RDID, 14120 .probe_timing = TIMING_ZERO, 14121 .block_erasers = 14122 { 14123 { 14124 .eraseblocks = { {4 * 1024, 8192} }, 14125 .block_erase = SPI_BLOCK_ERASE_21, 14126 }, { 14127 .eraseblocks = { {4 * 1024, 8192} }, 14128 .block_erase = SPI_BLOCK_ERASE_20, 14129 }, { 14130 .eraseblocks = { {32 * 1024, 1024} }, 14131 .block_erase = SPI_BLOCK_ERASE_5C, 14132 }, { 14133 .eraseblocks = { {32 * 1024, 1024} }, 14134 .block_erase = SPI_BLOCK_ERASE_52, 14135 }, { 14136 .eraseblocks = { {64 * 1024, 512} }, 14137 .block_erase = SPI_BLOCK_ERASE_DC, 14138 }, { 14139 .eraseblocks = { {64 * 1024, 512} }, 14140 .block_erase = SPI_BLOCK_ERASE_D8, 14141 }, { 14142 .eraseblocks = { {32768 * 1024, 1} }, 14143 .block_erase = SPI_BLOCK_ERASE_C7, 14144 }, { 14145 .eraseblocks = { {32768 * 1024, 1} }, 14146 .block_erase = SPI_BLOCK_ERASE_60, 14147 } 14148 }, 14149 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14150 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14151 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14152 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14153 .voltage = {1700, 2000}, 14154 }, 14155 14156 { 14157 .vendor = "Micron", 14158 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */ 14159 .bustype = BUS_SPI, 14160 .manufacture_id = ST_ID, 14161 .model_id = ST_N25Q512__3G, 14162 .total_size = 65536, 14163 .page_size = 256, 14164 /* supports SFDP */ 14165 /* OTP: 64B total; read 0x4B, write 0x42 */ 14166 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 14167 .tested = TEST_OK_PREW, 14168 .probe = PROBE_SPI_RDID, 14169 .probe_timing = TIMING_ZERO, 14170 .block_erasers = 14171 { 14172 { 14173 .eraseblocks = { {4 * 1024, 16384} }, 14174 .block_erase = SPI_BLOCK_ERASE_21, 14175 }, { 14176 .eraseblocks = { {4 * 1024, 16384} }, 14177 .block_erase = SPI_BLOCK_ERASE_20, 14178 }, { 14179 .eraseblocks = { {32 * 1024, 2048} }, 14180 .block_erase = SPI_BLOCK_ERASE_5C, 14181 }, { 14182 .eraseblocks = { {32 * 1024, 2048} }, 14183 .block_erase = SPI_BLOCK_ERASE_52, 14184 }, { 14185 .eraseblocks = { {64 * 1024, 1024} }, 14186 .block_erase = SPI_BLOCK_ERASE_DC, 14187 }, { 14188 .eraseblocks = { {64 * 1024, 1024} }, 14189 .block_erase = SPI_BLOCK_ERASE_D8, 14190 }, { 14191 .eraseblocks = { {65536 * 1024, 1} }, 14192 .block_erase = SPI_BLOCK_ERASE_C7, 14193 }, { 14194 .eraseblocks = { {65536 * 1024, 1} }, 14195 .block_erase = SPI_BLOCK_ERASE_60, 14196 } 14197 }, 14198 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14199 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14200 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14201 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14202 .voltage = {2700, 3600}, 14203 .reg_bits = 14204 { 14205 .srp = {STATUS1, 7, RW}, 14206 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}}, 14207 .tb = {STATUS1, 5, RW}, 14208 }, 14209 .decode_range = DECODE_RANGE_SPI25, 14210 }, 14211 14212 { 14213 .vendor = "Micron", 14214 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */ 14215 .bustype = BUS_SPI, 14216 .manufacture_id = ST_ID, 14217 .model_id = ST_N25Q512__1G, 14218 .total_size = 65536, 14219 .page_size = 256, 14220 /* supports SFDP */ 14221 /* OTP: 64B total; read 0x4B, write 0x42 */ 14222 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN, 14223 .tested = TEST_OK_PREW, 14224 .probe = PROBE_SPI_RDID, 14225 .probe_timing = TIMING_ZERO, 14226 .block_erasers = 14227 { 14228 { 14229 .eraseblocks = { {4 * 1024, 16384} }, 14230 .block_erase = SPI_BLOCK_ERASE_21, 14231 }, { 14232 .eraseblocks = { {4 * 1024, 16384} }, 14233 .block_erase = SPI_BLOCK_ERASE_20, 14234 }, { 14235 .eraseblocks = { {32 * 1024, 2048} }, 14236 .block_erase = SPI_BLOCK_ERASE_5C, 14237 }, { 14238 .eraseblocks = { {32 * 1024, 2048} }, 14239 .block_erase = SPI_BLOCK_ERASE_52, 14240 }, { 14241 .eraseblocks = { {64 * 1024, 1024} }, 14242 .block_erase = SPI_BLOCK_ERASE_DC, 14243 }, { 14244 .eraseblocks = { {64 * 1024, 1024} }, 14245 .block_erase = SPI_BLOCK_ERASE_D8, 14246 }, { 14247 .eraseblocks = { {65536 * 1024, 1} }, 14248 .block_erase = SPI_BLOCK_ERASE_C7, 14249 }, { 14250 .eraseblocks = { {65536 * 1024, 1} }, 14251 .block_erase = SPI_BLOCK_ERASE_60, 14252 } 14253 }, 14254 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_N25Q, /* TODO: config, lock, flag regs */ 14255 .unlock = SPI_DISABLE_BLOCKPROTECT_N25Q, /* TODO: per 64kB sector lock registers */ 14256 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 14257 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14258 .voltage = {1700, 2000}, 14259 }, 14260 14261 { 14262 .vendor = "MoselVitelic", 14263 .name = "V29C51000B", 14264 .bustype = BUS_PARALLEL, 14265 .manufacture_id = SYNCMOS_MVC_ID, 14266 .model_id = MVC_V29C51000B, 14267 .total_size = 64, 14268 .page_size = 512, 14269 .feature_bits = FEATURE_EITHER_RESET, 14270 .tested = TEST_UNTESTED, 14271 .probe = PROBE_JEDEC, 14272 .probe_timing = TIMING_ZERO, 14273 .block_erasers = 14274 { 14275 { 14276 .eraseblocks = { {512, 128} }, 14277 .block_erase = JEDEC_SECTOR_ERASE, 14278 }, { 14279 .eraseblocks = { {64 * 1024, 1} }, 14280 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14281 }, 14282 }, 14283 .write = WRITE_JEDEC1, 14284 .read = READ_MEMMAPPED, 14285 .voltage = {4500, 5500}, 14286 }, 14287 14288 { 14289 .vendor = "MoselVitelic", 14290 .name = "V29C51000T", 14291 .bustype = BUS_PARALLEL, 14292 .manufacture_id = SYNCMOS_MVC_ID, 14293 .model_id = MVC_V29C51000T, 14294 .total_size = 64, 14295 .page_size = 512, 14296 .feature_bits = FEATURE_EITHER_RESET, 14297 .tested = TEST_UNTESTED, 14298 .probe = PROBE_JEDEC, 14299 .probe_timing = TIMING_ZERO, 14300 .block_erasers = 14301 { 14302 { 14303 .eraseblocks = { {512, 128} }, 14304 .block_erase = JEDEC_SECTOR_ERASE, 14305 }, { 14306 .eraseblocks = { {64 * 1024, 1} }, 14307 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14308 }, 14309 }, 14310 .write = WRITE_JEDEC1, 14311 .read = READ_MEMMAPPED, 14312 .voltage = {4500, 5500}, 14313 }, 14314 14315 { 14316 .vendor = "MoselVitelic", 14317 .name = "V29C51400B", 14318 .bustype = BUS_PARALLEL, 14319 .manufacture_id = SYNCMOS_MVC_ID, 14320 .model_id = MVC_V29C51400B, 14321 .total_size = 512, 14322 .page_size = 1024, 14323 .feature_bits = FEATURE_EITHER_RESET, 14324 .tested = TEST_UNTESTED, 14325 .probe = PROBE_JEDEC, 14326 .probe_timing = TIMING_ZERO, 14327 .block_erasers = 14328 { 14329 { 14330 .eraseblocks = { {1024, 512} }, 14331 .block_erase = JEDEC_SECTOR_ERASE, 14332 }, { 14333 .eraseblocks = { {512 * 1024, 1} }, 14334 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14335 }, 14336 }, 14337 .write = WRITE_JEDEC1, 14338 .read = READ_MEMMAPPED, 14339 .voltage = {4500, 5500}, 14340 }, 14341 14342 { 14343 .vendor = "MoselVitelic", 14344 .name = "V29C51400T", 14345 .bustype = BUS_PARALLEL, 14346 .manufacture_id = SYNCMOS_MVC_ID, 14347 .model_id = MVC_V29C51400T, 14348 .total_size = 512, 14349 .page_size = 1024, 14350 .feature_bits = FEATURE_EITHER_RESET, 14351 .tested = TEST_UNTESTED, 14352 .probe = PROBE_JEDEC, 14353 .probe_timing = TIMING_ZERO, 14354 .block_erasers = 14355 { 14356 { 14357 .eraseblocks = { {1024, 512} }, 14358 .block_erase = JEDEC_SECTOR_ERASE, 14359 }, { 14360 .eraseblocks = { {512 * 1024, 1} }, 14361 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14362 }, 14363 }, 14364 .write = WRITE_JEDEC1, 14365 .read = READ_MEMMAPPED, 14366 .voltage = {4500, 5500}, 14367 }, 14368 14369 { 14370 .vendor = "MoselVitelic", 14371 .name = "V29LC51000", 14372 .bustype = BUS_PARALLEL, 14373 .manufacture_id = SYNCMOS_MVC_ID, 14374 .model_id = MVC_V29LC51000, 14375 .total_size = 64, 14376 .page_size = 512, 14377 .feature_bits = FEATURE_EITHER_RESET, 14378 .tested = TEST_UNTESTED, 14379 .probe = PROBE_JEDEC, 14380 .probe_timing = TIMING_ZERO, 14381 .block_erasers = 14382 { 14383 { 14384 .eraseblocks = { {512, 128} }, 14385 .block_erase = JEDEC_SECTOR_ERASE, 14386 }, { 14387 .eraseblocks = { {64 * 1024, 1} }, 14388 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14389 }, 14390 }, 14391 .write = WRITE_JEDEC1, 14392 .read = READ_MEMMAPPED, 14393 .voltage = {4500, 5500}, 14394 }, 14395 14396 { 14397 .vendor = "MoselVitelic", 14398 .name = "V29LC51001", 14399 .bustype = BUS_PARALLEL, 14400 .manufacture_id = SYNCMOS_MVC_ID, 14401 .model_id = MVC_V29LC51001, 14402 .total_size = 128, 14403 .page_size = 512, 14404 .feature_bits = FEATURE_EITHER_RESET, 14405 .tested = TEST_UNTESTED, 14406 .probe = PROBE_JEDEC, 14407 .probe_timing = TIMING_ZERO, 14408 .block_erasers = 14409 { 14410 { 14411 .eraseblocks = { {512, 256} }, 14412 .block_erase = JEDEC_SECTOR_ERASE, 14413 }, { 14414 .eraseblocks = { {128 * 1024, 1} }, 14415 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14416 }, 14417 }, 14418 .write = WRITE_JEDEC1, 14419 .read = READ_MEMMAPPED, 14420 .voltage = {4500, 5500}, 14421 }, 14422 14423 { 14424 .vendor = "MoselVitelic", 14425 .name = "V29LC51002", 14426 .bustype = BUS_PARALLEL, 14427 .manufacture_id = SYNCMOS_MVC_ID, 14428 .model_id = MVC_V29LC51002, 14429 .total_size = 256, 14430 .page_size = 512, 14431 .feature_bits = FEATURE_EITHER_RESET, 14432 .tested = TEST_UNTESTED, 14433 .probe = PROBE_JEDEC, 14434 .probe_timing = TIMING_ZERO, 14435 .block_erasers = 14436 { 14437 { 14438 .eraseblocks = { {512, 512} }, 14439 .block_erase = JEDEC_SECTOR_ERASE, 14440 }, { 14441 .eraseblocks = { {256 * 1024, 1} }, 14442 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 14443 }, 14444 }, 14445 .write = WRITE_JEDEC1, 14446 .read = READ_MEMMAPPED, 14447 .voltage = {4500, 5500}, 14448 }, 14449 14450 { 14451 .vendor = "Nantronics", 14452 .name = "N25S10", 14453 .bustype = BUS_SPI, 14454 .manufacture_id = NANTRONICS_ID_NOPREFIX, 14455 .model_id = NANTRONICS_N25S10, 14456 .total_size = 128, 14457 .page_size = 256, 14458 .feature_bits = FEATURE_WRSR_WREN, 14459 .tested = TEST_UNTESTED, 14460 .probe = PROBE_SPI_RDID, 14461 .probe_timing = TIMING_ZERO, 14462 .block_erasers = 14463 { 14464 { 14465 .eraseblocks = { {4 * 1024, 32} }, 14466 .block_erase = SPI_BLOCK_ERASE_20, 14467 }, { 14468 .eraseblocks = { {4 * 1024, 32} }, 14469 .block_erase = SPI_BLOCK_ERASE_D7, 14470 }, { 14471 .eraseblocks = { {32 * 1024, 4} }, 14472 .block_erase = SPI_BLOCK_ERASE_52, 14473 }, { 14474 .eraseblocks = { {64 * 1024, 2} }, 14475 .block_erase = SPI_BLOCK_ERASE_D8, 14476 }, { 14477 .eraseblocks = { {128 * 1024, 1} }, 14478 .block_erase = SPI_BLOCK_ERASE_60, 14479 }, { 14480 .eraseblocks = { {128 * 1024, 1} }, 14481 .block_erase = SPI_BLOCK_ERASE_C7, 14482 } 14483 }, 14484 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 14485 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14486 .write = SPI_CHIP_WRITE256, 14487 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 14488 .voltage = {2700, 3600}, 14489 }, 14490 14491 { 14492 .vendor = "Nantronics", 14493 .name = "N25S16", 14494 .bustype = BUS_SPI, 14495 .manufacture_id = NANTRONICS_ID_NOPREFIX, 14496 .model_id = NANTRONICS_N25S16, 14497 .total_size = 2048, 14498 .page_size = 256, 14499 .feature_bits = FEATURE_WRSR_WREN, 14500 .tested = TEST_UNTESTED, 14501 .probe = PROBE_SPI_RDID, 14502 .probe_timing = TIMING_ZERO, 14503 .block_erasers = 14504 { 14505 { 14506 .eraseblocks = { {4 * 1024, 512} }, 14507 .block_erase = SPI_BLOCK_ERASE_20, 14508 }, { 14509 .eraseblocks = { {64 * 1024, 32} }, 14510 .block_erase = SPI_BLOCK_ERASE_D8, 14511 }, { 14512 .eraseblocks = { {2048 * 1024, 1} }, 14513 .block_erase = SPI_BLOCK_ERASE_60, 14514 }, { 14515 .eraseblocks = { {2048 * 1024, 1} }, 14516 .block_erase = SPI_BLOCK_ERASE_C7, 14517 } 14518 }, 14519 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 14520 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14521 .write = SPI_CHIP_WRITE256, 14522 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 14523 .voltage = {2700, 3600}, 14524 }, 14525 14526 { 14527 .vendor = "Nantronics", 14528 .name = "N25S20", 14529 .bustype = BUS_SPI, 14530 .manufacture_id = NANTRONICS_ID_NOPREFIX, 14531 .model_id = NANTRONICS_N25S20, 14532 .total_size = 256, 14533 .page_size = 256, 14534 .feature_bits = FEATURE_WRSR_WREN, 14535 .tested = TEST_UNTESTED, 14536 .probe = PROBE_SPI_RDID, 14537 .probe_timing = TIMING_ZERO, 14538 .block_erasers = 14539 { 14540 { 14541 .eraseblocks = { {4 * 1024, 64} }, 14542 .block_erase = SPI_BLOCK_ERASE_20, 14543 }, { 14544 .eraseblocks = { {4 * 1024, 64} }, 14545 .block_erase = SPI_BLOCK_ERASE_D7, 14546 }, { 14547 .eraseblocks = { {32 * 1024, 8} }, 14548 .block_erase = SPI_BLOCK_ERASE_52, 14549 }, { 14550 .eraseblocks = { {64 * 1024, 4} }, 14551 .block_erase = SPI_BLOCK_ERASE_D8, 14552 }, { 14553 .eraseblocks = { {256 * 1024, 1} }, 14554 .block_erase = SPI_BLOCK_ERASE_60, 14555 }, { 14556 .eraseblocks = { {256 * 1024, 1} }, 14557 .block_erase = SPI_BLOCK_ERASE_C7, 14558 } 14559 }, 14560 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 14561 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14562 .write = SPI_CHIP_WRITE256, 14563 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 14564 .voltage = {2700, 3600}, 14565 }, 14566 14567 { 14568 .vendor = "Nantronics", 14569 .name = "N25S40", 14570 .bustype = BUS_SPI, 14571 .manufacture_id = NANTRONICS_ID_NOPREFIX, 14572 .model_id = NANTRONICS_N25S40, 14573 .total_size = 512, 14574 .page_size = 256, 14575 .feature_bits = FEATURE_WRSR_WREN, 14576 .tested = TEST_UNTESTED, 14577 .probe = PROBE_SPI_RDID, 14578 .probe_timing = TIMING_ZERO, 14579 .block_erasers = 14580 { 14581 { 14582 .eraseblocks = { {4 * 1024, 128} }, 14583 .block_erase = SPI_BLOCK_ERASE_20, 14584 }, { 14585 .eraseblocks = { {4 * 1024, 128} }, 14586 .block_erase = SPI_BLOCK_ERASE_D7, 14587 }, { 14588 .eraseblocks = { {32 * 1024, 16} }, 14589 .block_erase = SPI_BLOCK_ERASE_52, 14590 }, { 14591 .eraseblocks = { {64 * 1024, 8} }, 14592 .block_erase = SPI_BLOCK_ERASE_D8, 14593 }, { 14594 .eraseblocks = { {512 * 1024, 1} }, 14595 .block_erase = SPI_BLOCK_ERASE_60, 14596 }, { 14597 .eraseblocks = { {512 * 1024, 1} }, 14598 .block_erase = SPI_BLOCK_ERASE_C7, 14599 } 14600 }, 14601 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 14602 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14603 .write = SPI_CHIP_WRITE256, 14604 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 14605 .voltage = {2700, 3600}, 14606 }, 14607 14608 { 14609 .vendor = "Nantronics", 14610 .name = "N25S80", 14611 .bustype = BUS_SPI, 14612 .manufacture_id = NANTRONICS_ID_NOPREFIX, 14613 .model_id = NANTRONICS_N25S80, 14614 .total_size = 1024, 14615 .page_size = 256, 14616 .feature_bits = FEATURE_WRSR_WREN, 14617 .tested = TEST_UNTESTED, 14618 .probe = PROBE_SPI_RDID, 14619 .probe_timing = TIMING_ZERO, 14620 .block_erasers = 14621 { 14622 { 14623 .eraseblocks = { {4 * 1024, 256} }, 14624 .block_erase = SPI_BLOCK_ERASE_20, 14625 }, { 14626 .eraseblocks = { {32 * 1024, 32} }, 14627 .block_erase = SPI_BLOCK_ERASE_52, 14628 }, { 14629 .eraseblocks = { {64 * 1024, 16} }, 14630 .block_erase = SPI_BLOCK_ERASE_D8, 14631 }, { 14632 .eraseblocks = { {1024 * 1024, 1} }, 14633 .block_erase = SPI_BLOCK_ERASE_60, 14634 }, { 14635 .eraseblocks = { {1024 * 1024, 1} }, 14636 .block_erase = SPI_BLOCK_ERASE_C7, 14637 } 14638 }, 14639 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 14640 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14641 .write = SPI_CHIP_WRITE256, 14642 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O read (0x3B) supported */ 14643 .voltage = {2700, 3600}, 14644 }, 14645 14646 { 14647 .vendor = "PMC", 14648 .name = "Pm25LD010(C)", 14649 .bustype = BUS_SPI, 14650 .manufacture_id = PMC_ID, 14651 .model_id = PMC_PM25LD010, 14652 .total_size = 128, 14653 .page_size = 256, 14654 .feature_bits = FEATURE_WRSR_WREN, 14655 .tested = TEST_OK_PREW, 14656 .probe = PROBE_SPI_RDID, 14657 .probe_timing = TIMING_ZERO, 14658 .block_erasers = 14659 { 14660 { 14661 .eraseblocks = { {4 * 1024, 32} }, 14662 .block_erase = SPI_BLOCK_ERASE_20, 14663 }, { 14664 .eraseblocks = { {4 * 1024, 32} }, 14665 .block_erase = SPI_BLOCK_ERASE_D7, 14666 }, { 14667 .eraseblocks = { {32 * 1024, 4} }, 14668 .block_erase = SPI_BLOCK_ERASE_D8, 14669 }, { 14670 .eraseblocks = { {128 * 1024, 1} }, 14671 .block_erase = SPI_BLOCK_ERASE_60, 14672 }, { 14673 .eraseblocks = { {128 * 1024, 1} }, 14674 .block_erase = SPI_BLOCK_ERASE_C7, 14675 } 14676 }, 14677 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 14678 .unlock = SPI_DISABLE_BLOCKPROTECT, /* FIXME: C version supports "Safe Guard" */ 14679 .write = SPI_CHIP_WRITE256, 14680 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 14681 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */ 14682 }, 14683 14684 { 14685 .vendor = "PMC", 14686 .name = "Pm25LD020(C)", 14687 .bustype = BUS_SPI, 14688 .manufacture_id = PMC_ID, 14689 .model_id = PMC_PM25LD020, 14690 .total_size = 256, 14691 .page_size = 256, 14692 .feature_bits = FEATURE_WRSR_WREN, 14693 .tested = TEST_OK_PREW, 14694 .probe = PROBE_SPI_RDID, 14695 .probe_timing = TIMING_ZERO, 14696 .block_erasers = 14697 { 14698 { 14699 .eraseblocks = { {4 * 1024, 64} }, 14700 .block_erase = SPI_BLOCK_ERASE_20, 14701 }, { 14702 .eraseblocks = { {4 * 1024, 64} }, 14703 .block_erase = SPI_BLOCK_ERASE_D7, 14704 }, { 14705 .eraseblocks = { {64 * 1024, 4} }, 14706 .block_erase = SPI_BLOCK_ERASE_D8, 14707 }, { 14708 .eraseblocks = { {256 * 1024, 1} }, 14709 .block_erase = SPI_BLOCK_ERASE_60, 14710 }, { 14711 .eraseblocks = { {256 * 1024, 1} }, 14712 .block_erase = SPI_BLOCK_ERASE_C7, 14713 } 14714 }, 14715 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 14716 .unlock = SPI_DISABLE_BLOCKPROTECT, /* FIXME: C version supports "Safe Guard" */ 14717 .write = SPI_CHIP_WRITE256, 14718 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 14719 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */ 14720 }, 14721 14722 { 14723 .vendor = "PMC", 14724 .name = "Pm25LD040(C)", 14725 .bustype = BUS_SPI, 14726 .manufacture_id = PMC_ID, 14727 .model_id = PMC_PM25LV040, 14728 .total_size = 512, 14729 .page_size = 256, 14730 .feature_bits = FEATURE_WRSR_WREN, 14731 .tested = TEST_OK_PREW, 14732 .probe = PROBE_SPI_RDID, 14733 .probe_timing = TIMING_ZERO, 14734 .block_erasers = 14735 { 14736 { 14737 .eraseblocks = { {4 * 1024, 128} }, 14738 .block_erase = SPI_BLOCK_ERASE_20, 14739 }, { 14740 .eraseblocks = { {4 * 1024, 128} }, 14741 .block_erase = SPI_BLOCK_ERASE_D7, 14742 }, { 14743 .eraseblocks = { {64 * 1024, 8} }, 14744 .block_erase = SPI_BLOCK_ERASE_D8, 14745 }, { 14746 .eraseblocks = { {512 * 1024, 1} }, 14747 .block_erase = SPI_BLOCK_ERASE_60, 14748 }, { 14749 .eraseblocks = { {512 * 1024, 1} }, 14750 .block_erase = SPI_BLOCK_ERASE_C7, 14751 } 14752 }, 14753 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 14754 .unlock = SPI_DISABLE_BLOCKPROTECT, 14755 .write = SPI_CHIP_WRITE256, 14756 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 14757 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */ 14758 }, 14759 14760 { 14761 .vendor = "PMC", 14762 .name = "Pm25LD256C", 14763 .bustype = BUS_SPI, 14764 .manufacture_id = PMC_ID, 14765 .model_id = PMC_PM25LD256C, 14766 .total_size = 32, 14767 .page_size = 256, 14768 .feature_bits = FEATURE_WRSR_WREN, 14769 .tested = TEST_UNTESTED, 14770 .probe = PROBE_SPI_RDID, 14771 .probe_timing = TIMING_ZERO, 14772 .block_erasers = 14773 { 14774 { 14775 .eraseblocks = { {4 * 1024, 8} }, 14776 .block_erase = SPI_BLOCK_ERASE_20, 14777 }, { 14778 .eraseblocks = { {4 * 1024, 8} }, 14779 .block_erase = SPI_BLOCK_ERASE_D7, 14780 }, { 14781 .eraseblocks = { {32 * 1024, 1} }, 14782 .block_erase = SPI_BLOCK_ERASE_D8, 14783 }, { 14784 .eraseblocks = { {32 * 1024, 1} }, 14785 .block_erase = SPI_BLOCK_ERASE_60, 14786 }, { 14787 .eraseblocks = { {32 * 1024, 1} }, 14788 .block_erase = SPI_BLOCK_ERASE_C7, 14789 } 14790 }, 14791 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 14792 .unlock = SPI_DISABLE_BLOCKPROTECT, 14793 .write = SPI_CHIP_WRITE256, 14794 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 14795 .voltage = {2700, 3600}, 14796 }, 14797 14798 { 14799 .vendor = "PMC", 14800 .name = "Pm25LD512(C)", 14801 .bustype = BUS_SPI, 14802 .manufacture_id = PMC_ID, 14803 .model_id = PMC_PM25LD512, 14804 .total_size = 64, 14805 .page_size = 256, 14806 .feature_bits = FEATURE_WRSR_WREN, 14807 .tested = TEST_OK_PREW, 14808 .probe = PROBE_SPI_RDID, 14809 .probe_timing = TIMING_ZERO, 14810 .block_erasers = 14811 { 14812 { 14813 .eraseblocks = { {4 * 1024, 16} }, 14814 .block_erase = SPI_BLOCK_ERASE_20, 14815 }, { 14816 .eraseblocks = { {4 * 1024, 16} }, 14817 .block_erase = SPI_BLOCK_ERASE_D7, 14818 }, { 14819 .eraseblocks = { {32 * 1024, 2} }, 14820 .block_erase = SPI_BLOCK_ERASE_D8, 14821 }, { 14822 .eraseblocks = { {64 * 1024, 1} }, 14823 .block_erase = SPI_BLOCK_ERASE_60, 14824 }, { 14825 .eraseblocks = { {64 * 1024, 1} }, 14826 .block_erase = SPI_BLOCK_ERASE_C7, 14827 } 14828 }, 14829 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 14830 .unlock = SPI_DISABLE_BLOCKPROTECT, /* FIXME: C version supports "Safe Guard" */ 14831 .write = SPI_CHIP_WRITE256, 14832 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual I/O supported */ 14833 .voltage = {2300, 3600}, 14834 }, 14835 14836 { 14837 .vendor = "PMC", 14838 .name = "Pm25LQ016", 14839 .bustype = BUS_SPI, 14840 .manufacture_id = PMC_ID, 14841 .model_id = PMC_PM25LQ016, 14842 .total_size = 2048, 14843 .page_size = 256, 14844 /* OTP: 256B total; read 0x4B, write 0xB1 */ 14845 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 14846 .tested = TEST_UNTESTED, 14847 .probe = PROBE_SPI_RDID, 14848 .probe_timing = TIMING_ZERO, 14849 .block_erasers = 14850 { 14851 { 14852 .eraseblocks = { {4 * 1024, 512} }, 14853 .block_erase = SPI_BLOCK_ERASE_20, 14854 }, { 14855 .eraseblocks = { {4 * 1024, 512} }, 14856 .block_erase = SPI_BLOCK_ERASE_D7, 14857 }, { 14858 .eraseblocks = { {64 * 1024, 32} }, 14859 .block_erase = SPI_BLOCK_ERASE_D8, 14860 }, { 14861 .eraseblocks = { {2048 * 1024, 1} }, 14862 .block_erase = SPI_BLOCK_ERASE_60, 14863 }, { 14864 .eraseblocks = { {2048 * 1024, 1} }, 14865 .block_erase = SPI_BLOCK_ERASE_C7, 14866 } 14867 }, 14868 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 14869 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14870 .write = SPI_CHIP_WRITE256, 14871 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14872 .voltage = {2300, 3600}, 14873 }, 14874 14875 { 14876 .vendor = "PMC", 14877 .name = "Pm25LQ020", 14878 .bustype = BUS_SPI, 14879 .manufacture_id = PMC_ID, 14880 .model_id = PMC_PM25LQ020, 14881 .total_size = 256, 14882 .page_size = 256, 14883 /* OTP: 256B total; read 0x4B, write 0xB1 */ 14884 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 14885 .tested = TEST_UNTESTED, 14886 .probe = PROBE_SPI_RDID, 14887 .probe_timing = TIMING_ZERO, 14888 .block_erasers = 14889 { 14890 { 14891 .eraseblocks = { {4 * 1024, 64} }, 14892 .block_erase = SPI_BLOCK_ERASE_20, 14893 }, { 14894 .eraseblocks = { {4 * 1024, 64} }, 14895 .block_erase = SPI_BLOCK_ERASE_D7, 14896 }, { 14897 .eraseblocks = { {64 * 1024, 4} }, 14898 .block_erase = SPI_BLOCK_ERASE_D8, 14899 }, { 14900 .eraseblocks = { {256 * 1024, 1} }, 14901 .block_erase = SPI_BLOCK_ERASE_60, 14902 }, { 14903 .eraseblocks = { {256 * 1024, 1} }, 14904 .block_erase = SPI_BLOCK_ERASE_C7, 14905 } 14906 }, 14907 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 14908 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14909 .write = SPI_CHIP_WRITE256, 14910 .read = SPI_CHIP_READ, 14911 .voltage = {2300, 3600}, 14912 }, 14913 14914 { 14915 .vendor = "PMC", 14916 .name = "Pm25LQ032C", 14917 .bustype = BUS_SPI, 14918 .manufacture_id = PMC_ID, 14919 .model_id = PMC_PM25LQ032C, 14920 .total_size = 4096, 14921 .page_size = 256, 14922 /* OTP: 64B total; read 0x4B, write 0xB1 */ 14923 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 14924 .tested = TEST_OK_PREW, 14925 .probe = PROBE_SPI_RDID, 14926 .probe_timing = TIMING_ZERO, 14927 .block_erasers = 14928 { 14929 { 14930 .eraseblocks = { {4 * 1024, 1024} }, 14931 .block_erase = SPI_BLOCK_ERASE_20, 14932 }, { 14933 .eraseblocks = { {4 * 1024, 1024} }, 14934 .block_erase = SPI_BLOCK_ERASE_D7, 14935 }, { 14936 .eraseblocks = { {64 * 1024, 64} }, 14937 .block_erase = SPI_BLOCK_ERASE_D8, 14938 }, { 14939 .eraseblocks = { {4096 * 1024, 1} }, 14940 .block_erase = SPI_BLOCK_ERASE_60, 14941 }, { 14942 .eraseblocks = { {4096 * 1024, 1} }, 14943 .block_erase = SPI_BLOCK_ERASE_C7, 14944 } 14945 }, 14946 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 14947 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14948 .write = SPI_CHIP_WRITE256, 14949 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14950 .voltage = {2700, 3600}, 14951 }, 14952 14953 { 14954 .vendor = "PMC", 14955 .name = "Pm25LQ040", 14956 .bustype = BUS_SPI, 14957 .manufacture_id = PMC_ID, 14958 .model_id = PMC_PM25LQ040, 14959 .total_size = 512, 14960 .page_size = 256, 14961 /* OTP: 256B total; read 0x4B, write 0xB1 */ 14962 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 14963 .tested = TEST_UNTESTED, 14964 .probe = PROBE_SPI_RDID, 14965 .probe_timing = TIMING_ZERO, 14966 .block_erasers = 14967 { 14968 { 14969 .eraseblocks = { {4 * 1024, 128} }, 14970 .block_erase = SPI_BLOCK_ERASE_20, 14971 }, { 14972 .eraseblocks = { {4 * 1024, 128} }, 14973 .block_erase = SPI_BLOCK_ERASE_D7, 14974 }, { 14975 .eraseblocks = { {64 * 1024, 8} }, 14976 .block_erase = SPI_BLOCK_ERASE_D8, 14977 }, { 14978 .eraseblocks = { {512 * 1024, 1} }, 14979 .block_erase = SPI_BLOCK_ERASE_60, 14980 }, { 14981 .eraseblocks = { {512 * 1024, 1} }, 14982 .block_erase = SPI_BLOCK_ERASE_C7, 14983 } 14984 }, 14985 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 14986 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 14987 .write = SPI_CHIP_WRITE256, 14988 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 14989 .voltage = {2300, 3600}, 14990 }, 14991 14992 { 14993 .vendor = "PMC", 14994 .name = "Pm25LQ080", 14995 .bustype = BUS_SPI, 14996 .manufacture_id = PMC_ID, 14997 .model_id = PMC_PM25LQ080, 14998 .total_size = 1024, 14999 .page_size = 256, 15000 /* OTP: 64B total; read 0x4B, write 0xB1 */ 15001 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15002 .tested = TEST_UNTESTED, 15003 .probe = PROBE_SPI_RDID, 15004 .probe_timing = TIMING_ZERO, 15005 .block_erasers = 15006 { 15007 { 15008 .eraseblocks = { {4 * 1024, 256} }, 15009 .block_erase = SPI_BLOCK_ERASE_20, 15010 }, { 15011 .eraseblocks = { {4 * 1024, 256} }, 15012 .block_erase = SPI_BLOCK_ERASE_D7, 15013 }, { 15014 .eraseblocks = { {64 * 1024, 16} }, 15015 .block_erase = SPI_BLOCK_ERASE_D8, 15016 }, { 15017 .eraseblocks = { {1024 * 1024, 1} }, 15018 .block_erase = SPI_BLOCK_ERASE_60, 15019 }, { 15020 .eraseblocks = { {1024 * 1024, 1} }, 15021 .block_erase = SPI_BLOCK_ERASE_C7, 15022 } 15023 }, 15024 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, /* bit6 is quad enable */ 15025 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 15026 .write = SPI_CHIP_WRITE256, 15027 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 15028 .voltage = {2300, 3600}, 15029 }, 15030 15031 { 15032 .vendor = "PMC", 15033 .name = "Pm25LV010", 15034 .bustype = BUS_SPI, 15035 .manufacture_id = PMC_ID_NOPREFIX, 15036 .model_id = PMC_PM25LV010, 15037 .total_size = 128, 15038 .page_size = 256, 15039 .feature_bits = FEATURE_WRSR_WREN, 15040 .tested = TEST_OK_PREW, 15041 .probe = PROBE_SPI_RES2, /* The continuation code is transferred as the 3rd byte m( */ 15042 .probe_timing = TIMING_ZERO, 15043 .block_erasers = 15044 { 15045 { 15046 .eraseblocks = { {4 * 1024, 32} }, 15047 .block_erase = SPI_BLOCK_ERASE_D7, 15048 }, { 15049 .eraseblocks = { {32 * 1024, 4} }, 15050 .block_erase = SPI_BLOCK_ERASE_D8, 15051 }, { 15052 .eraseblocks = { {128 * 1024, 1} }, 15053 .block_erase = SPI_BLOCK_ERASE_C7, 15054 } 15055 }, 15056 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 15057 .unlock = SPI_DISABLE_BLOCKPROTECT, 15058 .write = SPI_CHIP_WRITE256, 15059 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15060 .voltage = {2700, 3600}, 15061 }, 15062 15063 { 15064 .vendor = "PMC", 15065 .name = "Pm25LV010A", 15066 .bustype = BUS_SPI, 15067 .manufacture_id = PMC_ID, 15068 .model_id = PMC_PM25LV010, 15069 .total_size = 128, 15070 .page_size = 256, 15071 .feature_bits = FEATURE_WRSR_WREN, 15072 .tested = TEST_OK_PREW, 15073 .probe = PROBE_SPI_RDID, 15074 .probe_timing = TIMING_ZERO, 15075 .block_erasers = 15076 { 15077 { 15078 .eraseblocks = { {4 * 1024, 32} }, 15079 .block_erase = SPI_BLOCK_ERASE_D7, 15080 }, { 15081 .eraseblocks = { {32 * 1024, 4} }, 15082 .block_erase = SPI_BLOCK_ERASE_D8, 15083 }, { 15084 .eraseblocks = { {128 * 1024, 1} }, 15085 .block_erase = SPI_BLOCK_ERASE_C7, 15086 } 15087 }, 15088 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 15089 .unlock = SPI_DISABLE_BLOCKPROTECT, 15090 .write = SPI_CHIP_WRITE256, 15091 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15092 .voltage = {2700, 3600}, 15093 }, 15094 15095 { 15096 .vendor = "PMC", 15097 .name = "Pm25LV016B", 15098 .bustype = BUS_SPI, 15099 .manufacture_id = PMC_ID, 15100 .model_id = PMC_PM25LV016B, 15101 .total_size = 2048, 15102 .page_size = 256, 15103 .feature_bits = FEATURE_WRSR_WREN, 15104 .tested = TEST_UNTESTED, 15105 .probe = PROBE_SPI_RDID, 15106 .probe_timing = TIMING_ZERO, 15107 .block_erasers = 15108 { 15109 { 15110 .eraseblocks = { {4 * 1024, 512} }, 15111 .block_erase = SPI_BLOCK_ERASE_D7, 15112 }, { 15113 .eraseblocks = { {4 * 1024, 512} }, 15114 .block_erase = SPI_BLOCK_ERASE_20, 15115 }, { 15116 .eraseblocks = { {64 * 1024, 32} }, 15117 .block_erase = SPI_BLOCK_ERASE_D8, 15118 }, { 15119 .eraseblocks = { {2 * 1024 * 1024, 1} }, 15120 .block_erase = SPI_BLOCK_ERASE_60, 15121 }, { 15122 .eraseblocks = { {2 * 1024 * 1024, 1} }, 15123 .block_erase = SPI_BLOCK_ERASE_C7, 15124 } 15125 }, 15126 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 15127 .unlock = SPI_DISABLE_BLOCKPROTECT, 15128 .write = SPI_CHIP_WRITE256, 15129 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15130 .voltage = {2700, 3600}, 15131 }, 15132 15133 { 15134 .vendor = "PMC", 15135 .name = "Pm25LV020", 15136 .bustype = BUS_SPI, 15137 .manufacture_id = PMC_ID, 15138 .model_id = PMC_PM25LV020, 15139 .total_size = 256, 15140 .page_size = 256, 15141 .feature_bits = FEATURE_WRSR_WREN, 15142 .tested = TEST_UNTESTED, 15143 .probe = PROBE_SPI_RDID, 15144 .probe_timing = TIMING_ZERO, 15145 .block_erasers = 15146 { 15147 { 15148 .eraseblocks = { {4 * 1024, 64} }, 15149 .block_erase = SPI_BLOCK_ERASE_D7, 15150 }, { 15151 .eraseblocks = { {64 * 1024, 4} }, 15152 .block_erase = SPI_BLOCK_ERASE_D8, 15153 }, { 15154 .eraseblocks = { {256 * 1024, 1} }, 15155 .block_erase = SPI_BLOCK_ERASE_C7, 15156 } 15157 }, 15158 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 15159 .unlock = SPI_DISABLE_BLOCKPROTECT, 15160 .write = SPI_CHIP_WRITE256, 15161 .read = SPI_CHIP_READ, 15162 .voltage = {2700, 3600}, 15163 }, 15164 15165 { 15166 .vendor = "PMC", 15167 .name = "Pm25LV040", 15168 .bustype = BUS_SPI, 15169 .manufacture_id = PMC_ID, 15170 .model_id = PMC_PM25LV040, 15171 .total_size = 512, 15172 .page_size = 256, 15173 .feature_bits = FEATURE_WRSR_WREN, 15174 .tested = TEST_OK_PREW, 15175 .probe = PROBE_SPI_RDID, 15176 .probe_timing = TIMING_ZERO, 15177 .block_erasers = 15178 { 15179 { 15180 .eraseblocks = { {4 * 1024, 128} }, 15181 .block_erase = SPI_BLOCK_ERASE_D7, 15182 }, { 15183 .eraseblocks = { {64 * 1024, 8} }, 15184 .block_erase = SPI_BLOCK_ERASE_D8, 15185 }, { 15186 .eraseblocks = { {512 * 1024, 1} }, 15187 .block_erase = SPI_BLOCK_ERASE_C7, 15188 } 15189 }, 15190 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 15191 .unlock = SPI_DISABLE_BLOCKPROTECT, 15192 .write = SPI_CHIP_WRITE256, 15193 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15194 .voltage = {2700, 3600}, 15195 }, 15196 15197 { 15198 .vendor = "PMC", 15199 .name = "Pm25LV080B", 15200 .bustype = BUS_SPI, 15201 .manufacture_id = PMC_ID, 15202 .model_id = PMC_PM25LV080B, 15203 .total_size = 1024, 15204 .page_size = 256, 15205 .feature_bits = FEATURE_WRSR_WREN, 15206 .tested = TEST_UNTESTED, 15207 .probe = PROBE_SPI_RDID, 15208 .probe_timing = TIMING_ZERO, 15209 .block_erasers = 15210 { 15211 { 15212 .eraseblocks = { {4 * 1024, 256} }, 15213 .block_erase = SPI_BLOCK_ERASE_D7, 15214 }, { 15215 .eraseblocks = { {4 * 1024, 256} }, 15216 .block_erase = SPI_BLOCK_ERASE_20, 15217 }, { 15218 .eraseblocks = { {64 * 1024, 16} }, 15219 .block_erase = SPI_BLOCK_ERASE_D8, 15220 }, { 15221 .eraseblocks = { {1024 * 1024, 1} }, 15222 .block_erase = SPI_BLOCK_ERASE_60, 15223 }, { 15224 .eraseblocks = { {1024 * 1024, 1} }, 15225 .block_erase = SPI_BLOCK_ERASE_C7, 15226 } 15227 }, 15228 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 15229 .unlock = SPI_DISABLE_BLOCKPROTECT, 15230 .write = SPI_CHIP_WRITE256, 15231 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15232 .voltage = {2700, 3600}, 15233 }, 15234 15235 { 15236 .vendor = "PMC", 15237 .name = "Pm25LV512(A)", 15238 .bustype = BUS_SPI, 15239 .manufacture_id = PMC_ID_NOPREFIX, 15240 .model_id = PMC_PM25LV512, 15241 .total_size = 64, 15242 .page_size = 256, 15243 .feature_bits = FEATURE_WRSR_WREN, 15244 .tested = TEST_OK_PREW, 15245 .probe = PROBE_SPI_RES2, /* The continuation code is transferred as the 3rd byte m( */ 15246 .probe_timing = TIMING_ZERO, 15247 .block_erasers = 15248 { 15249 { 15250 .eraseblocks = { {4 * 1024, 16} }, 15251 .block_erase = SPI_BLOCK_ERASE_D7, 15252 }, { 15253 .eraseblocks = { {32 * 1024, 2} }, 15254 .block_erase = SPI_BLOCK_ERASE_D8, 15255 }, { 15256 .eraseblocks = { {64 * 1024, 1} }, 15257 .block_erase = SPI_BLOCK_ERASE_C7, 15258 } 15259 }, 15260 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 15261 .unlock = SPI_DISABLE_BLOCKPROTECT, 15262 .write = SPI_CHIP_WRITE256, 15263 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15264 .voltage = {2700, 3600}, 15265 }, 15266 15267 { 15268 .vendor = "PMC", 15269 .name = "Pm29F002B", 15270 .bustype = BUS_PARALLEL, 15271 .manufacture_id = PMC_ID_NOPREFIX, 15272 .model_id = PMC_PM29F002B, 15273 .total_size = 256, 15274 .page_size = 8 * 1024, 15275 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15276 .tested = TEST_UNTESTED, 15277 .probe = PROBE_JEDEC, 15278 .probe_timing = TIMING_FIXME, 15279 .block_erasers = 15280 { 15281 { 15282 .eraseblocks = { 15283 {16 * 1024, 1}, 15284 {8 * 1024, 2}, 15285 {96 * 1024, 1}, 15286 {128 * 1024, 1}, 15287 }, 15288 .block_erase = JEDEC_SECTOR_ERASE, 15289 }, { 15290 .eraseblocks = { {256 * 1024, 1} }, 15291 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15292 }, 15293 }, 15294 .write = WRITE_JEDEC1, 15295 .read = READ_MEMMAPPED, 15296 .voltage = {4500, 5500}, 15297 }, 15298 15299 { 15300 .vendor = "PMC", 15301 .name = "Pm29F002T", 15302 .bustype = BUS_PARALLEL, 15303 .manufacture_id = PMC_ID_NOPREFIX, 15304 .model_id = PMC_PM29F002T, 15305 .total_size = 256, 15306 .page_size = 8 * 1024, 15307 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15308 .tested = TEST_OK_PREW, 15309 .probe = PROBE_JEDEC, 15310 .probe_timing = TIMING_FIXME, 15311 .block_erasers = 15312 { 15313 { 15314 .eraseblocks = { 15315 {128 * 1024, 1}, 15316 {96 * 1024, 1}, 15317 {8 * 1024, 2}, 15318 {16 * 1024, 1}, 15319 }, 15320 .block_erase = JEDEC_SECTOR_ERASE, 15321 }, { 15322 .eraseblocks = { {256 * 1024, 1} }, 15323 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15324 }, 15325 }, 15326 .write = WRITE_JEDEC1, 15327 .read = READ_MEMMAPPED, 15328 .voltage = {4500, 5500}, 15329 }, 15330 15331 { 15332 .vendor = "PMC", 15333 .name = "Pm39LV010", 15334 .bustype = BUS_PARALLEL, 15335 .manufacture_id = PMC_ID_NOPREFIX, 15336 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */ 15337 .total_size = 128, 15338 .page_size = 4096, 15339 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15340 .tested = TEST_OK_PREW, 15341 .probe = PROBE_JEDEC, 15342 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 15343 .block_erasers = 15344 { 15345 { 15346 .eraseblocks = { {4 * 1024, 32} }, 15347 .block_erase = JEDEC_SECTOR_ERASE, 15348 }, { 15349 .eraseblocks = { {64 * 1024, 2} }, 15350 .block_erase = JEDEC_BLOCK_ERASE, 15351 }, { 15352 .eraseblocks = { {128 * 1024, 1} }, 15353 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15354 } 15355 }, 15356 .write = WRITE_JEDEC1, 15357 .read = READ_MEMMAPPED, 15358 .voltage = {2700, 3600}, 15359 }, 15360 15361 { 15362 .vendor = "PMC", 15363 .name = "Pm39LV020", 15364 .bustype = BUS_PARALLEL, 15365 .manufacture_id = PMC_ID_NOPREFIX, 15366 .model_id = PMC_PM39LV020, 15367 .total_size = 256, 15368 .page_size = 4096, 15369 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15370 .tested = TEST_UNTESTED, 15371 .probe = PROBE_JEDEC, 15372 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 15373 .block_erasers = 15374 { 15375 { 15376 .eraseblocks = { {4 * 1024, 64} }, 15377 .block_erase = JEDEC_SECTOR_ERASE, 15378 }, { 15379 .eraseblocks = { {64 * 1024, 4} }, 15380 .block_erase = JEDEC_BLOCK_ERASE, 15381 }, { 15382 .eraseblocks = { {256 * 1024, 1} }, 15383 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15384 } 15385 }, 15386 .write = WRITE_JEDEC1, 15387 .read = READ_MEMMAPPED, 15388 .voltage = {2700, 3600}, 15389 }, 15390 15391 { 15392 .vendor = "PMC", 15393 .name = "Pm39LV040", 15394 .bustype = BUS_PARALLEL, 15395 .manufacture_id = PMC_ID_NOPREFIX, 15396 .model_id = PMC_PM39LV040, 15397 .total_size = 512, 15398 .page_size = 4096, 15399 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15400 .tested = TEST_OK_PR, 15401 .probe = PROBE_JEDEC, 15402 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 15403 .block_erasers = 15404 { 15405 { 15406 .eraseblocks = { {4 * 1024, 128} }, 15407 .block_erase = JEDEC_SECTOR_ERASE, 15408 }, { 15409 .eraseblocks = { {64 * 1024, 8} }, 15410 .block_erase = JEDEC_BLOCK_ERASE, 15411 }, { 15412 .eraseblocks = { {512 * 1024, 1} }, 15413 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15414 } 15415 }, 15416 .write = WRITE_JEDEC1, 15417 .read = READ_MEMMAPPED, 15418 .voltage = {2700, 3600}, 15419 }, 15420 15421 { 15422 .vendor = "PMC", 15423 .name = "Pm39LV512", 15424 .bustype = BUS_PARALLEL, 15425 .manufacture_id = PMC_ID_NOPREFIX, 15426 .model_id = PMC_PM39LV512, 15427 .total_size = 64, 15428 .page_size = 4096, 15429 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 15430 .tested = TEST_OK_PREW, 15431 .probe = PROBE_JEDEC, 15432 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 15433 .block_erasers = 15434 { 15435 { 15436 .eraseblocks = { {4 * 1024, 16} }, 15437 .block_erase = JEDEC_SECTOR_ERASE, 15438 }, { 15439 .eraseblocks = { {64 * 1024, 1} }, 15440 .block_erase = JEDEC_BLOCK_ERASE, 15441 }, { 15442 .eraseblocks = { {64 * 1024, 1} }, 15443 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15444 } 15445 }, 15446 .write = WRITE_JEDEC1, 15447 .read = READ_MEMMAPPED, 15448 .voltage = {2700, 3600}, 15449 }, 15450 15451 { 15452 .vendor = "PMC", 15453 .name = "Pm49FL002", 15454 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 15455 .manufacture_id = PMC_ID_NOPREFIX, 15456 .model_id = PMC_PM49FL002, 15457 .total_size = 256, 15458 .page_size = 16 * 1024, 15459 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 15460 .tested = TEST_OK_PR, 15461 .probe = PROBE_JEDEC, 15462 .probe_timing = TIMING_ZERO, /* routine is wrapper to JEDEC (pm49fl00x.c) */ 15463 .block_erasers = 15464 { 15465 { 15466 .eraseblocks = { {4 * 1024, 64} }, 15467 .block_erase = JEDEC_SECTOR_ERASE, 15468 }, { 15469 .eraseblocks = { {16 * 1024, 16} }, 15470 .block_erase = JEDEC_BLOCK_ERASE, 15471 }, { 15472 .eraseblocks = { {256 * 1024, 1} }, 15473 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15474 } 15475 }, 15476 .unlock = UNLOCK_REGSPACE2_UNIFORM_32K, 15477 .write = WRITE_JEDEC1, 15478 .read = READ_MEMMAPPED, 15479 .voltage = {3000, 3600}, 15480 }, 15481 15482 { 15483 .vendor = "PMC", 15484 .name = "Pm49FL004", 15485 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */ 15486 .manufacture_id = PMC_ID_NOPREFIX, 15487 .model_id = PMC_PM49FL004, 15488 .total_size = 512, 15489 .page_size = 64 * 1024, 15490 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 15491 .tested = TEST_OK_PREW, 15492 .probe = PROBE_JEDEC, 15493 .probe_timing = TIMING_ZERO, 15494 .block_erasers = 15495 { 15496 { 15497 .eraseblocks = { {4 * 1024, 128} }, 15498 .block_erase = JEDEC_SECTOR_ERASE, 15499 }, { 15500 .eraseblocks = { {64 * 1024, 8} }, 15501 .block_erase = JEDEC_BLOCK_ERASE, 15502 }, { 15503 .eraseblocks = { {512 * 1024, 1} }, 15504 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 15505 } 15506 }, 15507 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 15508 .write = WRITE_JEDEC1, 15509 .read = READ_MEMMAPPED, 15510 .voltage = {3000, 3600}, 15511 }, 15512 15513 { 15514 .vendor = "PUYA", 15515 .name = "P25Q06H", 15516 .bustype = BUS_SPI, 15517 .manufacture_id = PUYA_ID, 15518 .model_id = PUYA_P25Q06H, 15519 .total_size = 64, 15520 .page_size = 256, 15521 /* supports SFDP */ 15522 /* OTP: 3 x 512 bytes */ 15523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15524 .tested = TEST_UNTESTED, 15525 .probe = PROBE_SPI_RDID, 15526 .probe_timing = TIMING_ZERO, 15527 .block_erasers = 15528 { 15529 { 15530 .eraseblocks = { {256, 256} }, 15531 .block_erase = SPI_BLOCK_ERASE_81, 15532 }, { 15533 .eraseblocks = { {4 * 1024, 16} }, 15534 .block_erase = SPI_BLOCK_ERASE_20, 15535 }, { 15536 .eraseblocks = { {32 * 1024, 2} }, 15537 .block_erase = SPI_BLOCK_ERASE_52, 15538 }, { 15539 .eraseblocks = { {64 * 1024, 1} }, 15540 .block_erase = SPI_BLOCK_ERASE_D8, 15541 }, { 15542 .eraseblocks = { {64 * 1024, 1} }, 15543 .block_erase = SPI_BLOCK_ERASE_60, 15544 }, { 15545 .eraseblocks = { {64 * 1024, 1} }, 15546 .block_erase = SPI_BLOCK_ERASE_C7, 15547 } 15548 }, 15549 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 15550 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 15551 .write = SPI_CHIP_WRITE256, 15552 .read = SPI_CHIP_READ, 15553 .voltage = {2300, 3600}, 15554 }, 15555 15556 { 15557 .vendor = "PUYA", 15558 .name = "P25Q11H", 15559 .bustype = BUS_SPI, 15560 .manufacture_id = PUYA_ID, 15561 .model_id = PUYA_P25Q11H, 15562 .total_size = 128, 15563 .page_size = 256, 15564 /* supports SFDP */ 15565 /* OTP: 3 x 512 bytes */ 15566 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15567 .tested = TEST_UNTESTED, 15568 .probe = PROBE_SPI_RDID, 15569 .probe_timing = TIMING_ZERO, 15570 .block_erasers = 15571 { 15572 { 15573 .eraseblocks = { {256, 512} }, 15574 .block_erase = SPI_BLOCK_ERASE_81, 15575 }, { 15576 .eraseblocks = { {4 * 1024, 32} }, 15577 .block_erase = SPI_BLOCK_ERASE_20, 15578 }, { 15579 .eraseblocks = { {32 * 1024, 4} }, 15580 .block_erase = SPI_BLOCK_ERASE_52, 15581 }, { 15582 .eraseblocks = { {64 * 1024, 2} }, 15583 .block_erase = SPI_BLOCK_ERASE_D8, 15584 }, { 15585 .eraseblocks = { {128 * 1024, 1} }, 15586 .block_erase = SPI_BLOCK_ERASE_60, 15587 }, { 15588 .eraseblocks = { {128 * 1024, 1} }, 15589 .block_erase = SPI_BLOCK_ERASE_C7, 15590 } 15591 }, 15592 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 15593 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 15594 .write = SPI_CHIP_WRITE256, 15595 .read = SPI_CHIP_READ, 15596 .voltage = {2300, 3600}, 15597 }, 15598 15599 { 15600 .vendor = "PUYA", 15601 .name = "P25Q21H", 15602 .bustype = BUS_SPI, 15603 .manufacture_id = PUYA_ID, 15604 .model_id = PUYA_P25Q21H, 15605 .total_size = 256, 15606 .page_size = 256, 15607 /* supports SFDP */ 15608 /* OTP: 3 x 512 bytes */ 15609 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 15610 .tested = TEST_OK_PREW, 15611 .probe = PROBE_SPI_RDID, 15612 .probe_timing = TIMING_ZERO, 15613 .block_erasers = 15614 { 15615 { 15616 .eraseblocks = { {256, 1024} }, 15617 .block_erase = SPI_BLOCK_ERASE_81, 15618 }, { 15619 .eraseblocks = { {4 * 1024, 64} }, 15620 .block_erase = SPI_BLOCK_ERASE_20, 15621 }, { 15622 .eraseblocks = { {32 * 1024, 8} }, 15623 .block_erase = SPI_BLOCK_ERASE_52, 15624 }, { 15625 .eraseblocks = { {64 * 1024, 4} }, 15626 .block_erase = SPI_BLOCK_ERASE_D8, 15627 }, { 15628 .eraseblocks = { {256 * 1024, 1} }, 15629 .block_erase = SPI_BLOCK_ERASE_60, 15630 }, { 15631 .eraseblocks = { {256 * 1024, 1} }, 15632 .block_erase = SPI_BLOCK_ERASE_C7, 15633 } 15634 }, 15635 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 15636 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 15637 .write = SPI_CHIP_WRITE256, 15638 .read = SPI_CHIP_READ, 15639 .voltage = {2300, 3600}, 15640 }, 15641 15642 { 15643 .vendor = "SST", 15644 .name = "SST25LF020A", 15645 .bustype = BUS_SPI, 15646 .manufacture_id = SST_ID, 15647 .model_id = SST_SST25VF020_REMS, 15648 .total_size = 256, 15649 .page_size = 256, 15650 .feature_bits = FEATURE_WRSR_EWSR, 15651 .tested = TEST_OK_PREW, 15652 .probe = PROBE_SPI_REMS, 15653 .probe_timing = TIMING_ZERO, 15654 .block_erasers = 15655 { 15656 { 15657 .eraseblocks = { {4 * 1024, 64} }, 15658 .block_erase = SPI_BLOCK_ERASE_20, 15659 }, { 15660 .eraseblocks = { {32 * 1024, 8} }, 15661 .block_erase = SPI_BLOCK_ERASE_52, 15662 }, { 15663 .eraseblocks = { {256 * 1024, 1} }, 15664 .block_erase = SPI_BLOCK_ERASE_60, 15665 }, 15666 }, 15667 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: No BP2 & 3 */ 15668 .unlock = SPI_DISABLE_BLOCKPROTECT, 15669 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15670 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15671 .voltage = {2700, 3600}, 15672 }, 15673 15674 { 15675 .vendor = "SST", 15676 .name = "SST25LF040A", 15677 .bustype = BUS_SPI, 15678 .manufacture_id = SST_ID, 15679 .model_id = SST_SST25VF040_REMS, 15680 .total_size = 512, 15681 .page_size = 256, 15682 .feature_bits = FEATURE_WRSR_EWSR, 15683 .tested = TEST_OK_PREW, 15684 .probe = PROBE_SPI_RES2, 15685 .probe_timing = TIMING_ZERO, 15686 .block_erasers = 15687 { 15688 { 15689 .eraseblocks = { {4 * 1024, 128} }, 15690 .block_erase = SPI_BLOCK_ERASE_20, 15691 }, { 15692 .eraseblocks = { {32 * 1024, 16} }, 15693 .block_erase = SPI_BLOCK_ERASE_52, 15694 }, { 15695 .eraseblocks = { {512 * 1024, 1} }, 15696 .block_erase = SPI_BLOCK_ERASE_60, 15697 }, 15698 }, 15699 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 15700 .unlock = SPI_DISABLE_BLOCKPROTECT, 15701 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15702 .read = SPI_CHIP_READ, 15703 .voltage = {3000, 3600}, 15704 }, 15705 15706 { 15707 .vendor = "SST", 15708 .name = "SST25LF080(A)", 15709 .bustype = BUS_SPI, 15710 .manufacture_id = SST_ID, 15711 .model_id = SST_SST25VF080_REMS, 15712 .total_size = 1024, 15713 .page_size = 256, 15714 .feature_bits = FEATURE_WRSR_EITHER, 15715 .tested = TEST_UNTESTED, 15716 .probe = PROBE_SPI_RES2, 15717 .probe_timing = TIMING_ZERO, 15718 .block_erasers = 15719 { 15720 { 15721 .eraseblocks = { {4 * 1024, 256} }, 15722 .block_erase = SPI_BLOCK_ERASE_20, 15723 }, { 15724 .eraseblocks = { {32 * 1024, 32} }, 15725 .block_erase = SPI_BLOCK_ERASE_52, 15726 }, { 15727 .eraseblocks = { {1024 * 1024, 1} }, 15728 .block_erase = SPI_BLOCK_ERASE_60, 15729 }, 15730 }, 15731 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 15732 .unlock = SPI_DISABLE_BLOCKPROTECT, 15733 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15734 .read = SPI_CHIP_READ, 15735 .voltage = {3000, 3600}, 15736 }, 15737 15738 { 15739 .vendor = "SST", 15740 .name = "SST25VF010(A)", 15741 .bustype = BUS_SPI, 15742 .manufacture_id = SST_ID, 15743 .model_id = SST_SST25VF010_REMS, 15744 .total_size = 128, 15745 .page_size = 256, 15746 .feature_bits = FEATURE_WRSR_EWSR, 15747 .tested = TEST_OK_PREW, 15748 .probe = PROBE_SPI_REMS, 15749 .probe_timing = TIMING_ZERO, 15750 .block_erasers = 15751 { 15752 { 15753 .eraseblocks = { {4 * 1024, 32} }, 15754 .block_erase = SPI_BLOCK_ERASE_20, 15755 }, { 15756 .eraseblocks = { {32 * 1024, 4} }, 15757 .block_erase = SPI_BLOCK_ERASE_52, 15758 }, { 15759 .eraseblocks = { {32 * 1024, 4} }, 15760 .block_erase = SPI_BLOCK_ERASE_D8, /* Supported by SST25VF010A only */ 15761 }, { 15762 .eraseblocks = { {128 * 1024, 1} }, 15763 .block_erase = SPI_BLOCK_ERASE_60, 15764 }, { 15765 .eraseblocks = { {128 * 1024, 1} }, 15766 .block_erase = SPI_BLOCK_ERASE_C7, /* Supported by SST25VF010A only */ 15767 }, 15768 }, 15769 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: No BP2 & 3 */ 15770 .unlock = SPI_DISABLE_BLOCKPROTECT, 15771 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15772 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported by SST25VF010A only */ 15773 .voltage = {2700, 3600}, 15774 }, 15775 15776 { 15777 .vendor = "SST", 15778 .name = "SST25VF016B", 15779 .bustype = BUS_SPI, 15780 .manufacture_id = SST_ID, 15781 .model_id = SST_SST25VF016B, 15782 .total_size = 2048, 15783 .page_size = 256, 15784 .feature_bits = FEATURE_WRSR_EITHER, 15785 .tested = TEST_OK_PREW, 15786 .probe = PROBE_SPI_RDID, 15787 .probe_timing = TIMING_ZERO, 15788 .block_erasers = 15789 { 15790 { 15791 .eraseblocks = { {4 * 1024, 512} }, 15792 .block_erase = SPI_BLOCK_ERASE_20, 15793 }, { 15794 .eraseblocks = { {32 * 1024, 64} }, 15795 .block_erase = SPI_BLOCK_ERASE_52, 15796 }, { 15797 .eraseblocks = { {64 * 1024, 32} }, 15798 .block_erase = SPI_BLOCK_ERASE_D8, 15799 }, { 15800 .eraseblocks = { {2 * 1024 * 1024, 1} }, 15801 .block_erase = SPI_BLOCK_ERASE_60, 15802 }, { 15803 .eraseblocks = { {2 * 1024 * 1024, 1} }, 15804 .block_erase = SPI_BLOCK_ERASE_C7, 15805 }, 15806 }, 15807 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25VF016, 15808 .unlock = SPI_DISABLE_BLOCKPROTECT, 15809 .write = SPI_WRITE_AAI, 15810 .read = SPI_CHIP_READ, 15811 .voltage = {2700, 3600}, 15812 }, 15813 15814 { 15815 .vendor = "SST", 15816 .name = "SST25VF020", 15817 .bustype = BUS_SPI, 15818 .manufacture_id = SST_ID, 15819 .model_id = SST_SST25VF020_REMS, 15820 .total_size = 256, 15821 .page_size = 256, 15822 .feature_bits = FEATURE_WRSR_EWSR, 15823 .tested = TEST_UNTESTED, 15824 .probe = PROBE_SPI_REMS, 15825 .probe_timing = TIMING_ZERO, 15826 .block_erasers = 15827 { 15828 { 15829 .eraseblocks = { {4 * 1024, 64} }, 15830 .block_erase = SPI_BLOCK_ERASE_20, 15831 }, { 15832 .eraseblocks = { {32 * 1024, 8} }, 15833 .block_erase = SPI_BLOCK_ERASE_52, 15834 }, { 15835 .eraseblocks = { {256 * 1024, 1} }, 15836 .block_erase = SPI_BLOCK_ERASE_60, 15837 }, 15838 }, 15839 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: No BP2 & 3 */ 15840 .unlock = SPI_DISABLE_BLOCKPROTECT, 15841 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15842 .read = SPI_CHIP_READ, /* only */ 15843 .voltage = {2700, 3600}, 15844 }, 15845 15846 { 15847 .vendor = "SST", 15848 .name = "SST25VF020B", 15849 .bustype = BUS_SPI, 15850 .manufacture_id = SST_ID, 15851 .model_id = SST_SST25VF020B, 15852 .total_size = 256, 15853 .page_size = 256, 15854 .feature_bits = FEATURE_WRSR_EWSR, 15855 .tested = TEST_OK_PREW, 15856 .probe = PROBE_SPI_RDID, 15857 .probe_timing = TIMING_ZERO, 15858 .block_erasers = 15859 { 15860 { 15861 .eraseblocks = { {4 * 1024, 64} }, 15862 .block_erase = SPI_BLOCK_ERASE_20, 15863 }, { 15864 .eraseblocks = { {32 * 1024, 8} }, 15865 .block_erase = SPI_BLOCK_ERASE_52, 15866 }, { 15867 .eraseblocks = { {64 * 1024, 4} }, 15868 .block_erase = SPI_BLOCK_ERASE_D8, 15869 }, { 15870 .eraseblocks = { {256 * 1024, 1} }, 15871 .block_erase = SPI_BLOCK_ERASE_60, 15872 }, { 15873 .eraseblocks = { {256 * 1024, 1} }, 15874 .block_erase = SPI_BLOCK_ERASE_C7, 15875 }, 15876 }, 15877 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: No BP2 & 3 and 2nd SR */ 15878 .unlock = SPI_DISABLE_BLOCKPROTECT, /* FIXME: 2nd SR */ 15879 .write = SPI_WRITE_AAI, /* AAI supported (0xAD) */ 15880 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15881 .voltage = {2700, 3600}, 15882 }, 15883 15884 { 15885 .vendor = "SST", 15886 .name = "SST25VF032B", 15887 .bustype = BUS_SPI, 15888 .manufacture_id = SST_ID, 15889 .model_id = SST_SST25VF032B, 15890 .total_size = 4096, 15891 .page_size = 256, 15892 .feature_bits = FEATURE_WRSR_EWSR, 15893 .tested = TEST_OK_PREW, 15894 .probe = PROBE_SPI_RDID, 15895 .probe_timing = TIMING_ZERO, 15896 .block_erasers = 15897 { 15898 { 15899 .eraseblocks = { {4 * 1024, 1024} }, 15900 .block_erase = SPI_BLOCK_ERASE_20, 15901 }, { 15902 .eraseblocks = { {32 * 1024, 128} }, 15903 .block_erase = SPI_BLOCK_ERASE_52, 15904 }, { 15905 .eraseblocks = { {64 * 1024, 64} }, 15906 .block_erase = SPI_BLOCK_ERASE_D8, 15907 }, { 15908 .eraseblocks = { {4 * 1024 * 1024, 1} }, 15909 .block_erase = SPI_BLOCK_ERASE_60, 15910 }, { 15911 .eraseblocks = { {4 * 1024 * 1024, 1} }, 15912 .block_erase = SPI_BLOCK_ERASE_C7, 15913 }, 15914 }, 15915 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 15916 .unlock = SPI_DISABLE_BLOCKPROTECT, 15917 .write = SPI_WRITE_AAI, 15918 .read = SPI_CHIP_READ, 15919 .voltage = {2700, 3600}, 15920 }, 15921 15922 { 15923 .vendor = "SST", 15924 .name = "SST25VF040", 15925 .bustype = BUS_SPI, 15926 .manufacture_id = SST_ID, 15927 .model_id = SST_SST25VF040_REMS, 15928 .total_size = 512, 15929 .page_size = 256, 15930 .feature_bits = FEATURE_WRSR_EWSR, 15931 .tested = TEST_OK_PR, 15932 .probe = PROBE_SPI_REMS, 15933 .probe_timing = TIMING_ZERO, 15934 .block_erasers = 15935 { 15936 { 15937 .eraseblocks = { {4 * 1024, 128} }, 15938 .block_erase = SPI_BLOCK_ERASE_20, 15939 }, { 15940 .eraseblocks = { {32 * 1024, 16} }, 15941 .block_erase = SPI_BLOCK_ERASE_52, 15942 }, { 15943 .eraseblocks = { {512 * 1024, 1} }, 15944 .block_erase = SPI_BLOCK_ERASE_60, 15945 }, 15946 }, 15947 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 15948 .unlock = SPI_DISABLE_BLOCKPROTECT, 15949 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 15950 .read = SPI_CHIP_READ, 15951 .voltage = {2700, 3600}, 15952 }, 15953 15954 { 15955 .vendor = "SST", 15956 .name = "SST25VF040B", 15957 .bustype = BUS_SPI, 15958 .manufacture_id = SST_ID, 15959 .model_id = SST_SST25VF040B, 15960 .total_size = 512, 15961 .page_size = 256, 15962 .feature_bits = FEATURE_WRSR_EWSR, 15963 .tested = TEST_OK_PREW, 15964 .probe = PROBE_SPI_RDID, 15965 .probe_timing = TIMING_ZERO, 15966 .block_erasers = 15967 { 15968 { 15969 .eraseblocks = { {4 * 1024, 128} }, 15970 .block_erase = SPI_BLOCK_ERASE_20, 15971 }, { 15972 .eraseblocks = { {32 * 1024, 16} }, 15973 .block_erase = SPI_BLOCK_ERASE_52, 15974 }, { 15975 .eraseblocks = { {64 * 1024, 8} }, 15976 .block_erase = SPI_BLOCK_ERASE_D8, 15977 }, { 15978 .eraseblocks = { {512 * 1024, 1} }, 15979 .block_erase = SPI_BLOCK_ERASE_60, 15980 }, { 15981 .eraseblocks = { {512 * 1024, 1} }, 15982 .block_erase = SPI_BLOCK_ERASE_C7, 15983 }, 15984 }, 15985 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25VF040B, 15986 .unlock = SPI_DISABLE_BLOCKPROTECT, 15987 .write = SPI_WRITE_AAI, /* AAI supported (0xAD) */ 15988 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 15989 .voltage = {2700, 3600}, 15990 }, 15991 15992 { 15993 .vendor = "SST", 15994 .name = "SST25VF040B.REMS", 15995 .bustype = BUS_SPI, 15996 .manufacture_id = SST_ID, 15997 .model_id = SST_SST25VF040B_REMS, 15998 .total_size = 512, 15999 .page_size = 256, 16000 .feature_bits = FEATURE_WRSR_EWSR, 16001 .tested = TEST_OK_PREW, 16002 .probe = PROBE_SPI_REMS, 16003 .probe_timing = TIMING_ZERO, 16004 .block_erasers = 16005 { 16006 { 16007 .eraseblocks = { {4 * 1024, 128} }, 16008 .block_erase = SPI_BLOCK_ERASE_20, 16009 }, { 16010 .eraseblocks = { {32 * 1024, 16} }, 16011 .block_erase = SPI_BLOCK_ERASE_52, 16012 }, { 16013 .eraseblocks = { {64 * 1024, 8} }, 16014 .block_erase = SPI_BLOCK_ERASE_D8, 16015 }, { 16016 .eraseblocks = { {512 * 1024, 1} }, 16017 .block_erase = SPI_BLOCK_ERASE_60, 16018 }, { 16019 .eraseblocks = { {512 * 1024, 1} }, 16020 .block_erase = SPI_BLOCK_ERASE_C7, 16021 }, 16022 }, 16023 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25VF040B, 16024 .unlock = SPI_DISABLE_BLOCKPROTECT, 16025 .write = SPI_WRITE_AAI, 16026 .read = SPI_CHIP_READ, 16027 .voltage = {2700, 3600}, 16028 }, 16029 16030 { 16031 .vendor = "SST", 16032 .name = "SST25VF064C", 16033 .bustype = BUS_SPI, 16034 .manufacture_id = SST_ID, 16035 .model_id = SST_SST25VF064C, 16036 .total_size = 8192, 16037 .page_size = 256, 16038 .feature_bits = FEATURE_WRSR_EWSR, 16039 .tested = TEST_OK_PREW, 16040 .probe = PROBE_SPI_RDID, 16041 .probe_timing = TIMING_ZERO, 16042 .block_erasers = 16043 { 16044 { 16045 .eraseblocks = { {4 * 1024, 2048} }, 16046 .block_erase = SPI_BLOCK_ERASE_20, 16047 }, { 16048 .eraseblocks = { {32 * 1024, 256} }, 16049 .block_erase = SPI_BLOCK_ERASE_52, 16050 }, { 16051 .eraseblocks = { {64 * 1024, 128} }, 16052 .block_erase = SPI_BLOCK_ERASE_D8, 16053 }, { 16054 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16055 .block_erase = SPI_BLOCK_ERASE_60, 16056 }, { 16057 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16058 .block_erase = SPI_BLOCK_ERASE_C7, 16059 }, 16060 }, 16061 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 16062 .unlock = SPI_DISABLE_BLOCKPROTECT, 16063 .write = SPI_CHIP_WRITE256, 16064 .read = SPI_CHIP_READ, 16065 .voltage = {2700, 3600}, 16066 }, 16067 16068 { 16069 .vendor = "SST", 16070 .name = "SST25VF080B", 16071 .bustype = BUS_SPI, 16072 .manufacture_id = SST_ID, 16073 .model_id = SST_SST25VF080B, 16074 .total_size = 1024, 16075 .page_size = 256, 16076 .feature_bits = FEATURE_WRSR_EWSR, 16077 .tested = TEST_OK_PREW, 16078 .probe = PROBE_SPI_RDID, 16079 .probe_timing = TIMING_ZERO, 16080 .block_erasers = 16081 { 16082 { 16083 .eraseblocks = { {4 * 1024, 256} }, 16084 .block_erase = SPI_BLOCK_ERASE_20, 16085 }, { 16086 .eraseblocks = { {32 * 1024, 32} }, 16087 .block_erase = SPI_BLOCK_ERASE_52, 16088 }, { 16089 .eraseblocks = { {64 * 1024, 16} }, 16090 .block_erase = SPI_BLOCK_ERASE_D8, 16091 }, { 16092 .eraseblocks = { {1024 * 1024, 1} }, 16093 .block_erase = SPI_BLOCK_ERASE_60, 16094 }, { 16095 .eraseblocks = { {1024 * 1024, 1} }, 16096 .block_erase = SPI_BLOCK_ERASE_C7, 16097 }, 16098 }, 16099 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* TODO: check */ 16100 .unlock = SPI_DISABLE_BLOCKPROTECT, 16101 .write = SPI_WRITE_AAI, 16102 .read = SPI_CHIP_READ, 16103 .voltage = {2700, 3600}, 16104 }, 16105 16106 { 16107 .vendor = "SST", 16108 .name = "SST25VF512(A)", 16109 .bustype = BUS_SPI, 16110 .manufacture_id = SST_ID, 16111 .model_id = SST_SST25VF512_REMS, 16112 .total_size = 64, 16113 .page_size = 256, 16114 .feature_bits = FEATURE_WRSR_EWSR, 16115 .tested = TEST_OK_PREW, 16116 .probe = PROBE_SPI_REMS, 16117 .probe_timing = TIMING_ZERO, 16118 .block_erasers = 16119 { 16120 { 16121 .eraseblocks = { {4 * 1024, 16} }, 16122 .block_erase = SPI_BLOCK_ERASE_20, 16123 }, { 16124 .eraseblocks = { {32 * 1024, 2} }, 16125 .block_erase = SPI_BLOCK_ERASE_52, 16126 }, { 16127 .eraseblocks = { {32 * 1024, 2} }, 16128 .block_erase = SPI_BLOCK_ERASE_D8, /* Supported by SST25VF512A only */ 16129 }, { 16130 .eraseblocks = { {64 * 1024, 1} }, 16131 .block_erase = SPI_BLOCK_ERASE_60, 16132 }, { 16133 .eraseblocks = { {64 * 1024, 1} }, 16134 .block_erase = SPI_BLOCK_ERASE_C7, /* Supported by SST25VF512A only */ 16135 }, 16136 }, 16137 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: No BP2 & 3 */ 16138 .unlock = SPI_DISABLE_BLOCKPROTECT, 16139 .write = SPI_CHIP_WRITE1, /* AAI supported, but opcode is 0xAF */ 16140 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported by SST25VF512A only */ 16141 .voltage = {2700, 3600}, 16142 }, 16143 16144 { 16145 .vendor = "SST", 16146 .name = "SST25WF010", 16147 .bustype = BUS_SPI, 16148 .manufacture_id = SST_ID, 16149 .model_id = SST_SST25WF010, 16150 .total_size = 128, 16151 .page_size = 256, 16152 .feature_bits = FEATURE_WRSR_EITHER, 16153 .tested = TEST_UNTESTED, 16154 .probe = PROBE_SPI_RDID, 16155 .probe_timing = TIMING_ZERO, 16156 .block_erasers = 16157 { 16158 { 16159 .eraseblocks = { {4 * 1024, 32} }, 16160 .block_erase = SPI_BLOCK_ERASE_20, 16161 }, { 16162 .eraseblocks = { {32 * 1024, 4} }, 16163 .block_erase = SPI_BLOCK_ERASE_52, 16164 }, { 16165 .eraseblocks = { {1024 * 128, 1} }, 16166 .block_erase = SPI_BLOCK_ERASE_60, 16167 }, { 16168 .eraseblocks = { {1024 * 128, 1} }, 16169 .block_erase = SPI_BLOCK_ERASE_C7, 16170 }, 16171 }, 16172 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: does not have a BP3 */ 16173 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16174 .write = SPI_WRITE_AAI, 16175 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16176 .voltage = {1650, 1950}, 16177 }, 16178 16179 { 16180 .vendor = "SST", 16181 .name = "SST25WF020", 16182 .bustype = BUS_SPI, 16183 .manufacture_id = SST_ID, 16184 .model_id = SST_SST25WF020, 16185 .total_size = 256, 16186 .page_size = 256, 16187 .feature_bits = FEATURE_WRSR_EITHER, 16188 .tested = TEST_UNTESTED, 16189 .probe = PROBE_SPI_RDID, 16190 .probe_timing = TIMING_ZERO, 16191 .block_erasers = 16192 { 16193 { 16194 .eraseblocks = { {4 * 1024, 64} }, 16195 .block_erase = SPI_BLOCK_ERASE_20, 16196 }, { 16197 .eraseblocks = { {32 * 1024, 8} }, 16198 .block_erase = SPI_BLOCK_ERASE_52, 16199 }, { 16200 .eraseblocks = { {64 * 1024, 4} }, 16201 .block_erase = SPI_BLOCK_ERASE_D8, 16202 }, { 16203 .eraseblocks = { {1024 * 256, 1} }, 16204 .block_erase = SPI_BLOCK_ERASE_60, 16205 }, { 16206 .eraseblocks = { {1024 * 256, 1} }, 16207 .block_erase = SPI_BLOCK_ERASE_C7, 16208 }, 16209 }, 16210 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: does not have a BP3 */ 16211 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16212 .write = SPI_WRITE_AAI, 16213 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16214 .voltage = {1650, 1950}, 16215 }, 16216 16217 { 16218 .vendor = "SST", 16219 .name = "SST25WF020A", 16220 .bustype = BUS_SPI, 16221 .manufacture_id = SANYO_ID, /* See flashchips.h */ 16222 .model_id = SST_SST25WF020A, 16223 .total_size = 256, 16224 .page_size = 256, 16225 .feature_bits = FEATURE_WRSR_WREN, 16226 .tested = TEST_UNTESTED, 16227 .probe = PROBE_SPI_RDID, 16228 .probe_timing = TIMING_ZERO, 16229 .block_erasers = 16230 { 16231 { 16232 .eraseblocks = { {4 * 1024, 64} }, 16233 .block_erase = SPI_BLOCK_ERASE_20, 16234 }, { 16235 .eraseblocks = { {64 * 1024, 4} }, 16236 .block_erase = SPI_BLOCK_ERASE_D8, 16237 }, { 16238 .eraseblocks = { {256 * 1024, 1} }, 16239 .block_erase = SPI_BLOCK_ERASE_60, 16240 }, { 16241 .eraseblocks = { {256 * 1024, 1} }, 16242 .block_erase = SPI_BLOCK_ERASE_C7, 16243 }, 16244 }, 16245 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 16246 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16247 .write = SPI_CHIP_WRITE256, 16248 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16249 .voltage = {1650, 1950}, 16250 }, 16251 16252 { 16253 .vendor = "SST", 16254 .name = "SST25WF040", 16255 .bustype = BUS_SPI, 16256 .manufacture_id = SST_ID, 16257 .model_id = SST_SST25WF040, 16258 .total_size = 512, 16259 .page_size = 256, 16260 .feature_bits = FEATURE_WRSR_EITHER, 16261 .tested = TEST_UNTESTED, 16262 .probe = PROBE_SPI_RDID, 16263 .probe_timing = TIMING_ZERO, 16264 .block_erasers = 16265 { 16266 { 16267 .eraseblocks = { {4 * 1024, 128} }, 16268 .block_erase = SPI_BLOCK_ERASE_20, 16269 }, { 16270 .eraseblocks = { {32 * 1024, 16} }, 16271 .block_erase = SPI_BLOCK_ERASE_52, 16272 }, { 16273 .eraseblocks = { {64 * 1024, 8} }, 16274 .block_erase = SPI_BLOCK_ERASE_D8, 16275 }, { 16276 .eraseblocks = { {1024 * 512, 1} }, 16277 .block_erase = SPI_BLOCK_ERASE_60, 16278 }, { 16279 .eraseblocks = { {1024 * 512, 1} }, 16280 .block_erase = SPI_BLOCK_ERASE_C7, 16281 }, 16282 }, 16283 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: does not have a BP3 */ 16284 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16285 .write = SPI_WRITE_AAI, 16286 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16287 .voltage = {1650, 1950}, 16288 }, 16289 16290 { 16291 .vendor = "SST", 16292 .name = "SST25WF040B", 16293 .bustype = BUS_SPI, 16294 .manufacture_id = SANYO_ID, /* See flashchips.h */ 16295 .model_id = SST_SST25WF040B, 16296 .total_size = 512, 16297 .page_size = 256, 16298 .feature_bits = FEATURE_WRSR_WREN, 16299 .tested = TEST_UNTESTED, 16300 .probe = PROBE_SPI_RDID, 16301 .probe_timing = TIMING_ZERO, 16302 .block_erasers = 16303 { 16304 { 16305 .eraseblocks = { {4 * 1024, 128} }, 16306 .block_erase = SPI_BLOCK_ERASE_20, 16307 }, { 16308 .eraseblocks = { {64 * 1024, 8} }, 16309 .block_erase = SPI_BLOCK_ERASE_D8, 16310 }, { 16311 .eraseblocks = { {512 * 1024, 1} }, 16312 .block_erase = SPI_BLOCK_ERASE_60, 16313 }, { 16314 .eraseblocks = { {512 * 1024, 1} }, 16315 .block_erase = SPI_BLOCK_ERASE_C7, 16316 }, 16317 }, 16318 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 16319 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16320 .write = SPI_CHIP_WRITE256, 16321 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */ 16322 .voltage = {1650, 1950}, 16323 }, 16324 16325 { 16326 .vendor = "SST", 16327 .name = "SST25WF080", 16328 .bustype = BUS_SPI, 16329 .manufacture_id = SST_ID, 16330 .model_id = SST_SST25WF080, 16331 .total_size = 1024, 16332 .page_size = 256, 16333 .feature_bits = FEATURE_WRSR_EITHER, 16334 .tested = TEST_OK_PREW, 16335 .probe = PROBE_SPI_RDID, 16336 .probe_timing = TIMING_ZERO, 16337 .block_erasers = 16338 { 16339 { 16340 .eraseblocks = { {4 * 1024, 256} }, 16341 .block_erase = SPI_BLOCK_ERASE_20, 16342 }, { 16343 .eraseblocks = { {32 * 1024, 32} }, 16344 .block_erase = SPI_BLOCK_ERASE_52, 16345 }, { 16346 .eraseblocks = { {64 * 1024, 16} }, 16347 .block_erase = SPI_BLOCK_ERASE_D8, 16348 }, { 16349 .eraseblocks = { {1024 * 1024, 1} }, 16350 .block_erase = SPI_BLOCK_ERASE_60, 16351 }, { 16352 .eraseblocks = { {1024 * 1024, 1} }, 16353 .block_erase = SPI_BLOCK_ERASE_C7, 16354 }, 16355 }, 16356 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* *does* have a BP3 but it is useless */ 16357 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 16358 .write = SPI_WRITE_AAI, 16359 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16360 .voltage = {1650, 1950}, 16361 }, 16362 16363 { 16364 .vendor = "SST", 16365 .name = "SST25WF080B", 16366 .bustype = BUS_SPI, 16367 .manufacture_id = SANYO_ID, /* See flashchips.h */ 16368 .model_id = SST_SST25WF080B, 16369 .total_size = 1024, 16370 .page_size = 256, 16371 .feature_bits = FEATURE_WRSR_WREN, 16372 .tested = TEST_OK_PREW, 16373 .probe = PROBE_SPI_RDID, 16374 .probe_timing = TIMING_ZERO, 16375 .block_erasers = 16376 { 16377 { 16378 .eraseblocks = { {4 * 1024, 256} }, 16379 .block_erase = SPI_BLOCK_ERASE_20, 16380 }, { 16381 .eraseblocks = { {64 * 1024, 16} }, 16382 .block_erase = SPI_BLOCK_ERASE_D8, 16383 }, { 16384 .eraseblocks = { {1024 * 1024, 1} }, 16385 .block_erase = SPI_BLOCK_ERASE_60, 16386 }, { 16387 .eraseblocks = { {1024 * 1024, 1} }, 16388 .block_erase = SPI_BLOCK_ERASE_C7, 16389 }, 16390 }, 16391 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 16392 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16393 .write = SPI_CHIP_WRITE256, 16394 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */ 16395 .voltage = {1650, 1950}, 16396 }, 16397 16398 { 16399 .vendor = "SST", 16400 .name = "SST25WF512", 16401 .bustype = BUS_SPI, 16402 .manufacture_id = SST_ID, 16403 .model_id = SST_SST25WF512, 16404 .total_size = 64, 16405 .page_size = 256, 16406 .feature_bits = FEATURE_WRSR_EITHER, 16407 .tested = TEST_UNTESTED, 16408 .probe = PROBE_SPI_RDID, 16409 .probe_timing = TIMING_ZERO, 16410 .block_erasers = 16411 { 16412 { 16413 .eraseblocks = { {4 * 1024, 16} }, 16414 .block_erase = SPI_BLOCK_ERASE_20, 16415 }, { 16416 .eraseblocks = { {32 * 1024, 2} }, 16417 .block_erase = SPI_BLOCK_ERASE_52, 16418 }, { 16419 .eraseblocks = { {1024 * 64, 1} }, 16420 .block_erase = SPI_BLOCK_ERASE_60, 16421 }, { 16422 .eraseblocks = { {1024 * 64, 1} }, 16423 .block_erase = SPI_BLOCK_ERASE_C7, 16424 }, 16425 }, 16426 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SST25, /* FIXME: does not have a BP3 */ 16427 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 16428 .write = SPI_WRITE_AAI, 16429 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 16430 .voltage = {1650, 1950}, 16431 }, 16432 16433 { 16434 .vendor = "SST", 16435 .name = "SST26VF016B(A)", 16436 .bustype = BUS_SPI, 16437 .manufacture_id = SST_ID, 16438 .model_id = SST_SST26VF016B, 16439 .total_size = 2048, 16440 .page_size = 256, 16441 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16442 .tested = TEST_OK_PREW, 16443 .probe = PROBE_SPI_RDID, 16444 .probe_timing = TIMING_ZERO, 16445 .block_erasers = 16446 { 16447 { 16448 .eraseblocks = { {4 * 1024, 512} }, 16449 .block_erase = SPI_BLOCK_ERASE_20, 16450 }, { 16451 .eraseblocks = { 16452 {8 * 1024, 4}, 16453 {32 * 1024, 1}, 16454 {64 * 1024, 30}, 16455 {32 * 1024, 1}, 16456 {8 * 1024, 4}, 16457 }, 16458 .block_erase = SPI_BLOCK_ERASE_D8, 16459 }, { 16460 .eraseblocks = { {2 * 1024 * 1024, 1} }, 16461 .block_erase = SPI_BLOCK_ERASE_C7, 16462 }, 16463 }, 16464 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 16465 .unlock = SPI_DISABLE_BLOCKPROTECT_SST26_GLOBAL_UNPROTECT, 16466 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 16467 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 16468 .voltage = {2700, 3600}, 16469 }, 16470 16471 { 16472 .vendor = "SST", 16473 .name = "SST26VF032B(A)", 16474 .bustype = BUS_SPI, 16475 .manufacture_id = SST_ID, 16476 .model_id = SST_SST26VF032B, 16477 .total_size = 4096, 16478 .page_size = 256, 16479 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16480 .tested = TEST_UNTESTED, 16481 .probe = PROBE_SPI_RDID, 16482 .probe_timing = TIMING_ZERO, 16483 .block_erasers = 16484 { 16485 { 16486 .eraseblocks = { {4 * 1024, 1024} }, 16487 .block_erase = SPI_BLOCK_ERASE_20, 16488 }, { 16489 .eraseblocks = { 16490 {8 * 1024, 4}, 16491 {32 * 1024, 1}, 16492 {64 * 1024, 62}, 16493 {32 * 1024, 1}, 16494 {8 * 1024, 4}, 16495 }, 16496 .block_erase = SPI_BLOCK_ERASE_D8, 16497 }, { 16498 .eraseblocks = { {4 * 1024 * 1024, 1} }, 16499 .block_erase = SPI_BLOCK_ERASE_C7, 16500 }, 16501 }, 16502 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 16503 .unlock = SPI_DISABLE_BLOCKPROTECT_SST26_GLOBAL_UNPROTECT, 16504 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 16505 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 16506 .voltage = {2700, 3600}, 16507 }, 16508 16509 { 16510 .vendor = "SST", 16511 .name = "SST26VF064B(A)", 16512 .bustype = BUS_SPI, 16513 .manufacture_id = SST_ID, 16514 .model_id = SST_SST26VF064B, 16515 .total_size = 8192, 16516 .page_size = 256, 16517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 16518 .tested = TEST_OK_PREW, 16519 .probe = PROBE_SPI_RDID, 16520 .probe_timing = TIMING_ZERO, 16521 .block_erasers = 16522 { 16523 { 16524 .eraseblocks = { {4 * 1024, 2048} }, 16525 .block_erase = SPI_BLOCK_ERASE_20, 16526 }, { 16527 .eraseblocks = { 16528 {8 * 1024, 4}, 16529 {32 * 1024, 1}, 16530 {64 * 1024, 126}, 16531 {32 * 1024, 1}, 16532 {8 * 1024, 4}, 16533 }, 16534 .block_erase = SPI_BLOCK_ERASE_D8, 16535 }, { 16536 .eraseblocks = { {8 * 1024 * 1024, 1} }, 16537 .block_erase = SPI_BLOCK_ERASE_C7, 16538 }, 16539 }, 16540 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 16541 .unlock = SPI_DISABLE_BLOCKPROTECT_SST26_GLOBAL_UNPROTECT, 16542 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 16543 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 16544 .voltage = {2700, 3600}, 16545 }, 16546 16547 { 16548 .vendor = "SST", 16549 .name = "SST28SF040A", 16550 .bustype = BUS_PARALLEL, 16551 .manufacture_id = SST_ID, 16552 .model_id = SST_SST28SF040, 16553 .total_size = 512, 16554 .page_size = 256, 16555 .feature_bits = 0, 16556 .tested = TEST_UNTESTED, 16557 .probe = PROBE_AT82802AB, 16558 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */ 16559 .block_erasers = 16560 { 16561 { 16562 .eraseblocks = { {128, 4096} }, 16563 .block_erase = ERASE_SECTOR_28SF040, 16564 }, { 16565 .eraseblocks = { {512 * 1024, 1} }, 16566 .block_erase = ERASE_CHIP_28SF040, 16567 } 16568 }, 16569 .unlock = UNPROTECT_28SF040, 16570 .write = WRITE_28SF040, 16571 .read = READ_MEMMAPPED, 16572 .voltage = {4500, 5500}, 16573 }, 16574 16575 { 16576 .vendor = "SST", 16577 .name = "SST29EE010", 16578 .bustype = BUS_PARALLEL, 16579 .manufacture_id = SST_ID, 16580 .model_id = SST_SST29EE010, 16581 .total_size = 128, 16582 .page_size = 128, 16583 .feature_bits = FEATURE_LONG_RESET, 16584 .tested = TEST_OK_PR, 16585 .probe = PROBE_JEDEC, 16586 .probe_timing = 10, 16587 .block_erasers = 16588 { 16589 { 16590 .eraseblocks = { {128 * 1024, 1} }, 16591 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16592 } 16593 }, 16594 .write = WRITE_JEDEC, 16595 .read = READ_MEMMAPPED, 16596 .voltage = {4500, 5500}, 16597 }, 16598 16599 { 16600 .vendor = "SST", 16601 .name = "SST29EE020A", 16602 .bustype = BUS_PARALLEL, 16603 .manufacture_id = SST_ID, 16604 .model_id = SST_SST29EE020A, 16605 .total_size = 256, 16606 .page_size = 128, 16607 .feature_bits = FEATURE_LONG_RESET, 16608 .tested = TEST_OK_PRE, 16609 .probe = PROBE_JEDEC, 16610 .probe_timing = 10, 16611 .block_erasers = 16612 { 16613 { 16614 .eraseblocks = { {256 * 1024, 1} }, 16615 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16616 } 16617 }, 16618 .write = WRITE_JEDEC, 16619 .read = READ_MEMMAPPED, 16620 .voltage = {4500, 5500}, 16621 }, 16622 16623 { 16624 .vendor = "SST", 16625 .name = "SST29LE010", 16626 .bustype = BUS_PARALLEL, 16627 .manufacture_id = SST_ID, 16628 .model_id = SST_SST29LE010, 16629 .total_size = 128, 16630 .page_size = 128, 16631 .feature_bits = FEATURE_LONG_RESET, 16632 .tested = TEST_UNTESTED, 16633 .probe = PROBE_JEDEC, 16634 .probe_timing = 10, 16635 .block_erasers = 16636 { 16637 { 16638 .eraseblocks = { {128 * 1024, 1} }, 16639 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16640 } 16641 }, 16642 .write = WRITE_JEDEC, 16643 .read = READ_MEMMAPPED, 16644 .voltage = {3000, 3600}, 16645 }, 16646 16647 { 16648 .vendor = "SST", 16649 .name = "SST29LE020", 16650 .bustype = BUS_PARALLEL, 16651 .manufacture_id = SST_ID, 16652 .model_id = SST_SST29LE020, 16653 .total_size = 256, 16654 .page_size = 128, 16655 .feature_bits = FEATURE_LONG_RESET, 16656 .tested = TEST_OK_PRE, 16657 .probe = PROBE_JEDEC, 16658 .probe_timing = 10, 16659 .block_erasers = 16660 { 16661 { 16662 .eraseblocks = { {256 * 1024, 1} }, 16663 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16664 } 16665 }, 16666 .write = WRITE_JEDEC, 16667 .read = READ_MEMMAPPED, 16668 .voltage = {3000, 3600}, 16669 }, 16670 16671 { 16672 .vendor = "SST", 16673 .name = "SST39SF010A", 16674 .bustype = BUS_PARALLEL, 16675 .manufacture_id = SST_ID, 16676 .model_id = SST_SST39SF010, 16677 .total_size = 128, 16678 .page_size = 4096, 16679 .feature_bits = FEATURE_EITHER_RESET, 16680 .tested = TEST_OK_PREW, 16681 .probe = PROBE_JEDEC, 16682 .probe_timing = 1, /* 150 ns */ 16683 .block_erasers = 16684 { 16685 { 16686 .eraseblocks = { {4 * 1024, 32} }, 16687 .block_erase = JEDEC_SECTOR_ERASE, 16688 }, { 16689 .eraseblocks = { {128 * 1024, 1} }, 16690 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16691 } 16692 }, 16693 .write = WRITE_JEDEC1, 16694 .read = READ_MEMMAPPED, 16695 .voltage = {4500, 5500}, 16696 }, 16697 16698 { 16699 .vendor = "SST", 16700 .name = "SST39SF020A", 16701 .bustype = BUS_PARALLEL, 16702 .manufacture_id = SST_ID, 16703 .model_id = SST_SST39SF020, 16704 .total_size = 256, 16705 .page_size = 4096, 16706 .feature_bits = FEATURE_EITHER_RESET, 16707 .tested = TEST_OK_PREW, 16708 .probe = PROBE_JEDEC, 16709 .probe_timing = 1, /* 150 ns */ 16710 .block_erasers = 16711 { 16712 { 16713 .eraseblocks = { {4 * 1024, 64} }, 16714 .block_erase = JEDEC_SECTOR_ERASE, 16715 }, { 16716 .eraseblocks = { {256 * 1024, 1} }, 16717 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16718 } 16719 }, 16720 .write = WRITE_JEDEC1, 16721 .read = READ_MEMMAPPED, 16722 .voltage = {4500, 5500}, 16723 }, 16724 16725 { 16726 .vendor = "SST", 16727 .name = "SST39SF040", 16728 .bustype = BUS_PARALLEL, 16729 .manufacture_id = SST_ID, 16730 .model_id = SST_SST39SF040, 16731 .total_size = 512, 16732 .page_size = 4096, 16733 .feature_bits = FEATURE_EITHER_RESET, 16734 .tested = TEST_OK_PREW, 16735 .probe = PROBE_JEDEC, 16736 .probe_timing = 1, /* 150 ns */ 16737 .block_erasers = 16738 { 16739 { 16740 .eraseblocks = { {4 * 1024, 128} }, 16741 .block_erase = JEDEC_SECTOR_ERASE, 16742 }, { 16743 .eraseblocks = { {512 * 1024, 1} }, 16744 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16745 } 16746 }, 16747 .write = WRITE_JEDEC1, 16748 .read = READ_MEMMAPPED, 16749 .voltage = {4500, 5500}, 16750 }, 16751 16752 { 16753 .vendor = "SST", 16754 .name = "SST39SF512", 16755 .bustype = BUS_PARALLEL, 16756 .manufacture_id = SST_ID, 16757 .model_id = SST_SST39SF512, 16758 .total_size = 64, 16759 .page_size = 4096, 16760 .feature_bits = FEATURE_EITHER_RESET, 16761 .tested = TEST_OK_PREW, 16762 .probe = PROBE_JEDEC, 16763 .probe_timing = 1, /* 150 ns */ 16764 .block_erasers = 16765 { 16766 { 16767 .eraseblocks = { {4 * 1024, 16} }, 16768 .block_erase = JEDEC_SECTOR_ERASE, 16769 }, { 16770 .eraseblocks = { {64 * 1024, 1} }, 16771 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16772 } 16773 }, 16774 .write = WRITE_JEDEC1, 16775 .read = READ_MEMMAPPED, 16776 .voltage = {4500, 5500}, 16777 }, 16778 16779 { 16780 .vendor = "SST", 16781 .name = "SST39VF010", 16782 .bustype = BUS_PARALLEL, 16783 .manufacture_id = SST_ID, 16784 .model_id = SST_SST39VF010, 16785 .total_size = 128, 16786 .page_size = 4096, 16787 .feature_bits = FEATURE_EITHER_RESET, 16788 .tested = TEST_OK_PREW, 16789 .probe = PROBE_JEDEC, 16790 .probe_timing = 1, /* 150 ns */ 16791 .block_erasers = 16792 { 16793 { 16794 .eraseblocks = { {4 * 1024, 32} }, 16795 .block_erase = JEDEC_SECTOR_ERASE, 16796 }, { 16797 .eraseblocks = { {128 * 1024, 1} }, 16798 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16799 } 16800 }, 16801 .write = WRITE_JEDEC1, 16802 .read = READ_MEMMAPPED, 16803 .voltage = {2700, 3600}, 16804 }, 16805 16806 { 16807 .vendor = "SST", 16808 .name = "SST39VF020", 16809 .bustype = BUS_PARALLEL, 16810 .manufacture_id = SST_ID, 16811 .model_id = SST_SST39VF020, 16812 .total_size = 256, 16813 .page_size = 4096, 16814 .feature_bits = FEATURE_EITHER_RESET, 16815 .tested = TEST_OK_PREW, 16816 .probe = PROBE_JEDEC, 16817 .probe_timing = 1, /* 150 ns */ 16818 .block_erasers = 16819 { 16820 { 16821 .eraseblocks = { {4 * 1024, 64} }, 16822 .block_erase = JEDEC_SECTOR_ERASE, 16823 }, { 16824 .eraseblocks = { {256 * 1024, 1} }, 16825 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16826 } 16827 }, 16828 .write = WRITE_JEDEC1, 16829 .read = READ_MEMMAPPED, 16830 .voltage = {2700, 3600}, 16831 }, 16832 16833 { 16834 .vendor = "SST", 16835 .name = "SST39VF040", 16836 .bustype = BUS_PARALLEL, 16837 .manufacture_id = SST_ID, 16838 .model_id = SST_SST39VF040, 16839 .total_size = 512, 16840 .page_size = 4096, 16841 .feature_bits = FEATURE_EITHER_RESET, 16842 .tested = TEST_OK_PREW, 16843 .probe = PROBE_JEDEC, 16844 .probe_timing = 1, /* 150 ns */ 16845 .block_erasers = 16846 { 16847 { 16848 .eraseblocks = { {4 * 1024, 128} }, 16849 .block_erase = JEDEC_SECTOR_ERASE, 16850 }, { 16851 .eraseblocks = { {512 * 1024, 1} }, 16852 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16853 } 16854 }, 16855 .write = WRITE_JEDEC1, 16856 .read = READ_MEMMAPPED, 16857 .voltage = {2700, 3600}, 16858 }, 16859 16860 { 16861 .vendor = "SST", 16862 .name = "SST39VF080", 16863 .bustype = BUS_PARALLEL, 16864 .manufacture_id = SST_ID, 16865 .model_id = SST_SST39VF080, 16866 .total_size = 1024, 16867 .page_size = 4096, 16868 .feature_bits = FEATURE_EITHER_RESET, 16869 .tested = TEST_UNTESTED, 16870 .probe = PROBE_JEDEC, 16871 .probe_timing = 1, /* 150 ns */ 16872 .block_erasers = 16873 { 16874 { 16875 .eraseblocks = { {4 * 1024, 256} }, 16876 .block_erase = JEDEC_SECTOR_ERASE, 16877 }, { 16878 .eraseblocks = { {64 * 1024, 16} }, 16879 .block_erase = JEDEC_BLOCK_ERASE, 16880 }, { 16881 .eraseblocks = { {1024 * 1024, 1} }, 16882 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16883 } 16884 }, 16885 .write = WRITE_JEDEC1, 16886 .read = READ_MEMMAPPED, 16887 .voltage = {2700, 3600}, 16888 }, 16889 16890 { 16891 .vendor = "SST", 16892 .name = "SST39VF512", 16893 .bustype = BUS_PARALLEL, 16894 .manufacture_id = SST_ID, 16895 .model_id = SST_SST39VF512, 16896 .total_size = 64, 16897 .page_size = 4096, 16898 .feature_bits = FEATURE_EITHER_RESET, 16899 .tested = TEST_OK_PREW, 16900 .probe = PROBE_JEDEC, 16901 .probe_timing = 1, /* 150 ns */ 16902 .block_erasers = 16903 { 16904 { 16905 .eraseblocks = { {4 * 1024, 16} }, 16906 .block_erase = JEDEC_SECTOR_ERASE, 16907 }, { 16908 .eraseblocks = { {64 * 1024, 1} }, 16909 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 16910 } 16911 }, 16912 .write = WRITE_JEDEC1, 16913 .read = READ_MEMMAPPED, 16914 .voltage = {2700, 3600}, 16915 }, 16916 16917 { 16918 .vendor = "SST", 16919 .name = "SST49LF002A/B", 16920 .bustype = BUS_FWH, /* A/A Mux */ 16921 .manufacture_id = SST_ID, 16922 .model_id = SST_SST49LF002A, 16923 .total_size = 256, 16924 .page_size = 16 * 1024, 16925 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 16926 .tested = TEST_OK_PREW, 16927 .probe = PROBE_JEDEC, 16928 .probe_timing = 1, /* 150 ns */ 16929 .block_erasers = 16930 { 16931 { 16932 .eraseblocks = { {4 * 1024, 64} }, 16933 .block_erase = JEDEC_SECTOR_ERASE, 16934 }, { 16935 .eraseblocks = { {16 * 1024, 16} }, 16936 .block_erase = JEDEC_BLOCK_ERASE, 16937 }, { 16938 .eraseblocks = { {256 * 1024, 1} }, 16939 .block_erase = NO_BLOCK_ERASE_FUNC, /* AA 55 80 AA 55 10, only in A/A mux mode */ 16940 } 16941 }, 16942 .printlock = PRINTLOCK_SST_FWHUB, 16943 .unlock = UNLOCK_SST_FWHUB, 16944 .write = WRITE_JEDEC1, 16945 .read = READ_MEMMAPPED, 16946 .voltage = {3000, 3600}, 16947 }, 16948 16949 { 16950 .vendor = "SST", 16951 .name = "SST49LF003A/B", 16952 .bustype = BUS_FWH, /* A/A Mux */ 16953 .manufacture_id = SST_ID, 16954 .model_id = SST_SST49LF003A, 16955 .total_size = 384, 16956 .page_size = 64 * 1024, 16957 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 16958 .tested = TEST_OK_PREW, 16959 .probe = PROBE_JEDEC, 16960 .probe_timing = 1, /* 150 ns */ 16961 .block_erasers = 16962 { 16963 { 16964 .eraseblocks = { {4 * 1024, 96} }, 16965 .block_erase = JEDEC_SECTOR_ERASE, 16966 }, { 16967 .eraseblocks = { {64 * 1024, 6} }, 16968 .block_erase = JEDEC_BLOCK_ERASE, 16969 }, { 16970 .eraseblocks = { {384 * 1024, 1} }, 16971 .block_erase = NO_BLOCK_ERASE_FUNC, /* AA 55 80 AA 55 10, only in A/A mux mode */ 16972 } 16973 }, 16974 .printlock = PRINTLOCK_SST_FWHUB, 16975 .unlock = UNLOCK_SST_FWHUB, 16976 .write = WRITE_JEDEC1, 16977 .read = READ_MEMMAPPED, 16978 .voltage = {3000, 3600}, 16979 }, 16980 16981 { 16982 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB) 16983 * and is only honored for 64k block erase, but not 4k sector erase. 16984 */ 16985 .vendor = "SST", 16986 .name = "SST49LF004A/B", 16987 .bustype = BUS_FWH, /* A/A Mux */ 16988 .manufacture_id = SST_ID, 16989 .model_id = SST_SST49LF004A, 16990 .total_size = 512, 16991 .page_size = 64 * 1024, 16992 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 16993 .tested = TEST_OK_PREW, 16994 .probe = PROBE_JEDEC, 16995 .probe_timing = 1, /* 150 ns */ 16996 .block_erasers = 16997 { 16998 { 16999 .eraseblocks = { {4 * 1024, 128} }, 17000 .block_erase = JEDEC_SECTOR_ERASE, 17001 }, { 17002 .eraseblocks = { {64 * 1024, 8} }, 17003 .block_erase = JEDEC_BLOCK_ERASE, 17004 }, { 17005 .eraseblocks = { {512 * 1024, 1} }, 17006 .block_erase = NO_BLOCK_ERASE_FUNC, /* AA 55 80 AA 55 10, only in A/A mux mode */ 17007 }, 17008 }, 17009 .printlock = PRINTLOCK_SST_FWHUB, 17010 .unlock = UNLOCK_SST_FWHUB, 17011 .write = WRITE_JEDEC1, 17012 .read = READ_MEMMAPPED, 17013 .voltage = {3000, 3600}, 17014 }, 17015 17016 { 17017 .vendor = "SST", 17018 .name = "SST49LF004C", 17019 .bustype = BUS_FWH, 17020 .manufacture_id = SST_ID, 17021 .model_id = SST_SST49LF004C, 17022 .total_size = 512, 17023 .page_size = 4 * 1024, 17024 .feature_bits = FEATURE_REGISTERMAP, 17025 .tested = TEST_UNTESTED, 17026 .probe = PROBE_AT82802AB, 17027 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 17028 .block_erasers = 17029 { 17030 { 17031 .eraseblocks = { {4 * 1024, 128} }, 17032 .block_erase = ERASE_SECTOR_49LFXXXC, 17033 }, { 17034 .eraseblocks = { 17035 {64 * 1024, 7}, 17036 {32 * 1024, 1}, 17037 {8 * 1024, 2}, 17038 {16 * 1024, 1}, 17039 }, 17040 .block_erase = ERASE_BLOCK_82802AB, 17041 } 17042 }, 17043 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_1, 17044 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_1, 17045 .write = WRITE_82802AB, 17046 .read = READ_MEMMAPPED, 17047 .voltage = {3000, 3600}, 17048 }, 17049 17050 { 17051 .vendor = "SST", 17052 .name = "SST49LF008A", 17053 .bustype = BUS_FWH, /* A/A Mux */ 17054 .manufacture_id = SST_ID, 17055 .model_id = SST_SST49LF008A, 17056 .total_size = 1024, 17057 .page_size = 64 * 1024, 17058 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 17059 .tested = TEST_OK_PREW, 17060 .probe = PROBE_JEDEC, 17061 .probe_timing = 1, /* 150 ns */ 17062 .block_erasers = 17063 { 17064 { 17065 .eraseblocks = { {4 * 1024, 256} }, 17066 .block_erase = JEDEC_SECTOR_ERASE, 17067 }, { 17068 .eraseblocks = { {64 * 1024, 16} }, 17069 .block_erase = JEDEC_BLOCK_ERASE, 17070 }, { 17071 .eraseblocks = { {1024 * 1024, 1} }, 17072 .block_erase = NO_BLOCK_ERASE_FUNC, /* AA 55 80 AA 55 10, only in A/A mux mode */ 17073 } 17074 }, 17075 .printlock = PRINTLOCK_SST_FWHUB, 17076 .unlock = UNLOCK_SST_FWHUB, 17077 .write = WRITE_JEDEC1, 17078 .read = READ_MEMMAPPED, 17079 .voltage = {3000, 3600}, 17080 }, 17081 17082 { 17083 .vendor = "SST", 17084 .name = "SST49LF008C", 17085 .bustype = BUS_FWH, 17086 .manufacture_id = SST_ID, 17087 .model_id = SST_SST49LF008C, 17088 .total_size = 1024, 17089 .page_size = 4 * 1024, 17090 .feature_bits = FEATURE_REGISTERMAP, 17091 .tested = TEST_UNTESTED, 17092 .probe = PROBE_AT82802AB, 17093 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 17094 .block_erasers = 17095 { 17096 { 17097 .eraseblocks = { {4 * 1024, 256} }, 17098 .block_erase = ERASE_SECTOR_49LFXXXC, 17099 }, { 17100 .eraseblocks = { 17101 {64 * 1024, 15}, 17102 {32 * 1024, 1}, 17103 {8 * 1024, 2}, 17104 {16 * 1024, 1}, 17105 }, 17106 .block_erase = ERASE_BLOCK_82802AB, 17107 } 17108 }, 17109 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_1, 17110 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_1, 17111 .write = WRITE_82802AB, 17112 .read = READ_MEMMAPPED, 17113 .voltage = {3000, 3600}, 17114 }, 17115 17116 { 17117 .vendor = "SST", 17118 .name = "SST49LF016C", 17119 .bustype = BUS_FWH, 17120 .manufacture_id = SST_ID, 17121 .model_id = SST_SST49LF016C, 17122 .total_size = 2048, 17123 .page_size = 4 * 1024, 17124 .feature_bits = FEATURE_REGISTERMAP, 17125 .tested = TEST_OK_PREW, 17126 .probe = PROBE_AT82802AB, 17127 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 17128 .block_erasers = 17129 { 17130 { 17131 .eraseblocks = { {4 * 1024, 512} }, 17132 .block_erase = ERASE_SECTOR_49LFXXXC, 17133 }, { 17134 .eraseblocks = { 17135 {64 * 1024, 31}, 17136 {32 * 1024, 1}, 17137 {8 * 1024, 2}, 17138 {16 * 1024, 1}, 17139 }, 17140 .block_erase = ERASE_BLOCK_82802AB, 17141 } 17142 }, 17143 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_1, 17144 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_1, 17145 .write = WRITE_82802AB, 17146 .read = READ_MEMMAPPED, 17147 .voltage = {3000, 3600}, 17148 }, 17149 17150 { 17151 .vendor = "SST", 17152 .name = "SST49LF020", 17153 .bustype = BUS_LPC, 17154 .manufacture_id = SST_ID, 17155 .model_id = SST_SST49LF020, 17156 .total_size = 256, 17157 .page_size = 16 * 1024, 17158 .feature_bits = FEATURE_EITHER_RESET, 17159 .tested = TEST_OK_PREW, 17160 .probe = PROBE_JEDEC, 17161 .probe_timing = 1, /* 150 ns */ 17162 .block_erasers = 17163 { 17164 { 17165 .eraseblocks = { {4 * 1024, 64} }, 17166 .block_erase = JEDEC_SECTOR_ERASE, 17167 }, { 17168 .eraseblocks = { {16 * 1024, 16} }, 17169 .block_erase = JEDEC_BLOCK_ERASE, 17170 }, { 17171 .eraseblocks = { {256 * 1024, 1} }, 17172 .block_erase = NO_BLOCK_ERASE_FUNC, 17173 } 17174 }, 17175 .write = WRITE_JEDEC1, 17176 .read = READ_MEMMAPPED, 17177 .voltage = {3000, 3600}, 17178 }, 17179 17180 { 17181 .vendor = "SST", 17182 .name = "SST49LF020A", 17183 .bustype = BUS_LPC, 17184 .manufacture_id = SST_ID, 17185 .model_id = SST_SST49LF020A, 17186 .total_size = 256, 17187 .page_size = 4 * 1024, 17188 .feature_bits = FEATURE_EITHER_RESET, 17189 .tested = TEST_OK_PRE, 17190 .probe = PROBE_JEDEC, 17191 .probe_timing = 1, /* 150 ns */ 17192 .block_erasers = 17193 { 17194 { 17195 .eraseblocks = { {4 * 1024, 64} }, 17196 .block_erase = JEDEC_SECTOR_ERASE, 17197 }, { 17198 .eraseblocks = { {16 * 1024, 16} }, 17199 .block_erase = JEDEC_BLOCK_ERASE, 17200 }, { 17201 .eraseblocks = { {256 * 1024, 1} }, 17202 .block_erase = NO_BLOCK_ERASE_FUNC, 17203 } 17204 }, 17205 .write = WRITE_JEDEC1, 17206 .read = READ_MEMMAPPED, 17207 .voltage = {3000, 3600}, 17208 }, 17209 17210 { 17211 .vendor = "SST", 17212 .name = "SST49LF040", 17213 .bustype = BUS_LPC, 17214 .manufacture_id = SST_ID, 17215 .model_id = SST_SST49LF040, 17216 .total_size = 512, 17217 .page_size = 4096, 17218 .feature_bits = FEATURE_EITHER_RESET, 17219 .tested = TEST_OK_PREW, 17220 .probe = PROBE_JEDEC, 17221 .probe_timing = 1, /* 150 ns */ 17222 .block_erasers = 17223 { 17224 { 17225 .eraseblocks = { {4 * 1024, 128} }, 17226 .block_erase = JEDEC_SECTOR_ERASE, 17227 }, { 17228 .eraseblocks = { {64 * 1024, 8} }, 17229 .block_erase = JEDEC_BLOCK_ERASE, 17230 }, { 17231 .eraseblocks = { {512 * 1024, 1} }, 17232 .block_erase = NO_BLOCK_ERASE_FUNC, 17233 } 17234 }, 17235 .write = WRITE_JEDEC1, 17236 .read = READ_MEMMAPPED, 17237 .voltage = {3000, 3600}, 17238 }, 17239 17240 { 17241 .vendor = "SST", 17242 .name = "SST49LF040B", 17243 .bustype = BUS_LPC, /* A/A Mux */ 17244 .manufacture_id = SST_ID, 17245 .model_id = SST_SST49LF040B, 17246 .total_size = 512, 17247 .page_size = 64 * 1024, 17248 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP, 17249 .tested = TEST_OK_PREW, 17250 .probe = PROBE_JEDEC, 17251 .probe_timing = 1, /* 150ns */ 17252 .block_erasers = 17253 { 17254 { 17255 .eraseblocks = { {4 * 1024, 128} }, 17256 .block_erase = JEDEC_SECTOR_ERASE, 17257 }, { 17258 .eraseblocks = { {64 * 1024, 8} }, 17259 .block_erase = JEDEC_BLOCK_ERASE, 17260 }, { 17261 .eraseblocks = { {512 * 1024, 1} }, 17262 .block_erase = NO_BLOCK_ERASE_FUNC, 17263 } 17264 }, 17265 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17266 .write = WRITE_JEDEC1, 17267 .read = READ_MEMMAPPED, 17268 .voltage = {3000, 3600}, 17269 }, 17270 17271 { 17272 .vendor = "SST", 17273 .name = "SST49LF080A", 17274 .bustype = BUS_LPC, /* A/A Mux */ 17275 .manufacture_id = SST_ID, 17276 .model_id = SST_SST49LF080A, 17277 .total_size = 1024, 17278 .page_size = 4096, 17279 .feature_bits = FEATURE_EITHER_RESET, 17280 .tested = TEST_OK_PREW, 17281 .probe = PROBE_JEDEC, 17282 .probe_timing = TIMING_FIXME, 17283 .block_erasers = 17284 { 17285 { 17286 .eraseblocks = { {4 * 1024, 256} }, 17287 .block_erase = JEDEC_SECTOR_ERASE, 17288 }, { 17289 .eraseblocks = { {64 * 1024, 16} }, 17290 .block_erase = JEDEC_BLOCK_ERASE, 17291 }, { 17292 .eraseblocks = { {1024 * 1024, 1} }, 17293 .block_erase = NO_BLOCK_ERASE_FUNC, 17294 } 17295 }, 17296 .write = WRITE_JEDEC1, 17297 .read = READ_MEMMAPPED, 17298 .voltage = {3000, 3600}, 17299 }, 17300 17301 { 17302 .vendor = "SST", 17303 .name = "SST49LF160C", 17304 .bustype = BUS_LPC, 17305 .manufacture_id = SST_ID, 17306 .model_id = SST_SST49LF160C, 17307 .total_size = 2048, 17308 .page_size = 4 * 1024, 17309 .feature_bits = FEATURE_REGISTERMAP, 17310 .tested = TEST_OK_PR, 17311 .probe = PROBE_AT82802AB, 17312 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */ 17313 .block_erasers = 17314 { 17315 { 17316 .eraseblocks = { {4 * 1024, 512} }, 17317 .block_erase = ERASE_SECTOR_49LFXXXC, 17318 }, { 17319 .eraseblocks = { 17320 {64 * 1024, 31}, 17321 {32 * 1024, 1}, 17322 {8 * 1024, 2}, 17323 {16 * 1024, 1}, 17324 }, 17325 .block_erase = ERASE_BLOCK_82802AB, 17326 } 17327 }, 17328 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_1, 17329 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_1, 17330 .write = WRITE_82802AB, 17331 .read = READ_MEMMAPPED, 17332 .voltage = {3000, 3600}, 17333 }, 17334 17335 { 17336 .vendor = "ST", 17337 .name = "M29F002B", 17338 .bustype = BUS_PARALLEL, 17339 .manufacture_id = ST_ID, 17340 .model_id = ST_M29F002B, 17341 .total_size = 256, 17342 .page_size = 64 * 1024, 17343 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 17344 .tested = TEST_UNTESTED, 17345 .probe = PROBE_JEDEC, 17346 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17347 .block_erasers = 17348 { 17349 { 17350 .eraseblocks = { 17351 {16 * 1024, 1}, 17352 {8 * 1024, 2}, 17353 {32 * 1024, 1}, 17354 {64 * 1024, 3}, 17355 }, 17356 .block_erase = JEDEC_SECTOR_ERASE, 17357 }, { 17358 .eraseblocks = { {256 * 1024, 1} }, 17359 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17360 } 17361 }, 17362 .write = WRITE_JEDEC1, 17363 .read = READ_MEMMAPPED, 17364 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */ 17365 }, 17366 17367 { 17368 .vendor = "ST", 17369 .name = "M29F002T/NT", 17370 .bustype = BUS_PARALLEL, 17371 .manufacture_id = ST_ID, 17372 .model_id = ST_M29F002T, 17373 .total_size = 256, 17374 .page_size = 64 * 1024, 17375 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET, 17376 .tested = TEST_OK_PREW, 17377 .probe = PROBE_JEDEC, 17378 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17379 .block_erasers = 17380 { 17381 { 17382 .eraseblocks = { 17383 {64 * 1024, 3}, 17384 {32 * 1024, 1}, 17385 {8 * 1024, 2}, 17386 {16 * 1024, 1}, 17387 }, 17388 .block_erase = JEDEC_SECTOR_ERASE, 17389 }, { 17390 .eraseblocks = { {256 * 1024, 1} }, 17391 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17392 } 17393 }, 17394 .write = WRITE_JEDEC1, 17395 .read = READ_MEMMAPPED, 17396 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */ 17397 }, 17398 17399 { 17400 .vendor = "ST", 17401 .name = "M29F040B", 17402 .bustype = BUS_PARALLEL, 17403 .manufacture_id = ST_ID, 17404 .model_id = ST_M29F040B, 17405 .total_size = 512, 17406 .page_size = 64 * 1024, 17407 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17408 .tested = TEST_UNTESTED, 17409 .probe = PROBE_JEDEC, 17410 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */ 17411 .block_erasers = 17412 { 17413 { 17414 .eraseblocks = { {64 * 1024, 8} }, 17415 .block_erase = JEDEC_SECTOR_ERASE, 17416 }, { 17417 .eraseblocks = { {512 * 1024, 1} }, 17418 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17419 } 17420 }, 17421 .write = WRITE_JEDEC1, 17422 .read = READ_MEMMAPPED, 17423 .voltage = {4500, 5500}, 17424 }, 17425 17426 { 17427 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 17428 .vendor = "ST", 17429 .name = "M29F400BB", 17430 .bustype = BUS_PARALLEL, 17431 .manufacture_id = ST_ID, 17432 .model_id = ST_M29F400BB, 17433 .total_size = 512, 17434 .page_size = 64 * 1024, 17435 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17436 .tested = TEST_UNTESTED, 17437 .probe = PROBE_JEDEC, 17438 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 17439 .block_erasers = 17440 { 17441 { 17442 .eraseblocks = { 17443 {16 * 1024, 1}, 17444 {8 * 1024, 2}, 17445 {32 * 1024, 1}, 17446 {64 * 1024, 7}, 17447 }, 17448 .block_erase = JEDEC_SECTOR_ERASE, 17449 }, { 17450 .eraseblocks = { {512 * 1024, 1} }, 17451 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17452 } 17453 }, 17454 .write = WRITE_JEDEC1, 17455 .read = READ_MEMMAPPED, 17456 .voltage = {4500, 5500}, 17457 }, 17458 17459 { 17460 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */ 17461 .vendor = "ST", 17462 .name = "M29F400BT", 17463 .bustype = BUS_PARALLEL, 17464 .manufacture_id = ST_ID, 17465 .model_id = ST_M29F400BT, 17466 .total_size = 512, 17467 .page_size = 64 * 1024, 17468 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17469 .tested = TEST_UNTESTED, 17470 .probe = PROBE_JEDEC, 17471 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt 17472 .block_erasers = 17473 { 17474 { 17475 .eraseblocks = { 17476 {64 * 1024, 7}, 17477 {32 * 1024, 1}, 17478 {8 * 1024, 2}, 17479 {16 * 1024, 1}, 17480 }, 17481 .block_erase = JEDEC_SECTOR_ERASE, 17482 }, { 17483 .eraseblocks = { {512 * 1024, 1} }, 17484 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17485 } 17486 }, 17487 .write = WRITE_JEDEC1, 17488 .read = READ_MEMMAPPED, 17489 .voltage = {4500, 5500}, 17490 }, 17491 17492 { 17493 .vendor = "ST", 17494 .name = "M29W010B", 17495 .bustype = BUS_PARALLEL, 17496 .manufacture_id = ST_ID, 17497 .model_id = ST_M29W010B, 17498 .total_size = 128, 17499 .page_size = 16 * 1024, 17500 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17501 .tested = TEST_UNTESTED, 17502 .probe = PROBE_JEDEC, 17503 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17504 .block_erasers = 17505 { 17506 { 17507 .eraseblocks = { {16 * 1024, 8} }, 17508 .block_erase = JEDEC_SECTOR_ERASE, 17509 }, { 17510 .eraseblocks = { {128 * 1024, 1} }, 17511 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17512 } 17513 }, 17514 .write = WRITE_JEDEC1, 17515 .read = READ_MEMMAPPED, 17516 .voltage = {2700, 3600}, 17517 }, 17518 17519 { 17520 .vendor = "ST", 17521 .name = "M29W040B", 17522 .bustype = BUS_PARALLEL, 17523 .manufacture_id = ST_ID, 17524 .model_id = ST_M29W040B, 17525 .total_size = 512, 17526 .page_size = 64 * 1024, 17527 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17528 .tested = TEST_UNTESTED, 17529 .probe = PROBE_JEDEC, 17530 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17531 .block_erasers = 17532 { 17533 { 17534 .eraseblocks = { {64 * 1024, 8} }, 17535 .block_erase = JEDEC_SECTOR_ERASE, 17536 }, { 17537 .eraseblocks = { {512 * 1024, 1} }, 17538 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17539 } 17540 }, 17541 .write = WRITE_JEDEC1, 17542 .read = READ_MEMMAPPED, 17543 .voltage = {2700, 3600}, 17544 }, 17545 17546 { 17547 .vendor = "ST", 17548 .name = "M29W512B", 17549 .bustype = BUS_PARALLEL, 17550 .manufacture_id = ST_ID, 17551 .model_id = ST_M29W512B, 17552 .total_size = 64, 17553 .page_size = 64 * 1024, 17554 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 17555 .tested = TEST_OK_PREW, 17556 .probe = PROBE_JEDEC, 17557 .probe_timing = TIMING_ZERO, 17558 .block_erasers = 17559 { 17560 { 17561 .eraseblocks = { {64 * 1024, 1} }, 17562 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 17563 } 17564 }, 17565 .write = WRITE_JEDEC1, 17566 .read = READ_MEMMAPPED, 17567 .voltage = {2700, 3600}, 17568 }, 17569 17570 { 17571 .vendor = "ST", 17572 .name = "M50FLW040A", 17573 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 17574 .manufacture_id = ST_ID, 17575 .model_id = ST_M50FLW040A, 17576 .total_size = 512, 17577 .page_size = 0, 17578 .feature_bits = FEATURE_REGISTERMAP, 17579 .tested = TEST_UNTESTED, 17580 .probe = PROBE_AT82802AB, 17581 .probe_timing = TIMING_FIXME, 17582 .block_erasers = 17583 { 17584 { 17585 .eraseblocks = { 17586 {4 * 1024, 16}, /* sector */ 17587 {64 * 1024, 5}, /* block */ 17588 {4 * 1024, 16}, /* sector */ 17589 {4 * 1024, 16}, /* sector */ 17590 }, 17591 .block_erase = STM50_SECTOR_ERASE, 17592 }, { 17593 .eraseblocks = { {64 * 1024, 8} }, 17594 .block_erase = ERASE_BLOCK_82802AB, 17595 } 17596 }, 17597 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17598 .write = WRITE_82802AB, 17599 .read = READ_MEMMAPPED, 17600 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17601 }, 17602 17603 { 17604 .vendor = "ST", 17605 .name = "M50FLW040B", 17606 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 17607 .manufacture_id = ST_ID, 17608 .model_id = ST_M50FLW040B, 17609 .total_size = 512, 17610 .page_size = 0, 17611 .feature_bits = FEATURE_REGISTERMAP, 17612 .tested = TEST_UNTESTED, 17613 .probe = PROBE_AT82802AB, 17614 .probe_timing = TIMING_FIXME, 17615 .block_erasers = 17616 { 17617 { 17618 .eraseblocks = { 17619 {4 * 1024, 16}, /* sector */ 17620 {4 * 1024, 16}, /* sector */ 17621 {64 * 1024, 5}, /* block */ 17622 {4 * 1024, 16}, /* sector */ 17623 }, 17624 .block_erase = STM50_SECTOR_ERASE, 17625 }, { 17626 .eraseblocks = { {64 * 1024, 8} }, 17627 .block_erase = ERASE_BLOCK_82802AB, 17628 } 17629 }, 17630 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17631 .write = WRITE_82802AB, 17632 .read = READ_MEMMAPPED, 17633 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17634 }, 17635 17636 { 17637 .vendor = "ST", 17638 .name = "M50FLW080A", 17639 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 17640 .manufacture_id = ST_ID, 17641 .model_id = ST_M50FLW080A, 17642 .total_size = 1024, 17643 .page_size = 0, 17644 .feature_bits = FEATURE_REGISTERMAP, 17645 .tested = TEST_OK_PR, 17646 .probe = PROBE_AT82802AB, 17647 .probe_timing = TIMING_FIXME, 17648 .block_erasers = 17649 { 17650 { 17651 .eraseblocks = { 17652 {4 * 1024, 16}, /* sector */ 17653 {64 * 1024, 13}, /* block */ 17654 {4 * 1024, 16}, /* sector */ 17655 {4 * 1024, 16}, /* sector */ 17656 }, 17657 .block_erase = STM50_SECTOR_ERASE, 17658 }, { 17659 .eraseblocks = { {64 * 1024, 16} }, 17660 .block_erase = ERASE_BLOCK_82802AB, 17661 } 17662 }, 17663 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 17664 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 17665 .write = WRITE_82802AB, 17666 .read = READ_MEMMAPPED, 17667 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17668 }, 17669 17670 { 17671 .vendor = "ST", 17672 .name = "M50FLW080B", 17673 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */ 17674 .manufacture_id = ST_ID, 17675 .model_id = ST_M50FLW080B, 17676 .total_size = 1024, 17677 .page_size = 0, 17678 .feature_bits = FEATURE_REGISTERMAP, 17679 .tested = TEST_UNTESTED, 17680 .probe = PROBE_AT82802AB, 17681 .probe_timing = TIMING_FIXME, 17682 .block_erasers = 17683 { 17684 { 17685 .eraseblocks = { 17686 {4 * 1024, 16}, /* sector */ 17687 {4 * 1024, 16}, /* sector */ 17688 {64 * 1024, 13}, /* block */ 17689 {4 * 1024, 16}, /* sector */ 17690 }, 17691 .block_erase = STM50_SECTOR_ERASE, 17692 }, { 17693 .eraseblocks = { {64 * 1024, 16} }, 17694 .block_erase = ERASE_BLOCK_82802AB, 17695 } 17696 }, 17697 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 17698 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 17699 .write = WRITE_82802AB, 17700 .read = READ_MEMMAPPED, 17701 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17702 }, 17703 17704 { 17705 .vendor = "ST", 17706 .name = "M50FW002", 17707 .bustype = BUS_FWH, /* A/A Mux */ 17708 .manufacture_id = ST_ID, 17709 .model_id = ST_M50FW002, 17710 .total_size = 256, 17711 .page_size = 0, 17712 .feature_bits = FEATURE_REGISTERMAP, 17713 .tested = TEST_OK_PR, 17714 .probe = PROBE_AT82802AB, 17715 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 17716 .block_erasers = 17717 { 17718 { 17719 .eraseblocks = { 17720 {64 * 1024, 3}, 17721 {32 * 1024, 1}, 17722 {8 * 1024, 2}, 17723 {16 * 1024, 1}, 17724 }, 17725 .block_erase = ERASE_BLOCK_82802AB, 17726 }, { 17727 .eraseblocks = { {256 * 1024, 1} }, 17728 .block_erase = NO_BLOCK_ERASE_FUNC, /* Only in A/A mux mode */ 17729 } 17730 }, 17731 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 17732 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 17733 .write = WRITE_82802AB, 17734 .read = READ_MEMMAPPED, 17735 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17736 }, 17737 17738 { 17739 .vendor = "ST", 17740 .name = "M50FW016", 17741 .bustype = BUS_FWH, /* A/A Mux */ 17742 .manufacture_id = ST_ID, 17743 .model_id = ST_M50FW016, 17744 .total_size = 2048, 17745 .page_size = 0, 17746 .feature_bits = FEATURE_REGISTERMAP, 17747 .tested = TEST_UNTESTED, 17748 .probe = PROBE_AT82802AB, 17749 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 17750 .block_erasers = 17751 { 17752 { 17753 .eraseblocks = { {64 * 1024, 32} }, 17754 .block_erase = ERASE_BLOCK_82802AB, 17755 } 17756 }, 17757 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17758 .write = WRITE_82802AB, 17759 .read = READ_MEMMAPPED, 17760 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17761 }, 17762 17763 { 17764 .vendor = "ST", 17765 .name = "M50FW040", 17766 .bustype = BUS_FWH, /* A/A Mux */ 17767 .manufacture_id = ST_ID, 17768 .model_id = ST_M50FW040, 17769 .total_size = 512, 17770 .page_size = 0, 17771 .feature_bits = FEATURE_REGISTERMAP, 17772 .tested = TEST_OK_PR, 17773 .probe = PROBE_AT82802AB, 17774 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 17775 .block_erasers = 17776 { 17777 { 17778 .eraseblocks = { {64 * 1024, 8} }, 17779 .block_erase = ERASE_BLOCK_82802AB, 17780 } 17781 }, 17782 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17783 .write = WRITE_82802AB, 17784 .read = READ_MEMMAPPED, 17785 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17786 }, 17787 17788 { 17789 .vendor = "ST", 17790 .name = "M50FW080", 17791 .bustype = BUS_FWH, /* A/A Mux */ 17792 .manufacture_id = ST_ID, 17793 .model_id = ST_M50FW080, 17794 .total_size = 1024, 17795 .page_size = 0, 17796 .feature_bits = FEATURE_REGISTERMAP, 17797 .tested = TEST_OK_PR, 17798 .probe = PROBE_AT82802AB, 17799 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */ 17800 .block_erasers = 17801 { 17802 { 17803 .eraseblocks = { {64 * 1024, 16} }, 17804 .block_erase = ERASE_BLOCK_82802AB, 17805 } 17806 }, 17807 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17808 .write = WRITE_82802AB, 17809 .read = READ_MEMMAPPED, 17810 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17811 }, 17812 17813 { 17814 .vendor = "ST", 17815 .name = "M50LPW080", 17816 .bustype = BUS_LPC, /* A/A Mux */ 17817 .manufacture_id = ST_ID, 17818 .model_id = ST_M50LPW080, 17819 .total_size = 1024, 17820 .page_size = 0, 17821 .feature_bits = FEATURE_REGISTERMAP, 17822 .tested = TEST_UNTESTED, 17823 .probe = PROBE_AT82802AB, 17824 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17825 .block_erasers = 17826 { 17827 { 17828 .eraseblocks = { {64 * 1024, 16} }, 17829 .block_erase = ERASE_BLOCK_82802AB, 17830 } 17831 }, 17832 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 17833 .write = WRITE_82802AB, 17834 .read = READ_MEMMAPPED, 17835 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17836 }, 17837 17838 { 17839 .vendor = "ST", 17840 .name = "M50LPW116", 17841 .bustype = BUS_LPC, /* A/A Mux */ 17842 .manufacture_id = ST_ID, 17843 .model_id = ST_M50LPW116, 17844 .total_size = 2048, 17845 .page_size = 0, 17846 .feature_bits = FEATURE_REGISTERMAP, 17847 .tested = TEST_UNTESTED, 17848 .probe = PROBE_AT82802AB, 17849 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 17850 .block_erasers = 17851 { 17852 { 17853 .eraseblocks = { 17854 {4 * 1024, 16}, 17855 {64 * 1024, 30}, 17856 {32 * 1024, 1}, 17857 {8 * 1024, 2}, 17858 {16 * 1024, 1}, 17859 }, 17860 .block_erase = ERASE_BLOCK_82802AB, 17861 } 17862 }, 17863 .printlock = PRINTLOCK_REGSPACE2_BLOCK_ERASER_0, 17864 .unlock = UNLOCK_REGSPACE2_BLOCK_ERASER_0, 17865 .write = WRITE_82802AB, 17866 .read = READ_MEMMAPPED, 17867 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */ 17868 }, 17869 17870 { 17871 .vendor = "ST", 17872 .name = "M95M02", 17873 .bustype = BUS_SPI, 17874 .manufacture_id = ST_ID, 17875 .model_id = ST_M95M02, 17876 .total_size = 256, 17877 .page_size = 256, 17878 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO, 17879 .tested = TEST_OK_PREW, 17880 .probe = PROBE_SPI_ST95, 17881 .probe_timing = TIMING_ZERO, 17882 .block_erasers = 17883 { 17884 { 17885 .eraseblocks = { {256 * 1024, 1} }, 17886 .block_erase = SPI_BLOCK_ERASE_EMULATION, 17887 } 17888 }, 17889 17890 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 17891 .unlock = SPI_DISABLE_BLOCKPROTECT_BP1_SRWD, 17892 .write = SPI_CHIP_WRITE256, 17893 .read = SPI_CHIP_READ, 17894 .voltage = {2500, 5500}, 17895 }, 17896 17897 { 17898 .vendor = "Sanyo", 17899 .name = "LE25FU106B", 17900 .bustype = BUS_SPI, 17901 .manufacture_id = SANYO_ID, 17902 .model_id = SANYO_LE25FU106B, 17903 .total_size = 128, 17904 .page_size = 256, 17905 .feature_bits = FEATURE_WRSR_WREN, 17906 .tested = TEST_UNTESTED, 17907 .probe = PROBE_SPI_RES2, 17908 .probe_timing = TIMING_ZERO, 17909 .block_erasers = 17910 { 17911 /* FIXME: Is this correct? 17912 { 17913 .eraseblocks = { {2 * 1024, 64} }, 17914 .block_erase = SPI_BLOCK_ERASE_D7, 17915 },*/ 17916 { 17917 .eraseblocks = { {32 * 1024, 4} }, 17918 .block_erase = SPI_BLOCK_ERASE_D8, 17919 }, { 17920 .eraseblocks = { {128 * 1024, 1} }, 17921 .block_erase = SPI_BLOCK_ERASE_C7, 17922 } 17923 }, 17924 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 17925 .unlock = SPI_DISABLE_BLOCKPROTECT_BP1_SRWD, 17926 .write = SPI_CHIP_WRITE256, 17927 .read = SPI_CHIP_READ, 17928 .voltage = {2300, 3600}, 17929 }, 17930 17931 { 17932 .vendor = "Sanyo", 17933 .name = "LE25FU206", 17934 .bustype = BUS_SPI, 17935 .manufacture_id = SANYO_ID, 17936 .model_id = SANYO_LE25FU206, 17937 .total_size = 256, 17938 .page_size = 256, 17939 .feature_bits = FEATURE_WRSR_WREN, 17940 .tested = TEST_UNTESTED, 17941 .probe = PROBE_SPI_RES2, 17942 .probe_timing = TIMING_ZERO, 17943 .block_erasers = 17944 { 17945 { 17946 .eraseblocks = { {4 * 1024, 64} }, 17947 .block_erase = SPI_BLOCK_ERASE_D7, 17948 }, { 17949 .eraseblocks = { {64 * 1024, 4} }, 17950 .block_erase = SPI_BLOCK_ERASE_D8, 17951 }, { 17952 .eraseblocks = { {256 * 1024, 1} }, 17953 .block_erase = SPI_BLOCK_ERASE_C7, 17954 } 17955 }, 17956 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 17957 .unlock = SPI_DISABLE_BLOCKPROTECT_BP1_SRWD, 17958 .write = SPI_CHIP_WRITE256, 17959 .read = SPI_CHIP_READ, 17960 .voltage = {2300, 3600}, 17961 }, 17962 17963 { 17964 .vendor = "Sanyo", 17965 .name = "LE25FU206A", 17966 .bustype = BUS_SPI, 17967 .manufacture_id = SANYO_ID, 17968 .model_id = SANYO_LE25FU206A, 17969 .total_size = 256, 17970 .page_size = 256, 17971 .tested = TEST_UNTESTED, 17972 .probe = PROBE_SPI_RDID, 17973 .probe_timing = TIMING_ZERO, 17974 .block_erasers = 17975 { 17976 { 17977 .eraseblocks = { {4 * 1024, 64} }, 17978 .block_erase = SPI_BLOCK_ERASE_20, 17979 }, { 17980 .eraseblocks = { {4 * 1024, 64} }, 17981 .block_erase = SPI_BLOCK_ERASE_D7, 17982 }, { 17983 .eraseblocks = { {64 * 1024, 4} }, 17984 .block_erase = SPI_BLOCK_ERASE_D8, 17985 }, { 17986 .eraseblocks = { {256 * 1024, 1} }, 17987 .block_erase = SPI_BLOCK_ERASE_60, 17988 }, { 17989 .eraseblocks = { {256 * 1024, 1} }, 17990 .block_erase = SPI_BLOCK_ERASE_C7, 17991 } 17992 }, 17993 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 17994 .unlock = SPI_DISABLE_BLOCKPROTECT, /* #WP pin write-protects SRWP bit. */ 17995 .write = SPI_CHIP_WRITE256, 17996 .read = SPI_CHIP_READ, 17997 .voltage = {2300, 3600}, 17998 }, 17999 18000 { 18001 .vendor = "Sanyo", 18002 .name = "LE25FU406B", 18003 .bustype = BUS_SPI, 18004 .manufacture_id = SANYO_ID, 18005 .model_id = SANYO_LE25FU406B, 18006 .total_size = 512, 18007 .page_size = 256, 18008 .feature_bits = FEATURE_WRSR_WREN, 18009 .tested = TEST_OK_PREW, 18010 .probe = PROBE_SPI_RES2, 18011 .probe_timing = TIMING_ZERO, 18012 .block_erasers = 18013 { 18014 { 18015 .eraseblocks = { {4 * 1024, 128} }, 18016 .block_erase = SPI_BLOCK_ERASE_D7, 18017 }, { 18018 .eraseblocks = { {64 * 1024, 8} }, 18019 .block_erase = SPI_BLOCK_ERASE_D8, 18020 }, { 18021 .eraseblocks = { {512 * 1024, 1} }, 18022 .block_erase = SPI_BLOCK_ERASE_C7, 18023 } 18024 }, 18025 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18026 .unlock = SPI_DISABLE_BLOCKPROTECT, /* #WP pin write-protects SRWP bit. */ 18027 .write = SPI_CHIP_WRITE256, 18028 .read = SPI_CHIP_READ, 18029 .voltage = {2300, 3600}, 18030 }, 18031 18032 { 18033 .vendor = "Sanyo", 18034 .name = "LE25FU406C/LE25U40CMC", 18035 .bustype = BUS_SPI, 18036 .manufacture_id = SANYO_ID, 18037 .model_id = SANYO_LE25FU406C, 18038 .total_size = 512, 18039 .page_size = 256, 18040 .feature_bits = FEATURE_WRSR_WREN, 18041 .tested = TEST_OK_PREW, 18042 .probe = PROBE_SPI_RDID, 18043 .probe_timing = TIMING_ZERO, 18044 .block_erasers = 18045 { 18046 { 18047 .eraseblocks = { {4 * 1024, 128} }, 18048 .block_erase = SPI_BLOCK_ERASE_20, 18049 }, { 18050 .eraseblocks = { {4 * 1024, 128} }, 18051 .block_erase = SPI_BLOCK_ERASE_D7, 18052 }, { 18053 .eraseblocks = { {64 * 1024, 8} }, 18054 .block_erase = SPI_BLOCK_ERASE_D8, 18055 }, { 18056 .eraseblocks = { {512 * 1024, 1} }, 18057 .block_erase = SPI_BLOCK_ERASE_60, 18058 }, { 18059 .eraseblocks = { {512 * 1024, 1} }, 18060 .block_erase = SPI_BLOCK_ERASE_C7, 18061 } 18062 }, 18063 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18064 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 18065 .write = SPI_CHIP_WRITE256, 18066 .read = SPI_CHIP_READ, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */ 18067 .voltage = {2300, 3600}, 18068 }, 18069 18070 { 18071 .vendor = "Sanyo", 18072 .name = "LE25FW106", 18073 .bustype = BUS_SPI, 18074 .manufacture_id = SANYO_ID, 18075 .model_id = SANYO_LE25FW106, 18076 .total_size = 128, 18077 .page_size = 256, 18078 .feature_bits = FEATURE_WRSR_WREN, 18079 .tested = TEST_OK_PREW, 18080 .probe = PROBE_SPI_RES2, 18081 .probe_timing = TIMING_ZERO, 18082 .block_erasers = 18083 { 18084 { 18085 .eraseblocks = { {2 * 1024, 64} }, 18086 .block_erase = SPI_BLOCK_ERASE_D7, 18087 }, { 18088 .eraseblocks = { {32 * 1024, 4} }, 18089 .block_erase = SPI_BLOCK_ERASE_D8, 18090 }, { 18091 .eraseblocks = { {128 * 1024, 1} }, 18092 .block_erase = SPI_BLOCK_ERASE_C7, 18093 } 18094 }, 18095 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, /* FIXME: Add ERSER error flag. */ 18096 .unlock = SPI_DISABLE_BLOCKPROTECT_BP1_SRWD, 18097 .write = SPI_CHIP_WRITE256, 18098 .read = SPI_CHIP_READ, 18099 .voltage = {2700, 3600}, 18100 }, 18101 18102 { 18103 .vendor = "Sanyo", 18104 .name = "LE25FW203A", 18105 .bustype = BUS_SPI, 18106 .manufacture_id = SANYO_ID, 18107 .model_id = SANYO_LE25FW203A, 18108 .total_size = 256, 18109 .page_size = 256, 18110 .tested = TEST_UNTESTED, 18111 .probe = PROBE_SPI_RDID, 18112 .probe_timing = TIMING_ZERO, 18113 .block_erasers = 18114 { 18115 { 18116 .eraseblocks = { {256, 1024} }, 18117 .block_erase = SPI_BLOCK_ERASE_DB, 18118 }, { 18119 .eraseblocks = { {64 * 1024, 4} }, 18120 .block_erase = SPI_BLOCK_ERASE_D8, 18121 }, { 18122 .eraseblocks = { {256 * 1024, 1} }, 18123 .block_erase = SPI_BLOCK_ERASE_C7, 18124 } 18125 }, 18126 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 18127 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 18128 .write = SPI_CHIP_WRITE256, 18129 .read = SPI_CHIP_READ, 18130 .voltage = {2700, 3600}, 18131 }, 18132 18133 { 18134 .vendor = "Sanyo", 18135 .name = "LE25FW403A", 18136 .bustype = BUS_SPI, 18137 .manufacture_id = SANYO_ID, 18138 .model_id = SANYO_LE25FW403A, 18139 .total_size = 512, 18140 .page_size = 256, 18141 .tested = TEST_UNTESTED, 18142 .probe = PROBE_SPI_RDID, 18143 .probe_timing = TIMING_ZERO, 18144 .block_erasers = 18145 { 18146 { 18147 .eraseblocks = { {256, 2 * 1024} }, 18148 .block_erase = SPI_BLOCK_ERASE_DB, 18149 }, { 18150 .eraseblocks = { {64 * 1024, 8} }, 18151 .block_erase = SPI_BLOCK_ERASE_D8, 18152 }, { 18153 .eraseblocks = { {512 * 1024, 1} }, 18154 .block_erase = SPI_BLOCK_ERASE_C7, 18155 } 18156 }, 18157 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_DEFAULT_WELWIP, 18158 .unlock = NO_BLOCKPROTECT_FUNC, /* #WP pin write-protects lower 64kB. */ 18159 .write = SPI_CHIP_WRITE256, 18160 .read = SPI_CHIP_READ, 18161 .voltage = {2700, 3600}, 18162 }, 18163 18164 { 18165 .vendor = "Sanyo", 18166 .name = "LE25FW406A", 18167 .bustype = BUS_SPI, 18168 .manufacture_id = SANYO_ID, 18169 .model_id = SANYO_LE25FW406A, 18170 .total_size = 512, 18171 .page_size = 256, 18172 .feature_bits = FEATURE_WRSR_WREN, 18173 .tested = TEST_OK_PREW, 18174 .probe = PROBE_SPI_RES2, 18175 .probe_timing = TIMING_ZERO, 18176 .block_erasers = 18177 { 18178 { 18179 .eraseblocks = { {4 * 1024, 128} }, 18180 .block_erase = SPI_BLOCK_ERASE_D7, 18181 }, { 18182 .eraseblocks = { {64 * 1024, 8} }, 18183 .block_erase = SPI_BLOCK_ERASE_D8, 18184 }, { 18185 .eraseblocks = { {512 * 1024, 1} }, 18186 .block_erase = SPI_BLOCK_ERASE_C7, 18187 } 18188 }, 18189 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 18190 .unlock = SPI_DISABLE_BLOCKPROTECT, 18191 .write = SPI_CHIP_WRITE256, 18192 .read = SPI_CHIP_READ, 18193 .voltage = {2700, 3600}, 18194 }, 18195 18196 { 18197 .vendor = "Sanyo", 18198 .name = "LE25FW418A", 18199 .bustype = BUS_SPI, 18200 .manufacture_id = SANYO_ID, 18201 .model_id = SANYO_LE25FW418A, 18202 .total_size = 512, 18203 .page_size = 256, 18204 .feature_bits = FEATURE_WRSR_WREN, 18205 .tested = TEST_UNTESTED, 18206 .probe = PROBE_SPI_RES2, 18207 .probe_timing = TIMING_ZERO, 18208 .block_erasers = 18209 { 18210 { 18211 .eraseblocks = { {4 * 1024, 128} }, 18212 .block_erase = SPI_BLOCK_ERASE_D7, 18213 }, { 18214 .eraseblocks = { {64 * 1024, 8} }, 18215 .block_erase = SPI_BLOCK_ERASE_D8, 18216 }, { 18217 .eraseblocks = { {512 * 1024, 1} }, 18218 .block_erase = SPI_BLOCK_ERASE_C7, 18219 } 18220 }, 18221 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18222 .unlock = SPI_DISABLE_BLOCKPROTECT, /* #WP pin write-protects SRWP bit. */ 18223 .write = SPI_CHIP_WRITE256, 18224 .read = SPI_CHIP_READ, /* some quad-read supported ("HD_READ mode") */ 18225 .voltage = {2700, 3600}, 18226 }, 18227 18228 { 18229 .vendor = "Sanyo", 18230 .name = "LE25FW806", 18231 .bustype = BUS_SPI, 18232 .manufacture_id = SANYO_ID, 18233 .model_id = SANYO_LE25FW806, 18234 .total_size = 1024, 18235 .page_size = 256, 18236 .feature_bits = FEATURE_WRSR_WREN, 18237 .tested = TEST_UNTESTED, 18238 .probe = PROBE_SPI_RES2, 18239 .probe_timing = TIMING_ZERO, 18240 .block_erasers = 18241 { 18242 { 18243 .eraseblocks = { {4 * 1024, 256} }, 18244 .block_erase = SPI_BLOCK_ERASE_20, 18245 }, { 18246 .eraseblocks = { {4 * 1024, 256} }, 18247 .block_erase = SPI_BLOCK_ERASE_D7, 18248 }, { 18249 .eraseblocks = { {64 * 1024, 16} }, 18250 .block_erase = SPI_BLOCK_ERASE_D8, 18251 }, { 18252 .eraseblocks = { {1024 * 1024, 1} }, 18253 .block_erase = SPI_BLOCK_ERASE_C7, 18254 } 18255 }, 18256 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18257 .unlock = SPI_DISABLE_BLOCKPROTECT, /* #WP pin write-protects SRWP bit. */ 18258 .write = SPI_CHIP_WRITE256, 18259 .read = SPI_CHIP_READ, 18260 .voltage = {2700, 3600}, 18261 }, 18262 18263 { 18264 .vendor = "Sanyo", 18265 .name = "LE25FW808", 18266 .bustype = BUS_SPI, 18267 .manufacture_id = SANYO_ID, 18268 .model_id = SANYO_LE25FW808, 18269 .total_size = 1024, 18270 .page_size = 256, 18271 .feature_bits = FEATURE_WRSR_WREN, 18272 .tested = TEST_UNTESTED, 18273 .probe = PROBE_SPI_RES2, 18274 .probe_timing = TIMING_ZERO, 18275 .block_erasers = 18276 { 18277 { 18278 .eraseblocks = { {8 * 1024, 128} }, 18279 .block_erase = SPI_BLOCK_ERASE_D7, 18280 }, { 18281 .eraseblocks = { {64 * 1024, 16} }, 18282 .block_erase = SPI_BLOCK_ERASE_D8, 18283 }, { 18284 .eraseblocks = { {1024 * 1024, 1} }, 18285 .block_erase = SPI_BLOCK_ERASE_C7, 18286 } 18287 }, 18288 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18289 .unlock = SPI_DISABLE_BLOCKPROTECT, /* #WP pin write-protects SRWP bit. */ 18290 .write = SPI_CHIP_WRITE256, 18291 .read = SPI_CHIP_READ, /* some quad-read supported ("HD_READ mode") */ 18292 .voltage = {2700, 3600}, 18293 }, 18294 18295 { 18296 .vendor = "Sharp", 18297 .name = "LH28F008BJT-BTLZ1", 18298 .bustype = BUS_PARALLEL, 18299 .manufacture_id = SHARP_ID, 18300 .model_id = SHARP_LH28F008BJ__PB, 18301 .total_size = 1024, 18302 .page_size = 64 * 1024, 18303 .tested = TEST_OK_PREW, 18304 .probe = PROBE_AT82802AB, 18305 .probe_timing = TIMING_ZERO, 18306 .block_erasers = 18307 { 18308 { 18309 .eraseblocks = { 18310 {8 * 1024, 8}, 18311 {64 * 1024, 15} 18312 }, 18313 .block_erase = ERASE_BLOCK_82802AB, 18314 }, { 18315 .eraseblocks = { {1024 * 1024, 1} }, 18316 .block_erase = ERASE_SECTOR_49LFXXXC, 18317 } 18318 }, 18319 .unlock = UNLOCK_LH28F008BJT, 18320 .write = WRITE_82802AB, 18321 .read = READ_MEMMAPPED, 18322 .voltage = {2700, 3600}, 18323 }, 18324 18325 { 18326 .vendor = "Sharp", 18327 .name = "LHF00L04", 18328 .bustype = BUS_FWH, /* A/A Mux */ 18329 .manufacture_id = SHARP_ID, 18330 .model_id = SHARP_LHF00L04, 18331 .total_size = 1024, 18332 .page_size = 64 * 1024, 18333 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP, 18334 .tested = TEST_UNTESTED, 18335 .probe = PROBE_AT82802AB, 18336 .probe_timing = TIMING_ZERO, 18337 .block_erasers = 18338 { 18339 { 18340 .eraseblocks = { 18341 {64 * 1024, 15}, 18342 {8 * 1024, 8} 18343 }, 18344 .block_erase = ERASE_BLOCK_82802AB, 18345 }, { 18346 .eraseblocks = { 18347 {1024 * 1024, 1} 18348 }, 18349 .block_erase = NO_BLOCK_ERASE_FUNC, /* 30 D0, only in A/A mux mode */ 18350 }, 18351 }, 18352 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 18353 .write = WRITE_82802AB, 18354 .read = READ_MEMMAPPED, 18355 .voltage = {3000, 3600}, 18356 }, 18357 18358 { 18359 .vendor = "Spansion", 18360 .name = "S25FL004A", 18361 .bustype = BUS_SPI, 18362 .manufacture_id = SPANSION_ID, 18363 .model_id = SPANSION_S25FL004A, 18364 .total_size = 512, 18365 .page_size = 256, 18366 .feature_bits = FEATURE_WRSR_WREN, 18367 .tested = TEST_UNTESTED, 18368 .probe = PROBE_SPI_RDID, 18369 .probe_timing = TIMING_ZERO, 18370 .block_erasers = 18371 { 18372 { 18373 .eraseblocks = { {64 * 1024, 8} }, 18374 .block_erase = SPI_BLOCK_ERASE_D8, 18375 }, { 18376 .eraseblocks = { {512 * 1024, 1} }, 18377 .block_erase = SPI_BLOCK_ERASE_C7, 18378 } 18379 }, 18380 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 18381 .unlock = SPI_DISABLE_BLOCKPROTECT, 18382 .write = SPI_CHIP_WRITE256, 18383 .read = SPI_CHIP_READ, 18384 .voltage = {2700, 3600}, 18385 }, 18386 18387 { 18388 .vendor = "Spansion", 18389 .name = "S25FL008A", 18390 .bustype = BUS_SPI, 18391 .manufacture_id = SPANSION_ID, 18392 .model_id = SPANSION_S25FL008A, 18393 .total_size = 1024, 18394 .page_size = 256, 18395 .feature_bits = FEATURE_WRSR_WREN, 18396 .tested = TEST_OK_PRE, 18397 .probe = PROBE_SPI_RDID, 18398 .probe_timing = TIMING_ZERO, 18399 .block_erasers = 18400 { 18401 { 18402 .eraseblocks = { {64 * 1024, 16} }, 18403 .block_erase = SPI_BLOCK_ERASE_D8, 18404 }, { 18405 .eraseblocks = { {1024 * 1024, 1} }, 18406 .block_erase = SPI_BLOCK_ERASE_C7, 18407 } 18408 }, 18409 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 18410 .unlock = SPI_DISABLE_BLOCKPROTECT, 18411 .write = SPI_CHIP_WRITE256, 18412 .read = SPI_CHIP_READ, 18413 .voltage = {2700, 3600}, 18414 }, 18415 18416 { 18417 .vendor = "Spansion", 18418 .name = "S25FL016A", 18419 .bustype = BUS_SPI, 18420 .manufacture_id = SPANSION_ID, 18421 .model_id = SPANSION_S25FL016A, 18422 .total_size = 2048, 18423 .page_size = 256, 18424 .feature_bits = FEATURE_WRSR_WREN, 18425 .tested = TEST_OK_PREW, 18426 .probe = PROBE_SPI_RDID, 18427 .probe_timing = TIMING_ZERO, 18428 .block_erasers = 18429 { 18430 { 18431 .eraseblocks = { {64 * 1024, 32} }, 18432 .block_erase = SPI_BLOCK_ERASE_D8, 18433 }, { 18434 .eraseblocks = { {2 * 1024 * 1024, 1} }, 18435 .block_erase = SPI_BLOCK_ERASE_C7, 18436 } 18437 }, 18438 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 18439 .unlock = SPI_DISABLE_BLOCKPROTECT, 18440 .write = SPI_CHIP_WRITE256, 18441 .read = SPI_CHIP_READ, 18442 .voltage = {2700, 3600}, 18443 }, 18444 18445 { 18446 .vendor = "Spansion", 18447 .name = "S25FL032A/P", 18448 .bustype = BUS_SPI, 18449 .manufacture_id = SPANSION_ID, 18450 .model_id = SPANSION_S25FL032A, 18451 .total_size = 4096, 18452 .page_size = 256, 18453 .feature_bits = FEATURE_WRSR_WREN, 18454 .tested = TEST_OK_PREW, 18455 .probe = PROBE_SPI_RDID, 18456 .probe_timing = TIMING_ZERO, 18457 .block_erasers = 18458 { 18459 { 18460 .eraseblocks = { {64 * 1024, 64} }, 18461 .block_erase = SPI_BLOCK_ERASE_D8, 18462 }, { 18463 .eraseblocks = { {4 * 1024 * 1024, 1} }, 18464 .block_erase = SPI_BLOCK_ERASE_C7, 18465 } 18466 }, 18467 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 18468 .unlock = SPI_DISABLE_BLOCKPROTECT, 18469 .write = SPI_CHIP_WRITE256, 18470 .read = SPI_CHIP_READ, 18471 .voltage = {2700, 3600}, 18472 }, 18473 18474 { 18475 .vendor = "Spansion", 18476 .name = "S25FL064A/P", 18477 .bustype = BUS_SPI, 18478 .manufacture_id = SPANSION_ID, 18479 .model_id = SPANSION_S25FL064A, 18480 .total_size = 8192, 18481 .page_size = 256, 18482 .feature_bits = FEATURE_WRSR_WREN, 18483 .tested = TEST_OK_PREW, 18484 .probe = PROBE_SPI_RDID, 18485 .probe_timing = TIMING_ZERO, 18486 .block_erasers = 18487 { 18488 { 18489 .eraseblocks = { {64 * 1024, 128} }, 18490 .block_erase = SPI_BLOCK_ERASE_D8, 18491 }, { 18492 .eraseblocks = { {8 * 1024 * 1024, 1} }, 18493 .block_erase = SPI_BLOCK_ERASE_C7, 18494 } 18495 }, 18496 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 18497 .unlock = SPI_DISABLE_BLOCKPROTECT, 18498 .write = SPI_CHIP_WRITE256, 18499 .read = SPI_CHIP_READ, 18500 .voltage = {2700, 3600}, 18501 }, 18502 18503 { 18504 .vendor = "Spansion", 18505 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */ 18506 .bustype = BUS_SPI, 18507 .manufacture_id = SPANSION_ID, 18508 .model_id = SPANSION_S25FL216, 18509 .total_size = 2048, 18510 .page_size = 256, 18511 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */ 18512 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18513 .tested = TEST_UNTESTED, 18514 .probe = PROBE_SPI_RDID, 18515 .probe_timing = TIMING_ZERO, 18516 .block_erasers = 18517 { 18518 { 18519 .eraseblocks = { {4 * 1024, 512} }, 18520 .block_erase = SPI_BLOCK_ERASE_20, 18521 }, { 18522 .eraseblocks = { {64 * 1024, 32} }, 18523 .block_erase = SPI_BLOCK_ERASE_D8, 18524 }, { 18525 .eraseblocks = { { 2048 * 1024, 1} }, 18526 .block_erase = SPI_BLOCK_ERASE_60, 18527 }, { 18528 .eraseblocks = { { 2048 * 1024, 1} }, 18529 .block_erase = SPI_BLOCK_ERASE_C7, 18530 } 18531 }, 18532 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 18533 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, /* #WP pin write-protects SRWP bit. */ 18534 .write = SPI_CHIP_WRITE256, 18535 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 18536 .voltage = {2700, 3600}, 18537 }, 18538 18539 { 18540 .vendor = "Spansion", 18541 .name = "S25FL127S-256kB", /* uniform 256kB sectors */ 18542 .bustype = BUS_SPI, 18543 .manufacture_id = SPANSION_ID, 18544 .model_id = SPANSION_S25FL128, 18545 .total_size = 16384, 18546 .page_size = 512, 18547 /* supports 4B addressing */ 18548 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 18549 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18550 .tested = TEST_UNTESTED, 18551 .probe = PROBE_SPI_RDID, 18552 .probe_timing = TIMING_ZERO, 18553 .block_erasers = 18554 { 18555 { 18556 .eraseblocks = { {256 * 1024, 64} }, 18557 .block_erase = SPI_BLOCK_ERASE_D8, 18558 }, { 18559 .eraseblocks = { { 16384 * 1024, 1} }, 18560 .block_erase = SPI_BLOCK_ERASE_60, 18561 }, { 18562 .eraseblocks = { { 16384 * 1024, 1} }, 18563 .block_erase = SPI_BLOCK_ERASE_C7, 18564 } 18565 }, 18566 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18567 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* #WP pin write-protects SRWP bit. */ 18568 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18569 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18570 .voltage = {2700, 3600}, 18571 }, 18572 18573 { 18574 .vendor = "Spansion", 18575 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 18576 .bustype = BUS_SPI, 18577 .manufacture_id = SPANSION_ID, 18578 .model_id = SPANSION_S25FL128, 18579 .total_size = 16384, 18580 .page_size = 256, 18581 /* supports 4B addressing */ 18582 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 18583 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18584 .tested = TEST_OK_PREW, 18585 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */ 18586 .probe = PROBE_SPI_RDID, 18587 .probe_timing = TIMING_ZERO, 18588 .block_erasers = 18589 { 18590 { 18591 /* This chip supports erasing of 32 so-called "parameter sectors" with 18592 * opcode 0x20 which may be configured to be on top or bottom of the address 18593 * space. Trying to access an address outside these 4kB blocks does have no 18594 * effect on the memory contents, e.g. 18595 .eraseblocks = { 18596 {4 * 1024, 32}, 18597 {64 * 1024, 254} // inaccessible 18598 }, 18599 .block_erase = SPI_BLOCK_ERASE_20, 18600 }, { */ 18601 .eraseblocks = { { 64 * 1024, 256} }, 18602 .block_erase = SPI_BLOCK_ERASE_D8, 18603 }, { 18604 .eraseblocks = { { 16384 * 1024, 1} }, 18605 .block_erase = SPI_BLOCK_ERASE_60, 18606 }, { 18607 .eraseblocks = { { 16384 * 1024, 1} }, 18608 .block_erase = SPI_BLOCK_ERASE_C7, 18609 } 18610 }, 18611 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18612 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* #WP pin write-protects SRWP bit. */ 18613 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18614 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18615 .voltage = {2700, 3600}, 18616 }, 18617 18618 { 18619 .vendor = "Spansion", 18620 .name = "S25FL128L", 18621 .bustype = BUS_SPI, 18622 .manufacture_id = SPANSION_ID, 18623 .model_id = SPANSION_S25FL128L, 18624 .total_size = 16384, 18625 .page_size = 256, 18626 /* 4 x 256B Security Region (OTP) */ 18627 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP, 18628 .tested = TEST_OK_PREW, 18629 .probe = PROBE_SPI_RDID, 18630 .probe_timing = TIMING_ZERO, 18631 .block_erasers = 18632 { 18633 { 18634 .eraseblocks = { {4 * 1024, 4096} }, 18635 .block_erase = SPI_BLOCK_ERASE_20, 18636 }, { 18637 .eraseblocks = { {32 * 1024, 512} }, 18638 .block_erase = SPI_BLOCK_ERASE_52, 18639 }, { 18640 .eraseblocks = { {64 * 1024, 256} }, 18641 .block_erase = SPI_BLOCK_ERASE_D8, 18642 }, { 18643 .eraseblocks = { {16384 * 1024, 1} }, 18644 .block_erase = SPI_BLOCK_ERASE_60, 18645 }, { 18646 .eraseblocks = { {16384 * 1024, 1} }, 18647 .block_erase = SPI_BLOCK_ERASE_C7, 18648 } 18649 }, 18650 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18651 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 18652 .write = SPI_CHIP_WRITE256, 18653 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 18654 .voltage = {2700, 3600}, 18655 .reg_bits = 18656 { 18657 /* 18658 * Note: This chip has a read-only Status Register 2 that is not 18659 * counted here. Registers are mapped as follows: 18660 * STATUS1 ... Status Register 1 18661 * STATUS2 ... Configuration Register 1 18662 * STATUS3 ... Configuration Register 2 18663 */ 18664 .srp = {STATUS1, 7, RW}, 18665 .srl = {STATUS2, 0, RW}, 18666 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 18667 .tb = {STATUS1, 5, RW}, 18668 .sec = {STATUS1, 6, RW}, 18669 .cmp = {STATUS2, 6, RW}, 18670 .wps = {STATUS3, 2, RW}, 18671 }, 18672 .decode_range = DECODE_RANGE_SPI25, 18673 }, 18674 18675 { 18676 .vendor = "Spansion", 18677 .name = "S25FL128P......0", /* uniform 64 kB sectors */ 18678 .bustype = BUS_SPI, 18679 .manufacture_id = SPANSION_ID, 18680 .model_id = SPANSION_S25FL128, 18681 .total_size = 16384, 18682 .page_size = 256, 18683 .feature_bits = FEATURE_WRSR_WREN, 18684 .tested = TEST_OK_PREW, 18685 .probe = PROBE_SPI_RDID, 18686 .probe_timing = TIMING_ZERO, 18687 .block_erasers = 18688 { 18689 { 18690 .eraseblocks = { {64 * 1024, 256} }, 18691 .block_erase = SPI_BLOCK_ERASE_20, 18692 }, { 18693 .eraseblocks = { {64 * 1024, 256} }, 18694 .block_erase = SPI_BLOCK_ERASE_D8, 18695 }, { 18696 .eraseblocks = { { 16384 * 1024, 1} }, 18697 .block_erase = SPI_BLOCK_ERASE_60, 18698 }, { 18699 .eraseblocks = { { 16384 * 1024, 1} }, 18700 .block_erase = SPI_BLOCK_ERASE_C7, 18701 } 18702 }, 18703 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 18704 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 18705 .write = SPI_CHIP_WRITE256, 18706 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 18707 .voltage = {2700, 3600}, 18708 }, 18709 18710 { 18711 .vendor = "Spansion", 18712 .name = "S25FL128P......1", /* uniform 256kB sectors */ 18713 .bustype = BUS_SPI, 18714 .manufacture_id = SPANSION_ID, 18715 .model_id = SPANSION_S25FL128, 18716 .total_size = 16384, 18717 .page_size = 256, 18718 .feature_bits = FEATURE_WRSR_WREN, 18719 .tested = TEST_UNTESTED, 18720 .probe = PROBE_SPI_RDID, 18721 .probe_timing = TIMING_ZERO, 18722 .block_erasers = 18723 { 18724 { 18725 .eraseblocks = { {256 * 1024, 64} }, 18726 .block_erase = SPI_BLOCK_ERASE_D8, 18727 }, { 18728 .eraseblocks = { { 16384 * 1024, 1} }, 18729 .block_erase = SPI_BLOCK_ERASE_C7, 18730 } 18731 }, 18732 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 18733 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 18734 .write = SPI_CHIP_WRITE256, 18735 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 18736 .voltage = {2700, 3600}, 18737 }, 18738 18739 { 18740 .vendor = "Spansion", 18741 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 18742 .bustype = BUS_SPI, 18743 .manufacture_id = SPANSION_ID, 18744 .model_id = SPANSION_S25FL128, 18745 .total_size = 16384, 18746 .page_size = 256, 18747 /* supports 4B addressing */ 18748 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 18749 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18750 .tested = TEST_OK_PREW, 18751 .probe = PROBE_SPI_RDID, 18752 .probe_timing = TIMING_ZERO, 18753 .block_erasers = 18754 { 18755 { 18756 /* This chip supports erasing of the 32 so-called "parameter sectors" with 18757 * opcode 0x20. Trying to access an address outside these 4kB blocks does 18758 * have no effect on the memory contents, but sets a flag in the SR. 18759 .eraseblocks = { 18760 {4 * 1024, 32}, 18761 {64 * 1024, 254} // inaccessible 18762 }, 18763 .block_erase = SPI_BLOCK_ERASE_20, 18764 }, { */ 18765 .eraseblocks = { { 64 * 1024, 256} }, 18766 .block_erase = SPI_BLOCK_ERASE_D8, 18767 }, { 18768 .eraseblocks = { { 16384 * 1024, 1} }, 18769 .block_erase = SPI_BLOCK_ERASE_60, 18770 }, { 18771 .eraseblocks = { { 16384 * 1024, 1} }, 18772 .block_erase = SPI_BLOCK_ERASE_C7, 18773 } 18774 }, 18775 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: SR2 and many others */ 18776 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: various other locks */ 18777 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18778 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18779 .voltage = {2700, 3600}, 18780 }, 18781 18782 { 18783 .vendor = "Spansion", 18784 .name = "S25FL128S......1", /* uniform 256 kB sectors */ 18785 .bustype = BUS_SPI, 18786 .manufacture_id = SPANSION_ID, 18787 .model_id = SPANSION_S25FL128, 18788 .total_size = 16384, 18789 .page_size = 512, 18790 /* supports 4B addressing */ 18791 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 18792 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18793 .tested = TEST_UNTESTED, 18794 .probe = PROBE_SPI_RDID, 18795 .probe_timing = TIMING_ZERO, 18796 .block_erasers = 18797 { 18798 { 18799 .eraseblocks = { {256 * 1024, 64} }, 18800 .block_erase = SPI_BLOCK_ERASE_D8, 18801 }, { 18802 .eraseblocks = { { 16384 * 1024, 1} }, 18803 .block_erase = SPI_BLOCK_ERASE_60, 18804 }, { 18805 .eraseblocks = { { 16384 * 1024, 1} }, 18806 .block_erase = SPI_BLOCK_ERASE_C7, 18807 } 18808 }, 18809 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: SR2 and many others */ 18810 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: various other locks */ 18811 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18812 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18813 .voltage = {2700, 3600}, 18814 }, 18815 18816 { 18817 .vendor = "Spansion", 18818 .name = "S25FL128S_UL Uniform 128 kB Sectors", 18819 .bustype = BUS_SPI, 18820 .manufacture_id = SPANSION_ID, 18821 .model_id = SPANSION_S25FL128S_UL, 18822 .total_size = 16384, 18823 .page_size = 256, 18824 .feature_bits = FEATURE_WRSR_WREN, 18825 .tested = TEST_UNTESTED, 18826 .probe = PROBE_SPI_BIG_SPANSION, 18827 .probe_timing = TIMING_ZERO, 18828 .block_erasers = 18829 { 18830 { 18831 .eraseblocks = { {128 * 1024, 128} }, 18832 .block_erase = SPI_BLOCK_ERASE_D8, 18833 }, { 18834 .eraseblocks = { {16 * 1024 * 1024, 1} }, 18835 .block_erase = SPI_BLOCK_ERASE_60, 18836 }, { 18837 .eraseblocks = { {16 * 1024 * 1024, 1} }, 18838 .block_erase = SPI_BLOCK_ERASE_C7, 18839 }, 18840 }, 18841 .unlock = SPI_DISABLE_BLOCKPROTECT, 18842 .write = SPI_CHIP_WRITE256, 18843 .read = SPI_CHIP_READ, 18844 .voltage = {1700, 2000}, 18845 }, 18846 18847 { 18848 .vendor = "Spansion", 18849 .name = "S25FL128S_US Uniform 64 kB Sectors", 18850 .bustype = BUS_SPI, 18851 .manufacture_id = SPANSION_ID, 18852 .model_id = SPANSION_S25FL128S_US, 18853 .total_size = 16384, 18854 .page_size = 256, 18855 .feature_bits = FEATURE_WRSR_WREN, 18856 .tested = TEST_UNTESTED, 18857 .probe = PROBE_SPI_BIG_SPANSION, 18858 .probe_timing = TIMING_ZERO, 18859 .block_erasers = 18860 { 18861 { 18862 .eraseblocks = { {64 * 1024, 256} }, 18863 .block_erase = SPI_BLOCK_ERASE_D8, 18864 }, { 18865 .eraseblocks = { {16 * 1024 * 1024, 1} }, 18866 .block_erase = SPI_BLOCK_ERASE_60, 18867 }, { 18868 .eraseblocks = { {16 * 1024 * 1024, 1} }, 18869 .block_erase = SPI_BLOCK_ERASE_C7, 18870 }, 18871 }, 18872 .unlock = SPI_DISABLE_BLOCKPROTECT, 18873 .write = SPI_CHIP_WRITE256, 18874 .read = SPI_CHIP_READ, 18875 .voltage = {1700, 2000}, 18876 }, 18877 18878 { 18879 .vendor = "Spansion", 18880 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 18881 .bustype = BUS_SPI, 18882 .manufacture_id = SPANSION_ID, 18883 .model_id = SPANSION_S25FL128, 18884 .total_size = 16384, 18885 .page_size = 256, 18886 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */ 18887 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18888 .tested = TEST_OK_PREW, 18889 .probe = PROBE_SPI_RDID, 18890 .probe_timing = TIMING_ZERO, 18891 .block_erasers = 18892 { 18893 { 18894 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with 18895 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no 18896 * effect on the memory contents, but sets a flag in the SR. 18897 .eraseblocks = { 18898 {4 * 1024, 32}, 18899 {64 * 1024, 254} // inaccessible 18900 }, 18901 .block_erase = SPI_BLOCK_ERASE_20, 18902 }, { */ 18903 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs 18904 .eraseblocks = { 18905 {8 * 1024, 16}, 18906 {64 * 1024, 254} // inaccessible 18907 }, 18908 .block_erase = SPI_BLOCK_ERASE_40, 18909 }, { */ 18910 .eraseblocks = { { 64 * 1024, 256} }, 18911 .block_erase = SPI_BLOCK_ERASE_D8, 18912 }, { 18913 .eraseblocks = { { 16384 * 1024, 1} }, 18914 .block_erase = SPI_BLOCK_ERASE_60, 18915 }, { 18916 .eraseblocks = { { 16384 * 1024, 1} }, 18917 .block_erase = SPI_BLOCK_ERASE_C7, 18918 } 18919 }, 18920 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: Configuration register */ 18921 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 18922 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18923 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18924 .voltage = {2700, 3600}, 18925 }, 18926 18927 { 18928 .vendor = "Spansion", 18929 .name = "S25FL129P......1", /* uniform 256 kB sectors */ 18930 .bustype = BUS_SPI, 18931 .manufacture_id = SPANSION_ID, 18932 .model_id = SPANSION_S25FL128, 18933 .total_size = 16384, 18934 .page_size = 256, 18935 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */ 18936 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18937 .tested = TEST_UNTESTED, 18938 .probe = PROBE_SPI_RDID, 18939 .probe_timing = TIMING_ZERO, 18940 .block_erasers = 18941 { 18942 { 18943 .eraseblocks = { {256 * 1024, 64} }, 18944 .block_erase = SPI_BLOCK_ERASE_D8, 18945 }, { 18946 .eraseblocks = { { 16384 * 1024, 1} }, 18947 .block_erase = SPI_BLOCK_ERASE_60, 18948 }, { 18949 .eraseblocks = { { 16384 * 1024, 1} }, 18950 .block_erase = SPI_BLOCK_ERASE_C7, 18951 } 18952 }, 18953 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: Configuration register */ 18954 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 18955 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 18956 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18957 .voltage = {2700, 3600}, 18958 }, 18959 18960 { 18961 .vendor = "Spansion", 18962 .name = "S25FL132K", 18963 .bustype = BUS_SPI, 18964 .manufacture_id = SPANSION_ID, 18965 .model_id = SPANSION_S25FL132K, 18966 .total_size = 4096, 18967 .page_size = 256, 18968 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 18969 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 18970 .tested = TEST_UNTESTED, 18971 .probe = PROBE_SPI_RDID, 18972 .probe_timing = TIMING_ZERO, 18973 .block_erasers = 18974 { 18975 { 18976 .eraseblocks = { {4 * 1024, 1024} }, 18977 .block_erase = SPI_BLOCK_ERASE_20, 18978 }, { 18979 .eraseblocks = { {64 * 1024, 64} }, 18980 .block_erase = SPI_BLOCK_ERASE_D8, 18981 }, { 18982 .eraseblocks = { { 4096 * 1024, 1} }, 18983 .block_erase = SPI_BLOCK_ERASE_60, 18984 }, { 18985 .eraseblocks = { { 4096 * 1024, 1} }, 18986 .block_erase = SPI_BLOCK_ERASE_C7, 18987 } 18988 }, 18989 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* TODO: improve */ 18990 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* #WP pin write-protects SRWP bit. */ 18991 .write = SPI_CHIP_WRITE256, 18992 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 18993 .voltage = {2700, 3600}, 18994 }, 18995 18996 { 18997 .vendor = "Spansion", 18998 .name = "S25FL164K", 18999 .bustype = BUS_SPI, 19000 .manufacture_id = SPANSION_ID, 19001 .model_id = SPANSION_S25FL164K, 19002 .total_size = 8192, 19003 .page_size = 256, 19004 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */ 19005 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 19006 .tested = TEST_OK_PREW, 19007 .probe = PROBE_SPI_RDID, 19008 .probe_timing = TIMING_ZERO, 19009 .block_erasers = 19010 { 19011 { 19012 .eraseblocks = { {4 * 1024, 2048} }, 19013 .block_erase = SPI_BLOCK_ERASE_20, 19014 }, { 19015 .eraseblocks = { {64 * 1024, 128} }, 19016 .block_erase = SPI_BLOCK_ERASE_D8, 19017 }, { 19018 .eraseblocks = { { 8192 * 1024, 1} }, 19019 .block_erase = SPI_BLOCK_ERASE_60, 19020 }, { 19021 .eraseblocks = { { 8192 * 1024, 1} }, 19022 .block_erase = SPI_BLOCK_ERASE_C7, 19023 } 19024 }, 19025 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, /* TODO: improve */ 19026 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* #WP pin write-protects SRWP bit. */ 19027 .write = SPI_CHIP_WRITE256, 19028 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 19029 .voltage = {2700, 3600}, 19030 }, 19031 19032 { 19033 .vendor = "Spansion", 19034 .name = "S25FL204K", 19035 .bustype = BUS_SPI, 19036 .manufacture_id = SPANSION_ID, 19037 .model_id = SPANSION_S25FL204, 19038 .total_size = 512, 19039 .page_size = 256, 19040 .feature_bits = FEATURE_WRSR_WREN, 19041 .tested = TEST_OK_PR, 19042 .probe = PROBE_SPI_RDID, 19043 .probe_timing = TIMING_ZERO, 19044 .block_erasers = 19045 { 19046 { 19047 .eraseblocks = { {4 * 1024, 128} }, 19048 .block_erase = SPI_BLOCK_ERASE_20, 19049 }, { 19050 .eraseblocks = { {64 * 1024, 8} }, 19051 .block_erase = SPI_BLOCK_ERASE_D8, 19052 }, { 19053 .eraseblocks = { { 512 * 1024, 1} }, 19054 .block_erase = SPI_BLOCK_ERASE_60, 19055 }, { 19056 .eraseblocks = { { 512 * 1024, 1} }, 19057 .block_erase = SPI_BLOCK_ERASE_C7, 19058 } 19059 }, 19060 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 19061 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, /* #WP pin write-protects SRWP bit. */ 19062 .write = SPI_CHIP_WRITE256, 19063 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 19064 .voltage = {2700, 3600}, 19065 }, 19066 19067 { 19068 .vendor = "Spansion", 19069 .name = "S25FL208K", 19070 .bustype = BUS_SPI, 19071 .manufacture_id = SPANSION_ID, 19072 .model_id = SPANSION_S25FL208, 19073 .total_size = 1024, 19074 .page_size = 256, 19075 .feature_bits = FEATURE_WRSR_WREN, 19076 .tested = TEST_OK_PREW, 19077 .probe = PROBE_SPI_RDID, 19078 .probe_timing = TIMING_ZERO, 19079 .block_erasers = 19080 { 19081 { 19082 .eraseblocks = { {4 * 1024, 256} }, 19083 .block_erase = SPI_BLOCK_ERASE_20, 19084 }, { 19085 .eraseblocks = { {64 * 1024, 16} }, 19086 .block_erase = SPI_BLOCK_ERASE_D8, 19087 }, { 19088 .eraseblocks = { { 1024 * 1024, 1} }, 19089 .block_erase = SPI_BLOCK_ERASE_60, 19090 }, { 19091 .eraseblocks = { { 1024 * 1024, 1} }, 19092 .block_erase = SPI_BLOCK_ERASE_C7, 19093 } 19094 }, 19095 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 19096 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, /* #WP pin write-protects SRWP bit. */ 19097 .write = SPI_CHIP_WRITE256, 19098 .read = SPI_CHIP_READ, /* Fast read (0x0B) and dual I/O (0x3B) supported */ 19099 .voltage = {2700, 3600}, 19100 }, 19101 19102 { 19103 .vendor = "Spansion", 19104 .name = "S25FL256L", 19105 .bustype = BUS_SPI, 19106 .manufacture_id = SPANSION_ID, 19107 .model_id = SPANSION_S25FL256L, 19108 .total_size = 32768, 19109 .page_size = 256, 19110 /* 4 x 256B Security Region (OTP) */ 19111 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP | 19112 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE, 19113 .tested = TEST_UNTESTED, 19114 .probe = PROBE_SPI_RDID, 19115 .probe_timing = TIMING_ZERO, 19116 .block_erasers = 19117 { 19118 { 19119 .eraseblocks = { {4 * 1024, 8192} }, 19120 .block_erase = SPI_BLOCK_ERASE_21, 19121 }, { 19122 .eraseblocks = { {4 * 1024, 8192} }, 19123 .block_erase = SPI_BLOCK_ERASE_20, 19124 }, { 19125 .eraseblocks = { {32 * 1024, 1024} }, 19126 .block_erase = SPI_BLOCK_ERASE_53, 19127 }, { 19128 .eraseblocks = { {32 * 1024, 1024} }, 19129 .block_erase = SPI_BLOCK_ERASE_52, 19130 }, { 19131 .eraseblocks = { {64 * 1024, 512} }, 19132 .block_erase = SPI_BLOCK_ERASE_DC, 19133 }, { 19134 .eraseblocks = { {64 * 1024, 512} }, 19135 .block_erase = SPI_BLOCK_ERASE_D8, 19136 }, { 19137 .eraseblocks = { {32768 * 1024, 1} }, 19138 .block_erase = SPI_BLOCK_ERASE_60, 19139 }, { 19140 .eraseblocks = { {32768 * 1024, 1} }, 19141 .block_erase = SPI_BLOCK_ERASE_C7, 19142 } 19143 }, 19144 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 19145 .unlock = SPI_DISABLE_BLOCKPROTECT_BP3_SRWD, 19146 .write = SPI_CHIP_WRITE256, 19147 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 19148 .voltage = {2700, 3600}, 19149 .reg_bits = 19150 { 19151 /* 19152 * Note: This chip has a read-only Status Register 2 that is not 19153 * counted here. Registers are mapped as follows: 19154 * STATUS1 ... Status Register 1 19155 * STATUS2 ... Configuration Register 1 19156 * STATUS3 ... Configuration Register 2 19157 */ 19158 .srp = {STATUS1, 7, RW}, 19159 .srl = {STATUS2, 0, RW}, 19160 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 19161 .tb = {STATUS1, 6, RW}, 19162 .cmp = {STATUS2, 6, RW}, 19163 .wps = {STATUS3, 2, RW}, 19164 }, 19165 .decode_range = DECODE_RANGE_SPI25, 19166 }, 19167 19168 { 19169 .vendor = "Spansion", 19170 .name = "S25FL256S Large Sectors", 19171 .bustype = BUS_SPI, 19172 .manufacture_id = SPANSION_ID, 19173 .model_id = SPANSION_S25FL256S_UL, 19174 .total_size = 16384, /* This is just half the size.... */ 19175 .page_size = 256, 19176 .feature_bits = FEATURE_WRSR_WREN, 19177 .tested = TEST_UNTESTED, 19178 .probe = PROBE_SPI_BIG_SPANSION, 19179 .probe_timing = TIMING_ZERO, 19180 .block_erasers = 19181 { 19182 { 19183 .eraseblocks = { {256 * 1024, 64} }, 19184 .block_erase = S25FL_BLOCK_ERASE, 19185 }, { 19186 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19187 .block_erase = SPI_BLOCK_ERASE_60, 19188 }, 19189 }, 19190 .unlock = SPI_DISABLE_BLOCKPROTECT, 19191 .write = SPI_CHIP_WRITE256, 19192 .read = SPI_CHIP_READ, 19193 .voltage = {1700, 2000}, 19194 }, 19195 19196 { 19197 .vendor = "Spansion", 19198 .name = "S25FL256S Small Sectors", 19199 .bustype = BUS_SPI, 19200 .manufacture_id = SPANSION_ID, 19201 .model_id = SPANSION_S25FL256S_US, 19202 .total_size = 16384, /* This is just half the size.... */ 19203 .page_size = 256, 19204 .feature_bits = FEATURE_WRSR_WREN, 19205 .tested = TEST_OK_PREW, 19206 .probe = PROBE_SPI_BIG_SPANSION, 19207 .probe_timing = TIMING_ZERO, 19208 .block_erasers = 19209 { 19210 { 19211 .eraseblocks = { {64 * 1024, 256} }, 19212 .block_erase = S25FL_BLOCK_ERASE, 19213 }, { 19214 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19215 .block_erase = SPI_BLOCK_ERASE_60, 19216 }, 19217 }, 19218 .unlock = SPI_DISABLE_BLOCKPROTECT, 19219 .write = SPI_CHIP_WRITE256, 19220 .read = SPI_CHIP_READ, 19221 .voltage = {1700, 2000}, 19222 }, 19223 19224 { 19225 .vendor = "Spansion", 19226 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */ 19227 .bustype = BUS_SPI, 19228 .manufacture_id = SPANSION_ID, 19229 .model_id = SPANSION_S25FL256, 19230 .total_size = 32768, 19231 .page_size = 256, 19232 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 19233 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 19234 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716, 19235 .tested = TEST_OK_PREW, 19236 .probe = PROBE_SPI_RDID, 19237 .probe_timing = TIMING_ZERO, 19238 .block_erasers = 19239 { 19240 { 19241 /* This chip supports erasing of the 32 so-called "parameter sectors" with 19242 * opcode 0x20. Trying to access an address outside these 4kB blocks does 19243 * have no effect on the memory contents, but sets a flag in the SR. 19244 .eraseblocks = { 19245 {4 * 1024, 32}, 19246 {64 * 1024, 254} // inaccessible 19247 }, 19248 .block_erase = SPI_BLOCK_ERASE_20, 19249 }, { */ 19250 .eraseblocks = { { 64 * 1024, 512} }, 19251 .block_erase = SPI_BLOCK_ERASE_DC, 19252 }, { 19253 .eraseblocks = { { 64 * 1024, 512} }, 19254 .block_erase = SPI_BLOCK_ERASE_D8, 19255 }, { 19256 .eraseblocks = { { 32768 * 1024, 1} }, 19257 .block_erase = SPI_BLOCK_ERASE_60, 19258 }, { 19259 .eraseblocks = { { 32768 * 1024, 1} }, 19260 .block_erase = SPI_BLOCK_ERASE_C7, 19261 } 19262 }, 19263 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: SR2 and many others */ 19264 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: various other locks */ 19265 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 19266 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 19267 .voltage = {2700, 3600}, 19268 }, 19269 19270 { 19271 .vendor = "Spansion", 19272 .name = "S25FL512S", 19273 .bustype = BUS_SPI, 19274 .manufacture_id = SPANSION_ID, 19275 .model_id = SPANSION_S25FL512, 19276 .total_size = 65536, /* 512 Mb (=> 64 MB)) */ 19277 .page_size = 256, 19278 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */ 19279 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 19280 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716, 19281 .tested = TEST_UNTESTED, 19282 .probe = PROBE_SPI_RDID, 19283 .probe_timing = TIMING_ZERO, 19284 .block_erasers = 19285 { 19286 { 19287 .eraseblocks = { { 256 * 1024, 256} }, 19288 .block_erase = SPI_BLOCK_ERASE_DC, 19289 }, { 19290 .eraseblocks = { { 256 * 1024, 256} }, 19291 .block_erase = SPI_BLOCK_ERASE_D8, 19292 }, { 19293 .eraseblocks = { { 65536 * 1024, 1} }, 19294 .block_erase = SPI_BLOCK_ERASE_60, 19295 }, { 19296 .eraseblocks = { { 65536 * 1024, 1} }, 19297 .block_erase = SPI_BLOCK_ERASE_C7, 19298 } 19299 }, 19300 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_EP_SRWD, /* TODO: SR2 and many others */ 19301 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, /* TODO: various other locks */ 19302 .write = SPI_CHIP_WRITE256, /* Multi I/O supported, IGNORE for now */ 19303 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 19304 .voltage = {2700, 3600}, 19305 }, 19306 19307 { 19308 .vendor = "Spansion", 19309 .name = "S25FS128S Large Sectors", 19310 .bustype = BUS_SPI, 19311 .manufacture_id = SPANSION_ID, 19312 .model_id = SPANSION_S25FS128S_L, 19313 .total_size = 16384, 19314 .page_size = 256, 19315 .feature_bits = FEATURE_WRSR_WREN, 19316 .tested = TEST_UNTESTED, 19317 .probe = PROBE_SPI_BIG_SPANSION, 19318 .probe_timing = TIMING_ZERO, 19319 .block_erasers = 19320 { 19321 { 19322 .eraseblocks = { {64 * 1024, 256} }, 19323 .block_erase = S25FS_BLOCK_ERASE_D8, 19324 }, { 19325 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19326 .block_erase = SPI_BLOCK_ERASE_60, 19327 }, { 19328 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19329 .block_erase = SPI_BLOCK_ERASE_C7, 19330 }, 19331 }, 19332 .unlock = SPI_DISABLE_BLOCKPROTECT, 19333 .write = SPI_CHIP_WRITE256, 19334 .read = SPI_CHIP_READ, 19335 .voltage = {1700, 2000}, 19336 }, 19337 19338 { 19339 .vendor = "Spansion", 19340 .name = "S25FS128S Small Sectors", 19341 .bustype = BUS_SPI, 19342 .manufacture_id = SPANSION_ID, 19343 .model_id = SPANSION_S25FS128S_S, 19344 .total_size = 16384, 19345 .page_size = 256, 19346 .feature_bits = FEATURE_WRSR_WREN, 19347 .tested = TEST_OK_PREW, 19348 .probe = PROBE_SPI_BIG_SPANSION, 19349 .probe_timing = TIMING_ZERO, 19350 .block_erasers = 19351 { 19352 { 19353 .eraseblocks = { {64 * 1024, 256} }, 19354 .block_erase = S25FS_BLOCK_ERASE_D8, 19355 }, { 19356 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19357 .block_erase = SPI_BLOCK_ERASE_60, 19358 }, { 19359 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19360 .block_erase = SPI_BLOCK_ERASE_C7, 19361 }, 19362 }, 19363 .unlock = SPI_DISABLE_BLOCKPROTECT, 19364 .write = SPI_CHIP_WRITE256, 19365 .read = SPI_CHIP_READ, 19366 .voltage = {1700, 2000}, 19367 }, 19368 19369 { 19370 .vendor = "SyncMOS/MoselVitelic", 19371 .name = "{F,S,V}29C51001B", 19372 .bustype = BUS_PARALLEL, 19373 .manufacture_id = SYNCMOS_MVC_ID, 19374 .model_id = SM_MVC_29C51001B, 19375 .total_size = 128, 19376 .page_size = 512, 19377 .feature_bits = FEATURE_EITHER_RESET, 19378 .tested = TEST_UNTESTED, 19379 .probe = PROBE_JEDEC, 19380 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19381 .block_erasers = 19382 { 19383 { 19384 .eraseblocks = { {512, 256} }, 19385 .block_erase = JEDEC_SECTOR_ERASE, 19386 }, { 19387 .eraseblocks = { {128 * 1024, 1} }, 19388 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19389 }, 19390 }, 19391 .write = WRITE_JEDEC1, 19392 .read = READ_MEMMAPPED, 19393 .voltage = {4500, 5500}, 19394 }, 19395 19396 { 19397 .vendor = "SyncMOS/MoselVitelic", 19398 .name = "{F,S,V}29C51001T", 19399 .bustype = BUS_PARALLEL, 19400 .manufacture_id = SYNCMOS_MVC_ID, 19401 .model_id = SM_MVC_29C51001T, 19402 .total_size = 128, 19403 .page_size = 512, 19404 .feature_bits = FEATURE_EITHER_RESET, 19405 .tested = TEST_UNTESTED, 19406 .probe = PROBE_JEDEC, 19407 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19408 .block_erasers = 19409 { 19410 { 19411 .eraseblocks = { {512, 256} }, 19412 .block_erase = JEDEC_SECTOR_ERASE, 19413 }, { 19414 .eraseblocks = { {128 * 1024, 1} }, 19415 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19416 }, 19417 }, 19418 .write = WRITE_JEDEC1, 19419 .read = READ_MEMMAPPED, 19420 .voltage = {4500, 5500}, 19421 }, 19422 19423 { 19424 .vendor = "SyncMOS/MoselVitelic", 19425 .name = "{F,S,V}29C51002B", 19426 .bustype = BUS_PARALLEL, 19427 .manufacture_id = SYNCMOS_MVC_ID, 19428 .model_id = SM_MVC_29C51002B, 19429 .total_size = 256, 19430 .page_size = 512, 19431 .feature_bits = FEATURE_EITHER_RESET, 19432 .tested = TEST_UNTESTED, 19433 .probe = PROBE_JEDEC, 19434 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19435 .block_erasers = 19436 { 19437 { 19438 .eraseblocks = { {512, 512} }, 19439 .block_erase = JEDEC_SECTOR_ERASE, 19440 }, { 19441 .eraseblocks = { {256 * 1024, 1} }, 19442 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19443 }, 19444 }, 19445 .write = WRITE_JEDEC1, 19446 .read = READ_MEMMAPPED, 19447 }, 19448 19449 { 19450 .vendor = "SyncMOS/MoselVitelic", 19451 .name = "{F,S,V}29C51002T", 19452 .bustype = BUS_PARALLEL, 19453 .manufacture_id = SYNCMOS_MVC_ID, 19454 .model_id = SM_MVC_29C51002T, 19455 .total_size = 256, 19456 .page_size = 512, 19457 .feature_bits = FEATURE_EITHER_RESET, 19458 .tested = TEST_OK_PREW, 19459 .probe = PROBE_JEDEC, 19460 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19461 .block_erasers = 19462 { 19463 { 19464 .eraseblocks = { {512, 512} }, 19465 .block_erase = JEDEC_SECTOR_ERASE, 19466 }, { 19467 .eraseblocks = { {256 * 1024, 1} }, 19468 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19469 }, 19470 }, 19471 .write = WRITE_JEDEC1, 19472 .read = READ_MEMMAPPED, 19473 }, 19474 19475 { 19476 .vendor = "SyncMOS/MoselVitelic", 19477 .name = "{F,S,V}29C51004B", 19478 .bustype = BUS_PARALLEL, 19479 .manufacture_id = SYNCMOS_MVC_ID, 19480 .model_id = SM_MVC_29C51004B, 19481 .total_size = 512, 19482 .page_size = 1024, 19483 .feature_bits = FEATURE_EITHER_RESET, 19484 .tested = TEST_UNTESTED, 19485 .probe = PROBE_JEDEC, 19486 .probe_timing = TIMING_ZERO, 19487 .block_erasers = 19488 { 19489 { 19490 .eraseblocks = { {1024, 512} }, 19491 .block_erase = JEDEC_SECTOR_ERASE, 19492 }, { 19493 .eraseblocks = { {512 * 1024, 1} }, 19494 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19495 }, 19496 }, 19497 .write = WRITE_JEDEC1, 19498 .read = READ_MEMMAPPED, 19499 .voltage = {4500, 5500}, 19500 }, 19501 19502 { 19503 .vendor = "SyncMOS/MoselVitelic", 19504 .name = "{F,S,V}29C51004T", 19505 .bustype = BUS_PARALLEL, 19506 .manufacture_id = SYNCMOS_MVC_ID, 19507 .model_id = SM_MVC_29C51004T, 19508 .total_size = 512, 19509 .page_size = 1024, 19510 .feature_bits = FEATURE_EITHER_RESET, 19511 .tested = TEST_UNTESTED, 19512 .probe = PROBE_JEDEC, 19513 .probe_timing = TIMING_ZERO, 19514 .block_erasers = 19515 { 19516 { 19517 .eraseblocks = { {1024, 512} }, 19518 .block_erase = JEDEC_SECTOR_ERASE, 19519 }, { 19520 .eraseblocks = { {512 * 1024, 1} }, 19521 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19522 }, 19523 }, 19524 .write = WRITE_JEDEC1, 19525 .read = READ_MEMMAPPED, 19526 .voltage = {4500, 5500}, 19527 }, 19528 19529 { 19530 .vendor = "SyncMOS/MoselVitelic", 19531 .name = "{S,V}29C31004B", 19532 .bustype = BUS_PARALLEL, 19533 .manufacture_id = SYNCMOS_MVC_ID, 19534 .model_id = SM_MVC_29C31004B, 19535 .total_size = 512, 19536 .page_size = 1024, 19537 .feature_bits = FEATURE_EITHER_RESET, 19538 .tested = TEST_UNTESTED, 19539 .probe = PROBE_JEDEC, 19540 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19541 .block_erasers = 19542 { 19543 { 19544 .eraseblocks = { {1024, 512} }, 19545 .block_erase = JEDEC_SECTOR_ERASE, 19546 }, { 19547 .eraseblocks = { {512 * 1024, 1} }, 19548 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19549 }, 19550 }, 19551 .write = WRITE_JEDEC1, 19552 .read = READ_MEMMAPPED, 19553 .voltage = {3000, 3600}, 19554 }, 19555 19556 { 19557 .vendor = "SyncMOS/MoselVitelic", 19558 .name = "{S,V}29C31004T", 19559 .bustype = BUS_PARALLEL, 19560 .manufacture_id = SYNCMOS_MVC_ID, 19561 .model_id = SM_MVC_29C31004T, 19562 .total_size = 512, 19563 .page_size = 1024, 19564 .feature_bits = FEATURE_EITHER_RESET, 19565 .tested = TEST_UNTESTED, 19566 .probe = PROBE_JEDEC, 19567 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19568 .block_erasers = 19569 { 19570 { 19571 .eraseblocks = { {1024, 512} }, 19572 .block_erase = JEDEC_SECTOR_ERASE, 19573 }, { 19574 .eraseblocks = { {512 * 1024, 1} }, 19575 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19576 }, 19577 }, 19578 .write = WRITE_JEDEC1, 19579 .read = READ_MEMMAPPED, 19580 .voltage = {3000, 3600}, 19581 }, 19582 19583 { 19584 .vendor = "TI", 19585 .name = "TMS29F002RB", 19586 .bustype = BUS_PARALLEL, 19587 .manufacture_id = TI_OLD_ID, 19588 .model_id = TI_TMS29F002RB, 19589 .total_size = 256, 19590 .page_size = 16384, /* Non-uniform sectors */ 19591 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 19592 .tested = TEST_UNTESTED, 19593 .probe = PROBE_JEDEC, 19594 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19595 .block_erasers = 19596 { 19597 { 19598 .eraseblocks = { 19599 {16 * 1024, 1}, 19600 {8 * 1024, 2}, 19601 {32 * 1024, 1}, 19602 {64 * 1024, 3}, 19603 }, 19604 .block_erase = JEDEC_SECTOR_ERASE, 19605 }, { 19606 .eraseblocks = { {256 * 1024, 1} }, 19607 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19608 }, 19609 }, 19610 .write = WRITE_JEDEC1, 19611 .read = READ_MEMMAPPED, 19612 .voltage = {4500, 5500}, 19613 }, 19614 19615 { 19616 .vendor = "TI", 19617 .name = "TMS29F002RT", 19618 .bustype = BUS_PARALLEL, 19619 .manufacture_id = TI_OLD_ID, 19620 .model_id = TI_TMS29F002RT, 19621 .total_size = 256, 19622 .page_size = 16384, /* Non-uniform sectors */ 19623 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET, 19624 .tested = TEST_UNTESTED, 19625 .probe = PROBE_JEDEC, 19626 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */ 19627 .block_erasers = 19628 { 19629 { 19630 .eraseblocks = { 19631 {64 * 1024, 3}, 19632 {32 * 1024, 1}, 19633 {8 * 1024, 2}, 19634 {16 * 1024, 1}, 19635 }, 19636 .block_erase = JEDEC_SECTOR_ERASE, 19637 }, { 19638 .eraseblocks = { {256 * 1024, 1} }, 19639 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 19640 }, 19641 }, 19642 .write = WRITE_JEDEC1, 19643 .read = READ_MEMMAPPED, 19644 .voltage = {4500, 5500}, 19645 }, 19646 19647 { 19648 .vendor = "Winbond", 19649 .name = "W25P16", 19650 .bustype = BUS_SPI, 19651 .manufacture_id = WINBOND_NEX_ID, 19652 .model_id = WINBOND_NEX_W25P16, 19653 .total_size = 2048, 19654 .page_size = 256, 19655 .feature_bits = FEATURE_WRSR_WREN, 19656 .tested = TEST_UNTESTED, 19657 .probe = PROBE_SPI_RDID, 19658 .probe_timing = TIMING_ZERO, 19659 .block_erasers = 19660 { 19661 { 19662 .eraseblocks = { {64 * 1024, 32} }, 19663 .block_erase = SPI_BLOCK_ERASE_D8, 19664 }, { 19665 .eraseblocks = { {2048 * 1024, 1} }, 19666 .block_erase = SPI_BLOCK_ERASE_C7, 19667 } 19668 }, 19669 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 19670 .unlock = SPI_DISABLE_BLOCKPROTECT, 19671 .write = SPI_CHIP_WRITE256, 19672 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 19673 .voltage = {2700, 3600}, 19674 }, 19675 19676 { 19677 .vendor = "Winbond", 19678 .name = "W25P32", 19679 .bustype = BUS_SPI, 19680 .manufacture_id = WINBOND_NEX_ID, 19681 .model_id = WINBOND_NEX_W25P32, 19682 .total_size = 4096, 19683 .page_size = 256, 19684 .feature_bits = FEATURE_WRSR_WREN, 19685 .tested = TEST_UNTESTED, 19686 .probe = PROBE_SPI_RDID, 19687 .probe_timing = TIMING_ZERO, 19688 .block_erasers = 19689 { 19690 { 19691 .eraseblocks = { {64 * 1024, 64} }, 19692 .block_erase = SPI_BLOCK_ERASE_D8, 19693 }, { 19694 .eraseblocks = { {4096 * 1024, 1} }, 19695 .block_erase = SPI_BLOCK_ERASE_C7, 19696 } 19697 }, 19698 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 19699 .unlock = SPI_DISABLE_BLOCKPROTECT, 19700 .write = SPI_CHIP_WRITE256, 19701 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 19702 .voltage = {2700, 3600}, 19703 }, 19704 19705 { 19706 .vendor = "Winbond", 19707 .name = "W25P80", 19708 .bustype = BUS_SPI, 19709 .manufacture_id = WINBOND_NEX_ID, 19710 .model_id = WINBOND_NEX_W25P80, 19711 .total_size = 1024, 19712 .page_size = 256, 19713 .feature_bits = FEATURE_WRSR_WREN, 19714 .tested = TEST_UNTESTED, 19715 .probe = PROBE_SPI_RDID, 19716 .probe_timing = TIMING_ZERO, 19717 .block_erasers = 19718 { 19719 { 19720 .eraseblocks = { {64 * 1024, 16} }, 19721 .block_erase = SPI_BLOCK_ERASE_D8, 19722 }, { 19723 .eraseblocks = { {1024 * 1024, 1} }, 19724 .block_erase = SPI_BLOCK_ERASE_C7, 19725 } 19726 }, 19727 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 19728 .unlock = SPI_DISABLE_BLOCKPROTECT, 19729 .write = SPI_CHIP_WRITE256, 19730 .read = SPI_CHIP_READ, /* Fast read (0x0B) supported */ 19731 .voltage = {2700, 3600}, 19732 }, 19733 19734 { 19735 .vendor = "Winbond", 19736 .name = "W25Q128.V", 19737 .bustype = BUS_SPI, 19738 .manufacture_id = WINBOND_NEX_ID, 19739 .model_id = WINBOND_NEX_W25Q128_V, 19740 .total_size = 16384, 19741 .page_size = 256, 19742 /* supports SFDP */ 19743 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 19744 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 19745 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 19746 .tested = TEST_OK_PREWB, 19747 .probe = PROBE_SPI_RDID, 19748 .probe_timing = TIMING_ZERO, 19749 .block_erasers = 19750 { 19751 { 19752 .eraseblocks = { {4 * 1024, 4096} }, 19753 .block_erase = SPI_BLOCK_ERASE_20, 19754 }, { 19755 .eraseblocks = { {32 * 1024, 512} }, 19756 .block_erase = SPI_BLOCK_ERASE_52, 19757 }, { 19758 .eraseblocks = { {64 * 1024, 256} }, 19759 .block_erase = SPI_BLOCK_ERASE_D8, 19760 }, { 19761 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19762 .block_erase = SPI_BLOCK_ERASE_60, 19763 }, { 19764 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19765 .block_erase = SPI_BLOCK_ERASE_C7, 19766 } 19767 }, 19768 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 19769 .unlock = SPI_DISABLE_BLOCKPROTECT, 19770 .write = SPI_CHIP_WRITE256, 19771 .read = SPI_CHIP_READ, 19772 .voltage = {2700, 3600}, 19773 .reg_bits = 19774 { 19775 .srp = {STATUS1, 7, RW}, 19776 .srl = {STATUS2, 0, RW}, 19777 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 19778 .tb = {STATUS1, 5, RW}, 19779 .sec = {STATUS1, 6, RW}, 19780 .cmp = {STATUS2, 6, RW}, 19781 .wps = {STATUS3, 2, RW}, 19782 }, 19783 .decode_range = DECODE_RANGE_SPI25, 19784 }, 19785 19786 { 19787 .vendor = "Winbond", 19788 .name = "W25Q128.V..M", 19789 .bustype = BUS_SPI, 19790 .manufacture_id = WINBOND_NEX_ID, 19791 .model_id = WINBOND_NEX_W25Q128_V_M, 19792 .total_size = 16384, 19793 .page_size = 256, 19794 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 19795 .tested = TEST_OK_PREWB, 19796 .probe = PROBE_SPI_RDID, 19797 .probe_timing = TIMING_ZERO, 19798 .block_erasers = 19799 { 19800 { 19801 .eraseblocks = { {4 * 1024, 4096} }, 19802 .block_erase = SPI_BLOCK_ERASE_20, 19803 }, { 19804 .eraseblocks = { {32 * 1024, 512} }, 19805 .block_erase = SPI_BLOCK_ERASE_52, 19806 }, { 19807 .eraseblocks = { {64 * 1024, 256} }, 19808 .block_erase = SPI_BLOCK_ERASE_D8, 19809 }, { 19810 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19811 .block_erase = SPI_BLOCK_ERASE_60, 19812 }, { 19813 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19814 .block_erase = SPI_BLOCK_ERASE_C7, 19815 } 19816 }, 19817 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 19818 .unlock = SPI_DISABLE_BLOCKPROTECT, 19819 .write = SPI_CHIP_WRITE256, 19820 .read = SPI_CHIP_READ, 19821 .voltage = {2700, 3600}, 19822 .reg_bits = 19823 { 19824 .srp = {STATUS1, 7, RW}, 19825 .srl = {STATUS2, 0, RW}, 19826 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 19827 .tb = {STATUS1, 5, RW}, 19828 .sec = {STATUS1, 6, RW}, 19829 .cmp = {STATUS2, 6, RW}, 19830 }, 19831 .decode_range = DECODE_RANGE_SPI25, 19832 }, 19833 19834 { 19835 .vendor = "Winbond", 19836 .name = "W25Q128.W", 19837 .bustype = BUS_SPI, 19838 .manufacture_id = WINBOND_NEX_ID, 19839 .model_id = WINBOND_NEX_W25Q128_W, 19840 .total_size = 16384, 19841 .page_size = 256, 19842 /* supports SFDP */ 19843 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 19844 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 19845 .tested = TEST_OK_PREW, 19846 .probe = PROBE_SPI_RDID, 19847 .probe_timing = TIMING_ZERO, 19848 .block_erasers = 19849 { 19850 { 19851 .eraseblocks = { {4 * 1024, 4096} }, 19852 .block_erase = SPI_BLOCK_ERASE_20, 19853 }, { 19854 .eraseblocks = { {32 * 1024, 512} }, 19855 .block_erase = SPI_BLOCK_ERASE_52, 19856 }, { 19857 .eraseblocks = { {64 * 1024, 256} }, 19858 .block_erase = SPI_BLOCK_ERASE_D8, 19859 }, { 19860 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19861 .block_erase = SPI_BLOCK_ERASE_60, 19862 }, { 19863 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19864 .block_erase = SPI_BLOCK_ERASE_C7, 19865 } 19866 }, 19867 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 19868 .unlock = SPI_DISABLE_BLOCKPROTECT, 19869 .write = SPI_CHIP_WRITE256, 19870 .read = SPI_CHIP_READ, 19871 .voltage = {1650, 1950}, 19872 .reg_bits = 19873 { 19874 .srp = {STATUS1, 7, RW}, 19875 .srl = {STATUS2, 0, RW}, 19876 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 19877 .tb = {STATUS1, 5, RW}, 19878 .sec = {STATUS1, 6, RW}, 19879 .cmp = {STATUS2, 6, RW}, 19880 }, 19881 .decode_range = DECODE_RANGE_SPI25, 19882 }, 19883 19884 { 19885 .vendor = "Winbond", 19886 .name = "W25Q128.JW.DTR", 19887 .bustype = BUS_SPI, 19888 .manufacture_id = WINBOND_NEX_ID, 19889 .model_id = WINBOND_NEX_W25Q128_DTR, 19890 .total_size = 16384, 19891 .page_size = 256, 19892 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 19893 .tested = TEST_OK_PREW, 19894 .probe = PROBE_SPI_RDID, 19895 .probe_timing = TIMING_ZERO, 19896 .block_erasers = 19897 { 19898 { 19899 .eraseblocks = { {4 * 1024, 4096} }, 19900 .block_erase = SPI_BLOCK_ERASE_20, 19901 }, { 19902 .eraseblocks = { {32 * 1024, 512} }, 19903 .block_erase = SPI_BLOCK_ERASE_52, 19904 }, { 19905 .eraseblocks = { {64 * 1024, 256} }, 19906 .block_erase = SPI_BLOCK_ERASE_D8, 19907 }, { 19908 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19909 .block_erase = SPI_BLOCK_ERASE_60, 19910 }, { 19911 .eraseblocks = { {16 * 1024 * 1024, 1} }, 19912 .block_erase = SPI_BLOCK_ERASE_C7, 19913 } 19914 }, 19915 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 19916 .unlock = SPI_DISABLE_BLOCKPROTECT, 19917 .write = SPI_CHIP_WRITE256, 19918 .read = SPI_CHIP_READ, 19919 .voltage = {1650, 1950}, 19920 .reg_bits = 19921 { 19922 .srp = {STATUS1, 7, RW}, 19923 .srl = {STATUS2, 0, RW}, 19924 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 19925 .tb = {STATUS1, 5, RW}, 19926 .sec = {STATUS1, 6, RW}, 19927 .cmp = {STATUS2, 6, RW}, 19928 }, 19929 .decode_range = DECODE_RANGE_SPI25, 19930 }, 19931 19932 { 19933 .vendor = "Winbond", 19934 .name = "W25Q16JV_M", 19935 .bustype = BUS_SPI, 19936 .manufacture_id = WINBOND_NEX_ID, 19937 .model_id = WINBOND_NEX_W25Q16JV_M, 19938 .total_size = 2048, 19939 .page_size = 256, 19940 /* supports SFDP */ 19941 /* OTP: 3x 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 19942 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | 19943 FEATURE_WRSR2 | FEATURE_WRSR3, 19944 .tested = TEST_OK_PREW, 19945 .probe = PROBE_SPI_RDID, 19946 .probe_timing = TIMING_ZERO, 19947 .block_erasers = 19948 { 19949 { 19950 .eraseblocks = { {4 * 1024, 512} }, 19951 .block_erase = SPI_BLOCK_ERASE_20, 19952 }, { 19953 .eraseblocks = { {32 * 1024, 64} }, 19954 .block_erase = SPI_BLOCK_ERASE_52, 19955 }, { 19956 .eraseblocks = { {64 * 1024, 32} }, 19957 .block_erase = SPI_BLOCK_ERASE_D8, 19958 }, { 19959 .eraseblocks = { {2 * 1024 * 1024, 1} }, 19960 .block_erase = SPI_BLOCK_ERASE_60, 19961 }, { 19962 .eraseblocks = { {2 * 1024 * 1024, 1} }, 19963 .block_erase = SPI_BLOCK_ERASE_C7, 19964 } 19965 }, 19966 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 19967 .unlock = SPI_DISABLE_BLOCKPROTECT, 19968 .write = SPI_CHIP_WRITE256, 19969 .read = SPI_CHIP_READ, 19970 .voltage = {2700, 3600}, 19971 .reg_bits = 19972 { 19973 .srp = {STATUS1, 7, RW}, 19974 .sec = {STATUS1, 6, RW}, 19975 .tb = {STATUS1, 5, RW}, 19976 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 19977 .cmp = {STATUS2, 6, RW}, 19978 .srl = {STATUS2, 0, RW}, 19979 .wps = {STATUS3, 2, RW}, 19980 }, 19981 .decode_range = DECODE_RANGE_SPI25, 19982 }, 19983 19984 { 19985 .vendor = "Winbond", 19986 .name = "W25Q16.V", 19987 .bustype = BUS_SPI, 19988 .manufacture_id = WINBOND_NEX_ID, 19989 .model_id = WINBOND_NEX_W25Q16_V, 19990 .total_size = 2048, 19991 .page_size = 256, 19992 /* supports SFDP */ 19993 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 19994 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, 19995 .tested = TEST_OK_PREWB, 19996 .probe = PROBE_SPI_RDID, 19997 .probe_timing = TIMING_ZERO, 19998 .block_erasers = 19999 { 20000 { 20001 .eraseblocks = { {4 * 1024, 512} }, 20002 .block_erase = SPI_BLOCK_ERASE_20, 20003 }, { 20004 .eraseblocks = { {32 * 1024, 64} }, 20005 .block_erase = SPI_BLOCK_ERASE_52, 20006 }, { 20007 .eraseblocks = { {64 * 1024, 32} }, 20008 .block_erase = SPI_BLOCK_ERASE_D8, 20009 }, { 20010 .eraseblocks = { {2 * 1024 * 1024, 1} }, 20011 .block_erase = SPI_BLOCK_ERASE_60, 20012 }, { 20013 .eraseblocks = { {2 * 1024 * 1024, 1} }, 20014 .block_erase = SPI_BLOCK_ERASE_C7, 20015 } 20016 }, 20017 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20018 .unlock = SPI_DISABLE_BLOCKPROTECT, 20019 .write = SPI_CHIP_WRITE256, 20020 .read = SPI_CHIP_READ, 20021 .voltage = {2700, 3600}, 20022 .reg_bits = 20023 { 20024 .srp = {STATUS1, 7, RW}, 20025 .srl = {STATUS2, 0, RW}, 20026 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20027 .tb = {STATUS1, 5, RW}, 20028 .sec = {STATUS1, 6, RW}, 20029 .cmp = {STATUS2, 6, RW}, 20030 }, 20031 .decode_range = DECODE_RANGE_SPI25, 20032 }, 20033 20034 { 20035 .vendor = "Winbond", 20036 .name = "W25Q16.W", 20037 .bustype = BUS_SPI, 20038 .manufacture_id = WINBOND_NEX_ID, 20039 .model_id = WINBOND_NEX_W25Q16_W, 20040 .total_size = 2048, 20041 .page_size = 256, 20042 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20043 /* QPI enable 0x38, disable 0xFF */ 20044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 20045 .tested = TEST_UNTESTED, 20046 .probe = PROBE_SPI_RDID, 20047 .probe_timing = TIMING_ZERO, 20048 .block_erasers = 20049 { 20050 { 20051 .eraseblocks = { {4 * 1024, 512} }, 20052 .block_erase = SPI_BLOCK_ERASE_20, 20053 }, { 20054 .eraseblocks = { {32 * 1024, 64} }, 20055 .block_erase = SPI_BLOCK_ERASE_52, 20056 }, { 20057 .eraseblocks = { {64 * 1024, 32} }, 20058 .block_erase = SPI_BLOCK_ERASE_D8, 20059 }, { 20060 .eraseblocks = { {2 * 1024 * 1024, 1} }, 20061 .block_erase = SPI_BLOCK_ERASE_60, 20062 }, { 20063 .eraseblocks = { {2 * 1024 * 1024, 1} }, 20064 .block_erase = SPI_BLOCK_ERASE_C7, 20065 } 20066 }, 20067 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 20068 .unlock = SPI_DISABLE_BLOCKPROTECT, 20069 .write = SPI_CHIP_WRITE256, 20070 .read = SPI_CHIP_READ, 20071 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20072 }, 20073 20074 { 20075 .vendor = "Winbond", 20076 .name = "W25Q20.W", 20077 .bustype = BUS_SPI, 20078 .manufacture_id = WINBOND_NEX_ID, 20079 .model_id = WINBOND_NEX_W25Q20_W, 20080 .total_size = 256, 20081 .page_size = 256, 20082 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20083 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 20084 .tested = TEST_UNTESTED, 20085 .probe = PROBE_SPI_RDID, 20086 .probe_timing = TIMING_ZERO, 20087 .block_erasers = 20088 { 20089 { 20090 .eraseblocks = { {4 * 1024, 64} }, 20091 .block_erase = SPI_BLOCK_ERASE_20, 20092 }, { 20093 .eraseblocks = { {32 * 1024, 8} }, 20094 .block_erase = SPI_BLOCK_ERASE_52, 20095 }, { 20096 .eraseblocks = { {64 * 1024, 4} }, 20097 .block_erase = SPI_BLOCK_ERASE_D8, 20098 }, { 20099 .eraseblocks = { {256 * 1024, 1} }, 20100 .block_erase = SPI_BLOCK_ERASE_60, 20101 }, { 20102 .eraseblocks = { {256 * 1024, 1} }, 20103 .block_erase = SPI_BLOCK_ERASE_C7, 20104 } 20105 }, 20106 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 20107 .unlock = SPI_DISABLE_BLOCKPROTECT, 20108 .write = SPI_CHIP_WRITE256, 20109 .read = SPI_CHIP_READ, 20110 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20111 }, 20112 20113 { 20114 .vendor = "Winbond", 20115 .name = "W25Q256FV", 20116 .bustype = BUS_SPI, 20117 .manufacture_id = WINBOND_NEX_ID, 20118 .model_id = WINBOND_NEX_W25Q256_V, 20119 .total_size = 32768, 20120 .page_size = 256, 20121 /* supports SFDP */ 20122 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20123 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN | 20124 FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ | 20125 FEATURE_WRSR2, 20126 .tested = TEST_OK_PREW, 20127 .probe = PROBE_SPI_RDID, 20128 .probe_timing = TIMING_ZERO, 20129 .block_erasers = 20130 { 20131 { 20132 .eraseblocks = { {4 * 1024, 8192} }, 20133 .block_erase = SPI_BLOCK_ERASE_20, 20134 }, { 20135 .eraseblocks = { {32 * 1024, 1024} }, 20136 .block_erase = SPI_BLOCK_ERASE_52, 20137 }, { 20138 .eraseblocks = { {64 * 1024, 512} }, 20139 .block_erase = SPI_BLOCK_ERASE_D8, 20140 }, { 20141 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20142 .block_erase = SPI_BLOCK_ERASE_60, 20143 }, { 20144 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20145 .block_erase = SPI_BLOCK_ERASE_C7, 20146 } 20147 }, 20148 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 20149 .unlock = SPI_DISABLE_BLOCKPROTECT, 20150 .write = SPI_CHIP_WRITE256, 20151 .read = SPI_CHIP_READ, 20152 .voltage = {2700, 3600}, 20153 .reg_bits = 20154 { 20155 .srp = {STATUS1, 7, RW}, 20156 .srl = {STATUS2, 0, RW}, 20157 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 20158 .tb = {STATUS1, 6, RW}, 20159 .cmp = {STATUS2, 6, RW}, 20160 }, 20161 .decode_range = DECODE_RANGE_SPI25, 20162 }, 20163 20164 { 20165 .vendor = "Winbond", 20166 .name = "W25Q256JV_Q", 20167 .bustype = BUS_SPI, 20168 .manufacture_id = WINBOND_NEX_ID, 20169 .model_id = WINBOND_NEX_W25Q256_V, 20170 .total_size = 32768, 20171 .page_size = 256, 20172 /* supports SFDP */ 20173 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20174 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2, 20175 .tested = TEST_UNTESTED, 20176 .probe = PROBE_SPI_RDID, 20177 .probe_timing = TIMING_ZERO, 20178 .block_erasers = 20179 { 20180 { 20181 .eraseblocks = { {4 * 1024, 8192} }, 20182 .block_erase = SPI_BLOCK_ERASE_21, 20183 }, { 20184 .eraseblocks = { {4 * 1024, 8192} }, 20185 .block_erase = SPI_BLOCK_ERASE_20, 20186 }, { 20187 .eraseblocks = { {32 * 1024, 1024} }, 20188 .block_erase = SPI_BLOCK_ERASE_52, 20189 }, { 20190 .eraseblocks = { {64 * 1024, 512} }, 20191 .block_erase = SPI_BLOCK_ERASE_DC, 20192 }, { 20193 .eraseblocks = { {64 * 1024, 512} }, 20194 .block_erase = SPI_BLOCK_ERASE_D8, 20195 }, { 20196 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20197 .block_erase = SPI_BLOCK_ERASE_60, 20198 }, { 20199 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20200 .block_erase = SPI_BLOCK_ERASE_C7, 20201 } 20202 }, 20203 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 20204 .unlock = SPI_DISABLE_BLOCKPROTECT, 20205 .write = SPI_CHIP_WRITE256, 20206 .read = SPI_CHIP_READ, 20207 .voltage = {2700, 3600}, 20208 .reg_bits = 20209 { 20210 .srp = {STATUS1, 7, RW}, 20211 .srl = {STATUS2, 0, RW}, 20212 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 20213 .tb = {STATUS1, 6, RW}, 20214 .cmp = {STATUS2, 6, RW}, 20215 }, 20216 .decode_range = DECODE_RANGE_SPI25, 20217 }, 20218 20219 { 20220 .vendor = "Winbond", 20221 .name = "W25Q256JV_M", 20222 .bustype = BUS_SPI, 20223 .manufacture_id = WINBOND_NEX_ID, 20224 .model_id = WINBOND_NEX_W25Q256JV_M, 20225 .total_size = 32768, 20226 .page_size = 256, 20227 /* supports SFDP */ 20228 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20229 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2, 20230 .tested = TEST_OK_PREW, 20231 .probe = PROBE_SPI_RDID, 20232 .probe_timing = TIMING_ZERO, 20233 .block_erasers = 20234 { 20235 { 20236 .eraseblocks = { {4 * 1024, 8192} }, 20237 .block_erase = SPI_BLOCK_ERASE_21, 20238 }, { 20239 .eraseblocks = { {4 * 1024, 8192} }, 20240 .block_erase = SPI_BLOCK_ERASE_20, 20241 }, { 20242 .eraseblocks = { {32 * 1024, 1024} }, 20243 .block_erase = SPI_BLOCK_ERASE_52, 20244 }, { 20245 .eraseblocks = { {64 * 1024, 512} }, 20246 .block_erase = SPI_BLOCK_ERASE_DC, 20247 }, { 20248 .eraseblocks = { {64 * 1024, 512} }, 20249 .block_erase = SPI_BLOCK_ERASE_D8, 20250 }, { 20251 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20252 .block_erase = SPI_BLOCK_ERASE_60, 20253 }, { 20254 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20255 .block_erase = SPI_BLOCK_ERASE_C7, 20256 } 20257 }, 20258 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 20259 .unlock = SPI_DISABLE_BLOCKPROTECT, 20260 .write = SPI_CHIP_WRITE256, 20261 .read = SPI_CHIP_READ, 20262 .voltage = {2700, 3600}, 20263 .reg_bits = 20264 { 20265 .srp = {STATUS1, 7, RW}, 20266 .srl = {STATUS2, 0, RW}, 20267 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 20268 .tb = {STATUS1, 6, RW}, 20269 .cmp = {STATUS2, 6, RW}, 20270 }, 20271 .decode_range = DECODE_RANGE_SPI25, 20272 }, 20273 20274 { 20275 .vendor = "Winbond", 20276 .name = "W25Q256JW", 20277 .bustype = BUS_SPI, 20278 .manufacture_id = WINBOND_NEX_ID, 20279 .model_id = WINBOND_NEX_W25Q256_W, 20280 .total_size = 32768, 20281 .page_size = 256, 20282 /* supports SFDP */ 20283 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20284 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 20285 .tested = TEST_OK_PREW, 20286 .probe = PROBE_SPI_RDID, 20287 .probe_timing = TIMING_ZERO, 20288 .block_erasers = 20289 { 20290 { 20291 .eraseblocks = { {4 * 1024, 8192} }, 20292 .block_erase = SPI_BLOCK_ERASE_21, 20293 }, { 20294 .eraseblocks = { {4 * 1024, 8192} }, 20295 .block_erase = SPI_BLOCK_ERASE_20, 20296 }, { 20297 .eraseblocks = { {32 * 1024, 1024} }, 20298 .block_erase = SPI_BLOCK_ERASE_52, 20299 }, { 20300 .eraseblocks = { {64 * 1024, 512} }, 20301 .block_erase = SPI_BLOCK_ERASE_DC, 20302 }, { 20303 .eraseblocks = { {64 * 1024, 512} }, 20304 .block_erase = SPI_BLOCK_ERASE_D8, 20305 }, { 20306 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20307 .block_erase = SPI_BLOCK_ERASE_60, 20308 }, { 20309 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20310 .block_erase = SPI_BLOCK_ERASE_C7, 20311 } 20312 }, 20313 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 20314 .unlock = SPI_DISABLE_BLOCKPROTECT, 20315 .write = SPI_CHIP_WRITE256, 20316 .read = SPI_CHIP_READ, 20317 .voltage = {1650, 1950}, 20318 }, 20319 20320 { 20321 .vendor = "Winbond", 20322 .name = "W25Q256JW_DTR", 20323 .bustype = BUS_SPI, 20324 .manufacture_id = WINBOND_NEX_ID, 20325 .model_id = WINBOND_NEX_W25Q256_DTR, 20326 .total_size = 32768, 20327 .page_size = 256, 20328 /* supports SFDP */ 20329 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20330 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2 20331 | FEATURE_WRSR3, 20332 .tested = TEST_OK_PREWB, 20333 .probe = PROBE_SPI_RDID, 20334 .probe_timing = TIMING_ZERO, 20335 .block_erasers = 20336 { 20337 { 20338 .eraseblocks = { {4 * 1024, 8192} }, 20339 .block_erase = SPI_BLOCK_ERASE_21, 20340 }, { 20341 .eraseblocks = { {4 * 1024, 8192} }, 20342 .block_erase = SPI_BLOCK_ERASE_20, 20343 }, { 20344 .eraseblocks = { {32 * 1024, 1024} }, 20345 .block_erase = SPI_BLOCK_ERASE_52, 20346 }, { 20347 .eraseblocks = { {64 * 1024, 512} }, 20348 .block_erase = SPI_BLOCK_ERASE_DC, 20349 }, { 20350 .eraseblocks = { {64 * 1024, 512} }, 20351 .block_erase = SPI_BLOCK_ERASE_D8, 20352 }, { 20353 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20354 .block_erase = SPI_BLOCK_ERASE_60, 20355 }, { 20356 .eraseblocks = { {32 * 1024 * 1024, 1} }, 20357 .block_erase = SPI_BLOCK_ERASE_C7, 20358 } 20359 }, 20360 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP3_SRWD, 20361 .unlock = SPI_DISABLE_BLOCKPROTECT, 20362 .write = SPI_CHIP_WRITE256, 20363 .read = SPI_CHIP_READ, 20364 .voltage = {1700, 1950}, 20365 .reg_bits = 20366 { 20367 .srp = {STATUS1, 7, RW}, 20368 .srl = {STATUS2, 0, RW}, 20369 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 20370 .tb = {STATUS1, 6, RW}, 20371 .cmp = {STATUS2, 6, RW}, 20372 .wps = {STATUS3, 2, RW}, 20373 }, 20374 .decode_range = DECODE_RANGE_SPI25, 20375 }, 20376 20377 { 20378 .vendor = "Winbond", 20379 .name = "W25Q32BV/W25Q32CV/W25Q32DV", 20380 .bustype = BUS_SPI, 20381 .manufacture_id = WINBOND_NEX_ID, 20382 .model_id = WINBOND_NEX_W25Q32_V, 20383 .total_size = 4096, 20384 .page_size = 256, 20385 /* supports SFDP */ 20386 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20387 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2, 20388 .tested = TEST_OK_PREW, 20389 .probe = PROBE_SPI_RDID, 20390 .probe_timing = TIMING_ZERO, 20391 .block_erasers = 20392 { 20393 { 20394 .eraseblocks = { {4 * 1024, 1024} }, 20395 .block_erase = SPI_BLOCK_ERASE_20, 20396 }, { 20397 .eraseblocks = { {32 * 1024, 128} }, 20398 .block_erase = SPI_BLOCK_ERASE_52, 20399 }, { 20400 .eraseblocks = { {64 * 1024, 64} }, 20401 .block_erase = SPI_BLOCK_ERASE_D8, 20402 }, { 20403 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20404 .block_erase = SPI_BLOCK_ERASE_60, 20405 }, { 20406 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20407 .block_erase = SPI_BLOCK_ERASE_C7, 20408 } 20409 }, 20410 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20411 .unlock = SPI_DISABLE_BLOCKPROTECT, 20412 .write = SPI_CHIP_WRITE256, 20413 .read = SPI_CHIP_READ, 20414 .voltage = {2700, 3600}, 20415 .reg_bits = 20416 { 20417 .srp = {STATUS1, 7, RW}, 20418 .srl = {STATUS2, 0, RW}, 20419 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20420 .tb = {STATUS1, 5, RW}, 20421 .sec = {STATUS1, 6, RW}, 20422 .cmp = {STATUS2, 6, RW}, 20423 }, 20424 .decode_range = DECODE_RANGE_SPI25, 20425 }, 20426 20427 { 20428 .vendor = "Winbond", 20429 .name = "W25Q32FV", 20430 .bustype = BUS_SPI, 20431 .manufacture_id = WINBOND_NEX_ID, 20432 .model_id = WINBOND_NEX_W25Q32_V, 20433 .total_size = 4096, 20434 .page_size = 256, 20435 /* supports SFDP */ 20436 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20437 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | 20438 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 20439 .tested = TEST_OK_PREW, 20440 .probe = PROBE_SPI_RDID, 20441 .probe_timing = TIMING_ZERO, 20442 .block_erasers = 20443 { 20444 { 20445 .eraseblocks = { {4 * 1024, 1024} }, 20446 .block_erase = SPI_BLOCK_ERASE_20, 20447 }, { 20448 .eraseblocks = { {32 * 1024, 128} }, 20449 .block_erase = SPI_BLOCK_ERASE_52, 20450 }, { 20451 .eraseblocks = { {64 * 1024, 64} }, 20452 .block_erase = SPI_BLOCK_ERASE_D8, 20453 }, { 20454 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20455 .block_erase = SPI_BLOCK_ERASE_60, 20456 }, { 20457 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20458 .block_erase = SPI_BLOCK_ERASE_C7, 20459 } 20460 }, 20461 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20462 .unlock = SPI_DISABLE_BLOCKPROTECT, 20463 .write = SPI_CHIP_WRITE256, 20464 .read = SPI_CHIP_READ, 20465 .voltage = {2700, 3600}, 20466 .reg_bits = 20467 { 20468 .srp = {STATUS1, 7, RW}, 20469 .srl = {STATUS2, 0, RW}, 20470 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20471 .tb = {STATUS1, 5, RW}, 20472 .sec = {STATUS1, 6, RW}, 20473 .cmp = {STATUS2, 6, RW}, 20474 .wps = {STATUS3, 2, RW}, 20475 }, 20476 .decode_range = DECODE_RANGE_SPI25, 20477 }, 20478 20479 { 20480 .vendor = "Winbond", 20481 .name = "W25Q32JV_M", 20482 .bustype = BUS_SPI, 20483 .manufacture_id = WINBOND_NEX_ID, 20484 .model_id = WINBOND_NEX_W25Q32JV_M, 20485 .total_size = 4096, 20486 .page_size = 256, 20487 /* supports SFDP */ 20488 /* OTP: 3x 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20489 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | 20490 FEATURE_WRSR2 | FEATURE_WRSR3, 20491 .tested = TEST_OK_PREW, 20492 .probe = PROBE_SPI_RDID, 20493 .probe_timing = TIMING_ZERO, 20494 .block_erasers = 20495 { 20496 { 20497 .eraseblocks = { {4 * 1024, 1024} }, 20498 .block_erase = SPI_BLOCK_ERASE_20, 20499 }, { 20500 .eraseblocks = { {32 * 1024, 128} }, 20501 .block_erase = SPI_BLOCK_ERASE_52, 20502 }, { 20503 .eraseblocks = { {64 * 1024, 64} }, 20504 .block_erase = SPI_BLOCK_ERASE_D8, 20505 }, { 20506 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20507 .block_erase = SPI_BLOCK_ERASE_60, 20508 }, { 20509 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20510 .block_erase = SPI_BLOCK_ERASE_C7, 20511 } 20512 }, 20513 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20514 .unlock = SPI_DISABLE_BLOCKPROTECT, 20515 .write = SPI_CHIP_WRITE256, 20516 .read = SPI_CHIP_READ, 20517 .voltage = {2700, 3600}, 20518 .reg_bits = 20519 { 20520 .srp = {STATUS1, 7, RW}, 20521 .sec = {STATUS1, 6, RW}, 20522 .tb = {STATUS1, 5, RW}, 20523 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20524 .cmp = {STATUS2, 6, RW}, 20525 .srl = {STATUS2, 0, RW}, 20526 .wps = {STATUS3, 2, RW}, 20527 }, 20528 .decode_range = DECODE_RANGE_SPI25, 20529 }, 20530 20531 { 20532 .vendor = "Winbond", 20533 .name = "W25Q32JV", 20534 .bustype = BUS_SPI, 20535 .manufacture_id = WINBOND_NEX_ID, 20536 .model_id = WINBOND_NEX_W25Q32_V, 20537 .total_size = 4096, 20538 .page_size = 256, 20539 /* supports SFDP */ 20540 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20541 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 20542 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 20543 .tested = TEST_OK_PREW, 20544 .probe = PROBE_SPI_RDID, 20545 .probe_timing = TIMING_ZERO, 20546 .block_erasers = 20547 { 20548 { 20549 .eraseblocks = { {4 * 1024, 1024} }, 20550 .block_erase = SPI_BLOCK_ERASE_20, 20551 }, { 20552 .eraseblocks = { {32 * 1024, 128} }, 20553 .block_erase = SPI_BLOCK_ERASE_52, 20554 }, { 20555 .eraseblocks = { {64 * 1024, 64} }, 20556 .block_erase = SPI_BLOCK_ERASE_D8, 20557 }, { 20558 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20559 .block_erase = SPI_BLOCK_ERASE_60, 20560 }, { 20561 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20562 .block_erase = SPI_BLOCK_ERASE_C7, 20563 } 20564 }, 20565 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20566 .unlock = SPI_DISABLE_BLOCKPROTECT, 20567 .write = SPI_CHIP_WRITE256, 20568 .read = SPI_CHIP_READ, 20569 .voltage = {2700, 3600}, 20570 .reg_bits = 20571 { 20572 .srp = {STATUS1, 7, RW}, 20573 .srl = {STATUS2, 0, RW}, 20574 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20575 .tb = {STATUS1, 5, RW}, 20576 .sec = {STATUS1, 6, RW}, 20577 .cmp = {STATUS2, 6, RW}, 20578 .wps = {STATUS3, 2, RW}, 20579 }, 20580 .decode_range = DECODE_RANGE_SPI25, 20581 }, 20582 20583 { 20584 .vendor = "Winbond", 20585 .name = "W25Q32BW/W25Q32CW/W25Q32DW", 20586 .bustype = BUS_SPI, 20587 .manufacture_id = WINBOND_NEX_ID, 20588 .model_id = WINBOND_NEX_W25Q32_W, 20589 .total_size = 4096, 20590 .page_size = 256, 20591 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20592 /* QPI enable 0x38, disable 0xFF */ 20593 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR_EXT2, 20594 .tested = TEST_OK_PREW, 20595 .probe = PROBE_SPI_RDID, 20596 .probe_timing = TIMING_ZERO, 20597 .block_erasers = 20598 { 20599 { 20600 .eraseblocks = { {4 * 1024, 1024} }, 20601 .block_erase = SPI_BLOCK_ERASE_20, 20602 }, { 20603 .eraseblocks = { {32 * 1024, 128} }, 20604 .block_erase = SPI_BLOCK_ERASE_52, 20605 }, { 20606 .eraseblocks = { {64 * 1024, 64} }, 20607 .block_erase = SPI_BLOCK_ERASE_D8, 20608 }, { 20609 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20610 .block_erase = SPI_BLOCK_ERASE_60, 20611 }, { 20612 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20613 .block_erase = SPI_BLOCK_ERASE_C7, 20614 } 20615 }, 20616 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20617 .unlock = SPI_DISABLE_BLOCKPROTECT, 20618 .write = SPI_CHIP_WRITE256, 20619 .read = SPI_CHIP_READ, 20620 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20621 .reg_bits = 20622 { 20623 .srp = {STATUS1, 7, RW}, 20624 .srl = {STATUS2, 0, RW}, 20625 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20626 .tb = {STATUS1, 5, RW}, 20627 .sec = {STATUS1, 6, RW}, 20628 .cmp = {STATUS2, 6, RW}, 20629 }, 20630 .decode_range = DECODE_RANGE_SPI25, 20631 }, 20632 20633 { 20634 .vendor = "Winbond", 20635 .name = "W25Q32FW", 20636 .bustype = BUS_SPI, 20637 .manufacture_id = WINBOND_NEX_ID, 20638 .model_id = WINBOND_NEX_W25Q32_W, 20639 .total_size = 4096, 20640 .page_size = 256, 20641 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20642 /* QPI enable 0x38, disable 0xFF */ 20643 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | 20644 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 20645 .tested = TEST_OK_PREW, 20646 .probe = PROBE_SPI_RDID, 20647 .probe_timing = TIMING_ZERO, 20648 .block_erasers = 20649 { 20650 { 20651 .eraseblocks = { {4 * 1024, 1024} }, 20652 .block_erase = SPI_BLOCK_ERASE_20, 20653 }, { 20654 .eraseblocks = { {32 * 1024, 128} }, 20655 .block_erase = SPI_BLOCK_ERASE_52, 20656 }, { 20657 .eraseblocks = { {64 * 1024, 64} }, 20658 .block_erase = SPI_BLOCK_ERASE_D8, 20659 }, { 20660 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20661 .block_erase = SPI_BLOCK_ERASE_60, 20662 }, { 20663 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20664 .block_erase = SPI_BLOCK_ERASE_C7, 20665 } 20666 }, 20667 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20668 .unlock = SPI_DISABLE_BLOCKPROTECT, 20669 .write = SPI_CHIP_WRITE256, 20670 .read = SPI_CHIP_READ, 20671 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20672 .reg_bits = 20673 { 20674 .srp = {STATUS1, 7, RW}, 20675 .srl = {STATUS2, 0, RW}, 20676 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20677 .tb = {STATUS1, 5, RW}, 20678 .sec = {STATUS1, 6, RW}, 20679 .cmp = {STATUS2, 6, RW}, 20680 .wps = {STATUS3, 2, RW}, 20681 }, 20682 .decode_range = DECODE_RANGE_SPI25, 20683 }, 20684 20685 { 20686 .vendor = "Winbond", 20687 .name = "W25Q32JW...Q", 20688 .bustype = BUS_SPI, 20689 .manufacture_id = WINBOND_NEX_ID, 20690 .model_id = WINBOND_NEX_W25Q32_W, 20691 .total_size = 4096, 20692 .page_size = 256, 20693 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20694 /* QPI enable 0x38, disable 0xFF */ 20695 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 20696 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 20697 .tested = TEST_OK_PREW, 20698 .probe = PROBE_SPI_RDID, 20699 .probe_timing = TIMING_ZERO, 20700 .block_erasers = 20701 { 20702 { 20703 .eraseblocks = { {4 * 1024, 1024} }, 20704 .block_erase = SPI_BLOCK_ERASE_20, 20705 }, { 20706 .eraseblocks = { {32 * 1024, 128} }, 20707 .block_erase = SPI_BLOCK_ERASE_52, 20708 }, { 20709 .eraseblocks = { {64 * 1024, 64} }, 20710 .block_erase = SPI_BLOCK_ERASE_D8, 20711 }, { 20712 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20713 .block_erase = SPI_BLOCK_ERASE_60, 20714 }, { 20715 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20716 .block_erase = SPI_BLOCK_ERASE_C7, 20717 } 20718 }, 20719 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20720 .unlock = SPI_DISABLE_BLOCKPROTECT, 20721 .write = SPI_CHIP_WRITE256, 20722 .read = SPI_CHIP_READ, 20723 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20724 .reg_bits = 20725 { 20726 .srp = {STATUS1, 7, RW}, 20727 .srl = {STATUS2, 0, RW}, 20728 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20729 .tb = {STATUS1, 5, RW}, 20730 .sec = {STATUS1, 6, RW}, 20731 .cmp = {STATUS2, 6, RW}, 20732 .wps = {STATUS3, 2, RW}, 20733 }, 20734 .decode_range = DECODE_RANGE_SPI25, 20735 }, 20736 20737 { 20738 .vendor = "Winbond", 20739 .name = "W25Q32JW...M", 20740 .bustype = BUS_SPI, 20741 .manufacture_id = WINBOND_NEX_ID, 20742 .model_id = WINBOND_NEX_W25Q32JW_M, 20743 .total_size = 4096, 20744 .page_size = 256, 20745 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20746 /* QPI enable 0x38, disable 0xFF */ 20747 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 20748 FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2, 20749 .tested = TEST_OK_PREW, 20750 .probe = PROBE_SPI_RDID, 20751 .probe_timing = TIMING_ZERO, 20752 .block_erasers = 20753 { 20754 { 20755 .eraseblocks = { {4 * 1024, 1024} }, 20756 .block_erase = SPI_BLOCK_ERASE_20, 20757 }, { 20758 .eraseblocks = { {32 * 1024, 128} }, 20759 .block_erase = SPI_BLOCK_ERASE_52, 20760 }, { 20761 .eraseblocks = { {64 * 1024, 64} }, 20762 .block_erase = SPI_BLOCK_ERASE_D8, 20763 }, { 20764 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20765 .block_erase = SPI_BLOCK_ERASE_60, 20766 }, { 20767 .eraseblocks = { {4 * 1024 * 1024, 1} }, 20768 .block_erase = SPI_BLOCK_ERASE_C7, 20769 } 20770 }, 20771 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 20772 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 20773 .write = SPI_CHIP_WRITE256, 20774 .read = SPI_CHIP_READ, 20775 .voltage = {1700, 1950}, 20776 .reg_bits = 20777 { 20778 .srp = {STATUS1, 7, RW}, 20779 .srl = {STATUS2, 0, RW}, 20780 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 20781 .tb = {STATUS1, 5, RW}, 20782 .sec = {STATUS1, 6, RW}, 20783 .cmp = {STATUS2, 6, RW}, 20784 .wps = {STATUS3, 2, RW}, 20785 }, 20786 .decode_range = DECODE_RANGE_SPI25, 20787 }, 20788 20789 { 20790 .vendor = "Winbond", 20791 .name = "W25Q40.V", 20792 .bustype = BUS_SPI, 20793 .manufacture_id = WINBOND_NEX_ID, 20794 .model_id = WINBOND_NEX_W25Q40_V, 20795 .total_size = 512, 20796 .page_size = 256, 20797 /* supports SFDP */ 20798 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20799 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 20800 .tested = TEST_OK_PREW, 20801 .probe = PROBE_SPI_RDID, 20802 .probe_timing = TIMING_ZERO, 20803 .block_erasers = 20804 { 20805 { 20806 .eraseblocks = { {4 * 1024, 128} }, 20807 .block_erase = SPI_BLOCK_ERASE_20, 20808 }, { 20809 .eraseblocks = { {32 * 1024, 16} }, 20810 .block_erase = SPI_BLOCK_ERASE_52, 20811 }, { 20812 .eraseblocks = { {64 * 1024, 8} }, 20813 .block_erase = SPI_BLOCK_ERASE_D8, 20814 }, { 20815 .eraseblocks = { {512 * 1024, 1} }, 20816 .block_erase = SPI_BLOCK_ERASE_60, 20817 }, { 20818 .eraseblocks = { {512 * 1024, 1} }, 20819 .block_erase = SPI_BLOCK_ERASE_C7, 20820 } 20821 }, 20822 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 20823 .unlock = SPI_DISABLE_BLOCKPROTECT, 20824 .write = SPI_CHIP_WRITE256, /* Multi I/O supported */ 20825 .read = SPI_CHIP_READ, /* Fast read (0x0B) and multi I/O supported */ 20826 .voltage = {2700, 3600}, 20827 }, 20828 20829 { 20830 .vendor = "Winbond", 20831 .name = "W25Q40BW", 20832 .bustype = BUS_SPI, 20833 .manufacture_id = WINBOND_NEX_ID, 20834 .model_id = WINBOND_NEX_W25Q40BW, 20835 .total_size = 512, 20836 .page_size = 256, 20837 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20838 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 20839 .tested = TEST_OK_PREW, 20840 .probe = PROBE_SPI_RDID, 20841 .probe_timing = TIMING_ZERO, 20842 .block_erasers = 20843 { 20844 { 20845 .eraseblocks = { {4 * 1024, 128} }, 20846 .block_erase = SPI_BLOCK_ERASE_20, 20847 }, { 20848 .eraseblocks = { {32 * 1024, 16} }, 20849 .block_erase = SPI_BLOCK_ERASE_52, 20850 }, { 20851 .eraseblocks = { {64 * 1024, 8} }, 20852 .block_erase = SPI_BLOCK_ERASE_D8, 20853 }, { 20854 .eraseblocks = { {512 * 1024, 1} }, 20855 .block_erase = SPI_BLOCK_ERASE_60, 20856 }, { 20857 .eraseblocks = { {512 * 1024, 1} }, 20858 .block_erase = SPI_BLOCK_ERASE_C7, 20859 } 20860 }, 20861 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 20862 .unlock = SPI_DISABLE_BLOCKPROTECT, 20863 .write = SPI_CHIP_WRITE256, 20864 .read = SPI_CHIP_READ, 20865 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20866 }, 20867 20868 { 20869 .vendor = "Winbond", 20870 .name = "W25Q40EW", 20871 .bustype = BUS_SPI, 20872 .manufacture_id = WINBOND_NEX_ID, 20873 .model_id = WINBOND_NEX_W25Q40EW, 20874 .total_size = 512, 20875 .page_size = 256, 20876 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 20877 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 20878 .tested = TEST_OK_PREW, 20879 .probe = PROBE_SPI_RDID, 20880 .probe_timing = TIMING_ZERO, 20881 .block_erasers = 20882 { 20883 { 20884 .eraseblocks = { {4 * 1024, 128} }, 20885 .block_erase = SPI_BLOCK_ERASE_20, 20886 }, { 20887 .eraseblocks = { {32 * 1024, 16} }, 20888 .block_erase = SPI_BLOCK_ERASE_52, 20889 }, { 20890 .eraseblocks = { {64 * 1024, 8} }, 20891 .block_erase = SPI_BLOCK_ERASE_D8, 20892 }, { 20893 .eraseblocks = { {512 * 1024, 1} }, 20894 .block_erase = SPI_BLOCK_ERASE_60, 20895 }, { 20896 .eraseblocks = { {512 * 1024, 1} }, 20897 .block_erase = SPI_BLOCK_ERASE_C7, 20898 } 20899 }, 20900 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 20901 .unlock = SPI_DISABLE_BLOCKPROTECT, 20902 .write = SPI_CHIP_WRITE256, 20903 .read = SPI_CHIP_READ, 20904 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ 20905 }, 20906 20907 { 20908 .vendor = "Winbond", 20909 .name = "W25Q512JV", 20910 .bustype = BUS_SPI, 20911 .manufacture_id = WINBOND_NEX_ID, 20912 .model_id = WINBOND_NEX_W25Q512JV, 20913 .total_size = 64 * 1024, 20914 .page_size = 256, 20915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA, 20916 .tested = TEST_OK_PREW, 20917 .probe = PROBE_SPI_RDID, 20918 .probe_timing = TIMING_ZERO, 20919 .block_erasers = 20920 { 20921 { 20922 .eraseblocks = { {4 * 1024, 16384} }, 20923 .block_erase = SPI_BLOCK_ERASE_21, 20924 }, { 20925 .eraseblocks = { {4 * 1024, 16384} }, 20926 .block_erase = SPI_BLOCK_ERASE_20, 20927 }, { 20928 .eraseblocks = { {32 * 1024, 2048} }, 20929 .block_erase = SPI_BLOCK_ERASE_52, 20930 }, { 20931 .eraseblocks = { {64 * 1024, 1024} }, 20932 .block_erase = SPI_BLOCK_ERASE_DC, 20933 }, { 20934 .eraseblocks = { {64 * 1024, 1024} }, 20935 .block_erase = SPI_BLOCK_ERASE_D8, 20936 }, { 20937 .eraseblocks = { {64 * 1024 * 1024, 1} }, 20938 .block_erase = SPI_BLOCK_ERASE_60, 20939 }, { 20940 .eraseblocks = { {64 * 1024 * 1024, 1} }, 20941 .block_erase = SPI_BLOCK_ERASE_C7, 20942 } 20943 }, 20944 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 20945 .unlock = SPI_DISABLE_BLOCKPROTECT, 20946 .write = SPI_CHIP_WRITE256, 20947 .read = SPI_CHIP_READ, 20948 .voltage = {2700, 3600}, 20949 }, 20950 20951 { 20952 .vendor = "Winbond", 20953 .name = "W25Q512NW-IM", 20954 .bustype = BUS_SPI, 20955 .manufacture_id = WINBOND_NEX_ID, 20956 .model_id = WINBOND_NEX_W25Q512NW_IM, 20957 .total_size = 64 * 1024, 20958 .page_size = 256, 20959 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2 20960 | FEATURE_WRSR3, 20961 .tested = TEST_OK_PREWB, 20962 .probe = PROBE_SPI_RDID, 20963 .probe_timing = TIMING_ZERO, 20964 .block_erasers = 20965 { 20966 { 20967 .eraseblocks = { {4 * 1024, 16384} }, 20968 .block_erase = SPI_BLOCK_ERASE_21, 20969 }, { 20970 .eraseblocks = { {4 * 1024, 16384} }, 20971 .block_erase = SPI_BLOCK_ERASE_20, 20972 }, { 20973 .eraseblocks = { {32 * 1024, 2048} }, 20974 .block_erase = SPI_BLOCK_ERASE_52, 20975 }, { 20976 .eraseblocks = { {64 * 1024, 1024} }, 20977 .block_erase = SPI_BLOCK_ERASE_DC, 20978 }, { 20979 .eraseblocks = { {64 * 1024, 1024} }, 20980 .block_erase = SPI_BLOCK_ERASE_D8, 20981 }, { 20982 .eraseblocks = { {64 * 1024 * 1024, 1} }, 20983 .block_erase = SPI_BLOCK_ERASE_60, 20984 }, { 20985 .eraseblocks = { {64 * 1024 * 1024, 1} }, 20986 .block_erase = SPI_BLOCK_ERASE_C7, 20987 } 20988 }, 20989 .unlock = SPI_DISABLE_BLOCKPROTECT, 20990 .write = SPI_CHIP_WRITE256, 20991 .read = SPI_CHIP_READ, 20992 .voltage = {1650, 1950}, 20993 .reg_bits = 20994 { 20995 .srp = {STATUS1, 7, RW}, 20996 .srl = {STATUS2, 0, RW}, 20997 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 20998 .tb = {STATUS1, 6, RW}, 20999 .cmp = {STATUS2, 6, RW}, 21000 .wps = {STATUS3, 2, RW}, 21001 }, 21002 .decode_range = DECODE_RANGE_SPI25, 21003 }, 21004 21005 { 21006 .vendor = "Winbond", 21007 .name = "W25Q64BV/W25Q64CV/W25Q64FV", 21008 .bustype = BUS_SPI, 21009 .manufacture_id = WINBOND_NEX_ID, 21010 .model_id = WINBOND_NEX_W25Q64_V, 21011 .total_size = 8192, 21012 .page_size = 256, 21013 /* supports SFDP */ 21014 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21015 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2, 21016 .tested = TEST_OK_PREWB, 21017 .probe = PROBE_SPI_RDID, 21018 .probe_timing = TIMING_ZERO, 21019 .block_erasers = 21020 { 21021 { 21022 .eraseblocks = { {4 * 1024, 2048} }, 21023 .block_erase = SPI_BLOCK_ERASE_20, 21024 }, { 21025 .eraseblocks = { {32 * 1024, 256} }, 21026 .block_erase = SPI_BLOCK_ERASE_52, 21027 }, { 21028 .eraseblocks = { {64 * 1024, 128} }, 21029 .block_erase = SPI_BLOCK_ERASE_D8, 21030 }, { 21031 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21032 .block_erase = SPI_BLOCK_ERASE_60, 21033 }, { 21034 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21035 .block_erase = SPI_BLOCK_ERASE_C7, 21036 } 21037 }, 21038 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 21039 .unlock = SPI_DISABLE_BLOCKPROTECT, 21040 .write = SPI_CHIP_WRITE256, 21041 .read = SPI_CHIP_READ, 21042 .voltage = {2700, 3600}, 21043 .reg_bits = 21044 { 21045 .srp = {STATUS1, 7, RW}, 21046 .srl = {STATUS2, 0, RW}, 21047 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21048 .tb = {STATUS1, 5, RW}, 21049 .sec = {STATUS1, 6, RW}, 21050 .cmp = {STATUS2, 6, RW}, 21051 }, 21052 .decode_range = DECODE_RANGE_SPI25, 21053 }, 21054 21055 { 21056 .vendor = "Winbond", 21057 .name = "W25Q64JV-.Q", 21058 .bustype = BUS_SPI, 21059 .manufacture_id = WINBOND_NEX_ID, 21060 .model_id = WINBOND_NEX_W25Q64_V, 21061 .total_size = 8192, 21062 .page_size = 256, 21063 /* supports SFDP */ 21064 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21065 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | 21066 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3, 21067 .tested = TEST_OK_PREW, 21068 .probe = PROBE_SPI_RDID, 21069 .probe_timing = TIMING_ZERO, 21070 .block_erasers = 21071 { 21072 { 21073 .eraseblocks = { {4 * 1024, 2048} }, 21074 .block_erase = SPI_BLOCK_ERASE_20, 21075 }, { 21076 .eraseblocks = { {32 * 1024, 256} }, 21077 .block_erase = SPI_BLOCK_ERASE_52, 21078 }, { 21079 .eraseblocks = { {64 * 1024, 128} }, 21080 .block_erase = SPI_BLOCK_ERASE_D8, 21081 }, { 21082 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21083 .block_erase = SPI_BLOCK_ERASE_60, 21084 }, { 21085 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21086 .block_erase = SPI_BLOCK_ERASE_C7, 21087 } 21088 }, 21089 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21090 .unlock = SPI_DISABLE_BLOCKPROTECT, 21091 .write = SPI_CHIP_WRITE256, 21092 .read = SPI_CHIP_READ, 21093 .voltage = {2700, 3600}, 21094 .reg_bits = 21095 { 21096 .srp = {STATUS1, 7, RW}, 21097 .srl = {STATUS2, 0, RW}, 21098 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21099 .tb = {STATUS1, 5, RW}, 21100 .sec = {STATUS1, 6, RW}, 21101 .cmp = {STATUS2, 6, RW}, 21102 .wps = {STATUS3, 2, RW}, 21103 }, 21104 .decode_range = DECODE_RANGE_SPI25, 21105 }, 21106 21107 { 21108 .vendor = "Winbond", 21109 .name = "W25Q64JV-.M", 21110 .bustype = BUS_SPI, 21111 .manufacture_id = WINBOND_NEX_ID, 21112 .model_id = WINBOND_NEX_W25Q64JV, 21113 .total_size = 8192, 21114 .page_size = 256, 21115 /* supports SFDP */ 21116 /* QPI enable 0x38 */ 21117 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 21118 .tested = TEST_OK_PREW, 21119 .probe = PROBE_SPI_RDID, 21120 .probe_timing = TIMING_ZERO, 21121 .block_erasers = 21122 { 21123 { 21124 .eraseblocks = { {4 * 1024, 2048} }, 21125 .block_erase = SPI_BLOCK_ERASE_20, 21126 }, { 21127 .eraseblocks = { {32 * 1024, 256} }, 21128 .block_erase = SPI_BLOCK_ERASE_52, 21129 }, { 21130 .eraseblocks = { {64 * 1024, 128} }, 21131 .block_erase = SPI_BLOCK_ERASE_D8, 21132 }, { 21133 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21134 .block_erase = SPI_BLOCK_ERASE_60, 21135 }, { 21136 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21137 .block_erase = SPI_BLOCK_ERASE_C7, 21138 } 21139 }, 21140 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_TB_BPL, 21141 .unlock = SPI_DISABLE_BLOCKPROTECT_BP2_SRWD, 21142 .write = SPI_CHIP_WRITE256, 21143 .read = SPI_CHIP_READ, 21144 .voltage = {2700, 3600}, 21145 }, 21146 21147 { 21148 .vendor = "Winbond", 21149 .name = "W25Q64.W", 21150 .bustype = BUS_SPI, 21151 .manufacture_id = WINBOND_NEX_ID, 21152 .model_id = WINBOND_NEX_W25Q64_W, 21153 .total_size = 8192, 21154 .page_size = 256, 21155 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21156 /* QPI enable 0x38, disable 0xFF */ 21157 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 21158 .tested = TEST_OK_PREWB, 21159 .probe = PROBE_SPI_RDID, 21160 .probe_timing = TIMING_ZERO, 21161 .block_erasers = 21162 { 21163 { 21164 .eraseblocks = { {4 * 1024, 2048} }, 21165 .block_erase = SPI_BLOCK_ERASE_20, 21166 }, { 21167 .eraseblocks = { {32 * 1024, 256} }, 21168 .block_erase = SPI_BLOCK_ERASE_52, 21169 }, { 21170 .eraseblocks = { {64 * 1024, 128} }, 21171 .block_erase = SPI_BLOCK_ERASE_D8, 21172 }, { 21173 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21174 .block_erase = SPI_BLOCK_ERASE_60, 21175 }, { 21176 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21177 .block_erase = SPI_BLOCK_ERASE_C7, 21178 } 21179 }, 21180 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 21181 .unlock = SPI_DISABLE_BLOCKPROTECT, 21182 .write = SPI_CHIP_WRITE256, 21183 .read = SPI_CHIP_READ, 21184 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 21185 .reg_bits = 21186 { 21187 .srp = {STATUS1, 7, RW}, 21188 .srl = {STATUS2, 0, RW}, 21189 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21190 .tb = {STATUS1, 5, RW}, 21191 .sec = {STATUS1, 6, RW}, 21192 .cmp = {STATUS2, 6, RW}, 21193 }, 21194 .decode_range = DECODE_RANGE_SPI25, 21195 }, 21196 21197 { 21198 .vendor = "Winbond", 21199 .name = "W25Q64JW...M", 21200 .bustype = BUS_SPI, 21201 .manufacture_id = WINBOND_NEX_ID, 21202 .model_id = WINBOND_NEX_W25Q64JW_M, 21203 .total_size = 8192, 21204 .page_size = 256, 21205 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21206 /* QPI enable 0x38, disable 0xFF */ 21207 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2 | FEATURE_WRSR3, 21208 .tested = TEST_OK_PREW, 21209 .probe = PROBE_SPI_RDID, 21210 .probe_timing = TIMING_ZERO, 21211 .block_erasers = 21212 { 21213 { 21214 .eraseblocks = { {4 * 1024, 2048} }, 21215 .block_erase = SPI_BLOCK_ERASE_20, 21216 }, { 21217 .eraseblocks = { {32 * 1024, 256} }, 21218 .block_erase = SPI_BLOCK_ERASE_52, 21219 }, { 21220 .eraseblocks = { {64 * 1024, 128} }, 21221 .block_erase = SPI_BLOCK_ERASE_D8, 21222 }, { 21223 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21224 .block_erase = SPI_BLOCK_ERASE_60, 21225 }, { 21226 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21227 .block_erase = SPI_BLOCK_ERASE_C7, 21228 } 21229 }, 21230 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 21231 .unlock = SPI_DISABLE_BLOCKPROTECT, 21232 .write = SPI_CHIP_WRITE256, 21233 .read = SPI_CHIP_READ, 21234 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 21235 .reg_bits = 21236 { 21237 .srp = {STATUS1, 7, RW}, 21238 .srl = {STATUS2, 0, RW}, 21239 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21240 .tb = {STATUS1, 5, RW}, 21241 .sec = {STATUS1, 6, RW}, 21242 .cmp = {STATUS2, 6, RW}, 21243 .wps = {STATUS3, 2, RW}, 21244 }, 21245 .decode_range = DECODE_RANGE_SPI25, 21246 }, 21247 21248 { 21249 .vendor = "Winbond", 21250 .name = "W25Q80.V", 21251 .bustype = BUS_SPI, 21252 .manufacture_id = WINBOND_NEX_ID, 21253 .model_id = WINBOND_NEX_W25Q80_V, 21254 .total_size = 1024, 21255 .page_size = 256, 21256 /* supports SFDP */ 21257 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21258 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 21259 .tested = TEST_OK_PREW, 21260 .probe = PROBE_SPI_RDID, 21261 .probe_timing = TIMING_ZERO, 21262 .block_erasers = 21263 { 21264 { 21265 .eraseblocks = { {4 * 1024, 256} }, 21266 .block_erase = SPI_BLOCK_ERASE_20, 21267 }, { 21268 .eraseblocks = { {32 * 1024, 32} }, 21269 .block_erase = SPI_BLOCK_ERASE_52, 21270 }, { 21271 .eraseblocks = { {64 * 1024, 16} }, 21272 .block_erase = SPI_BLOCK_ERASE_D8, 21273 }, { 21274 .eraseblocks = { {1024 * 1024, 1} }, 21275 .block_erase = SPI_BLOCK_ERASE_60, 21276 }, { 21277 .eraseblocks = { {1024 * 1024, 1} }, 21278 .block_erase = SPI_BLOCK_ERASE_C7, 21279 } 21280 }, 21281 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21282 .unlock = SPI_DISABLE_BLOCKPROTECT, 21283 .write = SPI_CHIP_WRITE256, 21284 .read = SPI_CHIP_READ, 21285 .voltage = {2700, 3600}, 21286 }, 21287 21288 { 21289 .vendor = "Winbond", 21290 .name = "W25Q80BW", 21291 .bustype = BUS_SPI, 21292 .manufacture_id = WINBOND_NEX_ID, 21293 .model_id = WINBOND_NEX_W25Q80BW, 21294 .total_size = 1024, 21295 .page_size = 256, 21296 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 21298 .tested = TEST_OK_PREW, 21299 .probe = PROBE_SPI_RDID, 21300 .probe_timing = TIMING_ZERO, 21301 .block_erasers = 21302 { 21303 { 21304 .eraseblocks = { {4 * 1024, 256} }, 21305 .block_erase = SPI_BLOCK_ERASE_20, 21306 }, { 21307 .eraseblocks = { {32 * 1024, 32} }, 21308 .block_erase = SPI_BLOCK_ERASE_52, 21309 }, { 21310 .eraseblocks = { {64 * 1024, 16} }, 21311 .block_erase = SPI_BLOCK_ERASE_D8, 21312 }, { 21313 .eraseblocks = { {1 * 1024 * 1024, 1} }, 21314 .block_erase = SPI_BLOCK_ERASE_60, 21315 }, { 21316 .eraseblocks = { {1 * 1024 * 1024, 1} }, 21317 .block_erase = SPI_BLOCK_ERASE_C7, 21318 } 21319 }, 21320 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21321 .unlock = SPI_DISABLE_BLOCKPROTECT, 21322 .write = SPI_CHIP_WRITE256, 21323 .read = SPI_CHIP_READ, 21324 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */ 21325 }, 21326 21327 { 21328 .vendor = "Winbond", 21329 .name = "W25Q80EW", 21330 .bustype = BUS_SPI, 21331 .manufacture_id = WINBOND_NEX_ID, 21332 .model_id = WINBOND_NEX_W25Q80EW, 21333 .total_size = 1024, 21334 .page_size = 256, 21335 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 21336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP, 21337 .tested = TEST_OK_PREW, 21338 .probe = PROBE_SPI_RDID, 21339 .probe_timing = TIMING_ZERO, 21340 .block_erasers = 21341 { 21342 { 21343 .eraseblocks = { {4 * 1024, 256} }, 21344 .block_erase = SPI_BLOCK_ERASE_20, 21345 }, { 21346 .eraseblocks = { {32 * 1024, 32} }, 21347 .block_erase = SPI_BLOCK_ERASE_52, 21348 }, { 21349 .eraseblocks = { {64 * 1024, 16} }, 21350 .block_erase = SPI_BLOCK_ERASE_D8, 21351 }, { 21352 .eraseblocks = { {1 * 1024 * 1024, 1} }, 21353 .block_erase = SPI_BLOCK_ERASE_60, 21354 }, { 21355 .eraseblocks = { {1 * 1024 * 1024, 1} }, 21356 .block_erase = SPI_BLOCK_ERASE_C7, 21357 } 21358 }, 21359 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21360 .unlock = SPI_DISABLE_BLOCKPROTECT, 21361 .write = SPI_CHIP_WRITE256, 21362 .read = SPI_CHIP_READ, 21363 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */ 21364 }, 21365 21366 { 21367 .vendor = "Winbond", 21368 .name = "W25X05", 21369 .bustype = BUS_SPI, 21370 .manufacture_id = WINBOND_NEX_ID, 21371 .model_id = WINBOND_NEX_W25X05, 21372 .total_size = 64, 21373 .page_size = 256, 21374 .feature_bits = FEATURE_WRSR_WREN, 21375 .tested = TEST_OK_PREW, 21376 .probe = PROBE_SPI_RDID, 21377 .probe_timing = TIMING_ZERO, 21378 .block_erasers = 21379 { 21380 { 21381 .eraseblocks = { {4 * 1024, 16} }, 21382 .block_erase = SPI_BLOCK_ERASE_20, 21383 }, { 21384 .eraseblocks = { {32 * 1024, 2} }, 21385 .block_erase = SPI_BLOCK_ERASE_52, 21386 }, { 21387 .eraseblocks = { {64 * 1024, 1} }, 21388 .block_erase = SPI_BLOCK_ERASE_D8, 21389 } 21390 }, 21391 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 21392 .unlock = SPI_DISABLE_BLOCKPROTECT, 21393 .write = SPI_CHIP_WRITE256, 21394 .read = SPI_CHIP_READ, 21395 .voltage = {2300, 3600}, 21396 .reg_bits = 21397 { 21398 /* W25X05 is single 64KiB block without any smaller WP granularity */ 21399 /* According to datasheet W25X05 has 2 BP bits, any non-zero value protects ALL.*/ 21400 .srp = {STATUS1, 7, RW}, 21401 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, 21402 }, 21403 .decode_range = DECODE_RANGE_SPI25, 21404 }, 21405 21406 { 21407 .vendor = "Winbond", 21408 .name = "W25X10", 21409 .bustype = BUS_SPI, 21410 .manufacture_id = WINBOND_NEX_ID, 21411 .model_id = WINBOND_NEX_W25X10, 21412 .total_size = 128, 21413 .page_size = 256, 21414 .feature_bits = FEATURE_WRSR_WREN, 21415 .tested = TEST_OK_PREW, 21416 .probe = PROBE_SPI_RDID, 21417 .probe_timing = TIMING_ZERO, 21418 .block_erasers = 21419 { 21420 { 21421 .eraseblocks = { {4 * 1024, 32} }, 21422 .block_erase = SPI_BLOCK_ERASE_20, 21423 }, { 21424 .eraseblocks = { {64 * 1024, 2} }, 21425 .block_erase = SPI_BLOCK_ERASE_D8, 21426 }, { 21427 .eraseblocks = { {128 * 1024, 1} }, 21428 .block_erase = SPI_BLOCK_ERASE_C7, 21429 } 21430 }, 21431 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21432 .unlock = SPI_DISABLE_BLOCKPROTECT, 21433 .write = SPI_CHIP_WRITE256, 21434 .read = SPI_CHIP_READ, 21435 .voltage = {2700, 3600}, 21436 .reg_bits = 21437 { 21438 .srp = {STATUS1, 7, RW}, 21439 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, 21440 .tb = {STATUS1, 5, RW}, 21441 }, 21442 .decode_range = DECODE_RANGE_SPI25, 21443 }, 21444 21445 { 21446 .vendor = "Winbond", 21447 .name = "W25X16", 21448 .bustype = BUS_SPI, 21449 .manufacture_id = WINBOND_NEX_ID, 21450 .model_id = WINBOND_NEX_W25X16, 21451 .total_size = 2048, 21452 .page_size = 256, 21453 .feature_bits = FEATURE_WRSR_WREN, 21454 .tested = TEST_OK_PREW, 21455 .probe = PROBE_SPI_RDID, 21456 .probe_timing = TIMING_ZERO, 21457 .block_erasers = 21458 { 21459 { 21460 .eraseblocks = { {4 * 1024, 512} }, 21461 .block_erase = SPI_BLOCK_ERASE_20, 21462 }, { 21463 .eraseblocks = { {32 * 1024, 64} }, 21464 .block_erase = SPI_BLOCK_ERASE_52, 21465 }, { 21466 .eraseblocks = { {64 * 1024, 32} }, 21467 .block_erase = SPI_BLOCK_ERASE_D8, 21468 }, { 21469 .eraseblocks = { {2 * 1024 * 1024, 1} }, 21470 .block_erase = SPI_BLOCK_ERASE_60, 21471 }, { 21472 .eraseblocks = { {2 * 1024 * 1024, 1} }, 21473 .block_erase = SPI_BLOCK_ERASE_C7, 21474 } 21475 }, 21476 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21477 .unlock = SPI_DISABLE_BLOCKPROTECT, 21478 .write = SPI_CHIP_WRITE256, 21479 .read = SPI_CHIP_READ, 21480 .voltage = {2700, 3600}, 21481 .reg_bits = 21482 { 21483 .srp = {STATUS1, 7, RW}, 21484 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21485 .tb = {STATUS1, 5, RW}, 21486 }, 21487 .decode_range = DECODE_RANGE_SPI25, 21488 }, 21489 21490 { 21491 .vendor = "Winbond", 21492 .name = "W25X20", 21493 .bustype = BUS_SPI, 21494 .manufacture_id = WINBOND_NEX_ID, 21495 .model_id = WINBOND_NEX_W25X20, 21496 .total_size = 256, 21497 .page_size = 256, 21498 .feature_bits = FEATURE_WRSR_WREN, 21499 .tested = TEST_OK_PREWB, 21500 .probe = PROBE_SPI_RDID, 21501 .probe_timing = TIMING_ZERO, 21502 .block_erasers = 21503 { 21504 { 21505 .eraseblocks = { {4 * 1024, 64} }, 21506 .block_erase = SPI_BLOCK_ERASE_20, 21507 }, { 21508 .eraseblocks = { {64 * 1024, 4} }, 21509 .block_erase = SPI_BLOCK_ERASE_D8, 21510 }, { 21511 .eraseblocks = { {256 * 1024, 1} }, 21512 .block_erase = SPI_BLOCK_ERASE_C7, 21513 } 21514 }, 21515 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21516 .unlock = SPI_DISABLE_BLOCKPROTECT, 21517 .write = SPI_CHIP_WRITE256, 21518 .read = SPI_CHIP_READ, 21519 .voltage = {2700, 3600}, 21520 .reg_bits = 21521 { 21522 .srp = {STATUS1, 7, RW}, 21523 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}}, 21524 .tb = {STATUS1, 5, RW}, 21525 }, 21526 .decode_range = DECODE_RANGE_SPI25, 21527 }, 21528 21529 { 21530 .vendor = "Winbond", 21531 .name = "W25X32", 21532 .bustype = BUS_SPI, 21533 .manufacture_id = WINBOND_NEX_ID, 21534 .model_id = WINBOND_NEX_W25X32, 21535 .total_size = 4096, 21536 .page_size = 256, 21537 .feature_bits = FEATURE_WRSR_WREN, 21538 .tested = TEST_OK_PREW, 21539 .probe = PROBE_SPI_RDID, 21540 .probe_timing = TIMING_ZERO, 21541 .block_erasers = 21542 { 21543 { 21544 .eraseblocks = { {4 * 1024, 1024} }, 21545 .block_erase = SPI_BLOCK_ERASE_20, 21546 }, { 21547 .eraseblocks = { {32 * 1024, 128} }, 21548 .block_erase = SPI_BLOCK_ERASE_52, 21549 }, { 21550 .eraseblocks = { {64 * 1024, 64} }, 21551 .block_erase = SPI_BLOCK_ERASE_D8, 21552 }, { 21553 .eraseblocks = { {4 * 1024 * 1024, 1} }, 21554 .block_erase = SPI_BLOCK_ERASE_60, 21555 }, { 21556 .eraseblocks = { {4 * 1024 * 1024, 1} }, 21557 .block_erase = SPI_BLOCK_ERASE_C7, 21558 } 21559 }, 21560 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21561 .unlock = SPI_DISABLE_BLOCKPROTECT, 21562 .write = SPI_CHIP_WRITE256, 21563 .read = SPI_CHIP_READ, 21564 .voltage = {2700, 3600}, 21565 .reg_bits = 21566 { 21567 .srp = {STATUS1, 7, RW}, 21568 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21569 .tb = {STATUS1, 5, RW}, 21570 }, 21571 .decode_range = DECODE_RANGE_SPI25, 21572 }, 21573 21574 { 21575 .vendor = "Winbond", 21576 .name = "W25X40", 21577 .bustype = BUS_SPI, 21578 .manufacture_id = WINBOND_NEX_ID, 21579 .model_id = WINBOND_NEX_W25X40, 21580 .total_size = 512, 21581 .page_size = 256, 21582 .feature_bits = FEATURE_WRSR_WREN, 21583 .tested = TEST_OK_PREW, 21584 .probe = PROBE_SPI_RDID, 21585 .probe_timing = TIMING_ZERO, 21586 .block_erasers = 21587 { 21588 { 21589 .eraseblocks = { {4 * 1024, 128} }, 21590 .block_erase = SPI_BLOCK_ERASE_20, 21591 }, { 21592 .eraseblocks = { {64 * 1024, 8} }, 21593 .block_erase = SPI_BLOCK_ERASE_D8, 21594 }, { 21595 .eraseblocks = { {512 * 1024, 1} }, 21596 .block_erase = SPI_BLOCK_ERASE_C7, 21597 } 21598 }, 21599 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21600 .unlock = SPI_DISABLE_BLOCKPROTECT, 21601 .write = SPI_CHIP_WRITE256, 21602 .read = SPI_CHIP_READ, 21603 .voltage = {2700, 3600}, 21604 .reg_bits = 21605 { 21606 .srp = {STATUS1, 7, RW}, 21607 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21608 .tb = {STATUS1, 5, RW}, 21609 }, 21610 .decode_range = DECODE_RANGE_SPI25, 21611 }, 21612 21613 { 21614 .vendor = "Winbond", 21615 .name = "W25X64", 21616 .bustype = BUS_SPI, 21617 .manufacture_id = WINBOND_NEX_ID, 21618 .model_id = WINBOND_NEX_W25X64, 21619 .total_size = 8192, 21620 .page_size = 256, 21621 .feature_bits = FEATURE_WRSR_WREN, 21622 .tested = TEST_OK_PREW, 21623 .probe = PROBE_SPI_RDID, 21624 .probe_timing = TIMING_ZERO, 21625 .block_erasers = 21626 { 21627 { 21628 .eraseblocks = { {4 * 1024, 2048} }, 21629 .block_erase = SPI_BLOCK_ERASE_20, 21630 }, { 21631 .eraseblocks = { {32 * 1024, 256} }, 21632 .block_erase = SPI_BLOCK_ERASE_52, 21633 }, { 21634 .eraseblocks = { {64 * 1024, 128} }, 21635 .block_erase = SPI_BLOCK_ERASE_D8, 21636 }, { 21637 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21638 .block_erase = SPI_BLOCK_ERASE_60, 21639 }, { 21640 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21641 .block_erase = SPI_BLOCK_ERASE_C7, 21642 } 21643 }, 21644 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21645 .unlock = SPI_DISABLE_BLOCKPROTECT, 21646 .write = SPI_CHIP_WRITE256, 21647 .read = SPI_CHIP_READ, 21648 .voltage = {2700, 3600}, 21649 .reg_bits = 21650 { 21651 .srp = {STATUS1, 7, RW}, 21652 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21653 .tb = {STATUS1, 5, RW}, 21654 }, 21655 .decode_range = DECODE_RANGE_SPI25, 21656 }, 21657 21658 { 21659 .vendor = "Winbond", 21660 .name = "W25X80", 21661 .bustype = BUS_SPI, 21662 .manufacture_id = WINBOND_NEX_ID, 21663 .model_id = WINBOND_NEX_W25X80, 21664 .total_size = 1024, 21665 .page_size = 256, 21666 .feature_bits = FEATURE_WRSR_WREN, 21667 .tested = TEST_OK_PREW, 21668 .probe = PROBE_SPI_RDID, 21669 .probe_timing = TIMING_ZERO, 21670 .block_erasers = 21671 { 21672 { 21673 .eraseblocks = { {4 * 1024, 256} }, 21674 .block_erase = SPI_BLOCK_ERASE_20, 21675 }, { 21676 .eraseblocks = { {64 * 1024, 16} }, 21677 .block_erase = SPI_BLOCK_ERASE_D8, 21678 }, { 21679 .eraseblocks = { {1024 * 1024, 1} }, 21680 .block_erase = SPI_BLOCK_ERASE_C7, 21681 } 21682 }, 21683 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 21684 .unlock = SPI_DISABLE_BLOCKPROTECT, 21685 .write = SPI_CHIP_WRITE256, 21686 .read = SPI_CHIP_READ, 21687 .voltage = {2700, 3600}, 21688 .reg_bits = 21689 { 21690 .srp = {STATUS1, 7, RW}, 21691 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 21692 .tb = {STATUS1, 5, RW}, 21693 }, 21694 .decode_range = DECODE_RANGE_SPI25, 21695 }, 21696 21697 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */ 21698 { 21699 .vendor = "Winbond", 21700 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012", 21701 .bustype = BUS_PARALLEL, 21702 .manufacture_id = WINBOND_ID, 21703 .model_id = WINBOND_W29C010, 21704 .total_size = 128, 21705 .page_size = 128, 21706 .feature_bits = FEATURE_LONG_RESET, 21707 .tested = TEST_OK_PREW, 21708 .probe = PROBE_JEDEC, 21709 .probe_timing = 10, /* used datasheet for the W29C011A */ 21710 .block_erasers = 21711 { 21712 { 21713 .eraseblocks = { {128 * 1024, 1} }, 21714 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21715 } 21716 }, 21717 .write = WRITE_JEDEC, 21718 .read = READ_MEMMAPPED, 21719 }, 21720 21721 { 21722 .vendor = "Winbond", 21723 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old", 21724 .bustype = BUS_PARALLEL, 21725 .manufacture_id = WINBOND_ID, 21726 .model_id = WINBOND_W29C010, 21727 .total_size = 128, 21728 .page_size = 128, 21729 .feature_bits = FEATURE_LONG_RESET, 21730 .tested = TEST_OK_PREW, 21731 .probe = PROBE_W29EE011, 21732 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */ 21733 .block_erasers = 21734 { 21735 { 21736 .eraseblocks = { {128 * 1024, 1} }, 21737 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21738 } 21739 }, 21740 .write = WRITE_JEDEC, 21741 .read = READ_MEMMAPPED, 21742 }, 21743 21744 { 21745 .vendor = "Winbond", 21746 .name = "W29C020(C)/W29C022", 21747 .bustype = BUS_PARALLEL, 21748 .manufacture_id = WINBOND_ID, 21749 .model_id = WINBOND_W29C020, 21750 .total_size = 256, 21751 .page_size = 128, 21752 .feature_bits = FEATURE_LONG_RESET, 21753 .tested = TEST_OK_PREW, 21754 .probe = PROBE_JEDEC, 21755 .probe_timing = 10, 21756 .block_erasers = 21757 { 21758 { 21759 .eraseblocks = { {256 * 1024, 1} }, 21760 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21761 } 21762 }, 21763 .write = WRITE_JEDEC, 21764 .read = READ_MEMMAPPED, 21765 .voltage = {4500, 5500}, 21766 }, 21767 21768 { 21769 .vendor = "Winbond", 21770 .name = "W29C040/P", 21771 .bustype = BUS_PARALLEL, 21772 .manufacture_id = WINBOND_ID, 21773 .model_id = WINBOND_W29C040, 21774 .total_size = 512, 21775 .page_size = 256, 21776 .feature_bits = FEATURE_LONG_RESET, 21777 .tested = TEST_UNTESTED, 21778 .probe = PROBE_JEDEC, 21779 .probe_timing = 10, 21780 .block_erasers = 21781 { 21782 { 21783 .eraseblocks = { {512 * 1024, 1} }, 21784 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21785 } 21786 }, 21787 .write = WRITE_JEDEC, 21788 .read = READ_MEMMAPPED, 21789 .voltage = {4500, 5500}, 21790 }, 21791 21792 { 21793 .vendor = "Winbond", 21794 .name = "W29C512A/W29EE512", 21795 .bustype = BUS_PARALLEL, 21796 .manufacture_id = WINBOND_ID, 21797 .model_id = WINBOND_W29C512A, 21798 .total_size = 64, 21799 .page_size = 128, 21800 .feature_bits = FEATURE_LONG_RESET, 21801 .tested = TEST_OK_PREW, 21802 .probe = PROBE_JEDEC, 21803 .probe_timing = 10, 21804 .block_erasers = 21805 { 21806 { 21807 .eraseblocks = { {64 * 1024, 1} }, 21808 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21809 } 21810 }, 21811 .write = WRITE_JEDEC, 21812 .read = READ_MEMMAPPED, 21813 .voltage = {4500, 5500}, 21814 }, 21815 21816 { 21817 .vendor = "Winbond", 21818 .name = "W29GL032CB", 21819 .bustype = BUS_PARALLEL, 21820 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21821 .model_id = WINBOND_W29GL032CB, 21822 .total_size = 4096, 21823 .page_size = 128 * 1024, /* actual page size is 16 */ 21824 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21825 .tested = TEST_UNTESTED, 21826 .probe = PROBE_JEDEC_29GL, 21827 .probe_timing = TIMING_ZERO, 21828 .block_erasers = 21829 { 21830 { 21831 .eraseblocks = { 21832 {8 * 1024, 8}, 21833 {64 * 1024, 63}, 21834 }, 21835 .block_erase = JEDEC_SECTOR_ERASE, 21836 }, { 21837 .eraseblocks = { {4 * 1024 * 1024, 1} }, 21838 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21839 }, 21840 }, 21841 .write = WRITE_JEDEC1, 21842 .read = READ_MEMMAPPED, 21843 .voltage = {2700, 3600}, 21844 }, 21845 21846 { 21847 .vendor = "Winbond", 21848 .name = "W29GL032CH/L", 21849 .bustype = BUS_PARALLEL, 21850 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21851 .model_id = WINBOND_W29GL032CHL, 21852 .total_size = 4096, 21853 .page_size = 128 * 1024, /* actual page size is 16 */ 21854 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21855 .tested = TEST_UNTESTED, 21856 .probe = PROBE_JEDEC_29GL, 21857 .probe_timing = TIMING_ZERO, 21858 .block_erasers = 21859 { 21860 { 21861 .eraseblocks = { {64 * 1024, 64} }, 21862 .block_erase = JEDEC_SECTOR_ERASE, 21863 }, { 21864 .eraseblocks = { {4 * 1024 * 1024, 1} }, 21865 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21866 }, 21867 }, 21868 .write = WRITE_JEDEC1, 21869 .read = READ_MEMMAPPED, 21870 .voltage = {2700, 3600}, 21871 }, 21872 21873 { 21874 .vendor = "Winbond", 21875 .name = "W29GL032CT", 21876 .bustype = BUS_PARALLEL, 21877 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21878 .model_id = WINBOND_W29GL032CT, 21879 .total_size = 4096, 21880 .page_size = 128 * 1024, /* actual page size is 16 */ 21881 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21882 .tested = TEST_UNTESTED, 21883 .probe = PROBE_JEDEC_29GL, 21884 .probe_timing = TIMING_ZERO, 21885 .block_erasers = 21886 { 21887 { 21888 .eraseblocks = { 21889 {64 * 1024, 63}, 21890 {8 * 1024, 8}, 21891 }, 21892 .block_erase = JEDEC_SECTOR_ERASE, 21893 }, { 21894 .eraseblocks = { {4 * 1024 * 1024, 1} }, 21895 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21896 }, 21897 }, 21898 .write = WRITE_JEDEC1, 21899 .read = READ_MEMMAPPED, 21900 .voltage = {2700, 3600}, 21901 }, 21902 21903 { 21904 .vendor = "Winbond", 21905 .name = "W29GL064CB", 21906 .bustype = BUS_PARALLEL, 21907 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21908 .model_id = WINBOND_W29GL064CB, 21909 .total_size = 8192, 21910 .page_size = 128 * 1024, /* actual page size is 16 */ 21911 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21912 .tested = TEST_UNTESTED, 21913 .probe = PROBE_JEDEC_29GL, 21914 .probe_timing = TIMING_ZERO, 21915 .block_erasers = 21916 { 21917 { 21918 .eraseblocks = { 21919 {8 * 1024, 8}, 21920 {64 * 1024, 127}, 21921 }, 21922 .block_erase = JEDEC_SECTOR_ERASE, 21923 }, { 21924 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21925 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21926 }, 21927 }, 21928 .write = WRITE_JEDEC1, 21929 .read = READ_MEMMAPPED, 21930 .voltage = {2700, 3600}, 21931 }, 21932 21933 { 21934 .vendor = "Winbond", 21935 .name = "W29GL064CH/L", 21936 .bustype = BUS_PARALLEL, 21937 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21938 .model_id = WINBOND_W29GL064CHL, 21939 .total_size = 8192, 21940 .page_size = 128 * 1024, /* actual page size is 16 */ 21941 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21942 .tested = TEST_UNTESTED, 21943 .probe = PROBE_JEDEC_29GL, 21944 .probe_timing = TIMING_ZERO, 21945 .block_erasers = 21946 { 21947 { 21948 .eraseblocks = { {64 * 1024, 128} }, 21949 .block_erase = JEDEC_SECTOR_ERASE, 21950 }, { 21951 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21952 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21953 }, 21954 }, 21955 .write = WRITE_JEDEC1, 21956 .read = READ_MEMMAPPED, 21957 .voltage = {2700, 3600}, 21958 }, 21959 21960 { 21961 .vendor = "Winbond", 21962 .name = "W29GL064CT", 21963 .bustype = BUS_PARALLEL, 21964 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21965 .model_id = WINBOND_W29GL064CT, 21966 .total_size = 8192, 21967 .page_size = 128 * 1024, /* actual page size is 16 */ 21968 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21969 .tested = TEST_UNTESTED, 21970 .probe = PROBE_JEDEC_29GL, 21971 .probe_timing = TIMING_ZERO, 21972 .block_erasers = 21973 { 21974 { 21975 .eraseblocks = { 21976 {64 * 1024, 127}, 21977 {8 * 1024, 8}, 21978 }, 21979 .block_erase = JEDEC_SECTOR_ERASE, 21980 }, { 21981 .eraseblocks = { {8 * 1024 * 1024, 1} }, 21982 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 21983 }, 21984 }, 21985 .write = WRITE_JEDEC1, 21986 .read = READ_MEMMAPPED, 21987 .voltage = {2700, 3600}, 21988 }, 21989 21990 { 21991 .vendor = "Winbond", 21992 .name = "W29GL128C", 21993 .bustype = BUS_PARALLEL, 21994 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */ 21995 .model_id = WINBOND_W29GL128CHL, 21996 .total_size = 16384, 21997 .page_size = 128 * 1024, /* actual page size is 16 */ 21998 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, 21999 .tested = TEST_UNTESTED, 22000 .probe = PROBE_JEDEC_29GL, 22001 .probe_timing = TIMING_ZERO, 22002 .block_erasers = 22003 { 22004 { 22005 .eraseblocks = { {128 * 1024, 128} }, 22006 .block_erase = JEDEC_SECTOR_ERASE, 22007 }, { 22008 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22009 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22010 }, 22011 }, 22012 .write = WRITE_JEDEC1, 22013 .read = READ_MEMMAPPED, 22014 .voltage = {2700, 3600}, 22015 }, 22016 22017 { 22018 .vendor = "Winbond", 22019 .name = "W39F010", 22020 .bustype = BUS_PARALLEL, 22021 .manufacture_id = WINBOND_ID, 22022 .model_id = WINBOND_W39F010, 22023 .total_size = 128, 22024 .page_size = 4 * 1024, 22025 .feature_bits = FEATURE_EITHER_RESET, 22026 .tested = TEST_OK_PREW, 22027 .probe = PROBE_JEDEC, 22028 .probe_timing = 10, 22029 .block_erasers = 22030 { 22031 { 22032 .eraseblocks = { {4 * 1024, 32} }, 22033 .block_erase = JEDEC_BLOCK_ERASE, 22034 }, { 22035 .eraseblocks = { {128 * 1024, 1} }, 22036 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22037 } 22038 }, 22039 .printlock = PRINTLOCK_W39F010, 22040 .write = WRITE_JEDEC1, 22041 .read = READ_MEMMAPPED, 22042 .voltage = {4500, 5500}, 22043 }, 22044 22045 { 22046 .vendor = "Winbond", 22047 .name = "W39L010", 22048 .bustype = BUS_PARALLEL, 22049 .manufacture_id = WINBOND_ID, 22050 .model_id = WINBOND_W39L010, 22051 .total_size = 128, 22052 .page_size = 4 * 1024, 22053 .feature_bits = FEATURE_EITHER_RESET, 22054 .tested = TEST_UNTESTED, 22055 .probe = PROBE_JEDEC, 22056 .probe_timing = 10, 22057 .block_erasers = 22058 { 22059 { 22060 .eraseblocks = { {4 * 1024, 32} }, 22061 .block_erase = JEDEC_BLOCK_ERASE, 22062 }, { 22063 .eraseblocks = { {128 * 1024, 1} }, 22064 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22065 } 22066 }, 22067 .printlock = PRINTLOCK_W39L010, 22068 .write = WRITE_JEDEC1, 22069 .read = READ_MEMMAPPED, 22070 .voltage = {3000, 3600}, 22071 }, 22072 22073 { 22074 .vendor = "Winbond", 22075 .name = "W39L020", 22076 .bustype = BUS_PARALLEL, 22077 .manufacture_id = WINBOND_ID, 22078 .model_id = WINBOND_W39L020, 22079 .total_size = 256, 22080 .page_size = 4 * 1024, 22081 .feature_bits = FEATURE_EITHER_RESET, 22082 .tested = TEST_UNTESTED, 22083 .probe = PROBE_JEDEC, 22084 .probe_timing = 10, 22085 .block_erasers = 22086 { 22087 { 22088 .eraseblocks = { {4 * 1024, 64} }, 22089 .block_erase = JEDEC_BLOCK_ERASE, 22090 }, { 22091 .eraseblocks = { {64 * 1024, 4} }, 22092 .block_erase = JEDEC_SECTOR_ERASE, 22093 }, { 22094 .eraseblocks = { {256 * 1024, 1} }, 22095 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22096 } 22097 }, 22098 .printlock = PRINTLOCK_W39L020, 22099 .write = WRITE_JEDEC1, 22100 .read = READ_MEMMAPPED, 22101 .voltage = {3000, 3600}, 22102 }, 22103 22104 { 22105 .vendor = "Winbond", 22106 .name = "W39L040", 22107 .bustype = BUS_PARALLEL, 22108 .manufacture_id = WINBOND_ID, 22109 .model_id = WINBOND_W39L040, 22110 .total_size = 512, 22111 .page_size = 64 * 1024, 22112 .feature_bits = FEATURE_EITHER_RESET, 22113 .tested = TEST_OK_PR, 22114 .probe = PROBE_JEDEC, 22115 .probe_timing = 10, 22116 .block_erasers = 22117 { 22118 { 22119 .eraseblocks = { {4 * 1024, 128} }, 22120 .block_erase = JEDEC_BLOCK_ERASE, 22121 }, { 22122 .eraseblocks = { {64 * 1024, 8} }, 22123 .block_erase = JEDEC_SECTOR_ERASE, 22124 }, { 22125 .eraseblocks = { {512 * 1024, 1} }, 22126 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22127 } 22128 }, 22129 .printlock = PRINTLOCK_W39L040, 22130 .write = WRITE_JEDEC1, 22131 .read = READ_MEMMAPPED, 22132 .voltage = {3000, 3600}, 22133 }, 22134 22135 { 22136 .vendor = "Winbond", 22137 .name = "W39V040A", 22138 .bustype = BUS_LPC, 22139 .manufacture_id = WINBOND_ID, 22140 .model_id = WINBOND_W39V040A, 22141 .total_size = 512, 22142 .page_size = 64 * 1024, 22143 .feature_bits = FEATURE_EITHER_RESET, 22144 .tested = TEST_OK_PREW, 22145 .probe = PROBE_JEDEC, 22146 .probe_timing = 10, 22147 .block_erasers = 22148 { 22149 { 22150 .eraseblocks = { {64 * 1024, 8} }, 22151 .block_erase = JEDEC_SECTOR_ERASE, 22152 }, { 22153 .eraseblocks = { {512 * 1024, 1} }, 22154 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22155 } 22156 }, 22157 .printlock = PRINTLOCK_W39V040A, 22158 .write = WRITE_JEDEC1, 22159 .read = READ_MEMMAPPED, 22160 .voltage = {3000, 3600}, 22161 }, 22162 22163 { 22164 .vendor = "Winbond", 22165 .name = "W39V040B", 22166 .bustype = BUS_LPC, 22167 .manufacture_id = WINBOND_ID, 22168 .model_id = WINBOND_W39V040B, 22169 .total_size = 512, 22170 .page_size = 64 * 1024, 22171 .feature_bits = FEATURE_EITHER_RESET, 22172 .tested = TEST_OK_PREW, 22173 .probe = PROBE_JEDEC, 22174 .probe_timing = 10, 22175 .block_erasers = 22176 { 22177 { 22178 .eraseblocks = { {64 * 1024, 8} }, 22179 .block_erase = JEDEC_SECTOR_ERASE, 22180 }, { 22181 .eraseblocks = { {512 * 1024, 1} }, 22182 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22183 } 22184 }, 22185 .printlock = PRINTLOCK_W39V040B, 22186 .write = WRITE_JEDEC1, 22187 .read = READ_MEMMAPPED, 22188 .voltage = {3000, 3600}, 22189 }, 22190 22191 { 22192 .vendor = "Winbond", 22193 .name = "W39V040C", 22194 .bustype = BUS_LPC, 22195 .manufacture_id = WINBOND_ID, 22196 .model_id = WINBOND_W39V040C, 22197 .total_size = 512, 22198 .page_size = 64 * 1024, 22199 .feature_bits = FEATURE_EITHER_RESET, 22200 .tested = TEST_OK_PREW, 22201 .probe = PROBE_JEDEC, 22202 .probe_timing = 10, 22203 .block_erasers = 22204 { 22205 { 22206 .eraseblocks = { {64 * 1024, 8} }, 22207 .block_erase = JEDEC_SECTOR_ERASE, 22208 }, { 22209 .eraseblocks = { {512 * 1024, 1} }, 22210 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22211 } 22212 }, 22213 .printlock = PRINTLOCK_W39V040C, 22214 .write = WRITE_JEDEC1, 22215 .read = READ_MEMMAPPED, 22216 .voltage = {3000, 3600}, 22217 }, 22218 22219 { 22220 .vendor = "Winbond", 22221 .name = "W39V040FA", 22222 .bustype = BUS_FWH, 22223 .manufacture_id = WINBOND_ID, 22224 .model_id = WINBOND_W39V040FA, 22225 .total_size = 512, 22226 .page_size = 64 * 1024, 22227 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 22228 .tested = TEST_OK_PREW, 22229 .probe = PROBE_JEDEC, 22230 .probe_timing = 10, 22231 .block_erasers = 22232 { 22233 { 22234 .eraseblocks = { {4 * 1024, 128} }, 22235 .block_erase = JEDEC_BLOCK_ERASE, 22236 }, { 22237 .eraseblocks = { {64 * 1024, 8} }, 22238 .block_erase = JEDEC_SECTOR_ERASE, 22239 }, { 22240 .eraseblocks = { {512 * 1024, 1} }, 22241 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22242 } 22243 }, 22244 .printlock = PRINTLOCK_W39V040FA, 22245 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 22246 .write = WRITE_JEDEC1, 22247 .read = READ_MEMMAPPED, 22248 .voltage = {3000, 3600}, 22249 }, 22250 22251 { 22252 .vendor = "Winbond", 22253 .name = "W39V040FB", 22254 .bustype = BUS_FWH, 22255 .manufacture_id = WINBOND_ID, 22256 .model_id = WINBOND_W39V040B, 22257 .total_size = 512, 22258 .page_size = 64 * 1024, 22259 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 22260 .tested = TEST_OK_PREW, 22261 .probe = PROBE_JEDEC, 22262 .probe_timing = 10, 22263 .block_erasers = 22264 { 22265 { 22266 .eraseblocks = { {64 * 1024, 8} }, 22267 .block_erase = JEDEC_SECTOR_ERASE, 22268 }, { 22269 .eraseblocks = { {512 * 1024, 1} }, 22270 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22271 } 22272 }, 22273 .printlock = PRINTLOCK_W39V040FB, 22274 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 22275 .write = WRITE_JEDEC1, 22276 .read = READ_MEMMAPPED, 22277 .voltage = {3000, 3600}, /* Also has 12V fast program */ 22278 }, 22279 22280 { 22281 .vendor = "Winbond", 22282 .name = "W39V040FC", 22283 .bustype = BUS_FWH, 22284 .manufacture_id = WINBOND_ID, 22285 .model_id = WINBOND_W39V040C, 22286 .total_size = 512, 22287 .page_size = 64 * 1024, 22288 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 22289 .tested = TEST_OK_PREW, 22290 .probe = PROBE_JEDEC, 22291 .probe_timing = 10, 22292 .block_erasers = 22293 { 22294 { 22295 .eraseblocks = { {64 * 1024, 8} }, 22296 .block_erase = JEDEC_SECTOR_ERASE, 22297 }, { 22298 .eraseblocks = { {512 * 1024, 1} }, 22299 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22300 } 22301 }, 22302 .printlock = PRINTLOCK_W39V040FC, 22303 .write = WRITE_JEDEC1, 22304 .read = READ_MEMMAPPED, 22305 .voltage = {3000, 3600}, /* Also has 12V fast program */ 22306 }, 22307 22308 { 22309 .vendor = "Winbond", 22310 .name = "W39V080A", 22311 .bustype = BUS_LPC, 22312 .manufacture_id = WINBOND_ID, 22313 .model_id = WINBOND_W39V080A, 22314 .total_size = 1024, 22315 .page_size = 64 * 1024, 22316 .feature_bits = FEATURE_EITHER_RESET, 22317 .tested = TEST_OK_PREW, 22318 .probe = PROBE_JEDEC, 22319 .probe_timing = 10, 22320 .block_erasers = 22321 { 22322 { 22323 .eraseblocks = { {64 * 1024, 16} }, 22324 .block_erase = JEDEC_SECTOR_ERASE, 22325 }, { 22326 .eraseblocks = { {1024 * 1024, 1} }, 22327 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22328 } 22329 }, 22330 .printlock = PRINTLOCK_W39V080A, 22331 .write = WRITE_JEDEC1, 22332 .read = READ_MEMMAPPED, 22333 .voltage = {3000, 3600}, 22334 }, 22335 22336 { 22337 .vendor = "Winbond", 22338 .name = "W39V080FA", 22339 .bustype = BUS_FWH, 22340 .manufacture_id = WINBOND_ID, 22341 .model_id = WINBOND_W39V080FA, 22342 .total_size = 1024, 22343 .page_size = 64 * 1024, 22344 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 22345 .tested = TEST_OK_PREW, 22346 .probe = PROBE_JEDEC, 22347 .probe_timing = 10, 22348 .block_erasers = 22349 { 22350 { 22351 .eraseblocks = { {64 * 1024, 16} }, 22352 .block_erase = JEDEC_SECTOR_ERASE, 22353 }, { 22354 .eraseblocks = { {1024 * 1024, 1} }, 22355 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22356 } 22357 }, 22358 .printlock = PRINTLOCK_W39V080FA, 22359 .unlock = UNLOCK_REGSPACE2_UNIFORM_64K, 22360 .write = WRITE_JEDEC1, 22361 .read = READ_MEMMAPPED, 22362 .voltage = {3000, 3600}, /* Also has 12V fast program */ 22363 }, 22364 22365 { 22366 .vendor = "Winbond", 22367 .name = "W39V080FA (dual mode)", 22368 .bustype = BUS_FWH, 22369 .manufacture_id = WINBOND_ID, 22370 .model_id = WINBOND_W39V080FA_DM, 22371 .total_size = 512, 22372 .page_size = 64 * 1024, 22373 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET, 22374 .tested = TEST_UNTESTED, 22375 .probe = PROBE_JEDEC, 22376 .probe_timing = 10, 22377 .block_erasers = 22378 { 22379 { 22380 .eraseblocks = { {64 * 1024, 8} }, 22381 .block_erase = JEDEC_SECTOR_ERASE, 22382 }, { 22383 .eraseblocks = { {512 * 1024, 1} }, 22384 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22385 } 22386 }, 22387 .printlock = PRINTLOCK_W39V080FA_DUAL, 22388 .write = WRITE_JEDEC1, 22389 .read = READ_MEMMAPPED, 22390 .voltage = {3000, 3600}, /* Also has 12V fast program */ 22391 }, 22392 22393 { 22394 .vendor = "Winbond", 22395 .name = "W49F002U/N", 22396 .bustype = BUS_PARALLEL, 22397 .manufacture_id = WINBOND_ID, 22398 .model_id = WINBOND_W49F002U, 22399 .total_size = 256, 22400 .page_size = 128, 22401 .feature_bits = FEATURE_EITHER_RESET, 22402 .tested = TEST_OK_PREW, 22403 .probe = PROBE_JEDEC, 22404 .probe_timing = 10, 22405 .block_erasers = 22406 { 22407 { 22408 .eraseblocks = { 22409 {128 * 1024, 1}, 22410 {96 * 1024, 1}, 22411 {8 * 1024, 2}, 22412 {16 * 1024, 1}, 22413 }, 22414 .block_erase = JEDEC_SECTOR_ERASE, 22415 }, { 22416 .eraseblocks = { {256 * 1024, 1} }, 22417 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22418 } 22419 }, 22420 .write = WRITE_JEDEC1, 22421 .read = READ_MEMMAPPED, 22422 .voltage = {4500, 5500}, 22423 }, 22424 22425 { 22426 .vendor = "Winbond", 22427 .name = "W49F020", 22428 .bustype = BUS_PARALLEL, 22429 .manufacture_id = WINBOND_ID, 22430 .model_id = WINBOND_W49F020, 22431 .total_size = 256, 22432 .page_size = 128, 22433 .feature_bits = FEATURE_EITHER_RESET, 22434 .tested = TEST_OK_PROBE, 22435 .probe = PROBE_JEDEC, 22436 .probe_timing = 10, 22437 .block_erasers = 22438 { 22439 { 22440 .eraseblocks = { {256 * 1024, 1} }, 22441 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22442 } 22443 }, 22444 .write = WRITE_JEDEC1, 22445 .read = READ_MEMMAPPED, 22446 .voltage = {4500, 5500}, 22447 }, 22448 22449 { 22450 .vendor = "Winbond", 22451 .name = "W49V002A", 22452 .bustype = BUS_LPC, 22453 .manufacture_id = WINBOND_ID, 22454 .model_id = WINBOND_W49V002A, 22455 .total_size = 256, 22456 .page_size = 128, 22457 .feature_bits = FEATURE_EITHER_RESET, 22458 .tested = TEST_OK_PREW, 22459 .probe = PROBE_JEDEC, 22460 .probe_timing = 10, 22461 .block_erasers = 22462 { 22463 { 22464 .eraseblocks = { 22465 {64 * 1024, 3}, 22466 {32 * 1024, 1}, 22467 {8 * 1024, 2}, 22468 {16 * 1024, 1}, 22469 }, 22470 .block_erase = JEDEC_SECTOR_ERASE, 22471 }, { 22472 .eraseblocks = { {256 * 1024, 1} }, 22473 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22474 } 22475 }, 22476 .write = WRITE_JEDEC1, 22477 .read = READ_MEMMAPPED, 22478 .voltage = {3000, 3600}, 22479 }, 22480 22481 { 22482 .vendor = "Winbond", 22483 .name = "W49V002FA", 22484 .bustype = BUS_FWH, 22485 .manufacture_id = WINBOND_ID, 22486 .model_id = WINBOND_W49V002FA, 22487 .total_size = 256, 22488 .page_size = 128, 22489 .feature_bits = FEATURE_EITHER_RESET, 22490 .tested = TEST_OK_PREW, 22491 .probe = PROBE_JEDEC, 22492 .probe_timing = 10, 22493 .block_erasers = 22494 { 22495 { 22496 .eraseblocks = { 22497 {64 * 1024, 3}, 22498 {32 * 1024, 1}, 22499 {8 * 1024, 2}, 22500 {16 * 1024, 1}, 22501 }, 22502 .block_erase = JEDEC_SECTOR_ERASE, 22503 }, { 22504 .eraseblocks = { {256 * 1024, 1} }, 22505 .block_erase = JEDEC_CHIP_BLOCK_ERASE, 22506 } 22507 }, 22508 .write = WRITE_JEDEC1, 22509 .read = READ_MEMMAPPED, 22510 .voltage = {3000, 3600}, 22511 }, 22512 22513 { 22514 .vendor = "XMC", 22515 .name = "XM25QH80B", 22516 .bustype = BUS_SPI, 22517 .manufacture_id = ST_ID, 22518 .model_id = ST_M45PE80, 22519 .total_size = 1024, 22520 .page_size = 256, 22521 .feature_bits = FEATURE_WRSR_WREN, 22522 .tested = TEST_OK_PREW, 22523 .probe = PROBE_SPI_RDID, 22524 .probe_timing = TIMING_ZERO, 22525 .block_erasers = 22526 { 22527 { 22528 .eraseblocks = { {4 * 1024, 256} }, 22529 .block_erase = SPI_BLOCK_ERASE_20, 22530 }, { 22531 .eraseblocks = { {32 * 1024, 32} }, 22532 .block_erase = SPI_BLOCK_ERASE_52, 22533 }, { 22534 .eraseblocks = { {64 * 1024, 16} }, 22535 .block_erase = SPI_BLOCK_ERASE_D8, 22536 }, { 22537 .eraseblocks = { {1 * 1024 * 1024, 1} }, 22538 .block_erase = SPI_BLOCK_ERASE_60, 22539 }, { 22540 .eraseblocks = { {1 * 1024 * 1024, 1} }, 22541 .block_erase = SPI_BLOCK_ERASE_C7, 22542 } 22543 }, 22544 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP2_SRWD, 22545 .unlock = SPI_DISABLE_BLOCKPROTECT, 22546 .write = SPI_CHIP_WRITE256, 22547 .read = SPI_CHIP_READ, 22548 .voltage = {2700, 3600}, 22549 }, 22550 22551 { 22552 .vendor = "XMC", 22553 .name = "XM25QU80B", 22554 .bustype = BUS_SPI, 22555 .manufacture_id = ST_ID, 22556 .model_id = XMC_XM25QU80B, 22557 .total_size = 1024, 22558 .page_size = 256, 22559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22560 .tested = TEST_OK_PREW, 22561 .probe = PROBE_SPI_RDID, 22562 .probe_timing = TIMING_ZERO, 22563 .block_erasers = 22564 { 22565 { 22566 .eraseblocks = { {4 * 1024, 256 } }, 22567 .block_erase = SPI_BLOCK_ERASE_20, 22568 }, { 22569 .eraseblocks = { {32 * 1024, 32} }, 22570 .block_erase = SPI_BLOCK_ERASE_52, 22571 }, { 22572 .eraseblocks = { {64 * 1024, 16} }, 22573 .block_erase = SPI_BLOCK_ERASE_D8, 22574 }, { 22575 .eraseblocks = { {1 * 1024 * 1024, 1} }, 22576 .block_erase = SPI_BLOCK_ERASE_60, 22577 }, { 22578 .eraseblocks = { {1 * 1024 * 1024, 1} }, 22579 .block_erase = SPI_BLOCK_ERASE_C7, 22580 } 22581 }, 22582 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22583 .unlock = SPI_DISABLE_BLOCKPROTECT, 22584 .write = SPI_CHIP_WRITE256, 22585 .read = SPI_CHIP_READ, 22586 .voltage = {1650, 1950}, 22587 }, 22588 22589 { 22590 .vendor = "XMC", 22591 .name = "XM25QH16C/XM25QH16D", 22592 .bustype = BUS_SPI, 22593 .manufacture_id = ST_ID, 22594 .model_id = XMC_XM25QH16C, 22595 .total_size = 2048, 22596 .page_size = 256, 22597 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22598 .tested = TEST_OK_PREW, 22599 .probe = PROBE_SPI_RDID, 22600 .probe_timing = TIMING_ZERO, 22601 .block_erasers = 22602 { 22603 { 22604 .eraseblocks = { {4 * 1024, 512} }, 22605 .block_erase = SPI_BLOCK_ERASE_20, 22606 }, { 22607 .eraseblocks = { {32 * 1024, 64} }, 22608 .block_erase = SPI_BLOCK_ERASE_52, 22609 }, { 22610 .eraseblocks = { {64 * 1024, 32} }, 22611 .block_erase = SPI_BLOCK_ERASE_D8, 22612 }, { 22613 .eraseblocks = { {2 * 1024 * 1024, 1} }, 22614 .block_erase = SPI_BLOCK_ERASE_60, 22615 }, { 22616 .eraseblocks = { {2 * 1024 * 1024, 1} }, 22617 .block_erase = SPI_BLOCK_ERASE_C7, 22618 } 22619 }, 22620 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22621 .unlock = SPI_DISABLE_BLOCKPROTECT, 22622 .write = SPI_CHIP_WRITE256, 22623 .read = SPI_CHIP_READ, 22624 .voltage = {2700, 3600}, 22625 }, 22626 22627 { 22628 .vendor = "XMC", 22629 .name = "XM25QU16C", 22630 .bustype = BUS_SPI, 22631 .manufacture_id = ST_ID, 22632 .model_id = XMC_XM25QU16C, 22633 .total_size = 2048, 22634 .page_size = 256, 22635 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22636 .tested = TEST_OK_PREW, 22637 .probe = PROBE_SPI_RDID, 22638 .probe_timing = TIMING_ZERO, 22639 .block_erasers = 22640 { 22641 { 22642 .eraseblocks = { {4 * 1024, 512} }, 22643 .block_erase = SPI_BLOCK_ERASE_20, 22644 }, { 22645 .eraseblocks = { {32 * 1024, 64} }, 22646 .block_erase = SPI_BLOCK_ERASE_52, 22647 }, { 22648 .eraseblocks = { {64 * 1024, 32} }, 22649 .block_erase = SPI_BLOCK_ERASE_D8, 22650 }, { 22651 .eraseblocks = { {2 * 1024 * 1024, 1} }, 22652 .block_erase = SPI_BLOCK_ERASE_60, 22653 }, { 22654 .eraseblocks = { {2 * 1024 * 1024, 1} }, 22655 .block_erase = SPI_BLOCK_ERASE_C7, 22656 } 22657 }, 22658 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22659 .unlock = SPI_DISABLE_BLOCKPROTECT, 22660 .write = SPI_CHIP_WRITE256, 22661 .read = SPI_CHIP_READ, 22662 .voltage = {1650, 1950}, 22663 }, 22664 22665 { 22666 .vendor = "XMC", 22667 .name = "XM25QH32C/XM25QH32D", 22668 .bustype = BUS_SPI, 22669 .manufacture_id = ST_ID, 22670 .model_id = XMC_XM25QH32C, 22671 .total_size = 4096, 22672 .page_size = 256, 22673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22674 .tested = TEST_OK_PREW, 22675 .probe = PROBE_SPI_RDID, 22676 .probe_timing = TIMING_ZERO, 22677 .block_erasers = 22678 { 22679 { 22680 .eraseblocks = { {4 * 1024, 1024} }, 22681 .block_erase = SPI_BLOCK_ERASE_20, 22682 }, { 22683 .eraseblocks = { {32 * 1024, 128} }, 22684 .block_erase = SPI_BLOCK_ERASE_52, 22685 }, { 22686 .eraseblocks = { {64 * 1024, 64} }, 22687 .block_erase = SPI_BLOCK_ERASE_D8, 22688 }, { 22689 .eraseblocks = { {4 * 1024 * 1024, 1} }, 22690 .block_erase = SPI_BLOCK_ERASE_60, 22691 }, { 22692 .eraseblocks = { {4 * 1024 * 1024, 1} }, 22693 .block_erase = SPI_BLOCK_ERASE_C7, 22694 } 22695 }, 22696 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22697 .unlock = SPI_DISABLE_BLOCKPROTECT, 22698 .write = SPI_CHIP_WRITE256, 22699 .read = SPI_CHIP_READ, 22700 .voltage = {2700, 3600}, 22701 }, 22702 22703 { 22704 .vendor = "XMC", 22705 .name = "XM25QU32C", 22706 .bustype = BUS_SPI, 22707 .manufacture_id = ST_ID, 22708 .model_id = XMC_XM25QU32C, 22709 .total_size = 4096, 22710 .page_size = 256, 22711 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22712 .tested = TEST_OK_PREW, 22713 .probe = PROBE_SPI_RDID, 22714 .probe_timing = TIMING_ZERO, 22715 .block_erasers = 22716 { 22717 { 22718 .eraseblocks = { {4 * 1024, 1024} }, 22719 .block_erase = SPI_BLOCK_ERASE_20, 22720 }, { 22721 .eraseblocks = { {32 * 1024, 128} }, 22722 .block_erase = SPI_BLOCK_ERASE_52, 22723 }, { 22724 .eraseblocks = { {64 * 1024, 64} }, 22725 .block_erase = SPI_BLOCK_ERASE_D8, 22726 }, { 22727 .eraseblocks = { {4 * 1024 * 1024, 1} }, 22728 .block_erase = SPI_BLOCK_ERASE_60, 22729 }, { 22730 .eraseblocks = { {4 * 1024 * 1024, 1} }, 22731 .block_erase = SPI_BLOCK_ERASE_C7, 22732 } 22733 }, 22734 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22735 .unlock = SPI_DISABLE_BLOCKPROTECT, 22736 .write = SPI_CHIP_WRITE256, 22737 .read = SPI_CHIP_READ, 22738 .voltage = {1650, 1950}, 22739 }, 22740 22741 { 22742 .vendor = "XMC", 22743 .name = "XM25QH64C/XM25QH64D", 22744 .bustype = BUS_SPI, 22745 .manufacture_id = ST_ID, 22746 .model_id = XMC_XM25QH64C, 22747 .total_size = 8192, 22748 .page_size = 256, 22749 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22750 .tested = TEST_OK_PREW, 22751 .probe = PROBE_SPI_RDID, 22752 .probe_timing = TIMING_ZERO, 22753 .block_erasers = 22754 { 22755 { 22756 .eraseblocks = { {4 * 1024, 2048} }, 22757 .block_erase = SPI_BLOCK_ERASE_20, 22758 }, { 22759 .eraseblocks = { {32 * 1024, 256} }, 22760 .block_erase = SPI_BLOCK_ERASE_52, 22761 }, { 22762 .eraseblocks = { {64 * 1024, 128} }, 22763 .block_erase = SPI_BLOCK_ERASE_D8, 22764 }, { 22765 .eraseblocks = { {8 * 1024 * 1024, 1} }, 22766 .block_erase = SPI_BLOCK_ERASE_60, 22767 }, { 22768 .eraseblocks = { {8 * 1024 * 1024, 1} }, 22769 .block_erase = SPI_BLOCK_ERASE_C7, 22770 } 22771 }, 22772 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22773 .unlock = SPI_DISABLE_BLOCKPROTECT, 22774 .write = SPI_CHIP_WRITE256, 22775 .read = SPI_CHIP_READ, 22776 .voltage = {2700, 3600}, 22777 }, 22778 22779 { 22780 .vendor = "XMC", 22781 .name = "XM25QU64C/XM25LU64C", 22782 .bustype = BUS_SPI, 22783 .manufacture_id = ST_ID, 22784 .model_id = XMC_XM25QU64C, 22785 .total_size = 8192, 22786 .page_size = 256, 22787 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22788 .tested = TEST_OK_PREW, 22789 .probe = PROBE_SPI_RDID, 22790 .probe_timing = TIMING_ZERO, 22791 .block_erasers = 22792 { 22793 { 22794 .eraseblocks = { {4 * 1024, 2048} }, 22795 .block_erase = SPI_BLOCK_ERASE_20, 22796 }, { 22797 .eraseblocks = { {32 * 1024, 256} }, 22798 .block_erase = SPI_BLOCK_ERASE_52, 22799 }, { 22800 .eraseblocks = { {64 * 1024, 128} }, 22801 .block_erase = SPI_BLOCK_ERASE_D8, 22802 }, { 22803 .eraseblocks = { {8 * 1024 * 1024, 1} }, 22804 .block_erase = SPI_BLOCK_ERASE_60, 22805 }, { 22806 .eraseblocks = { {8 * 1024 * 1024, 1} }, 22807 .block_erase = SPI_BLOCK_ERASE_C7, 22808 } 22809 }, 22810 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22811 .unlock = SPI_DISABLE_BLOCKPROTECT, 22812 .write = SPI_CHIP_WRITE256, 22813 .read = SPI_CHIP_READ, 22814 .voltage = {1650, 1950}, 22815 }, 22816 22817 { 22818 .vendor = "XMC", 22819 .name = "XM25QH128A", 22820 .bustype = BUS_SPI, 22821 .manufacture_id = ST_ID, 22822 .model_id = XMC_XM25QH128A, 22823 .total_size = 16384, 22824 .page_size = 256, 22825 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 22826 .tested = TEST_OK_PREW, 22827 .probe = PROBE_SPI_RDID, 22828 .probe_timing = TIMING_ZERO, 22829 .block_erasers = 22830 { 22831 { 22832 .eraseblocks = { {4 * 1024, 4096} }, 22833 .block_erase = SPI_BLOCK_ERASE_20, 22834 }, { 22835 .eraseblocks = { {32 * 1024, 512} }, 22836 .block_erase = SPI_BLOCK_ERASE_52, 22837 }, { 22838 .eraseblocks = { {64 * 1024, 256} }, 22839 .block_erase = SPI_BLOCK_ERASE_D8, 22840 }, { 22841 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22842 .block_erase = SPI_BLOCK_ERASE_60, 22843 }, { 22844 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22845 .block_erase = SPI_BLOCK_ERASE_C7, 22846 } 22847 }, 22848 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, 22849 .unlock = SPI_DISABLE_BLOCKPROTECT, 22850 .write = SPI_CHIP_WRITE256, 22851 .read = SPI_CHIP_READ, 22852 .voltage = {2700, 3600}, 22853 .reg_bits = 22854 { 22855 .srp = {STATUS1, 7, RW}, 22856 .srl = {STATUS2, 0, RW}, 22857 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 22858 .tb = {STATUS1, 5, RW}, 22859 .sec = {STATUS1, 6, RW}, 22860 .cmp = {STATUS2, 6, RW}, 22861 }, 22862 .decode_range = DECODE_RANGE_SPI25, 22863 }, 22864 22865 { 22866 .vendor = "XMC", 22867 .name = "XM25QH128C/XM25QH128D", 22868 .bustype = BUS_SPI, 22869 .manufacture_id = ST_ID, 22870 .model_id = XMC_XM25QH128C, 22871 .total_size = 16384, 22872 .page_size = 256, 22873 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2, 22874 .tested = TEST_OK_PREW, 22875 .probe = PROBE_SPI_RDID, 22876 .probe_timing = TIMING_ZERO, 22877 .block_erasers = 22878 { 22879 { 22880 .eraseblocks = { {4 * 1024, 4096} }, 22881 .block_erase = SPI_BLOCK_ERASE_20, 22882 }, { 22883 .eraseblocks = { {32 * 1024, 512} }, 22884 .block_erase = SPI_BLOCK_ERASE_52, 22885 }, { 22886 .eraseblocks = { {64 * 1024, 256} }, 22887 .block_erase = SPI_BLOCK_ERASE_D8, 22888 }, { 22889 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22890 .block_erase = SPI_BLOCK_ERASE_60, 22891 }, { 22892 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22893 .block_erase = SPI_BLOCK_ERASE_C7, 22894 } 22895 }, 22896 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_SRWD_SEC_TB_BP2_WELWIP, 22897 .unlock = SPI_DISABLE_BLOCKPROTECT, 22898 .write = SPI_CHIP_WRITE256, 22899 .read = SPI_CHIP_READ, 22900 .voltage = {2700, 3600}, 22901 .reg_bits = 22902 { 22903 .srp = {STATUS1, 7, RW}, 22904 .srl = {STATUS2, 0, RW}, 22905 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}}, 22906 .tb = {STATUS1, 5, RW}, 22907 .sec = {STATUS1, 6, RW}, 22908 .cmp = {STATUS2, 6, RW}, 22909 }, 22910 .decode_range = DECODE_RANGE_SPI25, 22911 }, 22912 22913 { 22914 .vendor = "XMC", 22915 .name = "XM25QU128C/XM25QU128D", 22916 .bustype = BUS_SPI, 22917 .manufacture_id = ST_ID, 22918 .model_id = XMC_XM25QU128C, 22919 .total_size = 16384, 22920 .page_size = 256, 22921 /* supports SFDP */ 22922 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 22923 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 22924 .tested = TEST_OK_PREW, 22925 .probe = PROBE_SPI_RDID, 22926 .probe_timing = TIMING_ZERO, 22927 .block_erasers = 22928 { 22929 { 22930 .eraseblocks = { {4 * 1024, 4096} }, 22931 .block_erase = SPI_BLOCK_ERASE_20, 22932 }, { 22933 .eraseblocks = { {32 * 1024, 512} }, 22934 .block_erase = SPI_BLOCK_ERASE_52, 22935 }, { 22936 .eraseblocks = { {64 * 1024, 256} }, 22937 .block_erase = SPI_BLOCK_ERASE_D8, 22938 }, { 22939 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22940 .block_erase = SPI_BLOCK_ERASE_60, 22941 }, { 22942 .eraseblocks = { {16 * 1024 * 1024, 1} }, 22943 .block_erase = SPI_BLOCK_ERASE_C7, 22944 } 22945 }, 22946 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 22947 .unlock = SPI_DISABLE_BLOCKPROTECT, 22948 .write = SPI_CHIP_WRITE256, 22949 .read = SPI_CHIP_READ, 22950 .voltage = {1650, 1950}, 22951 }, 22952 22953 { 22954 .vendor = "XMC", 22955 .name = "XM25QH256C/XM25QH256D", 22956 .bustype = BUS_SPI, 22957 .manufacture_id = ST_ID, 22958 .model_id = XMC_XM25QH256C, 22959 .total_size = 32768, 22960 .page_size = 256, 22961 /* supports SFDP */ 22962 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 22963 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN | 22964 FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ | 22965 FEATURE_4BA_WRITE | FEATURE_WRSR2, 22966 .tested = TEST_OK_PREW, 22967 .probe = PROBE_SPI_RDID, 22968 .probe_timing = TIMING_ZERO, 22969 .block_erasers = 22970 { 22971 { 22972 .eraseblocks = { {4 * 1024, 8192} }, 22973 .block_erase = SPI_BLOCK_ERASE_20, 22974 }, { 22975 .eraseblocks = { {32 * 1024, 1024} }, 22976 .block_erase = SPI_BLOCK_ERASE_52, 22977 }, { 22978 .eraseblocks = { {64 * 1024, 512} }, 22979 .block_erase = SPI_BLOCK_ERASE_D8, 22980 }, { 22981 .eraseblocks = { {32 * 1024 * 1024, 1} }, 22982 .block_erase = SPI_BLOCK_ERASE_60, 22983 }, { 22984 .eraseblocks = { {32 * 1024 * 1024, 1} }, 22985 .block_erase = SPI_BLOCK_ERASE_C7, 22986 } 22987 }, 22988 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 22989 .unlock = SPI_DISABLE_BLOCKPROTECT, 22990 .write = SPI_CHIP_WRITE256, 22991 .read = SPI_CHIP_READ, 22992 .voltage = {2700, 3600}, 22993 .reg_bits = 22994 { 22995 .srp = {STATUS1, 7, RW}, 22996 .srl = {STATUS2, 0, RW}, 22997 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}}, 22998 .tb = {STATUS1, 6, RW}, 22999 }, 23000 .decode_range = DECODE_RANGE_SPI25, 23001 }, 23002 23003 { 23004 .vendor = "XMC", 23005 .name = "XM25QU256C/XM25QU256D", 23006 .bustype = BUS_SPI, 23007 .manufacture_id = ST_ID, 23008 .model_id = XMC_XM25QU256C, 23009 .total_size = 32768, 23010 .page_size = 256, 23011 /* supports SFDP */ 23012 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 23013 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN 23014 | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ 23015 | FEATURE_4BA_WRITE, 23016 .tested = TEST_OK_PREW, 23017 .probe = PROBE_SPI_RDID, 23018 .probe_timing = TIMING_ZERO, 23019 .block_erasers = 23020 { 23021 { 23022 .eraseblocks = { {4 * 1024, 8192} }, 23023 .block_erase = SPI_BLOCK_ERASE_20, 23024 }, { 23025 .eraseblocks = { {32 * 1024, 1024} }, 23026 .block_erase = SPI_BLOCK_ERASE_52, 23027 }, { 23028 .eraseblocks = { {64 * 1024, 512} }, 23029 .block_erase = SPI_BLOCK_ERASE_D8, 23030 }, { 23031 .eraseblocks = { {32 * 1024 * 1024, 1} }, 23032 .block_erase = SPI_BLOCK_ERASE_60, 23033 }, { 23034 .eraseblocks = { {32 * 1024 * 1024, 1} }, 23035 .block_erase = SPI_BLOCK_ERASE_C7, 23036 } 23037 }, 23038 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23039 .unlock = SPI_DISABLE_BLOCKPROTECT, 23040 .write = SPI_CHIP_WRITE256, 23041 .read = SPI_CHIP_READ, 23042 .voltage = {1650, 1950}, 23043 }, 23044 23045 { 23046 .vendor = "XMC", 23047 .name = "XM25RU256C", 23048 .bustype = BUS_SPI, 23049 .manufacture_id = ST_ID, 23050 .model_id = XMC_XM25RU256C, 23051 .total_size = 32768, 23052 .page_size = 256, 23053 /* supports SFDP */ 23054 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 23055 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN | 23056 FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ | 23057 FEATURE_4BA_WRITE, 23058 .tested = TEST_OK_PREW, 23059 .probe = PROBE_SPI_RDID, 23060 .probe_timing = TIMING_ZERO, 23061 .block_erasers = 23062 { 23063 { 23064 .eraseblocks = { {4 * 1024, 8192} }, 23065 .block_erase = SPI_BLOCK_ERASE_20, 23066 }, { 23067 .eraseblocks = { {32 * 1024, 1024} }, 23068 .block_erase = SPI_BLOCK_ERASE_52, 23069 }, { 23070 .eraseblocks = { {64 * 1024, 512} }, 23071 .block_erase = SPI_BLOCK_ERASE_D8, 23072 }, { 23073 .eraseblocks = { {32 * 1024 * 1024, 1} }, 23074 .block_erase = SPI_BLOCK_ERASE_60, 23075 }, { 23076 .eraseblocks = { {32 * 1024 * 1024, 1} }, 23077 .block_erase = SPI_BLOCK_ERASE_C7, 23078 } 23079 }, 23080 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23081 .unlock = SPI_DISABLE_BLOCKPROTECT, 23082 .write = SPI_CHIP_WRITE256, 23083 .read = SPI_CHIP_READ, 23084 .voltage = {1650, 1950}, 23085 }, 23086 23087 { 23088 .vendor = "XMC", 23089 .name = "XM25QH512C/XM25QH512D", 23090 .bustype = BUS_SPI, 23091 .manufacture_id = ST_ID, 23092 .model_id = XMC_XM25QH512C, 23093 .total_size = 64 * 1024, 23094 .page_size = 256, 23095 /* supports SFDP */ 23096 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 23097 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 23098 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN 23099 | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ, 23100 .tested = TEST_OK_PREW, 23101 .probe = PROBE_SPI_RDID, 23102 .probe_timing = TIMING_ZERO, 23103 .block_erasers = 23104 { 23105 { 23106 .eraseblocks = { {4 * 1024, 16384} }, 23107 .block_erase = SPI_BLOCK_ERASE_21, 23108 }, { 23109 .eraseblocks = { {4 * 1024, 16384} }, 23110 .block_erase = SPI_BLOCK_ERASE_20, 23111 }, { 23112 .eraseblocks = { {32 * 1024, 2048} }, 23113 .block_erase = SPI_BLOCK_ERASE_52, 23114 }, { 23115 .eraseblocks = { {64 * 1024, 1024} }, 23116 .block_erase = SPI_BLOCK_ERASE_DC, 23117 }, { 23118 .eraseblocks = { {64 * 1024, 1024} }, 23119 .block_erase = SPI_BLOCK_ERASE_D8, 23120 }, { 23121 .eraseblocks = { {64 * 1024 * 1024, 1} }, 23122 .block_erase = SPI_BLOCK_ERASE_60, 23123 }, { 23124 .eraseblocks = { {64 * 1024 * 1024, 1} }, 23125 .block_erase = SPI_BLOCK_ERASE_C7, 23126 } 23127 }, 23128 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23129 .unlock = SPI_DISABLE_BLOCKPROTECT, 23130 .write = SPI_CHIP_WRITE256, 23131 .read = SPI_CHIP_READ, 23132 .voltage = {2700, 3600}, 23133 }, 23134 23135 { 23136 .vendor = "XMC", 23137 .name = "XM25QU512C/XM25QU512D", 23138 .bustype = BUS_SPI, 23139 .manufacture_id = ST_ID, 23140 .model_id = XMC_XM25QU512C, 23141 .total_size = 64 * 1024, 23142 .page_size = 256, 23143 /* supports SFDP */ 23144 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */ 23145 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */ 23146 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN 23147 | FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ, 23148 .tested = TEST_OK_PREW, 23149 .probe = PROBE_SPI_RDID, 23150 .probe_timing = TIMING_ZERO, 23151 .block_erasers = 23152 { 23153 { 23154 .eraseblocks = { {4 * 1024, 16384} }, 23155 .block_erase = SPI_BLOCK_ERASE_21, 23156 }, { 23157 .eraseblocks = { {4 * 1024, 16384} }, 23158 .block_erase = SPI_BLOCK_ERASE_20, 23159 }, { 23160 .eraseblocks = { {32 * 1024, 2048} }, 23161 .block_erase = SPI_BLOCK_ERASE_52, 23162 }, { 23163 .eraseblocks = { {64 * 1024, 1024} }, 23164 .block_erase = SPI_BLOCK_ERASE_DC, 23165 }, { 23166 .eraseblocks = { {64 * 1024, 1024} }, 23167 .block_erase = SPI_BLOCK_ERASE_D8, 23168 }, { 23169 .eraseblocks = { {64 * 1024 * 1024, 1} }, 23170 .block_erase = SPI_BLOCK_ERASE_60, 23171 }, { 23172 .eraseblocks = { {64 * 1024 * 1024, 1} }, 23173 .block_erase = SPI_BLOCK_ERASE_C7, 23174 } 23175 }, 23176 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23177 .unlock = SPI_DISABLE_BLOCKPROTECT, 23178 .write = SPI_CHIP_WRITE256, 23179 .read = SPI_CHIP_READ, 23180 .voltage = {1650, 1950}, 23181 }, 23182 23183 { 23184 .vendor = "XTX Technology Limited", 23185 .name = "XT25F02E", 23186 .bustype = BUS_SPI, 23187 .manufacture_id = XTX_ID, 23188 .model_id = XTX_XT25F02E, 23189 .total_size = 256, 23190 .page_size = 256, 23191 .feature_bits = FEATURE_WRSR_WREN, 23192 .tested = TEST_OK_PREW, 23193 .probe = PROBE_SPI_RDID, 23194 .probe_timing = TIMING_ZERO, 23195 .block_erasers = 23196 { 23197 { 23198 .eraseblocks = { {4 * 1024, 64} }, 23199 .block_erase = SPI_BLOCK_ERASE_20, 23200 }, { 23201 .eraseblocks = { {64 * 1024, 4} }, 23202 .block_erase = SPI_BLOCK_ERASE_D8, 23203 }, { 23204 .eraseblocks = { {256 * 1024, 1} }, 23205 .block_erase = SPI_BLOCK_ERASE_60, 23206 }, { 23207 .eraseblocks = { {256 * 1024, 1} }, 23208 .block_erase = SPI_BLOCK_ERASE_C7, 23209 } 23210 }, 23211 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP1_SRWD, 23212 .unlock = SPI_DISABLE_BLOCKPROTECT_BP1_SRWD, 23213 .write = SPI_CHIP_WRITE256, 23214 .read = SPI_CHIP_READ, 23215 .voltage = {2700, 3600}, 23216 }, 23217 23218 { 23219 .vendor = "XTX Technology Limited", 23220 .name = "XT25F64B", 23221 .bustype = BUS_SPI, 23222 .manufacture_id = XTX_ID, 23223 .model_id = XTX_XT25F64B, 23224 .total_size = 8 * 1024, 23225 .page_size = 256, 23226 /* Supports SFDP */ 23227 /* OTP: 4 x 256 bytes */ 23228 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 23229 .tested = TEST_OK_PREW, 23230 .probe = PROBE_SPI_RDID, 23231 .probe_timing = TIMING_ZERO, 23232 .block_erasers = 23233 { 23234 { 23235 .eraseblocks = { {4 * 1024, 2048} }, 23236 .block_erase = SPI_BLOCK_ERASE_20, 23237 }, { 23238 .eraseblocks = { {32 * 1024, 256} }, 23239 .block_erase = SPI_BLOCK_ERASE_52, 23240 }, { 23241 .eraseblocks = { {64 * 1024, 128} }, 23242 .block_erase = SPI_BLOCK_ERASE_D8, 23243 }, { 23244 .eraseblocks = { {8 * 1024 * 1024, 1} }, 23245 .block_erase = SPI_BLOCK_ERASE_60, 23246 }, { 23247 .eraseblocks = { {8 * 1024 * 1024, 1} }, 23248 .block_erase = SPI_BLOCK_ERASE_C7, 23249 } 23250 }, 23251 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 23252 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 23253 .write = SPI_CHIP_WRITE256, 23254 .read = SPI_CHIP_READ, 23255 .voltage = {2700, 3600}, 23256 }, 23257 23258 { 23259 .vendor = "XTX Technology Limited", 23260 .name = "XT25F128B", 23261 .bustype = BUS_SPI, 23262 .manufacture_id = XTX_ID, 23263 .model_id = XTX_XT25F128B, 23264 .total_size = 16 * 1024, 23265 .page_size = 256, 23266 /* Supports SFDP */ 23267 /* OTP: 4 x 256 bytes */ 23268 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI, 23269 .tested = TEST_OK_PREW, 23270 .probe = PROBE_SPI_RDID, 23271 .probe_timing = TIMING_ZERO, 23272 .block_erasers = 23273 { 23274 { 23275 .eraseblocks = { {4 * 1024, 4096} }, 23276 .block_erase = SPI_BLOCK_ERASE_20, 23277 }, { 23278 .eraseblocks = { {32 * 1024, 512} }, 23279 .block_erase = SPI_BLOCK_ERASE_52, 23280 }, { 23281 .eraseblocks = { {64 * 1024, 256} }, 23282 .block_erase = SPI_BLOCK_ERASE_D8, 23283 }, { 23284 .eraseblocks = { {16 * 1024 * 1024, 1} }, 23285 .block_erase = SPI_BLOCK_ERASE_60, 23286 }, { 23287 .eraseblocks = { {16 * 1024 * 1024, 1} }, 23288 .block_erase = SPI_BLOCK_ERASE_C7, 23289 } 23290 }, 23291 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_BP4_SRWD, 23292 .unlock = SPI_DISABLE_BLOCKPROTECT_BP4_SRWD, 23293 .write = SPI_CHIP_WRITE256, 23294 .read = SPI_CHIP_READ, 23295 .voltage = {2700, 3600}, 23296 }, 23297 23298 { 23299 .vendor = "Zetta Device", 23300 .name = "ZD25D20", 23301 .bustype = BUS_SPI, 23302 .manufacture_id = ZETTA_ID, 23303 .model_id = ZETTA_ZD25D20, 23304 .total_size = 256, 23305 .page_size = 256, 23306 .feature_bits = FEATURE_WRSR_WREN, 23307 .tested = TEST_UNTESTED, 23308 .probe = PROBE_SPI_RDID, 23309 .probe_timing = TIMING_ZERO, 23310 .block_erasers = 23311 { 23312 { 23313 .eraseblocks = { {4 * 1024, 64} }, 23314 .block_erase = SPI_BLOCK_ERASE_20, 23315 }, { 23316 .eraseblocks = { {32 * 1024, 8} }, 23317 .block_erase = SPI_BLOCK_ERASE_52, 23318 }, { 23319 .eraseblocks = { {64 * 1024, 4} }, 23320 .block_erase = SPI_BLOCK_ERASE_D8, 23321 }, { 23322 .eraseblocks = { {256 * 1024, 1} }, 23323 .block_erase = SPI_BLOCK_ERASE_60, 23324 }, { 23325 .eraseblocks = { {256 * 1024, 1} }, 23326 .block_erase = SPI_BLOCK_ERASE_C7, 23327 } 23328 }, 23329 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23330 .unlock = SPI_DISABLE_BLOCKPROTECT, 23331 .write = SPI_CHIP_WRITE256, 23332 .read = SPI_CHIP_READ, 23333 .voltage = {2700, 3600}, 23334 }, 23335 23336 { 23337 .vendor = "Zetta Device", 23338 .name = "ZD25D40", 23339 .bustype = BUS_SPI, 23340 .manufacture_id = ZETTA_ID, 23341 .model_id = ZETTA_ZD25D40, 23342 .total_size = 512, 23343 .page_size = 256, 23344 .feature_bits = FEATURE_WRSR_WREN, 23345 .tested = TEST_UNTESTED, 23346 .probe = PROBE_SPI_RDID, 23347 .probe_timing = TIMING_ZERO, 23348 .block_erasers = 23349 { 23350 { 23351 .eraseblocks = { {4 * 1024, 128} }, 23352 .block_erase = SPI_BLOCK_ERASE_20, 23353 }, { 23354 .eraseblocks = { {32 * 1024, 16} }, 23355 .block_erase = SPI_BLOCK_ERASE_52, 23356 }, { 23357 .eraseblocks = { {64 * 1024, 8} }, 23358 .block_erase = SPI_BLOCK_ERASE_D8, 23359 }, { 23360 .eraseblocks = { {512 * 1024, 1} }, 23361 .block_erase = SPI_BLOCK_ERASE_60, 23362 }, { 23363 .eraseblocks = { {512 * 1024, 1} }, 23364 .block_erase = SPI_BLOCK_ERASE_C7, 23365 } 23366 }, 23367 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23368 .unlock = SPI_DISABLE_BLOCKPROTECT, 23369 .write = SPI_CHIP_WRITE256, 23370 .read = SPI_CHIP_READ, 23371 .voltage = {2700, 3600}, 23372 }, 23373 23374 { 23375 .vendor = "Zetta Device", 23376 .name = "ZD25LQ128", 23377 .bustype = BUS_SPI, 23378 .manufacture_id = ZETTA_ID, 23379 .model_id = ZETTA_ZD25LQ128_REMS, 23380 .total_size = 16384, 23381 .page_size = 256, 23382 .feature_bits = FEATURE_WRSR_WREN, 23383 .tested = TEST_OK_PREW, 23384 .probe = PROBE_SPI_REMS, 23385 .probe_timing = TIMING_ZERO, 23386 .block_erasers = 23387 { 23388 { 23389 .eraseblocks = { {4 * 1024, 4096} }, 23390 .block_erase = SPI_BLOCK_ERASE_20, 23391 }, { 23392 .eraseblocks = { {32 * 1024, 512} }, 23393 .block_erase = SPI_BLOCK_ERASE_52, 23394 }, { 23395 .eraseblocks = { {64 * 1024, 256} }, 23396 .block_erase = SPI_BLOCK_ERASE_D8, 23397 }, { 23398 .eraseblocks = { {16 * 1024 * 1024, 1} }, 23399 .block_erase = SPI_BLOCK_ERASE_60, 23400 }, { 23401 .eraseblocks = { {16 * 1024 * 1024, 1} }, 23402 .block_erase = SPI_BLOCK_ERASE_C7, 23403 } 23404 }, 23405 .printlock = SPI_PRETTYPRINT_STATUS_REGISTER_PLAIN, /* TODO: improve */ 23406 .unlock = SPI_DISABLE_BLOCKPROTECT, 23407 .write = SPI_CHIP_WRITE256, 23408 .read = SPI_CHIP_READ, 23409 .voltage = {1650, 1950}, 23410 }, 23411 23412 { 23413 .vendor = "Unknown", 23414 .name = "SFDP-capable chip", 23415 .bustype = BUS_SPI, 23416 .manufacture_id = GENERIC_MANUF_ID, 23417 .model_id = SFDP_DEVICE_ID, 23418 .total_size = 0, /* set by probing function */ 23419 .page_size = 0, /* set by probing function */ 23420 .feature_bits = 0, /* set by probing function */ 23421 /* We present our own "report this" text hence we do not */ 23422 /* want the default "This flash part has status UNTESTED..." */ 23423 /* text to be printed. */ 23424 .tested = TEST_OK_PREW, 23425 .probe = PROBE_SPI_SFDP, 23426 .block_erasers = {}, /* set by probing function */ 23427 .unlock = SPI_DISABLE_BLOCKPROTECT, /* is this safe? */ 23428 .write = 0, /* set by probing function */ 23429 .read = SPI_CHIP_READ, 23430 /* FIXME: some vendor extensions define this */ 23431 .voltage = {0}, 23432 }, 23433 23434 { 23435 .vendor = "Programmer", 23436 .name = "Opaque flash chip", 23437 .bustype = BUS_PROG, 23438 .manufacture_id = PROGMANUF_ID, 23439 .model_id = PROGDEV_ID, 23440 .total_size = 0, 23441 .page_size = 256, 23442 /* probe is assumed to work, rest will be filled in by probe */ 23443 .tested = TEST_OK_PROBE, 23444 .probe = PROBE_OPAQUE, 23445 /* eraseblock sizes will be set by the probing function */ 23446 .block_erasers = 23447 { 23448 { 23449 .block_erase = OPAQUE_ERASE, 23450 } 23451 }, 23452 .write = WRITE_OPAQUE, 23453 .read = READ_OPAQUE, 23454 }, 23455 23456 { 23457 .vendor = "AMIC", 23458 .name = "unknown AMIC SPI chip", 23459 .bustype = BUS_SPI, 23460 .manufacture_id = AMIC_ID, 23461 .model_id = GENERIC_DEVICE_ID, 23462 .total_size = 0, 23463 .page_size = 256, 23464 .tested = TEST_BAD_PREW, 23465 .probe = PROBE_SPI_RDID4, 23466 .probe_timing = TIMING_ZERO, 23467 .write = 0, 23468 .read = 0, 23469 }, 23470 23471 { 23472 .vendor = "Atmel", 23473 .name = "unknown Atmel SPI chip", 23474 .bustype = BUS_SPI, 23475 .manufacture_id = ATMEL_ID, 23476 .model_id = GENERIC_DEVICE_ID, 23477 .total_size = 0, 23478 .page_size = 256, 23479 .tested = TEST_BAD_PREW, 23480 .probe = PROBE_SPI_RDID, 23481 .probe_timing = TIMING_ZERO, 23482 .write = 0, 23483 .read = 0, 23484 }, 23485 23486 { 23487 .vendor = "Eon", 23488 .name = "unknown Eon SPI chip", 23489 .bustype = BUS_SPI, 23490 .manufacture_id = EON_ID_NOPREFIX, 23491 .model_id = GENERIC_DEVICE_ID, 23492 .total_size = 0, 23493 .page_size = 256, 23494 .tested = TEST_BAD_PREW, 23495 .probe = PROBE_SPI_RDID, 23496 .probe_timing = TIMING_ZERO, 23497 .write = 0, 23498 .read = 0, 23499 }, 23500 23501 { 23502 .vendor = "Macronix", 23503 .name = "unknown Macronix SPI chip", 23504 .bustype = BUS_SPI, 23505 .manufacture_id = MACRONIX_ID, 23506 .model_id = GENERIC_DEVICE_ID, 23507 .total_size = 0, 23508 .page_size = 256, 23509 .tested = TEST_BAD_PREW, 23510 .probe = PROBE_SPI_RDID, 23511 .probe_timing = TIMING_ZERO, 23512 .write = 0, 23513 .read = 0, 23514 }, 23515 23516 { 23517 .vendor = "PMC", 23518 .name = "unknown PMC SPI chip", 23519 .bustype = BUS_SPI, 23520 .manufacture_id = PMC_ID, 23521 .model_id = GENERIC_DEVICE_ID, 23522 .total_size = 0, 23523 .page_size = 256, 23524 .tested = TEST_BAD_PREW, 23525 .probe = PROBE_SPI_RDID, 23526 .probe_timing = TIMING_ZERO, 23527 .write = 0, 23528 .read = 0, 23529 }, 23530 23531 { 23532 .vendor = "SST", 23533 .name = "unknown SST SPI chip", 23534 .bustype = BUS_SPI, 23535 .manufacture_id = SST_ID, 23536 .model_id = GENERIC_DEVICE_ID, 23537 .total_size = 0, 23538 .page_size = 256, 23539 .tested = TEST_BAD_PREW, 23540 .probe = PROBE_SPI_RDID, 23541 .probe_timing = TIMING_ZERO, 23542 .write = 0, 23543 .read = 0, 23544 }, 23545 23546 { 23547 .vendor = "ST", 23548 .name = "unknown ST SPI chip", 23549 .bustype = BUS_SPI, 23550 .manufacture_id = ST_ID, 23551 .model_id = GENERIC_DEVICE_ID, 23552 .total_size = 0, 23553 .page_size = 256, 23554 .tested = TEST_BAD_PREW, 23555 .probe = PROBE_SPI_RDID, 23556 .probe_timing = TIMING_ZERO, 23557 .write = 0, 23558 .read = 0, 23559 }, 23560 23561 { 23562 .vendor = "Sanyo", 23563 .name = "unknown Sanyo SPI chip", 23564 .bustype = BUS_SPI, 23565 .manufacture_id = SANYO_ID, 23566 .model_id = GENERIC_DEVICE_ID, 23567 .total_size = 0, 23568 .page_size = 256, 23569 .tested = TEST_BAD_PREW, 23570 .probe = PROBE_SPI_RDID, 23571 .probe_timing = TIMING_ZERO, 23572 .write = 0, 23573 .read = 0, 23574 }, 23575 23576 { 23577 .vendor = "Winbond", 23578 .name = "unknown Winbond (ex Nexcom) SPI chip", 23579 .bustype = BUS_SPI, 23580 .manufacture_id = WINBOND_NEX_ID, 23581 .model_id = GENERIC_DEVICE_ID, 23582 .total_size = 0, 23583 .page_size = 256, 23584 .tested = TEST_BAD_PREW, 23585 .probe = PROBE_SPI_RDID, 23586 .probe_timing = TIMING_ZERO, 23587 .write = 0, 23588 .read = 0, 23589 }, 23590 23591 { 23592 .vendor = "Generic", 23593 .name = "unknown SPI chip (RDID)", 23594 .bustype = BUS_SPI, 23595 .manufacture_id = GENERIC_MANUF_ID, 23596 .model_id = GENERIC_DEVICE_ID, 23597 .total_size = 0, 23598 .page_size = 256, 23599 .tested = TEST_BAD_PREW, 23600 .probe = PROBE_SPI_RDID, 23601 .write = 0, 23602 }, 23603 23604 { 23605 .vendor = "Generic", 23606 .name = "unknown SPI chip (REMS)", 23607 .bustype = BUS_SPI, 23608 .manufacture_id = GENERIC_MANUF_ID, 23609 .model_id = GENERIC_DEVICE_ID, 23610 .total_size = 0, 23611 .page_size = 256, 23612 .tested = TEST_BAD_PREW, 23613 .probe = PROBE_SPI_REMS, 23614 .write = 0, 23615 }, 23616 23617 {0} 23618 }; 23619 23620 const unsigned int flashchips_size = ARRAY_SIZE(flashchips); 23621