/********************************************************************************
*********************************************************************************
COPYRIGHT (c) 2004 BY ROCK-CHIP FUZHOU
-- ALL RIGHTS RESERVED --
File Name: flash.h
Author: XUESHAN LIN
Created: 1st Dec 2008
Modified:
Revision: 1.00
********************************************************************************
********************************************************************************/
#ifndef _FLASH_H
#define _FLASH_H
//1¿ÉÅäÖòÎÊý
#define DUAL_PLANE //¶¨ÒåÊÇ·ñʹÄÜDUAL PLANE
//#define INTERLEAVE //¶¨ÒåÊÇ·ñʹÄÜInterleave
#define MAX_FLASH_NUM 4 /*×î´óÖ§³ÖµÄFLASHÊý*/
#define MAX_REFLESH_LOG 10 //¶¨ÒåÐèÒª¸üеĵØÖ·¼Ç¼Êý
#define DATA_LEN (8192*2/4) //Êý¾Ý¿éµ¥Î»word
#define SPARE_LEN (256*2/4) //УÑéÊý¾Ý³¤¶È
#define PAGE_SIZE (DATA_LEN+SPARE_LEN) //ÿ¸öÊý¾Ýµ¥Î»µÄ³¤¶È
#define CHIP_SIGN 0x37324B52 //RK28 0x37324B52
/*******************************************************************
ºê³£Êý¶¨Òå
*******************************************************************/
/*******************************************************************
³§ÉÌID±àÂë
*******************************************************************/
#define SAMSUNG 0x00 //ÈýÐÇSAMSUNG
#define TOSHIBA 0x01 //¶«Ö¥TOSHIBA
#define HYNIX 0x02 //º£Á¦Ê¿HYNIX
#define INFINEON 0x03 //Ó¢·ÉÁèINFINEON
#define MICRON 0x04 //ÃÀ¹âMICRON
#define RENESAS 0x05 //ÈðÈøRENESAS
#define ST 0x06 //Òâ·¨°ëµ¼ÌåST
#define INTEL 0x07 //Ó¢Ìضûintel
/*******************************************************************
Æ÷¼þID±àÂë
*******************************************************************/
#define Small64M 0x00
#define Small128M 0x01
#define Large128M 0x02
#define Large256M 0x03
#define Large512M 0x04
#define Large1G 0x05
#define Large2G 0x06
/*******************************************************************
FLASHͨ¹ý²Ù×÷ÃüÁ(ÈýÐÇ)
*******************************************************************/
#define RESET_CMD 0xff
#define READ_ID_CMD 0x90
#define READ_UNIQUE_ID_CMD 0xed
#define READ_STATUS_CMD 0x70
#define READ_STATUS_CMD_TOSHIBA 0x71
#define READ_STATUS_CMD_MICRON 0x78
#define CHIP1_STATUS_CMD 0xf1
#define CHIP2_STATUS_CMD 0xf2
#define PAGE_PROG_CMD 0x8010
#define PLANE2_PAGE_PROG_CMD 0x8111
#define INTERLEAVE_PROG_CMD 0x8080
#define BLOCK_ERASE_CMD 0x60d0
/*******************************************************************
LARGE PAGE FLASH²Ù×÷ÃüÁ(ÈýÐÇ)
*******************************************************************/
#define READ_CMD 0x0030
#define DUALPLANE_READ_CMD 0x6030
#define READ_COPY_CMD 0x0035
#define CACHE_PROG_CMD 0x8015
#define COPY_PROG_CMD 0x8510
#define RAND_DATAIN_CMD 0x85
#define RAND_DATAOUT_CMD 0x05e0
#define PLANE1_DATAOUT_CMD 0x06e0
/*******************************************************************
SMALL PAGE FLASH²Ù×÷ÃüÁ(ÈýÐÇ)
*******************************************************************/
#define READ0_CMD 0x00
#define READ1_CMD 0x01
#define READ_SPARE_CMD 0x50
#define SMALL_COPY_PROG_CMD 0x8A10
//BCHCTL¼Ä´æÆ÷
#define BCH_WR 0x0002
#define BCH_RST 0x0001
//FLCTL¼Ä´æÆ÷
#define FL_RDY 0x1000
#define FL_COR_EN 0x0800
#define FL_INT_EN 0x0400
#define FL_XFER_EN 0x0200
#define FL_INTCLR_EN 0x0100
#define FL_START 0x0004
#define FL_WR 0x0002
#define FL_RST 0x0001
#define FLASH_PROTECT_ON() //write_XDATA32(FMCTL, ReadNandReg(FMCTL) & (~0x10))
#define FLASH_PROTECT_OFF() //write_XDATA32(FMCTL, ReadNandReg(FMCTL) | 0x10)
/*******************************************************************
FLASH¶Áд½Ó¿Ú
*******************************************************************/
//1½á¹¹¶¨Òå
//chip interface reg
typedef volatile struct tagCHIP_IF
{
uint32 data;
uint32 addr;
uint32 cmd;
uint32 RESERVED[0x7d];
}CHIP_IF, *pCHIP_IF;
//NANDC Registers
typedef volatile struct tagNANDC
{
uint32 FMCTL;
uint32 FMWAIT;
uint32 FLCTL;
uint32 BCHCTL;
uint32 RESERVED1[(0xd0-0x10)/4];
uint32 BCHST;
uint32 RESERVED2[(0x200-0xd4)/4];
CHIP_IF chip[4];
uint32 buf[0x800/4];
uint32 spare[0x80/4];
} NANDC, *pNANDC;
typedef struct tagFLASH_SPEC
{
uint8 EccBits; //ECC±ÈÌØÊý
uint8 CacheProg; //ÊÇ·ñÖ§³Öcache program
uint8 MulPlane; //ÊÇ·ñÖ§³ÖMultiPlane
uint8 Interleave; //ÊÇ·ñÖ§³ÖInterleave
uint8 Large; //ÊÇ·ñLargeBlock
uint8 Five; //ÊÇ·ñÓÐ3¸öÐеØÖ·
uint8 MLC; //ÊÇ·ñMLC
uint8 Vonder; //³§ÉÌ
uint8 AccessTime; //cycle time
uint8 SecPerPage; //FLASH DualPlaneÿPAGEÉÈÇøÊý
uint8 SecPerPageRaw; //FLASHÔʼÿPAGEÉÈÇøÊý
uint32 SecPerBlock;
uint32 SecPerBlockRaw;
uint32 PagePerBlock;
uint32 Die2PageAddr;
uint32 TotalPhySec;
uint32 TotPhySec[MAX_FLASH_NUM];
} FLASH_SPEC, *pFLASH_SPEC;
typedef struct _FLASH_CMD
{
uint8 Valid; //ָʾÊÇ·ñÓÐЧ
uint16 Cmd; //FLASHÃüÁîÂë
uint32 ReadSec; //ÎïÀíÉÈÇøµØÖ·
uint32 ErrSec; //³ö´íÎïÀíÉÈÇøµØÖ·
uint8* Buf; //»º³åÇø
uint16 Len; //ÉÈÇøÊý
} FLASH_CMD, *pFLASH_CMD;
/*ID BLOCK SECTOR 0 INFO*/
#ifndef LINUX
typedef __packed struct tagIDSEC0
#else
typedef struct tagIDSEC0
#endif
{
uint32 magic; //0x0ff0aa55, MASKROMÏÞ¶¨²»Äܸü¸Ä
uint8 reserved[8];
uint16 bootCodeOffset1; //Öмä¼þÉÈÇøÆ«ÒÆ, MASKROMÏÞ¶¨²»Äܸü¸Ä
uint16 bootCodeOffset2; //µÚ¶þ·ÝÖмä¼þÆ«ÒÆ
uint8 reserved1[508-16];
uint16 bootCodeSize; //ÒÔSEC±íʾµÄÖмä¼þ´óС, MASKROMÏÞ¶¨²»Äܸü¸Ä
uint16 crc16; //Õû¸öID SECµÄÇ°512£2×Ö½ÚÊý¾ÝµÄCRC16
#ifndef LINUX
} IDSEC0, *pIDSEC0;
#else
}__attribute__((packed)) IDSEC0, *pIDSEC0;
#endif
/*ID BLOCK SECTOR 1 INFO*/
#ifndef LINUX
typedef __packed struct tagIDSEC1
#else
typedef struct tagIDSEC1
#endif
{
uint16 sysAreaBlockRaw; //ϵͳ±£Áô¿é, ÒÔÔʼBlockΪµ¥Î»
uint16 sysProgDiskCapacity; //ϵͳ¹Ì¼þÅÌÈÝÁ¿, ÒÔMBΪµ¥Î»
uint16 sysDataDiskCapacity; //ϵͳ²ÎÊýÅÌÈÝÁ¿, ÒÔMBΪµ¥Î»
uint16 reserved0[2]; //±£Áô²¿·ÖÌî0
uint16 chipSignL; // 28
uint16 chipSignH; // RK
uint16 MachineUIDL; //»úÐÍUID,Éý¼¶Ê±Æ¥Åä¹Ì¼þÓÃ
uint16 MachineUIDH;
uint16 year; //Öмä¼þÉú³ÉÈÕÆÚÄê
uint16 data; //Öмä¼þÉú³ÉÈÕÆÚÔÂÈÕ
uint16 mainVer; //Ö÷°æ±¾ºÅ
uint8 reserved1[489-24]; //±£Áô²¿·ÖÌî0
uint8 accessTime; //¶Áдcycleʱ¼ä, ns
uint16 blockSize; //ÒÔSEC±íʾµÄBLOCK SIZE
uint8 pageSize; //ÒÔSEC±íʾµÄPAGE SIZE
uint8 eccBits; //ÐèÒªµÄECC BITÊý, eg. 8/14
uint16 bStartEIB;
uint16 bEndEIB;
uint16 bStartRB;
uint16 bEndRB;
uint16 idBlk[5]; //ID¿éλÖÃ
#ifndef LINUX
}IDSEC1, *pIDSEC1;
#else
}__attribute__((packed)) IDSEC1, *pIDSEC1;
#endif
#ifndef LINUX
typedef __packed struct _FLASH_INFO
#else
typedef struct _FLASH_INFO
#endif
{
uint32 FlashSize; //(SectorΪµ¥Î») 4Byte
uint16 BlockSize; //(SectorΪµ¥Î») 2Byte
uint8 PageSize; //(SectorΪµ¥Î») 1Byte
uint8 ECCBits; //(bitsΪµ¥Î») 1Byte
uint8 AccessTime;
uint8 ManufacturerName; // 1Byte
uint8 FlashMask; //ÿһbit´ú±íÄǸöƬѡÊÇ·ñÓÐFLASH
#ifndef LINUX
} FLASH_INFO, *pFLASH_INFO;
#else
}__attribute__((packed)) FLASH_INFO, *pFLASH_INFO;
#endif
//1È«¾Ö±äÁ¿
#undef EXT
#ifdef IN_FLASH
#define EXT
#else
#define EXT extern
#endif
EXT FLASH_SPEC FlashSpec;
EXT FLASH_CMD FlashPendCmd;
EXT pNANDC NandReg; //NANDC¼Ä´æÆ÷
EXT uint32 RefleshSec[MAX_REFLESH_LOG];
EXT uint32 SysProgDiskCapacity; //ϵͳ³ÌÐòÅÌÈÝÁ¿
EXT uint32 SysDataDiskCapacity; //ϵͳÊý¾ÝÅÌÈÝÁ¿
EXT uint16 SysAreaBlockRaw;
EXT uint8 FlashReadStatusCmd;
EXT uint32 FlashSysProtMagic;
EXT uint32 FlashSysProtAddr;
EXT uint16 LoaderVer;
//1º¯ÊýÔÐÍÉùÃ÷
//flash.c
extern void FlashTimingCfg(uint32 AHBnKHz);
extern void FlashSysProtSet(uint32);
extern uint32 FlashInit(void);
extern uint32 FlashReadEnhanced(uint32 sec, void *pData, void *pSpare, uint8 nSec, uint32 nextSec);
extern uint32 FlashProgPage(uint32 sec, void *pData, void *pSpare, uint8 nSec);
extern uint32 FlashProgEnhanced(uint32 sec, void* buf, void* spare);
extern uint32 FlashBlockErase(uint32 sec);
extern uint32 FlashCopyProg(uint32 srcSec, uint32 destSec, uint16 nSec, void *pSpare);
//1±í¸ñ¶¨Òå
#ifdef IN_FLASH
/*******************************
³§ÉÌID±í
********************************/
uint8 ManufactureIDTbl[]=
{
0xec, //ÈýÐÇSAMSUNG
0x98, //¶«Ö¥TOSHIBA
0xad, //º£Á¦Ê¿HYNIX
0xc1, //Ó¢·ÉÁèINFINEON
0x2c, //ÃÀ¹âMICRON
0x07, //ÈðÈøRENESAS
0x20, //Òâ·¨°ëµ¼ÌåST
0x89 //Ó¢Ìضûintel
};
/*******************************
Æ÷¼þID±í
********************************/
uint8 DeviceCode[]=
{
0x76, //small 8bit-64MB
0x79, //small 8bit-128MB
0xF1, //large 8bit-128M
0xDA, //large 8bit-256M
0xDC, //large 8bit-512M
0xD3, //large 8bit-1G
0xD5, //large 8bit-2G
0xD7, //large 8bit-4G
0xD9 //large 8bit-8G
};
/*******************************
Æ÷¼þÐÅÏ¢±í
********************************/
uint32 DeviceInfo[]= //phisical sectors
{
0x20000, // DI_64M, small page
0x40000, // DI_128M, small page
0x40000, // DI_128M, large page
0x80000, // DI_256M, large page
0x100000, // DI_512M, large page
0x200000, // DI_1G, large page
0x400000, // DI_2G, large page
0x800000, // DI_4G, large page
0x1000000 // DI_8G, large page
};
#if 0
const char* VonderDesc[]=
{
"Samsung",
"Toshiba",
"Hynix",
"Infineon",
"Micron",
"Renesas",
"ST",
"Intel"
};
#endif
#else
extern uint8 ManufactureIDTbl[];
extern uint8 DeviceCode[];
extern uint32 DeviceInfo[];
#endif
#endif