Tiny210(S5PV210) U-BOOT(五)----Nand Flash源码分析
发布时间:2020-12-15 17:53:21 所属栏目:百科 来源:网络整理
导读: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,片选信号
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共用一个引脚,上图中将各个信号线的复用引脚全部在左边用红色标注出来。
/*ELFIN_GPIO_BASE 0xE0200000*/ ldr r0,=ELFIN_GPIO_BASE /*Nand Flash nCE pin*/ ldr r1,[r0,#MP01CON_OFFSET] @0x2E0 bic r1,r1,#(0xf<<8) orr r1,#(0x3<<8) str r1,#MP01CON_OFFSET] @0x2E0将Port Group MP0_1 Control Register 的4-5位全部清为0 /*MP01PUD_OFFSET 0x2E8*/ ldr r1,#MP01PUD_OFFSET] bic r1,#(0x3<<4) str r1,#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 /*MP03CON_OFFSET 0x320*/ ldr r1,#MP03CON_OFFSET] bic r1,#0xFFFFFF ldr r2,=0x22222222 orr r1,r2 str r1,#MP03CON_OFFSET]将Port Group MP0_3 Control Register的0-23位全部清为0 Port Group MP0_3 Control Register (MP0_3PUD,Address = 0xE020_0328) /*MP03PUD_OFFSET 0x328*/ ldr r1,#MP03PUD_OFFSET] ldr r2,=0x3fff bic r1,#MP03PUD_OFFSET]2.3 配置Nandf Flash控制器的寄存器NFCONF Nand Flash Configuration Register (NFCONF,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*( +1)= 7.5ns >5ns 通过实际的测试,如果配置成最小值,Nand Flash会出现无法读写的情况,这里我们还是参考提供的Nand Flash的裸机的参考代码,将这三位配成1--4--1 +1)= 15ns >0ns 4 +1)= 15ns >37.5ns +1)= 15ns >5ns OK,符合我们的最小时序的要求,所以[7:4] ?1,[11:8] ?4,[12:15] ?1。 /*ELFIN_NAND_BASE 0xB0E00000*/ ldr r0,=ELFIN_NAND_BASE ldr r1,#NFCONF_OFFSET] ldr r2,=0x777F bic r1,r2 /* NFCONF_VAL (1<<12)|(4<<8)|(1<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */ ldr r2,=NFCONF_VAL orr r1,#NFCONF_OFFSET]ECC我们先不开,其余的全部配置为0,OK,到此,全部位配置完成。
第[0]位,让NAND Flash控制器Enable,这里设置为1。使能意思就是生效的意思。 剩下的几位,我没有设置,Nand Flash也没有出现问题,不过,为了谨慎期间,还是用三星的参考代码,全部设置上。OK,代码整理一下 ldr r1,#NFCONT_OFFSET] ldr r2,=0x707C7 bic r1,r2 /*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)*/ ldr r2,=NFCONT_VAL orr r1,r2 str r1,#NFCONT_OFFSET]OK,至此Nand Flash的低级初始化完成,代码整理如下: /* * Nand Interface Init for SMDKC110 */ nand_asm_init: /* Setting GPIO for NAND */ /* This setting is NAND initialze code at booting time in iROM. */ ldr r0,=ELFIN_GPIO_BASE ldr r1,#MP01CON_OFFSET] bic r1,#(0xf<<8) orr r1,#(0x3<<8) str r1,#MP01CON_OFFSET] /*MP01PUD_OFFSET 0x2E8*/ ldr r1,#MP01PUD_OFFSET] bic r1,#(0x3<<4) str r1,#MP01PUD_OFFSET] /*MP03CON_OFFSET 0x320*/ ldr r1,#MP03CON_OFFSET] bic r1,#0xFFFFFF ldr r2,=0x22222222 orr r1,r2 str r1,#MP03CON_OFFSET] /*MP03PUD_OFFSET 0x328*/ ldr r1,#MP03PUD_OFFSET] ldr r2,=0x3fff bic r1,#MP03PUD_OFFSET] /*ELFIN_NAND_BASE 0xB0E00000*/ ldr r0,=ELFIN_NAND_BASE ldr r1,#NFCONF_OFFSET] ldr r2,=0x777F bic r1,r2 /* NFCONF_VAL (0<<12)|(1<<8)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */ ldr r2,=NFCONF_VAL orr r1,#NFCONF_OFFSET] ldr r1,#NFCONT_OFFSET] ldr r2,=0x707C7 bic r1,r2 /*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)*/ ldr r2,=NFCONT_VAL orr r1,#NFCONT_OFFSET] mov pc,lrOK,下一步,开始去分析Nand Flash的代码搬移那一块的代码,看Nand Flash是如何工作的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |