一、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源码分析相关推荐

  1. Spring Boot Dubbo 应用启停源码分析

    作者:张乎兴 来源:Dubbo官方博客 背景介绍 Dubbo Spring Boot 工程致力于简化 Dubbo RPC 框架在Spring Boot应用场景的开发.同时也整合了 Spring Boo ...

  2. Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    转载自   Spring Boot 2.x 启动全过程源码分析(上)入口类剖析 Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boo ...

  3. Spring Boot 2.x 启动全过程源码分析(全)

    上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入口类 SpringApplication 的源码,并知道了其构造原理,这篇我 ...

  4. 深入理解Spark 2.1 Core (六):Standalone模式运行的原理与源码分析

    我们讲到了如何启动Master和Worker,还讲到了如何回收资源.但是,我们没有将AppClient是如何启动的,其实它们的启动也涉及到了资源是如何调度的.这篇博文,我们就来讲一下AppClient ...

  5. 【SpringCloud微服务】第3章 服务治理SpringCloudEureka(五)——Eureka源码分析

    2.8 Eureka 源码分析   首先,对于服务注册中心.服务提供者.服务消费者这三个主要元素来说,后两者(也就是Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者,而注册中心主要是处 ...

  6. Retrofit源码分析实践(六)【Retrofit 多BaseUrl问题解决】

    Retrofit源码分析&实践系列文章目录 Retrofit源码分析&实践(一)[从使用入手分析源码] Retrofit源码分析&实践(二)[Retrofit 免费的api测试 ...

  7. Netty源码分析第6章(解码器)----第4节: 分隔符解码器

    Netty源码分析第6章(解码器)---->第4节: 分隔符解码器 Netty源码分析第六章: 解码器 第四节: 分隔符解码器 基于分隔符解码器DelimiterBasedFrameDecode ...

  8. spring boot实战(第六篇)加载application资源文件源码分析

    前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的. ConfigFileApplicationLis ...

  9. STM32毕业设计——基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码)——六足机器人控制系统

    基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+JAVA+Android的六足机器人控制系统设计与实现,文章末尾附有 ...

最新文章

  1. Spring Boot与Web开发简介||SpringBoot对静态资源的映射规则
  2. 数据结构与算法(3)——树(二叉、二叉搜索树)
  3. HDU - 5572 An Easy Physics Problem(几何-碰撞问题)
  4. 400+的考研复试线怎么玩???满屏都是400+?今年国家线会涨吗?
  5. 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
  6. IDEA无法加载log文件
  7. sql unicode转中文_SELECT语句《SQL必知必会》
  8. java基础—对一个字符串中的数值进行从小到大的排序
  9. JVM优化系列-Stop-The-World实战
  10. 一致性Hash简单介绍和使用
  11. 51nod 1605:棋盘问题
  12. H.264 sequence parameter sets成员值含义学习笔记
  13. 揭示行业返修机背后的深层次问题
  14. y空间兑换代码_如何让Python代码加速运行?
  15. 工程控制论 理论概况
  16. *.LDB文件介绍(转)
  17. 修改jupyter notebook中的tensorflow版本
  18. 提问的智慧-如何明智到找到想要的答案
  19. MPAndroidChart使用(BarChart为例)
  20. 【IoT】NFC 之 M1 非接触式 IC 卡性能浅析(S50)

热门文章

  1. Superset可视化之制作地图
  2. 技术晨读_2014_9_1
  3. 一位码农的憧憬与迷茫
  4. 安装 deepin系统 实现windows和deepin双系统
  5. deepin系统安装nginx
  6. 关于大图片裁剪在华为等手机上无法使用问题
  7. mysql orderby asc_MySQL 数据排序 order by
  8. 打破国外垄断 数字音频国家标准DRA颁布
  9. aoc显示器2k165hz测试
  10. 微软需要Twitter来对抗Google