当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]U-Boot在基于BF561的嵌入式Linux系统上的移植

1  引言
    嵌入式Linux系统常用的Boot Loader有arm-boot、redboot、U-Boot等。U-Boot (全称Universal Boot Loader)是当前比较流行的遵循GPL条件的开放源码项目。U-Boot具有源码公开的特点,开发人员可根据自身需要进行裁减;支持多种处理器和嵌入式操作系统内核;具有多种设备驱动源码:支持多种引导方式;具有功能强大且成熟、稳定等诸多优点。在嵌入式系统开发过程中广泛采用。U-Boot严重依赖于底层硬件,不同的CPU或嵌入式板及设备需要不同的U-Boot,因此,在嵌入式系统中建立通用的U-Boot是非常困难的,故U-Boot需针对开发版本量身定做。
2  开发平台
    系统的开发板硬件系统如图1所示。
 

图1 BF561开发板
    目标板以Blackfin嵌入式处理器BF561为核心,数据地址线复用到SDRAM、 Flash、USB、Ethernet,并通过FPGA实现逻辑控制。此外,将UART端口转换为RS232端口引出。其中SDRAM的地址为 0x00000000~0x02000000,Flash的地址为0x20000000~0x20300000。宿主机采用Window和 Suse10.0双操作系统,采用串行接口和以太网连接宿主机和目标板,程序先在宿主机上编译,然后下载至目标板上运行,目标板的终端被重定向到串行接口,由宿主机输出。
    开发环境的建立步骤如下:
    ⑴在宿主机上设置终端:大部分嵌入式系统在宿主机上大多都采用kermit或minaicom实现与目标板的通信,本系统采用inicom。minicom是Linux下一个类似于Windows超级终端的友好串口通信程序。在终端输入 bash#minicom-s进入minicom设置画面,设置串口波特率、有效数据位、停止位以及奇偶校验位分别为57600、8 bit、1位停止位以及无奇偶校验位等。
    ⑵安装交叉编译器:交叉编译是在一个架构下编译另外一个架构的目标文件。要从http://blackfin.uclinux.org网站上下载Blackfin ToolChain,然后安装并修改环境变量PATH,使其包含ToolChain的安装目录。
bash# rpm–Uvh blackfin-toolchain-06r1-4.i386.rpm
bash$ export PATH=$PATH:/opt/uClinux/bfin-uclinux/ bin
在U-Boot-1.1.3/Makefile下可以看到选择交叉编译器为bfin-uclinux-gcc。
ifeq($(ARCH),blackfin)
       CROSS_COMPILE = bfin-uclinux-gcc
3 U-Boot启动两阶段
    U-Boot代码一般分为stage1和stage2两大部分。stage1依赖于CPU体系结构如设备初始化代码,常用汇编语言编写以达到短小精悍,提高系统运行效率的目的。它主要包括cpu/bf561目录下的start.s。stage2一般采用C语言编写实现复杂功能,这样代码则具有更好的可读性和可移植性,主要包括lib blackfin/board.c文件和common/main.c文件中main_loop函数。
    stagel从CPU入口函数cpu/bf561/start.s开始,通常包含以下步骤,
    (1)基本硬件的初始化,为随后执行kernel准备好基本的硬件环境。包括:屏蔽所有中断,引导装载程序的执行过程中不必执行任何中断,中断屏蔽可通过写CPU的中断屏蔽寄存器或状态寄存器实现;设置CPU的速度和时钟频率,初始化pll;RAM初始化,初始化内存控制器的各个寄存器;初始化UART,向串口打印U-Boot的字符信息;关闭CPU内部指令,数据cache。
    (2) 为加载U-Boot的stage2准备RAM空间,通常将stage2置于整个RAM空间的最顶层1MB空间。
    (3)拷贝U-Boot的stage2到RAM。判断是否是Flash运行,如果是就将stage2的代码拷贝到TEXT BASE处。将stage2安排到RAM空间的最顶层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函数实现。
void board_init_f(ulong bootflag)
{……………
      init_IRQ();          //初始化中断
      init_baudrate();      //设置串口波特率
      serial_init();         //设置串口工作方式
}
void board_init_r(gd_t*id,ulong dest_addr)
{……………
      size = flash_init();    //Flash 初始化……………
      for (;;)
         {main_loop();    //设置延时时间,确定目标板是进入下载模式还是启动加载模式
}
}
    (2)内存映射检测。
    (3)加载内核并为内核设置启动参数。
    (4)调用内核。
4 U-BOOT的移植
4.1  U-Boot方法与要点
    移植U-Boot简便的方法是从U-Boot支持的开发板中选择一个与其目标板接近的开发板进行修改。需修改的是与硬件相关的部分,涉及到两个层面:针对CPU的移植,由于U-Boot_1.1.3支持BF561,故只需做第二层面的移植:针对目标板硬件的移植。在移植前,需仔细阅读U-Boot/readme文件,该文件对目录结构和如何移植作了简要介绍。从移植U-Boot的最小要求、U- Boot能够正常启动的角度出发,选择BF561的STAMP板为模板,相关源代码在/board/stamp目录下,结合U-Boot的启动流程,主要修改文件如下:
    (1)与目标板相关的代码部分:在board下创建mybf561目录,无需从头开始,参考与目标板相似的STAMP板在mybf561目录下创建mybf561.c、mybf561.h、flash.c、config.mk、Makefie等文件。需要修改/board/mybf561/config.mk:
