@ -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 = 0x80000 0;
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 :