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

📄 flash_strata.c

📁 MIPS下的boottloader yamon 的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        systemflash_phys_start = 0 ;
    }
    systemflash_phys_start = PHYS(systemflash_phys_start) ;
    //printf("system flash at %08x\n",systemflash_phys_start);

    /* get size for system flash  */
    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_SIZE_ID,
                         &systemflash_phys_end,
                         sizeof(systemflash_phys_end) ) ;
    if (rcode != OK)
    {
        systemflash_phys_end = 0 ;
    }
    systemflash_phys_end = systemflash_phys_start + systemflash_phys_end ;
    //printf("system flash end at %08x\n",systemflash_phys_end);


    /* MONITOR FLASH: */
    /* get base for monitor flash  */
    rcode = SYSCON_read( SYSCON_BOARD_MONITORFLASH_BASE_ID,
                         &monitorflash_phys_start,
                         sizeof(monitorflash_phys_start) ) ;
    if (rcode != OK)
    {
        monitorflash_phys_start = 0 ;
    }
    monitorflash_phys_start = PHYS(monitorflash_phys_start) ;
    //printf("monitor flash at %08x\n",monitorflash_phys_start);

    /* get size for monitor flash  */
    rcode = SYSCON_read( SYSCON_BOARD_MONITORFLASH_SIZE_ID,
                         &monitorflash_phys_end,
                         sizeof(monitorflash_phys_end) ) ;
    if (rcode != OK)
    {
        monitorflash_phys_end = 0 ;
    }
    monitorflash_phys_end = monitorflash_phys_start + monitorflash_phys_end ;
    //printf("system flash end at %08x\n",monitorflash_phys_end);

    /* FILE FLASH: */
    /* get base for file flash  */
    rcode = SYSCON_read( SYSCON_BOARD_FILEFLASH_BASE_ID,
                         &fileflash_phys_start,
                         sizeof(fileflash_phys_start) ) ;
    if (rcode != OK)
    {
        fileflash_phys_start = 0 ;
    }
    fileflash_phys_start = PHYS(fileflash_phys_start) ;
    //printf("file flash at %08x\n",fileflash_phys_end);

    /* get size for file flash  */
    rcode = SYSCON_read( SYSCON_BOARD_FILEFLASH_SIZE_ID,
                         &fileflash_phys_end,
                         sizeof(fileflash_phys_end) ) ;
    if (rcode != OK)
    {
        fileflash_phys_end = 0 ;
    }
    fileflash_phys_end = fileflash_phys_start + fileflash_phys_end ;
    //printf("file flash end at %08x\n",fileflash_phys_end);

    if (p_param != NULL) 
    {
        /*  Hack that may be used e.g. for test of monitor flash.
	 *  Not used by YAMON.
	 */
        fileflash_phys_start = monitorflash_phys_start;
        monitorflash_phys_start = 0xffffffff;
    }

    /* get system flash sector size */
    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_SECTORSIZE_ID,
                         &systemflash_block_size,
                         sizeof(systemflash_block_size) ) ;
    systemflash_block_size = 2 * systemflash_block_size ;
    if (rcode != OK)
    {
        systemflash_block_size = 0 ;
    }

    /* get monitor flash sector size */
    rcode = SYSCON_read( SYSCON_BOARD_MONITORFLASH_SECTORSIZE_ID,
                         &monitorflash_block_size,
                         sizeof(monitorflash_block_size) ) ;
    monitorflash_block_size = 2 * monitorflash_block_size ;
    if (rcode != OK)
    {
        monitorflash_block_size = 0 ;
    }

    /* get file flash sector size */
    rcode = SYSCON_read( SYSCON_BOARD_FILEFLASH_SECTORSIZE_ID,
                         &fileflash_block_size,
                         sizeof(fileflash_block_size) ) ;
    fileflash_block_size = 2 * fileflash_block_size ;
    if (rcode != OK)
    {
        fileflash_block_size = 0 ;
    }

    /* get system flash bank count */
    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_BANKCOUNT_ID,
                         &systemflash_bank_count,
                         sizeof(systemflash_bank_count) ) ;
    if (rcode != OK)
    {
        systemflash_bank_count = 0 ;
    }

    /* get system flash block count */
    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_BLOCKCOUNT_ID,
                         &systemflash_block_count,
                         sizeof(systemflash_block_count) ) ;
    if (rcode != OK)
    {
        systemflash_block_count = 0 ;
    }
    return( OK ) ;
}


/************************************************************************
 *
 *                          FLASH_STRATA_write
 *  Description :
 *  -------------
 *  This service writes data into a specified address location, which
 *  can be in either SYSTEM-FLASH or FILE-FLASH space. Default is RAM.
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    minor device number for multi device drivers
 *  'p_param',   IN,    variable of type, t_FLASH_write_descriptor.
 *
 *
 *  Return values :
 *  ---------------
 *
 * 'OK' = 0x00:                         data has been stored
 *  ERROR_FLASH_PROGRAM_ERROR           Flash device failure
 *  ERROR_FLASH_INVALID_ADDRESS,        Physical address not impl.    
 *
 *
 ************************************************************************/
static
INT32 FLASH_STRATA_write(
          UINT32 major,          /* IN: major device number             */
          UINT32 minor,          /* IN: minor device number             */
          t_FLASH_write_descriptor *p_param )   /* IN: write data       */
{
    int rcode = OK ;

    /* set to default */
    flash_diag_msg[0] = 0 ;

    switch (FLASH_STRATA_devicetype(PHYS(p_param->adr)))
    {
        case FLASH_SYSTEMFLASH_DEVICE:
            /* program system FLASH */
            if ( FLASH_STRATA_is_system_flash_write_protected() )
            {
                rcode = ERROR_FLASH_WRITE_PROTECTED ;
            }
            else
            {
                WRITE_ENABLE ;
                rcode = FLASH_STRATA_program_flash( p_param ) ;

                /* set system flash banks in read array mode */
                FLASH_STRATA_set_systemflash_read();   
                WRITE_DISABLE ;
            }
          break ;

        case FLASH_FILEFLASH_DEVICE:
            /* Reject user to program 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->adr) ) ; 
            rcode = ERROR_FLASH_FILE_FLASH_PROT ;
          break ;

        case FLASH_MONITORFLASH_DEVICE:
            /* program monitor FLASH */
            rcode = FLASH_STRATA_program_flash( p_param ) ;

            /* set monitor flash in read array mode */
            FLASH_STRATA_set_monitorflash_read();   
          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->adr) ) ;
            rcode = ERROR_FLASH_BOOT_WRITE_PROTECTED ;
          break ;

        default:
            /* program any RAM */
            rcode = FLASH_STRATA_program_systemram( p_param ) ;
          break ;
    }
    flash_last_error = rcode ;
    return( rcode ) ;
}


/************************************************************************
 *
 *                          FLASH_STRATA_ctrl
 *  Description :
 *  -------------
 *  This service comprise following specific FLASH services:
 *    1) 'ERASE_SYSTEMFLASH'
 *    2) 'ERASE_FILEFLASH'
 *    3) 'FLASH_CTRL_ERASE_FLASH_AREA'
 *    4) 'FLASH_CTRL_INQUIRE_FLASH_AREA'
 *    5) 'FLASH_CTRL_TEST_SYSTEMFLASH'
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    minor device number for multi device drivers
 *  'p_param',   IN,    variable of type, t_FLASH_ctrl_descriptor.
 *
 *
 *  Return values :
 *  ---------------
 *
 * 'OK' = 0x00:                         FLASH service completed successfully
 *  ERROR_FLASH_PROGRAM_ERROR           Flash device failure
 *
 *
 ************************************************************************/
