/******************************************************************************** ********************************************************************************* 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