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

📄 nand_util_func.h

📁 MTK手机平台下载工具FLASHTOOL驱动源码
💻 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 + -