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

📄 nand_mtd.h

📁 MTK平台绝密核心代码之 系统驱动
💻 H
📖 第 1 页 / 共 2 页
字号:

/* NFI_CON */
#define BYTE_RW_EN				0x8000
#define READ_CON_EN				0x0400
#define PROGRAM_CON_EN			0X0200
#define ERASE_CON_EN				0X0100
#define SW_PROGSPARE_EN    	0x0020
#define MULTI_PAGE_RD_EN   	0x0010
#define AUTOECC_ENC_EN     	0x0008
#define AUTOECC_DEC_EN     	0x0004
#define DMA_WR_EN          	0x0002
#define DMA_RD_EN          	0x0001


/* Status register */
#define RDY_BUSY           	0x40
#define PASS_FAIL          	0x01


#define IS_NFI_DMA_RUN 	 *(volatile kal_uint32 *)DMA_GLBSTA & (kal_uint32)DMA_GLBSTA_RUN(nfi_dmaport)

/* NFI_INTR_EN */
#define RD_COMPLETE_EN     	0x01
#define WR_COMPLETE_EN     	0x02
#define RESET_COMPLETE_EN  	0x04
#define ERASE_COMPLETE_EN  	0x08
#define ERR_DET_EN         	0x10
#define ERR_COR_EN         	0x20
#define BUSY_RETURN_EN     	0x40
#define ALL_EN             	0x7F


/* NFI_INTR */
#define RD_COMPLETE        0x0001
#define WR_COMPLETE        0x0002
#define RESET_COMPLETE     0x0004
#define ERASE_COMPLETE     0x0008
#define ERR_DET0           0x0010
#define ERR_DET1           0x0020
#define ERR_DET2           0x0040
#define ERR_DET3           0x0080
#define ERR_COR0           0x0100
#define ERR_COR1           0x0200
#define ERR_COR2           0x0400
#define ERR_COR3           0x0800
#define BUSY_RETURN        0x1000



/*******************************************************************************
 * Dual NAND declaration
 *******************************************************************************/
