加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

S5PV210的NandFlash应用(一)

发布时间:2020-12-15 17:33:27 所属栏目:百科 来源:网络整理
导读:准备分析 ? ? ? ? 标题挂了一个(一),代表这个是涉及到NandFlash并不深入,只实现读操作。还是16k的代码,这次从NandFlash中读取,读到iRAM中地址为 0xD0024000 的地方。并调用main运行。如下图所示:( CPU会自动把B区代码拷贝到A区,我用A区代码从将B区
准备分析

? ? ? ? 标题挂了一个(一),代表这个是涉及到NandFlash并不深入,只实现读操作。还是16k的代码,这次从NandFlash中读取,读到iRAM中地址为 0xD0024000 的地方。并调用main运行。如下图所示:(CPU会自动把B区代码拷贝到A区,我用A区代码从将B区代码拷贝到C区,并调用main运行

? ? ? ??
资源工具

? ? ? ? 同《? S5PV210的LED应用(一)》
? ? ? ? NandFlash: K9GAG08U0F (2G)

着手写程序
? ? ? ? start.S中的代码拷贝很重要,Makefile中的链接地址很重要。

  1. /*?
  2. ?*?$Id:?nand_cp.c,v?1.1?2008/11/20?01:08:36?boyko?Exp?$?
  3. ?*?
  4. ?*?(C)?Copyright?2006?Samsung?Electronics?
  5. ?*?See?file?CREDITS?for?list?of?people?who?contributed?to?this?
  6. ?*?project.?
  7. ?*?
  8. ?*?This?program?is?free?software;?you?can?redistribute?it?and/or?
  9. ?*?modify?it?under?the?terms?of?the?GNU?General?Public?License?as?
  10. ?*?published?by?the?Free?Software?Foundation;?either?version?2?of?
  11. ?*?the?License,?or?(at?your?option)?any?later?version.?
  12. ?*?This?program?is?distributed?in?the?hope?that?it?will?be?useful,?
  13. ?*?but?WITHOUT?ANY?WARRANTY;?without?even?the?implied?warranty?of?
  14. ?*?MERCHANTABILITY?or?FITNESS?FOR?A?PARTICULAR?PURPOSE.??See?the?
  15. ?*?GNU?General?Public?License?for?more?details.?
  16. ?*?You?should?have?received?a?copy?of?the?GNU?General?Public?License?
  17. ?*?along?with?this?program;?if?not,?write?to?the?Free?Software?
  18. ?*?Foundation,?Inc.,?59?Temple?Place,?Suite?330,?Boston,?
  19. ?*?MA?02111-1307?USA?
  20. ?*/??
  21. ??
  22. ?*?You?must?make?sure?that?all?functions?in?this?file?are?designed?
  23. ?*?to?load?only?U-Boot?image.?
  24. ?*?So,?DO?NOT?USE?in?common?read.?
  25. ?*?By?scsuh.?
  26. ?*/??
  27. ??
  28. ??
  29. ?*?Standard?NAND?flash?commands?
  30. ?*/??
  31. #define?NAND_CMD_READ0??????0??
  32. #define?NAND_CMD_READ1??????1??
  33. #define?NAND_CMD_RNDOUT?????5??
  34. #define?NAND_CMD_PAGEPROG???0x10??
  35. #define?NAND_CMD_READOOB????0x50??
  36. #define?NAND_CMD_ERASE1?????0x60??
  37. #define?NAND_CMD_STATUS?????0x70??
  38. #define?NAND_CMD_STATUS_MULTI???0x71??
  39. #define?NAND_CMD_SEQIN??????0x80??
  40. #define?NAND_CMD_RNDIN??????0x85??
  41. #define?NAND_CMD_READID?????0x90??
  42. #define?NAND_CMD_PARAM??????0xec??
  43. #define?NAND_CMD_ERASE2?????0xd0??
  44. #define?NAND_CMD_RESET??????0xff??
  45. ??
  46. /*?Extended?commands?for?large?page?devices?*/??
  47. #define?NAND_CMD_READSTART??0x30??
  48. #define?NAND_CMD_RNDOUTSTART????0xE0??
  49. #define?NAND_CMD_CACHEDPROG?0x15??
  50. ??
  51. #define?NAND_DISABLE_CE()???(NFCONT_REG?|=?(1?<<?1))??
  52. #define?NAND_ENABLE_CE()????(NFCONT_REG?&=?~(1?<<?1))??
  53. #define?NF_TRANSRnB()???????do?{?while(!(NFSTAT_REG?&?(1?<<?0)));?}?while(0)??
  54. ??
  55. //#include?<asm/io.h>??
  56. //#include?<linux/mtd/nand.h>??
  57. #include?"s5pc110.h"??
  58. #define?COPY_BL2_SIZE???????0x80000??
  59. ??
  60. #define?NAND_CONTROL_ENABLE()???(NFCONT_REG?|=?(1?<<?0))??
  61. ??
  62. ?*?address?format?
  63. ?*??????????????17?16?????????9?8????????????0?
  64. ?*?--------------------------------------------?
  65. ?*?|?block(12bit)?|?page(5bit)?|?offset(9bit)?|?
  66. ?*/??
  67. ??
  68. static?int?nandll_read_page?(uchar?*buf,?ulong?addr,?int?large_block)??
  69. {??
  70. ????int?i;??
  71. ????int?page_size?=?512;??
  72. ??
  73. ????if?(1?==?large_block)??
  74. ????????page_size?=?2048;??
  75. ??????????
  76. ????else?if?(2?==?large_block)??
  77. ????????page_size?=?8192;??
  78. ??
  79. ????NAND_ENABLE_CE();??
  80. ??
  81. ????NFCMD_REG?=?NAND_CMD_READ0;??
  82. ??
  83. ????/*?Write?Address?*/??
  84. ????NFADDR_REG?=?0;??
  85. ??
  86. ????if?(large_block)??
  87. ????????NFADDR_REG?=?0;??
  88. ??
  89. ????NFADDR_REG?=?(addr)?&?0xff;??
  90. ????NFADDR_REG?=?(addr?>>?8)?&?0xff;??
  91. ????NFADDR_REG?=?(addr?>>?16)?&?0xff;??
  92. ??
  93. ????if?(large_block)??
  94. ????????NFCMD_REG?=?NAND_CMD_READSTART;??
  95. ??
  96. ????????NF_TRANSRnB();??
  97. ??
  98. ????/*?for?compatibility(2460).?u32?cannot?be?used.?by?scsuh?*/??
  99. ????for(i=0;?i?<?page_size;?i++)?{??
  100. ????????????????*buf++?=?NFDATA8_REG;??
  101. ????????}??
  102. ??
  103. ????????NAND_DISABLE_CE();??
  104. ????????return?0;??
  105. }??
  106. ??
  107. /*?
  108. ?*?Read?data?from?NAND.?
  109. ?*/??
  110. int?nandll_read_blocks?(ulong?dst_addr,?ulong?size,51); font-weight:bold">int?large_block)??
  111. {??
  112. ????uchar?*buf?=?(uchar?*)dst_addr;??
  113. ????int?i;??
  114. ????uint?page_shift?=?9;??
  115. ??
  116. ????if?(1?==?large_block)??
  117. ????{??
  118. ????????page_shift?=?11;??
  119. ??????
  120. ????????/*?Read?pages?*/??
  121. ????????for?(i?=?(0x6000>>page_shift);?i?<?(size>>page_shift);?i++,?buf+=(1<<page_shift))???
  122. ????????{??
  123. ????????????nandll_read_page(buf,?i,?large_block);??
  124. ????????}??
  125. ????}??
  126. ????if(2?==?large_block)??
  127. ????{??
  128. ????????page_shift?=?12;??
  129. ????????for?(i?=?0;?i?<?(size>>page_shift);?i++,?buf+=(1<<(page_shift-1)))???
  130. ????????{??
  131. ????????????????nandll_read_page(buf,?large_block);??
  132. ????????}??
  133. ????}??
  134. ??????????
  135. ????return?0;??
  136. }??
  137. ??
  138. int?copy_uboot_to_ram_nand?(void)??
  139. {??
  140. ????int?large_block?=?0;??
  141. ????int?i;??
  142. ????vu_char?id;??
  143. ??
  144. ????NAND_CONTROL_ENABLE();??
  145. ????????NAND_ENABLE_CE();??
  146. ????????NFCMD_REG?=?NAND_CMD_READID;??
  147. ????????NFADDR_REG?=??0x00;??
  148. ??
  149. ????/*?wait?for?a?while?*/??
  150. ????????for?(i=0;?i<200;?i++);??
  151. ????id?=?NFDATA8_REG;??
  152. ????id?=?NFDATA8_REG;??
  153. ??
  154. ????if?(id?>?0x80)??
  155. ????????large_block?=?1;??
  156. ??????????
  157. ????if(id?==?0xd5)??
  158. ????{??
  159. ????????large_block?=?2;??
  160. ????}??
  161. ??
  162. ????/*?read?NAND?Block.?
  163. ?????*?128KB?->240KB?because?of?U-Boot?size?increase.?by?scsuh?
  164. ?????*?So,?read?0x3c000?bytes?not?0x20000(128KB).?
  165. ?????*/??
  166. ????//return?nandll_read_blocks(CONFIG_SYS_TEXT_BASE,?COPY_BL2_SIZE,?large_block);??
  167. ????return?nandll_read_blocks(0xd0024000,?0x4000,?large_block);??
  168. }??
  169. void?board_init_f_nand(unsigned?long?bootflag)??
  170. {??
  171. ????????__attribute__((noreturn))?void?(*uboot)(void);??
  172. ????????copy_uboot_to_ram_nand();??
  173. ??
  174. ????????/*?Jump?to?U-Boot?image?*/??
  175. ????????uboot?=?(void?*)0xd024010;??
  176. ????(*uboot)();??
  177. ????????/*?Never?returns?Here?*/??
  178. }??
  1. @******************************************************************************??
  2. @?File:start.S??
  3. @?功能:启动代码,设置栈,拷贝16k到0xd0020000处??
  4. @******************************************************************************????
  5. .text??
  6. ??
  7. .global?_start??
  8. ??
  9. _start:??
  10. ??????
  11. ????ldr?sp,?=0xD0037D80???????@?设置栈,以便调用c函数???????????????????????
  12. ??????
  13. ????adr?r0,?_start????????????????@?重定位???
  14. ????????????????????????????@?_start当前所位于的地址:0xd0020010?(前边放有16bit的头信息)??
  15. ??????
  16. ????ldr?r1,?=_start???????????@?_start的链接地址:0xd0024010????
  17. ??????
  18. ????ldr?r2,?=0xd0028000???????@?0xd0028000?=?0xd0024000?+?0x4000(16k)???
  19. ????cmp?r0,?r1??
  20. ????beq?run_on_dram??
  21. ??
  22. ????bl??nand_asm_init??
  23. ????bl??copy_uboot_to_ram_nand??
  24. ??
  25. ??????
  26. run_on_dram:???????????????
  27. ????ldr?pc,?=main?????????????@?跳转????????
  28. ??
  29. ??
  30. halt:??
  31. ????b?halt??
  32. ??
  33. ??
  34. led_debug:???????
  35. ????ldr?????R0,=0xE0200280??????@?R0设为GPJ2CON寄存器。此寄存器??
  36. ????????????????????????????????????????@?用于选择端口J各引脚的功能:??
  37. ????????????????????????????????????????@?是输出、是输入、还是其他??
  38. ????mov?????R1,#0x00000001??????????
  39. ????str?????R1,[R0]?????????????@?设置GPJ2_0为输出口,?位[10:9]=0b01??
  40. ????ldr?????R0,=0xE0200284??????@?R0设为GPJ2DAT寄存器。此寄存器??
  41. ????????????????????????????????????????@?用于读/写端口GPJ2各引脚的数据??
  42. ????mov?????R1,#0x00000000??????@?此值改为0x00000001,??
  43. ????????????????????????????????????????@?可让LED1熄灭??
  44. ????str?????R1,[R0]?????????????@?GPJ2_0输出0,LED1点亮??
  45. ????mov?pc,?lr??
  46. ??
  47. ??
  48. ??
  49. ????/*?Setting?GPIO?for?NAND?*/??
  50. ????/*?This?setting?is?NAND?initialze?code?at?booting?time?in?iROM.?*/??
  51. ??????
  52. nand_asm_init:??
  53. ??????
  54. ?*?Nand?Interface?Init?for?SMDKC110?
  55. ?*/??
  56. ???
  57. #define?ELFIN_GPIO_BASE?????????0xE0200000???
  58. #define?ELFIN_NAND_BASE?????????0xB0E00000??
  59. #define?NFCONF_VAL??(7<<12)|(7<<8)|(7<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0)??
  60. #define?NFCONT_VAL??????(0x1<<23)|(0x1<<22)|(0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0x2<<1)|(1<<0)??
  61. ??
  62. #define?MP01CON_OFFSET??????????0x2E0??
  63. #define?MP01PUD_OFFSET??????????0x2E8??
  64. #define?MP03CON_OFFSET??????0x320??
  65. #define?MP03PUD_OFFSET??????0x328??
  66. #define?NFCONF_OFFSET???????0x00??
  67. #define?NFCONT_OFFSET???????0x04??
  68. ???
  69. ??
  70. ????ldr?r0,?=ELFIN_GPIO_BASE??
  71. ??
  72. ????ldr?r1,?[r0,?#MP01CON_OFFSET]??
  73. ????bic?r1,?r1,?#(0xf<<8)??
  74. ????orr?r1,?#(0x3<<8)??
  75. ????str?r1,?#MP01CON_OFFSET]??
  76. ??
  77. ????ldr?r1,?#MP01PUD_OFFSET]??
  78. ????bic?r1,?#(0x3<<4)??
  79. ????str?r1,?#MP01PUD_OFFSET]??
  80. ??
  81. ????ldr?r1,?#MP03CON_OFFSET]??
  82. ????bic?r1,?#0xFFFFFF??
  83. ????ldr?r2,?=0x22222222??
  84. ????orr?r1,?r2??
  85. ????str?r1,?#MP03CON_OFFSET]??
  86. ??
  87. ????ldr?r1,?#MP03PUD_OFFSET]??
  88. ????ldr?r2,?=0x3fff??
  89. ????bic?r1,?r2??
  90. ????str?r1,?#MP03PUD_OFFSET]??
  91. ??
  92. ????ldr?r0,?=ELFIN_NAND_BASE??
  93. ??
  94. ????ldr?r1,?#NFCONF_OFFSET]??
  95. ????ldr?r2,?=0x777F??
  96. ????bic?r1,?r2??
  97. ????ldr?r2,?=NFCONF_VAL??
  98. ????orr?r1,?#NFCONF_OFFSET]??
  99. ??
  100. ????ldr?r1,?#NFCONT_OFFSET]??
  101. ????ldr?r2,?=0x707C7??
  102. ????bic?r1,?r2??
  103. ????ldr?r2,?=NFCONT_VAL??
  104. ????orr?r1,?#NFCONT_OFFSET]??
  105. ??
  106. ????ldr?r1,?#NFCONF_OFFSET]??
  107. ????orr?r1,?#0x70??
  108. ????orr?r1,?#0x7700??
  109. ????str?????r1,?#NFCONT_OFFSET]??
  110. ????orr?r1,?#0x03??
  111. ????str?????r1,?#NFCONT_OFFSET]??
  112. ??
  113. ????mov?pc,?lr??
main.c
  1. #define?????GPJ2CON?????(*(volatile?unsigned?long?*)?0xE0200280)??
  2. #define?????GPJ2DAT?????(*(volatile?unsigned?long?*)?0xE0200284)??
  3. ??
  4. //?延时函数??
  5. void?delay(unsigned?long?count)??
  6. {??
  7. ????volatile?unsigned?long?i?=?count;??
  8. ????while?(i--)??
  9. ????????;??
  10. }??
  11. ??
  12. void?main()?????????????//LED?闪烁??
  13. {??
  14. ????GPJ2CON?=?0x00001111;???????//?配置引脚??
  15. ????while(1)????????????????????//?闪烁??
  16. ????{??
  17. ????????GPJ2DAT?=?0;????????????//?LED?on??
  18. ????????delay(0x100000);??
  19. ????????GPJ2DAT?=?0xf;??????????//?LED?off??
  20. ????????delay(0x100000);??
  21. ????}??
  22. }??

下载运行
? ? ? ? 同《? S5PV210的LED应用(一)》
运行调试
? ? ? ?
? ? ? ? 一开始以为程序会很难,应该MLC的,这样的NandFlash涉及到了ECC校验,颇为麻烦,但是细想,只实现读操作,会少许简单一些。最后发现读的时候问题并不多。也并不是那么困难。nand_asm_init和nand_cp.c提取于u-boot,并加以移植。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读