Advertisement
Guest User

Untitled

a guest
Oct 7th, 2013
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.84 KB | None | 0 0
  1. /********************************************************************************
  2. *********************************************************************************
  3. COPYRIGHT (c) 2004 BY ROCK-CHIP FUZHOU
  4. -- ALL RIGHTS RESERVED --
  5.  
  6. File Name: flash.h
  7. Author: XUESHAN LIN
  8. Created: 1st Dec 2008
  9. Modified:
  10. Revision: 1.00
  11. ********************************************************************************
  12. ********************************************************************************/
  13. #ifndef _FLASH_H
  14. #define _FLASH_H
  15.  
  16. //1¿ÉÅäÖòÎÊý
  17. #define DUAL_PLANE //¶¨ÒåÊÇ·ñʹÄÜDUAL PLANE
  18. //#define INTERLEAVE //¶¨ÒåÊÇ·ñʹÄÜInterleave
  19.  
  20. #define MAX_FLASH_NUM 4 /*×î´óÖ§³ÖµÄFLASHÊý*/
  21. #define MAX_REFLESH_LOG 10 //¶¨ÒåÐèÒª¸üеĵØÖ·¼Ç¼Êý
  22. #define DATA_LEN (8192*2/4) //Êý¾Ý¿éµ¥Î»word
  23. #define SPARE_LEN (256*2/4) //УÑéÊý¾Ý³¤¶È
  24. #define PAGE_SIZE (DATA_LEN+SPARE_LEN) //ÿ¸öÊý¾Ýµ¥Î»µÄ³¤¶È
  25.  
  26. #define CHIP_SIGN 0x37324B52 //RK28 0x37324B52
  27.  
  28. /*******************************************************************
  29. ºê³£Êý¶¨Òå
  30. *******************************************************************/
  31.  
  32.  
  33. /*******************************************************************
  34. ³§ÉÌID±àÂë
  35. *******************************************************************/
  36. #define SAMSUNG 0x00 //ÈýÐÇSAMSUNG
  37. #define TOSHIBA 0x01 //¶«Ö¥TOSHIBA
  38. #define HYNIX 0x02 //º£Á¦Ê¿HYNIX
  39. #define INFINEON 0x03 //Ó¢·ÉÁèINFINEON
  40. #define MICRON 0x04 //ÃÀ¹âMICRON
  41. #define RENESAS 0x05 //ÈðÈøRENESAS
  42. #define ST 0x06 //Òâ·¨°ëµ¼ÌåST
  43. #define INTEL 0x07 //Ó¢Ìضûintel
  44.  
  45. /*******************************************************************
  46. Æ÷¼þID±àÂë
  47. *******************************************************************/
  48. #define Small64M 0x00
  49. #define Small128M 0x01
  50. #define Large128M 0x02
  51. #define Large256M 0x03
  52. #define Large512M 0x04
  53. #define Large1G 0x05
  54. #define Large2G 0x06
  55.  
  56.  
  57. /*******************************************************************
  58. FLASHͨ¹ý²Ù×÷ÃüÁ(ÈýÐÇ)
  59. *******************************************************************/
  60. #define RESET_CMD 0xff
  61. #define READ_ID_CMD 0x90
  62. #define READ_UNIQUE_ID_CMD 0xed
  63. #define READ_STATUS_CMD 0x70
  64. #define READ_STATUS_CMD_TOSHIBA 0x71
  65. #define READ_STATUS_CMD_MICRON 0x78
  66. #define CHIP1_STATUS_CMD 0xf1
  67. #define CHIP2_STATUS_CMD 0xf2
  68. #define PAGE_PROG_CMD 0x8010
  69. #define PLANE2_PAGE_PROG_CMD 0x8111
  70. #define INTERLEAVE_PROG_CMD 0x8080
  71. #define BLOCK_ERASE_CMD 0x60d0
  72.  
  73. /*******************************************************************
  74. LARGE PAGE FLASH²Ù×÷ÃüÁ(ÈýÐÇ)
  75. *******************************************************************/
  76. #define READ_CMD 0x0030
  77. #define DUALPLANE_READ_CMD 0x6030
  78. #define READ_COPY_CMD 0x0035
  79. #define CACHE_PROG_CMD 0x8015
  80. #define COPY_PROG_CMD 0x8510
  81. #define RAND_DATAIN_CMD 0x85
  82. #define RAND_DATAOUT_CMD 0x05e0
  83. #define PLANE1_DATAOUT_CMD 0x06e0
  84. /*******************************************************************
  85. SMALL PAGE FLASH²Ù×÷ÃüÁ(ÈýÐÇ)
  86. *******************************************************************/
  87. #define READ0_CMD 0x00
  88. #define READ1_CMD 0x01
  89. #define READ_SPARE_CMD 0x50
  90. #define SMALL_COPY_PROG_CMD 0x8A10
  91.  
  92. //BCHCTL¼Ä´æÆ÷
  93. #define BCH_WR 0x0002
  94. #define BCH_RST 0x0001
  95. //FLCTL¼Ä´æÆ÷
  96. #define FL_RDY 0x1000
  97. #define FL_COR_EN 0x0800
  98. #define FL_INT_EN 0x0400
  99. #define FL_XFER_EN 0x0200
  100. #define FL_INTCLR_EN 0x0100
  101. #define FL_START 0x0004
  102. #define FL_WR 0x0002
  103. #define FL_RST 0x0001
  104.  
  105. #define FLASH_PROTECT_ON() //write_XDATA32(FMCTL, ReadNandReg(FMCTL) & (~0x10))
  106. #define FLASH_PROTECT_OFF() //write_XDATA32(FMCTL, ReadNandReg(FMCTL) | 0x10)
  107.  
  108. /*******************************************************************
  109. FLASH¶Áд½Ó¿Ú
  110. *******************************************************************/
  111.  
  112. //1½á¹¹¶¨Òå
  113. //chip interface reg
  114. typedef volatile struct tagCHIP_IF
  115. {
  116. uint32 data;
  117. uint32 addr;
  118. uint32 cmd;
  119. uint32 RESERVED[0x7d];
  120. }CHIP_IF, *pCHIP_IF;
  121.  
  122. //NANDC Registers
  123. typedef volatile struct tagNANDC
  124. {
  125. uint32 FMCTL;
  126. uint32 FMWAIT;
  127. uint32 FLCTL;
  128. uint32 BCHCTL;
  129. uint32 RESERVED1[(0xd0-0x10)/4];
  130. uint32 BCHST;
  131. uint32 RESERVED2[(0x200-0xd4)/4];
  132. CHIP_IF chip[4];
  133. uint32 buf[0x800/4];
  134. uint32 spare[0x80/4];
  135. } NANDC, *pNANDC;
  136.  
  137. typedef struct tagFLASH_SPEC
  138. {
  139. uint8 EccBits; //ECC±ÈÌØÊý
  140. uint8 CacheProg; //ÊÇ·ñÖ§³Öcache program
  141. uint8 MulPlane; //ÊÇ·ñÖ§³ÖMultiPlane
  142. uint8 Interleave; //ÊÇ·ñÖ§³ÖInterleave
  143. uint8 Large; //ÊÇ·ñLargeBlock
  144. uint8 Five; //ÊÇ·ñÓÐ3¸öÐеØÖ·
  145. uint8 MLC; //ÊÇ·ñMLC
  146. uint8 Vonder; //³§ÉÌ
  147. uint8 AccessTime; //cycle time
  148. uint8 SecPerPage; //FLASH DualPlaneÿPAGEÉÈÇøÊý
  149. uint8 SecPerPageRaw; //FLASHԭʼÿPAGEÉÈÇøÊý
  150. uint32 SecPerBlock;
  151. uint32 SecPerBlockRaw;
  152. uint32 PagePerBlock;
  153. uint32 Die2PageAddr;
  154. uint32 TotalPhySec;
  155. uint32 TotPhySec[MAX_FLASH_NUM];
  156. } FLASH_SPEC, *pFLASH_SPEC;
  157.  
  158. typedef struct _FLASH_CMD
  159. {
  160. uint8 Valid; //ָʾÊÇ·ñÓÐЧ
  161. uint16 Cmd; //FLASHÃüÁîÂë
  162. uint32 ReadSec; //ÎïÀíÉÈÇøµØÖ·
  163. uint32 ErrSec; //³ö´íÎïÀíÉÈÇøµØÖ·
  164. uint8* Buf; //»º³åÇø
  165. uint16 Len; //ÉÈÇøÊý
  166. } FLASH_CMD, *pFLASH_CMD;
  167.  
  168. /*ID BLOCK SECTOR 0 INFO*/
  169. #ifndef LINUX
  170. typedef __packed struct tagIDSEC0
  171. #else
  172. typedef struct tagIDSEC0
  173. #endif
  174. {
  175. uint32 magic; //0x0ff0aa55, MASKROMÏÞ¶¨²»Äܸü¸Ä
  176. uint8 reserved[8];
  177. uint16 bootCodeOffset1; //Öмä¼þÉÈÇøÆ«ÒÆ, MASKROMÏÞ¶¨²»Äܸü¸Ä
  178. uint16 bootCodeOffset2; //µÚ¶þ·ÝÖмä¼þÆ«ÒÆ
  179. uint8 reserved1[508-16];
  180. uint16 bootCodeSize; //ÒÔSEC±íʾµÄÖмä¼þ´óС, MASKROMÏÞ¶¨²»Äܸü¸Ä
  181. uint16 crc16; //Õû¸öID SECµÄÇ°512£­2×Ö½ÚÊý¾ÝµÄCRC16
  182. #ifndef LINUX
  183. } IDSEC0, *pIDSEC0;
  184. #else
  185. }__attribute__((packed)) IDSEC0, *pIDSEC0;
  186. #endif
  187.  
  188. /*ID BLOCK SECTOR 1 INFO*/
  189. #ifndef LINUX
  190. typedef __packed struct tagIDSEC1
  191. #else
  192. typedef struct tagIDSEC1
  193. #endif
  194. {
  195. uint16 sysAreaBlockRaw; //ϵͳ±£Áô¿é, ÒÔԭʼBlockΪµ¥Î»
  196. uint16 sysProgDiskCapacity; //ϵͳ¹Ì¼þÅÌÈÝÁ¿, ÒÔMBΪµ¥Î»
  197. uint16 sysDataDiskCapacity; //ϵͳ²ÎÊýÅÌÈÝÁ¿, ÒÔMBΪµ¥Î»
  198. uint16 reserved0[2]; //±£Áô²¿·ÖÌî0
  199. uint16 chipSignL; // 28
  200. uint16 chipSignH; // RK
  201. uint16 MachineUIDL; //»úÐÍUID,Éý¼¶Ê±Æ¥Åä¹Ì¼þÓÃ
  202. uint16 MachineUIDH;
  203. uint16 year; //Öмä¼þÉú³ÉÈÕÆÚÄê
  204. uint16 data; //Öмä¼þÉú³ÉÈÕÆÚÔÂÈÕ
  205. uint16 mainVer; //Ö÷°æ±¾ºÅ
  206. uint8 reserved1[489-24]; //±£Áô²¿·ÖÌî0
  207. uint8 accessTime; //¶Áдcycleʱ¼ä, ns
  208. uint16 blockSize; //ÒÔSEC±íʾµÄBLOCK SIZE
  209. uint8 pageSize; //ÒÔSEC±íʾµÄPAGE SIZE
  210. uint8 eccBits; //ÐèÒªµÄECC BITÊý, eg. 8/14
  211. uint16 bStartEIB;
  212. uint16 bEndEIB;
  213. uint16 bStartRB;
  214. uint16 bEndRB;
  215. uint16 idBlk[5]; //ID¿éλÖÃ
  216. #ifndef LINUX
  217. }IDSEC1, *pIDSEC1;
  218. #else
  219. }__attribute__((packed)) IDSEC1, *pIDSEC1;
  220. #endif
  221.  
  222. #ifndef LINUX
  223. typedef __packed struct _FLASH_INFO
  224. #else
  225. typedef struct _FLASH_INFO
  226. #endif
  227. {
  228. uint32 FlashSize; //(SectorΪµ¥Î») 4Byte
  229. uint16 BlockSize; //(SectorΪµ¥Î») 2Byte
  230. uint8 PageSize; //(SectorΪµ¥Î») 1Byte
  231. uint8 ECCBits; //(bitsΪµ¥Î») 1Byte
  232. uint8 AccessTime;
  233. uint8 ManufacturerName; // 1Byte
  234. uint8 FlashMask; //ÿһbit´ú±íÄǸöƬѡÊÇ·ñÓÐFLASH
  235. #ifndef LINUX
  236. } FLASH_INFO, *pFLASH_INFO;
  237. #else
  238. }__attribute__((packed)) FLASH_INFO, *pFLASH_INFO;
  239. #endif
  240.  
  241. //1È«¾Ö±äÁ¿
  242. #undef EXT
  243. #ifdef IN_FLASH
  244. #define EXT
  245. #else
  246. #define EXT extern
  247. #endif
  248. EXT FLASH_SPEC FlashSpec;
  249. EXT FLASH_CMD FlashPendCmd;
  250. EXT pNANDC NandReg; //NANDC¼Ä´æÆ÷
  251. EXT uint32 RefleshSec[MAX_REFLESH_LOG];
  252. EXT uint32 SysProgDiskCapacity; //ϵͳ³ÌÐòÅÌÈÝÁ¿
  253. EXT uint32 SysDataDiskCapacity; //ϵͳÊý¾ÝÅÌÈÝÁ¿
  254. EXT uint16 SysAreaBlockRaw;
  255. EXT uint8 FlashReadStatusCmd;
  256. EXT uint32 FlashSysProtMagic;
  257. EXT uint32 FlashSysProtAddr;
  258. EXT uint16 LoaderVer;
  259.  
  260. //1º¯ÊýÔ­ÐÍÉùÃ÷
  261. //flash.c
  262. extern void FlashTimingCfg(uint32 AHBnKHz);
  263. extern void FlashSysProtSet(uint32);
  264. extern uint32 FlashInit(void);
  265. extern uint32 FlashReadEnhanced(uint32 sec, void *pData, void *pSpare, uint8 nSec, uint32 nextSec);
  266. extern uint32 FlashProgPage(uint32 sec, void *pData, void *pSpare, uint8 nSec);
  267. extern uint32 FlashProgEnhanced(uint32 sec, void* buf, void* spare);
  268. extern uint32 FlashBlockErase(uint32 sec);
  269. extern uint32 FlashCopyProg(uint32 srcSec, uint32 destSec, uint16 nSec, void *pSpare);
  270.  
  271. //1±í¸ñ¶¨Òå
  272. #ifdef IN_FLASH
  273. /*******************************
  274. ³§ÉÌID±í
  275. ********************************/
  276. uint8 ManufactureIDTbl[]=
  277. {
  278. 0xec, //ÈýÐÇSAMSUNG
  279. 0x98, //¶«Ö¥TOSHIBA
  280. 0xad, //º£Á¦Ê¿HYNIX
  281. 0xc1, //Ó¢·ÉÁèINFINEON
  282. 0x2c, //ÃÀ¹âMICRON
  283. 0x07, //ÈðÈøRENESAS
  284. 0x20, //Òâ·¨°ëµ¼ÌåST
  285. 0x89 //Ó¢Ìضûintel
  286. };
  287.  
  288. /*******************************
  289. Æ÷¼þID±í
  290. ********************************/
  291. uint8 DeviceCode[]=
  292. {
  293. 0x76, //small 8bit-64MB
  294. 0x79, //small 8bit-128MB
  295. 0xF1, //large 8bit-128M
  296. 0xDA, //large 8bit-256M
  297. 0xDC, //large 8bit-512M
  298. 0xD3, //large 8bit-1G
  299. 0xD5, //large 8bit-2G
  300. 0xD7, //large 8bit-4G
  301. 0xD9 //large 8bit-8G
  302. };
  303.  
  304. /*******************************
  305. Æ÷¼þÐÅÏ¢±í
  306. ********************************/
  307. uint32 DeviceInfo[]= //phisical sectors
  308. {
  309. 0x20000, // DI_64M, small page
  310. 0x40000, // DI_128M, small page
  311. 0x40000, // DI_128M, large page
  312. 0x80000, // DI_256M, large page
  313. 0x100000, // DI_512M, large page
  314. 0x200000, // DI_1G, large page
  315. 0x400000, // DI_2G, large page
  316. 0x800000, // DI_4G, large page
  317. 0x1000000 // DI_8G, large page
  318. };
  319.  
  320. #if 0
  321. const char* VonderDesc[]=
  322. {
  323. "Samsung",
  324. "Toshiba",
  325. "Hynix",
  326. "Infineon",
  327. "Micron",
  328. "Renesas",
  329. "ST",
  330. "Intel"
  331. };
  332. #endif
  333. #else
  334. extern uint8 ManufactureIDTbl[];
  335. extern uint8 DeviceCode[];
  336. extern uint32 DeviceInfo[];
  337. #endif
  338. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement