Am Montag, 15. Oktober 2007 01:06:00 schrieb Carl-Daniel Hailfinger:
> Great, thanks! The code I have also is not polished, so even if your
> code is ugly, it is better than no code. We can clean up that stuff
> together.

yes, that's right!
here it is.

the patch is done with:
[EMAIL PROTECTED] ~/src/linuxbios/LinuxBIOSv3/util/flashrom $ svn info
Pfad: .
URL: svn://linuxbios.org/repos/trunk/util/flashrom
Basis des Projektarchivs: svn://linuxbios.org/repos
UUID des Projektarchivs: 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Revision: 2850
Knotentyp: Verzeichnis
Plan: normal
Letzter Autor: rminnich
Letzte geänderte Rev: 2850
Letztes Änderungsdatum: 2007-10-12 23:22:40 +0200 (Fr, 12 Okt 2007)
[EMAIL PROTECTED] ~/src/linuxbios/LinuxBIOSv3/util/flashrom $

have fun with it, or just shrug because of the "dirty" hacks. ;)

regards, harald
diff -ubrN ../../flashrom.original/board_enable.c flashrom.new/board_enable.c
--- ../../flashrom.original/board_enable.c	2007-10-15 01:14:29.000000000 +0200
+++ flashrom.new/board_enable.c	2007-10-14 20:28:41.000000000 +0200
@@ -37,7 +37,7 @@
 #define JEDEC_RDID_OUTSIZE	0x01
 #define JEDEC_RDID_INSIZE	0x03
 
-static uint16_t it8716f_flashport = 0;
+uint16_t it8716f_flashport = 0;
 
 /* Generic Super I/O helper functions */
 uint8_t regval(uint16_t port, uint8_t reg)
@@ -111,7 +111,7 @@
    whereas the IT8716F splits commands internally into address and non-address
    commands with the address in inverse wire order. That's why the register
    ordering in case 4 and 5 may seem strange. */
-static int it8716f_spi_command(uint16_t port, unsigned char writecnt, unsigned char readcnt, const unsigned char *writearr, unsigned char *readarr)
+int it8716f_spi_command(uint16_t port, unsigned char writecnt, unsigned char readcnt, const unsigned char *writearr, unsigned char *readarr)
 {
 	uint8_t busy, writeenc;
 	do {
diff -ubrN ../../flashrom.original/board_enable.h flashrom.new/board_enable.h
--- ../../flashrom.original/board_enable.h	1970-01-01 01:00:00.000000000 +0100
+++ flashrom.new/board_enable.h	2007-10-14 21:09:18.000000000 +0200
@@ -0,0 +1,7 @@
+#ifndef boardenableh
+#define boardenableh
+uint16_t it8716f_flashport;
+uint8_t regval(uint16_t port, uint8_t reg);
+void regwrite(uint16_t port, uint8_t reg, uint8_t val);
+int it8716f_spi_command(uint16_t port, unsigned char writecnt, unsigned char readcnt, const unsigned char *writearr, unsigned char *readarr);
+#endif
diff -ubrN ../../flashrom.original/flashchips.c flashrom.new/flashchips.c
--- ../../flashrom.original/flashchips.c	2007-10-15 01:14:28.000000000 +0200
+++ flashrom.new/flashchips.c	2007-10-15 01:24:58.000000000 +0200
@@ -39,7 +39,7 @@
 	{"Mx29f002",	MX_ID,		MX_29F002,	256, 64 * 1024,
 	 probe_29f002,	erase_29f002, 	write_29f002},
 	{"MX25L4005",	MX_ID,		MX_25L4005,	512, 4 * 1024,
-	 probe_spi,	NULL,		NULL},
+	 probe_spi,	erase_25l4005,	write_25l4005},
 	{"SST29EE020A", SST_ID,		SST_29EE020A,	256, 128,
 	 probe_jedec,	erase_chip_jedec, write_jedec},
 	{"SST28SF040A", SST_ID,		SST_28SF040,	512, 256,
diff -ubrN ../../flashrom.original/flash.h flashrom.new/flash.h
--- ../../flashrom.original/flash.h	2007-10-15 01:14:28.000000000 +0200
+++ flashrom.new/flash.h	2007-10-14 19:13:52.000000000 +0200
@@ -294,4 +294,10 @@
 /* w49f002u.c */
 int write_49f002(struct flashchip *flash, uint8_t *buf);
 
+/* mx25l4005.c */
+// probe
+int write_25l4005(struct flashchip *flash, uint8_t *buf);
+int erase_25l4005(struct flashchip *flash);
+int read_25l4005(struct flashchip *flash, uint8_t *buf);
+
 #endif				/* !__FLASH_H__ */
diff -ubrN ../../flashrom.original/Makefile flashrom.new/Makefile
--- ../../flashrom.original/Makefile	2007-10-15 01:14:29.000000000 +0200
+++ flashrom.new/Makefile	2007-10-15 01:20:16.000000000 +0200
@@ -24,7 +24,7 @@
 	am29f040b.o mx29f002.o sst39sf020.o m29f400bt.o w49f002u.o \
 	82802ab.o msys_doc.o pm49fl004.o sst49lf040.o sst49lfxxxc.o \
 	sst_fwhub.o layout.o lbtable.o flashchips.o flashrom.o \
-	sharplhf00l04.o w29ee011.o
+	sharplhf00l04.o w29ee011.o mx25l4005.o
 
 all: pciutils dep $(PROGRAM)
 
@@ -33,7 +33,7 @@
 	$(STRIP) $(STRIP_ARGS) $(PROGRAM)
 
 clean:
-	rm -f *.o *~
+	rm -f *.o *~ flashrom
 
 distclean: clean
 	rm -f $(PROGRAM) .dependencies
diff -ubrN ../../flashrom.original/mx25l4005.c flashrom.new/mx25l4005.c
--- ../../flashrom.original/mx25l4005.c	1970-01-01 01:00:00.000000000 +0100
+++ flashrom.new/mx25l4005.c	2007-10-15 01:17:56.000000000 +0200
@@ -0,0 +1,57 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "flash.h"
+#include "board_enable.h"
+
+static void check_n_write_enable() {
+	uint8_t result[3] = {0, 0, 0};
+	uint8_t command[5] = {0x06, 0, 0, 0, 0};
+	// Send WREN (Write Enable)
+	it8716f_spi_command(it8716f_flashport, 1, 0, command, result);
+	uint8_t reg=regval(it8716f_flashport,0x24);
+	reg|=(1<<4);
+	regwrite(it8716f_flashport,0x24,reg);
+
+}
+
+static void write_disable() {
+	uint8_t result[3] = {0, 0, 0};
+	uint8_t command[5] = {0x04, 0, 0, 0, 0};
+	// Send WRDI (Write Disable)
+	it8716f_spi_command(it8716f_flashport, 1, 0, command, result);
+	uint8_t reg=regval(it8716f_flashport,0x24);
+	reg&=~(1<<4);
+	regwrite(it8716f_flashport,0x24,reg);
+}
+
+void write256b(int block, uint8_t *buf, uint8_t *bios ) {
+	check_n_write_enable();
+	outb(0x06,it8716f_flashport+1);
+	outb((3<<4),it8716f_flashport);
+	int i;
+	for (i=0;i<256;++i) {
+		bios[256*block+i]=buf[256*block+i];
+	}
+	outb(0,it8716f_flashport);
+	write_disable();
+	usleep (100000);
+}
+
+int write_25l4005(struct flashchip *flash, uint8_t *buf) {
+	int total_size=1024*flash->total_size;
+	int i;
+	for (i=0;i<total_size/256;++i) {
+		write256b(i, buf, (uint8_t*)flash->virtual_memory);
+	}
+return 0;
+}
+
+int erase_25l4005(struct flashchip *flash) {
+check_n_write_enable();
+uint8_t result[3]={0, 0, 0};
+uint8_t command[5]={0xc7, 0, 0, 0, 0};
+it8716f_spi_command(it8716f_flashport, 1, 0, command, result);
+write_disable();
+return 0;
+}
-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to