@ -38,49 +38,49 @@ flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
* Functions
* Functions
*/
*/
ulong flash_get_size ( volatile FLASH_WORD_SIZE * addr , flash_info_t * info ) ;
ulong flash_get_size ( volatile FLASH_WORD_SIZE * addr , flash_info_t * info ) ;
# ifndef CONFIG_FLASH_16BIT
# ifndef CONFIG_FLASH_16BIT
static int write_word ( flash_info_t * info , ulong dest , ulong data ) ;
static int write_word ( flash_info_t * info , ulong dest , ulong data ) ;
# else
# else
static int write_short ( flash_info_t * info , ulong dest , ushort data ) ;
static int write_short ( flash_info_t * info , ulong dest , ushort data ) ;
# endif
# endif
/*int flash_write (uchar *, ulong, ulong); */
/*int flash_write (uchar *, ulong, ulong); */
/*flash_info_t *addr2info (ulong); */
/*flash_info_t *addr2info (ulong); */
static void flash_get_offsets ( ulong base , flash_info_t * info ) ;
static void flash_get_offsets ( ulong base , flash_info_t * info ) ;
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
*/
*/
unsigned long flash_init ( void )
unsigned long flash_init ( void )
{
{
volatile immap_t * immap = ( immap_t * ) CFG_IMMR ;
volatile immap_t * immap = ( immap_t * ) CFG_IMMR ;
volatile memctl8xx_t * memctl = & immap - > im_memctl ;
volatile memctl8xx_t * memctl = & immap - > im_memctl ;
unsigned long size_b0 , size_b1 ;
unsigned long size_b0 , size_b1 ;
int i ;
int i ;
/* Init: no FLASHes known */
/* Init: no FLASHes known */
for ( i = 0 ; i < CFG_MAX_FLASH_BANKS ; + + i ) {
for ( i = 0 ; i < CFG_MAX_FLASH_BANKS ; + + i ) {
flash_info [ i ] . flash_id = FLASH_UNKNOWN ;
flash_info [ i ] . flash_id = FLASH_UNKNOWN ;
}
}
/* Static FLASH Bank configuration here - FIXME XXX */
/* Static FLASH Bank configuration here - FIXME XXX */
size_b0 = flash_get_size ( ( volatile FLASH_WORD_SIZE * ) FLASH_BASE0_PRELIM ,
size_b0 =
& flash_info [ 0 ] ) ;
flash_get_size ( ( volatile FLASH_WORD_SIZE * )
FLASH_BASE0_PRELIM , & flash_info [ 0 ] ) ;
if ( flash_info [ 0 ] . flash_id = = FLASH_UNKNOWN ) {
if ( flash_info [ 0 ] . flash_id = = FLASH_UNKNOWN ) {
printf ( " ## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB \n " ,
printf ( " ## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB \n " , size_b0 , size_b0 < < 20 ) ;
size_b0 , size_b0 < < 20 ) ;
}
}
size_b1 = flash_get_size ( ( volatile FLASH_WORD_SIZE * ) FLASH_BASE1_PRELIM ,
size_b1 =
& flash_info [ 1 ] ) ;
flash_get_size ( ( volatile FLASH_WORD_SIZE * )
FLASH_BASE1_PRELIM , & flash_info [ 1 ] ) ;
if ( size_b1 > size_b0 ) {
if ( size_b1 > size_b0 ) {
printf ( " ## ERROR: "
printf ( " ## ERROR: "
" Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB) \n " ,
" Bank 1 (0x%08lx = %ld MB) > Bank 0 (0x%08lx = %ld MB) \n " ,
size_b1 , size_b1 < < 20 ,
size_b1 , size_b1 < < 20 , size_b0 , size_b0 < < 20 ) ;
size_b0 , size_b0 < < 20
) ;
flash_info [ 0 ] . flash_id = FLASH_UNKNOWN ;
flash_info [ 0 ] . flash_id = FLASH_UNKNOWN ;
flash_info [ 1 ] . flash_id = FLASH_UNKNOWN ;
flash_info [ 1 ] . flash_id = FLASH_UNKNOWN ;
flash_info [ 0 ] . sector_count = - 1 ;
flash_info [ 0 ] . sector_count = - 1 ;
@ -92,40 +92,44 @@ unsigned long flash_init (void)
/* Remap FLASH according to real size */
/* Remap FLASH according to real size */
memctl - > memc_or0 = CFG_OR_TIMING_FLASH | ( - size_b0 & 0xFFFF8000 ) ;
memctl - > memc_or0 = CFG_OR_TIMING_FLASH | ( - size_b0 & 0xFFFF8000 ) ;
memctl - > memc_br0 = CFG_FLASH_BASE | 0x00000801 ; /* (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_V;*/
memctl - > memc_br0 = CFG_FLASH_BASE | 0x00000801 ; /* (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_V; */
/* Re-do sizing to get full correct info */
/* Re-do sizing to get full correct info */
size_b0 = flash_get_size ( ( volatile FLASH_WORD_SIZE * ) CFG_FLASH_BASE ,
size_b0 = flash_get_size ( ( volatile FLASH_WORD_SIZE * ) CFG_FLASH_BASE ,
& flash_info [ 0 ] ) ;
& flash_info [ 0 ] ) ;
flash_get_offsets ( CFG_FLASH_BASE , & flash_info [ 0 ] ) ;
flash_get_offsets ( CFG_FLASH_BASE , & flash_info [ 0 ] ) ;
# if CFG_MONITOR_BASE >= CFG_FLASH_BASE
# if CFG_MONITOR_BASE >= CFG_FLASH_BASE
/* monitor protection ON by default */
/* monitor protection ON by default */
( void ) flash_protect ( FLAG_PROTECT_SET ,
( void ) flash_protect ( FLAG_PROTECT_SET ,
CFG_MONITOR_BASE ,
CFG_MONITOR_BASE ,
CFG_MONITOR_BASE + monitor_flash_len - 1 ,
CFG_MONITOR_BASE + monitor_flash_len - 1 ,
& flash_info [ 0 ] ) ;
& flash_info [ 0 ] ) ;
# endif
# endif
if ( size_b1 ) {
if ( size_b1 ) {
memctl - > memc_or1 = CFG_OR_TIMING_FLASH | ( - size_b1 & 0xFFFF8000 ) ;
memctl - > memc_or1 =
memctl - > memc_br1 = ( CFG_FLASH_BASE | 0x00000801 ) + ( size_b0 & BR_BA_MSK ) ;
CFG_OR_TIMING_FLASH | ( - size_b1 & 0xFFFF8000 ) ;
memctl - > memc_br1 =
( CFG_FLASH_BASE | 0x00000801 ) + ( size_b0 & BR_BA_MSK ) ;
/*((CFG_FLASH_BASE + size_b0) & BR_BA_MSK) |
/*((CFG_FLASH_BASE + size_b0) & BR_BA_MSK) |
BR_MS_GPCM | BR_V ; */
BR_MS_GPCM | BR_V ; */
/* Re-do sizing to get full correct info */
/* Re-do sizing to get full correct info */
size_b1 = flash_get_size ( ( volatile FLASH_WORD_SIZE * ) ( CFG_FLASH_BASE + size_b0 ) ,
size_b1 =
flash_get_size ( ( volatile FLASH_WORD_SIZE
* ) ( CFG_FLASH_BASE + size_b0 ) ,
& flash_info [ 1 ] ) ;
& flash_info [ 1 ] ) ;
flash_get_offsets ( CFG_FLASH_BASE + size_b0 , & flash_info [ 1 ] ) ;
flash_get_offsets ( CFG_FLASH_BASE + size_b0 , & flash_info [ 1 ] ) ;
# if CFG_MONITOR_BASE >= CFG_FLASH_BASE
# if CFG_MONITOR_BASE >= CFG_FLASH_BASE
/* monitor protection ON by default */
/* monitor protection ON by default */
( void ) flash_protect ( FLAG_PROTECT_SET ,
( void ) flash_protect ( FLAG_PROTECT_SET ,
CFG_MONITOR_BASE ,
CFG_MONITOR_BASE ,
CFG_MONITOR_BASE + monitor_flash_len - 1 ,
CFG_MONITOR_BASE + monitor_flash_len -
& flash_info [ 1 ] ) ;
1 , & flash_info [ 1 ] ) ;
# endif
# endif
} else {
} else {
memctl - > memc_br1 = 0 ; /* invalidate bank */
memctl - > memc_br1 = 0 ; /* invalidate bank */
@ -142,7 +146,7 @@ unsigned long flash_init (void)
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
*/
*/
static void flash_get_offsets ( ulong base , flash_info_t * info )
static void flash_get_offsets ( ulong base , flash_info_t * info )
{
{
int i ;
int i ;
@ -161,17 +165,18 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
info - > start [ 6 ] = base + 0x00018000 ;
info - > start [ 6 ] = base + 0x00018000 ;
info - > start [ 7 ] = base + 0x0001C000 ;
info - > start [ 7 ] = base + 0x0001C000 ;
for ( i = 8 ; i < info - > sector_count ; i + + ) {
for ( i = 8 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00020000 ) - 0x000E0000 ;
info - > start [ i ] =
}
base + ( i * 0x00020000 ) - 0x000E0000 ;
}
}
else {
} else {
/* set sector offsets for bottom boot block type */
/* set sector offsets for bottom boot block type */
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 1 ] = base + 0x00008000 ;
info - > start [ 1 ] = base + 0x00008000 ;
info - > start [ 2 ] = base + 0x0000C000 ;
info - > start [ 2 ] = base + 0x0000C000 ;
info - > start [ 3 ] = base + 0x00010000 ;
info - > start [ 3 ] = base + 0x00010000 ;
for ( i = 4 ; i < info - > sector_count ; i + + ) {
for ( i = 4 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00020000 ) - 0x00060000 ;
info - > start [ i ] =
base + ( i * 0x00020000 ) - 0x00060000 ;
}
}
}
}
# else
# else
@ -185,17 +190,18 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
info - > start [ 6 ] = base + 0x0000C000 ;
info - > start [ 6 ] = base + 0x0000C000 ;
info - > start [ 7 ] = base + 0x0000E000 ;
info - > start [ 7 ] = base + 0x0000E000 ;
for ( i = 8 ; i < info - > sector_count ; i + + ) {
for ( i = 8 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00010000 ) - 0x00070000 ;
info - > start [ i ] =
}
base + ( i * 0x00010000 ) - 0x00070000 ;
}
}
else {
} else {
/* set sector offsets for bottom boot block type */
/* set sector offsets for bottom boot block type */
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 1 ] = base + 0x00004000 ;
info - > start [ 1 ] = base + 0x00004000 ;
info - > start [ 2 ] = base + 0x00006000 ;
info - > start [ 2 ] = base + 0x00006000 ;
info - > start [ 3 ] = base + 0x00008000 ;
info - > start [ 3 ] = base + 0x00008000 ;
for ( i = 4 ; i < info - > sector_count ; i + + ) {
for ( i = 4 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00010000 ) - 0x00030000 ;
info - > start [ i ] =
base + ( i * 0x00010000 ) - 0x00030000 ;
}
}
}
}
# endif
# endif
@ -254,12 +260,12 @@ static void flash_get_offsets (ulong base, flash_info_t *info)
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
*/
*/
void flash_print_info ( flash_info_t * info )
void flash_print_info ( flash_info_t * info )
{
{
int i ;
int i ;
uchar * boottype ;
uchar * boottype ;
uchar botboot [ ] = " , bottom boot sect) \n " ;
uchar botboot [ ] = " , bottom boot sect) \n " ;
uchar topboot [ ] = " , top boot sector) \n " ;
uchar topboot [ ] = " , top boot sector) \n " ;
if ( info - > flash_id = = FLASH_UNKNOWN ) {
if ( info - > flash_id = = FLASH_UNKNOWN ) {
printf ( " missing or unknown FLASH type \n " ) ;
printf ( " missing or unknown FLASH type \n " ) ;
@ -267,59 +273,88 @@ void flash_print_info (flash_info_t *info)
}
}
switch ( info - > flash_id & FLASH_VENDMASK ) {
switch ( info - > flash_id & FLASH_VENDMASK ) {
case FLASH_MAN_AMD : printf ( " AMD " ) ; break ;
case FLASH_MAN_AMD :
case FLASH_MAN_FUJ : printf ( " FUJITSU " ) ; break ;
printf ( " AMD " ) ;
case FLASH_MAN_SST : printf ( " SST " ) ; break ;
break ;
case FLASH_MAN_STM : printf ( " STM " ) ; break ;
case FLASH_MAN_FUJ :
case FLASH_MAN_INTEL : printf ( " INTEL " ) ; break ;
printf ( " FUJITSU " ) ;
default : printf ( " Unknown Vendor " ) ; break ;
break ;
case FLASH_MAN_SST :
printf ( " SST " ) ;
break ;
case FLASH_MAN_STM :
printf ( " STM " ) ;
break ;
case FLASH_MAN_INTEL :
printf ( " INTEL " ) ;
break ;
default :
printf ( " Unknown Vendor " ) ;
break ;
}
}
if ( info - > flash_id & 0x0001 ) {
if ( info - > flash_id & 0x0001 ) {
boottype = botboot ;
boottype = botboot ;
} else {
} else {
boottype = topboot ;
boottype = topboot ;
}
}
switch ( info - > flash_id & FLASH_TYPEMASK ) {
switch ( info - > flash_id & FLASH_TYPEMASK ) {
case FLASH_AM400B : printf ( " AM29LV400B (4 Mbit%s " , boottype ) ;
case FLASH_AM400B :
printf ( " AM29LV400B (4 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM400T : printf ( " AM29LV400T (4 Mbit%s " , boottype ) ;
case FLASH_AM400T :
printf ( " AM29LV400T (4 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM800B : printf ( " AM29LV800B (8 Mbit%s " , boottype ) ;
case FLASH_AM800B :
printf ( " AM29LV800B (8 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM800T : printf ( " AM29LV800T (8 Mbit%s " , boottype ) ;
case FLASH_AM800T :
printf ( " AM29LV800T (8 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM160B : printf ( " AM29LV160B (16 Mbit%s " , boottype ) ;
case FLASH_AM160B :
printf ( " AM29LV160B (16 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM160T : printf ( " AM29LV160T (16 Mbit%s " , boottype ) ;
case FLASH_AM160T :
printf ( " AM29LV160T (16 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM320B : printf ( " AM29LV320B (32 Mbit%s " , boottype ) ;
case FLASH_AM320B :
printf ( " AM29LV320B (32 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_AM320T : printf ( " AM29LV320T (32 Mbit%s " , boottype ) ;
case FLASH_AM320T :
printf ( " AM29LV320T (32 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL800B : printf ( " INTEL28F800B (8 Mbit%s " , boottype ) ;
case FLASH_INTEL800B :
printf ( " INTEL28F800B (8 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL800T : printf ( " INTEL28F800T (8 Mbit%s " , boottype ) ;
case FLASH_INTEL800T :
printf ( " INTEL28F800T (8 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL160B : printf ( " INTEL28F160B (16 Mbit%s " , boottype ) ;
case FLASH_INTEL160B :
printf ( " INTEL28F160B (16 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL160T : printf ( " INTEL28F160T (16 Mbit%s " , boottype ) ;
case FLASH_INTEL160T :
printf ( " INTEL28F160T (16 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL320B : printf ( " INTEL28F320B (32 Mbit%s " , boottype ) ;
case FLASH_INTEL320B :
printf ( " INTEL28F320B (32 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL320T : printf ( " INTEL28F320T (32 Mbit%s " , boottype ) ;
case FLASH_INTEL320T :
printf ( " INTEL28F320T (32 Mbit%s " , boottype ) ;
break ;
break ;
#if 0 /* enable when devices are available */
#if 0 /* enable when devices are available */
case FLASH_INTEL640B : printf ( " INTEL28F640B (64 Mbit%s " , boottype ) ;
case FLASH_INTEL640B :
printf ( " INTEL28F640B (64 Mbit%s " , boottype ) ;
break ;
break ;
case FLASH_INTEL640T : printf ( " INTEL28F640T (64 Mbit%s " , boottype ) ;
case FLASH_INTEL640T :
printf ( " INTEL28F640T (64 Mbit%s " , boottype ) ;
break ;
break ;
# endif
# endif
default : printf ( " Unknown Chip Type \n " ) ;
default :
printf ( " Unknown Chip Type \n " ) ;
break ;
break ;
}
}
@ -327,13 +362,11 @@ void flash_print_info (flash_info_t *info)
info - > size > > 20 , info - > sector_count ) ;
info - > size > > 20 , info - > sector_count ) ;
printf ( " Sector Start Addresses: " ) ;
printf ( " Sector Start Addresses: " ) ;
for ( i = 0 ; i < info - > sector_count ; + + i ) {
for ( i = 0 ; i < info - > sector_count ; + + i ) {
if ( ( i % 5 ) = = 0 )
if ( ( i % 5 ) = = 0 )
printf ( " \n " ) ;
printf ( " \n " ) ;
printf ( " %08lX%s " ,
printf ( " %08lX%s " ,
info - > start [ i ] ,
info - > start [ i ] , info - > protect [ i ] ? " (RO) " : " " ) ;
info - > protect [ i ] ? " (RO) " : " "
) ;
}
}
printf ( " \n " ) ;
printf ( " \n " ) ;
return ;
return ;
@ -349,10 +382,10 @@ void flash_print_info (flash_info_t *info)
/*
/*
* The following code cannot be run from FLASH !
* The following code cannot be run from FLASH !
*/
*/
ulong flash_get_size ( volatile FLASH_WORD_SIZE * addr , flash_info_t * info )
ulong flash_get_size ( volatile FLASH_WORD_SIZE * addr , flash_info_t * info )
{
{
short i ;
short i ;
ulong base = ( ulong ) addr ;
ulong base = ( ulong ) addr ;
FLASH_WORD_SIZE value ;
FLASH_WORD_SIZE value ;
/* Write auto select command: read Manufacturer ID */
/* Write auto select command: read Manufacturer ID */
@ -367,7 +400,7 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
*/
*/
addr [ 0x0000 ] = 0x00900090 ;
addr [ 0x0000 ] = 0x00900090 ;
if ( addr [ 0x0000 ] ! = 0x00890089 ) {
if ( addr [ 0x0000 ] ! = 0x00890089 ) {
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x02AA ] = 0x00550055 ;
addr [ 0x02AA ] = 0x00550055 ;
addr [ 0x0555 ] = 0x00900090 ;
addr [ 0x0555 ] = 0x00900090 ;
@ -381,7 +414,7 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
addr [ 0x0000 ] = 0x0090 ;
addr [ 0x0000 ] = 0x0090 ;
if ( addr [ 0x0000 ] ! = 0x0089 ) {
if ( addr [ 0x0000 ] ! = 0x0089 ) {
addr [ 0x0555 ] = 0x00AA ;
addr [ 0x0555 ] = 0x00AA ;
addr [ 0x02AA ] = 0x0055 ;
addr [ 0x02AA ] = 0x0055 ;
addr [ 0x0555 ] = 0x0090 ;
addr [ 0x0555 ] = 0x0090 ;
@ -536,17 +569,18 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
info - > start [ 6 ] = base + 0x00018000 ;
info - > start [ 6 ] = base + 0x00018000 ;
info - > start [ 7 ] = base + 0x0001C000 ;
info - > start [ 7 ] = base + 0x0001C000 ;
for ( i = 8 ; i < info - > sector_count ; i + + ) {
for ( i = 8 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00020000 ) - 0x000E0000 ;
info - > start [ i ] =
}
base + ( i * 0x00020000 ) - 0x000E0000 ;
}
}
else {
} else {
/* set sector offsets for bottom boot block type */
/* set sector offsets for bottom boot block type */
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 1 ] = base + 0x00008000 ;
info - > start [ 1 ] = base + 0x00008000 ;
info - > start [ 2 ] = base + 0x0000C000 ;
info - > start [ 2 ] = base + 0x0000C000 ;
info - > start [ 3 ] = base + 0x00010000 ;
info - > start [ 3 ] = base + 0x00010000 ;
for ( i = 4 ; i < info - > sector_count ; i + + ) {
for ( i = 4 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00020000 ) - 0x00060000 ;
info - > start [ i ] =
base + ( i * 0x00020000 ) - 0x00060000 ;
}
}
}
}
# else
# else
@ -560,17 +594,18 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
info - > start [ 6 ] = base + 0x0000C000 ;
info - > start [ 6 ] = base + 0x0000C000 ;
info - > start [ 7 ] = base + 0x0000E000 ;
info - > start [ 7 ] = base + 0x0000E000 ;
for ( i = 8 ; i < info - > sector_count ; i + + ) {
for ( i = 8 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00010000 ) - 0x00070000 ;
info - > start [ i ] =
}
base + ( i * 0x00010000 ) - 0x00070000 ;
}
}
else {
} else {
/* set sector offsets for bottom boot block type */
/* set sector offsets for bottom boot block type */
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 0 ] = base + 0x00000000 ;
info - > start [ 1 ] = base + 0x00004000 ;
info - > start [ 1 ] = base + 0x00004000 ;
info - > start [ 2 ] = base + 0x00006000 ;
info - > start [ 2 ] = base + 0x00006000 ;
info - > start [ 3 ] = base + 0x00008000 ;
info - > start [ 3 ] = base + 0x00008000 ;
for ( i = 4 ; i < info - > sector_count ; i + + ) {
for ( i = 4 ; i < info - > sector_count ; i + + ) {
info - > start [ i ] = base + ( i * 0x00010000 ) - 0x00030000 ;
info - > start [ i ] =
base + ( i * 0x00010000 ) - 0x00030000 ;
}
}
}
}
# endif
# endif
@ -628,7 +663,7 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
for ( i = 0 ; i < info - > sector_count ; i + + ) {
for ( i = 0 ; i < info - > sector_count ; i + + ) {
/* read sector protection at sector address, (A7 .. A0) = 0x02 */
/* read sector protection at sector address, (A7 .. A0) = 0x02 */
/* D0 = 1 if protected */
/* D0 = 1 if protected */
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ i ] ) ;
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ i ] ) ;
info - > protect [ i ] = addr [ 2 ] & 1 ;
info - > protect [ i ] = addr [ 2 ] & 1 ;
}
}
@ -636,8 +671,8 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
* Prevent writes to uninitialized FLASH .
* Prevent writes to uninitialized FLASH .
*/
*/
if ( info - > flash_id ! = FLASH_UNKNOWN ) {
if ( info - > flash_id ! = FLASH_UNKNOWN ) {
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
if ( ( info - > flash_id & 0xFF00 ) = = FLASH_MAN_INTEL ) {
if ( ( info - > flash_id & 0xFF00 ) = = FLASH_MAN_INTEL ) {
* addr = ( 0x00F000F0 & FLASH_ID_MASK ) ; /* reset bank */
* addr = ( 0x00F000F0 & FLASH_ID_MASK ) ; /* reset bank */
} else {
} else {
* addr = ( 0x00FF00FF & FLASH_ID_MASK ) ; /* reset bank */
* addr = ( 0x00FF00FF & FLASH_ID_MASK ) ; /* reset bank */
@ -651,10 +686,11 @@ ulong flash_get_size (volatile FLASH_WORD_SIZE *addr, flash_info_t *info)
/*-----------------------------------------------------------------------
/*-----------------------------------------------------------------------
*/
*/
int flash_erase ( flash_info_t * info , int s_first , int s_last )
int flash_erase ( flash_info_t * info , int s_first , int s_last )
{
{
volatile FLASH_WORD_SIZE * addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ 0 ] ) ;
volatile FLASH_WORD_SIZE * addr =
( volatile FLASH_WORD_SIZE * ) ( info - > start [ 0 ] ) ;
int flag , prot , sect , l_sect , barf ;
int flag , prot , sect , l_sect , barf ;
ulong start , now , last ;
ulong start , now , last ;
int rcode = 0 ;
int rcode = 0 ;
@ -670,21 +706,20 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
if ( ( info - > flash_id = = FLASH_UNKNOWN ) | |
if ( ( info - > flash_id = = FLASH_UNKNOWN ) | |
( ( info - > flash_id > FLASH_AMD_COMP ) & &
( ( info - > flash_id > FLASH_AMD_COMP ) & &
( ( info - > flash_id & FLASH_VENDMASK ) ! = FLASH_MAN_INTEL ) ) ) {
( ( info - > flash_id & FLASH_VENDMASK ) ! = FLASH_MAN_INTEL ) ) ) {
printf ( " Can't erase unknown flash type - aborted \n " ) ;
printf ( " Can't erase unknown flash type - aborted \n " ) ;
return 1 ;
return 1 ;
}
}
prot = 0 ;
prot = 0 ;
for ( sect = s_first ; sect < = s_last ; + + sect ) {
for ( sect = s_first ; sect < = s_last ; + + sect ) {
if ( info - > protect [ sect ] ) {
if ( info - > protect [ sect ] ) {
prot + + ;
prot + + ;
}
}
}
}
if ( prot ) {
if ( prot ) {
printf ( " - Warning: %d protected sectors will not be erased! \n " ,
printf ( " - Warning: %d protected sectors will not be erased! \n " , prot ) ;
prot ) ;
} else {
} else {
printf ( " \n " ) ;
printf ( " \n " ) ;
}
}
@ -692,8 +727,8 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
l_sect = - 1 ;
l_sect = - 1 ;
/* Disable interrupts which might cause a timeout here */
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ( ) ;
flag = disable_interrupts ( ) ;
if ( info - > flash_id < FLASH_AMD_COMP ) {
if ( info - > flash_id < FLASH_AMD_COMP ) {
# ifndef CONFIG_FLASH_16BIT
# ifndef CONFIG_FLASH_16BIT
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x02AA ] = 0x00550055 ;
addr [ 0x02AA ] = 0x00550055 ;
@ -708,9 +743,9 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
addr [ 0x02AA ] = 0x0055 ;
addr [ 0x02AA ] = 0x0055 ;
# endif
# endif
/* Start erase on unprotected sectors */
/* Start erase on unprotected sectors */
for ( sect = s_first ; sect < = s_last ; sect + + ) {
for ( sect = s_first ; sect < = s_last ; sect + + ) {
if ( info - > protect [ sect ] = = 0 ) { /* not protected */
if ( info - > protect [ sect ] = = 0 ) { /* not protected */
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ sect ] ) ;
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ sect ] ) ;
addr [ 0 ] = ( 0x00300030 & FLASH_ID_MASK ) ;
addr [ 0 ] = ( 0x00300030 & FLASH_ID_MASK ) ;
l_sect = sect ;
l_sect = sect ;
}
}
@ -718,7 +753,7 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
/* re-enable interrupts if necessary */
/* re-enable interrupts if necessary */
if ( flag )
if ( flag )
enable_interrupts ( ) ;
enable_interrupts ( ) ;
/* wait at least 80us - let's wait 1 ms */
/* wait at least 80us - let's wait 1 ms */
udelay ( 1000 ) ;
udelay ( 1000 ) ;
@ -731,11 +766,10 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
start = get_timer ( 0 ) ;
start = get_timer ( 0 ) ;
last = start ;
last = start ;
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ l_sect ] ) ;
addr = ( volatile FLASH_WORD_SIZE * ) ( info - > start [ l_sect ] ) ;
while ( ( addr [ 0 ] & ( 0x00800080 & FLASH_ID_MASK ) ) ! =
while ( ( addr [ 0 ] & ( 0x00800080 & FLASH_ID_MASK ) ) ! =
( 0x00800080 & FLASH_ID_MASK ) )
( 0x00800080 & FLASH_ID_MASK ) ) {
{
if ( ( now = get_timer ( start ) ) > CFG_FLASH_ERASE_TOUT ) {
if ( ( now = get_timer ( start ) ) > CFG_FLASH_ERASE_TOUT ) {
printf ( " Timeout \n " ) ;
printf ( " Timeout \n " ) ;
return 1 ;
return 1 ;
}
}
@ -746,50 +780,53 @@ int flash_erase (flash_info_t *info, int s_first, int s_last)
}
}
}
}
DONE :
DONE :
/* reset to read mode */
/* reset to read mode */
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
addr [ 0 ] = ( 0x00F000F0 & FLASH_ID_MASK ) ; /* reset bank */
addr [ 0 ] = ( 0x00F000F0 & FLASH_ID_MASK ) ; /* reset bank */
} else {
} else {
for ( sect = s_first ; sect < = s_last ; sect + + ) {
for ( sect = s_first ; sect < = s_last ; sect + + ) {
if ( info - > protect [ sect ] = = 0 ) { /* not protected */
if ( info - > protect [ sect ] = = 0 ) { /* not protected */
barf = 0 ;
barf = 0 ;
# ifndef CONFIG_FLASH_16BIT
# ifndef CONFIG_FLASH_16BIT
addr = ( vu_long * ) ( info - > start [ sect ] ) ;
addr = ( vu_long * ) ( info - > start [ sect ] ) ;
addr [ 0 ] = 0x00200020 ;
addr [ 0 ] = 0x00200020 ;
addr [ 0 ] = 0x00D000D0 ;
addr [ 0 ] = 0x00D000D0 ;
while ( ! ( addr [ 0 ] & 0x00800080 ) ) ; /* wait for error or finish */
while ( ! ( addr [ 0 ] & 0x00800080 ) ) ; /* wait for error or finish */
if ( addr [ 0 ] & 0x003A003A ) { /* check for error */
if ( addr [ 0 ] & 0x003A003A ) { /* check for error */
barf = addr [ 0 ] & 0x003A0000 ;
barf = addr [ 0 ] & 0x003A0000 ;
if ( barf ) {
if ( barf ) {
barf > > = 16 ;
barf > > = 16 ;
} else {
} else {
barf = addr [ 0 ] & 0x0000003A ;
barf = addr [ 0 ] & 0x0000003A ;
}
}
}
}
# else
# else
addr = ( vu_short * ) ( info - > start [ sect ] ) ;
addr = ( vu_short * ) ( info - > start [ sect ] ) ;
addr [ 0 ] = 0x0020 ;
addr [ 0 ] = 0x0020 ;
addr [ 0 ] = 0x00D0 ;
addr [ 0 ] = 0x00D0 ;
while ( ! ( addr [ 0 ] & 0x0080 ) ) ; /* wait for error or finish */
while ( ! ( addr [ 0 ] & 0x0080 ) ) ; /* wait for error or finish */
if ( addr [ 0 ] & 0x003A ) /* check for error */
if ( addr [ 0 ] & 0x003A ) /* check for error */
barf = addr [ 0 ] & 0x003A ;
barf = addr [ 0 ] & 0x003A ;
# endif
# endif
if ( barf ) {
if ( barf ) {
printf ( " \n Flash error in sector at %lx \n " , ( unsigned long ) addr ) ;
printf ( " \n Flash error in sector at %lx \n " , ( unsigned long ) addr ) ;
if ( barf & 0x0002 ) printf ( " Block locked, not erased. \n " ) ;
if ( barf & 0x0002 )
if ( ( barf & 0x0030 ) = = 0x0030 )
printf ( " Block locked, not erased. \n " ) ;
printf ( " Command Sequence error. \n " ) ;
if ( ( barf & 0x0030 ) = = 0x0030 )
if ( ( barf & 0x0030 ) = = 0x0020 )
printf ( " Command Sequence error. \n " ) ;
printf ( " Block Erase error. \n " ) ;
if ( ( barf & 0x0030 ) = = 0x0020 )
if ( barf & 0x0008 ) printf ( " Vpp Low error. \n " ) ;
printf ( " Block Erase error. \n " ) ;
if ( barf & 0x0008 )
printf ( " Vpp Low error. \n " ) ;
rcode = 1 ;
rcode = 1 ;
} else printf ( " . " ) ;
} else
printf ( " . " ) ;
l_sect = sect ;
l_sect = sect ;
}
}
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
addr = ( volatile FLASH_WORD_SIZE * ) info - > start [ 0 ] ;
addr [ 0 ] = ( 0x00FF00FF & FLASH_ID_MASK ) ; /* reset bank */
addr [ 0 ] = ( 0x00FF00FF & FLASH_ID_MASK ) ; /* reset bank */
}
}
@ -809,7 +846,7 @@ DONE:
* 2 - Flash not erased
* 2 - Flash not erased
*/
*/
int write_buff ( flash_info_t * info , uchar * src , ulong addr , ulong cnt )
int write_buff ( flash_info_t * info , uchar * src , ulong addr , ulong cnt )
{
{
# ifndef CONFIG_FLASH_16BIT
# ifndef CONFIG_FLASH_16BIT
ulong cp , wp , data ;
ulong cp , wp , data ;
@ -830,19 +867,19 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
*/
*/
if ( ( l = addr - wp ) ! = 0 ) {
if ( ( l = addr - wp ) ! = 0 ) {
data = 0 ;
data = 0 ;
for ( i = 0 , cp = wp ; i < l ; + + i , + + cp ) {
for ( i = 0 , cp = wp ; i < l ; + + i , + + cp ) {
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
}
}
for ( ; i < 4 & & cnt > 0 ; + + i ) {
for ( ; i < 4 & & cnt > 0 ; + + i ) {
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
- - cnt ;
- - cnt ;
+ + cp ;
+ + cp ;
}
}
for ( ; cnt = = 0 & & i < 4 ; + + i , + + cp ) {
for ( ; cnt = = 0 & & i < 4 ; + + i , + + cp ) {
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
}
}
if ( ( rc = write_word ( info , wp , data ) ) ! = 0 ) {
if ( ( rc = write_word ( info , wp , data ) ) ! = 0 ) {
return ( rc ) ;
return ( rc ) ;
}
}
wp + = 4 ;
wp + = 4 ;
@ -853,10 +890,10 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
*/
*/
while ( cnt > = 4 ) {
while ( cnt > = 4 ) {
data = 0 ;
data = 0 ;
for ( i = 0 ; i < 4 ; + + i ) {
for ( i = 0 ; i < 4 ; + + i ) {
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
}
}
if ( ( rc = write_word ( info , wp , data ) ) ! = 0 ) {
if ( ( rc = write_word ( info , wp , data ) ) ! = 0 ) {
return ( rc ) ;
return ( rc ) ;
}
}
wp + = 4 ;
wp + = 4 ;
@ -871,15 +908,15 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
* handle unaligned tail bytes
* handle unaligned tail bytes
*/
*/
data = 0 ;
data = 0 ;
for ( i = 0 , cp = wp ; i < 4 & & cnt > 0 ; + + i , + + cp ) {
for ( i = 0 , cp = wp ; i < 4 & & cnt > 0 ; + + i , + + cp ) {
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
- - cnt ;
- - cnt ;
}
}
for ( ; i < 4 ; + + i , + + cp ) {
for ( ; i < 4 ; + + i , + + cp ) {
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
}
}
return ( write_word ( info , wp , data ) ) ;
return ( write_word ( info , wp , data ) ) ;
# else
# else
wp = ( addr & ~ 1 ) ; /* get lower word aligned address */
wp = ( addr & ~ 1 ) ; /* get lower word aligned address */
@ -891,7 +928,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
data = 0 ;
data = 0 ;
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
- - cnt ;
- - cnt ;
if ( ( rc = write_short ( info , wp , data ) ) ! = 0 ) {
if ( ( rc = write_short ( info , wp , data ) ) ! = 0 ) {
return ( rc ) ;
return ( rc ) ;
}
}
wp + = 2 ;
wp + = 2 ;
@ -903,7 +940,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
/* l = 0; used for debuging */
/* l = 0; used for debuging */
while ( cnt > = 2 ) {
while ( cnt > = 2 ) {
data = 0 ;
data = 0 ;
for ( i = 0 ; i < 2 ; + + i ) {
for ( i = 0 ; i < 2 ; + + i ) {
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
}
}
@ -912,7 +949,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
l = 1 ;
l = 1 ;
} used for debuging */
} used for debuging */
if ( ( rc = write_short ( info , wp , data ) ) ! = 0 ) {
if ( ( rc = write_short ( info , wp , data ) ) ! = 0 ) {
return ( rc ) ;
return ( rc ) ;
}
}
wp + = 2 ;
wp + = 2 ;
@ -927,15 +964,15 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
* handle unaligned tail bytes
* handle unaligned tail bytes
*/
*/
data = 0 ;
data = 0 ;
for ( i = 0 , cp = wp ; i < 2 & & cnt > 0 ; + + i , + + cp ) {
for ( i = 0 , cp = wp ; i < 2 & & cnt > 0 ; + + i , + + cp ) {
data = ( data < < 8 ) | * src + + ;
data = ( data < < 8 ) | * src + + ;
- - cnt ;
- - cnt ;
}
}
for ( ; i < 2 ; + + i , + + cp ) {
for ( ; i < 2 ; + + i , + + cp ) {
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
data = ( data < < 8 ) | ( * ( uchar * ) cp ) ;
}
}
return ( write_short ( info , wp , data ) ) ;
return ( write_short ( info , wp , data ) ) ;
# endif
# endif
@ -948,22 +985,22 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
* 2 - Flash not erased
* 2 - Flash not erased
*/
*/
# ifndef CONFIG_FLASH_16BIT
# ifndef CONFIG_FLASH_16BIT
static int write_word ( flash_info_t * info , ulong dest , ulong data )
static int write_word ( flash_info_t * info , ulong dest , ulong data )
{
{
vu_long * addr = ( vu_long * ) ( info - > start [ 0 ] ) ;
vu_long * addr = ( vu_long * ) ( info - > start [ 0 ] ) ;
ulong start , barf ;
ulong start , barf ;
int flag ;
int flag ;
/* Check if Flash is (sufficiently) erased */
/* Check if Flash is (sufficiently) erased */
if ( ( * ( ( vu_long * ) dest ) & data ) ! = data ) {
if ( ( * ( ( vu_long * ) dest ) & data ) ! = data ) {
return ( 2 ) ;
return ( 2 ) ;
}
}
/* Disable interrupts which might cause a timeout here */
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ( ) ;
flag = disable_interrupts ( ) ;
if ( info - > flash_id > FLASH_AMD_COMP ) {
if ( info - > flash_id > FLASH_AMD_COMP ) {
/* AMD stuff */
/* AMD stuff */
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x0555 ] = 0x00AA00AA ;
addr [ 0x02AA ] = 0x00550055 ;
addr [ 0x02AA ] = 0x00550055 ;
@ -972,42 +1009,46 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
/* intel stuff */
/* intel stuff */
* addr = 0x00400040 ;
* addr = 0x00400040 ;
}
}
* ( ( vu_long * ) dest ) = data ;
* ( ( vu_long * ) dest ) = data ;
/* re-enable interrupts if necessary */
/* re-enable interrupts if necessary */
if ( flag )
if ( flag )
enable_interrupts ( ) ;
enable_interrupts ( ) ;
/* data polling for D7 */
/* data polling for D7 */
start = get_timer ( 0 ) ;
start = get_timer ( 0 ) ;
if ( info - > flash_id > FLASH_AMD_COMP ) {
if ( info - > flash_id > FLASH_AMD_COMP ) {
while ( ( * ( ( vu_long * ) dest ) & 0x00800080 ) ! = ( data & 0x00800080 ) ) {
while ( ( * ( ( vu_long * ) dest ) & 0x00800080 ) ! =
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
( data & 0x00800080 ) ) {
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
return ( 1 ) ;
return ( 1 ) ;
}
}
}
}
} else {
} else {
while ( ! ( addr [ 0 ] & 0x00800080 ) ) { /* wait for error or finish */
while ( ! ( addr [ 0 ] & 0x00800080 ) ) { /* wait for error or finish */
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
return ( 1 ) ;
return ( 1 ) ;
}
}
if ( addr [ 0 ] & 0x003A003A ) { /* check for error */
if ( addr [ 0 ] & 0x003A003A ) { /* check for error */
barf = addr [ 0 ] & 0x003A0000 ;
barf = addr [ 0 ] & 0x003A0000 ;
if ( barf ) {
if ( barf ) {
barf > > = 16 ;
barf > > = 16 ;
} else {
} else {
barf = addr [ 0 ] & 0x0000003A ;
barf = addr [ 0 ] & 0x0000003A ;
}
}
printf ( " \n Flash write error at address %lx \n " , ( unsigned long ) dest ) ;
printf ( " \n Flash write error at address %lx \n " , ( unsigned long ) dest ) ;
if ( barf & 0x0002 ) printf ( " Block locked, not erased. \n " ) ;
if ( barf & 0x0002 )
if ( barf & 0x0010 ) printf ( " Programming error. \n " ) ;
printf ( " Block locked, not erased. \n " ) ;
if ( barf & 0x0008 ) printf ( " Vpp Low error. \n " ) ;
if ( barf & 0x0010 )
return ( 2 ) ;
printf ( " Programming error. \n " ) ;
if ( barf & 0x0008 )
printf ( " Vpp Low error. \n " ) ;
return ( 2 ) ;
}
}
@ -1015,25 +1056,25 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
return ( 0 ) ;
return ( 0 ) ;
}
}
# else
# else
static int write_short ( flash_info_t * info , ulong dest , ushort data )
static int write_short ( flash_info_t * info , ulong dest , ushort data )
{
{
vu_short * addr = ( vu_short * ) ( info - > start [ 0 ] ) ;
vu_short * addr = ( vu_short * ) ( info - > start [ 0 ] ) ;
ulong start , barf ;
ulong start , barf ;
int flag ;
int flag ;
/* Check if Flash is (sufficiently) erased */
/* Check if Flash is (sufficiently) erased */
if ( ( * ( ( vu_short * ) dest ) & data ) ! = data ) {
if ( ( * ( ( vu_short * ) dest ) & data ) ! = data ) {
return ( 2 ) ;
return ( 2 ) ;
}
}
/* Disable interrupts which might cause a timeout here */
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts ( ) ;
flag = disable_interrupts ( ) ;
if ( info - > flash_id < FLASH_AMD_COMP ) {
if ( info - > flash_id < FLASH_AMD_COMP ) {
/* AMD stuff */
/* AMD stuff */
addr [ 0x0555 ] = 0x00AA ;
addr [ 0x0555 ] = 0x00AA ;
addr [ 0x02AA ] = 0x0055 ;
addr [ 0x02AA ] = 0x0055 ;
@ -1043,53 +1084,52 @@ static int write_short (flash_info_t *info, ulong dest, ushort data)
* addr = 0x00D0 ;
* addr = 0x00D0 ;
* addr = 0x0040 ;
* addr = 0x0040 ;
}
}
* ( ( vu_short * ) dest ) = data ;
* ( ( vu_short * ) dest ) = data ;
/* re-enable interrupts if necessary */
/* re-enable interrupts if necessary */
if ( flag )
if ( flag )
enable_interrupts ( ) ;
enable_interrupts ( ) ;
/* data polling for D7 */
/* data polling for D7 */
start = get_timer ( 0 ) ;
start = get_timer ( 0 ) ;
if ( info - > flash_id < FLASH_AMD_COMP ) {
if ( info - > flash_id < FLASH_AMD_COMP ) {
/* AMD stuff */
/* AMD stuff */
while ( ( * ( ( vu_short * ) dest ) & 0x0080 ) ! = ( data & 0x0080 ) ) {
while ( ( * ( ( vu_short * ) dest ) & 0x0080 ) ! = ( data & 0x0080 ) ) {
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) {
return ( 1 ) ;
return ( 1 ) ;
}
}
}
}
} else {
} else {
/* intel stuff */
/* intel stuff */
while ( ! ( addr [ 0 ] & 0x0080 ) ) { /* wait for error or finish */
while ( ! ( addr [ 0 ] & 0x0080 ) ) { /* wait for error or finish */
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) return ( 1 ) ;
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT )
return ( 1 ) ;
}
}
if ( addr [ 0 ] & 0x003A ) { /* check for error */
if ( addr [ 0 ] & 0x003A ) { /* check for error */
barf = addr [ 0 ] & 0x003A ;
barf = addr [ 0 ] & 0x003A ;
printf ( " \n Flash write error at address %lx \n " , ( unsigned long ) dest ) ;
printf ( " \n Flash write error at address %lx \n " ,
if ( barf & 0x0002 ) printf ( " Block locked, not erased. \n " ) ;
( unsigned long ) dest ) ;
if ( barf & 0x0010 ) printf ( " Programming error. \n " ) ;
if ( barf & 0x0002 )
if ( barf & 0x0008 ) printf ( " Vpp Low error. \n " ) ;
printf ( " Block locked, not erased. \n " ) ;
return ( 2 ) ;
if ( barf & 0x0010 )
printf ( " Programming error. \n " ) ;
if ( barf & 0x0008 )
printf ( " Vpp Low error. \n " ) ;
return ( 2 ) ;
}
}
* addr = 0x00B0 ;
* addr = 0x00B0 ;
* addr = 0x0070 ;
* addr = 0x0070 ;
while ( ! ( addr [ 0 ] & 0x0080 ) ) { /* wait for error or finish */
while ( ! ( addr [ 0 ] & 0x0080 ) ) { /* wait for error or finish */
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT ) return ( 1 ) ;
if ( get_timer ( start ) > CFG_FLASH_WRITE_TOUT )
return ( 1 ) ;
}
}
* addr = 0x00FF ;
* addr = 0x00FF ;
}
}
return ( 0 ) ;
return ( 0 ) ;
}
}
# endif
# endif
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------
*/