- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
U-Boot在MPC8265平台上的移植与分析
系统处理器启动时,首先执行一个预定地址处的指令,通常这个位置是只读内存,存放系统初始化或引导程序,其功能是执行CPU初始化并配置其他硬件,然后copy操作系统到RAM中。
在嵌入式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的要求和开发板能正常启动的角度出发进行修改。
作者:段 薇 来源:电子设计工程