您好,欢迎访问一九零五行业门户网

在基于ADSP BF533的嵌入式Linux系统上的移植

摘要:本文结合u-boot的运行机理以及u-boot移植的基本要求,研究了u-boot在基于bf533的嵌入式系统上的移植。本文的移植是在不改变u-boot框架前提下,对嵌入式目标板和cpu相关代码进行修改,实现了成功移植且移植后的u-boot能够在目标板上稳定运行,为后续开发奠定了良好的基础。
1、引言
bootloader(内核引导程序)是在操作系统内核运行之前运行的一段自举程序,用于初始化硬件设备、改变处理器运行模式、重组中断向量和建立内存空间映射图,从而将系统的软硬件带到一个合适的状态或者用户定制的特定状态,以便为zui终加载操作系统内核准备好正确的环境。
嵌入式linux系统常用的bootloader有arm-boot、redboot、u-boot等。u-boot(全称universalbootloader)是当前比较流行的遵循gpl条件的开放源码项目。u-boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持种引导方式;具有功能强大且成熟、稳定等诸多优点,故在嵌入式系统开发过程中广泛采用。u-boot严重依赖于底层硬件,不同的cpu或嵌入式板极设备需要不同的u-boot,因此,在嵌入式系统中建立通用的u-boot是非常困难的,故u-boot需针对开发板量身定做。
2、开发平台
2.1bf533简介
blackfin系列dsp是adi公司与in联合开发推出的*款高性能、低功耗第四代定点dsp产品,融合了analogdevices/in公司的号结构(msa)。它将一个32位risc型指令集和双16位乘法累加(mac)信号处理功能与通用型微控制器所具有的易用性组合在一起。这种组合使blackfin处理器能够在信号处理和控制处理应用中发挥*的性能。且blackfin处理器通过将工业标准接口与高性能的信号处理内核相结合在一起,用户可以快速设计出节省成本的解决方案,而且无需昂贵的外部组件。
本开发系统采用bf533,bf533是主频高达600mhz、峰值处理能力为1.2gmi/s的高性能blackfin处理器。bf533内核包含2个16位mac、2个40位alu、4个8位视频alu以及1个40位移位器。另外,bf533还包括1个uart口、1个spi口、2个串行口(sport)、4个通用定时器(其中3个具有pwm功能)、1个实时时钟、看门狗定时器以及1个并行外设接口。外部存储器控制器可与sdram、sram、flash和rom实现无缝连接。
2.2系统硬件平台简介
本系统的开发板硬件系统如图1所示。
目标板以blackfin嵌入式处理器为核心,数据地址线复用到sdram、flash、usb、ethernet,并通过fpga实现逻辑控制。此外,将uart端口转换为rs232端口引出。其中sdram的地址为0x00000000~0x02000000,flash的地址为0x20000000~0x20300000。
宿主机采用window和suse10.0双操作系统,采用串行接口和以太网连接宿主机和目标板,程序先在宿主机上编译,然后下载至目标板上运行,目标板的终端被重定向到串行接口,由宿主机输出。
2.3开发环境的建立
2.3.1在宿主机上设置终端
大部分嵌入式系统在宿主机大多都采用kermit或minaicom实现与目标板的通信,本系统采用inicom。minicom是linux下一个类似于windows超级终端的友好串口通信程序。在终端输入bash#minicom-s进入minicom设置画面,设置串口波特率、有效数据位、停止位以及奇偶校验位分别为57600、8bit、1位停止位以及无奇偶校验位等。
2.3.2安装交叉编译器
交叉编译是在一个架构下编译另外一个架构的目标文件。要从http://blackfin.uclinux.org上下载blackfintoolchain,然后安装并修改环境变量path,使其包含toolchain的安装目录。
3、u-boot启动两阶段
u-boot代码一般分为stage1和stage2两大部分。stage1依赖于cpu体系结构如设备初始化代码,常用汇编语言编写以达到短小精悍,提高系统运行效率的目的。它主要包括cpu/bf533目录下的start.s。stage2一般采用c语言编写实现复杂功能,这样代码则具有更好的可读性和可移植性,主要包括libblackfin/board.c文件和common/main.c文件中main_loop函数。
stagel从cpu入口函数cpu/bf533/start.s开始,通常包含以下步骤:
(1)基本硬件的初始化,为随后执行kernel准备好基本的硬件环境。包括:屏蔽所有中断,引导装载程序的执行过程中不必执行任何中断,中断屏蔽可通过写cpu的中断屏蔽寄存器或状态寄存器实现;设置cpu的速度和时钟频率,初始化pll;ram初始化,初始化内存控制器的各个寄存器;初始化uart,向串口打印u-boot的字符信息;关闭cpu内部指令,数据cache。
(2)为加载u-boot的stage2准备ram空间,通常将stage2置于整个ram空间的zui顶层1mb空间。
(3)拷贝u-boot的stage2到ram。判断是否是flash运行,如果是就将stage2的代码拷贝到textbase处。将stage2安排到ram空间的zui顶层1mb是较推荐的方法。
(4)设置堆栈指针sp为c语言代码执行做好准备。
(5)跳转到stage2的c语言代码入口点。
stage2主要包括lib-blackfin/board.c中board_init_f、board_init_r函数以及common/main.c中main_loop函数。通常包含以下步骤:
(1)初始化此阶段需用的硬件设备,由board_init_f和board_init_r函数实现。
(2)内存映射检测。
(3)加载内核并为内核设置启动参数。
(4)调用内核。
4、u-boot的移植
4.1u-boot方法与要点
移植u-boot简便的方法是从u-boot支持的开发板中选择一个与其目标板接近的开发板进行修改。需修改的是与硬件相关的部分,涉及到两个层面:针对cpu的移植,由于u-boot_1.1.3支持bf533,故只需做第二层面的移植:针对目标板硬件的移植。在移植前,需仔细阅读u-boot/readme文件,该文件对目录结构和如何移植作了简要介绍。从移植u-boot的zui小要求、u-boot能够正常启动的角度出发,选择bf533的stamp板为模板,相关源代码在/board/stamp目录下,结合u-boot的启动流程,主要修改文件如下:
(1)与目标板相关的代码部分:在board下创建mybf533目录,无需从头开始,参考与目标板相似的stamp板在mybf533目录下创建mybf533.c、mybf533.h、flash.c、config.mk、makefie等文件。需要修改/board/mybf533/config.mk:
tfext_base用于设置程序编译链接的起始地址即将u-boot的stage2拷贝到sdram的text_base处,即sdramzui顶层一段存储区。修改board/mybf533/makefile:
(2)与cpu相关的代码部分:u-boot_1.1.3/epu文件中含有bf533的目录,其中包含start.s、cpu.c、cpu.h、interrupt.c、init_sdram.s等。故不需要建立与cpu相关的文件目录。
(3)与头文件相关的代码:在include/configs创建mybf533.h,参考include/configs/stamp.h,如下:
flash的修改与具体型号和容量有关,修改过程中参考flash擦除数据命令、特定寄存器的写入地址以及扇区的大小和位置。
与sdram相关设置:
注意:zui后一行要用tab键开头表示命令。其中blackfin表示cpu的种类.bf533是cpubf533对应的代码目录,mybf533是目标板对应的目录。这样可使用makemybf533_config配置自身的开发板。
其他修改视情况而定。如根据sdram大小修改cplb表,根据需要修改堆栈大小。如drivers/cfi_flash.c中flash_init()函数,cpu/bf533/ints.c中init_irq()函数等。
修改完毕后就可以采用如以下命令编译u-boot:bash$>makeclean,bash$>makemrproper,bash$>makemybf533_config,bash$>make。
编译完后u-boot_1.1.3生成u-boot的二进制文件u-boot.bin(u-boot.bin只能用于更新)。执行bash$>bfin-uclinux-objcopy-ibinary-oihexu-boot.bin,生成可在windows下烧写到flash的十六进制文件u-boot.hex。
4.2u-boot的烧写
*次下载u-boot到目标板或者当u-boot不能正常启动时。必须通过jtag或者adiice将u-boot下载
其它类似信息

推荐信息