第六章、Tiny4412 U-BOOT移植六 Nand Flash源码分析
一、U-Boot参考源码
NandFlash的初始化代码我们放在board/samsung/tiny4412/lowlevel_init.S ,这一段代码是三星SMDK4212中没有提供的,所以我们需要自己写。我们在里面增加一个函数叫nand_asm_init。当然,由于Nand Flash的操作是有一定的规律的,所以,我们可以去别的地方找一段写好的NandFlash源码,然后根据自己的电路原理图进行移植即可。
二、代码分析
1、初始化Nand Flash
打开原理图,参看原理图配置各个功能引脚----状态引脚R/nB,读使能引用脚nRE,片选信号nCE,命令使能引脚CLE,地址使能引脚ALE,写使能引脚nWE。
图6-1、NANDFlash 电路连接原理截图
搜索各个引脚的值,比如R/nB接在Xm0FRnB0上,搜索Xm0FRnB0,发现Xm0FRnB0和OND_INT0/MP02_2共用一个引脚,如上图中将各个信号线的复用引脚所示。
1.1、配置片选信号引脚
上面说过,由于各个引脚的功能都是复用的,所以需要在一些相关的寄存器中,进行设置,让其功能固定、
首先查找到nCE接在复用引脚Xm0CSn0/NF_CSn2/MP00_0上,打开Exynos4412芯片手册开始查找,妹呀!找了半天才找到这个相关的寄存器,名字叫做GPY0CON,而不是像S5PV210中叫GPYM0什么的。
如下图中所示,GPY0CON[3:0]位对应着NF_CSn2的功能,所以这一们需设置成0x03着先将这一位置0后设置,同时,对GPY0CONPDN进行设置,不使能其内部上下拉功能。
表6-1、GPY0CON寄存器设置说明
代码如下,里同我已做了相关注释。
nand_asm_init:
/*Setting GPIO for NAND */
/*This setting is NAND initialze code at booting time in iROM. */
@0x11000000is the base address
ldr r0, =0x11000000
@ nCEset
ldr r1, [r0, #MP01CON_OFFSET] @0x0120 is GPY0CONregister
bic r1, r1, #0xf @(0xf<<8) set zero
orr r1, r1, #0x3 @(0x3<<8) set nCE chip enable
str r1, [r0, #MP01CON_OFFSET]
@setEBI_WEn EBI_OEn nCE/NF_CSN[2]
ldr r2, =0x220003
str r2, [r0, #MP01CON_OFFSET]
表6-2、GPY0PUD寄存器设置说明
我们的nCE片选信号是低电平有效,在电路图中,像我们的三星的原理图中,nXX表示低电平有效,而在TI的芯片手册中,XXn表示低电平有效,比如,上面的芯片手册中nCE表示低电平有效,而在TI的芯片手册中,则是CEn,表示的也是低电平片选信号有效,反正看到带n的引脚,即表示低电平有效。
接着使能,将其最后两位清零:
@ 0x0 =Disables Pull-up/Pull-down ///nCE is disable
ldr r1, [r0, #MP01PUD_OFFSET] @0x128 is
bic r1, r1, #0x3
str r1, [r0, #MP01PUD_OFFSET]
1.2、配置CLE/ALE/nWE/nRE/R/nB引脚
除开nCE引脚,其余的几个引脚都是复用的寄存器是6.2.3.55GPY2CON,可以查看其寄存器主明进行配置如下。其相关位置0x0160。其配置代码如下,代码中我已做了相关注释,这里不在截图说明。
ldr r1, [r0, #MP03CON_OFFSET]
bic r1, r1, #0xFFFFFF
ldr r2, =0x22222222
orr r1, r1, r2
str r1, [r0, #MP03CON_OFFSET]
将PortGroup MP0_3 Control Register的0-23位全部清为0
PortGroup MP0_3 Control Register (MP0_3PUD, R/W, Address = 0xE020_0328)
@MP03CON_OFFSET'soffset is 0x160
ldr r1, [r0, #MP03CON_OFFSET]
@cleanto zero
bic r1, r1, #0xFFFFFF
@setNF_CLE/NF_ALE/NF_RnB0
ldr r2, =0x222
orr r1, r1, r2
str r1, [r0, #MP03CON_OFFSET]
@disenablethe pull-up/pull-down
ldr r1, [r0, #MP03PUD_OFFSET]
ldr r2, =0x3fff
bic r1, r1, r2
str r1, [r0, #MP03PUD_OFFSET]
1.3、配置Nandf Flash控制器的寄存器NFCONF
这些寄存器的设置在chapter20大家可以去那里开始搜吧。
NandFlash Configuration Register (NFCONF, R/W, Address =0x0CE0_0000)
先看最前面四位[3:0]
表6-3、NFCONF寄存器设置说明
[0]位保留,置为0。
[1]用来配置页的一个地址周期,这款K9GAG08U0E的page是8K,那么地址周期是多少,再去K9GAG08U0E的芯片手册,看到第P9页,如下表5-4所示:
表6-4、地址发送时序说明表
可见,其地址周期为5th,所以[1]配为1。
接着看[3:2],这两位是配置页面大小的,怎么看也没有8k的嘛,不会是友善公司搞错了吧,搞了个不兼容的芯片,怪不没有焊接上,而是用eMMC呢,不过Flash外部引脚很多都是可以兼容的,找一片能兼容的来替代K9GAG08U0E也应是可以的,只是要根据新的芯片手册来设置这几个值了。不过手册上这一位里也有说明,就是NFCON不考虑实际的Flash的页面大小,由软件去负责处理,这么说,难道也是可以的,这里暂时先不管,将共设置成4K,所以这一位设置成10。所以前四位配置为--1010。
OK,继续配置。
表6-5、NFCONF寄存器设置说明
上面,多出了两个不认识的东西TWRPH1和TWRPH0。查看一下芯片手册上的NANDFLASH MEMORY TIMING,在P1120页有下图6-2。
图6-2、CLE等信号时序说明图
TACLS:当将CLE和ALE拉高以后,再过多少时间才能发出写使能信号(nWE)
TWRPH0:nWE使能持续时间,信号被拉低的时间,即信号nWE的有效时间
TWRPH1:当将CLE和ALE拉高以后,WE使能,这时,后面开始发数据,那么这段数据起作用的时间(Datahold time)即是TWRPH1
TACLS是发给NANDFLASH的,所以去查看K9GAG08U0E的芯片手册,打开P27页,并没有显示出来CLE拉高后,经过多少时间nWE,将WE的信号拉低,根据下面的时序图5-3显示。
图6-3、NAND FLASH 时序图
打开K9GAG08U0E的芯片手册,在P19页查找到各个pin脚在各个状态下的最小时间如下表5-6所示
表6-6、NANDFLASH 时序图时间表
OK,至此,三个最小时间查出来了,串口通讯中最麻烦的就是时序,OK,整理数据
TACLS= tCLS-tWP = 15 -15 =0
TWRPH0= tWP = 15
TWRPH1= tDH = 5
OK,现在再返回去看NFCONF寄存器里这几个bit的一个计算公式:
这里Tiny4412的NandFlash的HCLK频率为133MHz(P363页),NFCON属于HCLKD0= 133MHz,T = 1/133 = 7.5ns
TACLS:配置1,算出时间为7.5*(1)=7.5ns >0ns
TWRPH0:配置3,算出时间为7.5*(3+1)=30ns >15ns
TWRPH1:配置0,算出时间为7.5*(0+1)=7.5ns >5ns
当然这个几个值的设置,还需实际的测试试试,如果配置成最小值,有可能出现NandFlash无法读写的情况,这里我们还是参考提供的NandFlash的裸机的参考代码,将这三位配成7-7-7或者1-4-1。
TACLS:配置0,算出时间为7.5*7=52.5ns >0ns
TWRPH0:配置1,算出时间为7.5*(7+1)=60ns >15ns
TWRPH1:配置0,算出时间为7.5*(7+1)=60ns >5ns
OK,符合我们的最小时序的要求,所以[7:4] 7,[11:8] 7,[12:15] 7。
@setNFCONF chapter 20
@ELFIN_NAND_BASE = ELFIN_NAND_BASE
ldr r0, =ELFIN_NAND_BASE
ldr r1, [r0, #NFCONF_OFFSET]
ldr r2, =0x7772
bic r1, r1, r2
@NFCONF_VAL(7<<12)|(7<<8)|(7<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0)
ldr r2, =NFCONF_VAL
orr r1, r1, r2
str r1, [r0, #NFCONF_OFFSET]
ECC我们保持其初始值0,即1bitECC,其余的全部配置为0,OK,到此,全部位配置完成。
1.4、配置CONTROL REGISTER
表6-7、NFCONF寄存器设置说明
20.6.2.2NFCONT
BaseAddress: 0x0CE0_0000
Address = Base Address + 0x0004, ResetValue = 0x00C1_00C6
第[0]位,让NANDFlash控制器Enable,这里设置为1。使能意思就是生效的意思。剩下的几位,我没有设置,NandFlash也没有出现问题,不过,为了谨慎期间,还是要参考用三星的提供的参考代码,全部设置上。OK,代码整理一下
@NFCONT_VALNFCONT_VAL (0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0x3<<1)|(1<<0)
ldr r1, [r0, #NFCONT_OFFSET]
ldr r2, =0x6
bic r1, r1, r2
ldr r2, =NFCONT_VAL
orr r1, r1, r2
str r1, [r0, #NFCONT_OFFSET]
@ why set nCE again
ldr r1, [r0, #MP01CON_OFFSET]
bic r1, r1, #0xF @(0xf<<8)
orr r1, r1, #0x3 @(0x3<<8)
str r1, [r0, #MP01CON_OFFSET]
mov pc, lr// function return
OK,至此NandFlash的低级初始化完成,代码整理如下:
/*************************************addby zth**************************/
/*
*Nand Interface Init for SMDKC100
*/
.globlnand_asm_init
nand_asm_init:
/*Setting GPIO for NAND */
/*This setting is NAND initialze code at booting time in iROM. */
@0x11000000is the base address
ldr r0, =0x11000000
@ nCE set
ldr r1, [r0, #MP01CON_OFFSET] @0x0120 is GPY0CONregister
bic r1, r1, #(0xf<<8) @(0xf) set zero
orr r1, r1, #(0x3<<8) @(0x3) set nCE chip enable
str r1, [r0, #MP01CON_OFFSET]
@set EBI_WEn EBI_OEn nCE/NF_CSN[2]
ldr r2, =0x220300 @=0x220003
str r2, [r0, #MP01CON_OFFSET]
@ 0x0 = Disables Pull-up/Pull-down///nCE is disable
ldr r1, [r0, #MP01PUD_OFFSET] @0x128 is
bic r1, r1, #(0x3<<4) @#0x3
str r1, [r0, #MP01PUD_OFFSET]
@MP03CON_OFFSET's offset is 0x160
ldr r1, [r0, #MP03CON_OFFSET]
@clean to zero
bic r1, r1, #0xFFFFFF
@set NF_CLE/NF_ALE/NF_RnB0
ldr r2, =0x222
orr r1, r1, r2
str r1, [r0, #MP03CON_OFFSET]
@disenable the pull-up/pull-down
ldr r1, [r0, #MP03PUD_OFFSET]
ldr r2, =0x3fff
bic r1, r1, r2
str r1, [r0, #MP03PUD_OFFSET]
/*******************************************/
@set NFCONF chapter 20
@ELFIN_NAND_BASE = ELFIN_NAND_BASE
ldr r0, =ELFIN_NAND_BASE
ldr r1, [r0, #NFCONF_OFFSET]
ldr r2, =0x7772
bic r1, r1, r2
@NFCONF_VAL(7<<12)|(7<<8)|(7<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0)
ldr r2, =NFCONF_VAL
orr r1, r1, r2
str r1, [r0, #NFCONF_OFFSET]
@NFCONT_VAL NFCONT_VAL (0<<18)|(0<<17)|(0<<16)|(0<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0x3<<1)|(1<<0)
ldr r1, [r0, #NFCONT_OFFSET]
ldr r2, =0x6
bic r1, r1, r2
ldr r2, =NFCONT_VAL
orr r1, r1, r2
str r1, [r0, #NFCONT_OFFSET]
@ why set nCE again
ldr r1, [r0, #MP01CON_OFFSET]
bic r1, r1, #(0xf<<8) @(0xf)
orr r1, r1, #(0x3<<8) @(0x3)
str r1, [r0, #MP01CON_OFFSET]
mov pc, lr @ function return
/*************************************addby zth**************************/
第六章、Tiny4412 U-BOOT移植六 Nand Flash源码分析相关推荐
- Spring Boot Dubbo 应用启停源码分析
作者:张乎兴 来源:Dubbo官方博客 背景介绍 Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发.同时也整合了 Spring Boo ...
- Spring Boot 2.x 启动全过程源码分析(上)入口类剖析
转载自 Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...
- Spring Boot 2.x 启动全过程源码分析(全)
上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...
- 深入理解Spark 2.1 Core (六):Standalone模式运行的原理与源码分析
我们讲到了如何启动Master和Worker,还讲到了如何回收资源.但是,我们没有将AppClient是如何启动的,其实它们的启动也涉及到了资源是如何调度的.这篇博文,我们就来讲一下AppClient ...
- 【SpringCloud微服务】第3章 服务治理SpringCloudEureka(五)——Eureka源码分析
2.8 Eureka 源码分析 首先,对于服务注册中心.服务提供者.服务消费者这三个主要元素来说,后两者(也就是Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者,而注册中心主要是处 ...
- Retrofit源码分析实践(六)【Retrofit 多BaseUrl问题解决】
Retrofit源码分析&实践系列文章目录 Retrofit源码分析&实践(一)[从使用入手分析源码] Retrofit源码分析&实践(二)[Retrofit 免费的api测试 ...
- Netty源码分析第6章(解码器)----第4节: 分隔符解码器
Netty源码分析第6章(解码器)---->第4节: 分隔符解码器 Netty源码分析第六章: 解码器 第四节: 分隔符解码器 基于分隔符解码器DelimiterBasedFrameDecode ...
- spring boot实战(第六篇)加载application资源文件源码分析
前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的. ConfigFileApplicationLis ...
- STM32毕业设计——基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码)——六足机器人控制系统
基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+JAVA+Android的六足机器人控制系统设计与实现,文章末尾附有 ...
最新文章
- Spring Boot与Web开发简介||SpringBoot对静态资源的映射规则
- 数据结构与算法(3)——树(二叉、二叉搜索树)
- HDU - 5572 An Easy Physics Problem(几何-碰撞问题)
- 400+的考研复试线怎么玩???满屏都是400+?今年国家线会涨吗?
- 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
- IDEA无法加载log文件
- sql unicode转中文_SELECT语句《SQL必知必会》
- java基础—对一个字符串中的数值进行从小到大的排序
- JVM优化系列-Stop-The-World实战
- 一致性Hash简单介绍和使用
- 51nod 1605:棋盘问题
- H.264 sequence parameter sets成员值含义学习笔记
- 揭示行业返修机背后的深层次问题
- y空间兑换代码_如何让Python代码加速运行?
- 工程控制论 理论概况
- *.LDB文件介绍(转)
- 修改jupyter notebook中的tensorflow版本
- 提问的智慧-如何明智到找到想要的答案
- MPAndroidChart使用(BarChart为例)
- 【IoT】NFC 之 M1 非接触式 IC 卡性能浅析(S50)