新闻中心

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

U-Boot从NAND Flash启动的实现

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

在/board/smdk2410/中添加boot_init.c文件,在其中nand_reset(nand重置函数)、wait_idle(等待即查询设备是否读写就位)、nand_select_chip(片选使能)、nand_dleselect_chip(取消片选)、write_cmd(写命令)、write_addr(写地址)、read_data(读数据)、nand_init(nand控制器初始化)这些子函数和copy2ram函数,同时在copy2ram中依据 的读写操作特点来调用这些子函数。具体操作流程如图2所示。

本文引用地址:http://www.eepw.com.cn/article/180637.htm


中的代码复制操作函数已经完成,接下来只要在start.S中调用copy2ram函数就完成工作。汇编文件start.S中,reloca-te、copy_loop段代码为中原先的复制代码过程,去掉这2段代码,添加自己的代码。由于编写的是C代码,所以在start.S中调用cop-y2ram函数前必须先设定好指针、堆栈,另外copy2ram要用到的参数是通过r0、r1、r2寄存器传递的。
在stack_setup设置堆栈代码后面添加如下代码:


上面第一段代码主要是检测程序是否已经在内存中运行,如果已经在内存中,显然代码就无需复制,程序就会跳过复制阶段往后执行,第二段是设定参数,把参数放入相应寄存器,最后调用copy2ram函数。
自此关于的主要代码修改和添加已经完成,但还有很重要的一处需要修改,关于环境参数的存放问题。环境参数紧随着在NAND 中存放,在其之后是内核镜像文件。在的第二阶段中有个名为env.relocate的函数,它会把环境参数复制到RAM中,而环境参数中需要向Linux内核传递的参数会在内核前重新构建成标记列表,同时把该标记列表放在跟内核约定好的地址处。因此必须指明环境参数的存放位置,否则无法复制到内存,从而需要传递到内核的参数也就无法完成传递。修改如下:在/include/configs/smdk241-0.h中添加:


第一行指定环境变量在NAND Flash中,后面2行分别指定其在NAND Flash中的大小和偏移量。关于NAND的部分全部完成。

3 U-Boot其他部分修改
由于所开发的开发板是基于S3C2440的,U-Boot中没有S3C2440的配置文件,只能仍用SMDK2410模板来进行修改。主要修改有两处:1)在/include/s3c24xO.h中添加S3C2440_NAND结构体;2)由于S3C2410和S3C2440的时钟寄存器有些不一样,所以需要修改时钟获得函数,在/cpu/arm920t/s3c24xO/speed.c修改。特别要注意的是机器ID的问题,在/include/asm-arm/mach-types.h中定义了各个开发板的ID号,必须要保证所定义的开发板的ID号跟内核一致,否则内核无法启动。

4 结束语
针对U-Boot不支持从NAND启动的缺点,对其进行修改。添加了关于NAND Flash的操作函数和支持从NAND启动的函数。本文详细阐述了U-Boot从NAND肩动的原理和修改过程。修改过后的U-Boot可以直接从NAND Flash启动,这样就可以摒弃传统依赖NOR Flash启动的硬件设计,使用只依赖NAND Flash作为存储器的硬件设计,从而简化电路,给应用带来极大方便。


上一页 1 2 3 下一页

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

评论


相关推荐

技术专区

关闭