📄 flash_strata.c
字号:
{
/* issue 'clear lock-bit' command */
REG32(pw) = FLASH_CLEAR_LOCK_COMMAND ;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
if (rcode != OK)
{
break ;
}
/* issue 'erase' command */
REG32(pw) = FLASH_ERASE_COMMAND;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
if (rcode != OK)
{
break ;
}
/* next block */
pw = (UINT32*)((UINT32)pw + systemflash_block_size) ;
}
if (rcode != OK)
{
break ;
}
}
/* reset working pointer to start of system flash */
pw = (UINT32*)KSEG1(systemflash_phys_start) ;
for (bank = 0; bank < systemflash_bank_count; bank++)
{
/* issue 'CLEAR STATUS: SR-5,4,3,1' command */
REG32(pw) = FLASH_CLEAR_STATUS_COMMAND;
/* issue 'READ ARRAY' command */
REG32(pw) = FLASH_READ_COMMAND;
/* next bank: */
pw = (UINT32*)((UINT32)pw + (systemflash_block_count * systemflash_block_size)) ;
}
WRITE_DISABLE ;
return( rcode ) ;
}
/************************************************************************
*
* FLASH_STRATA_erase_fileflash
* Description :
* -------------
* Erase file flash, which is the last block (in each FLASH device)
* of the monitor flash.
*
*
* Parameters :
* ------------
*
* -
*
* Return values :
* ---------------
*
* 'OK' = 0x00: File FLASH erased succesfully
* ERROR_FLASH_PROGRAM_ERROR Flash device failure
*
*
************************************************************************/
static
INT32 FLASH_STRATA_erase_fileflash( void )
{
int rcode = OK ;
UINT32 status ;
volatile UINT32 *pw;
/* We know, this is just one block to erase */
pw = (UINT32*) KSEG1(fileflash_phys_start) ;
/* issue 'CLEAR STATUS: SR-5,4,3,1' command */
REG32(pw) = FLASH_CLEAR_STATUS_COMMAND ;
/* issue 'READ_ID_CODES' command */
REG32(pw) = FLASH_READ_ID_CODES_COMMAND ;
/* read status and check for LOCKED block */
if ( REG32( ((UINT32)pw+FLASH_BLOCKSTATUS_OFS) ) & FLASH_BLOCKSTATUS_LOCK_MSK )
{
/* issue 'clear lock-bit' command */
REG32(pw) = FLASH_CLEAR_LOCK_COMMAND ;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
}
if (rcode == OK)
{
/* issue 'erase' command */
REG32(pw) = FLASH_ERASE_COMMAND;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
}
/* check for hw write protect */
if (rcode == ERROR_FLASH_LOCKED)
{
if ( FLASH_STRATA_is_file_flash_write_protected() )
{
rcode = ERROR_FLASH_FILE_FLASH_LOCK ;
}
}
/* issue 'CLEAR STATUS: SR-5,4,3,1' command */
REG32(pw) = FLASH_CLEAR_STATUS_COMMAND;
/* issue 'READ ARRAY' command */
REG32(pw) = FLASH_READ_COMMAND;
return( rcode ) ;
}
/************************************************************************
*
* FLASH_STRATA_erase_flasharea
* Description :
* -------------
* Erase flash area; i.e. the driver erases the flash blocks inside
* the specified memory area.
*
*
* Parameters :
* ------------
*
* 'p_param', IN, variable of type, t_FLASH_ctrl_descriptor.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: FLASH erased succesfully
* ERROR_FLASH_PROGRAM_ERROR Flash device failure
* ERROR_FLASH_INVALID_ADDRESS Address area not inside FLASH
* devices
*
*
************************************************************************/
static
INT32 FLASH_STRATA_erase_flasharea( t_FLASH_ctrl_descriptor *p_param )
{
int rcode = OK ;
UINT32 blocksize, start, end, blockcount ;
UINT32 block ;
bool monitor_flash = FALSE ;
volatile UINT32 *pw ;
switch (FLASH_STRATA_devicetype(p_param->user_physadr))
{
case FLASH_SYSTEMFLASH_DEVICE:
/* system FLASH */
if ( FLASH_STRATA_is_system_flash_write_protected() )
{
return( ERROR_FLASH_WRITE_PROTECTED ) ;
}
else
{
/* validate upper boundary */
if ( FLASH_STRATA_devicetype( p_param->user_physadr +
p_param->user_length - 1 )
!= FLASH_SYSTEMFLASH_DEVICE )
{
return( ERROR_FLASH_INVALID_ADDRESS ) ;
}
WRITE_ENABLE ;
blocksize = systemflash_block_size ;
}
break ;
case FLASH_FILEFLASH_DEVICE:
/* Reject erase of FILE FLASH */
memset( flash_diag_msg, 0, sizeof(flash_diag_msg) ) ;
sprintf( flash_diag_msg, "Environment FLASH: map = (0x%08x,0x%08x), user = 0x%08x",
(UINT32) fileflash_phys_start,
(UINT32) fileflash_phys_end,
(UINT32) PHYS(p_param->user_physadr) ) ;
return( ERROR_FLASH_FILE_FLASH_PROT ) ;
break ;
case FLASH_MONITORFLASH_DEVICE:
/* Monitor FLASH */
monitor_flash = TRUE ;
/* validate upper boundary */
if ( FLASH_STRATA_devicetype( p_param->user_physadr +
p_param->user_length - 1 )
!= FLASH_MONITORFLASH_DEVICE )
{
return( ERROR_FLASH_INVALID_ADDRESS ) ;
}
blocksize = monitorflash_block_size ;
break ;
case FLASH_BOOT_DEVICE:
/* Boot device */
memset( flash_diag_msg, 0, sizeof(flash_diag_msg) ) ;
sprintf( flash_diag_msg, "MIPS boot media: map = (0x%08x,0x%08x), user = 0x%08x",
(UINT32) boot_phys_start,
(UINT32) boot_phys_end,
(UINT32) PHYS(p_param->user_physadr) ) ;
return( ERROR_FLASH_BOOT_WRITE_PROTECTED ) ;
break ;
default:
return( ERROR_FLASH_INVALID_ADDRESS ) ;
break ;
}
/* calculate committed FLASH area */
start = (KSEG1(p_param->user_physadr)/blocksize) * blocksize ;
end = ((((KSEG1(p_param->user_physadr) +
p_param->user_length)/blocksize)) * blocksize) - 1 ;
if ( ((KSEG1(p_param->user_physadr)+p_param->user_length) % blocksize) != 0)
{
end = end + blocksize ;
}
blockcount = (end + 1 - start)/ blocksize ;
/* return committed area to user */
p_param->driver_physadr = PHYS(start) ;
p_param->driver_length = (end - start) + 1 ;
/* erase FLASH area */
pw = (UINT32*) start ;
/* issue 'CLEAR STATUS: SR-5,4,3,1' command */
REG32(pw) = FLASH_CLEAR_STATUS_COMMAND ;
for (block = 0; block < blockcount; block++)
{
/* issue 'READ_ID_CODES' command */
REG32(pw) = FLASH_READ_ID_CODES_COMMAND ;
/* read status and check for LOCKED block */
if ( REG32( ((UINT32)pw+FLASH_BLOCKSTATUS_OFS) ) & FLASH_BLOCKSTATUS_LOCK_MSK )
{
/* issue 'clear lock-bit' command */
REG32(pw) = FLASH_CLEAR_LOCK_COMMAND ;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
}
if (rcode == OK)
{
/* issue 'erase' command */
REG32(pw) = FLASH_ERASE_COMMAND;
/* issue 'confirm' command */
REG32(pw) = FLASH_CONFIRM_COMMAND;
/* await completion */
rcode = FLASH_STRATA_wait_ready( pw, FLASH_RETRY_10);
}
/* check for hw write protect */
if ( (rcode == ERROR_FLASH_LOCKED) && (monitor_flash) )
{
if ( FLASH_STRATA_is_monitor_flash_write_protected() )
{
rcode = ERROR_FLASH_MONITOR_FLASH_LOCK ;
}
}
/* issue 'CLEAR STATUS: SR-5,4,3,1' command */
REG32(pw) = FLASH_CLEAR_STATUS_COMMAND;
/* issue 'READ ARRAY' command */
REG32(pw) = FLASH_READ_COMMAND;
/* check status now, after having set back the flash in read array mode */
if (rcode != OK)
{
break ;
}
/* next block */
pw = (UINT32*)((UINT32)pw + blocksize) ;
}
/* enable write protection again in system flash */
WRITE_DISABLE ;
return( rcode ) ;
}
/************************************************************************
*
* FLASH_STRATA_inquire_flasharea
* Description :
* -------------
* Inquire flash area; i.e. the driver calculates the effective flash
* block area covering the specified memory area.
*
*
* Parameters :
* ------------
*
* 'p_param', IN, variable of type, t_FLASH_ctrl_descriptor.
*
*
* Return values :
* ---------------
*
* 'OK' = 0x00: Area specified inside valid
* FLASH device area
* ERROR_FLASH_INVALID_ADDRESS Address area not inside FLASH
* devices
*
*
************************************************************************/
static
INT32 FLASH_STRATA_inquire_flasharea( t_FLASH_ctrl_descriptor *p_param )
{
UINT32 blocksize, start, end ;
//printf(" FLASH_STRATA_inquire_flasharea: %x, %x\n", p_param->user_physadr, p_param->user_length ) ;
switch (FLASH_STRATA_devicetype(p_param->user_physadr))
{
case FLASH_SYSTEMFLASH_DEVICE:
/* system FLASH */
/* validate upper boundary */
if ( FLASH_STRATA_devicetype( p_param->user_physadr +
p_param->user_length - 1 )
!= FLASH_SYSTEMFLASH_DEVICE )
{
return( ERROR_FLASH_INVALID_ADDRESS ) ;
}
blocksize = systemflash_block_size ;
break ;
case FLASH_FILEFLASH_DEVICE:
/* Reject programming of FILE FLASH */
memset( flash_diag_msg, 0, sizeof(flash_diag_msg) ) ;
sprintf( flash_diag_msg, "Environment FLASH: map = (0x%08x,0x%08x), user = 0x%08x",
(UINT32) fileflash_phys_start,
(UINT32) fileflash_phys_end,
(UINT32) PHYS(p_param->user_physadr) ) ;
return( ERROR_FLASH_FILE_FLASH_PROT ) ;
break ;
case FLASH_MONITORFLASH_DEVICE:
/* Monitor FLASH */
/* validate upper boundary */
if ( FLASH_STRATA_devicetype( p_param->user_physadr +
p_param->user_length - 1 )
!= FLASH_MONITORFLASH_DEVICE )
{
return( ERROR_FLASH_INVALID_ADDRESS ) ;
}
blocksize = monitorflash_block_size ;
break ;
case FLASH_BOOT_DEVICE:
/* Boot device */
memset( flash_diag_msg, 0, sizeof(flash_diag_msg) ) ;
sprintf( flash_diag_msg, "MIPS boot media: map = (0x%08x,0x%08x), user = 0x%08x",
(UINT32) boot_phys_start,
(UINT32) boot_phys_end,
(UINT32) PHYS(p_param->user_physadr) ) ;
return( ERROR_FLASH_BOOT_WRITE_PROTECTED ) ;
break ;
default:
return( ERROR_FLASH_INVALID_ADDRESS ) ;
break ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -