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

📄 flash_strata.c

📁 MIPS YAMON, a famous monitor inc. source, make file and PDF manuals.
💻 C
📖 第 1 页 / 共 5 页
字号:
 * * *  Return values : *  --------------- * *  'OK'(=0) * * * ************************************************************************/staticINT32 FLASH_STRATA_init(          UINT32 major,          /* IN: major device number             */          UINT32 minor,          /* IN: minor device number             */          void   *p_param )      /* INOUT: device parameter block       */{    int rcode ;    /* initialize system profile: FLASH, address boundaries */    /* MIPS BOOT: */    boot_phys_start = MIPS_RESET_VECTOR ;    boot_phys_end   = 0x20000000 ; /* TBD: This size may change for future                                           board support packages       */    /* SYSTEM FLASH: */    /* get base for system flash  */    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_BASE_ID,                         &systemflash_phys_start,                         sizeof(systemflash_phys_start) ) ;    if (rcode != OK)    {        systemflash_phys_start = 0 ;    }    systemflash_phys_start = PHYS(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 ;    /* 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) ;    /* 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 ;    /* 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) ;    /* 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 ;    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.     * * ************************************************************************/staticINT32 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 * * ************************************************************************/staticINT32 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:             {                rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_BASE_ID,                                     (void *)&(p_param->user_physadr),                                     sizeof(UINT32) ) ;                if (rcode == OK)                {                    rcode = SYSCON_read( SYSCON_BOARD_SYSTEMFLASH_SIZE_ID,                                         (void *)&(p_param->user_length),                                         sizeof(UINT32) ) ;                }                if (rcode == OK)                {                    rcode = FLASH_STRATA_erase_flasharea(p_param) ;                }            }          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. * * ************************************************************************/statict_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 * * ************************************************************************/staticINT32 FLASH_STRATA_program_systemram( t_FLASH_write_descriptor *p_param ){

⌨️ 快捷键说明

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