TEXT_BASE = 0x01FC0000
PLATFORM_CPPFLAGS += - I$(TOPDIR)[!--empirenews.page--]
TFEXT_BASE用于设置程序编译链接的起始地址即将U-Boot的stage2拷贝到SDRAM的TEXT_BASE处,即SDRAM最顶层一段存储区。修改board/mybf561/Makefile:
include $(TOPDIR)/config.mk
LIB= lib$(BOARD).a             # 选择库文件
OBJS=$(BOARD).o mybf561.o     # 目标文件
    (2)与CPU相关的代码部分:U-Boot_1.1.3/epu文件中含有BF561的目录,其中包含start.s、cpu.c、cpu.h、interrupt.c、init_sdram.s等。故不需要建立与cpu相关的文件目录。
    (3)与头文件相关的代码:在include/configs创建mybf561.h,参考include/configs/stamp.h,如下:
#define CONFIG_MYBF561 1
#define CONFIG_CLKIN_HZ 1000000   // 输入时钟
#define CONFIG_PLL_BYPASS 0       // 使用锁相环
    与Flash 相关设置:
#define CFG_FLASH_BASE 0x20000000    // Flash起始地址
#define CFG_MAX_FLASH_BANKS 1     // max number of memory banks
#define CFG_MAX_FLASH_SECT 67      // max number of sector on one chip
#define CFG_ENV_ADDR 0x20004000     // 环境变量保存地址
#define CFG_ENV_OFFSET   (CFG_ENV_ADDR-CFG_FLASH_BASE)
#define CFG_ENV_SIZE          0x2000
#define CFG_ENV_SECT_SIZE    0x2000
    Flash的修改与具体型号和容量有关,修改过程中参考Flash擦除数据命令、特定寄存器的写入地址以及扇区的大小和位置。
与SDRAM相关设置:
# define CONFIG_MEM_SIZE 32    // 128,64,32,16
# define CONFIG_MEM_ADD_WDTH   // 8,9,10,11
# define CONFIG_MEM_MT48LC64M4A2FB_7E 1
# define CFG_MEMTEST_START 0x00000000  
// memtest works on
# if (CONFIG_MEM_SIZE == 32)
# define CFG_MAX_RAM_SIZE 0x02000000
# define CFG_MEMTEST_END 0x01F7FFFF   
// 1…31.5MB in DRAM
# define CFG_LOAD_ADDR 0x01000000
//default load
    最后一行要用Tab键开头表示命令。其中blackfin表示CPU的种类。bf561是cpu bf561对应的代码目录,mybf561是目标板对应的目录。这样可使用make mybf561_config配置自身的开发板。
    其他修改视情况而定。如根据SDRAM大小修改cplb表,根据需要修改堆栈大小。如drivers/cfi_flash.c中flash_init()函数,cpu/bf561/ints.c中init_IRQ()函数等。
    修改完毕后就可以采用以下命令编译U-Boot:bash$>make clean,bash$>make mrproper,bash$>make mybf561_ config,bash$>make。
    编译完后U-Boot_1.1.3生成U-Boot的二进制文件U-Boot.bin(U- Boot.bin只能用于更新)。执行bash$>bfin-uclinux-objcopy-I binary-Oihex U-Boot.bin,生成可在Windows下首次烧写到Flash的十六进制文件U-Boot.hex。
4.2  U-Boot的烧写
    下载U-Boot到目标板,或者当U-Boot不能正常启动时,必须通过JTAG或者ADI ICE将U-Boot下载到目标板。在此可将ADI公司的仿真器与Visual DSP++环境相连,通过Visual DSP++,在TOOLS-->Flash Programmer下执行Flash驱动程序M25P64.dxe,选择"Erase all"-->Load Flie烧写U-Boot.hex文件到Flash中。
    移植成功后,打开终端minicom复位开发板,若串口能输出正确的启动信息.则表明移植基本成功。启动后,如果在设定的时间内,串口没有接收到按键。U-Boot将自动加载操作系统内核和文件系统。若设定时间内串口接收到按键,则U-Boot停止自动加载,进入命令行,可看到U-Boot的提示符"mybf561>",查看Flash信息,调试或手动加载内核。
    生成新的U-Boot.bin文件后。可通过Ethernet或者串口更新U-Boot。因为网络的传输速度远比串口快,故一般选择网络传输。将新生成的U-Boot.bin拷贝到宿主机根目录下的tftpboot目录(前提是已经创建tftp sever),在目标板出现U-Boot提示符后。按任意键进入下载模式:
    mybf561>tftp 0x1000000 U-Boot.bin
    0x1000000为SDRAM默认的下载地址空间,用于U-Boot的升级、调试。当需要升级或者修改U-Boot,可将新的U-Boot从SDRAM烧写到Flash,覆盖原来的U-Boot,以减少烧写Flash的次数。在烧写以前最好测试一下所下载的U-Boot能否正常运行:
    Mybf561>go 0x1000000
    如果运行正常就可将U-Boot写到Flash中:
    mybf561>protect off all
    mybf561>erase all
#可只擦除部分扇区
    检验写入Flash中的内容是否正确:
    mybf561>cp.b 0x1000000 0x20000000  $(filesize)
    mybf561>cmp.b 0x1000000 0x20000000  $(filesize)
    如果不正确,应重复执行Erase all 和Copy 命令,直到正确为止。至此,U-Boot移植的步骤基本完成。
5 结束语
    U-Boot是一个功能强大的Boot loader。前期移植工作是嵌入式系统开发的首要环节。嵌入式开发人员应该在了解U-Boot的工作机理、移植条件后,根据目标板和具体情况灵活裁减U -Boot以提高操作系统移植的稳定性,缩短移植周期,降低产品成本,为后续开发奠定了良好的基础。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