Flashrom

Flashrom Svn Source Tree

Root/trunk/jedec.c

  • Property svn:keywords set to Author Date Id Revision
  • Property svn:eol-style set to native
1/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2006 Giampiero Giancipoli <gianci@email.it>
6 * Copyright (C) 2006 coresystems GmbH <info@coresystems.de>
7 * Copyright (C) 2007 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
27#define MAX_REFLASH_TRIES 0x10
28#define MASK_FULL 0xffff
29#define MASK_2AA 0x7ff
30#define MASK_AAA 0xfff
31
32/* Check one byte for odd parity */
33uint8_t oddparity(uint8_t val)
34{
35val = (val ^ (val >> 4)) & 0xf;
36val = (val ^ (val >> 2)) & 0x3;
37return (val ^ (val >> 1)) & 0x1;
38}
39
40static void toggle_ready_jedec_common(const struct flashctx *flash,
41 chipaddr dst, int delay)
42{
43unsigned int i = 0;
44uint8_t tmp1, tmp2;
45
46tmp1 = chip_readb(flash, dst) & 0x40;
47
48while (i++ < 0xFFFFFFF) {
49if (delay)
50programmer_delay(delay);
51tmp2 = chip_readb(flash, dst) & 0x40;
52if (tmp1 == tmp2) {
53break;
54}
55tmp1 = tmp2;
56}
57if (i > 0x100000)
58msg_cdbg("%s: excessive loops, i=0x%x\n", __func__, i);
59}
60
61void toggle_ready_jedec(const struct flashctx *flash, chipaddr dst)
62{
63toggle_ready_jedec_common(flash, dst, 0);
64}
65
66/* Some chips require a minimum delay between toggle bit reads.
67 * The Winbond W39V040C wants 50 ms between reads on sector erase toggle,
68 * but experiments show that 2 ms are already enough. Pick a safety factor
69 * of 4 and use an 8 ms delay.
70 * Given that erase is slow on all chips, it is recommended to use
71 * toggle_ready_jedec_slow in erase functions.
72 */
73static void toggle_ready_jedec_slow(const struct flashctx *flash, chipaddr dst)
74{
75toggle_ready_jedec_common(flash, dst, 8 * 1000);
76}
77
78void data_polling_jedec(const struct flashctx *flash, chipaddr dst,
79uint8_t data)
80{
81unsigned int i = 0;
82uint8_t tmp;
83
84data &= 0x80;
85
86while (i++ < 0xFFFFFFF) {
87tmp = chip_readb(flash, dst) & 0x80;
88if (tmp == data) {
89break;
90}
91}
92if (i > 0x100000)
93msg_cdbg("%s: excessive loops, i=0x%x\n", __func__, i);
94}
95
96static unsigned int getaddrmask(struct flashctx *flash)
97{
98switch (flash->feature_bits & FEATURE_ADDR_MASK) {
99case FEATURE_ADDR_FULL:
100return MASK_FULL;
101break;
102case FEATURE_ADDR_2AA:
103return MASK_2AA;
104break;
105case FEATURE_ADDR_AAA:
106return MASK_AAA;
107break;
108default:
109msg_cerr("%s called with unknown mask\n", __func__);
110return 0;
111break;
112}
113}
114
115static void start_program_jedec_common(struct flashctx *flash,
116 unsigned int mask)
117{
118chipaddr bios = flash->virtual_memory;
119chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
120chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
121chip_writeb(flash, 0xA0, bios + (0x5555 & mask));
122}
123
124static int probe_jedec_common(struct flashctx *flash, unsigned int mask)
125{
126chipaddr bios = flash->virtual_memory;
127uint8_t id1, id2;
128uint32_t largeid1, largeid2;
129uint32_t flashcontent1, flashcontent2;
130int probe_timing_enter, probe_timing_exit;
131
132if (flash->probe_timing > 0)
133probe_timing_enter = probe_timing_exit = flash->probe_timing;
134else if (flash->probe_timing == TIMING_ZERO) { /* No delay. */
135probe_timing_enter = probe_timing_exit = 0;
136} else if (flash->probe_timing == TIMING_FIXME) { /* == _IGNORED */
137msg_cdbg("Chip lacks correct probe timing information, "
138 "using default 10mS/40uS. ");
139probe_timing_enter = 10000;
140probe_timing_exit = 40;
141} else {
142msg_cerr("Chip has negative value in probe_timing, failing "
143 "without chip access\n");
144return 0;
145}
146
147/* Earlier probes might have been too fast for the chip to enter ID
148 * mode completely. Allow the chip to finish this before seeing a
149 * reset command.
150 */
151if (probe_timing_enter)
152programmer_delay(probe_timing_enter);
153/* Reset chip to a clean slate */
154if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
155{
156chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
157if (probe_timing_exit)
158programmer_delay(10);
159chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
160if (probe_timing_exit)
161programmer_delay(10);
162}
163chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
164if (probe_timing_exit)
165programmer_delay(probe_timing_exit);
166
167/* Issue JEDEC Product ID Entry command */
168chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
169if (probe_timing_enter)
170programmer_delay(10);
171chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
172if (probe_timing_enter)
173programmer_delay(10);
174chip_writeb(flash, 0x90, bios + (0x5555 & mask));
175if (probe_timing_enter)
176programmer_delay(probe_timing_enter);
177
178/* Read product ID */
179id1 = chip_readb(flash, bios);
180id2 = chip_readb(flash, bios + 0x01);
181largeid1 = id1;
182largeid2 = id2;
183
184/* Check if it is a continuation ID, this should be a while loop. */
185if (id1 == 0x7F) {
186largeid1 <<= 8;
187id1 = chip_readb(flash, bios + 0x100);
188largeid1 |= id1;
189}
190if (id2 == 0x7F) {
191largeid2 <<= 8;
192id2 = chip_readb(flash, bios + 0x101);
193largeid2 |= id2;
194}
195
196/* Issue JEDEC Product ID Exit command */
197if ((flash->feature_bits & FEATURE_RESET_MASK) == FEATURE_LONG_RESET)
198{
199chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
200if (probe_timing_exit)
201programmer_delay(10);
202chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
203if (probe_timing_exit)
204programmer_delay(10);
205}
206chip_writeb(flash, 0xF0, bios + (0x5555 & mask));
207if (probe_timing_exit)
208programmer_delay(probe_timing_exit);
209
210msg_cdbg("%s: id1 0x%02x, id2 0x%02x", __func__, largeid1, largeid2);
211if (!oddparity(id1))
212msg_cdbg(", id1 parity violation");
213
214/* Read the product ID location again. We should now see normal flash contents. */
215flashcontent1 = chip_readb(flash, bios);
216flashcontent2 = chip_readb(flash, bios + 0x01);
217
218/* Check if it is a continuation ID, this should be a while loop. */
219if (flashcontent1 == 0x7F) {
220flashcontent1 <<= 8;
221flashcontent1 |= chip_readb(flash, bios + 0x100);
222}
223if (flashcontent2 == 0x7F) {
224flashcontent2 <<= 8;
225flashcontent2 |= chip_readb(flash, bios + 0x101);
226}
227
228if (largeid1 == flashcontent1)
229msg_cdbg(", id1 is normal flash content");
230if (largeid2 == flashcontent2)
231msg_cdbg(", id2 is normal flash content");
232
233msg_cdbg("\n");
234if (largeid1 != flash->manufacture_id || largeid2 != flash->model_id)
235return 0;
236
237if (flash->feature_bits & FEATURE_REGISTERMAP)
238map_flash_registers(flash);
239
240return 1;
241}
242
243static int erase_sector_jedec_common(struct flashctx *flash, unsigned int page,
244 unsigned int pagesize, unsigned int mask)
245{
246chipaddr bios = flash->virtual_memory;
247int delay_us = 0;
248if(flash->probe_timing != TIMING_ZERO)
249 delay_us = 10;
250
251/* Issue the Sector Erase command */
252chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
253programmer_delay(delay_us);
254chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
255programmer_delay(delay_us);
256chip_writeb(flash, 0x80, bios + (0x5555 & mask));
257programmer_delay(delay_us);
258
259chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
260programmer_delay(delay_us);
261chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
262programmer_delay(delay_us);
263chip_writeb(flash, 0x30, bios + page);
264programmer_delay(delay_us);
265
266/* wait for Toggle bit ready */
267toggle_ready_jedec_slow(flash, bios);
268
269/* FIXME: Check the status register for errors. */
270return 0;
271}
272
273static int erase_block_jedec_common(struct flashctx *flash, unsigned int block,
274 unsigned int blocksize, unsigned int mask)
275{
276chipaddr bios = flash->virtual_memory;
277int delay_us = 0;
278if(flash->probe_timing != TIMING_ZERO)
279 delay_us = 10;
280
281/* Issue the Sector Erase command */
282chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
283programmer_delay(delay_us);
284chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
285programmer_delay(delay_us);
286chip_writeb(flash, 0x80, bios + (0x5555 & mask));
287programmer_delay(delay_us);
288
289chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
290programmer_delay(delay_us);
291chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
292programmer_delay(delay_us);
293chip_writeb(flash, 0x50, bios + block);
294programmer_delay(delay_us);
295
296/* wait for Toggle bit ready */
297toggle_ready_jedec_slow(flash, bios);
298
299/* FIXME: Check the status register for errors. */
300return 0;
301}
302
303static int erase_chip_jedec_common(struct flashctx *flash, unsigned int mask)
304{
305chipaddr bios = flash->virtual_memory;
306int delay_us = 0;
307if(flash->probe_timing != TIMING_ZERO)
308 delay_us = 10;
309
310/* Issue the JEDEC Chip Erase command */
311chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
312programmer_delay(delay_us);
313chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
314programmer_delay(delay_us);
315chip_writeb(flash, 0x80, bios + (0x5555 & mask));
316programmer_delay(delay_us);
317
318chip_writeb(flash, 0xAA, bios + (0x5555 & mask));
319programmer_delay(delay_us);
320chip_writeb(flash, 0x55, bios + (0x2AAA & mask));
321programmer_delay(delay_us);
322chip_writeb(flash, 0x10, bios + (0x5555 & mask));
323programmer_delay(delay_us);
324
325toggle_ready_jedec_slow(flash, bios);
326
327/* FIXME: Check the status register for errors. */
328return 0;
329}
330
331static int write_byte_program_jedec_common(struct flashctx *flash, uint8_t *src,
332 chipaddr dst, unsigned int mask)
333{
334int tried = 0, failed = 0;
335chipaddr bios = flash->virtual_memory;
336
337/* If the data is 0xFF, don't program it and don't complain. */
338if (*src == 0xFF) {
339return 0;
340}
341
342retry:
343/* Issue JEDEC Byte Program command */
344start_program_jedec_common(flash, mask);
345
346/* transfer data from source to destination */
347chip_writeb(flash, *src, dst);
348toggle_ready_jedec(flash, bios);
349
350if (chip_readb(flash, dst) != *src && tried++ < MAX_REFLASH_TRIES) {
351goto retry;
352}
353
354if (tried >= MAX_REFLASH_TRIES)
355failed = 1;
356
357return failed;
358}
359
360/* chunksize is 1 */
361int write_jedec_1(struct flashctx *flash, uint8_t *src, unsigned int start,
362 unsigned int len)
363{
364int i, failed = 0;
365chipaddr dst = flash->virtual_memory + start;
366chipaddr olddst;
367unsigned int mask;
368
369mask = getaddrmask(flash);
370
371olddst = dst;
372for (i = 0; i < len; i++) {
373if (write_byte_program_jedec_common(flash, src, dst, mask))
374failed = 1;
375dst++, src++;
376}
377if (failed)
378msg_cerr(" writing sector at 0x%lx failed!\n", olddst);
379
380return failed;
381}
382
383int write_page_write_jedec_common(struct flashctx *flash, uint8_t *src,
384 unsigned int start, unsigned int page_size)
385{
386int i, tried = 0, failed;
387uint8_t *s = src;
388chipaddr bios = flash->virtual_memory;
389chipaddr dst = bios + start;
390chipaddr d = dst;
391unsigned int mask;
392
393mask = getaddrmask(flash);
394
395retry:
396/* Issue JEDEC Start Program command */
397start_program_jedec_common(flash, mask);
398
399/* transfer data from source to destination */
400for (i = 0; i < page_size; i++) {
401/* If the data is 0xFF, don't program it */
402if (*src != 0xFF)
403chip_writeb(flash, *src, dst);
404dst++;
405src++;
406}
407
408toggle_ready_jedec(flash, dst - 1);
409
410dst = d;
411src = s;
412failed = verify_range(flash, src, start, page_size, NULL);
413
414if (failed && tried++ < MAX_REFLASH_TRIES) {
415msg_cerr("retrying.\n");
416goto retry;
417}
418if (failed) {
419msg_cerr(" page 0x%lx failed!\n",
420(d - bios) / page_size);
421}
422return failed;
423}
424
425/* chunksize is page_size */
426/*
427 * Write a part of the flash chip.
428 * FIXME: Use the chunk code from Michael Karcher instead.
429 * This function is a slightly modified copy of spi_write_chunked.
430 * Each page is written separately in chunks with a maximum size of chunksize.
431 */
432int write_jedec(struct flashctx *flash, uint8_t *buf, unsigned int start,
433int unsigned len)
434{
435unsigned int i, starthere, lenhere;
436/* FIXME: page_size is the wrong variable. We need max_writechunk_size
437 * in struct flashctx to do this properly. All chips using
438 * write_jedec have page_size set to max_writechunk_size, so
439 * we're OK for now.
440 */
441unsigned int page_size = flash->page_size;
442
443/* Warning: This loop has a very unusual condition and body.
444 * The loop needs to go through each page with at least one affected
445 * byte. The lowest page number is (start / page_size) since that
446 * division rounds down. The highest page number we want is the page
447 * where the last byte of the range lives. That last byte has the
448 * address (start + len - 1), thus the highest page number is
449 * (start + len - 1) / page_size. Since we want to include that last
450 * page as well, the loop condition uses <=.
451 */
452for (i = start / page_size; i <= (start + len - 1) / page_size; i++) {
453/* Byte position of the first byte in the range in this page. */
454/* starthere is an offset to the base address of the chip. */
455starthere = max(start, i * page_size);
456/* Length of bytes in the range in this page. */
457lenhere = min(start + len, (i + 1) * page_size) - starthere;
458
459if (write_page_write_jedec_common(flash, buf + starthere - start, starthere, lenhere))
460return 1;
461}
462
463return 0;
464}
465
466/* erase chip with block_erase() prototype */
467int erase_chip_block_jedec(struct flashctx *flash, unsigned int addr,
468 unsigned int blocksize)
469{
470unsigned int mask;
471
472mask = getaddrmask(flash);
473if ((addr != 0) || (blocksize != flash->total_size * 1024)) {
474msg_cerr("%s called with incorrect arguments\n",
475__func__);
476return -1;
477}
478return erase_chip_jedec_common(flash, mask);
479}
480
481int probe_jedec(struct flashctx *flash)
482{
483unsigned int mask;
484
485mask = getaddrmask(flash);
486return probe_jedec_common(flash, mask);
487}
488
489int erase_sector_jedec(struct flashctx *flash, unsigned int page,
490 unsigned int size)
491{
492unsigned int mask;
493
494mask = getaddrmask(flash);
495return erase_sector_jedec_common(flash, page, size, mask);
496}
497
498int erase_block_jedec(struct flashctx *flash, unsigned int page,
499 unsigned int size)
500{
501unsigned int mask;
502
503mask = getaddrmask(flash);
504return erase_block_jedec_common(flash, page, size, mask);
505}
506
507int erase_chip_jedec(struct flashctx *flash)
508{
509unsigned int mask;
510
511mask = getaddrmask(flash);
512return erase_chip_jedec_common(flash, mask);
513}
514

Archive Download this file

Revision: HEAD