⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_strata.c

📁 MIPS下的boottloader yamon 的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        {
            /* 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 + -