static
INT32 FLASH_STRATA_ctrl(
          UINT32 major,          /* IN: major device number             */
          UINT32 minor,          /* IN: minor device number             */
          t_FLASH_ctrl_descriptor *p_param )    /* IN: write data       */
{
    int                      rcode = OK ;

    /* set to default */
    flash_diag_msg[0] = 0 ;

    switch(p_param->command)
    {
        case FLASH_CTRL_ERASE_SYSTEMFLASH: 
            if ( FLASH_STRATA_is_system_flash_write_protected() )
            {
                rcode = ERROR_FLASH_WRITE_PROTECTED ;
            }
            else
            {
                rcode = FLASH_STRATA_erase_systemflash() ;
            }
          break ;
 
        case FLASH_CTRL_ERASE_FILEFLASH:
            rcode = FLASH_STRATA_erase_fileflash() ;
          break ;

        case FLASH_CTRL_ERASE_FLASH_AREA:
            rcode = FLASH_STRATA_erase_flasharea(p_param) ;
          break ;

        case FLASH_CTRL_INQUIRE_FLASH_AREA:
            rcode = FLASH_STRATA_inquire_flasharea(p_param) ;
          break ;

        case FLASH_CTRL_TEST_SYSTEMFLASH:
            rcode = FLASH_STRATA_test_systemflash() ;
            if (rcode == OK)
            {
                rcode = FLASH_STRATA_test_fileflash() ;
            }
          break ;

        case FLASH_CTRL_WRITE_FILEFLASH:
            /* program file FLASH */
            rcode = FLASH_STRATA_program_flash( p_param->wr_param ) ;
            if (rcode ==  ERROR_FLASH_LOCKED)
            {
                if ( FLASH_STRATA_is_file_flash_write_protected() )
                {
                    rcode = ERROR_FLASH_FILE_FLASH_LOCK ;
                }
            }


            /* set file flash in read array mode */
            FLASH_STRATA_set_fileflash_read();
          break ;

        case FLASH_CTRL_TEST_MONITORFLASH:
            rcode = FLASH_STRATA_test_monitorflash() ;
          break ;

        default:
            rcode = ERROR_FLASH_INVALID_COMMAND ;
          break ;
    }
    flash_last_error = rcode ;
    return( rcode ) ;
}


/************************************************************************
 *      Local helper functions
 ************************************************************************/

/************************************************************************
 *
 *                          FLASH_STRATA_devicetype
 *  Description :
 *  -------------
 *  Derive the memory device type from 'physical address'
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'physadr': physical address inside a 512 MByte space
 *
 *
 *  Return values :
 *  ---------------
 *
 *  t_flash_device_id:    memory device type detected.
 *
 *
 ************************************************************************/
static
t_flash_device_id FLASH_STRATA_devicetype( UINT32 physadr )
{
    /* check for system FLASH */
    if ((systemflash_phys_start <= physadr) && (physadr < systemflash_phys_end))
    {
        return(FLASH_SYSTEMFLASH_DEVICE) ;
    }

    /* check for monitor FLASH */
    if ((monitorflash_phys_start <= physadr) && (physadr < monitorflash_phys_end))
    {
        return(FLASH_MONITORFLASH_DEVICE) ;
    }

    /* check for file FLASH */
    if ((fileflash_phys_start <= physadr) && (physadr < fileflash_phys_end))
    {
        return(FLASH_FILEFLASH_DEVICE) ;
    }

    /* check for BOOT */
    if (( boot_phys_start <= physadr) && (physadr < boot_phys_end ))
    {
        return(FLASH_BOOT_DEVICE) ;
    }

    /* device not known */
    return(FLASH_UNKNOWN_DEVICE) ;
}


/************************************************************************
 *
 *                          FLASH_STRATA_program_systemram
 *  Description :
 *  -------------
 *  Programs (store data) in the system RAM device.
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'p_param',   IN,    variable of type, t_FLASH_write_descriptor.
 *
 *
 *  Return values :
 *  ---------------
 *
 * 'OK' = 0x00:             Data stored in system RAM
 *
 *
 ************************************************************************/
static
INT32 FLASH_STRATA_program_systemram( t_FLASH_write_descriptor *p_param )
{
    int i, len ;
    UINT8 *psrc ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -