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。

        /*ELFIN_GPIO_BASE 0xE0200000*/ldr    r0, =ELFIN_GPIO_BASE/*Nand Flash nCE pin*/ldr    r1, [r0, #MP01CON_OFFSET]  @0x2E0bic    r1, r1, #(0xf<<8)orr    r1, r1, #(0x3<<8)str    r1, [r0, #MP01CON_OFFSET] @0x2E0

将Port Group MP0_1 Control Register 的4-5位全部清为0

        /*MP01PUD_OFFSET 0x2E8*/ldr    r1, [r0, #MP01PUD_OFFSET]bic    r1, r1, #(0x3<<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

       /*MP03CON_OFFSET 0x320*/ldr    r1, [r0, #MP03CON_OFFSET]bic    r1, r1, #0xFFFFFFldr    r2, =0x22222222orr    r1, r1, r2str    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)

     /*MP03PUD_OFFSET 0x328*/ldr    r1, [r0, #MP03PUD_OFFSET]ldr    r2, =0x3fffbic    r1, r1, r2str    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

       /*ELFIN_NAND_BASE    0xB0E00000*/ldr    r0, =ELFIN_NAND_BASEldr    r1, [r0, #NFCONF_OFFSET]ldr    r2, =0x777Fbic    r1, r1, r2/* NFCONF_VAL    (1<<12)|(4<<8)|(1<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */ldr    r2, =NFCONF_VALorr    r1, r1, r2str    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,代码整理一下

ldr    r1, [r0, #NFCONT_OFFSET]
ldr    r2, =0x707C7
bic    r1, 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, r1, r2
str    r1, [r0, #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_BASEldr        r1, [r0, #MP01CON_OFFSET]
bic        r1, r1, #(0xf<<8)
orr        r1, r1, #(0x3<<8)
str        r1, [r0, #MP01CON_OFFSET]/*MP01PUD_OFFSET 0x2E8*/
ldr        r1, [r0, #MP01PUD_OFFSET]
bic        r1, r1, #(0x3<<4)
str        r1, [r0, #MP01PUD_OFFSET]/*MP03CON_OFFSET 0x320*/
ldr        r1, [r0, #MP03CON_OFFSET]
bic        r1, r1, #0xFFFFFF
ldr        r2, =0x22222222
orr        r1, r1, r2
str        r1, [r0, #MP03CON_OFFSET]/*MP03PUD_OFFSET 0x328*/
ldr        r1, [r0, #MP03PUD_OFFSET]
ldr        r2, =0x3fff
bic        r1, r1, r2
str        r1, [r0, #MP03PUD_OFFSET]/*ELFIN_NAND_BASE        0xB0E00000*/
ldr        r0, =ELFIN_NAND_BASEldr        r1, [r0, #NFCONF_OFFSET]
ldr        r2, =0x777F
bic        r1, r1, r2
/* NFCONF_VAL        (0<<12)|(1<<8)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(0<<0) */
ldr        r2, =NFCONF_VAL
orr        r1, r1, r2
str        r1, [r0, #NFCONF_OFFSET]ldr        r1, [r0, #NFCONT_OFFSET]
ldr        r2, =0x707C7
bic        r1, 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, r1, r2
str        r1, [r0, #NFCONT_OFFSET]mov        pc, lr

OK,下一步,开始去分析Nand Flash的代码搬移那一块的代码,看Nand Flash是如何工作的。

Tiny210(S5PV210) U-BOOT(五)----Nand Flash源码分析相关推荐

  1. Nand Flash源码分析(s5pv210)

    关于NAND Flash S5PV210的NAND Flash控制器有如下特点: 1) 支持512byte,2k,4k,8k的页大小 2) 通过各种软件模式来进行NAND Flash的读写擦除等 3) ...

  2. 第六章、Tiny4412 U-BOOT移植六 Nand Flash源码分析

    一.U-Boot参考源码 NandFlash的初始化代码我们放在board/samsung/tiny4412/lowlevel_init.S ,这一段代码是三星SMDK4212中没有提供的,所以我们需 ...

  3. Spring Boot - security 实战与源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.实现步骤 1.在application.yml中添加起步依赖 2.自定义安全类 package com.example.d ...

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

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

  5. Java源码详解五:ArrayList源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 构造函数 add操作 扩容函数 remove函数 subList函数 总结 本系列是Java详解,专栏地址:Java源码分析 ArrayList 官方文档:ArrayL ...

  6. Spring Boot 基于注解驱动源码分析--自动配置

    Spring作为Java开发最常用的容器管理框架,使用注解为我们提供很多便捷,下面通过源码分析Spring基于注解驱动自动配置的原理 首先介绍两个关键类: ConfigurationClassPost ...

  7. spring boot实战(第十篇)Spring boot Bean加载源码分析

    前言 前面的文章描述了Application对应Bean的创建,本篇将阐述spring boot中bean的创建过程 refresh 首先来看SpringApplication#run方法中refre ...

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

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

  9. LiteOS内核源码分析:位操作模块

    摘要:本文带领大家一起剖析了LiteOS位操作模块的源代码,代码非常简单,参考官方示例程序代码,实际编译运行一下,加深理解. 本文分享自华为云社区<LiteOS内核源码分析系列五 LiteOS内 ...

最新文章

  1. python保存变量_python – 在代码运行之间保存变量的数据
  2. 数据结构一:链表(linux链表)
  3. VALSE 视觉资源汇总(视频+PPT+文章解读,持续更新)
  4. PCIe是什么?PCIe标准和PCIe布线规则总结概述
  5. 面经——嵌入式软件工程师面试遇到的经典题目
  6. Flink万字干货:4大发展方向,美团、快手应用实践(PDF下载)
  7. 优达学城深度学习之六——TensorFlow卷积神经网络
  8. Docker学习总结(42)——Docker Compose 入门学习
  9. python Image 模块处理图片
  10. HTML做一个个人博客页面(纯html代码)
  11. easyui框架的使用,定制日历控件
  12. ppt讲解中的过渡_ppt过渡页的设计技巧
  13. Mac系统下替换百度云的倍速播放器-Quicktime player 的使用方法
  14. php中 不等运算符是,PHP中,不等运算符是
  15. EXCEL如何将平均值加减标准差设置为科学计数法显示
  16. 双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...
  17. Mac 中composer的安装
  18. 永恒之蓝病毒事件所引发的运维安全行业新思考
  19. diskpart命令磁盘分区
  20. 伯禹-公益AI学习打卡 Task02

热门文章

  1. 流氓软件“实名制” 午夜影院乔装正规军
  2. 【精品工具】几款好用的在线RGB、HEX颜色代码生成器
  3. 主题:一个中专生:我在华为面试的真实经历,转http://www.javaeye.com/topic
  4. 【Java分享客栈】我曾经的两个Java老师一个找不到工作了一个被迫转行了
  5. sentinel限流相关指标统计源码分析
  6. Nginx代理浏览器接口调用本地的后端接口
  7. 【小程序源码】简洁界面清爽让人非常舒服的一款短视频去印自带接口
  8. C++ 程序设计 week5 魔兽世界二: 装备
  9. people are able to buy the same products anywhere in the world
  10. 我陪你慢慢成长——苏子语录2015下半…