mirror of
				https://review.coreboot.org/flashrom.git
				synced 2025-11-04 07:00:39 +01:00 
			
		
		
		
	Add w49f002u support
Corresponding to coreboot v1 svn r643.
This commit is contained in:
		
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							@@ -1,4 +1,5 @@
 | 
			
		||||
OBJS = jedec.o sst28sf040.o am29f040b.o mx29f002.c sst39sf020.o m29f400bt.o
 | 
			
		||||
OBJS = jedec.o sst28sf040.o am29f040b.o mx29f002.c sst39sf020.o m29f400bt.o \
 | 
			
		||||
	w49f002u.o
 | 
			
		||||
OBJS += 82802ab.o
 | 
			
		||||
CC = gcc -O2 -g
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								flash.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								flash.h
									
									
									
									
									
								
							@@ -34,6 +34,7 @@ struct flashchip {
 | 
			
		||||
 | 
			
		||||
#define WINBOND_ID        0xDA	/* Winbond Manufacture ID code	*/
 | 
			
		||||
#define W_29C020C         0x45	/* Winbond w29c020c device code*/
 | 
			
		||||
#define W_49F002U         0x0B	/* Winbond w29c020c device code*/
 | 
			
		||||
 | 
			
		||||
#define ST_ID       	  0x20	
 | 
			
		||||
#define ST_M29F400BT      0xD5
 | 
			
		||||
@@ -53,3 +54,7 @@ extern int write_29f040b (struct flashchip * flash, char * buf);
 | 
			
		||||
extern int probe_29f002 (struct flashchip * flash);
 | 
			
		||||
extern int erase_29f002 (struct flashchip * flash);
 | 
			
		||||
extern int write_29f002 (struct flashchip * flash, char * buf);
 | 
			
		||||
 | 
			
		||||
extern int probe_49f002 (struct flashchip * flash);
 | 
			
		||||
extern int erase_49f002 (struct flashchip * flash);
 | 
			
		||||
extern int write_49f002 (struct flashchip * flash, char * buf);
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,8 @@ struct flashchip flashchips[] = {
 | 
			
		||||
     probe_39sf020, erase_39sf020, write_39sf020},
 | 
			
		||||
    {"W29C020C",    WINBOND_ID, W_29C020C,    NULL, 256, 128,
 | 
			
		||||
     probe_jedec,   erase_jedec,   write_jedec},
 | 
			
		||||
    {"W49F002U",    WINBOND_ID, W_49F002U,    NULL, 256, 128,
 | 
			
		||||
     probe_49f002,   erase_49f002,   write_49f002},
 | 
			
		||||
    {"M29F400BT",   ST_ID, ST_M29F400BT ,    NULL, 512, 64*1024,
 | 
			
		||||
     probe_m29f400bt,   erase_m29f400bt,   write_linuxbios_m29f400bt},
 | 
			
		||||
    {"82802ab",   137, 173 ,    NULL, 512, 64*1024,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								w49f002u.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								w49f002u.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
/*
 | 
			
		||||
 * w49f002u.c: driver for Winbond 49F002U flash models
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2000 Silicon Integrated System Corporation
 | 
			
		||||
 *
 | 
			
		||||
 *	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
 | 
			
		||||
 *	the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 *	(at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 *	This program is distributed in the hope that it will be useful,
 | 
			
		||||
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 *	GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 *	You should have received a copy of the GNU General Public License
 | 
			
		||||
 *	along with this program; if not, write to the Free Software
 | 
			
		||||
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Reference:
 | 
			
		||||
 *	W49F002U data sheet
 | 
			
		||||
 *
 | 
			
		||||
 * $Id
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "flash.h"
 | 
			
		||||
#include "jedec.h"
 | 
			
		||||
 | 
			
		||||
int probe_49f002 (struct flashchip * flash)
 | 
			
		||||
{
 | 
			
		||||
	volatile char * bios = flash->virt_addr;
 | 
			
		||||
	unsigned char id1, id2, id3;
 | 
			
		||||
 | 
			
		||||
	*(bios + 0x5555) = 0xAA;
 | 
			
		||||
	*(bios + 0x2AAA) = 0x55;
 | 
			
		||||
	*(bios + 0x5555) = 0x90;
 | 
			
		||||
    
 | 
			
		||||
	id1 = *(volatile unsigned char *) bios;
 | 
			
		||||
	id2 = *(volatile unsigned char *) (bios + 0x01);
 | 
			
		||||
 
 | 
			
		||||
	*bios = 0xF0;
 | 
			
		||||
 | 
			
		||||
	myusec_delay(10);
 | 
			
		||||
 | 
			
		||||
	printf(__FUNCTION__ "id1 %d, id2 %d\n", id1, id2);
 | 
			
		||||
	if (id1 == flash->manufacture_id && id2 == flash->model_id)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int erase_49f002 (struct flashchip * flash)
 | 
			
		||||
{
 | 
			
		||||
	volatile char * bios = flash->virt_addr;
 | 
			
		||||
 | 
			
		||||
 again:
 | 
			
		||||
	*(bios + 0x5555) = 0xAA;
 | 
			
		||||
	*(bios + 0x2AAA) = 0x55;
 | 
			
		||||
	*(bios + 0x5555) = 0x80;
 | 
			
		||||
	*(bios + 0x5555) = 0xAA;
 | 
			
		||||
	*(bios + 0x2AAA) = 0x55;
 | 
			
		||||
	*(bios + 0x5555) = 0x10;
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int write_49f002 (struct flashchip * flash, char * buf)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    int total_size = flash->total_size * 1024, page_size = flash->page_size;
 | 
			
		||||
    volatile char * bios = flash->virt_addr;
 | 
			
		||||
    volatile char * dst = bios, * src = buf;
 | 
			
		||||
 | 
			
		||||
    *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 */
 | 
			
		||||
	printf ("address: 0x%08lx", i);
 | 
			
		||||
	*(bios + 0x5555) = 0xAA;
 | 
			
		||||
	*(bios + 0x2AAA) = 0x55;
 | 
			
		||||
	*(bios + 0x5555) = 0xA0;
 | 
			
		||||
	*dst++ = *buf++;
 | 
			
		||||
 | 
			
		||||
	/* wait for Toggle bit ready */
 | 
			
		||||
	toggle_ready_jedec(dst);
 | 
			
		||||
 | 
			
		||||
	printf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    printf("\n");
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user