分享

Tiny210(S5PV210) U

 ProgramBird 2014-06-25
1.u-boot参考源码 
Nand Flash的初始化代码在board/samsung/tiny210/lowlevel_init.S 

2.初始化Nand Flash
在u-boot中,Nand的低级初始化在lowlevel_init.S中的nand_asm_init函数中。打开原理图,配置各个功能引脚----状态引脚R/nB, 读使能引用脚nRE, 片选信号nCE, 命令使能引脚CLE ,地址使能引脚ALE, 写使能引脚nWE。

搜索各个引脚的值,比如R/nB接在Xm0FRnB0上,搜索Xm0FRnB0,发现Xm0FRnB0和ONDXL_INT0/MP03_4共用一个引脚,上图中将各个信号线的复用引脚全部在左边用红色标注出来。
2.1配置片选信号引脚
查找到nCE接在复用引脚Xm0CSn2/NFCSn0/MP01_2上,打开S5PV210芯片手册,P185页查找到MP0_1 Control Registe,MP0_1CON[2]的配置如下:


所以,只需将这一位,配置成011,才能识别成Nand Flash。

  1.     /*ELFIN_GPIO_BASE 0xE0200000*/  
  2. ldr    r0, =ELFIN_GPIO_BASE  
  3.    
  4. /*Nand Flash nCE pin*/  
  5. ldr    r1, [r0, #MP01CON_OFFSET]  @0x2E0  
  6. bic    r1, r1, #(0xf<<8)  
  7. orr    r1, r1, #(0x3<<8)  
  8. str    r1, [r0, #MP01CON_OFFSET] @0x2E0  
将Port Group MP0_1 Control Register 的4-5位全部清为0


  1.     /*MP01PUD_OFFSET 0x2E8*/  
  2. ldr    r1, [r0, #MP01PUD_OFFSET]  
  3. bic    r1, r1, #(0x3<<4)  
  4. str    r1, [r0, #MP01PUD_OFFSET]  
我们的nCE片选信号是低电平有效,在电路图中,像我们的三星的原理图中,nXX表示低电平有效,而在TI的芯片手册中,XXn表示低电平有效,比如,上面的芯片手册中nCE表示低电平有效,而在TI的芯片手册中,则是CEn,表示的也是低电平片选信号有效,反正看到带n的引脚,即表示低电平有效。

2.2配置CLE/ALE/nWE/nRE/R/nB引脚
除开nCE引脚,其余的几个引脚都是复用的MP03,OK,一起配置,查找MP03,P189,Port Group MP0_3 Control Register,配置如下:
Port Group MP0_3 Control Register (MP0_3CON, R/W, Address = 0xE020_0320)


先将0-23位全部清零,然后全部置为0010,也就是全部置为2
  1.    /*MP03CON_OFFSET 0x320*/  
  2. ldr    r1, [r0, #MP03CON_OFFSET]  
  3. bic    r1, r1, #0xFFFFFF  
  4. ldr    r2, =0x22222222  
  5. orr    r1, r1, r2  
  6. str    r1, [r0, #MP03CON_OFFSET]  
将Port Group MP0_3 Control Register的0-23位全部清为0
Port Group MP0_3 Control Register (MP0_3PUD, R/W, Address = 0xE020_0328)

  1.  /*MP03PUD_OFFSET 0x328*/  
  2. ldr    r1, [r0, #MP03PUD_OFFSET]  
  3. ldr    r2, =0x3fff  
  4. bic    r1, r1, r2  
  5. str    r1, [r0, #MP03PUD_OFFSET]  
2.3 配置Nandf Flash控制器的寄存器NFCONF
Nand Flash Configuration Register (NFCONF, R/W, Address = 0xB0E0_0000) 
先看前四位[3:0]

[0]位保留,置为0。
[1]用来配置页的一个地址周期,这款K9F2G08UOB的page是2K,那么地址周期是多少,再去看K9F2G08UOB的芯片手册,看到第P6页

显示地址周期为5th,所以[1]配为1
先看[3],这里是配置是SLC还是MCL,根据芯片名称,这款K9F2G08UOB是SLC存储,所以[3]配为0
再来看[2],K9F2G08UOB是SLC,PageSize是2K,所以[2]配为0
整理,前四位配置为--0010。OK,继续配置。

这里多出了两个不认识的东西TWRPH1和TWRPH0。查看一下芯片手册上的NAND FLASH MEMORY TIMING, P693-P694

TACLS:当将CLE和ALE拉高以后,再过多少时间才能发出写使能信号(nWE)
TWRPH0:nWE使能持续时间,信号被拉低的时间
TWRPH1:当将CLE和ALE拉高以后,WE使能,这时,后面开始发数据,这就是数据起作用的时间(Data hold time)

TACLS是发给NAND FLASH的,所以去查看K9F2G08UOB的芯片手册,打开P17页,并没有显示出来CLE拉高后,经过多少时间nWE,将WE的信号拉低,根据下面的时序图,显示:

打开K9F2G08UOB的芯片手册,在P10页查找到各个pin脚在各个状态下的最小时间

OK,至此,三个最小时间查出来了,串口通讯中最麻烦的就是时序,OK,整理数据
TACLS = tCLS-tWP = 12 -12 =0
TWRPH0 = tWP = 12
TWRPH1 = tDH = 5
OK,现在再返回去看NFCONF寄存器里这几个bit的一个计算公式:

这里S5PV210的NandFlash的HCLK频率为133MHz(P363页),NFCON属于HCLKD0 = 133MHz,T = 1/133 = 7.5ns
TACLS:配置0,算出时间为7.5*(0+1)= 7.5ns >0ns
TWRPH0:配置1,算出时间为7.5*(1+1)= 15ns >12ns
TWRPH1:配置0,算出时间为7.5*(0+1)= 7.5ns >5ns
通过实际的测试,如果配置成最小值,Nand Flash会出现无法读写的情况,这里我们还是参考提供的Nand Flash的裸机的参考代码,将这三位配成1--4--1
TACLS:配置0,算出时间为7.5*(1+1)= 15ns >0ns
TWRPH0:配置1,算出时间为7.5*(4+1)= 15ns >37.5ns
TWRPH1:配置0,算出时间为7.5*(1+1)= 15ns >5ns

OK,符合我们的最小时序的要求,所以[7:4]  1,[11:8]  4,[12:15]  1
  1.    /*ELFIN_NAND_BASE    0xB0E00000*/  
  2. ldr    r0, =ELFIN_NAND_BASE  
  3.   
  4. ldr    r1, [r0, #NFCONF_OFFSET]  
  5. ldr    r2, =0x777F  
  6. bic    r1, r1, r2  
  7. /* NFCONF_VAL    (1<<12)|(4<<8)|(1<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */  
  8. ldr    r2, =NFCONF_VAL  
  9. orr    r1, r1, r2  
  10. str    r1, [r0, #NFCONF_OFFSET]  
ECC我们先不开,其余的全部配置为0,OK,到此,全部位配置完成。


2.4配置CONTROL REGISTER
 

(NFCONT, R/W, ADDRESS = 0XE720_0004)

第[0]位,让NAND Flash控制器Enable,这里设置为1。使能意思就是生效的意思。剩下的几位,我没有设置,Nand Flash也没有出现问题,不过,为了谨慎期间,还是用三星的参考代码,全部设置上。OK,代码整理一下
  1. ldr    r1, [r0, #NFCONT_OFFSET]  
  2. ldr    r2, =0x707C7  
  3. bic    r1, r1, r2  
  4. /*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)*/  
  5. ldr    r2, =NFCONT_VAL  
  6. orr    r1, r1, r2  
  7. str    r1, [r0, #NFCONT_OFFSET]  
OK,至此Nand Flash的低级初始化完成,代码整理如下:
  1. /*  
  2. * Nand Interface Init for SMDKC110  
  3. */  
  4. nand_asm_init:  
  5.   
  6. /* Setting GPIO for NAND */  
  7. /* This setting is NAND initialze code at booting time in iROM. */  
  8.   
  9. ldr        r0, =ELFIN_GPIO_BASE  
  10.   
  11. ldr        r1, [r0, #MP01CON_OFFSET]  
  12. bic        r1, r1, #(0xf<<8)  
  13. orr        r1, r1, #(0x3<<8)  
  14. str        r1, [r0, #MP01CON_OFFSET]  
  15.   
  16. /*MP01PUD_OFFSET 0x2E8*/  
  17. ldr        r1, [r0, #MP01PUD_OFFSET]  
  18. bic        r1, r1, #(0x3<<4)  
  19. str        r1, [r0, #MP01PUD_OFFSET]  
  20.   
  21. /*MP03CON_OFFSET 0x320*/   
  22. ldr        r1, [r0, #MP03CON_OFFSET]  
  23. bic        r1, r1, #0xFFFFFF  
  24. ldr        r2, =0x22222222  
  25. orr        r1, r1, r2  
  26. str        r1, [r0, #MP03CON_OFFSET]  
  27.   
  28. /*MP03PUD_OFFSET 0x328*/  
  29. ldr        r1, [r0, #MP03PUD_OFFSET]  
  30. ldr        r2, =0x3fff  
  31. bic        r1, r1, r2  
  32. str        r1, [r0, #MP03PUD_OFFSET]  
  33.   
  34. /*ELFIN_NAND_BASE        0xB0E00000*/  
  35. ldr        r0, =ELFIN_NAND_BASE  
  36.   
  37. ldr        r1, [r0, #NFCONF_OFFSET]  
  38. ldr        r2, =0x777F  
  39. bic        r1, r1, r2  
  40. /* NFCONF_VAL        (0<<12)|(1<<8)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */  
  41. ldr        r2, =NFCONF_VAL  
  42. orr        r1, r1, r2  
  43. str        r1, [r0, #NFCONF_OFFSET]  
  44.   
  45. ldr        r1, [r0, #NFCONT_OFFSET]  
  46. ldr        r2, =0x707C7  
  47. bic        r1, r1, r2  
  48. /*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)*/  
  49. ldr        r2, =NFCONT_VAL  
  50. orr        r1, r1, r2  
  51. str        r1, [r0, #NFCONT_OFFSET]  
  52.   
  53. mov        pc, lr  
OK,下一步,开始去分析Nand Flash的代码搬移那一块的代码,看Nand Flash是如何工作的。





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多