diff options
Diffstat (limited to 'board/emk/common/flash.c')
| -rw-r--r-- | board/emk/common/flash.c | 96 | 
1 files changed, 81 insertions, 15 deletions
| diff --git a/board/emk/common/flash.c b/board/emk/common/flash.c index adfa9a0fb..966bb5c64 100644 --- a/board/emk/common/flash.c +++ b/board/emk/common/flash.c @@ -40,9 +40,11 @@ flash_info_t	flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */    #define FLASH_CYCLE2	0x02aa    #define FLASH_ID1		0    #define FLASH_ID2		1 +  #define FLASH_ID3		0x0e +  #define FLASH_ID4		0x0F  #endif -#if defined (CONFIG_TOP5200) +#if defined (CONFIG_TOP5200) && !defined (CONFIG_LITE5200)    typedef unsigned char FLASH_PORT_WIDTH;    typedef volatile unsigned char FLASH_PORT_WIDTHV;    #define	FLASH_ID_MASK	0xFF @@ -54,6 +56,24 @@ flash_info_t	flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */    #define FLASH_CYCLE2	0x0555    #define FLASH_ID1		0    #define FLASH_ID2		2 +  #define FLASH_ID3		0x1c +  #define FLASH_ID4		0x1E +#endif + +#if defined (CONFIG_TOP5200) && defined (CONFIG_LITE5200) +  typedef unsigned char FLASH_PORT_WIDTH; +  typedef volatile unsigned char FLASH_PORT_WIDTHV; +  #define	FLASH_ID_MASK	0xFF + +  #define FPW	FLASH_PORT_WIDTH +  #define FPWV	FLASH_PORT_WIDTHV + +  #define FLASH_CYCLE1	0x0555 +  #define FLASH_CYCLE2	0x02aa +  #define FLASH_ID1		0 +  #define FLASH_ID2		1 +  #define FLASH_ID3		0x0E +  #define FLASH_ID4		0x0F  #endif  /*----------------------------------------------------------------------- @@ -183,6 +203,15 @@ void flash_print_info (flash_info_t *info)  	case FLASH_AM160B:  		fmt = "29LV160%s (16 Mbit, %s)\n";  		break; +	case FLASH_AMLV640U: +		fmt = "29LV640M (64 Mbit)\n"; +		break; +	case FLASH_AMDLV065D: +		fmt = "29LV065D (64 Mbit)\n"; +		break; +	case FLASH_AMLV256U: +		fmt = "29LV256M (256 Mbit)\n"; +		break;  	default:  		fmt = "Unknown Chip Type\n";  		break; @@ -239,7 +268,6 @@ void flash_print_info (flash_info_t *info)  ulong flash_get_size (FPWV *addr, flash_info_t *info)  {  	int		i; -	ulong	offset;  	/* Write auto select command: read Manufacturer ID */  	/* Write auto select command sequence and test FLASH answer */ @@ -278,27 +306,64 @@ ulong flash_get_size (FPWV *addr, flash_info_t *info)  		info->flash_id += FLASH_AM160B;  		info->sector_count = 35;  		info->size = 0x00200000; -#ifdef CFG_LOWBOOT -		offset = 0; -#else -		offset = 0x00e00000; -#endif -		info->start[0] = (ulong)addr + offset; -		info->start[1] = (ulong)addr + offset + 0x4000; -		info->start[2] = (ulong)addr + offset + 0x6000; -		info->start[3] = (ulong)addr + offset + 0x8000; +		info->start[0] = (ulong)addr; +		info->start[1] = (ulong)addr + 0x4000; +		info->start[2] = (ulong)addr + 0x6000; +		info->start[3] = (ulong)addr + 0x8000;  		for (i = 4; i < info->sector_count; i++)  		{ -			info->start[i] = (ulong)addr + offset + 0x10000 * (i-3); +			info->start[i] = (ulong)addr + 0x10000 * (i-3); +		} +		break; + +	case (FPW)AMD_ID_LV065D: +		info->flash_id += FLASH_AMDLV065D; +		info->sector_count = 128; +		info->size = 0x00800000; +		for (i = 0; i < info->sector_count; i++) +		{ +			info->start[i] = (ulong)addr + 0x10000 * i;  		}  		break; +	case (FPW)AMD_ID_MIRROR: +		/* MIRROR BIT FLASH, read more ID bytes */ +		if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV640U_2 && +			(FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV640U_3) +		{ +			info->flash_id += FLASH_AMLV640U; +			info->sector_count = 128; +			info->size = 0x00800000; +			for (i = 0; i < info->sector_count; i++) +			{ +				info->start[i] = (ulong)addr + 0x10000 * i; +			} +			break; +		} +		if ((FPW)addr[FLASH_ID3] == (FPW)AMD_ID_LV256U_2 && +			(FPW)addr[FLASH_ID4] == (FPW)AMD_ID_LV256U_3) +		{ +			/* attention: only the first 16 MB will be used in u-boot */ +			info->flash_id += FLASH_AMLV256U; +			info->sector_count = 256; +			info->size = 0x01000000; +			for (i = 0; i < info->sector_count; i++) +			{ +				info->start[i] = (ulong)addr + 0x10000 * i; +			} +			break; +		} +		 +		/* fall thru to here ! */  	default: -		printf ("unknown AMD device=%x ", (FPW)addr[FLASH_ID2]); +		printf ("unknown AMD device=%x %x %x", +			(FPW)addr[FLASH_ID2], +			(FPW)addr[FLASH_ID3], +			(FPW)addr[FLASH_ID4]);  		info->flash_id = FLASH_UNKNOWN;  		info->sector_count = 0; -		info->size = 0; -		return (0);			/* => no or unknown flash */ +		info->size = 0x800000; +		break;  	}  	/* Put FLASH back in read mode */ @@ -329,6 +394,7 @@ int	flash_erase (flash_info_t *info, int s_first, int s_last)  	switch (info->flash_id & FLASH_TYPEMASK) {  	case FLASH_AM160B: +	case FLASH_AMLV640U:  		break;  	case FLASH_UNKNOWN:  	default: |