diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/flashrom/Makefile | 2 | ||||
-rw-r--r-- | util/flashrom/jedec.c | 63 |
2 files changed, 50 insertions, 15 deletions
diff --git a/util/flashrom/Makefile b/util/flashrom/Makefile index 770aa0e8c6..46f3c9f5ad 100644 --- a/util/flashrom/Makefile +++ b/util/flashrom/Makefile @@ -10,7 +10,7 @@ CC = gcc STRIP = strip #CFLAGS = -O2 -g -Wall -Werror CFLAGS = -Os -Wall -Werror -DDISABLE_DOC # -DTS5300 -LDFLAGS = -lpci -static +LDFLAGS = -lpci -lz -static OBJS = flash_enable.o udelay.o jedec.o sst28sf040.o am29f040b.o mx29f002.o \ diff --git a/util/flashrom/jedec.c b/util/flashrom/jedec.c index c3712dec6c..549f9aa04d 100644 --- a/util/flashrom/jedec.c +++ b/util/flashrom/jedec.c @@ -3,6 +3,8 @@ * * * Copyright 2000 Silicon Integrated System Corporation + * Copyright 2006 Giampiero Giancipoli <gianci@email.it> + * Copyright 2006 coresystems GmbH <info@coresystems.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +31,8 @@ #include "jedec.h" #include "debug.h" +#define MAX_REFLASH_TRIES 0x10 + int probe_jedec(struct flashchip *flash) { volatile uint8_t *bios = flash->virt_addr; @@ -134,34 +138,58 @@ int erase_chip_jedec(struct flashchip *flash) int write_page_write_jedec(volatile uint8_t *bios, uint8_t *src, volatile uint8_t *dst, int page_size) { - int i; + int i, tried = 0, start_index = 0, ok; + volatile uint8_t *d = dst; + uint8_t *s = src; +retry: /* Issue JEDEC Data Unprotect comand */ *(volatile uint8_t *) (bios + 0x5555) = 0xAA; *(volatile uint8_t *) (bios + 0x2AAA) = 0x55; *(volatile uint8_t *) (bios + 0x5555) = 0xA0; /* transfer data from source to destination */ - for (i = 0; i < page_size; i++) { + for (i = start_index; i < page_size; i++) { /* If the data is 0xFF, don't program it */ - if (*src == 0xFF) - continue; - *dst++ = *src++; + if (*src != 0xFF ) + *dst = *src; + dst++; + src++; } toggle_ready_jedec(dst - 1); - return 0; + dst = d; + src = s; + ok = 1; + for (i = 0; i < page_size; i++) { + if ( *dst != *src ) + { + ok = 0; + break; + } + dst++; + src++; + } + + if (!ok && tried++ < MAX_REFLASH_TRIES) { + start_index = i; + goto retry; + } + if (!ok) { + fprintf( stderr, " page %d failed!\n", (unsigned int)(d-bios)/page_size ); + } + return (!ok); } int write_byte_program_jedec(volatile uint8_t *bios, uint8_t *src, volatile uint8_t *dst) { - int tried = 0; + int tried = 0, ok = 1; /* If the data is 0xFF, don't program it */ if (*src == 0xFF) { - return 0; + return -1; } retry: @@ -174,11 +202,14 @@ retry: *dst = *src; toggle_ready_jedec(bios); - if (*dst != *src && tried++ < 0x10) { + if (*dst != *src && tried++ < MAX_REFLASH_TRIES) { goto retry; } - return 0; + if (tried >= MAX_REFLASH_TRIES) + ok=0; + + return (!ok); } int write_sector_jedec(volatile uint8_t *bios, uint8_t *src, @@ -202,10 +233,14 @@ int write_jedec(struct flashchip *flash, uint8_t *buf) volatile uint8_t *bios = flash->virt_addr; erase_chip_jedec(flash); - if (*bios != (uint8_t) 0xff) { - printf("ERASE FAILED\n"); - return -1; - } + // dumb check if erase was successful. + for (i=0; i < total_size; i++) { + if (bios[i] != (uint8_t)0xff) { + printf("ERASE FAILED\n"); + return -1; + } + } + printf("Programming Page: "); for (i = 0; i < total_size / page_size; i++) { printf("%04d at address: 0x%08x", i, i * page_size); |