新闻中心

EEPW首页 > 电源与新能源 > 设计应用 > U-Boot从NAND Flash启动的实现

U-Boot从NAND Flash启动的实现

作者:时间:2010-08-05来源:网络收藏

2 支持的代码修改
2.1 添加 Hash的初始化函数
中关于 Hash的初始化流程如下:在上电后最先运行的汇编程序cpu\arm920t\start.S中调用start_armboot函数,而star-t_armboot该函数则调用了一系列的关于设备的初始化函数。这一系列的函数中包含一个名为nand_init的函数,nand_init就是完成NAND Ha-sh的初始化工作。
在1.1.6版本的的include\linux\mtd\nand.h中定义了nand_chip结构体,该结构体中定义了关于NAND Hash操作的所有函数,包括读、写、ECC校验等,而这些函数在中都有完整编写,只是有些个别函数需要根据自己的要求重新编写。而NAND 初始化的nand_init函数主要任务就是完成这些需要重新编写的函数和用这些函数连同U-Boot中其他默认函数来初始化nand_chip结构体。NAND-_init中的board_nand_init函数在U-Boot中并未,显然需要重新编写的函数就在其内添加。
先在cpu\arm920t\s3c24x0中添加nand.c文件,然后在该文件中所需要的初始化函数。一般只需要重新编写nand_ehip结构体中相对应的hweontrol、dev_ready和select_chip函数。这些函数的构建可参照linux内核2.6版本里的drivers\mtd\nand\s3e2410.e文件来进行编写,如内核文件中的s3c2440_nand_hwcontrol,s3c2440_nand_devready,s3c2410nand_select_chip函数,然后将其赋值给nand_chip结构体中对应的函数。


2.2 实现NAND
由于NAND的自身特点,对NAND 的操作不能像对NOR 那样方便地直接对地址进行操作,而是通过读写NAND Flash控制器的寄存器来完成。三星公司的S3C2440自带NAND Flash控制器,寄存器的地址是从nGCS4的地址开始。S3C2440处理器有NOR和NAND两种模式,当选择从NAND模式启动时,S3C2440会把NAND Hash的前4K数据搬运到内部称为Steppingstone的硬件中,同时把Steppingstone映射到地址0X00处,从而启动,启动完成后处理器会把Steppingstone释放掉以作为他用。U-Boot的一般大小都上100 K,远大于4 K,所以实现从NAND启动的原理就是让前4K代码完成基本初始化,重要的是把NAND Flash中的U-Boot代码复制到SDRAM中,从而跳到SDRAM中去执行。分析可知,S3C2440的该特点为U-Boot从NAND Flash启动提供了可能。本文讨论的实现思路就是依据此原理。
源代码中有/board/smdk2410/U-boot/lds,该文件是U-Boot代码的链接脚本,有如下代码:

可以看到Text段也就是程序代码段,被编译链接到OX00地址处,同时start.S编译后的目标文件start.O被放到text段的第一个文件处,所以start.S就是程序上电运行的第一段代码,而/cpu/arm920t/start.S这个汇编文件正是U-Boot的程序代码入口。因此代码修改和添加主要在start.S中完成,以此来保证NAND启动代码可以在最终程序编译链接所生成的文件的前4K内。
NAND Flash读写操作比较复杂,汇编实现较为麻烦,没有C语言简单容易,因此用C语言实现对NAND的操作复制工作,最后在start.S中调用编写的C程序即可。



关键词: 实现 启动 Flash NAND U-Boot

评论


相关推荐

技术专区

关闭