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

📄 davincihd_nandflash_write.c

📁 用于dm6467 开发平台的uboot源码
💻 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;

extern Int32 nand_rw_timeout;
/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  _NAND_write8( tx, store_spare, use_ecc )                                *
 *      Read a page from NAND                                               *
 *                                                                          *
 *      Inputs:                                                             *
 *          rx          = address of rx buffer [ any address ]              *
 *          use_ecc     = use ECC?                                          *
 *                                                                          *
 *      Return:                                                             *
 *          =0  pass                                                        *
 *          >0  failed - bad pages                                          *
 *          -1  timeout                                                     *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Uint32 _NAND_write8( Uint32 tx, Uint32 use_ecc )
{
    Int16 i;
    volatile Uint8* tx8 = ( volatile Uint8* )tx;

    /* Spare + ECC */
    Uint32 computed_ecc;

    /* Start ECC */
    if ( use_ecc )
        _NAND_startECC( );

    /* Write MAIN array */
    i = nand_org.page_size;
    while ( i-- )
        NAND_DATA = *tx8++;

    /* Compute ECC */
    i = nand_org.spare_size;
    if ( use_ecc )
    {
        computed_ecc = _NAND_readECC( );
        computed_ecc &= 0x0FFF0FFF;

        NAND_DATA = ( computed_ecc >> 24 );
        NAND_DATA = ( computed_ecc >> 16 );
        NAND_DATA = ( computed_ecc >> 8 );
        NAND_DATA = ( computed_ecc );

        i -= 4;
    }

    /* Write Spare array */
    while ( i-- );
        NAND_DATA = 0xFF;

    return 0;
}

/* ------------------------------------------------------------------------ *
 *                                                                          *
 *  _NAND_writePage( tx, start_page, page_count )                           *
 *                                                                          *
 *      Program NAND Flash.                                                 *
 *          tx         = address of tx buffer                               *
 *          start_page = start page                                         *
 *          page_count = # of pages                                         *
 *                                                                          *
 *      Returns:    0   pass                                                *
 *                  1+  failed - bad pages                                  *
 *                 -1   timeout                                             *
 *                                                                          *
 * ------------------------------------------------------------------------ */
Int16 _NAND_writePage( Uint32 tx, Uint32 start_page, Uint32 page_count )
{
    Uint32 i;
    Uint32 page_addr;
    Uint32 retcode = 0;

    for ( i = start_page ; i < start_page + page_count ; i++ )
    {
        /* Fix for large page addressing */
        page_addr = i * nand_org.page_addr_incr;

        /* Write a single page */
        _NAND_CMD( CMD_PROGRAM );
        _NAND_PAGE_ADDR( page_addr );

        /* Write page in 8 bit mode */
        if ( nand_org.bus_width == 8 )
            _NAND_write8( tx, 0 );

        /* Confirm Program */
        _NAND_CMD( CMD_PROGRAM_CONFIRM );

		_waitusec( 500 );

        if ( _NAND_busywait( nand_rw_timeout ) )
            return NAND_ERR_TIMEOUT;

        /* Check Status */
        _NAND_CMD( CMD_STATUS );
        if ( NAND_DATA & CMD_STATUS_ERROR )
        {
            retcode++;
            nand_org.invalid_page_table[nand_org.invalid_pages++] = i;
        }
    }

    return retcode;
}

⌨️ 快捷键说明

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