Commit cec28793 authored by Ollie Lho's avatar Ollie Lho
Browse files

Use standard product ID exit method for w49f002u

Corresponding to flashrom svn r7 and coreboot v2 svn r1433.
parent cbbf1259
......@@ -116,7 +116,7 @@ struct flashchip * probe_flash(struct flashchip * flash)
}
bios = mmap (0, size, PROT_WRITE | PROT_READ, MAP_SHARED,
//fd_mem, (off_t) (0x100000000-size));
fd_mem, (off_t) (0x0-size));
fd_mem, (off_t) (0xffffffff-size+1));
if (bios == MAP_FAILED) {
perror("Error MMAP /dev/mem");
exit(1);
......
......@@ -23,8 +23,6 @@
*
* $Id$
*/
#include <stdio.h>
#include "flash.h"
#include "jedec.h"
......@@ -37,35 +35,7 @@
#define RESET 0xFF
#define READ_ID 0x90
static __inline__ void protect_49lf040 (volatile char * bios)
{
/* ask compiler not to optimize this */
volatile unsigned char tmp;
tmp = *(volatile unsigned char *) (bios + 0x1823);
tmp = *(volatile unsigned char *) (bios + 0x1820);
tmp = *(volatile unsigned char *) (bios + 0x1822);
tmp = *(volatile unsigned char *) (bios + 0x0418);
tmp = *(volatile unsigned char *) (bios + 0x041B);
tmp = *(volatile unsigned char *) (bios + 0x0419);
tmp = *(volatile unsigned char *) (bios + 0x040A);
}
static __inline__ void unprotect_49lf040 (volatile char * bios)
{
/* ask compiler not to optimize this */
volatile unsigned char tmp;
tmp = *(volatile unsigned char *) (bios + 0x1823);
tmp = *(volatile unsigned char *) (bios + 0x1820);
tmp = *(volatile unsigned char *) (bios + 0x1822);
tmp = *(volatile unsigned char *) (bios + 0x0418);
tmp = *(volatile unsigned char *) (bios + 0x041B);
tmp = *(volatile unsigned char *) (bios + 0x0419);
tmp = *(volatile unsigned char *) (bios + 0x041A);
}
int erase_sector_49lf040 (volatile char * bios, unsigned int page)
static int erase_sector_49lf040 (volatile char * bios, unsigned int page)
{
/* Chip erase function does not exist for LPC mode on 49lf040.
* Erase sector-by-sector instead. */
......@@ -99,9 +69,9 @@ int erase_sector_49lf040 (volatile char * bios, unsigned int page)
}
static __inline__ int write_sector_49lf040(volatile char * bios,
unsigned char * src,
volatile unsigned char * dst,
unsigned int page_size)
unsigned char * src,
volatile unsigned char * dst,
unsigned int page_size)
{
int i;
volatile char *Temp;
......@@ -146,7 +116,6 @@ int probe_49lf040 (struct flashchip * flash)
*(volatile char *) (bios + 0x2AAA) = 0x55;
myusec_delay(10);
*(volatile char *) (bios + 0x5555) = 0x90;
myusec_delay(10);
id1 = *(volatile unsigned char *) bios;
......@@ -165,6 +134,7 @@ int probe_49lf040 (struct flashchip * flash)
return 0;
}
/* Chip erase only works in parallel programming mode for the 49lf040.
* Use sector-erase instead */
int erase_49lf040 (struct flashchip * flash)
......@@ -190,7 +160,6 @@ int erase_49lf040 (struct flashchip * flash)
myusec_delay(10);
Temp = bios + 0x5555; /* set up address to be C000:5555h */
*Temp = 0x10; /* write data 0x55 to the address */
myusec_delay(50000);
return(0);
......@@ -202,8 +171,6 @@ int write_49lf040 (struct flashchip * flash, unsigned char * buf)
int total_size = flash->total_size * 1024, page_size = flash->page_size;
volatile char * bios = flash->virt_addr;
// unprotect_49lf040 (bios);
// erase_49lf040(flash); /* Must be done sector-by-sector in LPC mode */
printf ("Programming Page: ");
for (i = 0; i < total_size/page_size; i++) {
/* erase the page before programming */
......@@ -218,7 +185,5 @@ int write_49lf040 (struct flashchip * flash, unsigned char * buf)
}
printf("\n");
// protect_49lf040 (bios);
return(0);
}
......@@ -7,7 +7,7 @@ unsigned long micro = 1;
void myusec_delay(int time)
{
volatile unsigned long i;
for(i = 0; i < time * micro; i++)
for (i = 0; i < time * micro; i++)
;
}
......@@ -38,6 +38,4 @@ void myusec_calibrate_delay()
micro = count / timeusec;
fprintf(stderr, "%ldM loops per second\n", (unsigned long)micro);
}
......@@ -22,7 +22,7 @@
* Reference:
* W49F002U data sheet
*
* $Id
* $Id$
*/
#include <stdio.h>
......@@ -35,14 +35,16 @@ int probe_49f002 (struct flashchip * flash)
volatile char * bios = flash->virt_addr;
unsigned char id1, id2;
*(bios + 0x5555) = 0xAA;
*(bios + 0x2AAA) = 0x55;
*(bios + 0x5555) = 0x90;
*(volatile char *) (bios + 0x5555) = 0xAA;
*(volatile char *) (bios + 0x2AAA) = 0x55;
*(volatile char *) (bios + 0x5555) = 0x90;
id1 = *(volatile unsigned char *) bios;
id2 = *(volatile unsigned char *) (bios + 0x01);
*bios = 0xF0;
*(volatile char *) (bios + 0x5555) = 0xAA;
*(volatile char *) (bios + 0x2AAA) = 0x55;
*(volatile char *) (bios + 0x5555) = 0xF0;
myusec_delay(10);
......@@ -68,52 +70,36 @@ int erase_49f002 (struct flashchip * flash)
myusec_delay(100);
toggle_ready_jedec(bios);
// while ((*bios & 0x40) != 0x40)
//;
#if 0
toggle_ready_jedec(bios);
*(bios + 0x0ffff) = 0x30;
*(bios + 0x1ffff) = 0x30;
*(bios + 0x2ffff) = 0x30;
*(bios + 0x37fff) = 0x30;
*(bios + 0x39fff) = 0x30;
*(bios + 0x3bfff) = 0x30;
#endif
return(0);
}
int write_49f002 (struct flashchip * flash, unsigned char * buf)
{
int i;
int total_size = flash->total_size * 1024;
volatile char * bios = flash->virt_addr;
volatile char * dst = bios;
*bios = 0xF0;
myusec_delay(10);
erase_49f002(flash);
//*bios = 0xF0;
#if 1
printf ("Programming Page: ");
for (i = 0; i < total_size; i++) {
/* write to the sector */
if ((i & 0xfff) == 0)
printf ("address: 0x%08lx", (unsigned long)i);
*(bios + 0x5555) = 0xAA;
*(bios + 0x2AAA) = 0x55;
*(bios + 0x5555) = 0xA0;
*dst++ = *buf++;
/* wait for Toggle bit ready */
toggle_ready_jedec(dst);
int i;
int total_size = flash->total_size * 1024;
volatile char * bios = flash->virt_addr;
volatile char * dst = bios;
if ((i & 0xfff) == 0)
printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}
#endif
printf("\n");
myusec_delay(10);
erase_49f002(flash);
printf ("Programming Page: ");
for (i = 0; i < total_size; i++) {
/* write to the sector */
if ((i & 0xfff) == 0)
printf ("address: 0x%08lx", (unsigned long)i);
*(bios + 0x5555) = 0xAA;
*(bios + 0x2AAA) = 0x55;
*(bios + 0x5555) = 0xA0;
*dst++ = *buf++;
/* wait for Toggle bit ready */
toggle_ready_jedec(dst);
if ((i & 0xfff) == 0)
printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
}
printf("\n");
return(0);
return(0);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment