NandFlash.h
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:29k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. //1 ========= New Nandflash structure
  2. #if(NEW_FLASH)
  3. /*==========================================================================
  4. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  5. File: NandFlash.h
  6. content: 
  7. History: Created by David Chiu 2004/3/30
  8. ==========================================================================*/
  9. #ifdef _NAND_FLASH_H_
  10. #define EXTERN
  11. #else
  12. #define EXTERN extern
  13. #endif
  14. //Allen060623 new_nf start
  15. //-------------------------------------------------------------------
  16. // Definition:
  17. //-------------------------------------------------------------------
  18. #if(_PM_INIT_|_PM_SYS_|(_PM_USB_&!_PM_MTP_)|_PM_MPTEST_|(SETTING_FOR_ICE_START)|(_PM_HST_&!_HOST_COPY_)|_PM_SAVE_|_PM_MTP_INIT_|SETTING_PM_DEL_DEBUG)  //Tne050412#1 
  19. #define _NAND_API_INIT_ 1
  20. #if(_PM_INIT_|_PM_USB_MSC_|SETTING_FOR_ISP_START)
  21. #define _NAND_INIT_PROCESS_ 1
  22. #else
  23. #define _NAND_INIT_PROCESS_ 0
  24. #endif
  25. #else
  26. #define _NAND_API_INIT_ 0
  27. #define _NAND_INIT_PROCESS_ 0
  28. #endif
  29. #if(_PM_SYS_)
  30. #define _NAND_API_ERASE_ 1
  31. #else
  32. #define _NAND_API_ERASE_ 0
  33. #endif
  34. #if(_PM_USB_|_PM_MPTEST_)
  35. #if(_PM_MTP_)
  36. #define _NAND_API_ATAPI_ 0
  37. #define _NAND_API_USB_ 0
  38. #else
  39. #define _NAND_API_USB_ 1
  40. #define _NAND_API_ATAPI_ 1
  41. #endif
  42. #else
  43. #define _NAND_API_USB_ 0
  44. #define _NAND_API_ATAPI_ 0
  45. #endif
  46. #define _NAND_COMMON_ 1
  47. #define _NAND_API_WRITE_ 1
  48. #define _NAND_API_READ_ 1
  49. #define _NAND_API_FINISHJOB_ 1
  50. #if(_PM_REC_)
  51. #define _NAND_API_STEPJOB_ 0
  52. #else
  53. #define _NAND_API_STEPJOB_ 0
  54. #endif
  55. #if(_PM_USB_MSC_|_PM_REC_) //060706: rec
  56. #define _NAND_FUNC_WL_ENABLE_ 1
  57. #define _NAND_FUNC_BADBLOCK_RECYCLE_ 1 //Allen060703
  58. #else
  59. #define _NAND_FUNC_WL_ENABLE_ 0
  60. #define _NAND_FUNC_BADBLOCK_RECYCLE_ 0 //Allen060703
  61. #endif
  62. #if(_NAND_FUNC_WL_ENABLE_)
  63. #define _NAND_API_RELOADWLC_ 1
  64. #else
  65. #define _NAND_API_RELOADWLC_ 0
  66. #endif
  67. #if(_PM_REC_|_PM_INIT_CHK_)
  68. #define _NAND_API_RW_SETTING_ 1
  69. #else
  70. #define _NAND_API_RW_SETTING_ 0
  71. #endif
  72. //
  73. // gxbNandInitStage
  74. //
  75. // 0: none
  76. // 1: NandInitPre done
  77. // 2: NandIdentify done
  78. // 3: NandInitGetConfig done
  79. // 4: NandInitBuildLUT done
  80. #define NDINIT_INIT 0
  81. #define NDINIT_PRE_DONE 1
  82. #define NDINIT_IDENT_DONE 2
  83. #define NDINIT_CONFIG_DONE 3
  84. #define NDINIT_LUT_DONE 4
  85. #define NDINIT_DONE NDINIT_LUT_DONE
  86. #define SRAM_CACHE_0_PATH 8
  87. #define SRAM_CACHE_1_PATH 12
  88. //Allen060623 new_nf end
  89. //Allen060627 debug
  90. //#define _WL_DEBUG_ 060720
  91. #ifdef _WL_DEBUG_
  92. EXTERN XDWORD gxdwDoWlNumber;
  93. EXTERN XWORD gxwWLCReset;
  94. EXTERN XWORD gxwProgramError;
  95. EXTERN XWORD gxwEraseError;
  96. EXTERN XBYTE gxbUsbWriteFail; //060628
  97. EXTERN XBYTE gxbUsbReadFail; //060628
  98. EXTERN XBYTE gxbSaveLutFail; //060628
  99. EXTERN XBYTE gxbBadBlockNum; //060629;
  100. #endif
  101. //Allen060627 debug
  102. //-------------------------------------------------------------------
  103. // Function prototype
  104. //-------------------------------------------------------------------
  105. //050407 allen
  106. //
  107. // USB API
  108. //
  109. EXTERN API void NandReadCapa(void);
  110. EXTERN API bit PhyAccessNand_pm(BYTE bType);
  111. EXTERN API bit EraseNandBlock(WORD wStartBlk, BYTE bBlkLen) large;
  112. EXTERN API bit UsbAccessDataSram(WORD wRaAddr, WORD wLen, bit fWrite) large;
  113. EXTERN API bit ReadSecurity(BYTE n);
  114. EXTERN API bit WriteSecurity(BYTE n) large; //Allen051102
  115. EXTERN API bit PhyBlockEraseAll(BYTE) large;//050323
  116. EXTERN API void PhyWriteConfig(void) large;
  117. EXTERN API void ReadBadBlock(BYTE bType);
  118. EXTERN API void GetIniDefectBlock(BYTE, BYTE) large; //Allen051221#1 060829
  119. EXTERN API void ReadDevice(void);
  120. EXTERN API bit DumpNandRawData() large; //Allen051124
  121. EXTERN API void ReadWearLevelingCount(BYTE bZone) large;
  122. EXTERN API bit NandIdentify(bit fEnableMultiBank) large; //Scott0601004
  123. //Ted 0203 start
  124. #if(_PM_INIT_)
  125. EXTERN bit UpgradeBlock0(WORD wStorLba, PBYTE pbTempRedu) large;
  126. EXTERN void EraseBlock0(void);
  127. #endif
  128. //Ted 0203 end
  129. //
  130. // PM API
  131. //
  132. EXTERN API bit  NandInit(BYTE) large;
  133. #if(_NAND_API_WRITE_)
  134. EXTERN API bit NandWrite(void);
  135. #endif
  136. #if(_NAND_API_READ_)
  137. EXTERN API bit NandRead(void);
  138. #endif
  139. #if(_NAND_API_FINISHJOB_)
  140. EXTERN API bit NandFinishJob(void);
  141. #endif
  142. #if(_NAND_API_STEPJOB_)
  143. EXTERN API bit NandStepJob(void);
  144. #endif
  145. #if(_NAND_API_ERASE_)
  146. EXTERN API void NandEraseBlock(WORD wLogBlk);
  147. #endif
  148. #if(_NAND_API_RELOADWLC_)
  149. EXTERN API void NandReloadCnt(void); //allen060517L call after loadprogram
  150. #endif
  151. #if(_NAND_API_USB_)
  152. EXTERN bit NandFlash0Read(void);
  153. EXTERN bit NandFlash0Write(void);
  154. #endif
  155. EXTERN bit SmPollingReady(void); //Allen060619
  156. EXTERN void ScanPM(void) large; //Nick061204  //NandRestore //Scott061212
  157. //Scott061212 Start
  158. #define RESTORE_STEP_NUM 4
  159. #define FIXED_RESTORE_BLK 2
  160. //NandRestore step define
  161. #define FullStep 1  //Restore a block with full step mode
  162. #define OneStep 2 //Restore a block with one step mode
  163. #define FinishAllBlk 3 //Restore all blocks with full step mode
  164. #define FisnishRemainStep 4  //finish restoring a block with one step mode
  165. #define PM_SCAN 0x80 //bit 7 use for disquitish scan PM or not //Nick061204
  166. #define SRAM_RESTORE_FLAG 0x90
  167. #define SRAM_RESTORE_ORG_BFFLAG 0x92
  168. #define SRAM_RESTORE_ORG_LOGBLK 0x94
  169. #define SRAM_RESTORE_ORG_PHYBLK 0x96
  170. #define SRAM_RESTORE_NEW_PHYBLK 0x98
  171. EXTERN XBYTE gxbRestoreNewZone, gxbRestoreOrgZone;
  172. //Absolute addressing Start
  173. /*
  174. #define RestoreFlag 1
  175. #define gfNandRestore 2
  176. #define gfNandRestoreFlag 4
  177. #define gxbECCErr2Bit 8 
  178. #define RESTORE_BLK_POOL_SIZE 3 
  179. EXTERN XWORD gwBlk;
  180. EXTERN XBYTE gbZone;
  181. EXTERN XBYTE gbii;
  182. EXTERN XWORD gxwRestoreBlkPool[RESTORE_BLK_POOL_SIZE];
  183. EXTERN XBYTE gxbRestoreBlkNum;
  184. EXTERN XBYTE gxbCurrentRestoreStep;
  185. EXTERN XBYTE gxbRestoreCopy;
  186. EXTERN XBYTE gxbNandRestoreFlag; //setting flag
  187. EXTERN XBYTE gxbRestoreSetPage;
  188. EXTERN XBYTE gxbRestoreCMD;
  189. EXTERN XWORD gxwRestoreNewBlk, gxwRestoreSetBlk; 
  190. EXTERN XWORD gxwRestoreOrgBlk, gxwRestoreLogOrgBlk;
  191. EXTERN XBYTE gxbBFFlag;
  192. */
  193. //Absolute addressing End
  194. #if(_PM_INIT_CHK_|_PM_INIT_) 
  195. EXTERN XWORD gxwRedu67[4];
  196. #endif
  197. #if(_PM_INIT_CHK_) //Scott061212
  198. EXTERN API void CheckNandReStore(void) large; 
  199. #endif
  200. #if(_PM_INIT_)
  201. EXTERN API void RecoverNandReStore(void) large;
  202. #endif
  203. EXTERN API void ChkErr2BitSMReset() large;
  204. EXTERN API bit NandRestore() large;
  205. //Scott061212 End
  206. #undef EXTERN
  207. //-------------------------------------------------------------------
  208. // Definition
  209. //-------------------------------------------------------------------
  210. //
  211. // Define NAND Command
  212. //
  213. #define NAND_CMD_READ 0x00
  214. #define NAND_CMD_READ2 0x01
  215. #define NAND_CMD_READ_DUMMY 0x03
  216. #define NAND_CMD_READ_CYCLE_2 0x30
  217. #define NAND_CMD_READ3 0x50
  218. #define NAND_CMD_READ_COPYBACK 0x35
  219. #define NAND_CMD_ID_READ 0x90
  220. #define NAND_CMD_ID_READ_EXT 0x91 //050303
  221. #define NAND_CMD_RESET 0xFF
  222. #define NAND_CMD_PROGRAM 0x80
  223. #define NAND_CMD_PROGRAM_CONFIRM 0x10
  224. #define NAND_CMD_PROGRAM_DUMMY 0x11
  225. #define NAND_CMD_PROGRAM_CACHE 0x15
  226. #define NAND_CMD_COPYBACK_PROGRAM 0x85
  227. #define NAND512_CMD_COPYBACK_PROGRAM 0x8A //NAND512
  228. #define NAND_CMD_BLOCK_ERASE 0x60
  229. #define NAND_CMD_ERASE 0xD0
  230. #define NAND_CMD_RANDOM_INPUT 0x85
  231. #define NAND_CMD_RANDOM_OUTPUT 0x05
  232. #define NAND_CMD_RANDOM_OUTPUT2 0xE0
  233. #define NAND_CMD_STS_READ 0x70
  234. #define NAND_CMD_STS_READ_71 0x71
  235. //-------------------------------------------------------------------
  236. // Macro define
  237. //-------------------------------------------------------------------
  238. //GPIOE[3]: SM_RDY => Nand0,1 share 1 wire
  239. /*#define Nand0Ready(void) Allen060619 test
  240. {
  241. while (!(obSMCTRL & NAND_READY)) {}
  242. }*/
  243. #define Nand0Ready SmPollingReady //Allen060619
  244. /////////////////050303 start
  245. #define NandCmd(CMD)
  246. {
  247. obSMCTRL=NAND_COMMAND;
  248. obSMDATALO=CMD;
  249. obSMCTRL=NAND_NORMAL;
  250. }
  251. #define Nand2KAddr()
  252. {
  253. obSMCTRL = NAND_ADDRESS;
  254. obSMDATALO = gwColAddress & 0xFF;
  255. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  256. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  257. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  258. if (gfRowAddr3Cycle)
  259. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  260. obSMCTRL = NAND_DATA;
  261. }
  262. #define Nand2KRowAddr()
  263. {
  264. obSMCTRL = NAND_ADDRESS;
  265. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  266. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  267. if (gfRowAddr3Cycle)
  268. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  269. obSMCTRL = NAND_DATA;
  270. }
  271. #define Nand512Addr()
  272. {
  273. obSMCTRL = NAND_ADDRESS;
  274. obSMDATALO = 0x00;
  275. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  276. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  277. if(gfRowAddr3Cycle) 
  278. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  279. obSMCTRL = NAND_DATA;
  280. }
  281. #define Nand512RowAddr()
  282. {
  283. obSMCTRL = NAND_ADDRESS;
  284. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  285. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  286. if(gfRowAddr3Cycle) 
  287. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  288. obSMCTRL = NAND_DATA;
  289. }
  290. /////////////////050303 end
  291. //NAND512 start
  292. //041223 start: gwColAddress del
  293. #define Nand512Read1(void)
  294. {
  295. obSMCTRL = NAND_COMMAND;
  296. obSMDATALO = NAND_CMD_READ;
  297. obSMCTRL = NAND_ADDRESS;
  298. obSMDATALO = 0x00;
  299. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  300. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  301. if(gfRowAddr3Cycle)
  302. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  303. obSMCTRL = NAND_DATA;
  304. }
  305. #define Nand512Read2(void)
  306. {
  307. obSMCTRL = NAND_COMMAND;
  308. obSMDATALO = NAND_CMD_READ2;
  309. obSMCTRL = NAND_ADDRESS;
  310. obSMDATALO = 0x00;
  311. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  312. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  313. if(gfRowAddr3Cycle)
  314. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  315. obSMCTRL = NAND_DATA;
  316. }
  317. #define Nand512Read3(void)
  318. {
  319. obSMCTRL = NAND_COMMAND;
  320. obSMDATALO = NAND_CMD_READ3;
  321. obSMCTRL = NAND_ADDRESS;
  322. obSMDATALO = 0x00;
  323. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  324. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  325. if(gfRowAddr3Cycle)
  326. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  327. obSMCTRL = NAND_DATA;
  328. }
  329. #define Nand512Write(void)
  330. {
  331. obSMCTRL = NAND_COMMAND;
  332. obSMDATALO = NAND_CMD_PROGRAM;
  333. obSMCTRL = NAND_ADDRESS;
  334. obSMDATALO = 0x00;
  335. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  336. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  337. if(gfRowAddr3Cycle)
  338. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  339. obSMCTRL = NAND_DATA;
  340. }
  341. #define Nand512ReadCopyBack(void)
  342. {
  343. obSMCTRL = NAND_COMMAND;
  344. obSMDATALO = NAND_CMD_READ;
  345. obSMCTRL = NAND_ADDRESS;
  346. obSMDATALO = 0x00;
  347. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  348. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  349. if(gfRowAddr3Cycle)
  350. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  351. obSMCTRL = NAND_NORMAL;
  352. }
  353. #define Nand512WriteCopyBack(void)
  354. {
  355. obSMCTRL = NAND_COMMAND;
  356. obSMDATALO = NAND512_CMD_COPYBACK_PROGRAM;
  357. obSMCTRL = NAND_ADDRESS;
  358. obSMDATALO = 0x00;
  359. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  360. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  361. if(gfRowAddr3Cycle)
  362. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  363. obSMCTRL = NAND_COMMAND;
  364. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  365. obSMCTRL = NAND_DATA;
  366. }
  367. #define Nand512BlockErase(void)
  368. {
  369. obSMCTRL = NAND_COMMAND;
  370. obSMDATALO = NAND_CMD_BLOCK_ERASE;
  371. obSMCTRL = NAND_ADDRESS;
  372. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  373. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  374. if(gfRowAddr3Cycle)
  375. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  376. obSMCTRL = NAND_COMMAND;
  377. obSMDATALO = NAND_CMD_ERASE;
  378. obSMCTRL = NAND_NORMAL;
  379. }
  380. //041223 end: gwColAddress del
  381. //NAND512 end
  382. #define Nand0Reset(void)
  383. {
  384. obSMCTRL = NAND_COMMAND;
  385. obSMDATALO = NAND_CMD_RESET;
  386. obSMCTRL = NAND_DATA;
  387. Nand0Ready();
  388. obSMCTRL = NAND_NORMAL;
  389. }
  390. #define Nand2KRead(void)
  391. {
  392. obSMCTRL = NAND_COMMAND;
  393. obSMDATALO = NAND_CMD_READ;
  394. obSMCTRL = NAND_ADDRESS;
  395. obSMDATALO = gwColAddress & 0xFF;
  396. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  397. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  398. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  399. if (gfRowAddr3Cycle)
  400. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  401. obSMCTRL = NAND_COMMAND;
  402. obSMDATALO = NAND_CMD_READ_CYCLE_2;
  403. obSMCTRL = NAND_DATA;
  404. }
  405. #define Nand2KWrite(void)
  406. {
  407. obSMCTRL = NAND_COMMAND;
  408. obSMDATALO = NAND_CMD_PROGRAM;
  409. obSMCTRL = NAND_ADDRESS;
  410. obSMDATALO = gwColAddress & 0xFF;
  411. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  412. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  413. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  414. if (gfRowAddr3Cycle)
  415. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  416. obSMCTRL = NAND_DATA;
  417. }
  418. #define Nand0WriteConfirm(void)
  419. {
  420. obSMCTRL = NAND_COMMAND;
  421. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  422. obSMCTRL = NAND_NORMAL;
  423. }
  424. #define Nand2KReadCopyBack(void)
  425. {
  426. obSMCTRL = NAND_COMMAND;
  427. obSMDATALO = NAND_CMD_READ;
  428. obSMCTRL = NAND_ADDRESS;
  429. obSMDATALO = gwColAddress & 0xFF;
  430. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  431. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  432. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  433. if (gfRowAddr3Cycle)
  434. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  435. obSMCTRL = NAND_COMMAND;
  436. obSMDATALO = NAND_CMD_READ_COPYBACK;
  437. obSMCTRL = NAND_DATA;
  438. }
  439. #define Nand2KWriteCopyBack(void)
  440. {
  441. obSMCTRL = NAND_COMMAND;
  442. obSMDATALO = NAND_CMD_COPYBACK_PROGRAM;
  443. obSMCTRL = NAND_ADDRESS;
  444. obSMDATALO = gwColAddress & 0xFF;
  445. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  446. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  447. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  448. if (gfRowAddr3Cycle)
  449. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  450. obSMCTRL = NAND_COMMAND;
  451. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  452. obSMCTRL = NAND_DATA;
  453. }
  454. #define Nand2KBlockErase(void)
  455. {
  456. obSMCTRL = NAND_COMMAND;
  457. obSMDATALO = NAND_CMD_BLOCK_ERASE;
  458. obSMCTRL = NAND_ADDRESS;
  459. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  460. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  461. if (gfRowAddr3Cycle)
  462. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  463. obSMCTRL = NAND_COMMAND;
  464. obSMDATALO = NAND_CMD_ERASE;
  465. obSMCTRL = NAND_NORMAL;
  466. }
  467. #define Nand0ReadStatus(void)
  468. {
  469. obSMCTRL = NAND_COMMAND;
  470. obSMDATALO = NAND_CMD_STS_READ;
  471. obSMCTRL = NAND_DATA;
  472. Nand0Ready();
  473. gxbNandStatus = obSMDATALO;
  474. obSMCTRL = NAND_NORMAL;
  475. }
  476. //******* AG **************************
  477. #define Nand0ReadStatus71(void)
  478. {
  479. obSMCTRL = NAND_COMMAND;
  480. obSMDATALO = NAND_CMD_STS_READ_71;
  481. obSMCTRL = NAND_DATA;
  482. Nand0Ready();
  483. gxbNandStatus = obSMDATALO;
  484. obSMCTRL = NAND_NORMAL;
  485. }
  486. //*************************************
  487. #define Set512PointerA()
  488. {
  489. obSMCTRL = NAND_COMMAND;
  490. obSMDATALO = NAND_CMD_READ;
  491. }
  492. #define Set512PointerB()
  493. {
  494. obSMCTRL = NAND_COMMAND;
  495. obSMDATALO = NAND_CMD_READ2;
  496. }
  497. #define Set512PointerC()
  498. {
  499. obSMCTRL = NAND_COMMAND;
  500. obSMDATALO = NAND_CMD_READ3;
  501. }
  502. #else
  503. //1 =============== Old Nand Flash Structure
  504. /*==========================================================================
  505. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  506. File: NandFlash.h
  507. content: 
  508. History: Created by David Chiu 2004/3/30
  509. ==========================================================================*/
  510. #ifdef _NAND_FLASH_H_
  511. #define EXTERN
  512. #else
  513. #define EXTERN extern
  514. #endif
  515. #if( _PM_PLAY_|_PM_MTP_) //for DRM add code model adjust //Nick061120 add _PM_MTP_
  516. #define L_S_MODEL_DEF large
  517. #else
  518. #define L_S_MODEL_DEF
  519. #endif
  520. //-------------------------------------------------------------------
  521. // Function prototype
  522. //-------------------------------------------------------------------
  523. //050407 allen
  524. //
  525. // USB API
  526. //
  527. EXTERN API void NandReadCapa(void);
  528. //EXTERN API bit NandFormatCapa(XBYTE type);//Yen_Lung050629 //Nick060530 mark it
  529. EXTERN API bit PhyAccessNand_pm(BYTE bType);
  530. EXTERN API bit EraseNandBlock(WORD wStartBlk, BYTE bBlkLen);
  531. EXTERN API bit UsbAccessDataSram(WORD wRaAddr, WORD wLen, bit fWrite);
  532. EXTERN API bit ReadSecurity(BYTE n);
  533. EXTERN API bit WriteSecurity(BYTE n) large; //Allen051102
  534. EXTERN API bit PhyBlockEraseAll(BYTE) large;//050323
  535. EXTERN API void PhyWriteConfig(void) large;
  536. EXTERN API void ReadBadBlock(BYTE bType);
  537. EXTERN API void GetIniDefectBlock(BYTE) large; //Allen051221#1
  538. EXTERN API void ReadDevice(void);
  539. EXTERN API bit DumpNandRawData() large; //Allen051124
  540. #if(_PM_REC_)
  541. EXTERN BOOL gfNandStepJobEn;
  542. #endif
  543. //Ted 0203 start
  544. #if(_PM_INIT_)
  545. EXTERN bit UpgradeBlock0(WORD wStorLba, PBYTE pbTempRedu) large;
  546. EXTERN void EraseBlock0(void);
  547. #endif
  548. //Ted 0203 end
  549. //
  550. // PM API
  551. //
  552. EXTERN API bit  NandInit(void);
  553. EXTERN API bit NandWrite(void);
  554. EXTERN API bit NandRead(void);
  555. EXTERN API bit NandFinishJob(void);
  556. EXTERN API bit NandStepJob(void); //allen050602#1
  557. EXTERN API void NandEraseBlock(WORD wLogBlk);
  558. EXTERN API void NandPowerOff(void);
  559. #if(USE_SPECIAL_REC_PRC) //Scott060607 Start
  560. EXTERN API void CallLUT0(BYTE bType) large;
  561. EXTERN API bit PhyWritePagefromSram(BYTE bStorPath, bit fConfirm, BYTE bLen) large;
  562. EXTERN API bit PhyReadPageToSram(BYTE bStorPath, BYTE bLen) large;
  563. EXTERN API void SetRowAddress(WORD wBlk,BYTE bPage);
  564. EXTERN API void ConvertZoneAddress(BYTE bZone);
  565. EXTERN API void PhyErase1Block(bit fCheckStatus) large;
  566. #endif //Scott060607 End
  567. //vicky050504#1
  568. EXTERN API void  NandInitPre(void);
  569. //
  570. // Nand Module use
  571. //
  572. EXTERN bit NandFlash0Read(void);
  573. EXTERN bit NandFlash0Write(void);
  574. //EXTERN bit Nand0LeftJob(BYTE) L_S_MODEL_DEF; 050729: local function, not API.
  575. //-------------------------------------------------------------------
  576. // Global variables and Extern global variables
  577. //-------------------------------------------------------------------
  578. //Scott061114 Start
  579. //#define RESTORE_BLK_POOL_SIZE 3 //Nick061120 mark it
  580. #define RESTORE_STEP_NUM 4
  581. #define FIXED_RESTORE_BLK 2
  582. #define SHIFT_PHYBLOCK_ZONE 10 //Nick061120
  583. #define MASK_PHYBLOCK_ZONE 0x3FF //Nick061120
  584. //Nick061120 start
  585. //NandRestore step define
  586. #define FullStep 1  //Restore a block with full step mode
  587. #define OneStep 2 //Restore a block with one step mode
  588. #define FinishAllBlk 3 //Restore all blocks with full step mode
  589. #define FisnishRemainStep 4  //finish restoring a block with one step mode
  590. #define PM_SCAN 0x80 //bit 7 use for disquitish scan PM or not //Nick061204
  591. //Nick061120 end
  592. EXTERN XBYTE gxbRestoreNewZone, gxbRestoreOrgZone;
  593. //Nick061120 start have been absolute addressed
  594. /*
  595. //Absolute addressing Start
  596. EXTERN XWORD gxwRestoreBlkPool[RESTORE_BLK_POOL_SIZE];
  597. EXTERN XBYTE gxbRestoreBlkNum;
  598. EXTERN XBYTE gxbCurrentRestoreStep;
  599. EXTERN XBYTE gxbRestoreCopy;
  600. EXTERN XBYTE gxbBFFlag;  
  601. EXTERN XWORD gxwRestoreNewBlk, gxwRestoreOrgBlk, gxwRestoreLogOrgBlk, gxwRestoreSetBlk; 
  602. EXTERN BOOL  gfNandRestoreFlag;  //find a BF_RESTORE block
  603. EXTERN XBYTE gxbNandRestoreFlag; //setting flag
  604. EXTERN XBYTE gxbRestoreSetPage;
  605. EXTERN BOOL  gfNandRestore; //if add a block to restore pool
  606. EXTERN XBYTE gxbRestoreCMD;
  607. //Absolute addressing End
  608. */
  609. //Scott061123 Start
  610. #if(_PM_INIT_CHK_|_PM_INIT_) //Scott061207
  611. EXTERN XWORD gxwRedu67[4];
  612. #endif
  613. //Scott061123 End
  614. //Nick061120 end
  615. //Scott061204 Start
  616. #if(_PM_INIT_)
  617. EXTERN API void RecoverNandReStore(void) large;
  618. #endif
  619. //Scott061204 End
  620. EXTERN API void ChkErr2BitSMReset() large; //Scott061205
  621. EXTERN API void AddRestoreBlk() large;  
  622. EXTERN API bit NandRestore() large;
  623. EXTERN API bit Batch0CopyBack(BYTE StartPage, BYTE EndPage) L_S_MODEL_DEF;
  624. //Scott061114 End
  625. #if(_PM_INIT_CHK_) //Scott061212
  626. EXTERN API void CheckNandReStore(void) large; 
  627. #endif
  628. EXTERN void ScanPM(void) large; //Nick061204  //NandRestore
  629. //EXTERN IDWORD gdwRowAddr; allen 050402: abs
  630. EXTERN void SM_Reset(void); //Nick061208
  631. #undef EXTERN
  632. //Vicky050323#3
  633. /*
  634. //GPIOB0
  635. #define SystemPowerOff() { obGPIOBDAT |= 0x01;
  636. obGPIOBDIR |= 0x01;
  637. }
  638. //redraw 7 times
  639. #define SystemPowerOn() { if(obGPIOBDAT&0x01)
  640. {
  641. obGPIOBDAT &= 0xFE;
  642. obGPIOBDIR |= 0x01;
  643. gbDrawUsbUi|=0x07;
  644. }
  645. }
  646. */
  647. //-------------------------------------------------------------------
  648. // Definition
  649. //-------------------------------------------------------------------
  650. //
  651. // Define NAND Command
  652. //
  653. #define NAND_CMD_READ 0x00
  654. #define NAND_CMD_READ2 0x01
  655. #define NAND_CMD_READ_DUMMY 0x03
  656. #define NAND_CMD_READ_CYCLE_2 0x30
  657. #define NAND_CMD_READ3 0x50
  658. #define NAND_CMD_READ_COPYBACK 0x35
  659. #define NAND_CMD_ID_READ 0x90
  660. #define NAND_CMD_ID_READ_EXT 0x91 //050303
  661. #define NAND_CMD_RESET 0xFF
  662. #define NAND_CMD_PROGRAM 0x80
  663. #define NAND_CMD_PROGRAM_CONFIRM 0x10
  664. #define NAND_CMD_PROGRAM_DUMMY 0x11
  665. #define NAND_CMD_PROGRAM_CACHE 0x15
  666. #define NAND_CMD_COPYBACK_PROGRAM 0x85
  667. #define NAND512_CMD_COPYBACK_PROGRAM 0x8A //NAND512
  668. #define NAND_CMD_BLOCK_ERASE 0x60
  669. #define NAND_CMD_ERASE 0xD0
  670. #define NAND_CMD_RANDOM_INPUT 0x85
  671. #define NAND_CMD_RANDOM_OUTPUT 0x05
  672. #define NAND_CMD_RANDOM_OUTPUT2 0xE0
  673. #define NAND_CMD_STS_READ 0x70
  674. #define NAND_CMD_STS_READ_71 0x71
  675. //-------------------------------------------------------------------
  676. // Macro define
  677. //-------------------------------------------------------------------
  678. //GPIOE[3]: SM_RDY => Nand0,1 share 1 wire
  679. #define Nand0Ready(void)
  680. {
  681. while (!(obSMCTRL & NAND_READY)) {}
  682. }
  683. /////////////////050303 start
  684. #define NandCmd(CMD)
  685. {
  686. obSMCTRL=NAND_COMMAND;
  687. obSMDATALO=CMD;
  688. obSMCTRL=NAND_NORMAL;
  689. }
  690. #define Nand2KAddr()
  691. {
  692. obSMCTRL = NAND_ADDRESS;
  693. obSMDATALO = gwColAddress & 0xFF;
  694. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  695. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  696. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  697. if (gfRowAddr3Cycle)
  698. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  699. obSMCTRL = NAND_DATA;
  700. }
  701. #define Nand2KRowAddr()
  702. {
  703. obSMCTRL = NAND_ADDRESS;
  704. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  705. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  706. if (gfRowAddr3Cycle)
  707. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  708. obSMCTRL = NAND_DATA;
  709. }
  710. #define Nand512Addr()
  711. {
  712. obSMCTRL = NAND_ADDRESS;
  713. obSMDATALO = 0x00;
  714. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  715. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  716. if(gfRowAddr3Cycle) 
  717. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  718. obSMCTRL = NAND_DATA;
  719. }
  720. #define Nand512RowAddr()
  721. {
  722. obSMCTRL = NAND_ADDRESS;
  723. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  724. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  725. if(gfRowAddr3Cycle) 
  726. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  727. obSMCTRL = NAND_DATA;
  728. }
  729. /////////////////050303 end
  730. //NAND512 start
  731. //041223 start: gwColAddress del
  732. #define Nand512Read1(void)
  733. {
  734. obSMCTRL = NAND_COMMAND;
  735. obSMDATALO = NAND_CMD_READ;
  736. obSMCTRL = NAND_ADDRESS;
  737. obSMDATALO = 0x00;
  738. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  739. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  740. if(gfRowAddr3Cycle)
  741. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  742. obSMCTRL = NAND_DATA;
  743. }
  744. #define Nand512Read2(void)
  745. {
  746. obSMCTRL = NAND_COMMAND;
  747. obSMDATALO = NAND_CMD_READ2;
  748. obSMCTRL = NAND_ADDRESS;
  749. obSMDATALO = 0x00;
  750. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  751. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  752. if(gfRowAddr3Cycle)
  753. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  754. obSMCTRL = NAND_DATA;
  755. }
  756. #define Nand512Read3(void)
  757. {
  758. obSMCTRL = NAND_COMMAND;
  759. obSMDATALO = NAND_CMD_READ3;
  760. obSMCTRL = NAND_ADDRESS;
  761. obSMDATALO = 0x00;
  762. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  763. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  764. if(gfRowAddr3Cycle)
  765. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  766. obSMCTRL = NAND_DATA;
  767. }
  768. #define Nand512Write(void)
  769. {
  770. obSMCTRL = NAND_COMMAND;
  771. obSMDATALO = NAND_CMD_PROGRAM;
  772. obSMCTRL = NAND_ADDRESS;
  773. obSMDATALO = 0x00;
  774. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  775. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  776. if(gfRowAddr3Cycle)
  777. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  778. obSMCTRL = NAND_DATA;
  779. }
  780. #define Nand512ReadCopyBack(void)
  781. {
  782. obSMCTRL = NAND_COMMAND;
  783. obSMDATALO = NAND_CMD_READ;
  784. obSMCTRL = NAND_ADDRESS;
  785. obSMDATALO = 0x00;
  786. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  787. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  788. if(gfRowAddr3Cycle)
  789. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  790. obSMCTRL = NAND_NORMAL;
  791. }
  792. #define Nand512WriteCopyBack(void)
  793. {
  794. obSMCTRL = NAND_COMMAND;
  795. obSMDATALO = NAND512_CMD_COPYBACK_PROGRAM;
  796. obSMCTRL = NAND_ADDRESS;
  797. obSMDATALO = 0x00;
  798. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  799. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  800. if(gfRowAddr3Cycle)
  801. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  802. obSMCTRL = NAND_COMMAND;
  803. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  804. obSMCTRL = NAND_DATA;
  805. }
  806. #define Nand512BlockErase(void)
  807. {
  808. obSMCTRL = NAND_COMMAND;
  809. obSMDATALO = NAND_CMD_BLOCK_ERASE;
  810. obSMCTRL = NAND_ADDRESS;
  811. obSMDATALO = *((BYTE *)&gdwRowAddr + 3);
  812. obSMDATALO = *((BYTE *)&gdwRowAddr + 2);
  813. if(gfRowAddr3Cycle)
  814. obSMDATALO=*((BYTE *)&gdwRowAddr + 1);
  815. obSMCTRL = NAND_COMMAND;
  816. obSMDATALO = NAND_CMD_ERASE;
  817. obSMCTRL = NAND_NORMAL;
  818. }
  819. //041223 end: gwColAddress del
  820. //NAND512 end
  821. #define Nand0Reset(void)
  822. {
  823. obSMCTRL = NAND_COMMAND;
  824. obSMDATALO = NAND_CMD_RESET;
  825. obSMCTRL = NAND_DATA;
  826. Nand0Ready();
  827. obSMCTRL = NAND_NORMAL;
  828. }
  829. #define Nand2KRead(void)
  830. {
  831. obSMCTRL = NAND_COMMAND;
  832. obSMDATALO = NAND_CMD_READ;
  833. obSMCTRL = NAND_ADDRESS;
  834. obSMDATALO = gwColAddress & 0xFF;
  835. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  836. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  837. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  838. if (gfRowAddr3Cycle)
  839. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  840. obSMCTRL = NAND_COMMAND;
  841. obSMDATALO = NAND_CMD_READ_CYCLE_2;
  842. obSMCTRL = NAND_DATA;
  843. }
  844. #define Nand2KWrite(void)
  845. {
  846. obSMCTRL = NAND_COMMAND;
  847. obSMDATALO = NAND_CMD_PROGRAM;
  848. obSMCTRL = NAND_ADDRESS;
  849. obSMDATALO = gwColAddress & 0xFF;
  850. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  851. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  852. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  853. if (gfRowAddr3Cycle)
  854. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  855. obSMCTRL = NAND_DATA;
  856. }
  857. #define Nand0WriteConfirm(void)
  858. {
  859. obSMCTRL = NAND_COMMAND;
  860. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  861. obSMCTRL = NAND_NORMAL;
  862. }
  863. #define Nand2KReadCopyBack(void)
  864. {
  865. obSMCTRL = NAND_COMMAND;
  866. obSMDATALO = NAND_CMD_READ;
  867. obSMCTRL = NAND_ADDRESS;
  868. obSMDATALO = gwColAddress & 0xFF;
  869. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  870. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  871. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  872. if (gfRowAddr3Cycle)
  873. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  874. obSMCTRL = NAND_COMMAND;
  875. obSMDATALO = NAND_CMD_READ_COPYBACK;
  876. obSMCTRL = NAND_DATA;
  877. }
  878. #define Nand2KWriteCopyBack(void)
  879. {
  880. obSMCTRL = NAND_COMMAND;
  881. obSMDATALO = NAND_CMD_COPYBACK_PROGRAM;
  882. obSMCTRL = NAND_ADDRESS;
  883. obSMDATALO = gwColAddress & 0xFF;
  884. obSMDATALO = (gwColAddress >> 8) & 0xFF;
  885. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  886. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  887. if (gfRowAddr3Cycle)
  888. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  889. obSMCTRL = NAND_COMMAND;
  890. obSMDATALO = NAND_CMD_PROGRAM_CONFIRM;
  891. obSMCTRL = NAND_DATA;
  892. }
  893. #define Nand2KBlockErase(void)
  894. {
  895. obSMCTRL = NAND_COMMAND;
  896. obSMDATALO = NAND_CMD_BLOCK_ERASE;
  897. obSMCTRL = NAND_ADDRESS;
  898. obSMDATALO = *((BYTE*)&gdwRowAddr+3);
  899. obSMDATALO = *((BYTE*)&gdwRowAddr+2);
  900. if (gfRowAddr3Cycle)
  901. obSMDATALO = *((BYTE*)&gdwRowAddr+1);
  902. obSMCTRL = NAND_COMMAND;
  903. obSMDATALO = NAND_CMD_ERASE;
  904. obSMCTRL = NAND_NORMAL;
  905. }
  906. #define Nand0ReadStatus(void)
  907. {
  908. obSMCTRL = NAND_COMMAND;
  909. obSMDATALO = NAND_CMD_STS_READ;
  910. obSMCTRL = NAND_DATA;
  911. Nand0Ready();
  912. gbNandStatus = obSMDATALO;
  913. obSMCTRL = NAND_NORMAL;
  914. }
  915. //******* AG **************************
  916. #define Nand0ReadStatus71(void)
  917. {
  918. obSMCTRL = NAND_COMMAND;
  919. obSMDATALO = NAND_CMD_STS_READ_71;
  920. obSMCTRL = NAND_DATA;
  921. Nand0Ready();
  922. gbNandStatus = obSMDATALO;
  923. obSMCTRL = NAND_NORMAL;
  924. }
  925. //*************************************
  926. #define Set512PointerA()
  927. {
  928. obSMCTRL = NAND_COMMAND;
  929. obSMDATALO = NAND_CMD_READ;
  930. }
  931. #define Set512PointerB()
  932. {
  933. obSMCTRL = NAND_COMMAND;
  934. obSMDATALO = NAND_CMD_READ2;
  935. }
  936. #define Set512PointerC()
  937. {
  938. obSMCTRL = NAND_COMMAND;
  939. obSMDATALO = NAND_CMD_READ3;
  940. }
  941. //2  For old nandflash to remove definition in new flash structure
  942. #define _NAND_API_RELOADWLC_ 0
  943. #define _NAND_API_RW_SETTING_ 0
  944. #endif