好文档 - 专业文书写作范文服务资料分享网站

Nand Flash 启动模式下的Uboot移植

天下 分享 时间: 加入收藏 我要投稿 点赞

龙源期刊网 http://www.qikan.com.cn

Nand Flash 启动模式下的Uboot移植

作者:杨素秋

来源:《软件导刊》2013年第03期

摘 要:BootLoader移植是嵌入式系统开发中的一个重要环节,而Uboot是一个支持多处理器多操作系统较为通用的BootLoader。分析了Uboot的启动过程,并对s3c2440A如何支持驱动代码在外部Nand Flash上的执行,以及在s3c2440A平台上如何实现Nand Flash启动模式下的Uboot移植进行了介绍。具体操作和编译在fedora9操作系统和armlinuxgcc4.3.2交叉编译下完成。

关键词:嵌入式系统;BootLoader;Nand Flash;Uboot;s3c2440A

中图分类号:TP301 文献标识码:A 文章编号:16727800(2013)003003304 0 引言

BootLoader 是指在操作系统内核运行之前运行的一段程序,其功能在于完成硬件设备的初始化、建立内存空间的映射图、将系统的软硬环境带到一个合适的状态,为最终的内核调试做好准备。Uboot是在ppcboot以及ARMboot的基础上发展而来的较为通用的BootLoader,不仅仅支持Linux嵌入式操作系统的引导,还支持VxWorks、QNX等嵌入式操作系统,Uboot除了支持PowerPC系列处理器,还能支持ARM、x86、XScale、MIPS等诸多常用的处理器。 目前,Uboot的移植解决方案主要面向的是微处理器中的Nor flash。但Nor flash 存储器的价格比较昂贵且存储容量小,而SDRAM和Nand flash存储器的价格相对来说比较合适且容量大,如果能在Nand Flash中实现Uboot的启动并在SDRAM中执行主程序,则不仅能够有效地降低系统的成本,也能给实际应用带来极大的方便。1 Uboot启动过程分析

BootLoader的启动通常有两个阶段,分为阶段1(stage1)和阶段2(stage2),Uboot也不例外。在Uboot中依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且用汇编语言实现,而为了系统有更好的移植性和可读性,在阶段2中通常用C代码来实现。关于CPU的初始化文件一般放在第一阶段,其对应的文件目录为cpu/arm920t/start.s,主要实现一些寄存器的配置以及初始化、内存和栈空间的配置。阶段2在lib_arm/board.c中,其基本由C语言实现,start_armboot是整个启动代码中C语言的主函数,在其中通过调用各个硬件设备的初始化函数来完成本阶段要使用到的硬件设备的初始化,除此之外还涉及到内存的映射、代码的搬运、设置内核启动参数等功能。具体实现流程如图1所示。 2 Uboot在Nand Flash中的启动

Nand flash 的地址是非线性的,也就是说不能直接在芯片的内部执行程序。但为了满足这一要求, s3c2440A配备了一个内部SDRAM缓冲器,叫做‘Steppingstone’,当系统启动时,

龙源期刊网 http://www.qikan.com.cn

Nand Flash 存储器的前4k byte数据将被自动载入到steppingstone中,并且装载到steppingstone中的代码会被执行。执行过程如图2所示。

由上图可知,Uboot下载到Nand Flash中当系统加电时,Nand flash存储空间的前4kb的数据也就是Uboot的第一阶段会自动加载到SRAM中并执行,运行到第二阶段时则把Nand Flash中的Uboot全部拷贝到SDRAM中继续执行。 3 Uboot的移植及实现

Uboot一直都没有支持S3C2440,所以以SBC2410为蓝本进行修改和移植。2410和2440基本上没有什么大的差异,主要区别是2440的主频变得更高,在接口方面增加了摄像头接口和AC97音频接口;在寄存器方面,除了新增模块的寄存器外,Nand Flash 的控制寄存器也有了较大的变化。下面对移植的过程进行介绍。 3.1 开发环境

宿主机的软件开发环境:Fedroa9.0、armlinuxgcc4.4.3.tar。其安装路径为/usr/local/arm/4.3.2、 uboot200911。

目标开发板硬件环境:S3C2440A、SDRAM为K4S561632NLC75、Nand Flash为256M的K9F2G08U0B。

3.2 建立属于自己的board平台

参照board/sbc2410x目录,在源码目录board下建立自己的开发平台mine2440,步骤如下:

(1)这里将板子取名为mine2440,建立board/mine2440目录,拷贝board/sbc2410x下的文件到board/mine2440目录,将sbc2410x.c更名为mine2440.c. mkdirp mine2440 //进入board目录 cparf sbc2410x/* /board/mine2440

mv sbc2410x.c mine2440.c //进入mine2440目录

(2)修改mine2440 目录下的Makefile文件在Linux中使用gedit命令,将COBJS := sbc2410x.o flash.o 改为COBJS := mine2440.o flash.o gedit board/mine2440/Makefile

(3)修改Uboot根目录下的Makefile文件。查找到smdk2410_config的地方:

龙源期刊网 http://www.qikan.com.cn

mine2440_config := unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t mine2440 NULL s3c24x0,其各个参数的定义如表1所示。 (4)测试编译环境如下: make

Make成功则说明编译环境和开发板的创建添加都没有问题。下面针对代码执行流程对创建的开发板做出一些相应的修改。

3.3 在Uboot中添加对S3C2440一些寄存器的支持

由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在 2410的基础上再加上对2440 的支持即可,即在定义了CONFIG_S3C2410的地方加上CONFIG_S3C2440,再根据两者的不同添加功能设置。 3.3.1 系统时钟配置

2440的最高主频能达到503MHz,但正常情况下让其运行在400MHz,而2410 只有200MHz,所以需要对系统时钟部分做出更改。主要包括主时钟频率即MPLL与USB时钟频率UPLL,下面分别给出具体的计算式:

MPLL= ( 2*m*Fin ) / ( p*2^s ) / * 主时钟频率 UPLL= ( m*Fin ) / ( p*2^s ) / * USB 控制频率

其中 m、p、s的值可以自己设置,用来控制各个模块的时钟输出频率。在2440系统中使用12MHz的晶振也就是公式里的Fin。下面分别给m、p、s赋值具体实现如下: #define S3C2440_MPLL_400 MHz ( ( 0x5c < < 12 ) | ( 0x01 < < 4 ) | ( 0x01 ) ) #define S3C2440_UPLL_48 MHz ( ( 0x38 < < 12 ) | ( 0x02 < < 4 ) | ( 0x02 ) )

#define S3C2440_CLKDIV 0x05 / * FCLK : HCLK : PCLK =1 : 4 : 8 , UCLK = UPLL 3.3.2 串口配置

Nand Flash 启动模式下的Uboot移植

龙源期刊网http://www.qikan.com.cnNandFlash启动模式下的Uboot移植作者:杨素秋来源:《软件导刊》2013年第03期摘要:BootLoader移植是嵌入式系统开发中的一个重要环节,而Uboot是一个支持多处理器多操作系统较为通用的BootLoader。分析了Uboot的启动
推荐度:
点击下载文档文档为doc格式
26dgc3jg4o6m3qp9y5ql
领取福利

微信扫码领取福利

微信扫码分享