Flashrom

Flashrom Svn Source Tree

Root/trunk/flashchips.c

1/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
6 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
7 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
8 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25#include "flash.h"
26#include "flashchips.h"
27#include "chipdrivers.h"
28
29/**
30 * List of supported flash chips.
31 *
32 * Please keep the list sorted by vendor name and chip name, so that
33 * the output of 'flashrom -L' is alphabetically sorted.
34 */
35const struct flashchip flashchips[] = {
36
37/*
38 * .vendor= Vendor name
39 * .name= Chip name
40 * .bustype= Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id= Manufacturer chip ID
42 * .model_id= Model chip ID
43 * .total_size= Total size in (binary) kbytes
44 * .page_size= Page or eraseblock(?) size in bytes
45 * .tested= Test status
46 * .probe= Probe function
47 * .probe_timing= Probe function delay
48 * .block_erasers[]= Array of erase layouts and erase functions
49 * {
50 *.eraseblocks[]= Array of { blocksize, blockcount }
51 *.block_erase= Block erase function
52 * }
53 * .printlock= Chip lock status function
54 * .unlock= Chip unlock function
55 * .write= Chip write function
56 * .read= Chip read function
57 * .voltage= Voltage range in millivolt
58 */
59
60{
61.vendor= "AMD",
62.name= "Am29F010A/B",
63.bustype= BUS_PARALLEL,
64.manufacture_id= AMD_ID,
65.model_id= AMD_AM29F010B,/* Same as Am29F010A */
66.total_size= 128,
67.page_size= 16 * 1024,
68.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
69.tested= TEST_OK_PRE,
70.probe= probe_jedec,
71.probe_timing= TIMING_ZERO,
72.block_erasers=
73{
74{
75.eraseblocks = { {16 * 1024, 8} },
76.block_erase = erase_sector_jedec,
77}, {
78.eraseblocks = { {128 * 1024, 1} },
79.block_erase = erase_chip_block_jedec,
80},
81},
82.write= write_jedec_1,
83.read= read_memmapped,
84.voltage= {4500, 5500},
85},
86
87{
88.vendor= "AMD",
89.name= "Am29F002(N)BB",
90.bustype= BUS_PARALLEL,
91.manufacture_id= AMD_ID,
92.model_id= AMD_AM29F002BB,
93.total_size= 256,
94.page_size= 256,
95.feature_bits= FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
96.tested= TEST_UNTESTED,
97.probe= probe_jedec,
98.probe_timing= TIMING_ZERO,
99.block_erasers=
100{
101{
102.eraseblocks = {
103{16 * 1024, 1},
104{8 * 1024, 2},
105{32 * 1024, 1},
106{64 * 1024, 3},
107},
108.block_erase = erase_sector_jedec,
109}, {
110.eraseblocks = { {256 * 1024, 1} },
111.block_erase = erase_chip_block_jedec,
112},
113},
114.write= write_jedec_1,
115.read= read_memmapped,
116.voltage= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
117},
118
119{
120.vendor= "AMD",
121.name= "Am29F002(N)BT",
122.bustype= BUS_PARALLEL,
123.manufacture_id= AMD_ID,
124.model_id= AMD_AM29F002BT,
125.total_size= 256,
126.page_size= 256,
127.feature_bits= FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128.tested= TEST_UNTESTED,
129.probe= probe_jedec,
130.probe_timing= TIMING_ZERO,
131.block_erasers=
132{
133{
134.eraseblocks = {
135{64 * 1024, 3},
136{32 * 1024, 1},
137{8 * 1024, 2},
138{16 * 1024, 1},
139},
140.block_erase = erase_sector_jedec,
141}, {
142.eraseblocks = { {256 * 1024, 1} },
143.block_erase = erase_chip_block_jedec,
144},
145},
146.write= write_jedec_1,
147.read= read_memmapped,
148.voltage= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
149},
150
151{
152.vendor= "AMD",
153.name= "Am29F016D",
154.bustype= BUS_PARALLEL,
155.manufacture_id= AMD_ID,
156.model_id= AMD_AM29F016D,
157.total_size= 2 * 1024,
158.page_size= 64 * 1024,
159.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
160.tested= TEST_UNTESTED,
161.probe= probe_jedec,
162.probe_timing= TIMING_ZERO,
163.block_erasers=
164{
165{
166.eraseblocks = { {64 * 1024, 32} },
167.block_erase = erase_sector_jedec,
168}, {
169.eraseblocks = { {2048 * 1024, 1} },
170.block_erase = erase_chip_block_jedec,
171},
172},
173.write= write_jedec_1,
174.read= read_memmapped,
175.voltage= {4500, 5500},
176},
177
178{
179.vendor= "AMD",
180.name= "Am29F040B",
181.bustype= BUS_PARALLEL,
182.manufacture_id= AMD_ID,
183.model_id= AMD_AM29F040B,
184.total_size= 512,
185.page_size= 64 * 1024,
186.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187.tested= TEST_UNTESTED,
188.probe= probe_jedec,
189.probe_timing= TIMING_ZERO,
190.block_erasers=
191{
192{
193.eraseblocks = { {64 * 1024, 8} },
194.block_erase = erase_sector_jedec,
195}, {
196.eraseblocks = { {512 * 1024, 1} },
197.block_erase = erase_chip_block_jedec,
198},
199},
200.write= write_jedec_1,
201.read= read_memmapped,
202.voltage= {4500, 5500},
203},
204
205{
206.vendor= "AMD",
207.name= "Am29F080B",
208.bustype= BUS_PARALLEL,
209.manufacture_id= AMD_ID,
210.model_id= AMD_AM29F080B,
211.total_size= 1024,
212.page_size= 64 * 1024,
213.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
214.tested= TEST_UNTESTED,
215.probe= probe_jedec,
216.probe_timing= TIMING_ZERO,
217.block_erasers=
218{
219{
220.eraseblocks = { {64 * 1024, 16} },
221.block_erase = erase_sector_jedec,
222}, {
223.eraseblocks = { {1024 * 1024, 1} },
224.block_erase = erase_chip_block_jedec,
225},
226},
227.write= write_jedec_1,
228.read= read_memmapped,
229.voltage= {4500, 5500},
230},
231
232{
233.vendor= "AMD",
234.name= "Am29LV001BB",
235.bustype= BUS_PARALLEL,
236.manufacture_id= AMD_ID,
237.model_id= AMD_AM29LV001BB,
238.total_size= 128,
239.page_size= 64 * 1024, /* unused */
240.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241.tested= TEST_OK_PREW,
242.probe= probe_jedec,
243.probe_timing= TIMING_ZERO,
244.block_erasers=
245{
246{
247.eraseblocks = {
248{8 * 1024, 1},
249{4 * 1024, 2},
250{16 * 1024, 7},
251},
252.block_erase = erase_sector_jedec,
253}, {
254.eraseblocks = { {128 * 1024, 1} },
255.block_erase = erase_chip_block_jedec,
256},
257},
258.write= write_jedec_1,
259.read= read_memmapped,
260.voltage= {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
261},
262
263{
264.vendor= "AMD",
265.name= "Am29LV001BT",
266.bustype= BUS_PARALLEL,
267.manufacture_id= AMD_ID,
268.model_id= AMD_AM29LV001BT,
269.total_size= 128,
270.page_size= 64 * 1024, /* unused */
271.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272.tested= TEST_UNTESTED,
273.probe= probe_jedec,
274.probe_timing= TIMING_ZERO,
275.block_erasers=
276{
277{
278.eraseblocks = {
279{16 * 1024, 7},
280{4 * 1024, 2},
281{8 * 1024, 1},
282},
283.block_erase = erase_sector_jedec,
284}, {
285.eraseblocks = { {128 * 1024, 1} },
286.block_erase = erase_chip_block_jedec,
287},
288},
289.write= write_jedec_1,
290.read= read_memmapped,
291.voltage= {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
292},
293
294{
295.vendor= "AMD",
296.name= "Am29LV002BB",
297.bustype= BUS_PARALLEL,
298.manufacture_id= AMD_ID,
299.model_id= AMD_AM29LV002BB,
300.total_size= 256,
301.page_size= 64 * 1024, /* unused */
302.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303.tested= TEST_UNTESTED,
304.probe= probe_jedec,
305.probe_timing= TIMING_ZERO,
306.block_erasers=
307{
308{
309.eraseblocks = {
310{16 * 1024, 1},
311{8 * 1024, 2},
312{32 * 1024, 1},
313{64 * 1024, 3},
314},
315.block_erase = erase_sector_jedec,
316}, {
317.eraseblocks = { {256 * 1024, 1} },
318.block_erase = erase_chip_block_jedec,
319},
320},
321.write= write_jedec_1,
322.read= read_memmapped,
323.voltage= {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
324},
325
326{
327.vendor= "AMD",
328.name= "Am29LV002BT",
329.bustype= BUS_PARALLEL,
330.manufacture_id= AMD_ID,
331.model_id= AMD_AM29LV002BT,
332.total_size= 256,
333.page_size= 64 * 1024, /* unused */
334.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335.tested= TEST_UNTESTED,
336.probe= probe_jedec,
337.probe_timing= TIMING_ZERO,
338.block_erasers=
339{
340{
341.eraseblocks = {
342{64 * 1024, 3},
343{32 * 1024, 1},
344{8 * 1024, 2},
345{16 * 1024, 1},
346},
347.block_erase = erase_sector_jedec,
348}, {
349.eraseblocks = { {256 * 1024, 1} },
350.block_erase = erase_chip_block_jedec,
351},
352},
353.write= write_jedec_1,
354.read= read_memmapped,
355.voltage= {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
356},
357
358{
359.vendor= "AMD",
360.name= "Am29LV004BB",
361.bustype= BUS_PARALLEL,
362.manufacture_id= AMD_ID,
363.model_id= AMD_AM29LV004BB,
364.total_size= 512,
365.page_size= 64 * 1024, /* unused */
366.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367.tested= TEST_UNTESTED,
368.probe= probe_jedec,
369.probe_timing= TIMING_ZERO,
370.block_erasers=
371{
372{
373.eraseblocks = {
374{16 * 1024, 1},
375{8 * 1024, 2},
376{32 * 1024, 1},
377{64 * 1024, 7},
378},
379.block_erase = erase_sector_jedec,
380}, {
381.eraseblocks = { {512 * 1024, 1} },
382.block_erase = erase_chip_block_jedec,
383},
384},
385.write= write_jedec_1,
386.read= read_memmapped,
387.voltage= {2700, 3600},
388},
389
390{
391.vendor= "AMD",
392.name= "Am29LV004BT",
393.bustype= BUS_PARALLEL,
394.manufacture_id= AMD_ID,
395.model_id= AMD_AM29LV004BT,
396.total_size= 512,
397.page_size= 64 * 1024, /* unused */
398.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399.tested= TEST_UNTESTED,
400.probe= probe_jedec,
401.probe_timing= TIMING_ZERO,
402.block_erasers=
403{
404{
405.eraseblocks = {
406{64 * 1024, 7},
407{32 * 1024, 1},
408{8 * 1024, 2},
409{16 * 1024, 1},
410},
411.block_erase = erase_sector_jedec,
412}, {
413.eraseblocks = { {512 * 1024, 1} },
414.block_erase = erase_chip_block_jedec,
415},
416},
417.write= write_jedec_1,
418.read= read_memmapped,
419.voltage= {2700, 3600},
420},
421
422{
423.vendor= "AMD",
424.name= "Am29LV008BB",
425.bustype= BUS_PARALLEL,
426.manufacture_id= AMD_ID,
427.model_id= AMD_AM29LV008BB,
428.total_size= 1024,
429.page_size= 64 * 1024, /* unused */
430.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
431.tested= TEST_OK_PREW,
432.probe= probe_jedec,
433.probe_timing= TIMING_ZERO,
434.block_erasers=
435{
436{
437.eraseblocks = {
438{16 * 1024, 1},
439{8 * 1024, 2},
440{32 * 1024, 1},
441{64 * 1024, 15},
442},
443.block_erase = erase_sector_jedec,
444}, {
445.eraseblocks = { {1024 * 1024, 1} },
446.block_erase = erase_chip_block_jedec,
447},
448},
449.write= write_jedec_1,
450.read= read_memmapped,
451.voltage= {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
452},
453
454{
455.vendor= "AMD",
456.name= "Am29LV008BT",
457.bustype= BUS_PARALLEL,
458.manufacture_id= AMD_ID,
459.model_id= AMD_AM29LV008BT,
460.total_size= 1024,
461.page_size= 64 * 1024, /* unused */
462.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463.tested= TEST_UNTESTED,
464.probe= probe_jedec,
465.probe_timing= TIMING_ZERO,
466.block_erasers=
467{
468{
469.eraseblocks = {
470{64 * 1024, 15},
471{32 * 1024, 1},
472{8 * 1024, 2},
473{16 * 1024, 1},
474},
475.block_erase = erase_sector_jedec,
476}, {
477.eraseblocks = { {1024 * 1024, 1} },
478.block_erase = erase_chip_block_jedec,
479},
480},
481.write= write_jedec_1,
482.read= read_memmapped,
483.voltage= {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
484},
485
486{
487.vendor= "AMD",
488.name= "Am29LV040B",
489.bustype= BUS_PARALLEL,
490.manufacture_id= AMD_ID,
491.model_id= AMD_AM29LV040B,
492.total_size= 512,
493.page_size= 64 * 1024,
494.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
495.tested= TEST_OK_PRE,
496.probe= probe_jedec,
497.probe_timing= TIMING_ZERO,
498.block_erasers=
499{
500{
501.eraseblocks = { {64 * 1024, 8} },
502.block_erase = erase_sector_jedec,
503}, {
504.eraseblocks = { {512 * 1024, 1} },
505.block_erase = erase_chip_block_jedec,
506},
507},
508.write= write_jedec_1,
509.read= read_memmapped,
510.voltage= {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
511},
512
513{
514.vendor= "AMD",
515.name= "Am29LV081B",
516.bustype= BUS_PARALLEL,
517.manufacture_id= AMD_ID,
518.model_id= AMD_AM29LV080B,
519.total_size= 1024,
520.page_size= 64 * 1024,
521.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
522.tested= TEST_UNTESTED,
523.probe= probe_jedec,
524.probe_timing= TIMING_ZERO,
525.block_erasers=
526{
527{
528.eraseblocks = { {64 * 1024, 16} },
529.block_erase = erase_sector_jedec,
530}, {
531.eraseblocks = { {1024 * 1024, 1} },
532.block_erase = erase_chip_block_jedec,
533},
534},
535.write= write_jedec_1,
536.read= read_memmapped,
537.voltage= {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
538},
539
540{
541.vendor= "AMIC",
542.name= "A25L05PT",
543.bustype= BUS_SPI,
544.manufacture_id= AMIC_ID,
545.model_id= AMIC_A25L05PT,
546.total_size= 64,
547.page_size= 256,
548.tested= TEST_UNTESTED,
549.probe= probe_spi_rdid4,
550.probe_timing= TIMING_ZERO,
551.block_erasers=
552{
553{
554.eraseblocks = {
555{32 * 1024, 1},
556{16 * 1024, 1},
557{8 * 1024, 1},
558{4 * 1024, 2},
559},
560.block_erase = spi_block_erase_d8,
561}, {
562.eraseblocks = { {64 * 1024, 1} },
563.block_erase = spi_block_erase_c7,
564}
565},
566.printlock= spi_prettyprint_status_register_amic_a25l05p,
567.unlock= spi_disable_blockprotect,
568.write= spi_chip_write_256,
569.read= spi_chip_read,
570.voltage= {2700, 3600},
571},
572
573{
574.vendor= "AMIC",
575.name= "A25L05PU",
576.bustype= BUS_SPI,
577.manufacture_id= AMIC_ID,
578.model_id= AMIC_A25L05PU,
579.total_size= 64,
580.page_size= 256,
581.tested= TEST_UNTESTED,
582.probe= probe_spi_rdid4,
583.probe_timing= TIMING_ZERO,
584.block_erasers=
585{
586{
587.eraseblocks = {
588{4 * 1024, 2},
589{8 * 1024, 1},
590{16 * 1024, 1},
591{32 * 1024, 1},
592},
593.block_erase = spi_block_erase_d8,
594}, {
595.eraseblocks = { {64 * 1024, 1} },
596.block_erase = spi_block_erase_c7,
597}
598},
599.printlock= spi_prettyprint_status_register_amic_a25l05p,
600.unlock= spi_disable_blockprotect,
601.write= spi_chip_write_256,
602.read= spi_chip_read,
603.voltage= {2700, 3600},
604},
605
606{
607.vendor= "AMIC",
608.name= "A25L10PT",
609.bustype= BUS_SPI,
610.manufacture_id= AMIC_ID,
611.model_id= AMIC_A25L10PT,
612.total_size= 128,
613.page_size= 256,
614.tested= TEST_UNTESTED,
615.probe= probe_spi_rdid4,
616.probe_timing= TIMING_ZERO,
617.block_erasers=
618{
619{
620.eraseblocks = {
621{64 * 1024, 1},
622{32 * 1024, 1},
623{16 * 1024, 1},
624{8 * 1024, 1},
625{4 * 1024, 2},
626},
627.block_erase = spi_block_erase_d8,
628}, {
629.eraseblocks = { {128 * 1024, 1} },
630.block_erase = spi_block_erase_c7,
631}
632},
633.printlock= spi_prettyprint_status_register_amic_a25l05p,
634.unlock= spi_disable_blockprotect,
635.write= spi_chip_write_256,
636.read= spi_chip_read,
637.voltage= {2700, 3600},
638},
639
640{
641.vendor= "AMIC",
642.name= "A25L10PU",
643.bustype= BUS_SPI,
644.manufacture_id= AMIC_ID,
645.model_id= AMIC_A25L10PU,
646.total_size= 128,
647.page_size= 256,
648.tested= TEST_UNTESTED,
649.probe= probe_spi_rdid4,
650.probe_timing= TIMING_ZERO,
651.block_erasers=
652{
653{
654.eraseblocks = {
655{4 * 1024, 2},
656{8 * 1024, 1},
657{16 * 1024, 1},
658{32 * 1024, 1},
659{64 * 1024, 1},
660},
661.block_erase = spi_block_erase_d8,
662}, {
663.eraseblocks = { {128 * 1024, 1} },
664.block_erase = spi_block_erase_c7,
665}
666},
667.printlock= spi_prettyprint_status_register_amic_a25l05p,
668.unlock= spi_disable_blockprotect,
669.write= spi_chip_write_256,
670.read= spi_chip_read,
671.voltage= {2700, 3600},
672},
673
674{
675.vendor= "AMIC",
676.name= "A25L20PT",
677.bustype= BUS_SPI,
678.manufacture_id= AMIC_ID,
679.model_id= AMIC_A25L20PT,
680.total_size= 256,
681.page_size= 256,
682.tested= TEST_UNTESTED,
683.probe= probe_spi_rdid4,
684.probe_timing= TIMING_ZERO,
685.block_erasers=
686{
687{
688.eraseblocks = {
689{64 * 1024, 3},
690{32 * 1024, 1},
691{16 * 1024, 1},
692{8 * 1024, 1},
693{4 * 1024, 2},
694},
695.block_erase = spi_block_erase_d8,
696}, {
697.eraseblocks = { {256 * 1024, 1} },
698.block_erase = spi_block_erase_c7,
699}
700},
701.printlock= spi_prettyprint_status_register_amic_a25l05p,
702.unlock= spi_disable_blockprotect,
703.write= spi_chip_write_256,
704.read= spi_chip_read,
705.voltage= {2700, 3600},
706},
707
708{
709.vendor= "AMIC",
710.name= "A25L20PU",
711.bustype= BUS_SPI,
712.manufacture_id= AMIC_ID,
713.model_id= AMIC_A25L20PU,
714.total_size= 256,
715.page_size= 256,
716.tested= TEST_UNTESTED,
717.probe= probe_spi_rdid4,
718.probe_timing= TIMING_ZERO,
719.block_erasers=
720{
721{
722.eraseblocks = {
723{4 * 1024, 2},
724{8 * 1024, 1},
725{16 * 1024, 1},
726{32 * 1024, 1},
727{64 * 1024, 3},
728},
729.block_erase = spi_block_erase_d8,
730}, {
731.eraseblocks = { {256 * 1024, 1} },
732.block_erase = spi_block_erase_c7,
733}
734},
735.printlock= spi_prettyprint_status_register_amic_a25l05p,
736.unlock= spi_disable_blockprotect,
737.write= spi_chip_write_256,
738.read= spi_chip_read,
739.voltage= {2700, 3600},
740},
741
742/* The A25L40P{T,U} chips are distinguished by their
743 * erase block layouts, but without any distinction in RDID.
744 * This inexplicable quirk was verified by Rudolf Marek
745 * and discussed on the flashrom mailing list on 2010-07-12.
746 */
747{
748.vendor= "AMIC",
749.name= "A25L40PT",
750.bustype= BUS_SPI,
751.manufacture_id= AMIC_ID,
752.model_id= AMIC_A25L40PT,
753.total_size= 512,
754.page_size= 256,
755.tested= TEST_OK_PR,
756.probe= probe_spi_rdid4,
757.probe_timing= TIMING_ZERO,
758.block_erasers=
759{
760{
761.eraseblocks = {
762{64 * 1024, 7},
763{32 * 1024, 1},
764{16 * 1024, 1},
765{8 * 1024, 1},
766{4 * 1024, 2},
767},
768.block_erase = spi_block_erase_d8,
769}, {
770.eraseblocks = { {512 * 1024, 1} },
771.block_erase = spi_block_erase_c7,
772}
773},
774.printlock= spi_prettyprint_status_register_amic_a25l40p,
775.unlock= spi_disable_blockprotect,
776.write= spi_chip_write_256,
777.read= spi_chip_read,
778.voltage= {2700, 3600},
779},
780
781{
782.vendor= "AMIC",
783.name= "A25L40PU",
784.bustype= BUS_SPI,
785.manufacture_id= AMIC_ID,
786.model_id= AMIC_A25L40PU,
787.total_size= 512,
788.page_size= 256,
789.tested= TEST_OK_PR,
790.probe= probe_spi_rdid4,
791.probe_timing= TIMING_ZERO,
792.block_erasers=
793{
794{
795.eraseblocks = {
796{4 * 1024, 2},
797{8 * 1024, 1},
798{16 * 1024, 1},
799{32 * 1024, 1},
800{64 * 1024, 7},
801},
802.block_erase = spi_block_erase_d8,
803}, {
804.eraseblocks = { {512 * 1024, 1} },
805.block_erase = spi_block_erase_c7,
806}
807},
808.printlock= spi_prettyprint_status_register_amic_a25l40p,
809.unlock= spi_disable_blockprotect,
810.write= spi_chip_write_256,
811.read= spi_chip_read,
812.voltage= {2700, 3600},
813},
814
815{
816.vendor= "AMIC",
817.name= "A25L80P",
818.bustype= BUS_SPI,
819.manufacture_id= AMIC_ID,
820.model_id= AMIC_A25L80P,
821.total_size= 1024,
822.page_size= 256,
823.tested= TEST_OK_PRE,
824.probe= probe_spi_rdid4,
825.probe_timing= TIMING_ZERO,
826.block_erasers=
827{
828{
829.eraseblocks = {
830{4 * 1024, 2},
831{8 * 1024, 1},
832{16 * 1024, 1},
833{32 * 1024, 1},
834{64 * 1024, 15},
835},
836.block_erase = spi_block_erase_d8,
837}, {
838.eraseblocks = { {1024 * 1024, 1} },
839.block_erase = spi_block_erase_c7,
840}
841},
842.printlock= spi_prettyprint_status_register_amic_a25l40p,
843.unlock= spi_disable_blockprotect,
844.write= spi_chip_write_256,
845.read= spi_chip_read,
846.voltage= {2700, 3600},
847},
848
849{
850.vendor= "AMIC",
851.name= "A25L16PT",
852.bustype= BUS_SPI,
853.manufacture_id= AMIC_ID,
854.model_id= AMIC_A25L16PT,
855.total_size= 2048,
856.page_size= 256,
857.tested= TEST_UNTESTED,
858.probe= probe_spi_rdid4,
859.probe_timing= TIMING_ZERO,
860.block_erasers=
861{
862{
863.eraseblocks = {
864{64 * 1024, 31},
865{32 * 1024, 1},
866{16 * 1024, 1},
867{8 * 1024, 1},
868{4 * 1024, 2},
869},
870.block_erase = spi_block_erase_d8,
871}, {
872.eraseblocks = { {2048 * 1024, 1} },
873.block_erase = spi_block_erase_60,
874}, {
875.eraseblocks = { {2048 * 1024, 1} },
876.block_erase = spi_block_erase_c7,
877}
878},
879.printlock= spi_prettyprint_status_register_amic_a25l40p,
880.unlock= spi_disable_blockprotect,
881.write= spi_chip_write_256,
882.read= spi_chip_read,
883.voltage= {2700, 3600},
884},
885
886{
887.vendor= "AMIC",
888.name= "A25L16PU",
889.bustype= BUS_SPI,
890.manufacture_id= AMIC_ID,
891.model_id= AMIC_A25L16PU,
892.total_size= 2048,
893.page_size= 256,
894.tested= TEST_OK_PR,
895.probe= probe_spi_rdid4,
896.probe_timing= TIMING_ZERO,
897.block_erasers=
898{
899{
900.eraseblocks = {
901{4 * 1024, 2},
902{8 * 1024, 1},
903{16 * 1024, 1},
904{32 * 1024, 1},
905{64 * 1024, 31},
906},
907.block_erase = spi_block_erase_d8,
908}, {
909.eraseblocks = { {2048 * 1024, 1} },
910.block_erase = spi_block_erase_60,
911}, {
912.eraseblocks = { {2048 * 1024, 1} },
913.block_erase = spi_block_erase_c7,
914}
915},
916.printlock= spi_prettyprint_status_register_amic_a25l40p,
917.unlock= spi_disable_blockprotect,
918.write= spi_chip_write_256,
919.read= spi_chip_read,
920.voltage= {2700, 3600},
921},
922
923{
924.vendor= "AMIC",
925.name= "A25L512",
926.bustype= BUS_SPI,
927.manufacture_id= AMIC_ID_NOPREFIX,
928.model_id= AMIC_A25L512,
929.total_size= 64,
930.page_size= 256,
931.feature_bits= FEATURE_WRSR_WREN,
932.tested= TEST_UNTESTED,
933.probe= probe_spi_rdid,
934.probe_timing= TIMING_ZERO,
935.block_erasers=
936{
937{
938.eraseblocks = { { 4 * 1024, 16 } },
939.block_erase = spi_block_erase_20,
940}, {
941.eraseblocks = { { 64 * 1024, 1 } },
942.block_erase = spi_block_erase_d8,
943}, {
944.eraseblocks = { { 64 * 1024, 1 } },
945.block_erase = spi_block_erase_c7,
946}
947},
948.printlock= spi_prettyprint_status_register_amic_a25l40p,
949.unlock= spi_disable_blockprotect,
950.write= spi_chip_write_256,
951.read= spi_chip_read,
952.voltage= {2700, 3600},
953},
954
955{
956.vendor= "AMIC",
957.name= "A25L010",
958.bustype= BUS_SPI,
959.manufacture_id= AMIC_ID_NOPREFIX,
960.model_id= AMIC_A25L010,
961.total_size= 128,
962.page_size= 256,
963.feature_bits= FEATURE_WRSR_WREN,
964.tested= TEST_UNTESTED,
965.probe= probe_spi_rdid,
966.probe_timing= TIMING_ZERO,
967.block_erasers=
968{
969{
970.eraseblocks = { { 4 * 1024, 32 } },
971.block_erase = spi_block_erase_20,
972}, {
973.eraseblocks = { { 64 * 1024, 2 } },
974.block_erase = spi_block_erase_d8,
975}, {
976.eraseblocks = { { 128 * 1024, 1 } },
977.block_erase = spi_block_erase_c7,
978}
979},
980.printlock= spi_prettyprint_status_register_amic_a25l40p,
981.unlock= spi_disable_blockprotect,
982.write= spi_chip_write_256,
983.read= spi_chip_read,
984.voltage= {2700, 3600},
985},
986
987{
988.vendor= "AMIC",
989.name= "A25L020",
990.bustype= BUS_SPI,
991.manufacture_id= AMIC_ID_NOPREFIX,
992.model_id= AMIC_A25L020,
993.total_size= 256,
994.page_size= 256,
995.feature_bits= FEATURE_WRSR_WREN,
996.tested= TEST_UNTESTED,
997.probe= probe_spi_rdid,
998.probe_timing= TIMING_ZERO,
999.block_erasers=
1000{
1001{
1002.eraseblocks = { { 4 * 1024, 64 } },
1003.block_erase = spi_block_erase_20,
1004}, {
1005.eraseblocks = { { 64 * 1024, 4 } },
1006.block_erase = spi_block_erase_d8,
1007}, {
1008.eraseblocks = { { 256 * 1024, 1 } },
1009.block_erase = spi_block_erase_c7,
1010}
1011},
1012.printlock= spi_prettyprint_status_register_amic_a25l40p,
1013.unlock= spi_disable_blockprotect,
1014.write= spi_chip_write_256,
1015.read= spi_chip_read,
1016.voltage= {2700, 3600},
1017},
1018
1019{
1020.vendor= "AMIC",
1021.name= "A25L040",
1022.bustype= BUS_SPI,
1023.manufacture_id= AMIC_ID_NOPREFIX,
1024.model_id= AMIC_A25L040,
1025.total_size= 512,
1026.page_size= 256,
1027.feature_bits= FEATURE_WRSR_WREN,
1028.tested= TEST_UNTESTED,
1029.probe= probe_spi_rdid,
1030.probe_timing= TIMING_ZERO,
1031.block_erasers=
1032{
1033{
1034.eraseblocks = { { 4 * 1024, 128 } },
1035.block_erase = spi_block_erase_20,
1036}, {
1037.eraseblocks = { { 64 * 1024, 8 } },
1038.block_erase = spi_block_erase_d8,
1039}, {
1040.eraseblocks = { { 512 * 1024, 1 } },
1041.block_erase = spi_block_erase_c7,
1042}
1043},
1044.printlock= spi_prettyprint_status_register_amic_a25l40p,
1045.unlock= spi_disable_blockprotect,
1046.write= spi_chip_write_256,
1047.read= spi_chip_read,
1048.voltage= {2700, 3600},
1049},
1050
1051{
1052.vendor= "AMIC",
1053.name= "A25L080",
1054.bustype= BUS_SPI,
1055.manufacture_id= AMIC_ID_NOPREFIX,
1056.model_id= AMIC_A25L080,
1057.total_size= 1024,
1058.page_size= 256,
1059.feature_bits= FEATURE_WRSR_WREN,
1060.tested= TEST_UNTESTED,
1061.probe= probe_spi_rdid,
1062.probe_timing= TIMING_ZERO,
1063.block_erasers=
1064{
1065{
1066.eraseblocks = { { 4 * 1024, 256 } },
1067.block_erase = spi_block_erase_20,
1068}, {
1069.eraseblocks = { { 64 * 1024, 16 } },
1070.block_erase = spi_block_erase_d8,
1071}, {
1072.eraseblocks = { { 1024 * 1024, 1 } },
1073.block_erase = spi_block_erase_c7,
1074}
1075},
1076.printlock= spi_prettyprint_status_register_amic_a25l40p,
1077.unlock= spi_disable_blockprotect,
1078.write= spi_chip_write_256,
1079.read= spi_chip_read,
1080.voltage= {2700, 3600},
1081},
1082
1083{
1084.vendor= "AMIC",
1085.name= "A25L016",
1086.bustype= BUS_SPI,
1087.manufacture_id= AMIC_ID_NOPREFIX,
1088.model_id= AMIC_A25L016,
1089.total_size= 2048,
1090.page_size= 256,
1091.feature_bits= FEATURE_WRSR_WREN,
1092.tested= TEST_UNTESTED,
1093.probe= probe_spi_rdid,
1094.probe_timing= TIMING_ZERO,
1095.block_erasers=
1096{
1097{
1098.eraseblocks = { { 4 * 1024, 512 } },
1099.block_erase = spi_block_erase_20,
1100}, {
1101.eraseblocks = { { 64 * 1024, 32 } },
1102.block_erase = spi_block_erase_d8,
1103}, {
1104.eraseblocks = { { 2048 * 1024, 1 } },
1105.block_erase = spi_block_erase_c7,
1106}
1107},
1108.printlock= spi_prettyprint_status_register_amic_a25l40p,
1109.unlock= spi_disable_blockprotect,
1110.write= spi_chip_write_256,
1111.read= spi_chip_read,
1112.voltage= {2700, 3600},
1113},
1114
1115{
1116.vendor= "AMIC",
1117.name= "A25L032",
1118.bustype= BUS_SPI,
1119.manufacture_id= AMIC_ID_NOPREFIX,
1120.model_id= AMIC_A25L032,
1121.total_size= 4096,
1122.page_size= 256,
1123.feature_bits= FEATURE_WRSR_WREN,
1124.tested= TEST_UNTESTED,
1125.probe= probe_spi_rdid,
1126.probe_timing= TIMING_ZERO,
1127.block_erasers=
1128{
1129{
1130.eraseblocks = { { 4 * 1024, 1024 } },
1131.block_erase = spi_block_erase_20,
1132}, {
1133.eraseblocks = { { 64 * 1024, 64 } },
1134.block_erase = spi_block_erase_52,
1135}, {
1136.eraseblocks = { { 64 * 1024, 64 } },
1137.block_erase = spi_block_erase_d8,
1138}, {
1139.eraseblocks = { { 4096 * 1024, 1 } },
1140.block_erase = spi_block_erase_60,
1141}, {
1142.eraseblocks = { { 4096 * 1024, 1 } },
1143.block_erase = spi_block_erase_c7,
1144}
1145},
1146.printlock= spi_prettyprint_status_register_amic_a25l032,
1147.unlock= NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1148.write= spi_chip_write_256,
1149.read= spi_chip_read,
1150.voltage= {2700, 3600},
1151},
1152
1153{
1154.vendor= "AMIC",
1155.name= "A25LQ032",
1156.bustype= BUS_SPI,
1157.manufacture_id= AMIC_ID_NOPREFIX,
1158.model_id= AMIC_A25LQ032,
1159.total_size= 4096,
1160.page_size= 256,
1161.feature_bits= FEATURE_WRSR_WREN,
1162.tested= TEST_UNTESTED,
1163.probe= probe_spi_rdid,
1164.probe_timing= TIMING_ZERO,
1165.block_erasers=
1166{
1167{
1168.eraseblocks = { { 4 * 1024, 1024 } },
1169.block_erase = spi_block_erase_20,
1170}, {
1171.eraseblocks = { { 64 * 1024, 64 } },
1172.block_erase = spi_block_erase_52,
1173}, {
1174.eraseblocks = { { 64 * 1024, 64 } },
1175.block_erase = spi_block_erase_d8,
1176}, {
1177.eraseblocks = { { 4096 * 1024, 1 } },
1178.block_erase = spi_block_erase_60,
1179}, {
1180.eraseblocks = { { 4096 * 1024, 1 } },
1181.block_erase = spi_block_erase_c7,
1182}
1183},
1184.printlock= spi_prettyprint_status_register_amic_a25lq032,
1185.unlock= NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1186.write= spi_chip_write_256,
1187.read= spi_chip_read,
1188.voltage= {2700, 3600},
1189},
1190
1191{
1192.vendor= "AMIC",
1193.name= "A29002B",
1194.bustype= BUS_PARALLEL,
1195.manufacture_id= AMIC_ID_NOPREFIX,
1196.model_id= AMIC_A29002B,
1197.total_size= 256,
1198.page_size= 64 * 1024,
1199.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1200.tested= TEST_UNTESTED,
1201.probe= probe_jedec,
1202.probe_timing= TIMING_ZERO,
1203.block_erasers=
1204{
1205{
1206.eraseblocks = {
1207{16 * 1024, 1},
1208{8 * 1024, 2},
1209{32 * 1024, 1},
1210{64 * 1024, 3},
1211},
1212.block_erase = erase_sector_jedec,
1213}, {
1214.eraseblocks = { {256 * 1024, 1} },
1215.block_erase = erase_chip_block_jedec,
1216},
1217},
1218.write= write_jedec_1,
1219.read= read_memmapped,
1220.voltage= {4500, 5500},
1221},
1222
1223{
1224.vendor= "AMIC",
1225.name= "A29002T",
1226.bustype= BUS_PARALLEL,
1227.manufacture_id= AMIC_ID_NOPREFIX,
1228.model_id= AMIC_A29002T,
1229.total_size= 256,
1230.page_size= 64 * 1024,
1231.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1232.tested= TEST_OK_PREW,
1233.probe= probe_jedec,
1234.probe_timing= TIMING_ZERO,
1235.block_erasers=
1236{
1237{
1238.eraseblocks = {
1239{64 * 1024, 3},
1240{32 * 1024, 1},
1241{8 * 1024, 2},
1242{16 * 1024, 1},
1243},
1244.block_erase = erase_sector_jedec,
1245}, {
1246.eraseblocks = { {256 * 1024, 1} },
1247.block_erase = erase_chip_block_jedec,
1248},
1249},
1250.write= write_jedec_1,
1251.read= read_memmapped,
1252.voltage= {4500, 5500},
1253},
1254
1255{
1256.vendor= "AMIC",
1257.name= "A29040B",
1258.bustype= BUS_PARALLEL,
1259.manufacture_id= AMIC_ID_NOPREFIX,
1260.model_id= AMIC_A29040B,
1261.total_size= 512,
1262.page_size= 64 * 1024,
1263.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1264.tested= TEST_UNTESTED,
1265.probe= probe_jedec,
1266.probe_timing= TIMING_ZERO,
1267.block_erasers=
1268{
1269{
1270.eraseblocks = { {64 * 1024, 8} },
1271.block_erase = erase_sector_jedec,
1272}, {
1273.eraseblocks = { {512 * 1024, 1} },
1274.block_erase = erase_chip_block_jedec,
1275},
1276},
1277.write= write_jedec_1,
1278.read= read_memmapped,
1279.voltage= {4500, 5500},
1280},
1281
1282{
1283.vendor= "AMIC",
1284.name= "A49LF040A",
1285.bustype= BUS_LPC,
1286.manufacture_id= AMIC_ID_NOPREFIX,
1287.model_id= AMIC_A49LF040A,
1288.total_size= 512,
1289.page_size= 64 * 1024,
1290.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
1291.tested= TEST_OK_PREW,
1292.probe= probe_jedec,
1293.probe_timing= TIMING_ZERO,/* routine is wrapper to probe_jedec (pm49fl00x.c) */
1294.block_erasers=
1295{
1296{
1297.eraseblocks = { {64 * 1024, 8} },
1298.block_erase = erase_block_jedec,
1299}, {
1300.eraseblocks = { {512 * 1024, 1} },
1301.block_erase = erase_chip_block_jedec,
1302}
1303},
1304.unlock= unlock_49fl00x,
1305.write= write_jedec_1,
1306.read= read_memmapped,
1307.voltage= {3000, 3600},
1308},
1309
1310{
1311.vendor= "Atmel",
1312.name= "AT25DF021",
1313.bustype= BUS_SPI,
1314.manufacture_id= ATMEL_ID,
1315.model_id= ATMEL_AT25DF021,
1316.total_size= 256,
1317.page_size= 256,
1318.feature_bits= FEATURE_WRSR_WREN,
1319.tested= TEST_UNTESTED,
1320.probe= probe_spi_rdid,
1321.probe_timing= TIMING_ZERO,
1322.block_erasers=
1323{
1324{
1325.eraseblocks = { {4 * 1024, 64} },
1326.block_erase = spi_block_erase_20,
1327}, {
1328.eraseblocks = { {32 * 1024, 8} },
1329.block_erase = spi_block_erase_52,
1330}, {
1331.eraseblocks = { {64 * 1024, 4} },
1332.block_erase = spi_block_erase_d8,
1333}, {
1334.eraseblocks = { {256 * 1024, 1} },
1335.block_erase = spi_block_erase_60,
1336}, {
1337.eraseblocks = { {256 * 1024, 1} },
1338.block_erase = spi_block_erase_c7,
1339}
1340},
1341.printlock= spi_prettyprint_status_register_at25df,
1342.unlock= spi_disable_blockprotect_at25df,
1343.write= spi_chip_write_256,
1344.read= spi_chip_read,
1345.voltage= {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1346},
1347
1348{
1349.vendor= "Atmel",
1350.name= "AT25DF041A",
1351.bustype= BUS_SPI,
1352.manufacture_id= ATMEL_ID,
1353.model_id= ATMEL_AT25DF041A,
1354.total_size= 512,
1355.page_size= 256,
1356.feature_bits= FEATURE_WRSR_WREN,
1357.tested= TEST_UNTESTED,
1358.probe= probe_spi_rdid,
1359.probe_timing= TIMING_ZERO,
1360.block_erasers=
1361{
1362{
1363.eraseblocks = { {4 * 1024, 128} },
1364.block_erase = spi_block_erase_20,
1365}, {
1366.eraseblocks = { {32 * 1024, 16} },
1367.block_erase = spi_block_erase_52,
1368}, {
1369.eraseblocks = { {64 * 1024, 8} },
1370.block_erase = spi_block_erase_d8,
1371}, {
1372.eraseblocks = { {512 * 1024, 1} },
1373.block_erase = spi_block_erase_60,
1374}, {
1375.eraseblocks = { {512 * 1024, 1} },
1376.block_erase = spi_block_erase_c7,
1377}
1378},
1379.printlock= spi_prettyprint_status_register_at25df,
1380.unlock= spi_disable_blockprotect_at25df,
1381.write= spi_chip_write_256,
1382.read= spi_chip_read,
1383.voltage= {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1384},
1385
1386{
1387.vendor= "Atmel",
1388.name= "AT25DF081",
1389.bustype= BUS_SPI,
1390.manufacture_id= ATMEL_ID,
1391.model_id= ATMEL_AT25DF081,
1392.total_size= 1024,
1393.page_size= 256,
1394.feature_bits= FEATURE_WRSR_WREN,
1395.tested= TEST_UNTESTED,
1396.probe= probe_spi_rdid,
1397.probe_timing= TIMING_ZERO,
1398.block_erasers=
1399{
1400{
1401.eraseblocks = { {4 * 1024, 256} },
1402.block_erase = spi_block_erase_20,
1403}, {
1404.eraseblocks = { {32 * 1024, 32} },
1405.block_erase = spi_block_erase_52,
1406}, {
1407.eraseblocks = { {64 * 1024, 16} },
1408.block_erase = spi_block_erase_d8,
1409}, {
1410.eraseblocks = { {1024 * 1024, 1} },
1411.block_erase = spi_block_erase_60,
1412}, {
1413.eraseblocks = { {1024 * 1024, 1} },
1414.block_erase = spi_block_erase_c7,
1415}
1416},
1417.printlock= spi_prettyprint_status_register_at25df,
1418.unlock= spi_disable_blockprotect_at25df,
1419.write= spi_chip_write_256,
1420.read= spi_chip_read,
1421.voltage= {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
1422},
1423
1424{
1425.vendor= "Atmel",
1426.name= "AT25DF081A",
1427.bustype= BUS_SPI,
1428.manufacture_id= ATMEL_ID,
1429.model_id= ATMEL_AT25DF081A,
1430.total_size= 1024,
1431.page_size= 256,
1432.feature_bits= FEATURE_WRSR_WREN,
1433.tested= TEST_UNTESTED,
1434.probe= probe_spi_rdid,
1435.probe_timing= TIMING_ZERO,
1436.block_erasers=
1437{
1438{
1439.eraseblocks = { {4 * 1024, 256} },
1440.block_erase = spi_block_erase_20,
1441}, {
1442.eraseblocks = { {32 * 1024, 32} },
1443.block_erase = spi_block_erase_52,
1444}, {
1445.eraseblocks = { {64 * 1024, 16} },
1446.block_erase = spi_block_erase_d8,
1447}, {
1448.eraseblocks = { {1024 * 1024, 1} },
1449.block_erase = spi_block_erase_60,
1450}, {
1451.eraseblocks = { {1024 * 1024, 1} },
1452.block_erase = spi_block_erase_c7,
1453}
1454},
1455.printlock= spi_prettyprint_status_register_at25df_sec,
1456.unlock= spi_disable_blockprotect_at25df_sec,
1457.write= spi_chip_write_256,
1458.read= spi_chip_read,
1459.voltage= {2700, 3600},
1460},
1461
1462{
1463.vendor= "Atmel",
1464.name= "AT25DF161",
1465.bustype= BUS_SPI,
1466.manufacture_id= ATMEL_ID,
1467.model_id= ATMEL_AT25DF161,
1468.total_size= 2048,
1469.page_size= 256,
1470.feature_bits= FEATURE_WRSR_WREN,
1471.tested= TEST_UNTESTED,
1472.probe= probe_spi_rdid,
1473.probe_timing= TIMING_ZERO,
1474.block_erasers=
1475{
1476{
1477.eraseblocks = { {4 * 1024, 512} },
1478.block_erase = spi_block_erase_20,
1479}, {
1480.eraseblocks = { {32 * 1024, 64} },
1481.block_erase = spi_block_erase_52,
1482}, {
1483.eraseblocks = { {64 * 1024, 32} },
1484.block_erase = spi_block_erase_d8,
1485}, {
1486.eraseblocks = { {2 * 1024 * 1024, 1} },
1487.block_erase = spi_block_erase_60,
1488}, {
1489.eraseblocks = { {2 * 1024 * 1024, 1} },
1490.block_erase = spi_block_erase_c7,
1491}
1492},
1493.printlock= spi_prettyprint_status_register_at25df_sec,
1494.unlock= spi_disable_blockprotect_at25df_sec,
1495.write= spi_chip_write_256,
1496.read= spi_chip_read,
1497.voltage= {2700, 3600},
1498},
1499
1500{
1501.vendor= "Atmel",
1502.name= "AT25DF321",
1503.bustype= BUS_SPI,
1504.manufacture_id= ATMEL_ID,
1505.model_id= ATMEL_AT25DF321,
1506.total_size= 4096,
1507.page_size= 256,
1508.feature_bits= FEATURE_WRSR_WREN,
1509.tested= TEST_OK_PREW,
1510.probe= probe_spi_rdid,
1511.probe_timing= TIMING_ZERO,
1512.block_erasers=
1513{
1514{
1515.eraseblocks = { {4 * 1024, 1024} },
1516.block_erase = spi_block_erase_20,
1517}, {
1518.eraseblocks = { {32 * 1024, 128} },
1519.block_erase = spi_block_erase_52,
1520}, {
1521.eraseblocks = { {64 * 1024, 64} },
1522.block_erase = spi_block_erase_d8,
1523}, {
1524.eraseblocks = { {4 * 1024 * 1024, 1} },
1525.block_erase = spi_block_erase_60,
1526}, {
1527.eraseblocks = { {4 * 1024 * 1024, 1} },
1528.block_erase = spi_block_erase_c7,
1529}
1530},
1531.printlock= spi_prettyprint_status_register_at25df,
1532.unlock= spi_disable_blockprotect_at25df,
1533.write= spi_chip_write_256,
1534.read= spi_chip_read,
1535.voltage= {2700, 3600},
1536},
1537
1538{
1539.vendor= "Atmel",
1540.name= "AT25DF321A",
1541.bustype= BUS_SPI,
1542.manufacture_id= ATMEL_ID,
1543.model_id= ATMEL_AT25DF321A,
1544.total_size= 4096,
1545.page_size= 256,
1546.feature_bits= FEATURE_WRSR_WREN,
1547.tested= TEST_OK_PROBE,
1548.probe= probe_spi_rdid,
1549.probe_timing= TIMING_ZERO,
1550.block_erasers=
1551{
1552{
1553.eraseblocks = { {4 * 1024, 1024} },
1554.block_erase = spi_block_erase_20,
1555}, {
1556.eraseblocks = { {32 * 1024, 128} },
1557.block_erase = spi_block_erase_52,
1558}, {
1559.eraseblocks = { {64 * 1024, 64} },
1560.block_erase = spi_block_erase_d8,
1561}, {
1562.eraseblocks = { {4 * 1024 * 1024, 1} },
1563.block_erase = spi_block_erase_60,
1564}, {
1565.eraseblocks = { {4 * 1024 * 1024, 1} },
1566.block_erase = spi_block_erase_c7,
1567}
1568},
1569.printlock= spi_prettyprint_status_register_at25df_sec,
1570.unlock= spi_disable_blockprotect_at25df_sec,
1571.write= spi_chip_write_256,
1572.read= spi_chip_read,
1573.voltage= {2700, 3600},
1574},
1575
1576{
1577.vendor= "Atmel",
1578.name= "AT25DF641",
1579.bustype= BUS_SPI,
1580.manufacture_id= ATMEL_ID,
1581.model_id= ATMEL_AT25DF641,
1582.total_size= 8192,
1583.page_size= 256,
1584.feature_bits= FEATURE_WRSR_WREN,
1585.tested= TEST_UNTESTED,
1586.probe= probe_spi_rdid,
1587.probe_timing= TIMING_ZERO,
1588.block_erasers=
1589{
1590{
1591.eraseblocks = { {4 * 1024, 2048} },
1592.block_erase = spi_block_erase_20,
1593}, {
1594.eraseblocks = { {32 * 1024, 256} },
1595.block_erase = spi_block_erase_52,
1596}, {
1597.eraseblocks = { {64 * 1024, 128} },
1598.block_erase = spi_block_erase_d8,
1599}, {
1600.eraseblocks = { {8 * 1024 * 1024, 1} },
1601.block_erase = spi_block_erase_60,
1602}, {
1603.eraseblocks = { {8 * 1024 * 1024, 1} },
1604.block_erase = spi_block_erase_c7,
1605}
1606},
1607.printlock= spi_prettyprint_status_register_at25df_sec,
1608.unlock= spi_disable_blockprotect_at25df_sec,
1609.write= spi_chip_write_256,
1610.read= spi_chip_read,
1611.voltage= {2700, 3600},
1612},
1613
1614{
1615.vendor= "Atmel",
1616.name= "AT25DQ161",
1617.bustype= BUS_SPI,
1618.manufacture_id= ATMEL_ID,
1619.model_id= ATMEL_AT25DQ161,
1620.total_size= 2048,
1621.page_size= 256,
1622.feature_bits= FEATURE_WRSR_WREN,
1623.tested= TEST_UNTESTED,
1624.probe= probe_spi_rdid,
1625.probe_timing= TIMING_ZERO,
1626.block_erasers=
1627{
1628{
1629.eraseblocks = { {4 * 1024, 512} },
1630.block_erase = spi_block_erase_20,
1631}, {
1632.eraseblocks = { {32 * 1024, 64} },
1633.block_erase = spi_block_erase_52,
1634}, {
1635.eraseblocks = { {64 * 1024, 32} },
1636.block_erase = spi_block_erase_d8,
1637}, {
1638.eraseblocks = { {2 * 1024 * 1024, 1} },
1639.block_erase = spi_block_erase_60,
1640}, {
1641.eraseblocks = { {2 * 1024 * 1024, 1} },
1642.block_erase = spi_block_erase_c7,
1643}
1644},
1645.printlock= spi_prettyprint_status_register_at25df_sec,
1646.unlock= spi_disable_blockprotect_at25df_sec,
1647.write= spi_chip_write_256,
1648.read= spi_chip_read,
1649.voltage= {2700, 3600},
1650},
1651
1652{
1653.vendor= "Atmel",
1654.name= "AT25F512B",
1655.bustype= BUS_SPI,
1656.manufacture_id= ATMEL_ID,
1657.model_id= ATMEL_AT25F512B,
1658.total_size= 64,
1659.page_size= 256,
1660.feature_bits= FEATURE_WRSR_WREN,
1661.tested= TEST_UNTESTED,
1662.probe= probe_spi_rdid,
1663.probe_timing= TIMING_ZERO,
1664.block_erasers=
1665{
1666{
1667.eraseblocks = { {4 * 1024, 16} },
1668.block_erase = spi_block_erase_20,
1669}, {
1670.eraseblocks = { {32 * 1024, 2} },
1671.block_erase = spi_block_erase_52,
1672}, {
1673.eraseblocks = { {32 * 1024, 2} },
1674.block_erase = spi_block_erase_d8,
1675}, {
1676.eraseblocks = { {64 * 1024, 1} },
1677.block_erase = spi_block_erase_60,
1678}, {
1679.eraseblocks = { {64 * 1024, 1} },
1680.block_erase = spi_block_erase_c7,
1681}
1682},
1683.printlock= spi_prettyprint_status_register_at25f,
1684.unlock= spi_disable_blockprotect_at25f,
1685.write= spi_chip_write_256,
1686.read= spi_chip_read,
1687.voltage= {2700, 3600},
1688},
1689
1690{
1691.vendor= "Atmel",
1692.name= "AT25FS010",
1693.bustype= BUS_SPI,
1694.manufacture_id= ATMEL_ID,
1695.model_id= ATMEL_AT25FS010,
1696.total_size= 128,
1697.page_size= 256,
1698.tested= TEST_UNTESTED,
1699.probe= probe_spi_rdid,
1700.probe_timing= TIMING_ZERO,
1701.block_erasers=
1702{
1703{
1704.eraseblocks = { {4 * 1024, 32} },
1705.block_erase = spi_block_erase_20,
1706}, {
1707.eraseblocks = { {4 * 1024, 32} },
1708.block_erase = spi_block_erase_d7,
1709}, {
1710.eraseblocks = { {32 * 1024, 4} },
1711.block_erase = spi_block_erase_52,
1712}, {
1713.eraseblocks = { {32 * 1024, 4} },
1714.block_erase = spi_block_erase_d8,
1715}, {
1716.eraseblocks = { {128 * 1024, 1} },
1717.block_erase = spi_block_erase_60,
1718}, {
1719.eraseblocks = { {128 * 1024, 1} },
1720.block_erase = spi_block_erase_c7,
1721}
1722},
1723.printlock= spi_prettyprint_status_register_at25fs010,
1724.unlock= spi_disable_blockprotect_at25fs010,
1725.write= spi_chip_write_256,
1726.read= spi_chip_read,
1727.voltage= {2700, 3600},
1728},
1729
1730{
1731.vendor= "Atmel",
1732.name= "AT25FS040",
1733.bustype= BUS_SPI,
1734.manufacture_id= ATMEL_ID,
1735.model_id= ATMEL_AT25FS040,
1736.total_size= 512,
1737.page_size= 256,
1738.tested= TEST_UNTESTED,
1739.probe= probe_spi_rdid,
1740.probe_timing= TIMING_ZERO,
1741.block_erasers=
1742{
1743{
1744.eraseblocks = { {4 * 1024, 128} },
1745.block_erase = spi_block_erase_20,
1746}, {
1747.eraseblocks = { {64 * 1024, 8} },
1748.block_erase = spi_block_erase_52,
1749}, {
1750.eraseblocks = { {64 * 1024, 8} },
1751.block_erase = spi_block_erase_d8,
1752}, {
1753.eraseblocks = { {512 * 1024, 1} },
1754.block_erase = spi_block_erase_60,
1755}, {
1756.eraseblocks = { {512 * 1024, 1} },
1757.block_erase = spi_block_erase_c7,
1758}
1759},
1760.printlock= spi_prettyprint_status_register_at25fs040,
1761.unlock= spi_disable_blockprotect_at25fs040,
1762.write= spi_chip_write_256,
1763.read= spi_chip_read,
1764.voltage= {2700, 3600},
1765},
1766
1767{
1768.vendor= "Atmel",
1769.name= "AT26DF041",
1770.bustype= BUS_SPI,
1771.manufacture_id= ATMEL_ID,
1772.model_id= ATMEL_AT26DF041,
1773.total_size= 512,
1774.page_size= 256,
1775.tested= TEST_UNTESTED,
1776.probe= probe_spi_rdid,
1777.probe_timing= TIMING_ZERO,
1778.block_erasers=
1779{
1780{
1781.eraseblocks = { {4 * 1024, 128} },
1782.block_erase = spi_block_erase_20,
1783}
1784},
1785.write= NULL /* Incompatible Page write */,
1786.read= spi_chip_read,
1787.voltage= {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
1788},
1789
1790{
1791.vendor= "Atmel",
1792.name= "AT26DF081A",
1793.bustype= BUS_SPI,
1794.manufacture_id= ATMEL_ID,
1795.model_id= ATMEL_AT26DF081A,
1796.total_size= 1024,
1797.page_size= 256,
1798.feature_bits= FEATURE_WRSR_WREN,
1799.tested= TEST_OK_PREW,
1800.probe= probe_spi_rdid,
1801.probe_timing= TIMING_ZERO,
1802.block_erasers=
1803{
1804{
1805.eraseblocks = { {4 * 1024, 256} },
1806.block_erase = spi_block_erase_20,
1807}, {
1808.eraseblocks = { {32 * 1024, 32} },
1809.block_erase = spi_block_erase_52,
1810}, {
1811.eraseblocks = { {64 * 1024, 16} },
1812.block_erase = spi_block_erase_d8,
1813}, {
1814.eraseblocks = { {1024 * 1024, 1} },
1815.block_erase = spi_block_erase_60,
1816}, {
1817.eraseblocks = { {1024 * 1024, 1} },
1818.block_erase = spi_block_erase_c7,
1819}
1820},
1821.printlock= spi_prettyprint_status_register_atmel_at26df081a,
1822.unlock= spi_disable_blockprotect_at25df,
1823.write= spi_chip_write_256,
1824.read= spi_chip_read,
1825.voltage= {2700, 3600},
1826},
1827
1828{
1829.vendor= "Atmel",
1830.name= "AT26DF161",
1831.bustype= BUS_SPI,
1832.manufacture_id= ATMEL_ID,
1833.model_id= ATMEL_AT26DF161,
1834.total_size= 2048,
1835.page_size= 256,
1836.tested= TEST_UNTESTED,
1837.probe= probe_spi_rdid,
1838.probe_timing= TIMING_ZERO,
1839.block_erasers=
1840{
1841{
1842.eraseblocks = { {4 * 1024, 512} },
1843.block_erase = spi_block_erase_20,
1844}, {
1845.eraseblocks = { {32 * 1024, 64} },
1846.block_erase = spi_block_erase_52,
1847}, {
1848.eraseblocks = { {64 * 1024, 32} },
1849.block_erase = spi_block_erase_d8,
1850}, {
1851.eraseblocks = { {2 * 1024 * 1024, 1} },
1852.block_erase = spi_block_erase_60,
1853}, {
1854.eraseblocks = { {2 * 1024 * 1024, 1} },
1855.block_erase = spi_block_erase_c7,
1856}
1857},
1858.printlock= spi_prettyprint_status_register_at25df,
1859.unlock= spi_disable_blockprotect,
1860.write= spi_chip_write_256,
1861.read= spi_chip_read,
1862.voltage= {2700, 3600},
1863},
1864
1865{
1866.vendor= "Atmel",
1867.name= "AT26DF161A",
1868.bustype= BUS_SPI,
1869.manufacture_id= ATMEL_ID,
1870.model_id= ATMEL_AT26DF161A,
1871.total_size= 2048,
1872.page_size= 256,
1873.tested= TEST_UNTESTED,
1874.probe= probe_spi_rdid,
1875.probe_timing= TIMING_ZERO,
1876.block_erasers=
1877{
1878{
1879.eraseblocks = { {4 * 1024, 512} },
1880.block_erase = spi_block_erase_20,
1881}, {
1882.eraseblocks = { {32 * 1024, 64} },
1883.block_erase = spi_block_erase_52,
1884}, {
1885.eraseblocks = { {64 * 1024, 32} },
1886.block_erase = spi_block_erase_d8,
1887}, {
1888.eraseblocks = { {2 * 1024 * 1024, 1} },
1889.block_erase = spi_block_erase_60,
1890}, {
1891.eraseblocks = { {2 * 1024 * 1024, 1} },
1892.block_erase = spi_block_erase_c7,
1893}
1894},
1895.printlock= spi_prettyprint_status_register_atmel_at26df081a,
1896.unlock= spi_disable_blockprotect,
1897.write= spi_chip_write_256,
1898.read= spi_chip_read,
1899.voltage= {2700, 3600},
1900},
1901
1902/*The AT26DF321 has the same ID as the AT25DF321. */
1903/*{
1904.vendor= "Atmel",
1905.name= "AT26DF321",
1906.bustype= BUS_SPI,
1907.manufacture_id= ATMEL_ID,
1908.model_id= ATMEL_AT26DF321,
1909.total_size= 4096,
1910.page_size= 256,
1911.tested= TEST_UNTESTED,
1912.probe= probe_spi_rdid,
1913.probe_timing= TIMING_ZERO,
1914.printlock= spi_prettyprint_status_register_atmel_at26df081a,
1915.unlock= spi_disable_blockprotect,
1916.write= spi_chip_write_256,
1917.read= spi_chip_read,
1918 },*/
1919
1920{
1921.vendor= "Atmel",
1922.name= "AT26F004",
1923.bustype= BUS_SPI,
1924.manufacture_id= ATMEL_ID,
1925.model_id= ATMEL_AT26F004,
1926.total_size= 512,
1927.page_size= 256,
1928.tested= TEST_UNTESTED,
1929.probe= probe_spi_rdid,
1930.probe_timing= TIMING_ZERO,
1931.block_erasers=
1932{
1933{
1934.eraseblocks = { {4 * 1024, 128} },
1935.block_erase = spi_block_erase_20,
1936}, {
1937.eraseblocks = { {32 * 1024, 16} },
1938.block_erase = spi_block_erase_52,
1939}, {
1940.eraseblocks = { {64 * 1024, 8} },
1941.block_erase = spi_block_erase_d8,
1942}, {
1943.eraseblocks = { {512 * 1024, 1} },
1944.block_erase = spi_block_erase_60,
1945}, {
1946.eraseblocks = { {512 * 1024, 1} },
1947.block_erase = spi_block_erase_c7,
1948}
1949},
1950.write= NULL /* Incompatible Page write */,
1951.read= spi_chip_read,
1952.voltage= {2700, 3600},
1953},
1954
1955{
1956.vendor= "Atmel",
1957.name= "AT29C512",
1958.bustype= BUS_PARALLEL,
1959.manufacture_id= ATMEL_ID,
1960.model_id= ATMEL_AT29C512,
1961.total_size= 64,
1962.page_size= 128,
1963.feature_bits= FEATURE_LONG_RESET,
1964.tested= TEST_UNTESTED,
1965.probe= probe_jedec,
1966.probe_timing= 10000, /* 10mS, Enter=Exec */
1967.block_erasers=
1968{
1969{
1970.eraseblocks = { {64 * 1024, 1} },
1971.block_erase = erase_chip_block_jedec,
1972}
1973},
1974.write= write_jedec,
1975.read= read_memmapped,
1976.voltage= {4500, 5500},
1977},
1978
1979{
1980.vendor= "Atmel",
1981.name= "AT29C010A",
1982.bustype= BUS_PARALLEL,
1983.manufacture_id= ATMEL_ID,
1984.model_id= ATMEL_AT29C010A,
1985.total_size= 128,
1986.page_size= 128,
1987.feature_bits= FEATURE_LONG_RESET,
1988.tested= TEST_OK_PRE,
1989.probe= probe_jedec,
1990.probe_timing= 10000, /* 10mS, Enter=Exec */
1991.block_erasers=
1992{
1993{
1994.eraseblocks = { {128 * 1024, 1} },
1995.block_erase = erase_chip_block_jedec,
1996}
1997},
1998.write= write_jedec,/* FIXME */
1999.read= read_memmapped,
2000.voltage= {4500, 5500},
2001},
2002
2003{
2004.vendor= "Atmel",
2005.name= "AT29C020",
2006.bustype= BUS_PARALLEL,
2007.manufacture_id= ATMEL_ID,
2008.model_id= ATMEL_AT29C020,
2009.total_size= 256,
2010.page_size= 256,
2011.feature_bits= FEATURE_LONG_RESET,
2012.tested= TEST_UNTESTED,
2013.probe= probe_jedec,
2014.probe_timing= 10000,/* 10ms */
2015.block_erasers=
2016{
2017{
2018.eraseblocks = { {256 * 1024, 1} },
2019.block_erase = erase_chip_block_jedec,
2020}
2021},
2022.write= write_jedec,
2023.read= read_memmapped,
2024.voltage= {4500, 5500},
2025},
2026
2027{
2028.vendor= "Atmel",
2029.name= "AT29C040A",
2030.bustype= BUS_PARALLEL,
2031.manufacture_id= ATMEL_ID,
2032.model_id= ATMEL_AT29C040A,
2033.total_size= 512,
2034.page_size= 256,
2035.feature_bits= FEATURE_LONG_RESET,
2036.tested= TEST_UNTESTED,
2037.probe= probe_jedec,
2038.probe_timing= 10000,/* 10 ms */
2039.block_erasers=
2040{
2041{
2042.eraseblocks = { {512 * 1024, 1} },
2043.block_erase = erase_chip_block_jedec,
2044}
2045},
2046.write= write_jedec,
2047.read= read_memmapped,
2048.voltage= {4500, 5500},
2049},
2050
2051{
2052.vendor= "Atmel",
2053.name= "AT45CS1282",
2054.bustype= BUS_SPI,
2055.manufacture_id= ATMEL_ID,
2056.model_id= ATMEL_AT45CS1282,
2057.total_size= 16896 /* No power of two sizes */,
2058.page_size= 1056 /* No power of two sizes */,
2059.tested= TEST_BAD_READ,
2060.probe= probe_spi_rdid,
2061.probe_timing= TIMING_ZERO,
2062.write= NULL /* Incompatible Page write */,
2063.read= NULL /* Incompatible read */,
2064.voltage= {2700, 3600},
2065},
2066
2067{
2068.vendor= "Atmel",
2069.name= "AT45DB011D",
2070.bustype= BUS_SPI,
2071.manufacture_id= ATMEL_ID,
2072.model_id= ATMEL_AT45DB011D,
2073.total_size= 128 /* Size can only be determined from status register */,
2074.page_size= 256 /* Size can only be determined from status register */,
2075.tested= TEST_BAD_READ,
2076.probe= probe_spi_rdid,
2077.probe_timing= TIMING_ZERO,
2078.write= NULL,
2079.read= NULL,
2080.voltage= {2700, 3600},
2081},
2082
2083{
2084.vendor= "Atmel",
2085.name= "AT45DB021D",
2086.bustype= BUS_SPI,
2087.manufacture_id= ATMEL_ID,
2088.model_id= ATMEL_AT45DB021D,
2089.total_size= 256 /* Size can only be determined from status register */,
2090.page_size= 256 /* Size can only be determined from status register */,
2091.tested= TEST_BAD_READ,
2092.probe= probe_spi_rdid,
2093.probe_timing= TIMING_ZERO,
2094.write= NULL,
2095.read= NULL,
2096.voltage= {2700, 3600},
2097},
2098
2099{
2100.vendor= "Atmel",
2101.name= "AT45DB041D",
2102.bustype= BUS_SPI,
2103.manufacture_id= ATMEL_ID,
2104.model_id= ATMEL_AT45DB041D,
2105.total_size= 512 /* Size can only be determined from status register */,
2106.page_size= 256 /* Size can only be determined from status register */,
2107.tested= TEST_BAD_READ,
2108.probe= probe_spi_rdid,
2109.probe_timing= TIMING_ZERO,
2110.write= NULL,
2111.read= NULL,
2112.voltage= {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2113},
2114
2115{
2116.vendor= "Atmel",
2117.name= "AT45DB081D",
2118.bustype= BUS_SPI,
2119.manufacture_id= ATMEL_ID,
2120.model_id= ATMEL_AT45DB081D,
2121.total_size= 1024 /* Size can only be determined from status register */,
2122.page_size= 256 /* Size can only be determined from status register */,
2123.tested= TEST_BAD_READ,
2124.probe= probe_spi_rdid,
2125.probe_timing= TIMING_ZERO,
2126.write= NULL,
2127.read= NULL,
2128.voltage= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2129},
2130
2131{
2132.vendor= "Atmel",
2133.name= "AT45DB161D",
2134.bustype= BUS_SPI,
2135.manufacture_id= ATMEL_ID,
2136.model_id= ATMEL_AT45DB161D,
2137.total_size= 2048 /* Size can only be determined from status register */,
2138.page_size= 512 /* Size can only be determined from status register */,
2139.tested= TEST_BAD_READ,
2140.probe= probe_spi_rdid,
2141.probe_timing= TIMING_ZERO,
2142.write= NULL,
2143.read= NULL,
2144.voltage= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2145},
2146
2147{
2148.vendor= "Atmel",
2149.name= "AT45DB321C",
2150.bustype= BUS_SPI,
2151.manufacture_id= ATMEL_ID,
2152.model_id= ATMEL_AT45DB321C,
2153.total_size= 4224 /* No power of two sizes */,
2154.page_size= 528 /* No power of two sizes */,
2155.tested= TEST_BAD_READ,
2156.probe= probe_spi_rdid,
2157.probe_timing= TIMING_ZERO,
2158.write= NULL,
2159.read= NULL /* Incompatible read */,
2160.voltage= {2700, 3600},
2161},
2162
2163{
2164.vendor= "Atmel",
2165.name= "AT45DB321D",
2166.bustype= BUS_SPI,
2167.manufacture_id= ATMEL_ID,
2168.model_id= ATMEL_AT45DB321D,
2169.total_size= 4096 /* Size can only be determined from status register */,
2170.page_size= 512 /* Size can only be determined from status register */,
2171.tested= TEST_BAD_READ,
2172.probe= probe_spi_rdid,
2173.probe_timing= TIMING_ZERO,
2174.write= NULL,
2175.read= NULL,
2176.voltage= {2700, 3600},
2177},
2178
2179{
2180.vendor= "Atmel",
2181.name= "AT45DB642D",
2182.bustype= BUS_SPI,
2183.manufacture_id= ATMEL_ID,
2184.model_id= ATMEL_AT45DB642D,
2185.total_size= 8192 /* Size can only be determined from status register */,
2186.page_size= 1024 /* Size can only be determined from status register */,
2187.tested= TEST_BAD_READ,
2188.probe= probe_spi_rdid,
2189.probe_timing= TIMING_ZERO,
2190.write= NULL,
2191.read= NULL,
2192.voltage= {2700, 3600},
2193},
2194
2195{
2196.vendor= "Atmel",
2197.name= "AT49BV512",
2198.bustype= BUS_PARALLEL,
2199.manufacture_id= ATMEL_ID,
2200.model_id= ATMEL_AT49BV512,
2201.total_size= 64,
2202.page_size= 64,
2203.feature_bits= FEATURE_EITHER_RESET,
2204.tested= TEST_OK_PREW,
2205.probe= probe_jedec,
2206.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
2207.block_erasers=
2208{
2209{
2210.eraseblocks = { {64 * 1024, 1} },
2211.block_erase = erase_chip_block_jedec,
2212}
2213},
2214.write= write_jedec_1,
2215.read= read_memmapped,
2216.voltage= {2700, 3600},
2217},
2218
2219{
2220.vendor= "Atmel",
2221.name= "AT49F020",
2222.bustype= BUS_PARALLEL,
2223.manufacture_id= ATMEL_ID,
2224.model_id= ATMEL_AT49F020,
2225.total_size= 256,
2226.page_size= 256,
2227.feature_bits= FEATURE_EITHER_RESET,
2228.tested= TEST_OK_PRE,
2229.probe= probe_jedec,
2230.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
2231.block_erasers=
2232{
2233{
2234.eraseblocks = { {256 * 1024, 1} },
2235.block_erase = erase_chip_block_jedec,
2236}
2237},
2238.write= write_jedec_1,
2239.read= read_memmapped,
2240.voltage= {4500, 5500},
2241},
2242
2243{
2244.vendor= "Atmel",
2245.name= "AT49F002(N)",
2246.bustype= BUS_PARALLEL,
2247.manufacture_id= ATMEL_ID,
2248.model_id= ATMEL_AT49F002N,
2249.total_size= 256,
2250.page_size= 256,
2251.feature_bits= FEATURE_EITHER_RESET,
2252.tested= TEST_UNTESTED,
2253.probe= probe_jedec,
2254.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
2255.block_erasers=
2256{
2257{
2258.eraseblocks = {
2259{16 * 1024, 1},
2260{8 * 1024, 2},
2261{96 * 1024, 1},
2262{128 * 1024, 1},
2263},
2264.block_erase = erase_sector_jedec,
2265}, {
2266.eraseblocks = { {256 * 1024, 1} },
2267.block_erase = erase_chip_block_jedec,
2268}
2269},
2270.write= write_jedec_1,
2271.read= read_memmapped,
2272.voltage= {4500, 5500},
2273},
2274
2275{
2276.vendor= "Atmel",
2277.name= "AT49F002(N)T",
2278.bustype= BUS_PARALLEL,
2279.manufacture_id= ATMEL_ID,
2280.model_id= ATMEL_AT49F002NT,
2281.total_size= 256,
2282.page_size= 256,
2283.feature_bits= FEATURE_EITHER_RESET,
2284.tested= TEST_OK_PR,
2285.probe= probe_jedec,
2286.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
2287.block_erasers=
2288{
2289{
2290.eraseblocks = {
2291{128 * 1024, 1},
2292{96 * 1024, 1},
2293{8 * 1024, 2},
2294{16 * 1024, 1},
2295},
2296.block_erase = erase_sector_jedec,
2297}, {
2298.eraseblocks = { {256 * 1024, 1} },
2299.block_erase = erase_chip_block_jedec,
2300}
2301},
2302.write= write_jedec_1,
2303.read= read_memmapped,
2304.voltage= {4500, 5500},
2305},
2306
2307{
2308.vendor= "Atmel",
2309.name= "AT49LH002",
2310.bustype= BUS_LPC | BUS_FWH, /* A/A Mux */
2311.manufacture_id= ATMEL_ID,
2312.model_id= ATMEL_AT49LH002,
2313.total_size= 256,
2314.page_size= 0, /* unused */
2315.feature_bits= FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2316.tested= TEST_UNTESTED,
2317.probe= probe_82802ab, /* TODO: 0xff cmd not documented? */
2318.probe_timing= TIMING_FIXME,
2319.block_erasers=
2320{
2321{
2322.eraseblocks = {
2323{64 * 1024, 3},
2324{32 * 1024, 1},
2325{8 * 1024, 2},
2326{16 * 1024, 1},
2327},
2328.block_erase = erase_block_82802ab,
2329}, {
2330.eraseblocks = {
2331{64 * 1024, 4},
2332},
2333.block_erase = NULL, /* TODO: Implement. */
2334},
2335},
2336.printlock= NULL, /* TODO */
2337.unlock= NULL, /* unlock_82802ab() not correct(?) */
2338.write= write_82802ab,
2339.read= read_memmapped,
2340.voltage= {3000, 3600},
2341},
2342
2343{
2344.vendor= "Catalyst",
2345.name= "CAT28F512",
2346.bustype= BUS_PARALLEL,
2347.manufacture_id= CATALYST_ID,
2348.model_id= CATALYST_CAT28F512,
2349.total_size= 64,
2350.page_size= 0, /* unused */
2351.feature_bits= 0,
2352.tested= TEST_OK_PR,
2353.probe= probe_jedec, /* FIXME! */
2354.probe_timing= TIMING_ZERO,
2355.block_erasers=
2356{
2357{
2358.eraseblocks = { {64 * 1024, 1} },
2359.block_erase = NULL, /* TODO */
2360},
2361},
2362.write= NULL, /* TODO */
2363.read= read_memmapped,
2364.voltage= {4500, 5500},
2365},
2366
2367{
2368.vendor= "Bright",
2369.name= "BM29F040",
2370.bustype= BUS_PARALLEL,
2371.manufacture_id= BRIGHT_ID,
2372.model_id= BRIGHT_BM29F040,
2373.total_size= 512,
2374.page_size= 64 * 1024,
2375.feature_bits= FEATURE_EITHER_RESET,
2376.tested= TEST_OK_PR,
2377.probe= probe_jedec,
2378.probe_timing= TIMING_ZERO,
2379.block_erasers=
2380{
2381{
2382.eraseblocks = { {64 * 1024, 8} },
2383.block_erase = erase_sector_jedec,
2384}, {
2385.eraseblocks = { {512 * 1024, 1} },
2386.block_erase = erase_chip_block_jedec,
2387},
2388},
2389.write= write_jedec_1,
2390.read= read_memmapped,
2391.voltage= {4500, 5500},
2392},
2393
2394{
2395.vendor= "EMST",
2396.name= "F49B002UA",
2397.bustype= BUS_PARALLEL,
2398.manufacture_id= EMST_ID,
2399.model_id= EMST_F49B002UA,
2400.total_size= 256,
2401.page_size= 4096,
2402.feature_bits= FEATURE_EITHER_RESET,
2403.tested= TEST_UNTESTED,
2404.probe= probe_jedec,
2405.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
2406.block_erasers=
2407{
2408{
2409.eraseblocks = {
2410{128 * 1024, 1},
2411{96 * 1024, 1},
2412{8 * 1024, 2},
2413{16 * 1024, 1},
2414},
2415.block_erase = erase_sector_jedec,
2416}, {
2417.eraseblocks = { {256 * 1024, 1} },
2418.block_erase = erase_chip_block_jedec,
2419}
2420},
2421.write= write_jedec_1,
2422.read= read_memmapped,
2423.voltage= {4500, 5500},
2424},
2425
2426{
2427.vendor= "EMST",
2428.name= "F25L008A",
2429.bustype= BUS_SPI,
2430.manufacture_id= EMST_ID,
2431.model_id= EMST_F25L008A,
2432.total_size= 1024,
2433.page_size= 256,
2434.tested= TEST_UNTESTED,
2435.probe= probe_spi_rdid,
2436.probe_timing= TIMING_ZERO,
2437.block_erasers=
2438{
2439{
2440.eraseblocks = { {4 * 1024, 256} },
2441.block_erase = spi_block_erase_20,
2442}, {
2443.eraseblocks = { {64 * 1024, 16} },
2444.block_erase = spi_block_erase_d8,
2445}, {
2446.eraseblocks = { {1024 * 1024, 1} },
2447.block_erase = spi_block_erase_60,
2448}, {
2449.eraseblocks = { {1024 * 1024, 1} },
2450.block_erase = spi_block_erase_c7,
2451}
2452},
2453.unlock= spi_disable_blockprotect,
2454.write= spi_chip_write_1,
2455.read= spi_chip_read,
2456.voltage= {2700, 3600},
2457},
2458
2459{
2460.vendor= "Eon",
2461.name= "EN25B05",
2462.bustype= BUS_SPI,
2463.manufacture_id= EON_ID_NOPREFIX,
2464.model_id= EON_EN25B05,
2465.total_size= 64,
2466.page_size= 256,
2467.tested= TEST_UNTESTED,
2468.probe= probe_spi_rdid,
2469.probe_timing= TIMING_ZERO,
2470.block_erasers=
2471{
2472{
2473.eraseblocks = {
2474{4 * 1024, 2},
2475{8 * 1024, 1},
2476{16 * 1024, 1},
2477{32 * 1024, 1},
2478},
2479.block_erase = spi_block_erase_d8,
2480}, {
2481.eraseblocks = { {64 * 1024, 1} },
2482.block_erase = spi_block_erase_c7,
2483}
2484},
2485.unlock= spi_disable_blockprotect,
2486.write= spi_chip_write_256,
2487.read= spi_chip_read,
2488.voltage= {2700, 3600},
2489},
2490
2491{
2492.vendor= "Eon",
2493.name= "EN25B05T",
2494.bustype= BUS_SPI,
2495.manufacture_id= EON_ID_NOPREFIX,
2496.model_id= EON_EN25B05,
2497.total_size= 64,
2498.page_size= 256,
2499.tested= TEST_UNTESTED,
2500.probe= probe_spi_rdid,
2501.probe_timing= TIMING_ZERO,
2502.block_erasers=
2503{
2504{
2505.eraseblocks = {
2506{32 * 1024, 1},
2507{16 * 1024, 1},
2508{8 * 1024, 1},
2509{4 * 1024, 2},
2510},
2511.block_erase = spi_block_erase_d8,
2512}, {
2513.eraseblocks = { {64 * 1024, 1} },
2514.block_erase = spi_block_erase_c7,
2515}
2516},
2517.unlock= spi_disable_blockprotect,
2518.write= spi_chip_write_256,
2519.read= spi_chip_read,
2520.voltage= {2700, 3600},
2521},
2522
2523{
2524.vendor= "Eon",
2525.name= "EN25B10",
2526.bustype= BUS_SPI,
2527.manufacture_id= EON_ID_NOPREFIX,
2528.model_id= EON_EN25B10,
2529.total_size= 128,
2530.page_size= 256,
2531.tested= TEST_UNTESTED,
2532.probe= probe_spi_rdid,
2533.probe_timing= TIMING_ZERO,
2534.block_erasers=
2535{
2536{
2537.eraseblocks = {
2538{4 * 1024, 2},
2539{8 * 1024, 1},
2540{16 * 1024, 1},
2541{32 * 1024, 3},
2542},
2543.block_erase = spi_block_erase_d8,
2544}, {
2545.eraseblocks = { {128 * 1024, 1} },
2546.block_erase = spi_block_erase_c7,
2547}
2548},
2549.unlock= spi_disable_blockprotect,
2550.write= spi_chip_write_256,
2551.read= spi_chip_read,
2552.voltage= {2700, 3600},
2553},
2554
2555{
2556.vendor= "Eon",
2557.name= "EN25B10T",
2558.bustype= BUS_SPI,
2559.manufacture_id= EON_ID_NOPREFIX,
2560.model_id= EON_EN25B10,
2561.total_size= 128,
2562.page_size= 256,
2563.tested= TEST_UNTESTED,
2564.probe= probe_spi_rdid,
2565.probe_timing= TIMING_ZERO,
2566.block_erasers=
2567{
2568{
2569.eraseblocks = {
2570{32 * 1024, 3},
2571{16 * 1024, 1},
2572{8 * 1024, 1},
2573{4 * 1024, 2},
2574},
2575.block_erase = spi_block_erase_d8,
2576}, {
2577.eraseblocks = { {128 * 1024, 1} },
2578.block_erase = spi_block_erase_c7,
2579}
2580},
2581.unlock= spi_disable_blockprotect,
2582.write= spi_chip_write_256,
2583.read= spi_chip_read,
2584.voltage= {2700, 3600},
2585},
2586
2587{
2588.vendor= "Eon",
2589.name= "EN25B20",
2590.bustype= BUS_SPI,
2591.manufacture_id= EON_ID_NOPREFIX,
2592.model_id= EON_EN25B20,
2593.total_size= 256,
2594.page_size= 256,
2595.tested= TEST_UNTESTED,
2596.probe= probe_spi_rdid,
2597.probe_timing= TIMING_ZERO,
2598.block_erasers=
2599{
2600{
2601.eraseblocks = {
2602{4 * 1024, 2},
2603{8 * 1024, 1},
2604{16 * 1024, 1},
2605{32 * 1024, 1},
2606{64 * 1024, 3}
2607},
2608.block_erase = spi_block_erase_d8,
2609}, {
2610.eraseblocks = { {256 * 1024, 1} },
2611.block_erase = spi_block_erase_c7,
2612}
2613},
2614.unlock= spi_disable_blockprotect,
2615.write= spi_chip_write_256,
2616.read= spi_chip_read,
2617.voltage= {2700, 3600},
2618},
2619
2620{
2621.vendor= "Eon",
2622.name= "EN25B20T",
2623.bustype= BUS_SPI,
2624.manufacture_id= EON_ID_NOPREFIX,
2625.model_id= EON_EN25B20,
2626.total_size= 256,
2627.page_size= 256,
2628.tested= TEST_UNTESTED,
2629.probe= probe_spi_rdid,
2630.probe_timing= TIMING_ZERO,
2631.block_erasers=
2632{
2633{
2634.eraseblocks = {
2635{64 * 1024, 3},
2636{32 * 1024, 1},
2637{16 * 1024, 1},
2638{8 * 1024, 1},
2639{4 * 1024, 2},
2640},
2641.block_erase = spi_block_erase_d8,
2642}, {
2643.eraseblocks = { {256 * 1024, 1} },
2644.block_erase = spi_block_erase_c7,
2645}
2646},
2647.unlock= spi_disable_blockprotect,
2648.write= spi_chip_write_256,
2649.read= spi_chip_read,
2650.voltage= {2700, 3600},
2651},
2652
2653{
2654.vendor= "Eon",
2655.name= "EN25B40",
2656.bustype= BUS_SPI,
2657.manufacture_id= EON_ID_NOPREFIX,
2658.model_id= EON_EN25B40,
2659.total_size= 512,
2660.page_size= 256,
2661.tested= TEST_UNTESTED,
2662.probe= probe_spi_rdid,
2663.probe_timing= TIMING_ZERO,
2664.block_erasers=
2665{
2666{
2667.eraseblocks = {
2668{4 * 1024, 2},
2669{8 * 1024, 1},
2670{16 * 1024, 1},
2671{32 * 1024, 1},
2672{64 * 1024, 7}
2673},
2674.block_erase = spi_block_erase_d8,
2675}, {
2676.eraseblocks = { {512 * 1024, 1} },
2677.block_erase = spi_block_erase_c7,
2678}
2679},
2680.unlock= spi_disable_blockprotect,
2681.write= spi_chip_write_256,
2682.read= spi_chip_read,
2683.voltage= {2700, 3600},
2684},
2685
2686{
2687.vendor= "Eon",
2688.name= "EN25B40T",
2689.bustype= BUS_SPI,
2690.manufacture_id= EON_ID_NOPREFIX,
2691.model_id= EON_EN25B40,
2692.total_size= 512,
2693.page_size= 256,
2694.tested= TEST_UNTESTED,
2695.probe= probe_spi_rdid,
2696.probe_timing= TIMING_ZERO,
2697.block_erasers=
2698{
2699{
2700.eraseblocks = {
2701{64 * 1024, 7},
2702{32 * 1024, 1},
2703{16 * 1024, 1},
2704{8 * 1024, 1},
2705{4 * 1024, 2},
2706},
2707.block_erase = spi_block_erase_d8,
2708}, {
2709.eraseblocks = { {512 * 1024, 1} },
2710.block_erase = spi_block_erase_c7,
2711}
2712},
2713.unlock= spi_disable_blockprotect,
2714.write= spi_chip_write_256,
2715.read= spi_chip_read,
2716.voltage= {2700, 3600},
2717},
2718
2719{
2720.vendor= "Eon",
2721.name= "EN25B80",
2722.bustype= BUS_SPI,
2723.manufacture_id= EON_ID_NOPREFIX,
2724.model_id= EON_EN25B80,
2725.total_size= 1024,
2726.page_size= 256,
2727.tested= TEST_UNTESTED,
2728.probe= probe_spi_rdid,
2729.probe_timing= TIMING_ZERO,
2730.block_erasers=
2731{
2732{
2733.eraseblocks = {
2734{4 * 1024, 2},
2735{8 * 1024, 1},
2736{16 * 1024, 1},
2737{32 * 1024, 1},
2738{64 * 1024, 15}
2739},
2740.block_erase = spi_block_erase_d8,
2741}, {
2742.eraseblocks = { {1024 * 1024, 1} },
2743.block_erase = spi_block_erase_c7,
2744}
2745},
2746.unlock= spi_disable_blockprotect,
2747.write= spi_chip_write_256,
2748.read= spi_chip_read,
2749.voltage= {2700, 3600},
2750},
2751
2752{
2753.vendor= "Eon",
2754.name= "EN25B80T",
2755.bustype= BUS_SPI,
2756.manufacture_id= EON_ID_NOPREFIX,
2757.model_id= EON_EN25B80,
2758.total_size= 1024,
2759.page_size= 256,
2760.tested= TEST_UNTESTED,
2761.probe= probe_spi_rdid,
2762.probe_timing= TIMING_ZERO,
2763.block_erasers=
2764{
2765{
2766.eraseblocks = {
2767{64 * 1024, 15},
2768{32 * 1024, 1},
2769{16 * 1024, 1},
2770{8 * 1024, 1},
2771{4 * 1024, 2},
2772},
2773.block_erase = spi_block_erase_d8,
2774}, {
2775.eraseblocks = { {1024 * 1024, 1} },
2776.block_erase = spi_block_erase_c7,
2777}
2778},
2779.unlock= spi_disable_blockprotect,
2780.write= spi_chip_write_256,
2781.read= spi_chip_read,
2782.voltage= {2700, 3600},
2783},
2784
2785{
2786.vendor= "Eon",
2787.name= "EN25B16",
2788.bustype= BUS_SPI,
2789.manufacture_id= EON_ID_NOPREFIX,
2790.model_id= EON_EN25B16,
2791.total_size= 2048,
2792.page_size= 256,
2793.tested= TEST_UNTESTED,
2794.probe= probe_spi_rdid,
2795.probe_timing= TIMING_ZERO,
2796.block_erasers=
2797{
2798{
2799.eraseblocks = {
2800{4 * 1024, 2},
2801{8 * 1024, 1},
2802{16 * 1024, 1},
2803{32 * 1024, 1},
2804{64 * 1024, 31},
2805},
2806.block_erase = spi_block_erase_d8,
2807}, {
2808.eraseblocks = { {2 * 1024 * 1024, 1} },
2809.block_erase = spi_block_erase_c7,
2810}
2811},
2812.unlock= spi_disable_blockprotect,
2813.write= spi_chip_write_256,
2814.read= spi_chip_read,
2815.voltage= {2700, 3600},
2816},
2817
2818{
2819.vendor= "Eon",
2820.name= "EN25B16T",
2821.bustype= BUS_SPI,
2822.manufacture_id= EON_ID_NOPREFIX,
2823.model_id= EON_EN25B16,
2824.total_size= 2048,
2825.page_size= 256,
2826.tested= TEST_UNTESTED,
2827.probe= probe_spi_rdid,
2828.probe_timing= TIMING_ZERO,
2829.block_erasers=
2830{
2831{
2832.eraseblocks = {
2833{64 * 1024, 31},
2834{32 * 1024, 1},
2835{16 * 1024, 1},
2836{8 * 1024, 1},
2837{4 * 1024, 2},
2838},
2839.block_erase = spi_block_erase_d8,
2840}, {
2841.eraseblocks = { {2 * 1024 * 1024, 1} },
2842.block_erase = spi_block_erase_c7,
2843}
2844},
2845.unlock= spi_disable_blockprotect,
2846.write= spi_chip_write_256,
2847.read= spi_chip_read,
2848.voltage= {2700, 3600},
2849},
2850
2851{
2852.vendor= "Eon",
2853.name= "EN25B32",
2854.bustype= BUS_SPI,
2855.manufacture_id= EON_ID_NOPREFIX,
2856.model_id= EON_EN25B32,
2857.total_size= 4096,
2858.page_size= 256,
2859.tested= TEST_UNTESTED,
2860.probe= probe_spi_rdid,
2861.probe_timing= TIMING_ZERO,
2862.block_erasers=
2863{
2864{
2865.eraseblocks = {
2866{4 * 1024, 2},
2867{8 * 1024, 1},
2868{16 * 1024, 1},
2869{32 * 1024, 1},
2870{64 * 1024, 63},
2871},
2872.block_erase = spi_block_erase_d8,
2873}, {
2874.eraseblocks = { {4 * 1024 * 1024, 1} },
2875.block_erase = spi_block_erase_c7,
2876}
2877},
2878.unlock= spi_disable_blockprotect,
2879.write= spi_chip_write_256,
2880.read= spi_chip_read,
2881.voltage= {2700, 3600},
2882},
2883
2884{
2885.vendor= "Eon",
2886.name= "EN25B32T",
2887.bustype= BUS_SPI,
2888.manufacture_id= EON_ID_NOPREFIX,
2889.model_id= EON_EN25B32,
2890.total_size= 4096,
2891.page_size= 256,
2892.tested= TEST_UNTESTED,
2893.probe= probe_spi_rdid,
2894.probe_timing= TIMING_ZERO,
2895.block_erasers=
2896{
2897{
2898.eraseblocks = {
2899{64 * 1024, 63},
2900{32 * 1024, 1},
2901{16 * 1024, 1},
2902{8 * 1024, 1},
2903{4 * 1024, 2},
2904},
2905.block_erase = spi_block_erase_d8,
2906}, {
2907.eraseblocks = { {4 * 1024 * 1024, 1} },
2908.block_erase = spi_block_erase_c7,
2909}
2910},
2911.unlock= spi_disable_blockprotect,
2912.write= spi_chip_write_256,
2913.read= spi_chip_read,
2914.voltage= {2700, 3600},
2915},
2916
2917{
2918.vendor= "Eon",
2919.name= "EN25B64",
2920.bustype= BUS_SPI,
2921.manufacture_id= EON_ID_NOPREFIX,
2922.model_id= EON_EN25B64,
2923.total_size= 8192,
2924.page_size= 256,
2925.feature_bits= FEATURE_WRSR_WREN,
2926.tested= TEST_UNTESTED,
2927.probe= probe_spi_rdid,
2928.probe_timing= TIMING_ZERO,
2929.block_erasers=
2930{
2931{
2932.eraseblocks = {
2933{4 * 1024, 2},
2934{8 * 1024, 1},
2935{16 * 1024, 1},
2936{32 * 1024, 1},
2937{64 * 1024, 127},
2938},
2939.block_erase = spi_block_erase_d8,
2940}, {
2941.eraseblocks = { {8 * 1024 * 1024, 1} },
2942.block_erase = spi_block_erase_c7,
2943}
2944},
2945.unlock= spi_disable_blockprotect,
2946.write= spi_chip_write_256,
2947.read= spi_chip_read,
2948.voltage= {2700, 3600},
2949},
2950
2951{
2952.vendor= "Eon",
2953.name= "EN25B64T",
2954.bustype= BUS_SPI,
2955.manufacture_id= EON_ID_NOPREFIX,
2956.model_id= EON_EN25B64,
2957.total_size= 8192,
2958.page_size= 256,
2959.tested= TEST_UNTESTED,
2960.probe= probe_spi_rdid,
2961.probe_timing= TIMING_ZERO,
2962.block_erasers=
2963{
2964{
2965.eraseblocks = {
2966{64 * 1024, 127},
2967{32 * 1024, 1},
2968{16 * 1024, 1},
2969{8 * 1024, 1},
2970{4 * 1024, 2},
2971},
2972.block_erase = spi_block_erase_d8,
2973}, {
2974.eraseblocks = { {8 * 1024 * 1024, 1} },
2975.block_erase = spi_block_erase_c7,
2976}
2977},
2978.unlock= spi_disable_blockprotect,
2979.write= spi_chip_write_256,
2980.read= spi_chip_read,
2981.voltage= {2700, 3600},
2982},
2983
2984{
2985.vendor= "Eon",
2986.name= "EN25F05",
2987.bustype= BUS_SPI,
2988.manufacture_id= EON_ID_NOPREFIX,
2989.model_id= EON_EN25F05,
2990.total_size= 64,
2991.page_size= 256,
2992.feature_bits= FEATURE_WRSR_WREN,
2993.tested= TEST_UNTESTED,
2994.probe= probe_spi_rdid,
2995.probe_timing= TIMING_ZERO,
2996.block_erasers=
2997{
2998{
2999.eraseblocks = { {4 * 1024, 16} },
3000.block_erase = spi_block_erase_20,
3001}, {
3002.eraseblocks = { {32 * 1024, 2} },
3003.block_erase = spi_block_erase_d8,
3004}, {
3005.eraseblocks = { {32 * 1024, 2} },
3006.block_erase = spi_block_erase_52,
3007}, {
3008.eraseblocks = { {64 * 1024, 1} },
3009.block_erase = spi_block_erase_60,
3010}, {
3011.eraseblocks = { {64 * 1024, 1} },
3012.block_erase = spi_block_erase_c7,
3013}
3014},
3015.unlock= spi_disable_blockprotect,
3016.write= spi_chip_write_256,
3017.read= spi_chip_read,
3018.voltage= {2700, 3600},
3019},
3020
3021{
3022.vendor= "Eon",
3023.name= "EN25F10",
3024.bustype= BUS_SPI,
3025.manufacture_id= EON_ID_NOPREFIX,
3026.model_id= EON_EN25F10,
3027.total_size= 128,
3028.page_size= 256,
3029.feature_bits= FEATURE_WRSR_WREN,
3030.tested= TEST_UNTESTED,
3031.probe= probe_spi_rdid,
3032.probe_timing= TIMING_ZERO,
3033.block_erasers=
3034{
3035{
3036.eraseblocks = { {4 * 1024, 32} },
3037.block_erase = spi_block_erase_20,
3038}, {
3039.eraseblocks = { {32 * 1024, 4} },
3040.block_erase = spi_block_erase_d8,
3041}, {
3042.eraseblocks = { {32 * 1024, 4} },
3043.block_erase = spi_block_erase_52,
3044}, {
3045.eraseblocks = { {128 * 1024, 1} },
3046.block_erase = spi_block_erase_60,
3047}, {
3048.eraseblocks = { {128 * 1024, 1} },
3049.block_erase = spi_block_erase_c7,
3050}
3051},
3052.unlock= spi_disable_blockprotect,
3053.write= spi_chip_write_256,
3054.read= spi_chip_read,
3055.voltage= {2700, 3600},
3056},
3057
3058{
3059.vendor= "Eon",
3060.name= "EN25F20",
3061.bustype= BUS_SPI,
3062.manufacture_id= EON_ID_NOPREFIX,
3063.model_id= EON_EN25F20,
3064.total_size= 256,
3065.page_size= 256,
3066.feature_bits= FEATURE_WRSR_WREN,
3067.tested= TEST_UNTESTED,
3068.probe= probe_spi_rdid,
3069.probe_timing= TIMING_ZERO,
3070.block_erasers=
3071{
3072{
3073.eraseblocks = { {4 * 1024, 64} },
3074.block_erase = spi_block_erase_20,
3075}, {
3076.eraseblocks = { {64 * 1024, 4} },
3077.block_erase = spi_block_erase_d8,
3078}, {
3079.eraseblocks = { {64 * 1024, 4} },
3080.block_erase = spi_block_erase_52,
3081}, {
3082.eraseblocks = { {256 * 1024, 1} },
3083.block_erase = spi_block_erase_60,
3084}, {
3085.eraseblocks = { {256 * 1024, 1} },
3086.block_erase = spi_block_erase_c7,
3087}
3088},
3089.unlock= spi_disable_blockprotect,
3090.write= spi_chip_write_256,
3091.read= spi_chip_read,
3092.voltage= {2700, 3600},
3093},
3094
3095{
3096.vendor= "Eon",
3097.name= "EN25F40",
3098.bustype= BUS_SPI,
3099.manufacture_id= EON_ID_NOPREFIX,
3100.model_id= EON_EN25F40,
3101.total_size= 512,
3102.page_size= 256,
3103.feature_bits= FEATURE_WRSR_WREN,
3104.tested= TEST_OK_PROBE,
3105.probe= probe_spi_rdid,
3106.probe_timing= TIMING_ZERO,
3107.block_erasers=
3108{
3109{
3110.eraseblocks = { {4 * 1024, 128} },
3111.block_erase = spi_block_erase_20,
3112}, {
3113.eraseblocks = { {64 * 1024, 8} },
3114.block_erase = spi_block_erase_d8,
3115}, {
3116.eraseblocks = { {512 * 1024, 1} },
3117.block_erase = spi_block_erase_60,
3118}, {
3119.eraseblocks = { {512 * 1024, 1} },
3120.block_erase = spi_block_erase_c7,
3121},
3122},
3123.unlock= spi_disable_blockprotect,
3124.write= spi_chip_write_256,
3125.read= spi_chip_read,
3126.voltage= {2700, 3600},
3127},
3128
3129{
3130.vendor= "Eon",
3131.name= "EN25F80",
3132.bustype= BUS_SPI,
3133.manufacture_id= EON_ID_NOPREFIX,
3134.model_id= EON_EN25F80,
3135.total_size= 1024,
3136.page_size= 256,
3137.feature_bits= FEATURE_WRSR_WREN,
3138.tested= TEST_OK_PREW,
3139.probe= probe_spi_rdid,
3140.probe_timing= TIMING_ZERO,
3141.block_erasers=
3142{
3143{
3144.eraseblocks = { {4 * 1024, 256} },
3145.block_erase = spi_block_erase_20,
3146}, {
3147.eraseblocks = { {64 * 1024, 16} },
3148.block_erase = spi_block_erase_d8,
3149}, {
3150.eraseblocks = { {1024 * 1024, 1} },
3151.block_erase = spi_block_erase_60,
3152}, {
3153.eraseblocks = { {1024 * 1024, 1} },
3154.block_erase = spi_block_erase_c7,
3155}
3156},
3157.unlock= spi_disable_blockprotect,
3158.write= spi_chip_write_256,
3159.read= spi_chip_read,
3160.voltage= {2700, 3600},
3161},
3162
3163{
3164.vendor= "Eon",
3165.name= "EN25F16",
3166.bustype= BUS_SPI,
3167.manufacture_id= EON_ID_NOPREFIX,
3168.model_id= EON_EN25F16,
3169.total_size= 2048,
3170.page_size= 256,
3171.feature_bits= FEATURE_WRSR_WREN,
3172.tested= TEST_OK_PREW,
3173.probe= probe_spi_rdid,
3174.probe_timing= TIMING_ZERO,
3175.block_erasers=
3176{
3177{
3178.eraseblocks = { {4 * 1024, 512} },
3179.block_erase = spi_block_erase_20,
3180}, {
3181.eraseblocks = { {64 * 1024, 32} },
3182.block_erase = spi_block_erase_d8,
3183}, {
3184.eraseblocks = { {2 * 1024 * 1024, 1} },
3185.block_erase = spi_block_erase_60,
3186}, {
3187.eraseblocks = { {2 * 1024 * 1024, 1} },
3188.block_erase = spi_block_erase_c7,
3189}
3190},
3191.unlock= spi_disable_blockprotect,
3192.write= spi_chip_write_256,
3193.read= spi_chip_read,
3194.voltage= {2700, 3600},
3195},
3196
3197{
3198.vendor= "Eon",
3199.name= "EN25F32",
3200.bustype= BUS_SPI,
3201.manufacture_id= EON_ID_NOPREFIX,
3202.model_id= EON_EN25F32,
3203.total_size= 4096,
3204.page_size= 256,
3205.feature_bits= FEATURE_WRSR_WREN,
3206.tested= TEST_UNTESTED,
3207.probe= probe_spi_rdid,
3208.probe_timing= TIMING_ZERO,
3209.block_erasers=
3210{
3211{
3212.eraseblocks = { {4 * 1024, 1024} },
3213.block_erase = spi_block_erase_20,
3214}, {
3215.eraseblocks = { {64 * 1024, 64} },
3216.block_erase = spi_block_erase_d8,
3217}, {
3218.eraseblocks = { {4 * 1024 * 1024, 1} },
3219.block_erase = spi_block_erase_60,
3220}, {
3221.eraseblocks = { {4 * 1024 * 1024, 1} },
3222.block_erase = spi_block_erase_c7,
3223}
3224},
3225.unlock= spi_disable_blockprotect,
3226.write= spi_chip_write_256,
3227.read= spi_chip_read,
3228.voltage= {2700, 3600},
3229},
3230
3231{
3232.vendor= "Eon",
3233.name= "EN25Q40",
3234.bustype= BUS_SPI,
3235.manufacture_id= EON_ID_NOPREFIX,
3236.model_id= EON_EN25Q40,
3237.total_size= 512,
3238.page_size= 256,
3239/* TODO: chip features 256-byte one-time programmable region */
3240.feature_bits= FEATURE_WRSR_WREN,
3241.tested= TEST_UNTESTED,
3242.probe= probe_spi_rdid,
3243.probe_timing= TIMING_ZERO,
3244.block_erasers=
3245{
3246{
3247.eraseblocks = { {4 * 1024, 128} },
3248.block_erase = spi_block_erase_20,
3249}, {
3250.eraseblocks = { {64 * 1024, 8} },
3251.block_erase = spi_block_erase_d8,
3252}, {
3253.eraseblocks = { {512 * 1024, 1} },
3254.block_erase = spi_block_erase_60,
3255}, {
3256.eraseblocks = { {512 * 1024, 1} },
3257.block_erase = spi_block_erase_c7,
3258}
3259},
3260.unlock= spi_disable_blockprotect,
3261.write= spi_chip_write_256,
3262.read= spi_chip_read,
3263.voltage = {2700, 3600},
3264},
3265
3266{
3267.vendor= "Eon",
3268.name= "EN25Q80(A)",
3269.bustype= BUS_SPI,
3270.manufacture_id= EON_ID_NOPREFIX,
3271.model_id= EON_EN25Q80,
3272.total_size= 1024,
3273.page_size= 256,
3274/* TODO: chip features 256-byte one-time programmable region */
3275.feature_bits= FEATURE_WRSR_WREN,
3276.tested= TEST_UNTESTED,
3277.probe= probe_spi_rdid,
3278.probe_timing= TIMING_ZERO,
3279.block_erasers=
3280{
3281{
3282.eraseblocks = { {4 * 1024, 256} },
3283.block_erase = spi_block_erase_20,
3284}, {
3285.eraseblocks = { {64 * 1024, 16} },
3286.block_erase = spi_block_erase_d8,
3287}, {
3288.eraseblocks = { {1024 * 1024, 1} },
3289.block_erase = spi_block_erase_60,
3290}, {
3291.eraseblocks = { {1024 * 1024, 1} },
3292.block_erase = spi_block_erase_c7,
3293}
3294},
3295.unlock= spi_disable_blockprotect,
3296.write= spi_chip_write_256,
3297.read= spi_chip_read,
3298.voltage = {2700, 3600},
3299},
3300
3301{
3302/* Note: EN25D16 is an evil twin which shares the model ID
3303 but has different write protection capabilities */
3304.vendor= "Eon",
3305.name= "EN25Q16",
3306.bustype= BUS_SPI,
3307.manufacture_id= EON_ID_NOPREFIX,
3308.model_id= EON_EN25Q16,
3309.total_size= 2048,
3310.page_size= 256,
3311/* TODO: EN25D16 features 512-byte one-time programmable region,
3312 * EN25Q16 features a 128-byte one-time programmable region */
3313.feature_bits= FEATURE_WRSR_WREN,
3314.tested= TEST_UNTESTED,
3315.probe= probe_spi_rdid,
3316.probe_timing= TIMING_ZERO,
3317.block_erasers=
3318{
3319{
3320.eraseblocks = { {4 * 1024, 512} },
3321.block_erase = spi_block_erase_20,
3322}, {
3323.eraseblocks = { {64 * 1024, 32} },
3324.block_erase = spi_block_erase_d8,
3325}, {
3326/* not supported by Q16 version */
3327.eraseblocks = { {64 * 1024, 32} },
3328.block_erase = spi_block_erase_52,
3329}, {
3330.eraseblocks = { {2 * 1024 * 1024, 1} },
3331.block_erase = spi_block_erase_60,
3332}, {
3333.eraseblocks = { {2 * 1024 * 1024, 1} },
3334.block_erase = spi_block_erase_c7,
3335}
3336},
3337.unlock= spi_disable_blockprotect,
3338.write= spi_chip_write_256,
3339.read= spi_chip_read,
3340.voltage= {2700, 3600},
3341},
3342
3343{
3344.vendor= "Eon",
3345.name= "EN25Q32(A/B)",
3346.bustype= BUS_SPI,
3347.manufacture_id= EON_ID_NOPREFIX,
3348.model_id= EON_EN25Q32,
3349.total_size= 4096,
3350.page_size= 256,
3351/* TODO: chip features 512-byte one-time programmable region */
3352.feature_bits= FEATURE_WRSR_WREN,
3353.tested= TEST_UNTESTED,
3354.probe= probe_spi_rdid,
3355.probe_timing= TIMING_ZERO,
3356.block_erasers=
3357{
3358{
3359.eraseblocks = { {4 * 1024, 1024} },
3360.block_erase = spi_block_erase_20,
3361}, {
3362.eraseblocks = { {64 * 1024, 64} },
3363.block_erase = spi_block_erase_d8,
3364}, {
3365.eraseblocks = { {4 * 1024 * 1024, 1} },
3366.block_erase = spi_block_erase_60,
3367}, {
3368.eraseblocks = { {4 * 1024 * 1024, 1} },
3369.block_erase = spi_block_erase_c7,
3370}
3371},
3372.unlock= spi_disable_blockprotect,
3373.write= spi_chip_write_256,
3374.read= spi_chip_read,
3375.voltage = {2700, 3600},
3376},
3377
3378{
3379.vendor= "Eon",
3380.name= "EN25Q64",
3381.bustype= BUS_SPI,
3382.manufacture_id= EON_ID_NOPREFIX,
3383.model_id= EON_EN25Q64,
3384.total_size= 8192,
3385.page_size= 256,
3386/* TODO: chip features 512-byte one-time programmable region */
3387.feature_bits= FEATURE_WRSR_WREN,
3388.tested= TEST_UNTESTED,
3389.probe= probe_spi_rdid,
3390.probe_timing= TIMING_ZERO,
3391.block_erasers=
3392{
3393{
3394.eraseblocks = { {4 * 1024, 2048} },
3395.block_erase = spi_block_erase_20,
3396}, {
3397.eraseblocks = { {64 * 1024, 128} },
3398.block_erase = spi_block_erase_d8,
3399}, {
3400.eraseblocks = { {8 * 1024 * 1024, 1} },
3401.block_erase = spi_block_erase_60,
3402}, {
3403.eraseblocks = { {8 * 1024 * 1024, 1} },
3404.block_erase = spi_block_erase_c7,
3405}
3406},
3407.unlock= spi_disable_blockprotect,
3408.write= spi_chip_write_256,
3409.read= spi_chip_read,
3410.voltage = {2700, 3600},
3411},
3412
3413{
3414.vendor= "Eon",
3415.name= "EN25Q128",
3416.bustype= BUS_SPI,
3417.manufacture_id= EON_ID_NOPREFIX,
3418.model_id= EON_EN25Q128,
3419.total_size= 16384,
3420.page_size= 256,
3421/* TODO: chip features 512-byte one-time programmable region */
3422.feature_bits= FEATURE_WRSR_WREN,
3423.tested= TEST_UNTESTED,
3424.probe= probe_spi_rdid,
3425.probe_timing= TIMING_ZERO,
3426.block_erasers=
3427{
3428{
3429.eraseblocks = { {4 * 1024, 4096} },
3430.block_erase = spi_block_erase_20,
3431}, {
3432.eraseblocks = { {64 * 1024, 256} },
3433.block_erase = spi_block_erase_d8,
3434}, {
3435.eraseblocks = { {16 * 1024 * 1024, 1} },
3436.block_erase = spi_block_erase_60,
3437}, {
3438.eraseblocks = { {16 * 1024 * 1024, 1} },
3439.block_erase = spi_block_erase_c7,
3440}
3441},
3442.unlock= spi_disable_blockprotect,
3443.write= spi_chip_write_256,
3444.read= spi_chip_read,
3445},
3446
3447{
3448.vendor= "Eon",
3449.name= "EN25QH16",
3450.bustype= BUS_SPI,
3451.manufacture_id= EON_ID_NOPREFIX,
3452.model_id= EON_EN25QH16,
3453.total_size= 2048,
3454.page_size= 256,
3455/* TODO: chip features 512-byte one-time programmable region
3456 * and supports SFDP.
3457 */
3458.feature_bits= FEATURE_WRSR_WREN,
3459.tested= TEST_UNTESTED,
3460.probe= probe_spi_rdid,
3461.probe_timing= TIMING_ZERO,
3462.block_erasers=
3463{
3464{
3465.eraseblocks = { {4 * 1024, 512} },
3466.block_erase = spi_block_erase_20,
3467}, {
3468.eraseblocks = { {64 * 1024, 32} },
3469.block_erase = spi_block_erase_d8,
3470}, {
3471.eraseblocks = { {1024 * 2048, 1} },
3472.block_erase = spi_block_erase_60,
3473}, {
3474.eraseblocks = { {1024 * 2048, 1} },
3475.block_erase = spi_block_erase_c7,
3476}
3477},
3478.unlock= spi_disable_blockprotect,
3479.write= spi_chip_write_256,
3480.read= spi_chip_read,
3481.voltage = {2700, 3600},
3482},
3483
3484{
3485.vendor= "Eon",
3486.name= "EN29F010",
3487.bustype= BUS_PARALLEL,
3488.manufacture_id= EON_ID,
3489.model_id= EON_EN29F010,
3490.total_size= 128,
3491.page_size= 128,
3492.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3493.tested= TEST_OK_PRE,
3494.probe= probe_jedec,
3495.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3496.block_erasers=
3497{
3498{
3499.eraseblocks = { {16 * 1024, 8} },
3500.block_erase = erase_sector_jedec,
3501},
3502{
3503.eraseblocks = { {128 * 1024, 1} },
3504.block_erase = erase_chip_block_jedec,
3505},
3506},
3507.write= write_jedec_1,
3508.read= read_memmapped,
3509.voltage= {4500, 5500},
3510},
3511
3512{
3513.vendor= "Eon",
3514.name= "EN29F002(A)(N)B",
3515.bustype= BUS_PARALLEL,
3516.manufacture_id= EON_ID,
3517.model_id= EON_EN29F002B,
3518.total_size= 256,
3519.page_size= 256,
3520.feature_bits= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
3521.tested= TEST_OK_PR,
3522.probe= probe_jedec,
3523.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3524.block_erasers=
3525{
3526{
3527.eraseblocks = {
3528{16 * 1024, 1},
3529{8 * 1024, 2},
3530{32 * 1024, 1},
3531{64 * 1024, 3},
3532},
3533.block_erase = erase_sector_jedec,
3534}, {
3535.eraseblocks = { {256 * 1024, 1} },
3536.block_erase = erase_chip_block_jedec,
3537},
3538},
3539.write= write_jedec_1,
3540.read= read_memmapped,
3541.voltage= {4500, 5500},
3542},
3543
3544{
3545.vendor= "Eon",
3546.name= "EN29F002(A)(N)T",
3547.bustype= BUS_PARALLEL,
3548.manufacture_id= EON_ID,
3549.model_id= EON_EN29F002T,
3550.total_size= 256,
3551.page_size= 256,
3552.feature_bits= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
3553.tested= TEST_OK_PREW,
3554.probe= probe_jedec,
3555.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3556.block_erasers=
3557{
3558{
3559.eraseblocks = {
3560{64 * 1024, 3},
3561{32 * 1024, 1},
3562{8 * 1024, 2},
3563{16 * 1024, 1},
3564},
3565.block_erase = erase_sector_jedec,
3566}, {
3567.eraseblocks = { {256 * 1024, 1} },
3568.block_erase = erase_chip_block_jedec,
3569},
3570},
3571.write= write_jedec_1,
3572.read= read_memmapped,
3573.voltage= {4500, 5500},
3574},
3575
3576{
3577.vendor= "Fujitsu",
3578.name= "MBM29F004BC",
3579.bustype= BUS_PARALLEL,
3580.manufacture_id= FUJITSU_ID,
3581.model_id= FUJITSU_MBM29F004BC,
3582.total_size= 512,
3583.page_size= 64 * 1024,
3584.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3585.tested= TEST_UNTESTED,
3586.probe= probe_jedec,
3587.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3588.block_erasers=
3589{
3590{
3591.eraseblocks = {
3592{16 * 1024, 1},
3593{8 * 1024, 2},
3594{32 * 1024, 1},
3595{64 * 1024, 7},
3596},
3597.block_erase = erase_sector_jedec,
3598}, {
3599.eraseblocks = { {512 * 1024, 1} },
3600.block_erase = erase_chip_block_jedec,
3601},
3602},
3603.write= NULL,
3604.read= read_memmapped,
3605.voltage= {4500, 5500},
3606},
3607
3608{
3609.vendor= "Fujitsu",
3610.name= "MBM29F004TC",
3611.bustype= BUS_PARALLEL,
3612.manufacture_id= FUJITSU_ID,
3613.model_id= FUJITSU_MBM29F004TC,
3614.total_size= 512,
3615.page_size= 64 * 1024,
3616.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3617.tested= TEST_UNTESTED,
3618.probe= probe_jedec,
3619.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3620.block_erasers=
3621{
3622{
3623.eraseblocks = {
3624{64 * 1024, 7},
3625{32 * 1024, 1},
3626{8 * 1024, 2},
3627{16 * 1024, 1},
3628},
3629.block_erase = erase_sector_jedec,
3630}, {
3631.eraseblocks = { {512 * 1024, 1} },
3632.block_erase = erase_chip_block_jedec,
3633},
3634},
3635.write= NULL,
3636.read= read_memmapped,
3637.voltage= {4500, 5500},
3638},
3639
3640{
3641/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
3642.vendor= "Fujitsu",
3643.name= "MBM29F400BC",
3644.bustype= BUS_PARALLEL,
3645.manufacture_id= FUJITSU_ID,
3646.model_id= FUJITSU_MBM29F400BC,
3647.total_size= 512,
3648.page_size= 64 * 1024,
3649.feature_bits= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
3650.tested= TEST_UNTESTED,
3651.probe= probe_m29f400bt,
3652.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
3653.block_erasers=
3654{
3655{
3656.eraseblocks = {
3657{16 * 1024, 1},
3658{8 * 1024, 2},
3659{32 * 1024, 1},
3660{64 * 1024, 7},
3661},
3662.block_erase = block_erase_m29f400bt,
3663}, {
3664.eraseblocks = { {512 * 1024, 1} },
3665.block_erase = block_erase_chip_m29f400bt,
3666},
3667},
3668.write= write_m29f400bt,
3669.read= read_memmapped,
3670.voltage= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3671},
3672
3673{
3674.vendor= "Fujitsu",
3675.name= "MBM29F400TC",
3676.bustype= BUS_PARALLEL,
3677.manufacture_id= FUJITSU_ID,
3678.model_id= FUJITSU_MBM29F400TC,
3679.total_size= 512,
3680.page_size= 64 * 1024,
3681.feature_bits= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
3682.tested= TEST_UNTESTED,
3683.probe= probe_m29f400bt,
3684.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
3685.block_erasers=
3686{
3687{
3688.eraseblocks = {
3689{64 * 1024, 7},
3690{32 * 1024, 1},
3691{8 * 1024, 2},
3692{16 * 1024, 1},
3693},
3694.block_erase = block_erase_m29f400bt,
3695}, {
3696.eraseblocks = { {512 * 1024, 1} },
3697.block_erase = block_erase_chip_m29f400bt,
3698},
3699},
3700.write= write_m29f400bt,
3701.read= read_memmapped,
3702.voltage= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3703},
3704
3705{
3706.vendor= "Hyundai",
3707.name= "HY29F002T",
3708.bustype= BUS_PARALLEL,
3709.manufacture_id= HYUNDAI_ID,
3710.model_id= HYUNDAI_HY29F002T,
3711.total_size= 256,
3712.page_size= 256 * 1024,
3713.feature_bits= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3714.tested= TEST_OK_PRE,
3715.probe= probe_jedec,
3716.probe_timing= TIMING_ZERO, /* Datasheet has no timing info specified */
3717.block_erasers=
3718{
3719{
3720.eraseblocks = {
3721{64 * 1024, 3},
3722{32 * 1024, 1},
3723{8 * 1024, 2},
3724{16 * 1024, 1},
3725},
3726.block_erase = erase_sector_jedec,
3727}, {
3728.eraseblocks = { {256 * 1024, 1} },
3729.block_erase = erase_chip_block_jedec,
3730},
3731},
3732.write= write_jedec_1,
3733.read= read_memmapped,
3734.voltage= {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
3735},
3736
3737{
3738.vendor= "Hyundai",
3739.name= "HY29F002B",
3740.bustype= BUS_PARALLEL,
3741.manufacture_id= HYUNDAI_ID,
3742.model_id= HYUNDAI_HY29F002B,
3743.total_size= 256,
3744.page_size= 256 * 1024,
3745.feature_bits= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
3746.tested= TEST_UNTESTED,
3747.probe= probe_jedec,
3748.probe_timing= TIMING_ZERO, /* Datasheet has no timing info specified */
3749.block_erasers=
3750{
3751{
3752.eraseblocks = {
3753{16 * 1024, 1},
3754{8 * 1024, 2},
3755{32 * 1024, 1},
3756{64 * 1024, 3},
3757},
3758.block_erase = erase_sector_jedec,
3759}, {
3760.eraseblocks = { {256 * 1024, 1} },
3761.block_erase = erase_chip_block_jedec,
3762},
3763},
3764.write= write_jedec_1,
3765.read= read_memmapped,
3766.voltage= {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
3767},
3768
3769{
3770.vendor= "Hyundai",
3771.name= "HY29F040A",
3772.bustype= BUS_PARALLEL,
3773.manufacture_id= HYUNDAI_ID,
3774.model_id= HYUNDAI_HY29F040A,
3775.total_size= 512,
3776.page_size= 64 * 1024,
3777.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3778.tested= TEST_UNTESTED,
3779.probe= probe_jedec,
3780.probe_timing= TIMING_ZERO,
3781.block_erasers=
3782{
3783{
3784.eraseblocks = { {64 * 1024, 8} },
3785.block_erase = erase_sector_jedec,
3786}, {
3787.eraseblocks = { {512 * 1024, 1} },
3788.block_erase = erase_chip_block_jedec,
3789},
3790},
3791.write= write_jedec_1,
3792.read= read_memmapped,
3793.voltage= {4500, 5500},
3794},
3795
3796{
3797.vendor= "Intel",
3798.name= "28F001BN/BX-B",
3799.bustype= BUS_PARALLEL,
3800.manufacture_id= INTEL_ID,
3801.model_id= INTEL_28F001B,
3802.total_size= 128,
3803.page_size= 128 * 1024, /* 8k + 2x4k + 112k */
3804.tested= TEST_UNTESTED,
3805.probe= probe_jedec,
3806.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3807.block_erasers=
3808{
3809{
3810.eraseblocks = {
3811{8 * 1024, 1},
3812{4 * 1024, 2},
3813{112 * 1024, 1},
3814},
3815.block_erase = erase_block_82802ab,
3816},
3817},
3818.write= write_82802ab,
3819.read= read_memmapped,
3820.voltage= {4500, 5500},
3821},
3822
3823{
3824.vendor= "Intel",
3825.name= "28F001BN/BX-T",
3826.bustype= BUS_PARALLEL,
3827.manufacture_id= INTEL_ID,
3828.model_id= INTEL_28F001T,
3829.total_size= 128,
3830.page_size= 128 * 1024, /* 112k + 2x4k + 8k */
3831.tested= TEST_OK_PR,
3832.probe= probe_jedec,
3833.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3834.block_erasers=
3835{
3836{
3837.eraseblocks = {
3838{112 * 1024, 1},
3839{4 * 1024, 2},
3840{8 * 1024, 1},
3841},
3842.block_erase = erase_block_82802ab,
3843},
3844},
3845.write= write_82802ab,
3846.read= read_memmapped,
3847.voltage= {4500, 5500},
3848},
3849
3850{
3851.vendor= "Intel",
3852.name= "28F002BC/BL/BV/BX-T",
3853.bustype= BUS_PARALLEL,
3854.manufacture_id= INTEL_ID,
3855.model_id= INTEL_28F002T,
3856.total_size= 256,
3857.page_size= 256 * 1024,
3858.tested= TEST_OK_PRE,
3859.probe= probe_82802ab,
3860.probe_timing= TIMING_ZERO, /* Datasheet has no timing info specified */
3861.block_erasers=
3862{
3863{
3864.eraseblocks = {
3865{128 * 1024, 1},
3866{96 * 1024, 1},
3867{8 * 1024, 2},
3868{16 * 1024, 1},
3869},
3870.block_erase = erase_block_82802ab,
3871},
3872},
3873.write= write_82802ab,
3874.read= read_memmapped,
3875},
3876
3877{
3878.vendor= "Intel",
3879.name= "28F008S3/S5/SC",
3880.bustype= BUS_PARALLEL,
3881.manufacture_id= INTEL_ID,
3882.model_id= INTEL_28F004S3,
3883.total_size= 512,
3884.page_size= 256,
3885.tested= TEST_UNTESTED,
3886.probe= probe_82802ab,
3887.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3888.block_erasers=
3889{
3890{
3891.eraseblocks = { {64 * 1024, 8} },
3892.block_erase = erase_block_82802ab,
3893},
3894},
3895.unlock= unlock_28f004s5,
3896.write= write_82802ab,
3897.read= read_memmapped,
3898},
3899
3900{
3901.vendor= "Intel",
3902.name= "28F004B5/BE/BV/BX-B",
3903.bustype= BUS_PARALLEL,
3904.manufacture_id= INTEL_ID,
3905.model_id= INTEL_28F004B,
3906.total_size= 512,
3907.page_size= 128 * 1024, /* maximal block size */
3908.tested= TEST_UNTESTED,
3909.probe= probe_82802ab,
3910.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3911.block_erasers=
3912{
3913{
3914.eraseblocks = {
3915{16 * 1024, 1},
3916{8 * 1024, 2},
3917{96 * 1024, 1},
3918{128 * 1024, 3},
3919},
3920.block_erase = erase_block_82802ab,
3921},
3922},
3923.write= write_82802ab,
3924.read= read_memmapped,
3925},
3926
3927{
3928.vendor= "Intel",
3929.name= "28F004B5/BE/BV/BX-T",
3930.bustype= BUS_PARALLEL,
3931.manufacture_id= INTEL_ID,
3932.model_id= INTEL_28F004T,
3933.total_size= 512,
3934.page_size= 128 * 1024, /* maximal block size */
3935.tested= TEST_UNTESTED,
3936.probe= probe_82802ab,
3937.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3938.block_erasers=
3939{
3940{
3941.eraseblocks = {
3942{128 * 1024, 3},
3943{96 * 1024, 1},
3944{8 * 1024, 2},
3945{16 * 1024, 1},
3946},
3947.block_erase = erase_block_82802ab,
3948},
3949},
3950.write= write_82802ab,
3951.read= read_memmapped,
3952},
3953
3954{
3955.vendor= "Intel",
3956.name= "28F400BV/BX/CE/CV-B",
3957.bustype= BUS_PARALLEL,
3958.manufacture_id= INTEL_ID,
3959.model_id= INTEL_28F400B,
3960.total_size= 512,
3961.page_size= 128 * 1024, /* maximal block size */
3962.feature_bits= FEATURE_ADDR_SHIFTED,
3963.tested= TEST_UNTESTED,
3964.probe= probe_82802ab,
3965.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3966.block_erasers=
3967{
3968{
3969.eraseblocks = {
3970{16 * 1024, 1},
3971{8 * 1024, 2},
3972{96 * 1024, 1},
3973{128 * 1024, 3},
3974},
3975.block_erase = erase_block_82802ab,
3976},
3977},
3978.write= write_82802ab,
3979.read= read_memmapped,
3980},
3981
3982{
3983.vendor= "Intel",
3984.name= "28F400BV/BX/CE/CV-T",
3985.bustype= BUS_PARALLEL,
3986.manufacture_id= INTEL_ID,
3987.model_id= INTEL_28F400T,
3988.total_size= 512,
3989.page_size= 128 * 1024, /* maximal block size */
3990.feature_bits= FEATURE_ADDR_SHIFTED,
3991.tested= TEST_UNTESTED,
3992.probe= probe_82802ab,
3993.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
3994.block_erasers=
3995{
3996{
3997.eraseblocks = {
3998{128 * 1024, 3},
3999{96 * 1024, 1},
4000{8 * 1024, 2},
4001{16 * 1024, 1},
4002},
4003.block_erase = erase_block_82802ab,
4004},
4005},
4006.write= write_82802ab,
4007.read= read_memmapped,
4008},
4009
4010{
4011.vendor= "Intel",
4012.name= "82802AB",
4013.bustype= BUS_FWH,
4014.manufacture_id= INTEL_ID,
4015.model_id= INTEL_82802AB,
4016.total_size= 512,
4017.page_size= 64 * 1024,
4018.feature_bits= FEATURE_REGISTERMAP,
4019.tested= TEST_OK_PREW,
4020.probe= probe_82802ab,
4021.probe_timing= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
4022.block_erasers=
4023{
4024{
4025.eraseblocks = { {64 * 1024, 8} },
4026.block_erase = erase_block_82802ab,
4027},
4028},
4029.unlock= unlock_82802ab,
4030.write= write_82802ab,
4031.read= read_memmapped,
4032.voltage= {3000, 3600},
4033},
4034
4035{
4036.vendor= "Intel",
4037.name= "82802AC",
4038.bustype= BUS_FWH,
4039.manufacture_id= INTEL_ID,
4040.model_id= INTEL_82802AC,
4041.total_size= 1024,
4042.page_size= 64 * 1024,
4043.feature_bits= FEATURE_REGISTERMAP,
4044.tested= TEST_OK_PR,
4045.probe= probe_82802ab,
4046.probe_timing= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
4047.block_erasers=
4048{
4049{
4050.eraseblocks = { {64 * 1024, 16} },
4051.block_erase = erase_block_82802ab,
4052},
4053},
4054.unlock= unlock_82802ab,
4055.write= write_82802ab,
4056.read= read_memmapped,
4057.voltage= {3000, 3600},
4058},
4059
4060{
4061.vendor= "Macronix",
4062.name= "MX25L512",
4063.bustype= BUS_SPI,
4064.manufacture_id= MACRONIX_ID,
4065.model_id= MACRONIX_MX25L512,
4066.total_size= 64,
4067.page_size= 256,
4068.feature_bits= FEATURE_WRSR_WREN,
4069.tested= TEST_UNTESTED,
4070.probe= probe_spi_rdid,
4071.probe_timing= TIMING_ZERO,
4072.block_erasers=
4073{
4074{
4075.eraseblocks = { {4 * 1024, 16} },
4076.block_erase = spi_block_erase_20,
4077}, {
4078.eraseblocks = { {64 * 1024, 1} },
4079.block_erase = spi_block_erase_52,
4080}, {
4081.eraseblocks = { {64 * 1024, 1} },
4082.block_erase = spi_block_erase_d8,
4083}, {
4084.eraseblocks = { {64 * 1024, 1} },
4085.block_erase = spi_block_erase_60,
4086}, {
4087.eraseblocks = { {64 * 1024, 1} },
4088.block_erase = spi_block_erase_c7,
4089},
4090},
4091.unlock= spi_disable_blockprotect,
4092.write= spi_chip_write_256,
4093.read= spi_chip_read,
4094.voltage= {2700, 3600},
4095},
4096
4097{
4098.vendor= "Macronix",
4099.name= "MX25L1005",
4100.bustype= BUS_SPI,
4101.manufacture_id= MACRONIX_ID,
4102.model_id= MACRONIX_MX25L1005,
4103.total_size= 128,
4104.page_size= 256,
4105.feature_bits= FEATURE_WRSR_WREN,
4106.tested= TEST_UNTESTED,
4107.probe= probe_spi_rdid,
4108.probe_timing= TIMING_ZERO,
4109.block_erasers=
4110{
4111{
4112.eraseblocks = { {4 * 1024, 32} },
4113.block_erase = spi_block_erase_20,
4114}, {
4115.eraseblocks = { {64 * 1024, 2} },
4116.block_erase = spi_block_erase_d8,
4117}, {
4118.eraseblocks = { {128 * 1024, 1} },
4119.block_erase = spi_block_erase_60,
4120}, {
4121.eraseblocks = { {128 * 1024, 1} },
4122.block_erase = spi_block_erase_c7,
4123},
4124},
4125.unlock= spi_disable_blockprotect,
4126.write= spi_chip_write_256,
4127.read= spi_chip_read,
4128.voltage= {2700, 3600},
4129},
4130
4131{
4132.vendor= "Macronix",
4133.name= "MX25L2005",
4134.bustype= BUS_SPI,
4135.manufacture_id= MACRONIX_ID,
4136.model_id= MACRONIX_MX25L2005,
4137.total_size= 256,
4138.page_size= 256,
4139.feature_bits= FEATURE_WRSR_WREN,
4140.tested= TEST_UNTESTED,
4141.probe= probe_spi_rdid,
4142.probe_timing= TIMING_ZERO,
4143.block_erasers=
4144{
4145{
4146.eraseblocks = { {4 * 1024, 64} },
4147.block_erase = spi_block_erase_20,
4148}, {
4149.eraseblocks = { {64 * 1024, 4} },
4150.block_erase = spi_block_erase_52,
4151}, {
4152.eraseblocks = { {64 * 1024, 4} },
4153.block_erase = spi_block_erase_d8,
4154}, {
4155.eraseblocks = { {256 * 1024, 1} },
4156.block_erase = spi_block_erase_60,
4157}, {
4158.eraseblocks = { {256 * 1024, 1} },
4159.block_erase = spi_block_erase_c7,
4160},
4161},
4162.unlock= spi_disable_blockprotect,
4163.write= spi_chip_write_256,
4164.read= spi_chip_read,
4165.voltage= {2700, 3600},
4166},
4167
4168{
4169.vendor= "Macronix",
4170.name= "MX25L4005",
4171.bustype= BUS_SPI,
4172.manufacture_id= MACRONIX_ID,
4173.model_id= MACRONIX_MX25L4005,
4174.total_size= 512,
4175.page_size= 256,
4176.feature_bits= FEATURE_WRSR_WREN,
4177.tested= TEST_OK_PREW,
4178.probe= probe_spi_rdid,
4179.probe_timing= TIMING_ZERO,
4180.block_erasers=
4181{
4182{
4183.eraseblocks = { {4 * 1024, 128} },
4184.block_erase = spi_block_erase_20,
4185}, {
4186.eraseblocks = { {64 * 1024, 8} },
4187.block_erase = spi_block_erase_52,
4188}, {
4189.eraseblocks = { {64 * 1024, 8} },
4190.block_erase = spi_block_erase_d8,
4191}, {
4192.eraseblocks = { {512 * 1024, 1} },
4193.block_erase = spi_block_erase_60,
4194}, {
4195.eraseblocks = { {512 * 1024, 1} },
4196.block_erase = spi_block_erase_c7,
4197},
4198},
4199.unlock= spi_disable_blockprotect,
4200.write= spi_chip_write_256,
4201.read= spi_chip_read,
4202.voltage= {2700, 3600},
4203},
4204
4205{
4206.vendor= "Macronix",
4207.name= "MX25L8005",
4208.bustype= BUS_SPI,
4209.manufacture_id= MACRONIX_ID,
4210.model_id= MACRONIX_MX25L8005,
4211.total_size= 1024,
4212.page_size= 256,
4213.feature_bits= FEATURE_WRSR_WREN,
4214.tested= TEST_OK_PREW,
4215.probe= probe_spi_rdid,
4216.probe_timing= TIMING_ZERO,
4217.block_erasers=
4218{
4219{
4220.eraseblocks = { {4 * 1024, 256} },
4221.block_erase = spi_block_erase_20,
4222}, {
4223.eraseblocks = { {64 * 1024, 16} },
4224.block_erase = spi_block_erase_52,
4225}, {
4226.eraseblocks = { {64 * 1024, 16} },
4227.block_erase = spi_block_erase_d8,
4228}, {
4229.eraseblocks = { {1024 * 1024, 1} },
4230.block_erase = spi_block_erase_60,
4231}, {
4232.eraseblocks = { {1024 * 1024, 1} },
4233.block_erase = spi_block_erase_c7,
4234},
4235},
4236.unlock= spi_disable_blockprotect,
4237.write= spi_chip_write_256,
4238.read= spi_chip_read,
4239.voltage= {2700, 3600},
4240},
4241
4242{
4243.vendor= "Macronix",
4244.name= "MX25L1605",
4245.bustype= BUS_SPI,
4246.manufacture_id= MACRONIX_ID,
4247.model_id= MACRONIX_MX25L1605,
4248.total_size= 2048,
4249.page_size= 256,
4250.feature_bits= FEATURE_WRSR_WREN,
4251.tested= TEST_OK_PREW,
4252.probe= probe_spi_rdid,
4253.probe_timing= TIMING_ZERO,
4254.block_erasers=
4255{
4256{
4257.eraseblocks = { {4 * 1024, 512} },
4258.block_erase = spi_block_erase_20,/* This erase function has 64k blocksize for eLiteFlash */
4259}, {
4260.eraseblocks = { {64 * 1024, 32} },/* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
4261.block_erase = spi_block_erase_52,
4262}, {
4263.eraseblocks = { {64 * 1024, 32} },
4264.block_erase = spi_block_erase_d8,
4265}, {
4266.eraseblocks = { {2 * 1024 * 1024, 1} },
4267.block_erase = spi_block_erase_60,
4268}, {
4269.eraseblocks = { {2 * 1024 * 1024, 1} },
4270.block_erase = spi_block_erase_c7,
4271},
4272},
4273.unlock= spi_disable_blockprotect,
4274.write= spi_chip_write_256,
4275.read= spi_chip_read,
4276.voltage= {2700, 3600},
4277},
4278
4279{
4280.vendor= "Macronix",
4281.name= "MX25L1635D",
4282.bustype= BUS_SPI,
4283.manufacture_id= MACRONIX_ID,
4284.model_id= MACRONIX_MX25L1635D,
4285.total_size= 2048,
4286.page_size= 256,
4287.feature_bits= FEATURE_WRSR_WREN,
4288.tested= TEST_UNTESTED,
4289.probe= probe_spi_rdid,
4290.probe_timing= TIMING_ZERO,
4291.block_erasers=
4292{
4293{
4294.eraseblocks = { {4 * 1024, 512} },
4295.block_erase = spi_block_erase_20,
4296}, {
4297.eraseblocks = { {64 * 1024, 32} },
4298.block_erase = spi_block_erase_d8,
4299}, {
4300.eraseblocks = { {2 * 1024 * 1024, 1} },
4301.block_erase = spi_block_erase_60,
4302}, {
4303.eraseblocks = { {2 * 1024 * 1024, 1} },
4304.block_erase = spi_block_erase_c7,
4305}
4306},
4307.unlock= spi_disable_blockprotect,
4308.write= spi_chip_write_256,
4309.read= spi_chip_read,
4310.voltage= {2700, 3600},
4311},
4312
4313{
4314.vendor= "Macronix",
4315.name= "MX25L1635E",
4316.bustype= BUS_SPI,
4317.manufacture_id= MACRONIX_ID,
4318.model_id= MACRONIX_MX25L1635E,
4319.total_size= 2048,
4320.page_size= 256,
4321.feature_bits= FEATURE_WRSR_WREN,
4322.tested= TEST_UNTESTED,
4323.probe= probe_spi_rdid,
4324.probe_timing= TIMING_ZERO,
4325.block_erasers=
4326{
4327{
4328.eraseblocks = { {4 * 1024, 512} },
4329.block_erase = spi_block_erase_20,
4330}, {
4331.eraseblocks = { {64 * 1024, 32} },
4332.block_erase = spi_block_erase_d8,
4333}, {
4334.eraseblocks = { {2 * 1024 * 1024, 1} },
4335.block_erase = spi_block_erase_60,
4336}, {
4337.eraseblocks = { {2 * 1024 * 1024, 1} },
4338.block_erase = spi_block_erase_c7,
4339}
4340},
4341.unlock= spi_disable_blockprotect,
4342.write= spi_chip_write_256,
4343.read= spi_chip_read,
4344.voltage= {2700, 3600},
4345},
4346
4347{
4348.vendor= "Macronix",
4349.name= "MX25L3205",
4350.bustype= BUS_SPI,
4351.manufacture_id= MACRONIX_ID,
4352.model_id= MACRONIX_MX25L3205,
4353.total_size= 4096,
4354.page_size= 256,
4355.feature_bits= FEATURE_WRSR_WREN,
4356.tested= TEST_OK_PREW,
4357.probe= probe_spi_rdid,
4358.probe_timing= TIMING_ZERO,
4359.block_erasers=
4360{
4361{
4362.eraseblocks = { {4 * 1024, 1024} },
4363.block_erase = spi_block_erase_20,
4364}, {
4365.eraseblocks = { {4 * 1024, 1024} },
4366.block_erase = spi_block_erase_d8,
4367}, {
4368.eraseblocks = { {4 * 1024 * 1024, 1} },
4369.block_erase = spi_block_erase_60,
4370}, {
4371.eraseblocks = { {4 * 1024 * 1024, 1} },
4372.block_erase = spi_block_erase_c7,
4373},
4374},
4375.unlock= spi_disable_blockprotect,
4376.write= spi_chip_write_256,
4377.read= spi_chip_read,
4378.voltage= {2700, 3600},
4379},
4380
4381{
4382.vendor= "Macronix",
4383.name= "MX25L3235D",
4384.bustype= BUS_SPI,
4385.manufacture_id= MACRONIX_ID,
4386.model_id= MACRONIX_MX25L3235D,
4387.total_size= 4096,
4388.page_size= 256,
4389.feature_bits= FEATURE_WRSR_WREN,
4390.tested= TEST_UNTESTED,
4391.probe= probe_spi_rdid,
4392.probe_timing= TIMING_ZERO,
4393.block_erasers=
4394{
4395{
4396.eraseblocks = { {4 * 1024, 1024} },
4397.block_erase = spi_block_erase_20,
4398}, {
4399.eraseblocks = { {64 * 1024, 64} },
4400.block_erase = spi_block_erase_d8,
4401}, {
4402.eraseblocks = { {4 * 1024 * 1024, 1} },
4403.block_erase = spi_block_erase_60,
4404}, {
4405.eraseblocks = { {4 * 1024 * 1024, 1} },
4406.block_erase = spi_block_erase_c7,
4407}
4408},
4409.unlock= spi_disable_blockprotect,
4410.write= spi_chip_write_256,
4411.read= spi_chip_read,
4412.voltage= {2700, 3600},
4413},
4414
4415{
4416.vendor= "Macronix",
4417.name= "MX25L6405",
4418.bustype= BUS_SPI,
4419.manufacture_id= MACRONIX_ID,
4420.model_id= MACRONIX_MX25L6405,
4421.total_size= 8192,
4422.page_size= 256,
4423.feature_bits= FEATURE_WRSR_WREN,
4424.tested= TEST_OK_PROBE,
4425.probe= probe_spi_rdid,
4426.probe_timing= TIMING_ZERO,
4427.block_erasers=
4428{
4429{
4430.eraseblocks = { {64 * 1024, 128} },
4431.block_erase = spi_block_erase_20,
4432}, {
4433.eraseblocks = { {64 * 1024, 128} },
4434.block_erase = spi_block_erase_d8,
4435}, {
4436.eraseblocks = { {8 * 1024 * 1024, 1} },
4437.block_erase = spi_block_erase_60,
4438}, {
4439.eraseblocks = { {8 * 1024 * 1024, 1} },
4440.block_erase = spi_block_erase_c7,
4441}
4442},
4443.unlock= spi_disable_blockprotect,
4444.write= spi_chip_write_256,
4445.read= spi_chip_read,
4446.voltage= {2700, 3600},
4447},
4448
4449{
4450.vendor= "Macronix",
4451.name= "MX25L12805",
4452.bustype= BUS_SPI,
4453.manufacture_id= MACRONIX_ID,
4454.model_id= MACRONIX_MX25L12805,
4455.total_size= 16384,
4456.page_size= 256,
4457.feature_bits= FEATURE_WRSR_WREN,
4458.tested= TEST_UNTESTED,
4459.probe= probe_spi_rdid,
4460.probe_timing= TIMING_ZERO,
4461.block_erasers=
4462{
4463{
4464.eraseblocks = { {4 * 1024, 4096} },
4465.block_erase = spi_block_erase_20,
4466}, {
4467.eraseblocks = { {64 * 1024, 256} },
4468.block_erase = spi_block_erase_d8,
4469}, {
4470.eraseblocks = { {16 * 1024 * 1024, 1} },
4471.block_erase = spi_block_erase_60,
4472}, {
4473.eraseblocks = { {16 * 1024 * 1024, 1} },
4474.block_erase = spi_block_erase_c7,
4475}
4476},
4477.unlock= spi_disable_blockprotect,
4478.write= spi_chip_write_256,
4479.read= spi_chip_read,
4480.voltage= {2700, 3600},
4481},
4482
4483{
4484.vendor= "Macronix",
4485.name= "MX29F001B",
4486.bustype= BUS_PARALLEL,
4487.manufacture_id= MACRONIX_ID,
4488.model_id= MACRONIX_MX29F001B,
4489.total_size= 128,
4490.page_size= 32 * 1024,
4491.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4492.tested= TEST_UNTESTED,
4493.probe= probe_jedec,
4494.probe_timing= TIMING_ZERO,
4495.block_erasers=
4496{
4497{
4498.eraseblocks = {
4499{8 * 1024, 1},
4500{4 * 1024, 2},
4501{8 * 1024, 2},
4502{32 * 1024, 1},
4503{64 * 1024, 1},
4504},
4505.block_erase = erase_sector_jedec,
4506}, {
4507.eraseblocks = { {128 * 1024, 1} },
4508.block_erase = erase_chip_block_jedec,
4509}
4510},
4511.write= write_jedec_1,
4512.read= read_memmapped,
4513.voltage= {4500, 5500},
4514},
4515
4516{
4517.vendor= "Macronix",
4518.name= "MX29F001T",
4519.bustype= BUS_PARALLEL,
4520.manufacture_id= MACRONIX_ID,
4521.model_id= MACRONIX_MX29F001T,
4522.total_size= 128,
4523.page_size= 32 * 1024,
4524.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4525.tested= TEST_OK_PREW,
4526.probe= probe_jedec,
4527.probe_timing= TIMING_ZERO,
4528.block_erasers=
4529{
4530{
4531.eraseblocks = {
4532{64 * 1024, 1},
4533{32 * 1024, 1},
4534{8 * 1024, 2},
4535{4 * 1024, 2},
4536{8 * 1024, 1},
4537},
4538.block_erase = erase_sector_jedec,
4539}, {
4540.eraseblocks = { {128 * 1024, 1} },
4541.block_erase = erase_chip_block_jedec,
4542}
4543},
4544.write= write_jedec_1,
4545.read= read_memmapped,
4546.voltage= {4500, 5500},
4547},
4548
4549{
4550.vendor= "Macronix",
4551.name= "MX29F002(N)B",
4552.bustype= BUS_PARALLEL,
4553.manufacture_id= MACRONIX_ID,
4554.model_id= MACRONIX_MX29F002B,
4555.total_size= 256,
4556.page_size= 64 * 1024,
4557.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4558.tested= TEST_UNTESTED,
4559.probe= probe_jedec,
4560.probe_timing= TIMING_ZERO,
4561.block_erasers=
4562{
4563{
4564.eraseblocks = {
4565{16 * 1024, 1},
4566{8 * 1024, 2},
4567{32 * 1024, 1},
4568{64 * 1024, 3},
4569},
4570.block_erase = erase_sector_jedec,
4571}, {
4572.eraseblocks = { {256 * 1024, 1} },
4573.block_erase = erase_chip_block_jedec,
4574},
4575},
4576.write= write_jedec_1,
4577.read= read_memmapped,
4578.voltage= {4500, 5500},
4579},
4580
4581{
4582.vendor= "Macronix",
4583.name= "MX29F002(N)T",
4584.bustype= BUS_PARALLEL,
4585.manufacture_id= MACRONIX_ID,
4586.model_id= MACRONIX_MX29F002T,
4587.total_size= 256,
4588.page_size= 64 * 1024,
4589.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4590.tested= TEST_OK_PREW,
4591.probe= probe_jedec,
4592.probe_timing= TIMING_ZERO,
4593.block_erasers=
4594{
4595{
4596.eraseblocks = {
4597{64 * 1024, 3},
4598{32 * 1024, 1},
4599{8 * 1024, 2},
4600{16 * 1024, 1},
4601},
4602.block_erase = erase_sector_jedec,
4603}, {
4604.eraseblocks = { {256 * 1024, 1} },
4605.block_erase = erase_chip_block_jedec,
4606},
4607},
4608.write= write_jedec_1,
4609.read= read_memmapped,
4610.voltage= {4500, 5500},
4611},
4612
4613{
4614.vendor= "Macronix",
4615.name= "MX29F040",
4616.bustype= BUS_PARALLEL,
4617.manufacture_id= MACRONIX_ID,
4618.model_id= MACRONIX_MX29F040,
4619.total_size= 512,
4620.page_size= 64 * 1024,
4621.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4622.tested= TEST_UNTESTED,
4623.probe= probe_jedec,
4624.probe_timing= TIMING_ZERO,
4625.block_erasers=
4626{
4627{
4628.eraseblocks = { {64 * 1024, 8} },
4629.block_erase = erase_sector_jedec,
4630}, {
4631.eraseblocks = { {512 * 1024, 1} },
4632.block_erase = erase_chip_block_jedec,
4633},
4634},
4635.write= write_jedec_1,
4636.read= read_memmapped,
4637.voltage= {4500, 5500},
4638},
4639
4640{
4641.vendor= "Macronix",
4642.name= "MX29LV040",
4643.bustype= BUS_PARALLEL,
4644.manufacture_id= MACRONIX_ID,
4645.model_id= MACRONIX_MX29LV040,
4646.total_size= 512,
4647.page_size= 64 * 1024,
4648.feature_bits= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4649.tested= TEST_UNTESTED,
4650.probe= probe_jedec,
4651.probe_timing= TIMING_ZERO,
4652.block_erasers=
4653{
4654{
4655.eraseblocks = { {64 * 1024, 8}, },
4656.block_erase = erase_sector_jedec,
4657}, {
4658.eraseblocks = { {512 * 1024, 1} },
4659.block_erase = erase_chip_block_jedec,
4660},
4661},
4662.write= write_jedec_1,
4663.read= read_memmapped,
4664.voltage= {2700, 3600},
4665},
4666
4667{
4668.vendor= "MoselVitelic",
4669.name= "V29C51000B",
4670.bustype= BUS_PARALLEL,
4671.manufacture_id= SYNCMOS_MVC_ID,
4672.model_id= MVC_V29C51000B,
4673.total_size= 64,
4674.page_size= 512,
4675.feature_bits= FEATURE_EITHER_RESET,
4676.tested= TEST_UNTESTED,
4677.probe= probe_jedec,
4678.probe_timing= TIMING_ZERO,
4679.block_erasers=
4680{
4681{
4682.eraseblocks = { {512, 128} },
4683.block_erase = erase_sector_jedec,
4684}, {
4685.eraseblocks = { {64 * 1024, 1} },
4686.block_erase = erase_chip_block_jedec,
4687},
4688},
4689.write= write_jedec_1,
4690.read= read_memmapped,
4691.voltage= {4500, 5500},
4692},
4693
4694{
4695.vendor= "MoselVitelic",
4696.name= "V29C51000T",
4697.bustype= BUS_PARALLEL,
4698.manufacture_id= SYNCMOS_MVC_ID,
4699.model_id= MVC_V29C51000T,
4700.total_size= 64,
4701.page_size= 512,
4702.feature_bits= FEATURE_EITHER_RESET,
4703.tested= TEST_UNTESTED,
4704.probe= probe_jedec,
4705.probe_timing= TIMING_ZERO,
4706.block_erasers=
4707{
4708{
4709.eraseblocks = { {512, 128} },
4710.block_erase = erase_sector_jedec,
4711}, {
4712.eraseblocks = { {64 * 1024, 1} },
4713.block_erase = erase_chip_block_jedec,
4714},
4715},
4716.write= write_jedec_1,
4717.read= read_memmapped,
4718.voltage= {4500, 5500},
4719},
4720
4721{
4722.vendor= "MoselVitelic",
4723.name= "V29C51400B",
4724.bustype= BUS_PARALLEL,
4725.manufacture_id= SYNCMOS_MVC_ID,
4726.model_id= MVC_V29C51400B,
4727.total_size= 512,
4728.page_size= 1024,
4729.feature_bits= FEATURE_EITHER_RESET,
4730.tested= TEST_UNTESTED,
4731.probe= probe_jedec,
4732.probe_timing= TIMING_ZERO,
4733.block_erasers=
4734{
4735{
4736.eraseblocks = { {1024, 512} },
4737.block_erase = erase_sector_jedec,
4738}, {
4739.eraseblocks = { {512 * 1024, 1} },
4740.block_erase = erase_chip_block_jedec,
4741},
4742},
4743.write= write_jedec_1,
4744.read= read_memmapped,
4745.voltage= {4500, 5500},
4746},
4747
4748{
4749.vendor= "MoselVitelic",
4750.name= "V29C51400T",
4751.bustype= BUS_PARALLEL,
4752.manufacture_id= SYNCMOS_MVC_ID,
4753.model_id= MVC_V29C51400T,
4754.total_size= 512,
4755.page_size= 1024,
4756.feature_bits= FEATURE_EITHER_RESET,
4757.tested= TEST_UNTESTED,
4758.probe= probe_jedec,
4759.probe_timing= TIMING_ZERO,
4760.block_erasers=
4761{
4762{
4763.eraseblocks = { {1024, 512} },
4764.block_erase = erase_sector_jedec,
4765}, {
4766.eraseblocks = { {512 * 1024, 1} },
4767.block_erase = erase_chip_block_jedec,
4768},
4769},
4770.write= write_jedec_1,
4771.read= read_memmapped,
4772.voltage= {4500, 5500},
4773},
4774
4775{
4776.vendor= "MoselVitelic",
4777.name= "V29LC51000",
4778.bustype= BUS_PARALLEL,
4779.manufacture_id= SYNCMOS_MVC_ID,
4780.model_id= MVC_V29LC51000,
4781.total_size= 64,
4782.page_size= 512,
4783.feature_bits= FEATURE_EITHER_RESET,
4784.tested= TEST_UNTESTED,
4785.probe= probe_jedec,
4786.probe_timing= TIMING_ZERO,
4787.block_erasers=
4788{
4789{
4790.eraseblocks = { {512, 128} },
4791.block_erase = erase_sector_jedec,
4792}, {
4793.eraseblocks = { {64 * 1024, 1} },
4794.block_erase = erase_chip_block_jedec,
4795},
4796},
4797.write= write_jedec_1,
4798.read= read_memmapped,
4799.voltage= {4500, 5500},
4800},
4801
4802{
4803.vendor= "MoselVitelic",
4804.name= "V29LC51001",
4805.bustype= BUS_PARALLEL,
4806.manufacture_id= SYNCMOS_MVC_ID,
4807.model_id= MVC_V29LC51001,
4808.total_size= 128,
4809.page_size= 512,
4810.feature_bits= FEATURE_EITHER_RESET,
4811.tested= TEST_UNTESTED,
4812.probe= probe_jedec,
4813.probe_timing= TIMING_ZERO,
4814.block_erasers=
4815{
4816{
4817.eraseblocks = { {512, 256} },
4818.block_erase = erase_sector_jedec,
4819}, {
4820.eraseblocks = { {128 * 1024, 1} },
4821.block_erase = erase_chip_block_jedec,
4822},
4823},
4824.write= write_jedec_1,
4825.read= read_memmapped,
4826.voltage= {4500, 5500},
4827},
4828
4829{
4830.vendor= "MoselVitelic",
4831.name= "V29LC51002",
4832.bustype= BUS_PARALLEL,
4833.manufacture_id= SYNCMOS_MVC_ID,
4834.model_id= MVC_V29LC51002,
4835.total_size= 256,
4836.page_size= 512,
4837.feature_bits= FEATURE_EITHER_RESET,
4838.tested= TEST_UNTESTED,
4839.probe= probe_jedec,
4840.probe_timing= TIMING_ZERO,
4841.block_erasers=
4842{
4843{
4844.eraseblocks = { {512, 512} },
4845.block_erase = erase_sector_jedec,
4846}, {
4847.eraseblocks = { {256 * 1024, 1} },
4848.block_erase = erase_chip_block_jedec,
4849},
4850},
4851.write= write_jedec_1,
4852.read= read_memmapped,
4853.voltage= {4500, 5500},
4854},
4855
4856{
4857.vendor= "Numonyx",
4858.name= "M25PE10",
4859.bustype= BUS_SPI,
4860.manufacture_id= ST_ID,
4861.model_id= ST_M25PE10,
4862.total_size= 128,
4863.page_size= 256,
4864.tested= TEST_UNTESTED,
4865.probe= probe_spi_rdid,
4866.probe_timing= TIMING_ZERO,
4867.block_erasers=
4868{
4869{
4870.eraseblocks = { {4 * 1024, 32} },
4871.block_erase = spi_block_erase_20,
4872}, {
4873.eraseblocks = { {64 * 1024, 2} },
4874.block_erase = spi_block_erase_d8,
4875}, {
4876.eraseblocks = { {128 * 1024, 1} },
4877.block_erase = spi_block_erase_c7,
4878}
4879},
4880.unlock= spi_disable_blockprotect,
4881.write= spi_chip_write_256,
4882.read= spi_chip_read,
4883.voltage= {2700, 3600},
4884},
4885
4886{
4887.vendor= "Numonyx",
4888.name= "M25PE20",
4889.bustype= BUS_SPI,
4890.manufacture_id= ST_ID,
4891.model_id= ST_M25PE20,
4892.total_size= 256,
4893.page_size= 256,
4894.tested= TEST_UNTESTED,
4895.probe= probe_spi_rdid,
4896.probe_timing= TIMING_ZERO,
4897.block_erasers=
4898{
4899{
4900.eraseblocks = { {4 * 1024, 64} },
4901.block_erase = spi_block_erase_20,
4902}, {
4903.eraseblocks = { {64 * 1024, 4} },
4904.block_erase = spi_block_erase_d8,
4905}, {
4906.eraseblocks = { {256 * 1024, 1} },
4907.block_erase = spi_block_erase_c7,
4908}
4909},
4910.unlock= spi_disable_blockprotect,
4911.write= spi_chip_write_256,
4912.read= spi_chip_read,
4913.voltage= {2700, 3600},
4914},
4915
4916{
4917.vendor= "Numonyx",
4918.name= "M25PE40",
4919.bustype= BUS_SPI,
4920.manufacture_id= ST_ID,
4921.model_id= ST_M25PE40,
4922.total_size= 512,
4923.page_size= 256,
4924.tested= TEST_UNTESTED,
4925.probe= probe_spi_rdid,
4926.probe_timing= TIMING_ZERO,
4927.block_erasers=
4928{
4929{
4930.eraseblocks = { {4 * 1024, 128} },
4931.block_erase = spi_block_erase_20,
4932}, {
4933.eraseblocks = { {64 * 1024, 8} },
4934.block_erase = spi_block_erase_d8,
4935}, {
4936.eraseblocks = { {512 * 1024, 1} },
4937.block_erase = spi_block_erase_c7,
4938}
4939},
4940.unlock= spi_disable_blockprotect,
4941.write= spi_chip_write_256,
4942.read= spi_chip_read,
4943.voltage= {2700, 3600},
4944},
4945
4946{
4947.vendor= "Numonyx",
4948.name= "M25PE80",
4949.bustype= BUS_SPI,
4950.manufacture_id= ST_ID,
4951.model_id= ST_M25PE80,
4952.total_size= 1024,
4953.page_size= 256,
4954.tested= TEST_OK_PRE,
4955.probe= probe_spi_rdid,
4956.probe_timing= TIMING_ZERO,
4957.block_erasers=
4958{
4959{
4960.eraseblocks = { {4 * 1024, 256} },
4961.block_erase = spi_block_erase_20,
4962}, {
4963.eraseblocks = { {64 * 1024, 16} },
4964.block_erase = spi_block_erase_d8,
4965}, {
4966.eraseblocks = { {1024 * 1024, 1} },
4967.block_erase = spi_block_erase_c7,
4968}
4969},
4970.unlock= spi_disable_blockprotect,
4971.write= spi_chip_write_256,
4972.read= spi_chip_read,
4973.voltage= {2700, 3600},
4974},
4975
4976{
4977.vendor= "Numonyx",
4978.name= "M25PE16",
4979.bustype= BUS_SPI,
4980.manufacture_id= ST_ID,
4981.model_id= ST_M25PE16,
4982.total_size= 2048,
4983.page_size= 256,
4984.tested= TEST_UNTESTED,
4985.probe= probe_spi_rdid,
4986.probe_timing= TIMING_ZERO,
4987.block_erasers=
4988{
4989{
4990.eraseblocks = { {4 * 1024, 512} },
4991.block_erase = spi_block_erase_20,
4992}, {
4993.eraseblocks = { {64 * 1024, 32} },
4994.block_erase = spi_block_erase_d8,
4995}, {
4996.eraseblocks = { {2 * 1024 * 1024, 1} },
4997.block_erase = spi_block_erase_c7,
4998}
4999},
5000.unlock= spi_disable_blockprotect,
5001.write= spi_chip_write_256,
5002.read= spi_chip_read,
5003.voltage= {2700, 3600},
5004},
5005
5006{
5007.vendor= "PMC",
5008.name= "Pm25LV010",
5009.bustype= BUS_SPI,
5010.manufacture_id= PMC_ID,
5011.model_id= PMC_PM25LV010,
5012.total_size= 128,
5013.page_size= 256,
5014.tested= TEST_UNTESTED,
5015.probe= probe_spi_rdid,
5016.probe_timing= TIMING_ZERO,
5017.block_erasers=
5018{
5019{
5020.eraseblocks = { {4 * 1024, 32} },
5021.block_erase = spi_block_erase_d7,
5022}, {
5023.eraseblocks = { {32 * 1024, 4} },
5024.block_erase = spi_block_erase_d8,
5025}, {
5026.eraseblocks = { {128 * 1024, 1} },
5027.block_erase = spi_block_erase_c7,
5028}
5029},
5030.unlock= spi_disable_blockprotect,
5031.write= spi_chip_write_256,
5032.read= spi_chip_read,
5033.voltage= {2700, 3600},
5034},
5035
5036{
5037.vendor= "PMC",
5038.name= "Pm25LV016B",
5039.bustype= BUS_SPI,
5040.manufacture_id= PMC_ID,
5041.model_id= PMC_PM25LV016B,
5042.total_size= 2048,
5043.page_size= 256,
5044.tested= TEST_UNTESTED,
5045.probe= probe_spi_rdid,
5046.probe_timing= TIMING_ZERO,
5047.block_erasers=
5048{
5049{
5050.eraseblocks = { {4 * 1024, 512} },
5051.block_erase = spi_block_erase_d7,
5052}, {
5053.eraseblocks = { {4 * 1024, 512} },
5054.block_erase = spi_block_erase_20,
5055}, {
5056.eraseblocks = { {64 * 1024, 32} },
5057.block_erase = spi_block_erase_d8,
5058}, {
5059.eraseblocks = { {2 * 1024 * 1024, 1} },
5060.block_erase = spi_block_erase_60,
5061}, {
5062.eraseblocks = { {2 * 1024 * 1024, 1} },
5063.block_erase = spi_block_erase_c7,
5064}
5065},
5066.unlock= spi_disable_blockprotect,
5067.write= spi_chip_write_256,
5068.read= spi_chip_read,
5069.voltage= {2700, 3600},
5070},
5071
5072{
5073.vendor= "PMC",
5074.name= "Pm25LV020",
5075.bustype= BUS_SPI,
5076.manufacture_id= PMC_ID,
5077.model_id= PMC_PM25LV020,
5078.total_size= 256,
5079.page_size= 256,
5080.tested= TEST_UNTESTED,
5081.probe= probe_spi_rdid,
5082.probe_timing= TIMING_ZERO,
5083.block_erasers=
5084{
5085{
5086.eraseblocks = { {4 * 1024, 64} },
5087.block_erase = spi_block_erase_d7,
5088}, {
5089.eraseblocks = { {64 * 1024, 4} },
5090.block_erase = spi_block_erase_d8,
5091}, {
5092.eraseblocks = { {256 * 1024, 1} },
5093.block_erase = spi_block_erase_c7,
5094}
5095},
5096.unlock= spi_disable_blockprotect,
5097.write= spi_chip_write_256,
5098.read= spi_chip_read,
5099.voltage= {2700, 3600},
5100},
5101
5102{
5103.vendor= "PMC",
5104.name= "Pm25LV040",
5105.bustype= BUS_SPI,
5106.manufacture_id= PMC_ID,
5107.model_id= PMC_PM25LV040,
5108.total_size= 512,
5109.page_size= 256,
5110.tested= TEST_OK_PREW,
5111.probe= probe_spi_rdid,
5112.probe_timing= TIMING_ZERO,
5113.block_erasers=
5114{
5115{
5116.eraseblocks = { {4 * 1024, 128} },
5117.block_erase = spi_block_erase_d7,
5118}, {
5119.eraseblocks = { {64 * 1024, 8} },
5120.block_erase = spi_block_erase_d8,
5121}, {
5122.eraseblocks = { {512 * 1024, 1} },
5123.block_erase = spi_block_erase_c7,
5124}
5125},
5126.unlock= spi_disable_blockprotect,
5127.write= spi_chip_write_256,
5128.read= spi_chip_read,
5129.voltage= {2700, 3600},
5130},
5131
5132{
5133.vendor= "PMC",
5134.name= "Pm25LV080B",
5135.bustype= BUS_SPI,
5136.manufacture_id= PMC_ID,
5137.model_id= PMC_PM25LV080B,
5138.total_size= 1024,
5139.page_size= 256,
5140.tested= TEST_UNTESTED,
5141.probe= probe_spi_rdid,
5142.probe_timing= TIMING_ZERO,
5143.block_erasers=
5144{
5145{
5146.eraseblocks = { {4 * 1024, 256} },
5147.block_erase = spi_block_erase_d7,
5148}, {
5149.eraseblocks = { {4 * 1024, 256} },
5150.block_erase = spi_block_erase_20,
5151}, {
5152.eraseblocks = { {64 * 1024, 16} },
5153.block_erase = spi_block_erase_d8,
5154}, {
5155.eraseblocks = { {1024 * 1024, 1} },
5156.block_erase = spi_block_erase_60,
5157}, {
5158.eraseblocks = { {1024 * 1024, 1} },
5159.block_erase = spi_block_erase_c7,
5160}
5161},
5162.unlock= spi_disable_blockprotect,
5163.write= spi_chip_write_256,
5164.read= spi_chip_read,
5165.voltage= {2700, 3600},
5166},
5167
5168{
5169.vendor= "PMC",
5170.name= "Pm25LV512",
5171.bustype= BUS_SPI,
5172.manufacture_id= PMC_ID,
5173.model_id= PMC_PM25LV512,
5174.total_size= 64,
5175.page_size= 256,
5176.tested= TEST_UNTESTED,
5177.probe= probe_spi_rdid,
5178.probe_timing= TIMING_ZERO,
5179.block_erasers=
5180{
5181{
5182.eraseblocks = { {4 * 1024, 16} },
5183.block_erase = spi_block_erase_d7,
5184}, {
5185.eraseblocks = { {32 * 1024, 2} },
5186.block_erase = spi_block_erase_d8,
5187}, {
5188.eraseblocks = { {64 * 1024, 1} },
5189.block_erase = spi_block_erase_c7,
5190}
5191},
5192.unlock= spi_disable_blockprotect,
5193.write= spi_chip_write_256,
5194.read= spi_chip_read,
5195.voltage= {2700, 3600},
5196},
5197
5198{
5199.vendor= "PMC",
5200.name= "Pm29F002T",
5201.bustype= BUS_PARALLEL,
5202.manufacture_id= PMC_ID_NOPREFIX,
5203.model_id= PMC_PM29F002T,
5204.total_size= 256,
5205.page_size= 8 * 1024,
5206.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5207.tested= TEST_OK_PREW,
5208.probe= probe_jedec,
5209.probe_timing= TIMING_FIXME,
5210.block_erasers=
5211{
5212{
5213.eraseblocks = {
5214{128 * 1024, 1},
5215{96 * 1024, 1},
5216{8 * 1024, 2},
5217{16 * 1024, 1},
5218},
5219.block_erase = erase_sector_jedec,
5220}, {
5221.eraseblocks = { {256 * 1024, 1} },
5222.block_erase = erase_chip_block_jedec,
5223},
5224},
5225.write= write_jedec_1,
5226.read= read_memmapped,
5227.voltage= {4500, 5500},
5228},
5229
5230{
5231.vendor= "PMC",
5232.name= "Pm29F002B",
5233.bustype= BUS_PARALLEL,
5234.manufacture_id= PMC_ID_NOPREFIX,
5235.model_id= PMC_PM29F002B,
5236.total_size= 256,
5237.page_size= 8 * 1024,
5238.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5239.tested= TEST_UNTESTED,
5240.probe= probe_jedec,
5241.probe_timing= TIMING_FIXME,
5242.block_erasers=
5243{
5244{
5245.eraseblocks = {
5246{16 * 1024, 1},
5247{8 * 1024, 2},
5248{96 * 1024, 1},
5249{128 * 1024, 1},
5250},
5251.block_erase = erase_sector_jedec,
5252}, {
5253.eraseblocks = { {256 * 1024, 1} },
5254.block_erase = erase_chip_block_jedec,
5255},
5256},
5257.write= write_jedec_1,
5258.read= read_memmapped,
5259.voltage= {4500, 5500},
5260},
5261
5262{
5263.vendor= "PMC",
5264.name= "Pm39LV010",
5265.bustype= BUS_PARALLEL,
5266.manufacture_id= PMC_ID_NOPREFIX,
5267.model_id= PMC_PM39F010,/* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
5268.total_size= 128,
5269.page_size= 4096,
5270.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5271.tested= TEST_OK_PREW,
5272.probe= probe_jedec,
5273.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
5274.block_erasers=
5275{
5276{
5277.eraseblocks = { {4 * 1024, 32} },
5278.block_erase = erase_sector_jedec,
5279}, {
5280.eraseblocks = { {64 * 1024, 2} },
5281.block_erase = erase_block_jedec,
5282}, {
5283.eraseblocks = { {128 * 1024, 1} },
5284.block_erase = erase_chip_block_jedec,
5285}
5286},
5287.write= write_jedec_1,
5288.read= read_memmapped,
5289.voltage= {2700, 3600},
5290},
5291
5292{
5293.vendor= "PMC",
5294.name= "Pm39LV020",
5295.bustype= BUS_PARALLEL,
5296.manufacture_id= PMC_ID_NOPREFIX,
5297.model_id= PMC_PM39LV020,
5298.total_size= 256,
5299.page_size= 4096,
5300.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5301.tested= TEST_UNTESTED,
5302.probe= probe_jedec,
5303.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
5304.block_erasers =
5305{
5306{
5307.eraseblocks = { {4 * 1024, 64} },
5308.block_erase = erase_sector_jedec,
5309}, {
5310.eraseblocks = { {64 * 1024, 4} },
5311.block_erase = erase_block_jedec,
5312}, {
5313.eraseblocks = { {256 * 1024, 1} },
5314.block_erase = erase_chip_block_jedec,
5315}
5316},
5317.write= write_jedec_1,
5318.read= read_memmapped,
5319.voltage= {2700, 3600},
5320},
5321
5322{
5323.vendor= "PMC",
5324.name= "Pm39LV040",
5325.bustype= BUS_PARALLEL,
5326.manufacture_id= PMC_ID_NOPREFIX,
5327.model_id= PMC_PM39LV040,
5328.total_size= 512,
5329.page_size= 4096,
5330.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5331.tested= TEST_OK_PR,
5332.probe= probe_jedec,
5333.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
5334.block_erasers =
5335{
5336{
5337.eraseblocks = { {4 * 1024, 128} },
5338.block_erase = erase_sector_jedec,
5339}, {
5340.eraseblocks = { {64 * 1024, 8} },
5341.block_erase = erase_block_jedec,
5342}, {
5343.eraseblocks = { {512 * 1024, 1} },
5344.block_erase = erase_chip_block_jedec,
5345}
5346},
5347.write= write_jedec_1,
5348.read= read_memmapped,
5349.voltage= {2700, 3600},
5350},
5351
5352{
5353.vendor= "PMC",
5354.name= "Pm49FL002",
5355.bustype= BUS_LPC | BUS_FWH, /* A/A Mux */
5356.manufacture_id= PMC_ID_NOPREFIX,
5357.model_id= PMC_PM49FL002,
5358.total_size= 256,
5359.page_size= 16 * 1024,
5360.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5361.tested= TEST_OK_PREW,
5362.probe= probe_jedec,
5363.probe_timing= TIMING_ZERO,/* routine is wrapper to probe_jedec (pm49fl00x.c) */
5364.block_erasers=
5365{
5366{
5367.eraseblocks = { {4 * 1024, 64} },
5368.block_erase = erase_sector_jedec,
5369}, {
5370.eraseblocks = { {16 * 1024, 16} },
5371.block_erase = erase_block_jedec,
5372}, {
5373.eraseblocks = { {256 * 1024, 1} },
5374.block_erase = erase_chip_block_jedec,
5375}
5376},
5377.unlock= unlock_49fl00x,
5378.write= write_jedec_1,
5379.read= read_memmapped,
5380.voltage= {3000, 3600},
5381},
5382
5383{
5384.vendor= "PMC",
5385.name= "Pm49FL004",
5386.bustype= BUS_LPC | BUS_FWH, /* A/A Mux */
5387.manufacture_id= PMC_ID_NOPREFIX,
5388.model_id= PMC_PM49FL004,
5389.total_size= 512,
5390.page_size= 64 * 1024,
5391.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5392.tested= TEST_OK_PREW,
5393.probe= probe_jedec,
5394.probe_timing= TIMING_ZERO,/* routine is wrapper to probe_jedec (pm49fl00x.c) */
5395.block_erasers=
5396{
5397{
5398.eraseblocks = { {4 * 1024, 128} },
5399.block_erase = erase_sector_jedec,
5400}, {
5401.eraseblocks = { {64 * 1024, 8} },
5402.block_erase = erase_block_jedec,
5403}, {
5404.eraseblocks = { {512 * 1024, 1} },
5405.block_erase = erase_chip_block_jedec,
5406}
5407},
5408.unlock= unlock_49fl00x,
5409.write= write_jedec_1,
5410.read= read_memmapped,
5411.voltage= {3000, 3600},
5412},
5413
5414{
5415.vendor= "Sanyo",
5416.name= "LF25FW203A",
5417.bustype= BUS_SPI,
5418.manufacture_id= SANYO_ID,
5419.model_id= SANYO_LE25FW203A,
5420.total_size= 2048,
5421.page_size= 256,
5422.tested= TEST_UNTESTED,
5423.probe= probe_spi_rdid,
5424.probe_timing= TIMING_ZERO,
5425.block_erasers=
5426{
5427{
5428.eraseblocks = { {64 * 1024, 32} },
5429.block_erase = spi_block_erase_d8,
5430},{
5431.eraseblocks = { {2 * 1024 * 1024, 1} },
5432.block_erase = spi_block_erase_c7,
5433}
5434},
5435.unlock= spi_disable_blockprotect,
5436.write= spi_chip_write_256,
5437.read= spi_chip_read,
5438},
5439
5440{
5441.vendor= "Sharp",
5442.name= "LH28F008BJT-BTLZ1",
5443.bustype= BUS_PARALLEL,
5444.manufacture_id= SHARP_ID,
5445.model_id= SHARP_LH28F008BJxxPB,
5446.total_size= 1024,
5447.page_size= 64 * 1024,
5448.tested= TEST_OK_PREW,
5449.probe= probe_82802ab,
5450.probe_timing= TIMING_ZERO,
5451.block_erasers=
5452{
5453{
5454.eraseblocks = {
5455{8 * 1024, 8},
5456{64 * 1024, 15}
5457 },
5458.block_erase = erase_block_82802ab,
5459}, {
5460.eraseblocks = { {1024 * 1024, 1} },
5461.block_erase = erase_sector_49lfxxxc,
5462}
5463},
5464.unlock= unlock_lh28f008bjt,
5465.write= write_82802ab,
5466.read= read_memmapped,
5467.voltage= {2700, 3600},
5468},
5469
5470{
5471.vendor= "Sharp",
5472.name= "LHF00L04",
5473.bustype= BUS_FWH, /* A/A Mux */
5474.manufacture_id= SHARP_ID,
5475.model_id= SHARP_LHF00L04,
5476.total_size= 1024,
5477.page_size= 64 * 1024,
5478.feature_bits= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
5479.tested= TEST_UNTESTED,
5480.probe= probe_82802ab,
5481.probe_timing= TIMING_ZERO,
5482.block_erasers=
5483{
5484{
5485.eraseblocks = {
5486{64 * 1024, 15},
5487{8 * 1024, 8}
5488 },
5489.block_erase = erase_block_82802ab,
5490}, {
5491.eraseblocks = {
5492{1024 * 1024, 1}
5493},
5494.block_erase = NULL, /* 30 D0, only in A/A mux mode */
5495},
5496},
5497.unlock= unlock_82802ab,
5498.write= write_82802ab,
5499.read= read_memmapped,
5500.voltage= {3000, 3600},
5501},
5502
5503{
5504.vendor= "Spansion",
5505.name= "S25FL004A",
5506.bustype= BUS_SPI,
5507.manufacture_id= SPANSION_ID,
5508.model_id= SPANSION_S25FL004A,
5509.total_size= 512,
5510.page_size= 256,
5511.tested= TEST_UNTESTED,
5512.probe= probe_spi_rdid,
5513.probe_timing= TIMING_ZERO,
5514.block_erasers=
5515{
5516{
5517.eraseblocks = { {64 * 1024, 8} },
5518.block_erase = spi_block_erase_d8,
5519}, {
5520.eraseblocks = { {512 * 1024, 1} },
5521.block_erase = spi_block_erase_c7,
5522}
5523},
5524.unlock= spi_disable_blockprotect,
5525.write= spi_chip_write_256,
5526.read= spi_chip_read,
5527.voltage= {2700, 3600},
5528},
5529
5530{
5531.vendor= "Spansion",
5532.name= "S25FL008A",
5533.bustype= BUS_SPI,
5534.manufacture_id= SPANSION_ID,
5535.model_id= SPANSION_S25FL008A,
5536.total_size= 1024,
5537.page_size= 256,
5538.tested= TEST_OK_PRE,
5539.probe= probe_spi_rdid,
5540.probe_timing= TIMING_ZERO,
5541.block_erasers=
5542{
5543{
5544.eraseblocks = { {64 * 1024, 16} },
5545.block_erase = spi_block_erase_d8,
5546}, {
5547.eraseblocks = { {1024 * 1024, 1} },
5548.block_erase = spi_block_erase_c7,
5549}
5550},
5551.unlock= spi_disable_blockprotect,
5552.write= spi_chip_write_256,
5553.read= spi_chip_read,
5554.voltage= {2700, 3600},
5555},
5556
5557{
5558.vendor= "Spansion",
5559.name= "S25FL016A",
5560.bustype= BUS_SPI,
5561.manufacture_id= SPANSION_ID,
5562.model_id= SPANSION_S25FL016A,
5563.total_size= 2048,
5564.page_size= 256,
5565.tested= TEST_OK_PR,
5566.probe= probe_spi_rdid,
5567.probe_timing= TIMING_ZERO,
5568.block_erasers=
5569{
5570{
5571.eraseblocks = { {64 * 1024, 32} },
5572.block_erase = spi_block_erase_d8,
5573}, {
5574.eraseblocks = { {2 * 1024 * 1024, 1} },
5575.block_erase = spi_block_erase_c7,
5576}
5577},
5578.unlock= spi_disable_blockprotect,
5579.write= spi_chip_write_256,
5580.read= spi_chip_read,
5581.voltage= {2700, 3600},
5582},
5583
5584{
5585.vendor= "Spansion",
5586.name= "S25FL032A",
5587.bustype= BUS_SPI,
5588.manufacture_id= SPANSION_ID,
5589.model_id= SPANSION_S25FL032A,
5590.total_size= 4096,
5591.page_size= 256,
5592.tested= TEST_UNTESTED,
5593.probe= probe_spi_rdid,
5594.probe_timing= TIMING_ZERO,
5595.block_erasers=
5596{
5597{
5598.eraseblocks = { {64 * 1024, 64} },
5599.block_erase = spi_block_erase_d8,
5600}, {
5601.eraseblocks = { {4 * 1024 * 1024, 1} },
5602.block_erase = spi_block_erase_c7,
5603}
5604},
5605.unlock= spi_disable_blockprotect,
5606.write= spi_chip_write_256,
5607.read= spi_chip_read,
5608.voltage= {2700, 3600},
5609},
5610
5611{
5612.vendor= "Spansion",
5613.name= "S25FL064A",
5614.bustype= BUS_SPI,
5615.manufacture_id= SPANSION_ID,
5616.model_id= SPANSION_S25FL064A,
5617.total_size= 8192,
5618.page_size= 256,
5619.tested= TEST_OK_PREW,
5620.probe= probe_spi_rdid,
5621.probe_timing= TIMING_ZERO,
5622.block_erasers=
5623{
5624{
5625.eraseblocks = { {64 * 1024, 128} },
5626.block_erase = spi_block_erase_d8,
5627}, {
5628.eraseblocks = { {8 * 1024 * 1024, 1} },
5629.block_erase = spi_block_erase_c7,
5630}
5631},
5632.unlock= spi_disable_blockprotect,
5633.write= spi_chip_write_256,
5634.read= spi_chip_read,
5635.voltage= {2700, 3600},
5636},
5637
5638{
5639.vendor= "SST",
5640.name= "SST25LF040A",
5641.bustype= BUS_SPI,
5642.manufacture_id= SST_ID,
5643.model_id= SST_SST25VF040_REMS,
5644.total_size= 512,
5645.page_size= 256,
5646.tested= TEST_OK_PREW,
5647.probe= probe_spi_res2,
5648.probe_timing= TIMING_ZERO,
5649.block_erasers=
5650{
5651{
5652.eraseblocks = { {4 * 1024, 128} },
5653.block_erase = spi_block_erase_20,
5654}, {
5655.eraseblocks = { {32 * 1024, 16} },
5656.block_erase = spi_block_erase_52,
5657}, {
5658.eraseblocks = { {512 * 1024, 1} },
5659.block_erase = spi_block_erase_60,
5660},
5661},
5662.unlock= spi_disable_blockprotect,
5663.write= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
5664.read= spi_chip_read,
5665.voltage= {3000, 3600},
5666},
5667
5668{
5669.vendor= "SST",
5670.name= "SST25LF080A",
5671.bustype= BUS_SPI,
5672.manufacture_id= SST_ID,
5673.model_id= SST_SST25VF080_REMS,
5674.total_size= 1024,
5675.page_size= 256,
5676.tested= TEST_UNTESTED,
5677.probe= probe_spi_res2,
5678.probe_timing= TIMING_ZERO,
5679.block_erasers=
5680{
5681{
5682.eraseblocks = { {4 * 1024, 256} },
5683.block_erase = spi_block_erase_20,
5684}, {
5685.eraseblocks = { {32 * 1024, 32} },
5686.block_erase = spi_block_erase_52,
5687}, {
5688.eraseblocks = { {1024 * 1024, 1} },
5689.block_erase = spi_block_erase_60,
5690},
5691},
5692.unlock= spi_disable_blockprotect,
5693.write= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
5694.read= spi_chip_read,
5695.voltage= {3000, 3600},
5696},
5697
5698{
5699.vendor= "SST",
5700.name= "SST25VF010",
5701.bustype= BUS_SPI,
5702.manufacture_id= SST_ID,
5703.model_id= SST_SST25VF010_REMS,
5704.total_size= 128,
5705.page_size= 256,
5706.tested= TEST_OK_PREW,
5707.probe= probe_spi_rems,
5708.probe_timing= TIMING_ZERO,
5709.block_erasers=
5710{
5711{
5712.eraseblocks = { {4 * 1024, 32} },
5713.block_erase = spi_block_erase_20,
5714}, {
5715.eraseblocks = { {32 * 1024, 4} },
5716.block_erase = spi_block_erase_52,
5717}, {
5718.eraseblocks = { {128 * 1024, 1} },
5719.block_erase = spi_block_erase_60,
5720},
5721},
5722.unlock= spi_disable_blockprotect,
5723.write= spi_chip_write_1,
5724.read= spi_chip_read,
5725.voltage= {2700, 3600},
5726},
5727
5728{
5729.vendor= "SST",
5730.name= "SST25VF016B",
5731.bustype= BUS_SPI,
5732.manufacture_id= SST_ID,
5733.model_id= SST_SST25VF016B,
5734.total_size= 2048,
5735.page_size= 256,
5736.tested= TEST_OK_PREW,
5737.probe= probe_spi_rdid,
5738.probe_timing= TIMING_ZERO,
5739.block_erasers=
5740{
5741{
5742.eraseblocks = { {4 * 1024, 512} },
5743.block_erase = spi_block_erase_20,
5744}, {
5745.eraseblocks = { {32 * 1024, 64} },
5746.block_erase = spi_block_erase_52,
5747}, {
5748.eraseblocks = { {64 * 1024, 32} },
5749.block_erase = spi_block_erase_d8,
5750}, {
5751.eraseblocks = { {2 * 1024 * 1024, 1} },
5752.block_erase = spi_block_erase_60,
5753}, {
5754.eraseblocks = { {2 * 1024 * 1024, 1} },
5755.block_erase = spi_block_erase_c7,
5756},
5757},
5758.unlock= spi_disable_blockprotect,
5759.write= spi_aai_write,
5760.read= spi_chip_read,
5761.voltage= {2700, 3600},
5762},
5763
5764{
5765.vendor= "SST",
5766.name= "SST25VF032B",
5767.bustype= BUS_SPI,
5768.manufacture_id= SST_ID,
5769.model_id= SST_SST25VF032B,
5770.total_size= 4096,
5771.page_size= 256,
5772.tested= TEST_OK_PREW,
5773.probe= probe_spi_rdid,
5774.probe_timing= TIMING_ZERO,
5775.block_erasers=
5776{
5777{
5778.eraseblocks = { {4 * 1024, 1024} },
5779.block_erase = spi_block_erase_20,
5780}, {
5781.eraseblocks = { {32 * 1024, 128} },
5782.block_erase = spi_block_erase_52,
5783}, {
5784.eraseblocks = { {64 * 1024, 64} },
5785.block_erase = spi_block_erase_d8,
5786}, {
5787.eraseblocks = { {4 * 1024 * 1024, 1} },
5788.block_erase = spi_block_erase_60,
5789}, {
5790.eraseblocks = { {4 * 1024 * 1024, 1} },
5791.block_erase = spi_block_erase_c7,
5792},
5793},
5794.unlock= spi_disable_blockprotect,
5795.write= spi_aai_write,
5796.read= spi_chip_read,
5797.voltage= {2700, 3600},
5798},
5799
5800{
5801.vendor= "SST",
5802.name= "SST25VF064C",
5803.bustype= BUS_SPI,
5804.manufacture_id= SST_ID,
5805.model_id= SST_SST25VF064C,
5806.total_size= 8192,
5807.page_size= 256,
5808.tested= TEST_OK_PREW,
5809.probe= probe_spi_rdid,
5810.probe_timing= TIMING_ZERO,
5811.block_erasers=
5812{
5813{
5814.eraseblocks = { {4 * 1024, 2048} },
5815.block_erase = spi_block_erase_20,
5816}, {
5817.eraseblocks = { {32 * 1024, 256} },
5818.block_erase = spi_block_erase_52,
5819}, {
5820.eraseblocks = { {64 * 1024, 128} },
5821.block_erase = spi_block_erase_d8,
5822}, {
5823.eraseblocks = { {8 * 1024 * 1024, 1} },
5824.block_erase = spi_block_erase_60,
5825}, {
5826.eraseblocks = { {8 * 1024 * 1024, 1} },
5827.block_erase = spi_block_erase_c7,
5828},
5829},
5830.unlock= spi_disable_blockprotect,
5831.write= spi_chip_write_256,
5832.read= spi_chip_read,
5833.voltage= {2700, 3600},
5834},
5835
5836{
5837.vendor= "SST",
5838.name= "SST25VF040",
5839.bustype= BUS_SPI,
5840.manufacture_id= SST_ID,
5841.model_id= SST_SST25VF040_REMS,
5842.total_size= 512,
5843.page_size= 256,
5844.tested= TEST_OK_PR,
5845.probe= probe_spi_rems,
5846.probe_timing= TIMING_ZERO,
5847.block_erasers=
5848{
5849{
5850.eraseblocks = { {4 * 1024, 128} },
5851.block_erase = spi_block_erase_20,
5852}, {
5853.eraseblocks = { {32 * 1024, 16} },
5854.block_erase = spi_block_erase_52,
5855}, {
5856.eraseblocks = { {512 * 1024, 1} },
5857.block_erase = spi_block_erase_60,
5858},
5859},
5860.unlock= spi_disable_blockprotect,
5861.write= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
5862.read= spi_chip_read,
5863.voltage= {2700, 3600},
5864},
5865
5866{
5867.vendor= "SST",
5868.name= "SST25VF040B",
5869.bustype= BUS_SPI,
5870.manufacture_id= SST_ID,
5871.model_id= SST_SST25VF040B,
5872.total_size= 512,
5873.page_size= 256,
5874.tested= TEST_UNTESTED,
5875.probe= probe_spi_rdid,
5876.probe_timing= TIMING_ZERO,
5877.block_erasers=
5878{
5879{
5880.eraseblocks = { {4 * 1024, 128} },
5881.block_erase = spi_block_erase_20,
5882}, {
5883.eraseblocks = { {32 * 1024, 16} },
5884.block_erase = spi_block_erase_52,
5885}, {
5886.eraseblocks = { {64 * 1024, 8} },
5887.block_erase = spi_block_erase_d8,
5888}, {
5889.eraseblocks = { {512 * 1024, 1} },
5890.block_erase = spi_block_erase_60,
5891}, {
5892.eraseblocks = { {512 * 1024, 1} },
5893.block_erase = spi_block_erase_c7,
5894},
5895},
5896.unlock= spi_disable_blockprotect,
5897.write= spi_aai_write,
5898.read= spi_chip_read,
5899.voltage= {2700, 3600},
5900},
5901
5902{
5903.vendor= "SST",
5904.name= "SST25VF040B.REMS",
5905.bustype= BUS_SPI,
5906.manufacture_id= SST_ID,
5907.model_id= SST_SST25VF040B_REMS,
5908.total_size= 512,
5909.page_size= 256,
5910.tested= TEST_OK_PR,
5911.probe= probe_spi_rems,
5912.probe_timing= TIMING_ZERO,
5913.block_erasers=
5914{
5915{
5916.eraseblocks = { {4 * 1024, 128} },
5917.block_erase = spi_block_erase_20,
5918}, {
5919.eraseblocks = { {32 * 1024, 16} },
5920.block_erase = spi_block_erase_52,
5921}, {
5922.eraseblocks = { {64 * 1024, 8} },
5923.block_erase = spi_block_erase_d8,
5924}, {
5925.eraseblocks = { {512 * 1024, 1} },
5926.block_erase = spi_block_erase_60,
5927}, {
5928.eraseblocks = { {512 * 1024, 1} },
5929.block_erase = spi_block_erase_c7,
5930},
5931},
5932.unlock= spi_disable_blockprotect,
5933.write= spi_aai_write,
5934.read= spi_chip_read,
5935.voltage= {2700, 3600},
5936},
5937
5938{
5939.vendor= "SST",
5940.name= "SST25VF080B",
5941.bustype= BUS_SPI,
5942.manufacture_id= SST_ID,
5943.model_id= SST_SST25VF080B,
5944.total_size= 1024,
5945.page_size= 256,
5946.tested= TEST_OK_PREW,
5947.probe= probe_spi_rdid,
5948.probe_timing= TIMING_ZERO,
5949.block_erasers=
5950{
5951{
5952.eraseblocks = { {4 * 1024, 256} },
5953.block_erase = spi_block_erase_20,
5954}, {
5955.eraseblocks = { {32 * 1024, 32} },
5956.block_erase = spi_block_erase_52,
5957}, {
5958.eraseblocks = { {64 * 1024, 16} },
5959.block_erase = spi_block_erase_d8,
5960}, {
5961.eraseblocks = { {1024 * 1024, 1} },
5962.block_erase = spi_block_erase_60,
5963}, {
5964.eraseblocks = { {1024 * 1024, 1} },
5965.block_erase = spi_block_erase_c7,
5966},
5967},
5968.unlock= spi_disable_blockprotect,
5969.write= spi_aai_write,
5970.read= spi_chip_read,
5971.voltage= {2700, 3600},
5972},
5973
5974{
5975.vendor= "SST",
5976.name= "SST28SF040A",
5977.bustype= BUS_PARALLEL,
5978.manufacture_id= SST_ID,
5979.model_id= SST_SST28SF040,
5980.total_size= 512,
5981.page_size= 256,
5982.feature_bits= 0,
5983.tested= TEST_UNTESTED,
5984.probe= probe_82802ab,
5985.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
5986.block_erasers=
5987{
5988{
5989.eraseblocks = { {128, 4096} },
5990.block_erase = erase_sector_28sf040,
5991}, {
5992.eraseblocks = { {512 * 1024, 1} },
5993.block_erase = erase_chip_28sf040,
5994}
5995},
5996.unlock= unprotect_28sf040,
5997.write= write_28sf040,
5998.read= read_memmapped,
5999.voltage= {4500, 5500},
6000},
6001
6002{
6003.vendor= "SST",
6004.name= "SST29EE010",
6005.bustype= BUS_PARALLEL,
6006.manufacture_id= SST_ID,
6007.model_id= SST_SST29EE010,
6008.total_size= 128,
6009.page_size= 128,
6010.feature_bits= FEATURE_LONG_RESET,
6011.tested= TEST_OK_PR,
6012.probe= probe_jedec,
6013.probe_timing= 10,
6014.block_erasers=
6015{
6016{
6017.eraseblocks = { {128 * 1024, 1} },
6018.block_erase = erase_chip_block_jedec,
6019}
6020},
6021.write= write_jedec,
6022.read= read_memmapped,
6023.voltage= {4500, 5500},
6024},
6025
6026{
6027.vendor= "SST",
6028.name= "SST29LE010",
6029.bustype= BUS_PARALLEL,
6030.manufacture_id= SST_ID,
6031.model_id= SST_SST29LE010,
6032.total_size= 128,
6033.page_size= 128,
6034.feature_bits= FEATURE_LONG_RESET,
6035.tested= TEST_UNTESTED,
6036.probe= probe_jedec,
6037.probe_timing= 10,
6038.block_erasers=
6039{
6040{
6041.eraseblocks = { {128 * 1024, 1} },
6042.block_erase = erase_chip_block_jedec,
6043}
6044},
6045.write= write_jedec,
6046.read= read_memmapped,
6047.voltage= {3000, 3600},
6048},
6049
6050{
6051.vendor= "SST",
6052.name= "SST29EE020A",
6053.bustype= BUS_PARALLEL,
6054.manufacture_id= SST_ID,
6055.model_id= SST_SST29EE020A,
6056.total_size= 256,
6057.page_size= 128,
6058.feature_bits= FEATURE_LONG_RESET,
6059.tested= TEST_OK_PRE,
6060.probe= probe_jedec,
6061.probe_timing= 10,
6062.block_erasers=
6063{
6064{
6065.eraseblocks = { {256 * 1024, 1} },
6066.block_erase = erase_chip_block_jedec,
6067}
6068},
6069.write= write_jedec,
6070.read= read_memmapped,
6071.voltage= {4500, 5500},
6072},
6073
6074{
6075.vendor= "SST",
6076.name= "SST29LE020",
6077.bustype= BUS_PARALLEL,
6078.manufacture_id= SST_ID,
6079.model_id= SST_SST29LE020,
6080.total_size= 256,
6081.page_size= 128,
6082.feature_bits= FEATURE_LONG_RESET,
6083.tested= TEST_OK_PRE,
6084.probe= probe_jedec,
6085.probe_timing= 10,
6086.block_erasers=
6087{
6088{
6089.eraseblocks = { {256 * 1024, 1} },
6090.block_erase = erase_chip_block_jedec,
6091}
6092},
6093.write= write_jedec,
6094.read= read_memmapped,
6095.voltage= {3000, 3600},
6096},
6097
6098{
6099.vendor= "SST",
6100.name= "SST39SF512",
6101.bustype= BUS_PARALLEL,
6102.manufacture_id= SST_ID,
6103.model_id= SST_SST39SF512,
6104.total_size= 64,
6105.page_size= 4096,
6106.feature_bits= FEATURE_EITHER_RESET,
6107.tested= TEST_OK_PREW,
6108.probe= probe_jedec,
6109.probe_timing= 1,/* 150 ns */
6110.block_erasers=
6111{
6112{
6113.eraseblocks = { {4 * 1024, 16} },
6114.block_erase = erase_sector_jedec,
6115}, {
6116.eraseblocks = { {64 * 1024, 1} },
6117.block_erase = erase_chip_block_jedec,
6118}
6119},
6120.write= write_jedec_1,
6121.read= read_memmapped,
6122.voltage= {4500, 5500},
6123},
6124
6125{
6126.vendor= "SST",
6127.name= "SST39SF010A",
6128.bustype= BUS_PARALLEL,
6129.manufacture_id= SST_ID,
6130.model_id= SST_SST39SF010,
6131.total_size= 128,
6132.page_size= 4096,
6133.feature_bits= FEATURE_EITHER_RESET,
6134.tested= TEST_OK_PREW,
6135.probe= probe_jedec,
6136.probe_timing= 1,/* 150 ns */
6137.block_erasers=
6138{
6139{
6140.eraseblocks = { {4 * 1024, 32} },
6141.block_erase = erase_sector_jedec,
6142}, {
6143.eraseblocks = { {128 * 1024, 1} },
6144.block_erase = erase_chip_block_jedec,
6145}
6146},
6147.write= write_jedec_1,
6148.read= read_memmapped,
6149.voltage= {4500, 5500},
6150},
6151
6152{
6153.vendor= "SST",
6154.name= "SST39SF020A",
6155.bustype= BUS_PARALLEL,
6156.manufacture_id= SST_ID,
6157.model_id= SST_SST39SF020,
6158.total_size= 256,
6159.page_size= 4096,
6160.feature_bits= FEATURE_EITHER_RESET,
6161.tested= TEST_OK_PREW,
6162.probe= probe_jedec,
6163.probe_timing= 1,/* 150 ns */
6164.block_erasers=
6165{
6166{
6167.eraseblocks = { {4 * 1024, 64} },
6168.block_erase = erase_sector_jedec,
6169}, {
6170.eraseblocks = { {256 * 1024, 1} },
6171.block_erase = erase_chip_block_jedec,
6172}
6173},
6174.write= write_jedec_1,
6175.read= read_memmapped,
6176.voltage= {4500, 5500},
6177},
6178
6179{
6180.vendor= "SST",
6181.name= "SST39SF040",
6182.bustype= BUS_PARALLEL,
6183.manufacture_id= SST_ID,
6184.model_id= SST_SST39SF040,
6185.total_size= 512,
6186.page_size= 4096,
6187.feature_bits= FEATURE_EITHER_RESET,
6188.tested= TEST_OK_PREW,
6189.probe= probe_jedec,
6190.probe_timing= 1,/* 150 ns */
6191.block_erasers=
6192{
6193{
6194.eraseblocks = { {4 * 1024, 128} },
6195.block_erase = erase_sector_jedec,
6196}, {
6197.eraseblocks = { {512 * 1024, 1} },
6198.block_erase = erase_chip_block_jedec,
6199}
6200},
6201.write= write_jedec_1,
6202.read= read_memmapped,
6203.voltage= {4500, 5500},
6204},
6205
6206{
6207.vendor= "SST",
6208.name= "SST39VF512",
6209.bustype= BUS_PARALLEL,
6210.manufacture_id= SST_ID,
6211.model_id= SST_SST39VF512,
6212.total_size= 64,
6213.page_size= 4096,
6214.feature_bits= FEATURE_EITHER_RESET,
6215.tested= TEST_OK_PRE,
6216.probe= probe_jedec,
6217.probe_timing= 1,/* 150 ns */
6218.block_erasers=
6219{
6220{
6221.eraseblocks = { {4 * 1024, 16} },
6222.block_erase = erase_sector_jedec,
6223}, {
6224.eraseblocks = { {64 * 1024, 1} },
6225.block_erase = erase_chip_block_jedec,
6226}
6227},
6228.write= write_jedec_1,
6229.read= read_memmapped,
6230.voltage= {2700, 3600},
6231},
6232
6233{
6234.vendor= "SST",
6235.name= "SST39VF010",
6236.bustype= BUS_PARALLEL,
6237.manufacture_id= SST_ID,
6238.model_id= SST_SST39VF010,
6239.total_size= 128,
6240.page_size= 4096,
6241.feature_bits= FEATURE_EITHER_RESET,
6242.tested= TEST_OK_PRE,
6243.probe= probe_jedec,
6244.probe_timing= 1,/* 150 ns */
6245.block_erasers=
6246{
6247{
6248.eraseblocks = { {4 * 1024, 32} },
6249.block_erase = erase_sector_jedec,
6250}, {
6251.eraseblocks = { {128 * 1024, 1} },
6252.block_erase = erase_chip_block_jedec,
6253}
6254},
6255.write= write_jedec_1,
6256.read= read_memmapped,
6257.voltage= {2700, 3600},
6258},
6259
6260{
6261.vendor= "SST",
6262.name= "SST39VF020",
6263.bustype= BUS_PARALLEL,
6264.manufacture_id= SST_ID,
6265.model_id= SST_SST39VF020,
6266.total_size= 256,
6267.page_size= 4096,
6268.feature_bits= FEATURE_EITHER_RESET,
6269.tested= TEST_UNTESTED,
6270.probe= probe_jedec,
6271.probe_timing= 1,/* 150 ns */
6272.block_erasers=
6273{
6274{
6275.eraseblocks = { {4 * 1024, 64} },
6276.block_erase = erase_sector_jedec,
6277}, {
6278.eraseblocks = { {256 * 1024, 1} },
6279.block_erase = erase_chip_block_jedec,
6280}
6281},
6282.write= write_jedec_1,
6283.read= read_memmapped,
6284.voltage= {2700, 3600},
6285},
6286
6287{
6288.vendor= "SST",
6289.name= "SST39VF040",
6290.bustype= BUS_PARALLEL,
6291.manufacture_id= SST_ID,
6292.model_id= SST_SST39VF040,
6293.total_size= 512,
6294.page_size= 4096,
6295.feature_bits= FEATURE_EITHER_RESET,
6296.tested= TEST_UNTESTED,
6297.probe= probe_jedec,
6298.probe_timing= 1,/* 150 ns */
6299.block_erasers=
6300{
6301{
6302.eraseblocks = { {4 * 1024, 128} },
6303.block_erase = erase_sector_jedec,
6304}, {
6305.eraseblocks = { {512 * 1024, 1} },
6306.block_erase = erase_chip_block_jedec,
6307}
6308},
6309.write= write_jedec_1,
6310.read= read_memmapped,
6311.voltage= {2700, 3600},
6312},
6313
6314{
6315.vendor= "SST",
6316.name= "SST39VF080",
6317.bustype= BUS_PARALLEL,
6318.manufacture_id= SST_ID,
6319.model_id= SST_SST39VF080,
6320.total_size= 1024,
6321.page_size= 4096,
6322.feature_bits= FEATURE_EITHER_RESET,
6323.tested= TEST_UNTESTED,
6324.probe= probe_jedec,
6325.probe_timing= 1,/* 150 ns */
6326.block_erasers=
6327{
6328{
6329.eraseblocks = { {4 * 1024, 256} },
6330.block_erase = erase_sector_jedec,
6331}, {
6332.eraseblocks = { {64 * 1024, 16} },
6333.block_erase = erase_block_jedec,
6334}, {
6335.eraseblocks = { {1024 * 1024, 1} },
6336.block_erase = erase_chip_block_jedec,
6337}
6338},
6339.write= write_jedec_1,
6340.read= read_memmapped,
6341.voltage= {2700, 3600},
6342},
6343
6344{
6345.vendor= "SST",
6346.name= "SST49LF002A/B",
6347.bustype= BUS_FWH, /* A/A Mux */
6348.manufacture_id= SST_ID,
6349.model_id= SST_SST49LF002A,
6350.total_size= 256,
6351.page_size= 16 * 1024,
6352.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6353.tested= TEST_OK_PREW,
6354.probe= probe_jedec,
6355.probe_timing= 1,/* 150 ns */
6356.block_erasers=
6357{
6358{
6359.eraseblocks = { {4 * 1024, 64} },
6360.block_erase = erase_sector_jedec,
6361}, {
6362.eraseblocks = { {16 * 1024, 16} },
6363.block_erase = erase_block_jedec,
6364}, {
6365.eraseblocks = { {256 * 1024, 1} },
6366.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6367}
6368},
6369.printlock= printlock_sst_fwhub,
6370.unlock= unlock_sst_fwhub,
6371.write= write_jedec_1,
6372.read= read_memmapped,
6373.voltage= {3000, 3600},
6374},
6375
6376{
6377.vendor= "SST",
6378.name= "SST49LF003A/B",
6379.bustype= BUS_FWH, /* A/A Mux */
6380.manufacture_id= SST_ID,
6381.model_id= SST_SST49LF003A,
6382.total_size= 384,
6383.page_size= 64 * 1024,
6384.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6385.tested= TEST_OK_PR,
6386.probe= probe_jedec,
6387.probe_timing= 1,/* 150 ns */
6388.block_erasers=
6389{
6390{
6391.eraseblocks = { {4 * 1024, 96} },
6392.block_erase = erase_sector_jedec,
6393}, {
6394.eraseblocks = { {64 * 1024, 6} },
6395.block_erase = erase_block_jedec,
6396}, {
6397.eraseblocks = { {384 * 1024, 1} },
6398.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6399}
6400},
6401.printlock= printlock_sst_fwhub,
6402.unlock= unlock_sst_fwhub,
6403.write= write_jedec_1,
6404.read= read_memmapped,
6405.voltage= {3000, 3600},
6406},
6407
6408{
6409/* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
6410 * and is only honored for 64k block erase, but not 4k sector erase.
6411 */
6412.vendor= "SST",
6413.name= "SST49LF004A/B",
6414.bustype= BUS_FWH, /* A/A Mux */
6415.manufacture_id= SST_ID,
6416.model_id= SST_SST49LF004A,
6417.total_size= 512,
6418.page_size= 64 * 1024,
6419.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6420.tested= TEST_OK_PREW,
6421.probe= probe_jedec,
6422.probe_timing= 1,/* 150 ns */
6423.block_erasers=
6424{
6425{
6426.eraseblocks = { {4 * 1024, 128} },
6427.block_erase = erase_sector_jedec,
6428}, {
6429.eraseblocks = { {64 * 1024, 8} },
6430.block_erase = erase_block_jedec,
6431}, {
6432.eraseblocks = { {512 * 1024, 1} },
6433.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6434},
6435},
6436.printlock= printlock_sst_fwhub,
6437.unlock= unlock_sst_fwhub,
6438.write= write_jedec_1,
6439.read= read_memmapped,
6440.voltage= {3000, 3600},
6441},
6442
6443{
6444.vendor= "SST",
6445.name= "SST49LF004C",
6446.bustype= BUS_FWH,
6447.manufacture_id= SST_ID,
6448.model_id= SST_SST49LF004C,
6449.total_size= 512,
6450.page_size= 4 * 1024,
6451.feature_bits= FEATURE_REGISTERMAP,
6452.tested= TEST_UNTESTED,
6453.probe= probe_82802ab,
6454.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6455.block_erasers=
6456{
6457{
6458.eraseblocks = { {4 * 1024, 128} },
6459.block_erase = erase_sector_49lfxxxc,
6460}, {
6461.eraseblocks = {
6462{64 * 1024, 7},
6463{32 * 1024, 1},
6464{8 * 1024, 2},
6465{16 * 1024, 1},
6466},
6467.block_erase = erase_block_82802ab,
6468}
6469},
6470.unlock= unlock_49lfxxxc,
6471.write= write_82802ab,
6472.read= read_memmapped,
6473.voltage= {3000, 3600},
6474},
6475
6476{
6477.vendor= "SST",
6478.name= "SST49LF008A",
6479.bustype= BUS_FWH, /* A/A Mux */
6480.manufacture_id= SST_ID,
6481.model_id= SST_SST49LF008A,
6482.total_size= 1024,
6483.page_size= 64 * 1024,
6484.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6485.tested= TEST_OK_PREW,
6486.probe= probe_jedec,
6487.probe_timing= 1,/* 150 ns */
6488.block_erasers=
6489{
6490{
6491.eraseblocks = { {4 * 1024, 256} },
6492.block_erase = erase_sector_jedec,
6493}, {
6494.eraseblocks = { {64 * 1024, 16} },
6495.block_erase = erase_block_jedec,
6496}, {
6497.eraseblocks = { {1024 * 1024, 1} },
6498.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6499}
6500},
6501.printlock= printlock_sst_fwhub,
6502.unlock= unlock_sst_fwhub,
6503.write= write_jedec_1,
6504.read= read_memmapped,
6505.voltage= {3000, 3600},
6506},
6507
6508{
6509.vendor= "SST",
6510.name= "SST49LF008C",
6511.bustype= BUS_FWH,
6512.manufacture_id= SST_ID,
6513.model_id= SST_SST49LF008C,
6514.total_size= 1024,
6515.page_size= 4 * 1024,
6516.feature_bits= FEATURE_REGISTERMAP,
6517.tested= TEST_UNTESTED,
6518.probe= probe_82802ab,
6519.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6520.block_erasers=
6521{
6522{
6523.eraseblocks = { {4 * 1024, 256} },
6524.block_erase = erase_sector_49lfxxxc,
6525}, {
6526.eraseblocks = {
6527{64 * 1024, 15},
6528{32 * 1024, 1},
6529{8 * 1024, 2},
6530{16 * 1024, 1},
6531},
6532.block_erase = erase_block_82802ab,
6533}
6534},
6535.unlock= unlock_49lfxxxc,
6536.write= write_82802ab,
6537.read= read_memmapped,
6538.voltage= {3000, 3600},
6539},
6540
6541{
6542.vendor= "SST",
6543.name= "SST49LF016C",
6544.bustype= BUS_FWH,
6545.manufacture_id= SST_ID,
6546.model_id= SST_SST49LF016C,
6547.total_size= 2048,
6548.page_size= 4 * 1024,
6549.feature_bits= FEATURE_REGISTERMAP,
6550.tested= TEST_OK_PR,
6551.probe= probe_82802ab,
6552.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6553.block_erasers=
6554{
6555{
6556.eraseblocks = { {4 * 1024, 512} },
6557.block_erase = erase_sector_49lfxxxc,
6558}, {
6559.eraseblocks = {
6560{64 * 1024, 31},
6561{32 * 1024, 1},
6562{8 * 1024, 2},
6563{16 * 1024, 1},
6564},
6565.block_erase = erase_block_82802ab,
6566}
6567},
6568.unlock= unlock_49lfxxxc,
6569.write= write_82802ab,
6570.read= read_memmapped,
6571.voltage= {3000, 3600},
6572},
6573
6574{
6575.vendor= "SST",
6576.name= "SST49LF020",
6577.bustype= BUS_LPC,
6578.manufacture_id= SST_ID,
6579.model_id= SST_SST49LF020,
6580.total_size= 256,
6581.page_size= 16 * 1024,
6582.feature_bits= FEATURE_EITHER_RESET,
6583.tested= TEST_OK_PREW,
6584.probe= probe_jedec,
6585.probe_timing= 1,/* 150 ns */
6586.block_erasers=
6587{
6588{
6589.eraseblocks = { {4 * 1024, 64} },
6590.block_erase = erase_sector_jedec,
6591}, {
6592.eraseblocks = { {16 * 1024, 16} },
6593.block_erase = erase_block_jedec,
6594}, {
6595.eraseblocks = { {256 * 1024, 1} },
6596.block_erase = NULL,
6597}
6598},
6599.write= write_jedec_1,
6600.read= read_memmapped,
6601.voltage= {3000, 3600},
6602},
6603
6604{
6605.vendor= "SST",
6606.name= "SST49LF020A",
6607.bustype= BUS_LPC,
6608.manufacture_id= SST_ID,
6609.model_id= SST_SST49LF020A,
6610.total_size= 256,
6611.page_size= 4 * 1024,
6612.feature_bits= FEATURE_EITHER_RESET,
6613.tested= TEST_OK_PRE,
6614.probe= probe_jedec,
6615.probe_timing= 1,/* 150 ns */
6616.block_erasers=
6617{
6618{
6619.eraseblocks = { {4 * 1024, 64} },
6620.block_erase = erase_sector_jedec,
6621}, {
6622.eraseblocks = { {16 * 1024, 16} },
6623.block_erase = erase_block_jedec,
6624}, {
6625.eraseblocks = { {256 * 1024, 1} },
6626.block_erase = NULL,
6627}
6628},
6629.write= write_jedec_1,
6630.read= read_memmapped,
6631.voltage= {3000, 3600},
6632},
6633
6634{
6635.vendor= "SST",
6636.name= "SST49LF040",
6637.bustype= BUS_LPC,
6638.manufacture_id= SST_ID,
6639.model_id= SST_SST49LF040,
6640.total_size= 512,
6641.page_size= 4096,
6642.feature_bits= FEATURE_EITHER_RESET,
6643.tested= TEST_OK_PRE,
6644.probe= probe_jedec,
6645.probe_timing= 1,/* 150 ns */
6646.block_erasers=
6647{
6648{
6649.eraseblocks = { {4 * 1024, 128} },
6650.block_erase = erase_sector_jedec,
6651}, {
6652.eraseblocks = { {64 * 1024, 8} },
6653.block_erase = erase_block_jedec,
6654}, {
6655.eraseblocks = { {512 * 1024, 1} },
6656.block_erase = NULL,
6657}
6658},
6659.write= write_jedec_1,
6660.read= read_memmapped,
6661.voltage= {3000, 3600},
6662},
6663
6664{
6665.vendor= "SST",
6666.name= "SST49LF040B",
6667.bustype= BUS_LPC, /* A/A Mux */
6668.manufacture_id= SST_ID,
6669.model_id= SST_SST49LF040B,
6670.total_size= 512,
6671.page_size= 64 * 1024,
6672.feature_bits= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
6673.tested= TEST_OK_PREW,
6674.probe= probe_jedec,
6675.probe_timing= 1,/* 150ns */
6676.block_erasers=
6677{
6678{
6679.eraseblocks = { {4 * 1024, 128} },
6680.block_erase = erase_sector_jedec,
6681}, {
6682.eraseblocks = { {64 * 1024, 8} },
6683.block_erase = erase_block_jedec,
6684}, {
6685.eraseblocks = { {512 * 1024, 1} },
6686.block_erase = NULL,
6687}
6688},
6689.unlock= unlock_82802ab,
6690.write= write_jedec_1,
6691.read= read_memmapped,
6692.voltage= {3000, 3600},
6693},
6694
6695{
6696.vendor= "SST",
6697.name= "SST49LF080A",
6698.bustype= BUS_LPC, /* A/A Mux */
6699.manufacture_id= SST_ID,
6700 .model_id= SST_SST49LF080A,
6701.total_size= 1024,
6702.page_size= 4096,
6703.feature_bits= FEATURE_EITHER_RESET,
6704.tested= TEST_OK_PREW,
6705.probe= probe_jedec,
6706.probe_timing= TIMING_FIXME,
6707.block_erasers=
6708{
6709{
6710.eraseblocks = { {4 * 1024, 256} },
6711.block_erase = erase_sector_jedec,
6712}, {
6713.eraseblocks = { {64 * 1024, 16} },
6714.block_erase = erase_block_jedec,
6715}, {
6716.eraseblocks = { {1024 * 1024, 1} },
6717.block_erase = NULL,
6718}
6719},
6720.write= write_jedec_1,
6721.read= read_memmapped,
6722.voltage= {3000, 3600},
6723},
6724
6725{
6726.vendor= "SST",
6727.name= "SST49LF160C",
6728.bustype= BUS_LPC,
6729.manufacture_id= SST_ID,
6730.model_id= SST_SST49LF160C,
6731.total_size= 2048,
6732.page_size= 4 * 1024,
6733.feature_bits= FEATURE_REGISTERMAP,
6734.tested= TEST_OK_PRE,
6735.probe= probe_82802ab,
6736.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6737.block_erasers=
6738{
6739{
6740.eraseblocks = { {4 * 1024, 512} },
6741.block_erase = erase_sector_49lfxxxc,
6742}, {
6743.eraseblocks = {
6744{64 * 1024, 31},
6745{32 * 1024, 1},
6746{8 * 1024, 2},
6747{16 * 1024, 1},
6748},
6749.block_erase = erase_block_82802ab,
6750}
6751},
6752.unlock= unlock_49lfxxxc,
6753.write= write_82802ab,
6754.read= read_memmapped,
6755.voltage= {3000, 3600},
6756},
6757
6758{
6759.vendor= "ST",
6760.name= "M25P05-A",
6761.bustype= BUS_SPI,
6762.manufacture_id= ST_ID,
6763.model_id= ST_M25P05A,
6764.total_size= 64,
6765.page_size= 256,
6766.tested= TEST_UNTESTED,
6767.probe= probe_spi_rdid,
6768.probe_timing= TIMING_ZERO,
6769.block_erasers=
6770{
6771{
6772.eraseblocks = { {32 * 1024, 2} },
6773.block_erase = spi_block_erase_d8,
6774}, {
6775.eraseblocks = { {64 * 1024, 1} },
6776.block_erase = spi_block_erase_c7,
6777}
6778},
6779.unlock= spi_disable_blockprotect,
6780.write= spi_chip_write_256,
6781.read= spi_chip_read,
6782.voltage= {2700, 3600},
6783},
6784
6785/* The ST M25P05 is a bit of a problem. It has the same ID as the
6786 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
6787 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
6788 * only is successful if RDID does not work.
6789 */
6790{
6791.vendor= "ST",
6792.name= "M25P05",
6793.bustype= BUS_SPI,
6794.manufacture_id= 0, /* Not used. */
6795.model_id= ST_M25P05_RES,
6796.total_size= 64,
6797.page_size= 256,
6798.tested= TEST_UNTESTED,
6799.probe= probe_spi_res1,
6800.probe_timing= TIMING_ZERO,
6801.block_erasers=
6802{
6803{
6804.eraseblocks = { {32 * 1024, 2} },
6805.block_erase = spi_block_erase_d8,
6806}, {
6807.eraseblocks = { {64 * 1024, 1} },
6808.block_erase = spi_block_erase_c7,
6809}
6810},
6811.unlock= spi_disable_blockprotect,
6812.write= spi_chip_write_1, /* 128 */
6813.read= spi_chip_read,
6814.voltage= {2700, 3600},
6815},
6816
6817{
6818.vendor= "ST",
6819.name= "M25P10-A",
6820.bustype= BUS_SPI,
6821.manufacture_id= ST_ID,
6822.model_id= ST_M25P10A,
6823.total_size= 128,
6824.page_size= 256,
6825.tested= TEST_OK_PRE,
6826.probe= probe_spi_rdid,
6827.probe_timing= TIMING_ZERO,
6828.block_erasers=
6829{
6830{
6831.eraseblocks = { {32 * 1024, 4} },
6832.block_erase = spi_block_erase_d8,
6833}, {
6834.eraseblocks = { {128 * 1024, 1} },
6835.block_erase = spi_block_erase_c7,
6836}
6837},
6838.unlock= spi_disable_blockprotect,
6839.write= spi_chip_write_256,
6840.read= spi_chip_read,
6841.voltage= {2700, 3600},
6842},
6843
6844/* The ST M25P10 has the same problem as the M25P05. */
6845{
6846.vendor= "ST",
6847.name= "M25P10",
6848.bustype= BUS_SPI,
6849.manufacture_id= 0, /* Not used. */
6850.model_id= ST_M25P10_RES,
6851.total_size= 128,
6852.page_size= 256,
6853.tested= TEST_UNTESTED,
6854.probe= probe_spi_res1,
6855.probe_timing= TIMING_ZERO,
6856.block_erasers=
6857{
6858{
6859.eraseblocks = { {32 * 1024, 4} },
6860.block_erase = spi_block_erase_d8,
6861}, {
6862.eraseblocks = { {128 * 1024, 1} },
6863.block_erase = spi_block_erase_c7,
6864}
6865},
6866.unlock= spi_disable_blockprotect,
6867.write= spi_chip_write_1, /* 128 */
6868.read= spi_chip_read,
6869.voltage= {2700, 3600},
6870},
6871
6872{
6873.vendor= "ST",
6874.name= "M25P20",
6875.bustype= BUS_SPI,
6876.manufacture_id= ST_ID,
6877.model_id= ST_M25P20,
6878.total_size= 256,
6879.page_size= 256,
6880.tested= TEST_UNTESTED,
6881.probe= probe_spi_rdid,
6882.probe_timing= TIMING_ZERO,
6883.block_erasers=
6884{
6885{
6886.eraseblocks = { {64 * 1024, 4} },
6887.block_erase = spi_block_erase_d8,
6888}, {
6889.eraseblocks = { {256 * 1024, 1} },
6890.block_erase = spi_block_erase_c7,
6891}
6892},
6893.unlock= spi_disable_blockprotect,
6894.write= spi_chip_write_256,
6895.read= spi_chip_read,
6896.voltage= {2700, 3600},
6897},
6898
6899{
6900.vendor= "ST", /* Numonyx */
6901.name= "M25P40",
6902.bustype= BUS_SPI,
6903.manufacture_id= ST_ID,
6904.model_id= ST_M25P40,
6905.total_size= 512,
6906.page_size= 256,
6907.tested= TEST_OK_PR,
6908.probe= probe_spi_rdid,
6909.probe_timing= TIMING_ZERO,
6910.block_erasers=
6911{
6912{
6913.eraseblocks = { {64 * 1024, 8} },
6914.block_erase = spi_block_erase_d8,
6915}, {
6916.eraseblocks = { {512 * 1024, 1} },
6917.block_erase = spi_block_erase_c7,
6918}
6919},
6920.unlock= spi_disable_blockprotect,
6921.write= spi_chip_write_256,
6922.read= spi_chip_read,
6923.voltage= {2700, 3600},
6924},
6925
6926{
6927.vendor= "ST",
6928.name= "M25P40-old",
6929.bustype= BUS_SPI,
6930.manufacture_id= 0, /* Not used. */
6931.model_id= ST_M25P40_RES,
6932.total_size= 512,
6933.page_size= 256,
6934.tested= TEST_UNTESTED,
6935.probe= probe_spi_res1,
6936.probe_timing= TIMING_ZERO,
6937.block_erasers=
6938{
6939{
6940.eraseblocks = { {64 * 1024, 8} },
6941.block_erase = spi_block_erase_d8,
6942}, {
6943.eraseblocks = { {512 * 1024, 1} },
6944.block_erase = spi_block_erase_c7,
6945}
6946},
6947.unlock= spi_disable_blockprotect,
6948.write= spi_chip_write_256,
6949.read= spi_chip_read,
6950},
6951
6952{
6953.vendor= "ST",
6954.name= "M25P80",
6955.bustype= BUS_SPI,
6956.manufacture_id= ST_ID,
6957.model_id= ST_M25P80,
6958.total_size= 1024,
6959.page_size= 256,
6960.tested= TEST_OK_PREW,
6961.probe= probe_spi_rdid,
6962.probe_timing= TIMING_ZERO,
6963.block_erasers=
6964{
6965{
6966.eraseblocks = { {64 * 1024, 16} },
6967.block_erase = spi_block_erase_d8,
6968}, {
6969.eraseblocks = { {1024 * 1024, 1} },
6970.block_erase = spi_block_erase_c7,
6971}
6972},
6973.unlock= spi_disable_blockprotect,
6974.write= spi_chip_write_256,
6975.read= spi_chip_read,
6976.voltage= {2700, 3600},
6977},
6978
6979{
6980.vendor= "ST",
6981.name= "M25P16",
6982.bustype= BUS_SPI,
6983.manufacture_id= ST_ID,
6984.model_id= ST_M25P16,
6985.total_size= 2048,
6986.page_size= 256,
6987.tested= TEST_OK_PR,
6988.probe= probe_spi_rdid,
6989.probe_timing= TIMING_ZERO,
6990.block_erasers=
6991{
6992{
6993.eraseblocks = { {64 * 1024, 32} },
6994.block_erase = spi_block_erase_d8,
6995}, {
6996.eraseblocks = { {2 * 1024 * 1024, 1} },
6997.block_erase = spi_block_erase_c7,
6998}
6999},
7000.unlock= spi_disable_blockprotect,
7001.write= spi_chip_write_256,
7002.read= spi_chip_read,
7003.voltage= {2700, 3600},
7004},
7005
7006{
7007.vendor= "ST",
7008.name= "M25P32",
7009.bustype= BUS_SPI,
7010.manufacture_id= ST_ID,
7011.model_id= ST_M25P32,
7012.total_size= 4096,
7013.page_size= 256,
7014.tested= TEST_OK_PREW,
7015.probe= probe_spi_rdid,
7016.probe_timing= TIMING_ZERO,
7017.block_erasers=
7018{
7019{
7020.eraseblocks = { {64 * 1024, 64} },
7021.block_erase = spi_block_erase_d8,
7022}, {
7023.eraseblocks = { {4 * 1024 * 1024, 1} },
7024.block_erase = spi_block_erase_c7,
7025}
7026},
7027.unlock= spi_disable_blockprotect,
7028.write= spi_chip_write_256,
7029.read= spi_chip_read,
7030.voltage= {2700, 3600},
7031},
7032
7033{
7034.vendor= "ST",
7035.name= "M25P64",
7036.bustype= BUS_SPI,
7037.manufacture_id= ST_ID,
7038.model_id= ST_M25P64,
7039.total_size= 8192,
7040.page_size= 256,
7041.tested= TEST_UNTESTED,
7042.probe= probe_spi_rdid,
7043.probe_timing= TIMING_ZERO,
7044.block_erasers=
7045{
7046{
7047.eraseblocks = { {64 * 1024, 128} },
7048.block_erase = spi_block_erase_d8,
7049}, {
7050.eraseblocks = { {8 * 1024 * 1024, 1} },
7051.block_erase = spi_block_erase_c7,
7052}
7053},
7054.unlock= spi_disable_blockprotect,
7055.write= spi_chip_write_256,
7056.read= spi_chip_read,
7057.voltage= {2700, 3600},
7058},
7059
7060{
7061.vendor= "ST",
7062.name= "M25P128",
7063.bustype= BUS_SPI,
7064.manufacture_id= ST_ID,
7065.model_id= ST_M25P128,
7066.total_size= 16384,
7067.page_size= 256,
7068.tested= TEST_OK_PREW,
7069.probe= probe_spi_rdid,
7070.probe_timing= TIMING_ZERO,
7071.block_erasers=
7072{
7073{
7074.eraseblocks = { {256 * 1024, 64} },
7075.block_erase = spi_block_erase_d8,
7076}, {
7077.eraseblocks = { {16 * 1024 * 1024, 1} },
7078.block_erase = spi_block_erase_c7,
7079}
7080},
7081.unlock= spi_disable_blockprotect,
7082.write= spi_chip_write_256,
7083.read= spi_chip_read,
7084.voltage= {2700, 3600},
7085},
7086
7087{
7088.vendor= "ST",
7089.name= "M25PX16",
7090.bustype= BUS_SPI,
7091.manufacture_id= ST_ID,
7092.model_id= ST_M25PX16,
7093.total_size= 2048,
7094.page_size= 256,
7095.tested= TEST_OK_PREW,
7096.probe= probe_spi_rdid,
7097.probe_timing= TIMING_ZERO,
7098.block_erasers=
7099{
7100{
7101.eraseblocks = { { 4 * 1024, 512 } },
7102.block_erase = spi_block_erase_20,
7103}, {
7104.eraseblocks = { {64 * 1024, 32} },
7105.block_erase = spi_block_erase_d8,
7106}, {
7107.eraseblocks = { {2 * 1024 * 1024, 1} },
7108.block_erase = spi_block_erase_c7,
7109}
7110},
7111.unlock= spi_disable_blockprotect,
7112.write= spi_chip_write_256,
7113.read= spi_chip_read,
7114},
7115
7116{
7117.vendor= "ST",
7118.name= "M25PX32",
7119.bustype= BUS_SPI,
7120.manufacture_id= ST_ID,
7121.model_id= ST_M25PX32,
7122.total_size= 4096,
7123.page_size= 256,
7124.tested= TEST_OK_PRE,
7125.probe= probe_spi_rdid,
7126.probe_timing= TIMING_ZERO,
7127.block_erasers=
7128{
7129{
7130.eraseblocks = { { 4 * 1024, 1024 } },
7131.block_erase = spi_block_erase_20,
7132}, {
7133.eraseblocks = { {64 * 1024, 64} },
7134.block_erase = spi_block_erase_d8,
7135}, {
7136.eraseblocks = { {4 * 1024 * 1024, 1} },
7137.block_erase = spi_block_erase_c7,
7138}
7139},
7140.unlock= spi_disable_blockprotect,
7141.write= spi_chip_write_256,
7142.read= spi_chip_read,
7143.voltage= {2700, 3600},
7144},
7145
7146{
7147.vendor= "ST",
7148.name= "M25PX64",
7149.bustype= BUS_SPI,
7150.manufacture_id= ST_ID,
7151.model_id= ST_M25PX64,
7152.total_size= 8192,
7153.page_size= 256,
7154.tested= TEST_OK_PRE,
7155.probe= probe_spi_rdid,
7156.probe_timing= TIMING_ZERO,
7157.block_erasers=
7158{
7159{
7160.eraseblocks = { { 4 * 1024, 2048 } },
7161.block_erase = spi_block_erase_20,
7162}, {
7163.eraseblocks = { {64 * 1024, 128} },
7164.block_erase = spi_block_erase_d8,
7165}, {
7166.eraseblocks = { {8 * 1024 * 1024, 1} },
7167.block_erase = spi_block_erase_c7,
7168}
7169},
7170.unlock= spi_disable_blockprotect,
7171.write= spi_chip_write_256,
7172.read= spi_chip_read,
7173},
7174
7175{
7176.vendor= "ST",
7177.name= "M29F002B",
7178.bustype= BUS_PARALLEL,
7179.manufacture_id= ST_ID,
7180.model_id= ST_M29F002B,
7181.total_size= 256,
7182.page_size= 64 * 1024,
7183.feature_bits= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7184.tested= TEST_UNTESTED,
7185.probe= probe_jedec,
7186.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7187.block_erasers=
7188{
7189{
7190.eraseblocks = {
7191{16 * 1024, 1},
7192{8 * 1024, 2},
7193{32 * 1024, 1},
7194{64 * 1024, 3},
7195},
7196.block_erase = erase_sector_jedec,
7197}, {
7198.eraseblocks = { {256 * 1024, 1} },
7199.block_erase = erase_chip_block_jedec,
7200}
7201},
7202.write= write_jedec_1,
7203.read= read_memmapped,
7204.voltage= {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7205},
7206
7207{
7208.vendor= "ST",
7209.name= "M29F002T/NT",
7210.bustype= BUS_PARALLEL,
7211.manufacture_id= ST_ID,
7212.model_id= ST_M29F002T,
7213.total_size= 256,
7214.page_size= 64 * 1024,
7215.feature_bits= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7216.tested= TEST_UNTESTED,
7217.probe= probe_jedec,
7218.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7219.block_erasers=
7220{
7221{
7222.eraseblocks = {
7223{64 * 1024, 3},
7224{32 * 1024, 1},
7225{8 * 1024, 2},
7226{16 * 1024, 1},
7227},
7228.block_erase = erase_sector_jedec,
7229}, {
7230.eraseblocks = { {256 * 1024, 1} },
7231.block_erase = erase_chip_block_jedec,
7232}
7233},
7234.write= write_jedec_1,
7235.read= read_memmapped,
7236.voltage= {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7237},
7238
7239{
7240.vendor= "ST",
7241.name= "M29F040B",
7242.bustype= BUS_PARALLEL,
7243.manufacture_id= ST_ID,
7244.model_id= ST_M29F040B,
7245.total_size= 512,
7246.page_size= 64 * 1024,
7247.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7248.tested= TEST_UNTESTED,
7249.probe= probe_jedec,
7250.probe_timing= TIMING_ZERO, /* datasheet specifies no timing */
7251.block_erasers=
7252{
7253{
7254.eraseblocks = { {64 * 1024, 8}, },
7255.block_erase = erase_sector_jedec,
7256}, {
7257.eraseblocks = { {512 * 1024, 1} },
7258.block_erase = erase_chip_block_jedec,
7259}
7260},
7261.write= write_jedec_1,
7262.read= read_memmapped,
7263.voltage= {4500, 5500},
7264},
7265
7266{
7267/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7268.vendor= "ST",
7269.name= "M29F400BB",
7270.bustype= BUS_PARALLEL,
7271.manufacture_id= ST_ID,
7272.model_id= ST_M29F400BB,
7273.total_size= 512,
7274.page_size= 64 * 1024,
7275.feature_bits= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7276.tested= TEST_UNTESTED,
7277.probe= probe_m29f400bt,
7278.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7279.block_erasers=
7280{
7281{
7282.eraseblocks = {
7283{16 * 1024, 1},
7284{8 * 1024, 2},
7285{32 * 1024, 1},
7286{64 * 1024, 7},
7287},
7288.block_erase = block_erase_m29f400bt,
7289}, {
7290.eraseblocks = { {512 * 1024, 1} },
7291.block_erase = block_erase_chip_m29f400bt,
7292}
7293},
7294.write= write_m29f400bt,
7295.read= read_memmapped,
7296.voltage= {4500, 5500},
7297},
7298{
7299/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7300.vendor= "ST",
7301.name= "M29F400BT",
7302.bustype= BUS_PARALLEL,
7303.manufacture_id= ST_ID,
7304.model_id= ST_M29F400BT,
7305.total_size= 512,
7306.page_size= 64 * 1024,
7307.feature_bits= FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7308.tested= TEST_UNTESTED,
7309.probe= probe_m29f400bt,
7310.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7311.block_erasers=
7312{
7313{
7314.eraseblocks = {
7315{64 * 1024, 7},
7316{32 * 1024, 1},
7317{8 * 1024, 2},
7318{16 * 1024, 1},
7319},
7320.block_erase = block_erase_m29f400bt,
7321}, {
7322.eraseblocks = { {512 * 1024, 1} },
7323.block_erase = block_erase_chip_m29f400bt,
7324}
7325},
7326.write= write_m29f400bt,
7327.read= read_memmapped,
7328.voltage= {4500, 5500},
7329},
7330
7331{
7332.vendor= "ST",
7333.name= "M29W010B",
7334.bustype= BUS_PARALLEL,
7335.manufacture_id= ST_ID,
7336.model_id= ST_M29W010B,
7337.total_size= 128,
7338.page_size= 16 * 1024,
7339.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7340.tested= TEST_UNTESTED,
7341.probe= probe_jedec,
7342.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7343.block_erasers=
7344{
7345{
7346.eraseblocks = { {16 * 1024, 8}, },
7347.block_erase = erase_sector_jedec,
7348}, {
7349.eraseblocks = { {128 * 1024, 1} },
7350.block_erase = erase_chip_block_jedec,
7351}
7352},
7353.write= write_jedec_1,
7354.read= read_memmapped,
7355.voltage= {2700, 3600},
7356},
7357
7358{
7359.vendor= "ST",
7360.name= "M29W040B",
7361.bustype= BUS_PARALLEL,
7362.manufacture_id= ST_ID,
7363.model_id= ST_M29W040B,
7364.total_size= 512,
7365.page_size= 64 * 1024,
7366.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7367.tested= TEST_UNTESTED,
7368.probe= probe_jedec,
7369.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7370.block_erasers=
7371{
7372{
7373.eraseblocks = { {64 * 1024, 8}, },
7374.block_erase = erase_sector_jedec,
7375}, {
7376.eraseblocks = { {512 * 1024, 1} },
7377.block_erase = erase_chip_block_jedec,
7378}
7379},
7380.write= write_jedec_1,
7381.read= read_memmapped,
7382.voltage= {2700, 3600},
7383},
7384
7385 {
7386 .vendor = "ST",
7387 .name = "M29W512B",
7388.bustype= BUS_PARALLEL,
7389 .manufacture_id = ST_ID,
7390 .model_id = ST_M29W512B,
7391 .total_size = 64,
7392 .page_size = 64 * 1024,
7393 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7394.tested= TEST_OK_PRE,
7395 .probe = probe_jedec,
7396 .probe_timing = TIMING_ZERO,
7397 .block_erasers =
7398 {
7399 {
7400 .eraseblocks = { {64 * 1024, 1} },
7401 .block_erase = erase_chip_block_jedec,
7402 }
7403 },
7404 .write = write_jedec_1,
7405 .read = read_memmapped,
7406.voltage= {2700, 3600},
7407 },
7408
7409{
7410.vendor= "ST",
7411.name= "M50FLW040A",
7412.bustype= BUS_FWH | BUS_LPC, /* A/A Mux */
7413.manufacture_id= ST_ID,
7414.model_id= ST_M50FLW040A,
7415.total_size= 512,
7416.page_size= 64 * 1024,
7417.feature_bits= FEATURE_REGISTERMAP,
7418.tested= TEST_UNTESTED,
7419.probe= probe_82802ab,
7420.probe_timing= TIMING_FIXME,
7421.block_erasers=
7422{
7423{
7424.eraseblocks = {
7425{4 * 1024, 16}, /* sector */
7426{64 * 1024, 5}, /* block */
7427{4 * 1024, 16}, /* sector */
7428{4 * 1024, 16}, /* sector */
7429},
7430.block_erase = NULL,
7431}, {
7432.eraseblocks = { {64 * 1024, 8}, },
7433.block_erase = erase_block_82802ab,
7434}
7435},
7436.unlock= unlock_stm50flw0x0x,
7437.write= write_82802ab,
7438.read= read_memmapped,
7439.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7440},
7441
7442{
7443.vendor= "ST",
7444.name= "M50FLW040B",
7445.bustype= BUS_FWH | BUS_LPC, /* A/A Mux */
7446.manufacture_id= ST_ID,
7447.model_id= ST_M50FLW040B,
7448.total_size= 512,
7449.page_size= 64 * 1024,
7450.feature_bits= FEATURE_REGISTERMAP,
7451.tested= TEST_UNTESTED,
7452.probe= probe_82802ab,
7453.probe_timing= TIMING_FIXME,
7454.block_erasers=
7455{
7456{
7457.eraseblocks = {
7458{4 * 1024, 16}, /* sector */
7459{4 * 1024, 16}, /* sector */
7460{64 * 1024, 5}, /* block */
7461{4 * 1024, 16}, /* sector */
7462},
7463.block_erase = NULL,
7464}, {
7465.eraseblocks = { {64 * 1024, 8}, },
7466.block_erase = erase_block_82802ab,
7467}
7468},
7469.unlock= unlock_stm50flw0x0x,
7470.write= write_82802ab,
7471.read= read_memmapped,
7472.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7473},
7474
7475{
7476.vendor= "ST",
7477.name= "M50FLW080A",
7478.bustype= BUS_FWH | BUS_LPC, /* A/A Mux */
7479.manufacture_id= ST_ID,
7480.model_id= ST_M50FLW080A,
7481.total_size= 1024,
7482.page_size= 64 * 1024,
7483.feature_bits= FEATURE_REGISTERMAP,
7484.tested= TEST_OK_PRE,
7485.probe= probe_82802ab,
7486.probe_timing= TIMING_FIXME,
7487.block_erasers=
7488{
7489{
7490.eraseblocks = {
7491{4 * 1024, 16}, /* sector */
7492{64 * 1024, 13}, /* block */
7493{4 * 1024, 16}, /* sector */
7494{4 * 1024, 16}, /* sector */
7495},
7496.block_erase = NULL,
7497}, {
7498.eraseblocks = { {64 * 1024, 16}, },
7499.block_erase = erase_block_82802ab,
7500}
7501},
7502.unlock= unlock_stm50flw0x0x,
7503.write= write_82802ab,
7504.read= read_memmapped,
7505.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7506},
7507
7508{
7509.vendor= "ST",
7510.name= "M50FLW080B",
7511.bustype= BUS_FWH | BUS_LPC, /* A/A Mux */
7512.manufacture_id= ST_ID,
7513.model_id= ST_M50FLW080B,
7514.total_size= 1024,
7515.page_size= 64 * 1024,
7516.feature_bits= FEATURE_REGISTERMAP,
7517.tested= TEST_UNTESTED,
7518.probe= probe_82802ab,
7519.probe_timing= TIMING_FIXME,
7520.block_erasers=
7521{
7522{
7523.eraseblocks = {
7524{4 * 1024, 16}, /* sector */
7525{4 * 1024, 16}, /* sector */
7526{64 * 1024, 13}, /* block */
7527{4 * 1024, 16}, /* sector */
7528},
7529.block_erase = NULL,
7530}, {
7531.eraseblocks = { {64 * 1024, 16}, },
7532.block_erase = erase_block_82802ab,
7533}
7534},
7535.unlock= unlock_stm50flw0x0x,
7536.write= write_82802ab,
7537.read= read_memmapped,
7538.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7539},
7540
7541{
7542.vendor= "ST",
7543.name= "M50FW002",
7544.bustype= BUS_FWH, /* A/A Mux */
7545.manufacture_id= ST_ID,
7546.model_id= ST_M50FW002,
7547.total_size= 256,
7548.page_size= 64 * 1024,
7549.feature_bits= FEATURE_REGISTERMAP,
7550.tested= TEST_UNTESTED,
7551.probe= probe_82802ab,
7552.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7553.block_erasers=
7554{
7555{
7556.eraseblocks = {
7557{64 * 1024, 3},
7558{32 * 1024, 1},
7559{8 * 1024, 2},
7560{16 * 1024, 1},
7561},
7562.block_erase = erase_block_82802ab,
7563}
7564},
7565.unlock= unlock_stm50flw0x0x,
7566.write= write_82802ab,
7567.read= read_memmapped,
7568.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7569},
7570
7571{
7572.vendor= "ST",
7573.name= "M50FW016",
7574.bustype= BUS_FWH, /* A/A Mux */
7575.manufacture_id= ST_ID,
7576.model_id= ST_M50FW016,
7577.total_size= 2048,
7578.page_size= 64 * 1024,
7579.feature_bits= FEATURE_REGISTERMAP,
7580.tested= TEST_UNTESTED,
7581.probe= probe_82802ab,
7582.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
7583.block_erasers=
7584{
7585{
7586.eraseblocks = { {64 * 1024, 32}, },
7587.block_erase = erase_block_82802ab,
7588}
7589},
7590.unlock= unlock_stm50flw0x0x,
7591.write= write_82802ab,
7592.read= read_memmapped,
7593.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7594},
7595
7596{
7597.vendor= "ST",
7598.name= "M50FW040",
7599.bustype= BUS_FWH, /* A/A Mux */
7600.manufacture_id= ST_ID,
7601.model_id= ST_M50FW040,
7602.total_size= 512,
7603.page_size= 64 * 1024,
7604.feature_bits= FEATURE_REGISTERMAP,
7605.tested= TEST_OK_PR,
7606.probe= probe_82802ab,
7607.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
7608.block_erasers=
7609{
7610{
7611.eraseblocks = { {64 * 1024, 8}, },
7612.block_erase = erase_block_82802ab,
7613}
7614},
7615.unlock= unlock_stm50flw0x0x,
7616.write= write_82802ab,
7617.read= read_memmapped,
7618.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7619},
7620
7621{
7622.vendor= "ST",
7623.name= "M50FW080",
7624.bustype= BUS_FWH, /* A/A Mux */
7625.manufacture_id= ST_ID,
7626.model_id= ST_M50FW080,
7627.total_size= 1024,
7628.page_size= 64 * 1024,
7629.feature_bits= FEATURE_REGISTERMAP,
7630.tested= TEST_OK_PREW,
7631.probe= probe_82802ab,
7632.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
7633.block_erasers=
7634{
7635{
7636.eraseblocks = { {64 * 1024, 16}, },
7637.block_erase = erase_block_82802ab,
7638}
7639},
7640.unlock= unlock_stm50flw0x0x,
7641.write= write_82802ab,
7642.read= read_memmapped,
7643.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7644},
7645
7646{
7647.vendor= "ST",
7648.name= "M50LPW116",
7649.bustype= BUS_LPC, /* A/A Mux */
7650.manufacture_id= ST_ID,
7651.model_id= ST_M50LPW116,
7652.total_size= 2048,
7653.page_size= 64 * 1024,
7654.feature_bits= FEATURE_REGISTERMAP,
7655.tested= TEST_UNTESTED,
7656.probe= probe_82802ab,
7657.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7658.block_erasers=
7659{
7660{
7661.eraseblocks = {
7662{4 * 1024, 16},
7663{64 * 1024, 30},
7664{32 * 1024, 1},
7665{8 * 1024, 2},
7666{16 * 1024, 1},
7667},
7668.block_erase = erase_block_82802ab,
7669}
7670},
7671.unlock= unlock_stm50flw0x0x,
7672.write= write_82802ab,
7673.read= read_memmapped,
7674.voltage= {3000, 3600}, /* Also has 12V fast program & erase */
7675},
7676
7677{
7678.vendor= "SyncMOS/MoselVitelic",
7679.name= "{F,S,V}29C51001B",
7680.bustype= BUS_PARALLEL,
7681.manufacture_id= SYNCMOS_MVC_ID,
7682.model_id= SM_MVC_29C51001B,
7683.total_size= 128,
7684.page_size= 512,
7685.feature_bits= FEATURE_EITHER_RESET,
7686.tested= TEST_UNTESTED,
7687.probe= probe_jedec,
7688.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7689.block_erasers=
7690{
7691{
7692.eraseblocks = { {512, 256} },
7693.block_erase = erase_sector_jedec,
7694}, {
7695.eraseblocks = { {128 * 1024, 1} },
7696.block_erase = erase_chip_block_jedec,
7697},
7698},
7699.write= write_jedec_1,
7700.read= read_memmapped,
7701.voltage= {4500, 5500},
7702},
7703
7704{
7705.vendor= "SyncMOS/MoselVitelic",
7706.name= "{F,S,V}29C51001T",
7707.bustype= BUS_PARALLEL,
7708.manufacture_id= SYNCMOS_MVC_ID,
7709.model_id= SM_MVC_29C51001T,
7710.total_size= 128,
7711.page_size= 512,
7712.feature_bits= FEATURE_EITHER_RESET,
7713.tested= TEST_UNTESTED,
7714.probe= probe_jedec,
7715.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7716.block_erasers=
7717{
7718{
7719.eraseblocks = { {512, 256} },
7720.block_erase = erase_sector_jedec,
7721}, {
7722.eraseblocks = { {128 * 1024, 1} },
7723.block_erase = erase_chip_block_jedec,
7724},
7725},
7726.write= write_jedec_1,
7727.read= read_memmapped,
7728.voltage= {4500, 5500},
7729},
7730
7731{
7732.vendor= "SyncMOS/MoselVitelic",
7733.name= "{F,S,V}29C51002B",
7734.bustype= BUS_PARALLEL,
7735.manufacture_id= SYNCMOS_MVC_ID,
7736.model_id= SM_MVC_29C51002B,
7737.total_size= 256,
7738.page_size= 512,
7739.feature_bits= FEATURE_EITHER_RESET,
7740.tested= TEST_UNTESTED,
7741.probe= probe_jedec,
7742.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7743.block_erasers=
7744{
7745{
7746.eraseblocks = { {512, 512} },
7747.block_erase = erase_sector_jedec,
7748}, {
7749.eraseblocks = { {256 * 1024, 1} },
7750.block_erase = erase_chip_block_jedec,
7751},
7752},
7753.write= write_jedec_1,
7754.read= read_memmapped,
7755},
7756
7757{
7758.vendor= "SyncMOS/MoselVitelic",
7759.name= "{F,S,V}29C51002T",
7760.bustype= BUS_PARALLEL,
7761.manufacture_id= SYNCMOS_MVC_ID,
7762.model_id= SM_MVC_29C51002T,
7763.total_size= 256,
7764.page_size= 512,
7765.feature_bits= FEATURE_EITHER_RESET,
7766.tested= TEST_OK_PREW,
7767.probe= probe_jedec,
7768.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7769.block_erasers=
7770{
7771{
7772.eraseblocks = { {512, 512} },
7773.block_erase = erase_sector_jedec,
7774}, {
7775.eraseblocks = { {256 * 1024, 1} },
7776.block_erase = erase_chip_block_jedec,
7777},
7778},
7779.write= write_jedec_1,
7780.read= read_memmapped,
7781},
7782
7783{
7784.vendor= "SyncMOS/MoselVitelic",
7785.name= "{F,S,V}29C51004B",
7786.bustype= BUS_PARALLEL,
7787.manufacture_id= SYNCMOS_MVC_ID,
7788.model_id= SM_MVC_29C51004B,
7789.total_size= 512,
7790.page_size= 1024,
7791.feature_bits= FEATURE_EITHER_RESET,
7792.tested= TEST_UNTESTED,
7793.probe= probe_jedec,
7794.probe_timing= TIMING_ZERO,
7795.block_erasers=
7796{
7797{
7798.eraseblocks = { {1024, 512} },
7799.block_erase = erase_sector_jedec,
7800}, {
7801.eraseblocks = { {512 * 1024, 1} },
7802.block_erase = erase_chip_block_jedec,
7803},
7804},
7805.write= write_jedec_1,
7806.read= read_memmapped,
7807.voltage= {4500, 5500},
7808},
7809
7810{
7811.vendor= "SyncMOS/MoselVitelic",
7812.name= "{F,S,V}29C51004T",
7813.bustype= BUS_PARALLEL,
7814.manufacture_id= SYNCMOS_MVC_ID,
7815.model_id= SM_MVC_29C51004T,
7816.total_size= 512,
7817.page_size= 1024,
7818.feature_bits= FEATURE_EITHER_RESET,
7819.tested= TEST_UNTESTED,
7820.probe= probe_jedec,
7821.probe_timing= TIMING_ZERO,
7822.block_erasers=
7823{
7824{
7825.eraseblocks = { {1024, 512} },
7826.block_erase = erase_sector_jedec,
7827}, {
7828.eraseblocks = { {512 * 1024, 1} },
7829.block_erase = erase_chip_block_jedec,
7830},
7831},
7832.write= write_jedec_1,
7833.read= read_memmapped,
7834.voltage= {4500, 5500},
7835},
7836
7837{
7838.vendor= "SyncMOS/MoselVitelic",
7839.name= "{S,V}29C31004B",
7840.bustype= BUS_PARALLEL,
7841.manufacture_id= SYNCMOS_MVC_ID,
7842.model_id= SM_MVC_29C31004B,
7843.total_size= 512,
7844.page_size= 1024,
7845.feature_bits= FEATURE_EITHER_RESET,
7846.tested= TEST_UNTESTED,
7847.probe= probe_jedec,
7848.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7849.block_erasers=
7850{
7851{
7852.eraseblocks = { {1024, 512} },
7853.block_erase = erase_sector_jedec,
7854}, {
7855.eraseblocks = { {512 * 1024, 1} },
7856.block_erase = erase_chip_block_jedec,
7857},
7858},
7859.write= write_jedec_1,
7860.read= read_memmapped,
7861.voltage= {3000, 3600},
7862},
7863
7864{
7865.vendor= "SyncMOS/MoselVitelic",
7866.name= "{S,V}29C31004T",
7867.bustype= BUS_PARALLEL,
7868.manufacture_id= SYNCMOS_MVC_ID,
7869.model_id= SM_MVC_29C31004T,
7870.total_size= 512,
7871.page_size= 1024,
7872.feature_bits= FEATURE_EITHER_RESET,
7873.tested= TEST_UNTESTED,
7874.probe= probe_jedec,
7875.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7876.block_erasers=
7877{
7878{
7879.eraseblocks = { {1024, 512} },
7880.block_erase = erase_sector_jedec,
7881}, {
7882.eraseblocks = { {512 * 1024, 1} },
7883.block_erase = erase_chip_block_jedec,
7884},
7885},
7886.write= write_jedec_1,
7887.read= read_memmapped,
7888.voltage= {3000, 3600},
7889},
7890
7891{
7892.vendor= "TI",
7893.name= "TMS29F002RB",
7894.bustype= BUS_PARALLEL,
7895.manufacture_id= TI_OLD_ID,
7896.model_id= TI_TMS29F002RB,
7897.total_size= 256,
7898.page_size= 16384, /* Non-uniform sectors */
7899.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7900.tested= TEST_UNTESTED,
7901.probe= probe_jedec,
7902.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7903.block_erasers=
7904{
7905{
7906.eraseblocks = {
7907{16 * 1024, 1},
7908{8 * 1024, 2},
7909{32 * 1024, 1},
7910{64 * 1024, 3},
7911},
7912.block_erase = erase_sector_jedec,
7913}, {
7914.eraseblocks = { {256 * 1024, 1} },
7915.block_erase = erase_chip_block_jedec,
7916},
7917},
7918.write= write_jedec_1,
7919.read= read_memmapped,
7920.voltage= {4500, 5500},
7921},
7922
7923{
7924.vendor= "TI",
7925.name= "TMS29F002RT",
7926.bustype= BUS_PARALLEL,
7927.manufacture_id= TI_OLD_ID,
7928.model_id= TI_TMS29F002RT,
7929.total_size= 256,
7930.page_size= 16384, /* Non-uniform sectors */
7931.feature_bits= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7932.tested= TEST_UNTESTED,
7933.probe= probe_jedec,
7934.probe_timing= TIMING_ZERO,/* Datasheet has no timing info specified */
7935.block_erasers=
7936{
7937{
7938.eraseblocks = {
7939{64 * 1024, 3},
7940{32 * 1024, 1},
7941{8 * 1024, 2},
7942{16 * 1024, 1},
7943},
7944.block_erase = erase_sector_jedec,
7945}, {
7946.eraseblocks = { {256 * 1024, 1} },
7947.block_erase = erase_chip_block_jedec,
7948},
7949},
7950.write= write_jedec_1,
7951.read= read_memmapped,
7952.voltage= {4500, 5500},
7953},
7954
7955{
7956.vendor= "Winbond",
7957.name= "W25Q80",
7958.bustype= BUS_SPI,
7959.manufacture_id= WINBOND_NEX_ID,
7960.model_id= WINBOND_NEX_W25Q80,
7961.total_size= 1024,
7962.page_size= 256,
7963.feature_bits= FEATURE_WRSR_WREN,
7964.tested= TEST_OK_PREW,
7965.probe= probe_spi_rdid,
7966.probe_timing= TIMING_ZERO,
7967.block_erasers=
7968{
7969{
7970.eraseblocks = { {4 * 1024, 256} },
7971.block_erase = spi_block_erase_20,
7972}, {
7973.eraseblocks = { {32 * 1024, 32} },
7974.block_erase = spi_block_erase_52,
7975}, {
7976.eraseblocks = { {64 * 1024, 16} },
7977.block_erase = spi_block_erase_d8,
7978}, {
7979.eraseblocks = { {1024 * 1024, 1} },
7980.block_erase = spi_block_erase_60,
7981}, {
7982.eraseblocks = { {1024 * 1024, 1} },
7983.block_erase = spi_block_erase_c7,
7984}
7985},
7986.unlock= spi_disable_blockprotect,
7987.write= spi_chip_write_256,
7988.read= spi_chip_read,
7989.voltage= {2700, 3600},
7990},
7991
7992{
7993.vendor= "Winbond",
7994.name= "W25Q16",
7995.bustype= BUS_SPI,
7996.manufacture_id= WINBOND_NEX_ID,
7997.model_id= WINBOND_NEX_W25Q16,
7998.total_size= 2048,
7999.page_size= 256,
8000.feature_bits= FEATURE_WRSR_WREN,
8001.tested= TEST_OK_PREW,
8002.probe= probe_spi_rdid,
8003.probe_timing= TIMING_ZERO,
8004.block_erasers=
8005{
8006{
8007.eraseblocks = { {4 * 1024, 512} },
8008.block_erase = spi_block_erase_20,
8009}, {
8010.eraseblocks = { {32 * 1024, 64} },
8011.block_erase = spi_block_erase_52,
8012}, {
8013.eraseblocks = { {64 * 1024, 32} },
8014.block_erase = spi_block_erase_d8,
8015}, {
8016.eraseblocks = { {2 * 1024 * 1024, 1} },
8017.block_erase = spi_block_erase_60,
8018}, {
8019.eraseblocks = { {2 * 1024 * 1024, 1} },
8020.block_erase = spi_block_erase_c7,
8021}
8022},
8023.unlock= spi_disable_blockprotect,
8024.write= spi_chip_write_256,
8025.read= spi_chip_read,
8026.voltage= {2700, 3600},
8027},
8028
8029{
8030.vendor= "Winbond",
8031.name= "W25Q32",
8032.bustype= BUS_SPI,
8033.manufacture_id= WINBOND_NEX_ID,
8034.model_id= WINBOND_NEX_W25Q32,
8035.total_size= 4096,
8036.page_size= 256,
8037.feature_bits= FEATURE_WRSR_WREN,
8038.tested= TEST_OK_PREW,
8039.probe= probe_spi_rdid,
8040.probe_timing= TIMING_ZERO,
8041.block_erasers=
8042{
8043{
8044.eraseblocks = { {4 * 1024, 1024} },
8045.block_erase = spi_block_erase_20,
8046}, {
8047.eraseblocks = { {32 * 1024, 128} },
8048.block_erase = spi_block_erase_52,
8049}, {
8050.eraseblocks = { {64 * 1024, 64} },
8051.block_erase = spi_block_erase_d8,
8052}, {
8053.eraseblocks = { {4 * 1024 * 1024, 1} },
8054.block_erase = spi_block_erase_60,
8055}, {
8056.eraseblocks = { {4 * 1024 * 1024, 1} },
8057.block_erase = spi_block_erase_c7,
8058}
8059},
8060.unlock= spi_disable_blockprotect,
8061.write= spi_chip_write_256,
8062.read= spi_chip_read,
8063.voltage= {2700, 3600},
8064},
8065
8066{
8067.vendor= "Winbond",
8068.name= "W25Q64",
8069.bustype= BUS_SPI,
8070.manufacture_id= WINBOND_NEX_ID,
8071.model_id= WINBOND_NEX_W25Q64,
8072.total_size= 8192,
8073.page_size= 256,
8074.feature_bits= FEATURE_WRSR_WREN,
8075.tested= TEST_OK_PREW,
8076.probe= probe_spi_rdid,
8077.probe_timing= TIMING_ZERO,
8078.block_erasers=
8079{
8080{
8081.eraseblocks = { {4 * 1024, 2048} },
8082.block_erase = spi_block_erase_20,
8083}, {
8084.eraseblocks = { {32 * 1024, 256} },
8085.block_erase = spi_block_erase_52,
8086}, {
8087.eraseblocks = { {64 * 1024, 128} },
8088.block_erase = spi_block_erase_d8,
8089}, {
8090.eraseblocks = { {8 * 1024 * 1024, 1} },
8091.block_erase = spi_block_erase_60,
8092}, {
8093.eraseblocks = { {8 * 1024 * 1024, 1} },
8094.block_erase = spi_block_erase_c7,
8095}
8096},
8097.unlock= spi_disable_blockprotect,
8098.write= spi_chip_write_256,
8099.read= spi_chip_read,
8100},
8101
8102{
8103.vendor= "Winbond",
8104.name= "W25Q128",
8105.bustype= BUS_SPI,
8106.manufacture_id= WINBOND_NEX_ID,
8107.model_id= WINBOND_NEX_W25Q128,
8108.total_size= 16384,
8109.page_size= 256,
8110.feature_bits= FEATURE_WRSR_WREN,
8111.tested= TEST_OK_PROBE,
8112.probe= probe_spi_rdid,
8113.probe_timing= TIMING_ZERO,
8114.block_erasers=
8115{
8116{
8117.eraseblocks = { {4 * 1024, 4096} },
8118.block_erase = spi_block_erase_20,
8119}, {
8120.eraseblocks = { {32 * 1024, 512} },
8121.block_erase = spi_block_erase_52,
8122}, {
8123.eraseblocks = { {64 * 1024, 256} },
8124.block_erase = spi_block_erase_d8,
8125}, {
8126.eraseblocks = { {16 * 1024 * 1024, 1} },
8127.block_erase = spi_block_erase_60,
8128}, {
8129.eraseblocks = { {16 * 1024 * 1024, 1} },
8130.block_erase = spi_block_erase_c7,
8131}
8132},
8133.unlock= spi_disable_blockprotect,
8134.write= spi_chip_write_256,
8135.read= spi_chip_read,
8136},
8137
8138{
8139.vendor= "Winbond",
8140.name= "W25X10",
8141.bustype= BUS_SPI,
8142.manufacture_id= WINBOND_NEX_ID,
8143.model_id= WINBOND_NEX_W25X10,
8144.total_size= 128,
8145.page_size= 256,
8146.feature_bits= FEATURE_WRSR_WREN,
8147.tested= TEST_UNTESTED,
8148.probe= probe_spi_rdid,
8149.probe_timing= TIMING_ZERO,
8150.block_erasers=
8151{
8152{
8153.eraseblocks = { {4 * 1024, 32} },
8154.block_erase = spi_block_erase_20,
8155}, {
8156.eraseblocks = { {64 * 1024, 2} },
8157.block_erase = spi_block_erase_d8,
8158}, {
8159.eraseblocks = { {128 * 1024, 1} },
8160.block_erase = spi_block_erase_c7,
8161}
8162},
8163.unlock= spi_disable_blockprotect,
8164.write= spi_chip_write_256,
8165.read= spi_chip_read,
8166.voltage= {2700, 3600},
8167},
8168
8169{
8170.vendor= "Winbond",
8171.name= "W25X20",
8172.bustype= BUS_SPI,
8173.manufacture_id= WINBOND_NEX_ID,
8174.model_id= WINBOND_NEX_W25X20,
8175.total_size= 256,
8176.page_size= 256,
8177.feature_bits= FEATURE_WRSR_WREN,
8178.tested= TEST_UNTESTED,
8179.probe= probe_spi_rdid,
8180.probe_timing= TIMING_ZERO,
8181.block_erasers=
8182{
8183{
8184.eraseblocks = { {4 * 1024, 64} },
8185.block_erase = spi_block_erase_20,
8186}, {
8187.eraseblocks = { {64 * 1024, 4} },
8188.block_erase = spi_block_erase_d8,
8189}, {
8190.eraseblocks = { {256 * 1024, 1} },
8191.block_erase = spi_block_erase_c7,
8192}
8193},
8194.unlock= spi_disable_blockprotect,
8195.write= spi_chip_write_256,
8196.read= spi_chip_read,
8197.voltage= {2700, 3600},
8198},
8199
8200{
8201.vendor= "Winbond",
8202.name= "W25X40",
8203.bustype= BUS_SPI,
8204.manufacture_id= WINBOND_NEX_ID,
8205.model_id= WINBOND_NEX_W25X40,
8206.total_size= 512,
8207.page_size= 256,
8208.feature_bits= FEATURE_WRSR_WREN,
8209.tested= TEST_OK_PREW,
8210.probe= probe_spi_rdid,
8211.probe_timing= TIMING_ZERO,
8212.block_erasers=
8213{
8214{
8215.eraseblocks = { {4 * 1024, 128} },
8216.block_erase = spi_block_erase_20,
8217}, {
8218.eraseblocks = { {64 * 1024, 8} },
8219.block_erase = spi_block_erase_d8,
8220}, {
8221.eraseblocks = { {512 * 1024, 1} },
8222.block_erase = spi_block_erase_c7,
8223}
8224},
8225.unlock= spi_disable_blockprotect,
8226.write= spi_chip_write_256,
8227.read= spi_chip_read,
8228.voltage= {2700, 3600},
8229},
8230
8231{
8232.vendor= "Winbond",
8233.name= "W25X80",
8234.bustype= BUS_SPI,
8235.manufacture_id= WINBOND_NEX_ID,
8236.model_id= WINBOND_NEX_W25X80,
8237.total_size= 1024,
8238.page_size= 256,
8239.feature_bits= FEATURE_WRSR_WREN,
8240.tested= TEST_OK_PREW,
8241.probe= probe_spi_rdid,
8242.probe_timing= TIMING_ZERO,
8243.block_erasers=
8244{
8245{
8246.eraseblocks = { {4 * 1024, 256} },
8247.block_erase = spi_block_erase_20,
8248}, {
8249.eraseblocks = { {64 * 1024, 16} },
8250.block_erase = spi_block_erase_d8,
8251}, {
8252.eraseblocks = { {1024 * 1024, 1} },
8253.block_erase = spi_block_erase_c7,
8254}
8255},
8256.unlock= spi_disable_blockprotect,
8257.write= spi_chip_write_256,
8258.read= spi_chip_read,
8259.voltage= {2700, 3600},
8260},
8261
8262{
8263.vendor= "Winbond",
8264.name= "W25X16",
8265.bustype= BUS_SPI,
8266.manufacture_id= WINBOND_NEX_ID,
8267.model_id= WINBOND_NEX_W25X16,
8268.total_size= 2048,
8269.page_size= 256,
8270.feature_bits= FEATURE_WRSR_WREN,
8271.tested= TEST_OK_PREW,
8272.probe= probe_spi_rdid,
8273.probe_timing= TIMING_ZERO,
8274.block_erasers=
8275{
8276{
8277.eraseblocks = { {4 * 1024, 512} },
8278.block_erase = spi_block_erase_20,
8279}, {
8280.eraseblocks = { {32 * 1024, 64} },
8281.block_erase = spi_block_erase_52,
8282}, {
8283.eraseblocks = { {64 * 1024, 32} },
8284.block_erase = spi_block_erase_d8,
8285}, {
8286.eraseblocks = { {2 * 1024 * 1024, 1} },
8287.block_erase = spi_block_erase_60,
8288}, {
8289.eraseblocks = { {2 * 1024 * 1024, 1} },
8290.block_erase = spi_block_erase_c7,
8291}
8292},
8293.unlock= spi_disable_blockprotect,
8294.write= spi_chip_write_256,
8295.read= spi_chip_read,
8296.voltage= {2700, 3600},
8297},
8298
8299{
8300.vendor= "Winbond",
8301.name= "W25X32",
8302.bustype= BUS_SPI,
8303.manufacture_id= WINBOND_NEX_ID,
8304.model_id= WINBOND_NEX_W25X32,
8305.total_size= 4096,
8306.page_size= 256,
8307.feature_bits= FEATURE_WRSR_WREN,
8308.tested= TEST_OK_PROBE,
8309.probe= probe_spi_rdid,
8310.probe_timing= TIMING_ZERO,
8311.block_erasers=
8312{
8313{
8314.eraseblocks = { {4 * 1024, 1024} },
8315.block_erase = spi_block_erase_20,
8316}, {
8317.eraseblocks = { {32 * 1024, 128} },
8318.block_erase = spi_block_erase_52,
8319}, {
8320.eraseblocks = { {64 * 1024, 64} },
8321.block_erase = spi_block_erase_d8,
8322}, {
8323.eraseblocks = { {4 * 1024 * 1024, 1} },
8324.block_erase = spi_block_erase_60,
8325}, {
8326.eraseblocks = { {4 * 1024 * 1024, 1} },
8327.block_erase = spi_block_erase_c7,
8328}
8329},
8330.unlock= spi_disable_blockprotect,
8331.write= spi_chip_write_256,
8332.read= spi_chip_read,
8333.voltage= {2700, 3600},
8334},
8335
8336{
8337.vendor= "Winbond",
8338.name= "W25X64",
8339.bustype= BUS_SPI,
8340.manufacture_id= WINBOND_NEX_ID,
8341.model_id= WINBOND_NEX_W25X64,
8342.total_size= 8192,
8343.page_size= 256,
8344.feature_bits= FEATURE_WRSR_WREN,
8345.tested= TEST_OK_PROBE,
8346.probe= probe_spi_rdid,
8347.probe_timing= TIMING_ZERO,
8348.block_erasers=
8349{
8350{
8351.eraseblocks = { {4 * 1024, 2048} },
8352.block_erase = spi_block_erase_20,
8353}, {
8354.eraseblocks = { {32 * 1024, 256} },
8355.block_erase = spi_block_erase_52,
8356}, {
8357.eraseblocks = { {64 * 1024, 128} },
8358.block_erase = spi_block_erase_d8,
8359}, {
8360.eraseblocks = { {8 * 1024 * 1024, 1} },
8361.block_erase = spi_block_erase_60,
8362}, {
8363.eraseblocks = { {8 * 1024 * 1024, 1} },
8364.block_erase = spi_block_erase_c7,
8365}
8366},
8367.unlock= spi_disable_blockprotect,
8368.write= spi_chip_write_256,
8369.read= spi_chip_read,
8370.voltage= {2700, 3600},
8371},
8372
8373{
8374.vendor= "Winbond",
8375.name= "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
8376.bustype= BUS_PARALLEL,
8377.manufacture_id= WINBOND_ID,
8378.model_id= WINBOND_W29C010,
8379.total_size= 128,
8380.page_size= 128,
8381.feature_bits= FEATURE_LONG_RESET,
8382.tested= TEST_OK_PRE,
8383.probe= probe_w29ee011,
8384.probe_timing= TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
8385.block_erasers=
8386{
8387{
8388.eraseblocks = { {128 * 1024, 1} },
8389.block_erase = erase_chip_block_jedec,
8390}
8391},
8392.write= write_jedec,
8393.read= read_memmapped,
8394},
8395
8396{/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
8397.vendor= "Winbond",
8398.name= "W29C010(M)/W29C011A/W29EE011/W29EE012",
8399.bustype= BUS_PARALLEL,
8400.manufacture_id= WINBOND_ID,
8401.model_id= WINBOND_W29C010,
8402.total_size= 128,
8403.page_size= 128,
8404.feature_bits= FEATURE_LONG_RESET,
8405.tested= TEST_OK_PREW,
8406.probe= probe_jedec,
8407.probe_timing= 10,/* used datasheet for the W29C011A */
8408.block_erasers=
8409{
8410{
8411.eraseblocks = { {128 * 1024, 1} },
8412.block_erase = erase_chip_block_jedec,
8413}
8414},
8415.write= write_jedec,
8416.read= read_memmapped,
8417},
8418
8419{
8420.vendor= "Winbond",
8421.name= "W29C020(C)/W29C022",
8422.bustype= BUS_PARALLEL,
8423.manufacture_id= WINBOND_ID,
8424.model_id= WINBOND_W29C020,
8425.total_size= 256,
8426.page_size= 128,
8427.feature_bits= FEATURE_LONG_RESET,
8428.tested= TEST_OK_PREW,
8429.probe= probe_jedec,
8430.probe_timing= 10,
8431.block_erasers=
8432{
8433{
8434.eraseblocks = { {256 * 1024, 1} },
8435.block_erase = erase_chip_block_jedec,
8436}
8437},
8438.write= write_jedec,
8439.read= read_memmapped,
8440.voltage= {4500, 5500},
8441},
8442
8443{
8444.vendor= "Winbond",
8445.name= "W29C040/P",
8446.bustype= BUS_PARALLEL,
8447.manufacture_id= WINBOND_ID,
8448.model_id= WINBOND_W29C040,
8449.total_size= 512,
8450.page_size= 256,
8451.feature_bits= FEATURE_LONG_RESET,
8452.tested= TEST_UNTESTED,
8453.probe= probe_jedec,
8454.probe_timing= 10,
8455.block_erasers=
8456{
8457{
8458.eraseblocks = { {512 * 1024, 1} },
8459.block_erase = erase_chip_block_jedec,
8460}
8461},
8462.write= write_jedec,
8463.read= read_memmapped,
8464.voltage= {4500, 5500},
8465},
8466
8467{
8468.vendor= "Winbond",
8469.name= "W39L040",
8470.bustype= BUS_PARALLEL,
8471.manufacture_id= WINBOND_ID,
8472.model_id= WINBOND_W39L040,
8473.total_size= 512,
8474.page_size= 64 * 1024,
8475.feature_bits= FEATURE_EITHER_RESET,
8476.tested= TEST_OK_PR,
8477.probe= probe_jedec,
8478.probe_timing= 10,
8479.block_erasers=
8480{
8481{
8482.eraseblocks = { {4 * 1024, 128} },
8483.block_erase = erase_block_jedec,
8484}, {
8485.eraseblocks = { {64 * 1024, 8} },
8486.block_erase = erase_sector_jedec,
8487}, {
8488.eraseblocks = { {512 * 1024, 1} },
8489.block_erase = erase_chip_block_jedec,
8490}
8491},
8492.printlock= printlock_w39l040,
8493.write= write_jedec_1,
8494.read= read_memmapped,
8495.voltage= {3000, 3600},
8496},
8497
8498{
8499.vendor= "Winbond",
8500.name= "W39V040A",
8501.bustype= BUS_LPC,
8502.manufacture_id= WINBOND_ID,
8503.model_id= WINBOND_W39V040A,
8504.total_size= 512,
8505.page_size= 64 * 1024,
8506.feature_bits= FEATURE_EITHER_RESET,
8507.tested= TEST_OK_PREW,
8508.probe= probe_jedec,
8509.probe_timing= 10,
8510.block_erasers=
8511{
8512{
8513.eraseblocks = { {64 * 1024, 8} },
8514.block_erase = erase_sector_jedec,
8515}, {
8516.eraseblocks = { {512 * 1024, 1} },
8517.block_erase = erase_chip_block_jedec,
8518}
8519},
8520.printlock= printlock_w39v040a,
8521.write= write_jedec_1,
8522.read= read_memmapped,
8523.voltage= {3000, 3600},
8524},
8525
8526{
8527.vendor= "Winbond",
8528.name= "W39V040B",
8529.bustype= BUS_LPC,
8530.manufacture_id= WINBOND_ID,
8531.model_id= WINBOND_W39V040B,
8532.total_size= 512,
8533.page_size= 64 * 1024,
8534.feature_bits= FEATURE_EITHER_RESET,
8535.tested= TEST_OK_PREW,
8536.probe= probe_jedec,
8537.probe_timing= 10,
8538.block_erasers=
8539{
8540{
8541.eraseblocks = { {64 * 1024, 8} },
8542.block_erase = erase_sector_jedec,
8543}, {
8544.eraseblocks = { {512 * 1024, 1} },
8545.block_erase = erase_chip_block_jedec,
8546}
8547},
8548.printlock= printlock_w39v040b,
8549.write= write_jedec_1,
8550.read= read_memmapped,
8551.voltage= {3000, 3600},
8552},
8553
8554{
8555.vendor= "Winbond",
8556.name= "W39V040C",
8557.bustype= BUS_LPC,
8558.manufacture_id= WINBOND_ID,
8559.model_id= WINBOND_W39V040C,
8560.total_size= 512,
8561.page_size= 64 * 1024,
8562.feature_bits= FEATURE_EITHER_RESET,
8563.tested= TEST_OK_PREW,
8564.probe= probe_jedec,
8565.probe_timing= 10,
8566.block_erasers=
8567{
8568{
8569.eraseblocks = { {64 * 1024, 8} },
8570.block_erase = erase_sector_jedec,
8571}, {
8572.eraseblocks = { {512 * 1024, 1} },
8573.block_erase = erase_chip_block_jedec,
8574}
8575},
8576.printlock= printlock_w39v040c,
8577.write= write_jedec_1,
8578.read= read_memmapped,
8579.voltage= {3000, 3600},
8580},
8581
8582{
8583.vendor= "Winbond",
8584.name= "W39V040FA",
8585.bustype= BUS_FWH,
8586.manufacture_id= WINBOND_ID,
8587.model_id= WINBOND_W39V040FA,
8588.total_size= 512,
8589.page_size= 64 * 1024,
8590.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
8591.tested= TEST_OK_PREW,
8592.probe= probe_jedec,
8593.probe_timing= 10,
8594.block_erasers=
8595{
8596{
8597.eraseblocks = { {4 * 1024, 128} },
8598.block_erase = erase_block_jedec,
8599}, {
8600.eraseblocks = { {64 * 1024, 8} },
8601.block_erase = erase_sector_jedec,
8602}, {
8603.eraseblocks = { {512 * 1024, 1} },
8604.block_erase = erase_chip_block_jedec,
8605}
8606},
8607.printlock= printlock_w39v040fa,
8608.unlock= unlock_sst_fwhub,
8609.write= write_jedec_1,
8610.read= read_memmapped,
8611.voltage= {3000, 3600},
8612},
8613
8614{
8615.vendor= "Winbond",
8616.name= "W39V040FB",
8617.bustype= BUS_FWH,
8618.manufacture_id= WINBOND_ID,
8619.model_id= WINBOND_W39V040B,
8620.total_size= 512,
8621.page_size= 64 * 1024,
8622.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
8623.tested= TEST_OK_PREW,
8624.probe= probe_jedec,
8625.probe_timing= 10,
8626.block_erasers=
8627{
8628{
8629.eraseblocks = { {64 * 1024, 8} },
8630.block_erase = erase_sector_jedec,
8631}, {
8632.eraseblocks = { {512 * 1024, 1} },
8633.block_erase = erase_chip_block_jedec,
8634}
8635},
8636.printlock= printlock_w39v040fb,
8637.unlock= unlock_w39v040fb,
8638.write= write_jedec_1,
8639.read= read_memmapped,
8640.voltage= {3000, 3600}, /* Also has 12V fast program */
8641},
8642
8643{
8644.vendor= "Winbond",
8645.name= "W39V040FC",
8646.bustype= BUS_FWH,
8647.manufacture_id= WINBOND_ID,
8648.model_id= WINBOND_W39V040C,
8649.total_size= 512,
8650.page_size= 64 * 1024,
8651.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
8652.tested= TEST_OK_PREW,
8653.probe= probe_jedec,
8654.probe_timing= 10,
8655.block_erasers=
8656{
8657{
8658.eraseblocks = { {64 * 1024, 8} },
8659.block_erase = erase_sector_jedec,
8660}, {
8661.eraseblocks = { {512 * 1024, 1} },
8662.block_erase = erase_chip_block_jedec,
8663}
8664},
8665.printlock= printlock_w39v040fc,
8666.write= write_jedec_1,
8667.read= read_memmapped,
8668.voltage= {3000, 3600}, /* Also has 12V fast program */
8669},
8670
8671{
8672.vendor= "Winbond",
8673.name= "W39V080A",
8674.bustype= BUS_LPC,
8675.manufacture_id= WINBOND_ID,
8676.model_id= WINBOND_W39V080A,
8677.total_size= 1024,
8678.page_size= 64 * 1024,
8679.feature_bits= FEATURE_EITHER_RESET,
8680.tested= TEST_UNTESTED,
8681.probe= probe_jedec,
8682.probe_timing= 10,
8683.block_erasers=
8684{
8685{
8686.eraseblocks = { {64 * 1024, 16} },
8687.block_erase = erase_sector_jedec,
8688}, {
8689.eraseblocks = { {1024 * 1024, 1} },
8690.block_erase = erase_chip_block_jedec,
8691}
8692},
8693.printlock= printlock_w39v080a,
8694.write= write_jedec_1,
8695.read= read_memmapped,
8696.voltage= {3000, 3600},
8697},
8698
8699{
8700.vendor= "Winbond",
8701.name= "W49F002U/N",
8702.bustype= BUS_PARALLEL,
8703.manufacture_id= WINBOND_ID,
8704.model_id= WINBOND_W49F002U,
8705.total_size= 256,
8706.page_size= 128,
8707.feature_bits= FEATURE_EITHER_RESET,
8708.tested= TEST_OK_PREW,
8709.probe= probe_jedec,
8710.probe_timing= 10,
8711.block_erasers=
8712{
8713{
8714.eraseblocks = {
8715{128 * 1024, 1},
8716{96 * 1024, 1},
8717{8 * 1024, 2},
8718{16 * 1024, 1},
8719},
8720.block_erase = erase_sector_jedec,
8721}, {
8722.eraseblocks = { {256 * 1024, 1} },
8723.block_erase = erase_chip_block_jedec,
8724}
8725},
8726.write= write_jedec_1,
8727.read= read_memmapped,
8728.voltage= {4500, 5500},
8729},
8730
8731{
8732.vendor= "Winbond",
8733.name= "W49F020",
8734.bustype= BUS_PARALLEL,
8735.manufacture_id= WINBOND_ID,
8736.model_id= WINBOND_W49F020,
8737.total_size= 256,
8738.page_size= 128,
8739.feature_bits= FEATURE_EITHER_RESET,
8740.tested= TEST_OK_PROBE,
8741.probe= probe_jedec,
8742.probe_timing= 10,
8743.block_erasers=
8744{
8745{
8746.eraseblocks = { {256 * 1024, 1} },
8747.block_erase = erase_chip_block_jedec,
8748}
8749},
8750.write= write_jedec_1,
8751.read= read_memmapped,
8752.voltage= {4500, 5500},
8753},
8754
8755{
8756.vendor= "Winbond",
8757.name= "W49V002A",
8758.bustype= BUS_LPC,
8759.manufacture_id= WINBOND_ID,
8760.model_id= WINBOND_W49V002A,
8761.total_size= 256,
8762.page_size= 128,
8763.feature_bits= FEATURE_EITHER_RESET,
8764.tested= TEST_OK_PREW,
8765.probe= probe_jedec,
8766.probe_timing= 10,
8767.block_erasers=
8768{
8769{
8770.eraseblocks = {
8771{64 * 1024, 3},
8772{32 * 1024, 1},
8773{8 * 1024, 2},
8774{16 * 1024, 1},
8775},
8776.block_erase = erase_sector_jedec,
8777}, {
8778.eraseblocks = { {256 * 1024, 1} },
8779.block_erase = erase_chip_block_jedec,
8780}
8781},
8782.write= write_jedec_1,
8783.read= read_memmapped,
8784.voltage= {3000, 3600},
8785},
8786
8787{
8788.vendor= "Winbond",
8789.name= "W49V002FA",
8790.bustype= BUS_FWH,
8791.manufacture_id= WINBOND_ID,
8792.model_id= WINBOND_W49V002FA,
8793.total_size= 256,
8794.page_size= 128,
8795.feature_bits= FEATURE_EITHER_RESET,
8796.tested= TEST_OK_PR,
8797.probe= probe_jedec,
8798.probe_timing= 10,
8799.block_erasers=
8800{
8801{
8802.eraseblocks = {
8803{64 * 1024, 3},
8804{32 * 1024, 1},
8805{8 * 1024, 2},
8806{16 * 1024, 1},
8807},
8808.block_erase = erase_sector_jedec,
8809}, {
8810.eraseblocks = { {256 * 1024, 1} },
8811.block_erase = erase_chip_block_jedec,
8812}
8813},
8814.write= write_jedec_1,
8815.read= read_memmapped,
8816.voltage= {3000, 3600},
8817},
8818
8819{
8820.vendor= "Winbond",
8821.name= "W39V080FA",
8822.bustype= BUS_FWH,
8823.manufacture_id= WINBOND_ID,
8824.model_id= WINBOND_W39V080FA,
8825.total_size= 1024,
8826.page_size= 64 * 1024,
8827.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
8828.tested= TEST_OK_PREW,
8829.probe= probe_jedec,
8830.probe_timing= 10,
8831.block_erasers=
8832{
8833{
8834.eraseblocks = { {64 * 1024, 16}, },
8835.block_erase = erase_sector_jedec,
8836}, {
8837.eraseblocks = { {1024 * 1024, 1} },
8838.block_erase = erase_chip_block_jedec,
8839}
8840},
8841.printlock= printlock_w39v080fa,
8842.unlock= unlock_w39v080fa,
8843.write= write_jedec_1,
8844.read= read_memmapped,
8845.voltage= {3000, 3600}, /* Also has 12V fast program */
8846},
8847
8848{
8849.vendor= "Winbond",
8850.name= "W39V080FA (dual mode)",
8851.bustype= BUS_FWH,
8852.manufacture_id= WINBOND_ID,
8853.model_id= WINBOND_W39V080FA_DM,
8854.total_size= 512,
8855.page_size= 64 * 1024,
8856.feature_bits= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
8857.tested= TEST_UNTESTED,
8858.probe= probe_jedec,
8859.probe_timing= 10,
8860.block_erasers=
8861{
8862{
8863.eraseblocks = { {64 * 1024, 8}, },
8864.block_erase = erase_sector_jedec,
8865}, {
8866.eraseblocks = { {512 * 1024, 1} },
8867.block_erase = erase_chip_block_jedec,
8868}
8869},
8870.printlock= printlock_w39v080fa_dual,
8871.write= write_jedec_1,
8872.read= read_memmapped,
8873.voltage= {3000, 3600}, /* Also has 12V fast program */
8874},
8875
8876{
8877.vendor= "Programmer",
8878.name= "Opaque flash chip",
8879.bustype= BUS_PROG,
8880.manufacture_id= PROGMANUF_ID,
8881.model_id= PROGDEV_ID,
8882.total_size= 0,
8883.page_size= 256,
8884/* probe is assumed to work, rest will be filled in by probe */
8885.tested= TEST_OK_PROBE,
8886.probe= probe_opaque,
8887/* eraseblock sizes will be set by the probing function */
8888.block_erasers=
8889{
8890{
8891.block_erase = erase_opaque,
8892}
8893},
8894.write= write_opaque,
8895.read= read_opaque,
8896},
8897
8898{
8899.vendor= "AMIC",
8900.name= "unknown AMIC SPI chip",
8901.bustype= BUS_SPI,
8902.manufacture_id= AMIC_ID,
8903.model_id= GENERIC_DEVICE_ID,
8904.total_size= 0,
8905.page_size= 256,
8906.tested= TEST_BAD_PREW,
8907.probe= probe_spi_rdid4,
8908.probe_timing= TIMING_ZERO,
8909.write= NULL,
8910.read= NULL,
8911},
8912
8913{
8914.vendor= "Atmel",
8915.name= "unknown Atmel SPI chip",
8916.bustype= BUS_SPI,
8917.manufacture_id= ATMEL_ID,
8918.model_id= GENERIC_DEVICE_ID,
8919.total_size= 0,
8920.page_size= 256,
8921.tested= TEST_BAD_PREW,
8922.probe= probe_spi_rdid,
8923.probe_timing= TIMING_ZERO,
8924.write= NULL,
8925.read= NULL,
8926},
8927
8928{
8929.vendor= "Eon",
8930.name= "unknown Eon SPI chip",
8931.bustype= BUS_SPI,
8932.manufacture_id= EON_ID_NOPREFIX,
8933.model_id= GENERIC_DEVICE_ID,
8934.total_size= 0,
8935.page_size= 256,
8936.tested= TEST_BAD_PREW,
8937.probe= probe_spi_rdid,
8938.probe_timing= TIMING_ZERO,
8939.write= NULL,
8940.read= NULL,
8941},
8942
8943{
8944.vendor= "Macronix",
8945.name= "unknown Macronix SPI chip",
8946.bustype= BUS_SPI,
8947.manufacture_id= MACRONIX_ID,
8948.model_id= GENERIC_DEVICE_ID,
8949.total_size= 0,
8950.page_size= 256,
8951.tested= TEST_BAD_PREW,
8952.probe= probe_spi_rdid,
8953.probe_timing= TIMING_ZERO,
8954.write= NULL,
8955.read= NULL,
8956},
8957
8958{
8959.vendor= "PMC",
8960.name= "unknown PMC SPI chip",
8961.bustype= BUS_SPI,
8962.manufacture_id= PMC_ID,
8963.model_id= GENERIC_DEVICE_ID,
8964.total_size= 0,
8965.page_size= 256,
8966.tested= TEST_BAD_PREW,
8967.probe= probe_spi_rdid,
8968.probe_timing= TIMING_ZERO,
8969.write= NULL,
8970.read= NULL,
8971},
8972
8973{
8974.vendor= "SST",
8975.name= "unknown SST SPI chip",
8976.bustype= BUS_SPI,
8977.manufacture_id= SST_ID,
8978.model_id= GENERIC_DEVICE_ID,
8979.total_size= 0,
8980.page_size= 256,
8981.tested= TEST_BAD_PREW,
8982.probe= probe_spi_rdid,
8983.probe_timing= TIMING_ZERO,
8984.write= NULL,
8985.read= NULL,
8986},
8987
8988{
8989.vendor= "ST",
8990.name= "unknown ST SPI chip",
8991.bustype= BUS_SPI,
8992.manufacture_id= ST_ID,
8993.model_id= GENERIC_DEVICE_ID,
8994.total_size= 0,
8995.page_size= 256,
8996.tested= TEST_BAD_PREW,
8997.probe= probe_spi_rdid,
8998.probe_timing= TIMING_ZERO,
8999.write= NULL,
9000.read= NULL,
9001},
9002
9003{
9004.vendor= "Sanyo",
9005.name= "unknown Sanyo SPI chip",
9006.bustype= BUS_SPI,
9007.manufacture_id= SANYO_ID,
9008.model_id= GENERIC_DEVICE_ID,
9009.total_size= 0,
9010.page_size= 256,
9011.tested= TEST_BAD_PREW,
9012.probe= probe_spi_rdid,
9013.probe_timing= TIMING_ZERO,
9014.write= NULL,
9015.read= NULL,
9016},
9017
9018{
9019.vendor= "Generic",
9020.name= "unknown SPI chip (RDID)",
9021.bustype= BUS_SPI,
9022.manufacture_id= GENERIC_MANUF_ID,
9023.model_id= GENERIC_DEVICE_ID,
9024.total_size= 0,
9025.page_size= 256,
9026.tested= TEST_BAD_PREW,
9027.probe= probe_spi_rdid,
9028.write= NULL,
9029},
9030
9031{
9032.vendor= "Generic",
9033.name= "unknown SPI chip (REMS)",
9034.bustype= BUS_SPI,
9035.manufacture_id= GENERIC_MANUF_ID,
9036.model_id= GENERIC_DEVICE_ID,
9037.total_size= 0,
9038.page_size= 256,
9039.tested= TEST_BAD_PREW,
9040.probe= probe_spi_rems,
9041.write= NULL,
9042},
9043
9044{ NULL }
9045};
9046

Archive Download this file

Revision: HEAD