📄 nand_mtd.h
字号:
/* 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 + -