嵌入式操作系统
在嵌入式Linux系统中,这些工作由Bootloacler(引导加载程序)完成,它是在嵌入式系统CPU加电复位和进入操作系统之前运行的代码,主要用于完成由硬件启动到操作系统启动的过渡,为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等,其数值必须要符合用户的硬件配置,并且按特定顺序写入。嵌入式Linux系统的引导、配置甚至应用程序的运行都与Bootloader有关。
Bootloader源代码与CPU的内核结构和嵌入式设备的板级配置有关,必须根据具体的系统设计要求进行移植。目前,开源社团已经发展了多种引导Linux内核的bootloader,比如PowerPC体系的U-Boot、miniBoot,ARM体系的blob,Intel x32体系的gurb、openBIOS等。
以MPC8265微处理器和嵌入式Linux为背景,针对性地提出U-Boot的移植方法并进行分析研究,此方法可广泛用于基于MPC282xx系列处理器的嵌入式Linux系统应用开发中。
1 U-Boot引导加载程序
1.1 U-Boot简介
U-Boot(Universal Boot Loader)是遵循GPL条款的开放源码项目。它支持多种嵌入式处理器,如ARM、PowerPC、MIPS等,也支持Linux、VxWorks、QNX、RTEMS、ARTOS、LynxOS等多种嵌入式操作系统。这2个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
U-Boot支持的主要功能如下:1)系统引导:支持NFS挂载、从Flash中引导(压缩或非压缩)系统内核;RAMDISK(压缩或非压缩)形式的根文件系统;2)强大的操作系统接口功能,可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布:3)支持目标板环境参数多种存储方式(如Flash、NVRAM、EEPROM);4)CRC32校验,可校验Flash中内核、RAMDISK镜像文件是否完好;5)设备驱动:串口、SDRAM、Flash、以太网、LCD、NVRAM、EEP-ROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;6)上电自检功能:SDRAM、Flash自动检测,SDRAM故障检测,CPU型号。
1.2 U-Boot主要目录结构
U-Boot源代码采用高度模块化的编程方式,便于在不同的硬件平台上移植。U-Boot源代码包含多个目录,其中与移植相关的主要有:1)board:目标板相关文件,存放U-Boot支持的所有目标板的子目录。目标板上大部分资源的初始化代码就在这个文件夹中,如SDRAM、Flash驱动;2)common:独立于处理器体系结构的通用代码,实现U-Boot各种公共命令的C文件;3)cpu:存放U-Boot支持的各类型CPU的相关文件,主要是初始化执行环境,比如mpc8260子目录包含串口、网口、LCD驱动及中断初始化等文件;4)drivers:通用设备的驱动程序,如CFI flash驱动;5)fs:U-Boot支持的文件系统,如ext2、cramfs、fat、fdos、jffs2和registeRFs等;6)net:与网络功能有关的文件,如B00TP、TFTP、RARP和NFS相关代码;7)include:存放头文件。子目录include/configs下与目标板相关的配置头文件是移植过程中经常要修改的文件,可配置目标板的各项参数(如波特率、引导启动参数等)。还有对各种硬件平台支持的汇编文件、系统的配置文件和对文件系统支持的文件。U-Boot源代码可以从DENX的网站(http://www.denx.de)下载,本文使用的版本是U-Boot-1.2.0。
2 U-Boot的运行流程
U-Boot的运行流程如图1所示,目标板上电,启动MPC8265存储控制器CS0有效,选中Flash,CPU地址线上输出硬件复位中断向量对应的地址,此时执行第1条指令,对应\cpu\mpc8260\start.S中的_start:开始执行。完成CPU本身基本的初始化后,初始化CPU内部寄存器,设置IMMR、ICTRL等。然后跳转到\cpu\mpc8260\cpu_init.c的函数cpu_init_f处,进行CPU的底层初始化,主要设置watchdog、SIUMCR寄存器、PIT、锁相环、系统定时器、存储控制器和CPM等。从start.S中跳转到\lib_ppe\board.c的函数board_init_f处,实现目标板上的第1次初始化,完成SMC初始化和一些硬件测试,尤其是RAM初始化,并分配内存空间,保存板级信息,准备在RAM中重定向U-Boot代码。完成后,跳转到start.S中的函数relocate_code()处,重定向代码,将U-Boot代码搬至SDRAM工作,开始在RAM中运行。然后跳转到board.c文件的函数board_init_r()处,执行板上的第2次初始化,主要完成一些数据结构、高端模块及系统设备的相关初始化。最后,U-Boot执行board_init_r()中的函数main_loop(),根据用户从控制台的输入,完成预先设定的工作。
3 U-Boot的移植
U-Boot在设计时已考虑到支持使用不同CPU处理器的开发板,根据具体板级硬件配置的设计要求,修改与其相关的源代码,将U-Boot移植到新的开发板上。这里开发板TDS8265外围接口主要有100 M网口、RS232串口和JTAG调试接口等。
3.1 修改U-Boot源代码
为了简化移植工作,可在U-Boot源码中选择一个与开发板接近的参考平台,然后从移植U-Boot的要求和开发板能正常启动的角度出发进行修改。
这里以在U-Boot/board目录下为TDS8265开发板新建文件夹TDS8265为例进行说明。
1)修改头文件TDS8265.h路径是U-Boot/include/configs/TDS8265.h,是开发板的主要配置元件,配置CPU、系统时钟、SDRAM、Flash以及其他开发板相关信息。设置CPU寄存器参数,需仔细对照处理器datasheet中各寄存器的定义、参考设置、目标板实际情况等做出选择并测试。MPC82xx系列处理器较为关键的寄存器有SIUMCR、PS-DMR、SCCR、BRx、ORx等。设置CPU寄存器基地址IMMR时,注意与硬件配置相对应。如:
设置与Flash控制相关的寄存器BR0、OR0时,根据目标板所用Flash的数据手册与BR0和OR0的相关位含义合理设置,这不仅关系到Flash能否正常工作,而且与串口调试直接相关。设置Flash、SDRAM,包括基址、大小、环境变量的偏移,内存刷新周期。设置环境变量,网络接口,IP地址,MAC地址,用于网络下载和启动;设置Linux内核启动参数init=/sbin/init。
2)编写tds8265.c文件 路径是U-Boot/board/tds8265/tds8265.c。tds8265.c是目标板的SDRAM的驱动程序,涉及I/0端口表、相关寄存器的设置及SDRAM上电初始化过程3个主要部分。任何一部分有问题,都会影响U-Boot、嵌入式操作系统甚至应用程序的运行,所以SDRAM的驱动不仅关系到U-Boot本身能否正常运行,而且还与后续部分相关。根据MPC8265处理器datasheet和开发板的硬件电路图,配置8265的I/0端口表;设置寄存器PSDMR和BRl、0R1;向SDRAM中写入8次以初始化SDRAM等。SDRAM的初始化是由/lib_ppc/board.c中的board_init_f()调用的,入口为tds8265.c的函数initdram。
3)修改config.mk文件 路径是U-Boot/board/tds8265/config.mk。修改中,对该文件中的TEXT_BASE赋值应与TDS8265.h中对CF-G_FLASH_BASE的赋值保持一致。
4)编写flash.c文件 路径是U-Boot/board/tds8265/flash.c。flash.c是Flash的驱动程序,是U-Boot读/写、删除Flash的源代码文件,其中包括多个函数,以实现不同的操作。如:
编写flash.c文件时需参考Flash的数据手册,严格按照其中的说明实现Flash的各种操作。
5)创建U-boot.lds,U-boot.lds.debug,makefile文件 这些文件均在目录U-Boot/board/tds8265之下。设置U-boot中各个目标文件的连接地址。
6)修改MAKEALL文件 路径是U-Boot/MAKEALL。因为使用的是MPC8265,属于82xx系列,所以在“LIST_82xx”下加入目标板名称“TDS8265”。
7)修改Makefile文件 路径是U-Boot/Makefile。在Makefile文件中增加TDS8265开发板的配置行,指定交叉编译器的完整路径名。
3.2 编译U-Boot和移植镜像文件
在源代码修改完成后,即可进行编译。编译U-Boot需要在Linux主机上建立交叉编译环境,本文使用Montavista公司的Montavista Linux Pro 4.0。在Linux主机上安装Montavista交叉编译工具后,设置环境变量,将Montavista工具链路径导入到主机系统的环境变量中。如:#gedit./.bash_profile,打开文件.bash_profile,增加PATH=$PATH:/opt/montavista/pro/devrocket/ppc/82xx/bin,然后删除之前可能错误创建的所有目标文件,并针对目标板编译。如下所示:
编译完成后,得到3个文件:1)u-boot:ELF格式的文件,可被多数Debug程序识别;2)u-boot.bin:二进制bin文件,U-boot的二进制执行代码,可通过JTAG接口下载到开发板;3)u-boot.srec: Motorola的S-Record格式文件,可通过BDM接口下载到开发板。
不同开发板对U-Boot镜像文件在Flash中的存放地址要求不同,这是由处理器中断复位向量决定的,与开发板硬件相关,源代码中U-Boot起始地址必须与硬件复位向量相符合。
使用MPC82xx系列处理器的主板是由硬件配置字(HRCW)决定的,如RPXlite板的中断复位向量设置为Ox00000100,因此U-B00t镜像文件必须烧写到Flash的起始位置。多数的PPC系列的处理器中断复位向量是Ox00000100和Oxfff00100,即高位启动和低位启动的Bootloader所在位置。U-boot镜像文件在Flash中的存放地址可通过设置U-Boot源码的<目标板>.h头文件中CFG_MONITOR_BASE以及board/<目标板>/confi-g.mk中的TEXT_BASE来与硬件配置相对应。
U-Boot镜像文件在Flash中烧录完成后,将目标板和主机的串口连接起来,目标板上电复位,即可在主机终端窗口看到串口回显的开发板上U-Boot的启动引导信息,如图2所示。
在终端窗口中输入help,可以列出U-Boot所有命令列表。然后测试网口和Flash读写,工作正常,则可以认为U-Boot移植工作基本完成,接下来可以添加一些其他功能,并进行Linux内核的引导和文件系统的移植。
4 结束语
Bootloader在嵌入式开发中是操作系统和硬件的枢纽。在U-Boot移植过程中,不仅要掌握U-Boot的结构和工作流程外还需要对硬件有一定了解。本文移植的U-Boot已稳定运行在开发板上,而且可以通过FIash和网络加载Linux内核和NFS文件系统,为后续开发奠定了良好的基础。对于不同的CPU和开发板,基本方法和步骤是相同的,本文的工作对于基于MPC82xx系列处理器的硬件平台的U-Boot移植具有借鉴意义,并对嵌入式Linux系统的开发提供了有益的技术参考。
全部0条评论
快来发表一下你的评论吧 !