See patch. This is _not_ tested (other than that it compiles).
Uwe. -- http://www.hermann-uwe.de | http://www.holsham-traders.de http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
Add new common function 'write_loop' which handles most of the
near-duplicated implementations in every single file.
Signed-off-by: Uwe Hermann <[EMAIL PROTECTED]>
Index: sst39sf020.c
===================================================================
--- sst39sf020.c (Revision 2748)
+++ sst39sf020.c (Arbeitskopie)
@@ -47,23 +47,7 @@
int write_39sf020(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, erase_chip_jedec, NULL, write_sector_jedec);
- erase_chip_jedec(flash);
-
- printf("Programming Page: ");
- for (i = 0; i < total_size / page_size; i++) {
- /* write to the sector */
- printf("%04d at address: 0x%08x", i, i * page_size);
- write_sector_jedec(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- fflush(stdout);
- }
- printf("\n");
-
return 0;
}
Index: sst28sf040.c
===================================================================
--- sst28sf040.c (Revision 2748)
+++ sst28sf040.c (Arbeitskopie)
@@ -142,26 +142,11 @@
int write_28sf040(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
volatile uint8_t *bios = flash->virtual_memory;
unprotect_28sf040(bios);
-
- printf("Programming Page: ");
- for (i = 0; i < total_size / page_size; i++) {
- /* erase the page before programming */
- erase_sector_28sf040(bios, i * page_size);
-
- /* write to the sector */
- printf("%04d at address: 0x%08x", i, i * page_size);
- write_sector_28sf040(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
-
+ write_loop(flash, buf, NULL, erase_sector_28sf040,
+ write_sector_28sf040);
protect_28sf040(bios);
return 0;
Index: flash.h
===================================================================
--- flash.h (Revision 2748)
+++ flash.h (Arbeitskopie)
@@ -170,6 +170,11 @@
/* flashrom.c */
int map_flash_registers(struct flashchip *flash);
+int write_loop(struct flashchip *flash, uint8_t *buf,
+ int (*erasechipfn)(struct flashchip *flash),
+ int (*erasefn)(volatile uint8_t *bios, unsigned long address),
+ int (*writefn)(volatile uint8_t *bios, uint8_t *src,
+ volatile uint8_t *dst, unsigned int page_size));
/* layout.c */
int show_id(uint8_t *bios, int size);
@@ -201,7 +206,7 @@
extern int probe_jedec(struct flashchip *flash);
extern int erase_chip_jedec(struct flashchip *flash);
extern int write_jedec(struct flashchip *flash, uint8_t *buf);
-extern int erase_sector_jedec(volatile uint8_t *bios, unsigned int page);
+extern int erase_sector_jedec(volatile uint8_t *bios, unsigned long page);
extern int erase_block_jedec(volatile uint8_t *bios, unsigned int page);
extern int write_sector_jedec(volatile uint8_t *bios, uint8_t *src,
volatile uint8_t *dst, unsigned int page_size);
Index: am29f040b.c
===================================================================
--- am29f040b.c (Revision 2748)
+++ am29f040b.c (Arbeitskopie)
@@ -113,23 +113,8 @@
int write_29f040b(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, NULL, erase_sector_29f040b,
+ write_sector_29f040b);
- printf("Programming page ");
- for (i = 0; i < total_size / page_size; i++) {
- /* erase the page before programming */
- erase_sector_29f040b(bios, i * page_size);
-
- /* write to the sector */
- printf("%04d at address: ", i);
- write_sector_29f040b(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
-
return 0;
}
Index: sst_fwhub.c
===================================================================
--- sst_fwhub.c (Revision 2748)
+++ sst_fwhub.c (Arbeitskopie)
@@ -72,30 +72,7 @@
int write_sst_fwhub(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, erase_sst_fwhub, NULL, write_sector_jedec);
- // FIXME: We want block wide erase instead of ironing the whole chip
- erase_sst_fwhub(flash);
-
- // dumb check if erase was successful.
- for (i = 0; i < total_size; i++) {
- if (bios[i] != 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);
- write_sector_jedec(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
-
return 0;
}
Index: jedec.c
===================================================================
--- jedec.c (Revision 2748)
+++ jedec.c (Arbeitskopie)
@@ -115,7 +115,7 @@
return 0;
}
-int erase_sector_jedec(volatile uint8_t *bios, unsigned int page)
+int erase_sector_jedec(volatile uint8_t *bios, unsigned long page)
{
/* Issue the Sector Erase command */
*(volatile uint8_t *)(bios + 0x5555) = 0xAA;
@@ -186,7 +186,7 @@
}
int write_page_write_jedec(volatile uint8_t *bios, uint8_t *src,
- volatile uint8_t *dst, int page_size)
+ volatile uint8_t *dst, unsigned int page_size)
{
int i, tried = 0, start_index = 0, ok;
volatile uint8_t *d = dst;
@@ -277,29 +277,8 @@
int write_jedec(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, erase_chip_jedec, NULL, write_page_write_jedec);
+ protect_jedec(flash->virtual_memory);
- erase_chip_jedec(flash);
- // 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);
- write_page_write_jedec(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
- protect_jedec(bios);
-
return 0;
}
Index: flashrom.c
===================================================================
--- flashrom.c (Revision 2748)
+++ flashrom.c (Arbeitskopie)
@@ -194,6 +194,52 @@
return 0;
}
+
+#define CR "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
+
+int write_loop(struct flashchip *flash, uint8_t *buf,
+ int (*erasechipfn)(struct flashchip *flash),
+ int (*erasefn)(volatile uint8_t *bios, unsigned long address),
+ int (*writefn)(volatile uint8_t *bios, uint8_t *src,
+ volatile uint8_t *dst, unsigned int page_size))
+{
+ int i;
+ int total_size = flash->total_size * 1024;
+ int page_size = flash->page_size;
+ volatile uint8_t *bios = flash->virtual_memory;
+
+ /* Erase the whole chip before programming. */
+ if (erasechipfn != NULL)
+ erasechipfn(flash);
+
+ /* Verify that the erase really worked. */
+ for (i = 0; i < total_size; i++) {
+ if (bios[i] != 0xff) {
+ printf("ERASE FAILED\n");
+ return -1;
+ }
+ }
+
+ printf("Programming page/block/sector: ");
+ for (i = 0; i < total_size / page_size; i++) {
+ /* Erase the page/block/sector before programming. */
+ if (erasefn != NULL)
+ erasefn(bios, i * page_size);
+
+ printf("%04d at address: 0x%08x", i, i * page_size);
+
+ /* Write the page/block/sector. */
+ writefn(bios, buf + i * page_size,
+ bios + i * page_size, page_size);
+
+ printf(CR);
+ fflush(stdout);
+ }
+ printf("\n");
+
+ return 0;
+}
+
void usage(const char *name)
{
printf("usage: %s [-rwvEVfh] [-c chipname] [-s exclude_start]\n", name);
Index: sst49lfxxxc.c
===================================================================
--- sst49lfxxxc.c (Revision 2748)
+++ sst49lfxxxc.c (Arbeitskopie)
@@ -170,26 +170,11 @@
int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_lockbits_49lfxxxc(flash->virtual_registers,
+ flash->total_size * 1024, 0);
+ write_loop(flash, buf, NULL, erase_sector_49lfxxxc,
+ write_sector_49lfxxxc);
+ *(flash->virtual_memory) = RESET;
- write_lockbits_49lfxxxc(flash->virtual_registers, total_size, 0);
- printf("Programming Page: ");
- for (i = 0; i < total_size / page_size; i++) {
- /* erase the page before programming */
- erase_sector_49lfxxxc(bios, i * page_size);
-
- /* write to the sector */
- printf("%04d at address: 0x%08x", i, i * page_size);
- write_sector_49lfxxxc(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
-
- *bios = RESET;
-
return 0;
}
Index: 82802ab.c
===================================================================
--- 82802ab.c (Revision 2748)
+++ 82802ab.c (Arbeitskopie)
@@ -144,8 +144,8 @@
return 0;
}
-void write_page_82802ab(volatile uint8_t *bios, uint8_t *src,
- volatile uint8_t *dst, int page_size)
+int write_page_82802ab(volatile uint8_t *bios, uint8_t *src,
+ volatile uint8_t *dst, unsigned int page_size)
{
int i;
@@ -155,29 +155,14 @@
*dst++ = *src++;
wait_82802ab(bios);
}
+
+ return 0;
}
int write_82802ab(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, erase_82802ab, NULL, write_page_82802ab);
+ protect_jedec(flash->virtual_memory);
- erase_82802ab(flash);
- if (*bios != 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);
- write_page_82802ab(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
- protect_jedec(bios);
-
return 0;
}
Index: sharplhf00l04.c
===================================================================
--- sharplhf00l04.c (Revision 2748)
+++ sharplhf00l04.c (Arbeitskopie)
@@ -146,8 +146,8 @@
return 0;
}
-void write_page_lhf00l04(volatile uint8_t *bios, uint8_t *src,
- volatile uint8_t *dst, int page_size)
+int write_page_lhf00l04(volatile uint8_t *bios, uint8_t *src,
+ volatile uint8_t *dst, unsigned int page_size)
{
int i;
@@ -157,29 +157,14 @@
*dst++ = *src++;
wait_lhf00l04(bios);
}
+
+ return 0;
}
int write_lhf00l04(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ write_loop(flash, buf, erase_lhf00l04, NULL, write_page_lhf00l04);
+ protect_jedec(flash->virtual_memory);
- erase_lhf00l04(flash);
- if (*bios != 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);
- write_page_lhf00l04(bios, buf + i * page_size,
- bios + i * page_size, page_size);
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- }
- printf("\n");
- protect_jedec(bios);
-
return 0;
}
Index: sst49lf040.c
===================================================================
--- sst49lf040.c (Revision 2748)
+++ sst49lf040.c (Arbeitskopie)
@@ -46,28 +46,10 @@
int write_49lf040(struct flashchip *flash, uint8_t *buf)
{
- int i;
- int total_size = flash->total_size * 1024;
- int page_size = flash->page_size;
- volatile uint8_t *bios = flash->virtual_memory;
+ /* Chip erase only works in parallel programming mode for the 49lf040.
+ * Use sector-erase instead.
+ */
+ write_loop(flash, buf, NULL, erase_sector_jedec, write_sector_jedec);
- printf("Programming Page: ");
- for (i = 0; i < total_size / page_size; i++) {
- /* erase the page before programming
- * Chip erase only works in parallel programming mode
- * for the 49lf040. Use sector-erase instead */
- erase_sector_jedec(bios, i * page_size);
-
- /* write to the sector */
- printf("%04d at address: 0x%08x ", i, i * page_size);
-
- write_sector_jedec(bios, buf + i * page_size,
- bios + i * page_size, page_size);
-
- printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- fflush(stdout);
- }
- printf("\n");
-
return 0;
}
signature.asc
Description: Digital signature
-- linuxbios mailing list [email protected] http://www.linuxbios.org/mailman/listinfo/linuxbios
