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

📄 davincihd_nandflash_id.c

📁 DM6467 Bootloader源码
💻 C
字号:
/*
 *  Copyright 2007 by Spectrum Digital Incorporated.
 *  All rights reserved. Property of Spectrum Digital Incorporated.
 */

/*
 *  NAND Flash interface
 *
 */

#include "davincihd_nandflash.h"

/*
 *  NAND Organization
 */
extern NAND_ORGANIZATION nand_org;

/* ------------------------------------------------------------------------ *
 *  _NAND_pages                                                             *
 * ------------------------------------------------------------------------ */
Uint32 _NAND_pages( )
{
    return nand_org.pages;
}

/* ------------------------------------------------------------------------ *
 *  _NAND_pagesize                                                          *
 * ------------------------------------------------------------------------ */
Uint32 _NAND_pagesize( )
{
    return nand_org.page_size;
}

/* ------------------------------------------------------------------------ *
 *  _NAND_sparesize                                                         *
 * ------------------------------------------------------------------------ */
Uint32 _NAND_sparesize( )
{
    return nand_org.spare_size;
}

/* ------------------------------------------------------------------------ *
 *  _NAND_pagesperblock                                                     *
 * ------------------------------------------------------------------------ */
Uint32 _NAND_pagesperblock( )
{
    return nand_org.pages_per_block;
}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  _NAND_getId( )                                                          *
 *      Get the ID and specs for the NAND flash                             *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 _NAND_getId( )
{
    Uint32 org;

    NAND_CLE_PTR = CMD_READID;          // Issue Read ID command
    NAND_ALE_PTR = 0;

    nand_org.mfg_id      = NAND_DATA;   // Read MFG Id
    nand_org.dev_id      = NAND_DATA;   // Read Device Id
    nand_org.internal    = NAND_DATA;   // Internal/Reserved
    nand_org.organization= NAND_DATA;   // NAND Setup

    /* EMIFA info */
    nand_org.bus_width          = 8;
    nand_org.access_time        = 255;

    /* NAND page organization */
    nand_org.pages              = 0;
    nand_org.page_size          = 0;
    nand_org.spare_size         = 0;
    nand_org.page_addressing    = 0;
    nand_org.page_addr_incr     = 0;

    /* NAND block organization */
    nand_org.pages_per_block    = 0;
    nand_org.blocks             = 0;
    nand_org.block_size         = 0;
    nand_org.block_addressing   = 0;
    nand_org.block_addr_incr    = 0;

    /* Bad blocks/pages */
    nand_org.invalid_pages      = 0;
    nand_org.invalid_blocks     = 0;

    /* Compared MFG_ID & DEV_ID to the supported devices */

    /* STI */
    if ( nand_org.mfg_id == 0x20 )
    {
        switch( nand_org.dev_id )
        {
            /* NAND512W3A - small page [512/16] */
            case 0x76:
                /* EMIFA info */
                nand_org.bus_width          = 8;
                nand_org.access_time        = 25;

                /* NAND page organization */
                nand_org.pages              = 32 * 4096;
                nand_org.page_size          = 512;
                nand_org.spare_size         = 16;
                nand_org.page_addressing    = PAGE_ADDR_07_916_1724_2526;
                nand_org.page_addr_incr     = 512;

                /* NAND block organization */
                nand_org.pages_per_block    = 32;
                nand_org.blocks             = 4096;
                nand_org.block_size         = 512 * 32;
                nand_org.block_addressing   = BLK_ADDR_9_1724_2526;
                nand_org.block_addr_incr    = 32 * 512;

                /* Command Set */
                nand_org.use_read_confirm   = 0;
                nand_org.use_block_unlock   = 0;

                nand_org.device_size        = nand_org.page_size * nand_org.pages;
                return 0;

            /* NAND01GW3B - large page [2048/64] */
            case 0xf1:
                org = nand_org.organization;

                /* EMIFA info */
                nand_org.bus_width          = ( ( org & 0x40 ) == 0 ) ? 8 : 16;
                nand_org.access_time        = ( ( org & 0x08 ) == 0 ) ? 50 : 30;

                /* NAND page organization */
                nand_org.pages              = 64 * 1024;
                nand_org.page_size          = 1024 << ( org & 0x03 );
                nand_org.spare_size         = ( ( ( org & 0x04 ) == 0 ) ? 8 : 16 ) * ( nand_org.page_size >> 9 );
                nand_org.page_addressing    = PAGE_ADDR_07_811_1219_2027;
                nand_org.page_addr_incr     = 2048 * 2;

                /* NAND block organization */
                nand_org.pages_per_block    = 64;
                nand_org.blocks             = 1024;
                nand_org.block_size         = ( 65536 ) << ( ( org >> 4 ) & 3 );
                nand_org.block_addressing   = BLK_ADDR_1819_2027;
                nand_org.block_addr_incr    = 64 * 2048;

                /* Command Set */
                nand_org.use_read_confirm   = 1;
                nand_org.use_block_unlock   = 1;

                nand_org.device_size        = nand_org.page_size * nand_org.pages;
                return 0;
        }
    }

    return -1;
}


/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  _NAND_getBadPages( pages )                                              *
 *                                                                          *
 *      Get the last invaild pages                                          *
 *                                                                          *
 * ------------------------------------------------------------------------ */
void _NAND_getBadPages( Uint32* pages )
{
    Int16 i;
    for ( i = 0 ; nand_org.invalid_pages ; i++ )
        pages[i] = nand_org.invalid_page_table[i];

    if ( nand_org.invalid_pages == 0 )
        pages[0] = 0;
}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  _NAND_getBadBlocks( blocks )                                            *
 *                                                                          *
 *      Get the last invaild blocks                                         *
 *                                                                          *
 * ------------------------------------------------------------------------ */
void _NAND_getBadBlocks( Uint32* blocks )
{
    Int16 i;
    for ( i = 0 ; nand_org.invalid_blocks ; i++ )
        blocks[i] = nand_org.invalid_block_table[i];

    if ( nand_org.invalid_blocks == 0 )
        blocks[0] = 0;
}

⌨️ 快捷键说明

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