关闭

基于mini2440 的 bootloader 设计 ---- 8、NandFlash 初始化

标签: arm9bootloadermini2440
214人阅读 评论(0) 收藏 举报
分类:

开发环境:

               电脑系统:RedHat Enterprise Linux6   kernel version : linux-2.6.32

               交叉工具链:arm-linux-xxx4.3.2 

               开发板版本:mini2440 S3C2440处理器  64M SDRAM   256M nand flash

      前面介绍了C程序运行环境的建立,并且完成了从汇编代码中跳转到C 程序继续执行的功能。本章开始将使用C程序对板载资源进行初始化。本章实现的初始化工作如题所示:nandflash 的初始化。我们会在一个C程序对nandflash进行初始化函数的编写,然后在汇编程序中调用该C程序,当然也可以在C程序中调用该初始化函数。这里纯粹是为了验证之前学习的汇编中调用C程序的知识。
一、背景知识
        在进行编码工作之前,还是先对相应的背景知识进行介绍。这里的背景知识保括:nand flash 的硬件结构介绍、nandflash与CPU 的连接方式、CPU对nandflash 的访问方式。
1、nand flash 的硬件结构介绍。
      下图是一块nand flash 芯片的存储示意图:


      由图中可以看出,nandflash 芯片的基本存储单元是一个page(页),每个page 的大小为2k(不同芯片可能不同),而一块nandflash 芯片分为若干个block(块),每个block 又分为若干个page。这样一块nand flash 的存储容量就可以算出来了:容量 = 块数*每块的页数*每页的字节数。
     由图还可以看出,没页都会64 bytes 的头,这个头存储的是这个页的一些信息,如校验信息等等。
2、nandflash 与CPU 的连接方式
      不同的开发板nandflash 与CPU的连接方式可能不同,但是原理是相通的。即,所有的nandflash 芯片都是由CPU 内部的nand控制器直接控制,CPU核仅仅完成控制器的初始化,当需要读写nand时,CPU 通过控制器操作nandflash,控制器完成读写数据后将数据存储在寄存器中,CPU 核直接从寄存器中读写数据即可。
     需要注意的是,Nandflash 芯片的编址方式不同于内存芯片的统一编址,而是采用独立编址。也就是说,nandflash里的地址信息不在CPU 的4GB寻址空间里。
      下图是笔者开发板nandflash 的底板原理图:


      可以看出:nand芯片仅仅是通过7根数据线和几根控制线与CPU相连。数据线事实上也会跑地址,而控制线是由CPU内部的寄存器控制的。通过查看nand芯片的操作时序图可以完成读写芯片的工作。
3、CPU对nandflash 的访问方式
      CPU对nand的访问分为两种:按页访问和随机访问。顾名思义,按页访问就是每次读写的数据大小都是一页。而随机访问就是每次读写都是一个字节。本文实现的是按页访问。
      从代码的角度来看,CPU对nandflash 的访问实际上是由CPU内部的Nand控制器完成的,CPU只需要设置好相应的寄存器即可。当然设置寄存器的流程就应该根据nand芯片的操作时序图来实现。如按页读的时序图就如下:



数据和地址从I/Ox发出或者接收,在控制信号的控制下,I/O线上的数据先后发出或者接收。根据该时序图,可以编写相应的代码。
二、代码实现
      介绍了nandflash 的相应背景知识后就可以开始编写相应的代码了。当然编写代码的依据就是数据手册提供的时序图。本文实现的代码位于:点击打开链接
在dev/目录下有一个nand.c的文件,该文件实现了nandflash 的一些基本操作,如按页读写数据,从nandflash 加载bootloader 到内存中。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9128次
    • 积分:409
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论