📄 davincihd_nandflash_write.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 + -