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