typedef struct
{
	int     (* ProgramPage)    (void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
	int     (* ReadPage)       (void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
	int     (* ProgramSpare)   (void * DriveData, DWORD PageIndex, BYTE * Data);
	int     (* ReadSpare)      (void * DriveData, DWORD PageIndex, BYTE * Data);
	int     (* CopyPage)       (void * DriveData, DWORD SrcPageIndex, DWORD DestPageIndex);
	int     (* CopyPermitted)  (void * DriveData, DWORD SrcPageIndex, DWORD DestPageIndex);
} NAND_MTD_SUB_DRIVER;


typedef struct drive_data_tag
{
   DWORD	         base_page;
   BYTE                  address_cycle;	 	// 3, 4, or 5
   BYTE		         io_width;			// 8 or 16 bits
   kal_uint32            page_size;      // in bytes
   kal_uint32            pages_per_block;//
   kal_uint32            plane_mask;     // identify whether two blocks are in the same plane/district
   NAND_MTD_SUB_DRIVER * sub_driver;
}  NAND_MTD_SUB_DRIVER_DATA;



// define NFI CS0/1 DIR, DOUT, CON
#if ( (defined(MT6218B)) )
#define NFI_CS_DIR		((volatile UINT16P)(0x80120010))		// GPIO 30 as NFI CS0
#define NFI_CS_DOUT		((volatile UINT16P)(0x801200A0))
#elif ( (defined(MT6219)) )
#define NFI_CS_DIR		((volatile UINT16P)(0x80120010))		// GPIO 30 as NFI CS0
#define NFI_CS_DOUT		((volatile UINT16P)(0x801200D0))
#endif



#if ( (defined(MT6218B)) || (defined(MT6219)))
#define INITIALIZE_NFI_DIR_DOUT \
{\
	*NFI_CS_DIR |= 0x4100;\
	*NFI_CS_DOUT |= 0x4100;\
}

// set GPIO 30 as NFI CS0
#define SET_NFI_CS0 \


// set GPIO 30 as GPIO and GPIO 24 DOUT=0
#define SET_NFI_CS1 \
{\
	*NFI_GPIO_CON &= 0xCFFF;\
	*NFI_CS_DOUT &= 0xFEFF;\
}

// set GPIO 24 DOUT=1
#define SET_NFI_CS1_END \
{\
   *NFI_GPIO_CON |= 0x1000;\
	*NFI_CS_DOUT |= 0x0100;\
}
#else		// MT6217 , MT6226, MT6226M, MT6227, MT6228, MT6229
#define INITIALIZE_NFI_DIR_DOUT 

#define SET_NFI_CS0 \
	*NFI_CSEL = 0;

#define SET_NFI_CS1 \
	*NFI_CSEL = 1;

#define SET_NFI_CS1_END 

#endif



/*******************************************************************************
 * structure definition for flash supply list and MTD
 *******************************************************************************/
typedef struct flash_list_tag
{
   WORD     id;
   WORD     plane_size;      	// in MB
   WORD     block_size;      	// in KB
   WORD     page_size;       	// in B
   BYTE     address_cycle;	 	// 3, 4, or 5
   BYTE	    io_width;			 // 8 or 16 bits
   DWORD    plane_mask;       // identify whether two blocks are in the same plane/district
   NAND_MTD_SUB_DRIVER * sub_driver;
}  flash_list;


/*******************************************************************************/
typedef struct
{
	int     (* MountDevice)    (void * DriveData);
	int     (* ShutDown)       (void * DriveData);
	int     (* EraseBlock)     (void * DriveData, DWORD BlockIndex);
	int     (* ProgramPage)    (void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
	int     (* ReadPage)       (void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
	int     (* ProgramSpare)   (void * DriveData, DWORD PageIndex, BYTE * Data);
	int     (* ReadSpare)      (void * DriveData, DWORD PageIndex, BYTE * Data);
	int     (* CopyPage)       (void * DriveData, DWORD SrcPageIndex, DWORD DestPageIndex);
} NAND_MTD_DRIVER;



/*******************************************************************************
 *  Macro definition
 *******************************************************************************/
#define NOT_WAIT_NFI_DONE(a)  \
{\
   kal_uint16 dida = 0;\
   while(a)\
      if(dida++ > 0xFFF0) return 0;\
}

/*******************************************************************************
 *  MTD function declaration
 *******************************************************************************/
int MTD_MountDevice	(void * DriveData);
int MTD_ShutDown	(void * DriveData);
int MTD_EraseBlock	(void * DriveData, DWORD BlockIndex);


/*******************************************************************************
 *  Sub-function declaration
 *******************************************************************************/
int ProgramPage_512(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_512(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_512(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_512(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ProgramPage_2K(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_2K(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_2K(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_2K(void * DriveData, DWORD PagesIndex, BYTE * Data);

int ProgramPage_512_default(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_512_default(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_512_default(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_512_default(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ProgramPage_2K_default(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_2K_default(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_2K_default(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_2K_default(void * DriveData, DWORD PagesIndex, BYTE * Data);
int CopyPage_2K(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPage_2K_default(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPermitted_default(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPage_2K_Toshiba(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPage_512_Samsung(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPermitted_Samsung(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);
int CopyPage_via_MCU(void * DriveData, DWORD SrcPageIndex, DWORD DestPageIndex);
int CopyPage_2K_test(void * DriveData, DWORD SrcPagesIndex, DWORD DestPageIndex);


int ProgramPage_512_specific(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_512_specific(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_512_specific(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_512_specific(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ProgramPage_2K_specific(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag);
int ReadPage_2K_specific(void * DriveData, DWORD PageIndex, BYTE * Data, BYTE * Spare, BYTE SpareFlag, BYTE ECCFlag);
int ProgramSpare_2K_specific(void * DriveData, DWORD PagesIndex, BYTE * Data);
int ReadSpare_2K_specific(void * DriveData, DWORD PagesIndex, BYTE * Data);


void writefifo_512(kal_uint32* data, kal_uint32 * spare, BYTE ECC_flag, kal_uint32 length);
void writefifo_2K(kal_uint32* data, kal_uint32 * spare, BYTE ECC_flag, kal_uint32 length);
void readfifo_512(kal_uint32* data, kal_uint32* spare, BYTE ECC_flag, kal_uint32 length);
void readfifo_2K(kal_uint32* data, kal_uint32* spare, BYTE ECC_flag, kal_uint32 length);
void cmd_resetpointer(void);
void cmd_sparepointer(void);
kal_uint8 read_status(void);
kal_uint8 read_cp_status(void);
kal_int32 InitializeMTD(void * DriveData);
kal_int32 InitializeMTDData(void * DriveData);
void nfi_lisr(void);
void nfi_hisr(void);
void NFI_DMA_Callback(void);
void pdn_nfi(kal_bool ON);




/******************************************************************************
 * SuperAND flash device definition                                           *
 ******************************************************************************/
#define SUPERAND_PAGE_READ_CMD  0x00    /* Can be recognized by NFI */
#define SUPERAND_SEQ_READ_CMD   0x0F    /* Can't be recognized by NFI */
#define SUPERAND_READ_END_CMD   0xF0    /* Can't be recognized by NFI */
#define SUPERAND_REWRITE_CMD    0x1F    /* Can't be recognized by NFI */
#define SUPERAND_PROG_CMD       0x10    /* Can be recognized by NFI */

#define SUPERAND_ADDR_CYCLE     0x04
#define SUPERAND_BYTES_PER_SECTOR   (SUPERAND_PAGES_PER_SECTOR << 9)
#define SUPERAND_PAGES_PER_SECTOR   0x04
#define SUPERAND_SECTOR_MASK    (SUPERAND_PAGES_PER_SECTOR - 1)
#define SUPERAND_PAGES_PER_EXT_SECTOR   0x08
#define SUPERAND_EXT_SSECTOR_MASK    (SUPERAND_PAGES_PER_EXT_SECTOR - 1)


#define SUPERAND_PAGEFMT_8BIT   0x0005
#define SUPERAND_PAGEFMT_16BIT  0x0105

#define SUPERAND_ACCCON         0x07FF

#define PAGES2BYTES(pages)      ((pages) << 9)
#define PAGES2DWORDS(pages)     ((pages) << 7)

#define MAX_DEVICE_NUM          2

typedef struct
{
   WORD     id;
   WORD     plane_size;      // in MBytes
   WORD     block_size;      // in KBytes
   BYTE		io_width;		 // 8 or 16 bits
}  superand_flash_list;
#define SUPERAND_FLASH_LIST_END {0xFFFF, 0, 0, 0}

typedef struct
{
	int     (* MountDevice)    (void * DriveData);
	int     (* ShutDown)       (void * DriveData);
	int     (* ReadPages)      (void * DriveData, DWORD PageIndex, DWORD Pages, BYTE * Data);
	int     (* RewritePages)   (void * DriveData, DWORD PageIndex, DWORD Pages, BYTE * Data);
	int     (* ProgramData)    (void * DriveData, DWORD PageIndex, DWORD Bytes, BYTE * Data);
	int     (* EraseBlock)     (void * DriveData, DWORD PageIndex);
	int     (* ReadGoodBlkCnt) (void * DriveData);
} SuperAND_MTD_DRIVER;

#if (defined(MT6218B) || defined(MT6219))
#define COMPUTE_ADDRESS_AND_SET_CSEL \
{\
    DWORD page_idx = PageIndex;\
    WORD *paddr = (WORD*)&addr;\
    paddr[0] = (D->io_width == 8) ? (WORD)((page_idx&0x3) << 9) : (WORD)((page_idx&0x3) << 8);\
    paddr[1] = page_idx >> 2;\
}
#else
#define COMPUTE_ADDRESS_AND_SET_CSEL \
{\
    DWORD page_idx = PageIndex;\
    WORD *paddr = (WORD*)&addr;\
    if(page_idx >= D->pages_of_first_device)\
    {\
        *NFI_CSEL = 0x1;\
        page_idx -= D->pages_of_first_device;\
    }else{\
        *NFI_CSEL = 0x0;\
    }\
    paddr[0] = (D->io_width == 8) ? (WORD)((page_idx&0x3) << 9) : (WORD)((page_idx&0x3) << 8);\
    paddr[1] = page_idx >> 2;\
}
#endif

void SuperAND_MTD_Init(void);
int SuperAND_MTD_MountDevice(void * DriveData);
int SuperAND_MTD_ShutDown(void * DriveData);
int SuperAND_MTD_ReadPages(void * DriveData, DWORD PageIndex, DWORD Pages, BYTE * Data);
int SuperAND_MTD_RewritePages(void * DriveData, DWORD PageIndex, DWORD Pages, BYTE * Data);
int SuperAND_MTD_ProgramData(void * DriveData, DWORD PageIndex, DWORD Bytes, BYTE * Data);
int SuperAND_MTD_EraseBlock(void * DriveData, DWORD PageIndex);
int SuperAND_MTD_ReadGoodBlkCnt(void * DriveData);

kal_uint16 superand_read_device_id(kal_uint16 csel);
kal_bool superand_checkdevice(void * DriveData);
kal_int32 superand_writefifo(void * DriveData, DWORD PageIndex, BYTE * Data, DWORD Bytes, kal_bool rewrite);
void superand_readfifo(BYTE * Data, DWORD Pages);
kal_uint8 superand_read_status(void);


extern DWORD custom_part_secs;

#endif


⌨️ 快捷键说明

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