📄 nand_util_func.h
字号:
/*******************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
*******************************************************************************/
/*******************************************************************************
*
* Filename:
* ---------
* nand_util_func.h
*
* Project:
* --------
* FlashTool Download Agent
*
* Description:
* ------------
* NAND flash related utility functions.
*
* Author:
* -------
* Amos Hsu
*
*==============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* $Revision: 1.1 $
* $Modtime: Dec 06 2005 12:21:04 $
* $Log: //mtkvs01/vmdata/new_flash_tool/archives/DA/INC/nand_util_func.h-arc $
*
* Rev 1.1 Dec 29 2005 10:55:36 mtk00539
* 1. [DA] Add pre-process callback function to unlock all the blocks to meet ST NAND flash requirement.
* Resolution for 156: [FlashTool v2.7.1013][BUG FIX] Fix BootROM start command failure while manually selecting NMT6226 or MT6227 baseband chip.
*
* Rev 1.0 Oct 19 2005 14:40:22 mtk00539
* Initial revision.
* Resolution for 140: [BROM_DLL v2.7.1008][New] Support NFB download and many new features.
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*==============================================================================
*******************************************************************************/
#ifndef _NAND_UTIL_FUNC_H_
#define _NAND_UTIL_FUNC_H_
#include "SW_TYPES.H"
#include "DOWNLOAD.H"
#include "nand_dev_tbl.h"
#ifdef __cplusplus
extern "C" {
#endif
#define NUTL_DEFAULT_TIMEOUT 0x00FFFFFF
#define NFI_Wait(condition_expression, timeout) while( (condition_expression) && (--timeout) )
//------------------------------------------------------------------------------
// Device Spec. Reference Macro
//------------------------------------------------------------------------------
#define NUTL_MAKER_CODE(p_nand) (p_nand->m_dev->m_hw_info.m_id.m_maker_code)
#define NUTL_DEVICE_CODE(p_nand) (p_nand->m_dev->m_hw_info.m_id.m_device_code)
#define NUTL_TOTAL_SIZE(p_nand) (p_nand->m_dev->m_hw_info.m_total_size_in_mb<<20)
#define NUTL_BLOCK_SIZE(p_nand) (p_nand->m_block_size)
#define NUTL_PAGE_SIZE(p_nand) (p_nand->m_dev->m_hw_info.m_page_size)
#define NUTL_SPARE_SIZE(p_nand) (p_nand->m_spare_size)
#define NUTL_TOTAL_PAGE_COUNT(p_nand) (p_nand->m_total_pages)
#define NUTL_TOTAL_BLOCK_COUNT(p_nand) (p_nand->m_total_blocks)
#define NUTL_PAGES_PER_BLOCK(p_nand) (p_nand->m_dev->m_hw_info.m_pages_per_block)
#define NUTL_PAGE_ADDR_SHIFT_BITS(p_nand) (p_nand->m_page_addr_shift_bits)
#define NUTL_BLOCK_ADDR_SHIFT_BITS(p_nand) (p_nand->m_block_addr_shift_bits)
#define NUTL_ADDR_CYCLE(p_nand) (p_nand->m_dev->m_hw_info.m_addr_cycle)
#define NUTL_IO_INTERFACE(p_nand) (p_nand->m_dev->m_hw_info.m_io_interface)
#define NUTL_COPYBACK_ADDR_MASK(p_nand) (p_nand->m_dev->m_hw_info.m_copyback_plane_rowaddr_mask)
//------------------------------------------------------------------------------
// Row Address to Block Row Address
//------------------------------------------------------------------------------
#define NUTL_RowAddrToBlockAddr(p_nand, ra) ((ra)/NUTL_PAGES_PER_BLOCK(p_nand)*NUTL_PAGES_PER_BLOCK(p_nand))
#define NUTL_RowAddrToNextBlockAddr(p_nand, ra) (((ra)/NUTL_PAGES_PER_BLOCK(p_nand)+1)*NUTL_PAGES_PER_BLOCK(p_nand))
//------------------------------------------------------------------------------
// Absolute Address to Block Row Address
//------------------------------------------------------------------------------
#define NUTL_AbsAddrToBlockAddr(p_nand, absolute_addr) ((absolute_addr)/NUTL_BLOCK_SIZE(p_nand)*NUTL_PAGES_PER_BLOCK(p_nand))
#define NUTL_AbsAddrToNextBlockAddr(p_nand, absolute_addr) (((absolute_addr)/NUTL_BLOCK_SIZE(p_nand)+1)*NUTL_PAGES_PER_BLOCK(p_nand))
//------------------------------------------------------------------------------
// Callback Function Reference Macro
//------------------------------------------------------------------------------
#define FP_CB_NAND_READ_ID(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_read_id
#define FP_CB_NAND_RESET(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_reset
#define FP_CB_NAND_PRE_PROCESS(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_pre_process
#define FP_CB_NAND_READ_STATUS(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_read_status
#define FP_CB_NAND_BLOCK_ERASE(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_block_erase
#define FP_CB_NAND_BAD_BLOCK_SYMBOL_CHECK(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_bad_block_symbol_check
#define FP_CB_NAND_BAD_BLOCK_SYMBOL_SET(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_bad_block_symbol_set
#define FP_CB_NAND_PAGE_READ(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_page_read
#define FP_CB_NAND_PAGE_PROGRAM(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_page_program
#define FP_CB_NAND_SPARE_READ(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_spare_read
#define FP_CB_NAND_SPARE_PROGRAM(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_spare_program
#define FP_CB_NAND_COPYBACK(p_nand) p_nand->m_dev->m_cb_func_set->m_cb_copyback
#define CB_NAND_READ_ID(p_nand, t, maker, dev, ext1, ext2) FP_CB_NAND_READ_ID(p_nand)(p_nand, t, maker, dev, ext1, ext2)
#define CB_NAND_RESET(p_nand, t) FP_CB_NAND_RESET(p_nand)(p_nand, t)
#define CB_NAND_PRE_PROCESS(p_nand, t) FP_CB_NAND_PRE_PROCESS(p_nand)(p_nand, t)
#define CB_NAND_READ_STATUS(p_nand, t) FP_CB_NAND_READ_STATUS(p_nand)(p_nand, t)
#define CB_NAND_BLOCK_ERASE(p_nand, ra) FP_CB_NAND_BLOCK_ERASE(p_nand)(p_nand, ra)
#define CB_NAND_BAD_BLOCK_SYMBOL_CHECK(p_nand, p_spare) FP_CB_NAND_BAD_BLOCK_SYMBOL_CHECK(p_nand)(p_nand, p_spare)
#define CB_NAND_BAD_BLOCK_SYMBOL_SET(p_nand, p_spare) FP_CB_NAND_BAD_BLOCK_SYMBOL_SET(p_nand)(p_nand, p_spare)
#define CB_NAND_PAGE_READ(p_nand, t, ra, p_data, ecc) FP_CB_NAND_PAGE_READ(p_nand)(p_nand, t, ra, p_data, ecc)
#define CB_NAND_PAGE_PROGRAM(p_nand, t, ra, p_data, ecc) FP_CB_NAND_PAGE_PROGRAM(p_nand)(p_nand, t, ra, p_data, ecc)
#define CB_NAND_SPARE_READ(p_nand, t, ra, p_spare) FP_CB_NAND_SPARE_READ(p_nand)(p_nand, t, ra, p_spare)
#define CB_NAND_SPARE_PROGRAM(p_nand, t, ra, p_spare) FP_CB_NAND_SPARE_PROGRAM(p_nand)(p_nand, t, ra, p_spare)
#define CB_NAND_COPYBACK(p_nand, t, src_ra, dest_ra) FP_CB_NAND_COPYBACK(p_nand)(p_nand, t, src_ra, dest_ra)
//------------------------------------------------------------------------------
// NFI Initialization
//------------------------------------------------------------------------------
STATUS_E NUTL_NFI_Init(uint32 nfi_acccon, bool bEnableCS1);
//------------------------------------------------------------------------------
// NFI Enable Chip Select 1
//------------------------------------------------------------------------------
STATUS_E NUTL_NFI_SelectCS(const NAND_DeviceInfo_S *nand_info, bool bEnableCS1);
//------------------------------------------------------------------------------
// Check Device
//------------------------------------------------------------------------------
STATUS_E NUTL_CheckDevice(NAND_DeviceInfo_S *nand_info);
//------------------------------------------------------------------------------
// Read From NFI FIFO
//------------------------------------------------------------------------------
STATUS_E NUTL_FIFO_Read(
const uint32 c_timeout
,const bool bUsingDMA
,uint32 *p_data32 /* MUST be 32bits alignment addr */
,const uint32 data_len);
//------------------------------------------------------------------------------
// Write To NFI FIFO
//------------------------------------------------------------------------------
STATUS_E NUTL_FIFO_Write(
const uint32 c_timeout
,const bool bUsingDMA
,const uint32 *p_data32 /* MUST be 32bits alignment addr */
,const uint32 data_len);
//------------------------------------------------------------------------------
// Bad Block Check
//------------------------------------------------------------------------------
STATUS_E NUTL_BadBlock_Check(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 row_addr);
//------------------------------------------------------------------------------
// Find Good Block
//------------------------------------------------------------------------------
STATUS_E NUTL_FindGoodBlock(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,uint32 *p_row_addr);
//------------------------------------------------------------------------------
// Block Erase
//------------------------------------------------------------------------------
STATUS_E NUTL_BlockErase(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 row_addr
,NUTL_EraseFlag_E flag);
//------------------------------------------------------------------------------
// Spare Area CheckSum Encode/Decode Related Function
//------------------------------------------------------------------------------
STATUS_E NUTL_SpareCheckSum_Encode(
const NAND_DeviceInfo_S *nand_info
,uint32 *p_spare32 /* MUST be 32bits alignment addr */);
STATUS_E NUTL_SpareCheckSum_Decode(
const NAND_DeviceInfo_S *nand_info
,const uint32 *p_spare32 /* MUST be 32bits alignment addr */);
//------------------------------------------------------------------------------
// Spare Area Compose/Decompose Related Function
//------------------------------------------------------------------------------
STATUS_E NUTL_SpareCompose(
const NAND_DeviceInfo_S *nand_info
,const uint32 ecc_parity_from_reg[4]
,uint32 *p_spare32 /* MUST be 32bits alignment addr */);
STATUS_E NUTL_SpareDecompose(
const NAND_DeviceInfo_S *nand_info
,const uint32 *p_spare32 /* MUST be 32bits alignment addr */
,uint32 ecc_parity_from_spare[4]);
//------------------------------------------------------------------------------
// ECC Correction
//------------------------------------------------------------------------------
STATUS_E NUTL_ECC_Correction(
const NAND_DeviceInfo_S *nand_info
,const uint32 ecc_block_size
,const uint32 ecc_parity_from_reg[4]
,const uint32 ecc_parity_from_spare[4]
,uint32 *p_data32 /* MUST be 32bits alignment addr */);
//------------------------------------------------------------------------------
// Page Read
//------------------------------------------------------------------------------
STATUS_E NUTL_PageRead(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 row_addr
,uint32 *p_data32 /* MUST be 32bits alignment addr */
,uint32 *p_spare32 /* MUST be 32bits alignment addr */
,uint32 ecc_parity_from_reg[4]
,uint32 ecc_parity_from_spare[4]
,NUTL_ReadFlag_E flag);
//------------------------------------------------------------------------------
// Page Program Related Callback Function
//------------------------------------------------------------------------------
STATUS_E NUTL_PageProgram(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 row_addr
,const uint32 *p_data32 /* MUST be 32bits alignment addr */
,uint32 *p_spare32 /* MUST be 32bits alignment addr */
,uint32 ecc_parity_from_reg[4]
,uint32 ecc_parity_from_spare[4]);
//------------------------------------------------------------------------------
// CopyBack
//------------------------------------------------------------------------------
STATUS_E NUTL_CopyBack(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 src_row_addr
,const uint32 dest_row_addr);
//------------------------------------------------------------------------------
// Block Replacement
//------------------------------------------------------------------------------
STATUS_E NUTL_BlockReplacement(
const NAND_DeviceInfo_S *nand_info
,const uint32 c_timeout
,const uint32 src_row_addr /* any row_addr within source block */
,const uint32 dest_row_addr /* any row_addr within destination block */
,const uint32 err_page_index /* page index within block, 1st page index is 0 */
,const uint32 *p_err_page_data32 /* MUST be 32bits alignment addr */);
//------------------------------------------------------------------------------
// Range Validation
//------------------------------------------------------------------------------
STATUS_E NUTL_CheckRange(
const NAND_DeviceInfo_S *nand_info
,const uint32 absolute_addr
,const uint32 length);
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -