U-Boot从NAND Flash启动的实现
对NAND Flash中的代码复制操作函数已经完成,接下来只要在start.S中调用copy2ram函数就完成工作。汇编文件start.S中,reloca-te、copy_loop段代码为U-Boot中原先的复制代码过程,去掉这2段代码,添加自己的代码。由于编写的是C代码,所以在start.S中调用cop-y2ram函数前必须先设定好指针、堆栈,另外copy2ram要用到的参数是通过r0、r1、r2寄存器传递的。
在stack_setup设置堆栈代码后面添加如下代码:
上面第一段代码主要是检测程序是否已经在内存中运行,如果已经在内存中,显然代码就无需复制,程序就会跳过复制阶段往后执行,第二段是设定参数,把参数放入相应寄存器,最后调用copy2ram函数。
自此关于NAND启动的主要代码修改和添加已经完成,但还有很重要的一处需要修改,关于环境参数的存放问题。环境参数紧随着U-Boot在NAND Flash中存放,在其之后是内核镜像文件。在U-Boot的第二阶段中有个名为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作为存储器的硬件设计,从而简化电路,给应用带来极大方便。
- 基于PLC实现注塑机的电气控制(12-05)
- 电源模块均流的基本原理、实现方法及仿真应用(12-24)
- 工程师经验谈:如何实现一个驱动电路的三次设计?(01-18)
- 双输出 DC/DC 控制器结合了数字电源系统管理和模拟控制环路以实现 ±0.5% 的 Vout 准确度(11-07)
- 基于CAN总线的电流、电压变送器的设计与实现(10-26)
- 利用PSoC1实现基于WPC协议的电力发送器设计(09-19)