免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1122 | 回复: 0
打印 上一主题 下一主题

U-BOOT在基于S3C44B0X系统板上的移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-26 18:54 |只看该作者 |倒序浏览

系统
,
移植
引言
        简单地说,嵌入式Linux系统的引导装载程序(Boot loader)是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境[2]。
        通常,对于嵌入式系统而言,Boot Loader是基于特定的硬件环境平台来实现的,不同构架的嵌入式微处理器的Boot Loader不同。因此,不可能为所有的嵌入式系统建立一个通用的Boot Loader。Boot Loader不但依赖CPU的结构体系,而且还依赖嵌入式系统的板级配置,比如板卡的硬件地址分配,RAM芯片的类型以及其他外设的类型。对于两块不同的嵌入式系统板,即使它们使用同一种CPU构建,要想让运行在其中一块板子上的Boot loader程序也能够运行在另一块板子上,通常也需要修改Boot Loader程序。尽管如此,仍然可以对Boot Loader归纳出一些通用的概念,从而供用户对特定的Boot Loader的设计与实现进行参考。本文我们选择了功能强大的U-BOOT进行移植。
1、U-Boot简介

         U-Boot,全称Universal Boot Loader,它是遵循GPL条款的开放源码项目。U-Boot是在ppcboot以及armboot的基础上发展而来,现在已经非常成熟与稳定,在许多嵌入式系统开发过程中被采用。U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS等嵌入式操作系统,同时还支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的微处理器。
        U-Boot源代码开放,支持多种嵌入式操作系统内核和多种处理器系列,高度灵活的功能设置,丰富的设备驱动源码,稳定可靠,特别是其对Linux支持非常完善,因此是引导嵌入式Linux系统内核的最佳选择。
1.1 U-Boot的启动        嵌入式系统加电或者复位后,CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如,基于ARM7TDMI内核的S3C44B0X在加电或者复位时,通常都从地址0x00000000取第一条指令,所以必须把U-Boot存储在某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)的相应位置以便CPU首先执行。图1是Boot loader、内核启动参数、内核映像和根文件系统映像在固态存储设备上的分配结构。

图1  Boot loader所在的存储设备的空间分配
       U-Boot的启动流程主要分为stage1和stage2两大部分,依赖于CPU体系结构的代码通常都放在stage1,且可以用汇编语言来实现。而stage2则通常用C语言来实现, 这样可以实现复杂的功能,而且有更好的可读性和移植性。
       Boot Loader的stage1通常包括以下步骤(以执行的先后顺序):
 (1)硬件设备初始化。
 (2)为加载Boot Loader的stage2准备RAM空间。
 (3)拷贝Boot Loader的stage2到RAM空间中。
 (4)设置好堆栈。
 (5)跳转到stage2的C入口点。
       Boot Loader的stage2通常包括以下步骤(以执行的先后顺序):
 (1)初始化本阶段要使用到的硬件设备。
 (2)检测系统内存映射(memory map)。
 (3)将kernel映像和根文件系统映像从flash上读到RAM空间中。
 (4)为内核设置启动参数。
 (5)调用内核。
        其中在stage1阶段中的硬件初始化部分通常包含以下步骤(以执行的先后顺序):
 (1)屏蔽所有的中断。为中断提供服务通常是OS设备驱动程序的责任,因此在Boot
Loader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。
 (2)设置CPU的时钟频率。
 (3)RAM初始化。包括正确地设置系统内存控制器的功能寄存器。
 (4)初始化LED。典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印Boot Loader的Logo字符信息来完成这一点。
 (5)关闭CPU内部指令/数据cache。
1.2 U-Boot源码目录结构        U-Boot源码结构分为3类,第一类是与处理器体系结构和系统板级配置直接相关的目录项,如cpu、board,lib_arm、lib_i386、lib_ppc等。第2类是一些通用函数或驱动程序,如common、include、net、post、fs、rtc、dtt、disk等。第3类是各种应用程序、工具和文档,如doc、examples、tools等[7]。
2、U-Boot移植操作

         U-Boot的源码是通过交叉编译器arm-linux-gcc和Makefile文件组织编译的,而且最终得到Boot loader是二进制文件。宿主机开发平台选用Red Hat Linux 9.0,交叉编译器选择cross-2.95.3,在宿主机上建立arm-linux-gcc交叉编译环境
本实例中,所用系统开发板功能框图如下:

图2  开发板系统硬件配置框图
        该开发板系统主要由三星S3C44B0X嵌入式微处理器、2M FLASH(AM29LV160DB)、8M SDRAM(HY57V641620HGT)、串口、以太网口、JTAG接口等组成。
2.1 移植步骤         U-Boot的移植主要是针对系统硬件设备配置相关文件,然后编译生成二进制文件下载到系统的FLASH中。在移植之前可以先仔细阅读U-Boot下的Readme文件,了解U-Boot的大概结构和基本内容。在移植过程中,为了降低移植的难度,一般都是选择与目标处理器以及目标板最为接近的一个版本开始移植。在U-Boot/Board/Dave 文件中的B2 开发板的CPU 也是S3C44B0X,根据移植相关性原则,我们选择以B2板子的程序作为模板进行移植。
        移植的具体工作主要根据系统硬件资源来修改配置文件,移植的主要操作步骤如下:
 (1)在board目录中修改B2为myboards3c44b0x,修改B2.c为myboards3c44b0x.c,修改myboards3c44b0x里面的Makefile, 其中的myboards3c44b0x.c文件是的开发板系统的初始化代码。
        对于memsetup.S文件主要是存储器的初始化设置,根据系统的具体配置进行修改。
        对于flash.c文件的修改,此文件中包含FLASH的驱动程序,然后根据开发板系统的配制修改(AM29LV160DB),根据FLASH芯片的ID修改FLASH的生产厂家、型号、容量、位数等。
 (2)在cpu/s3c44b0目录下修改start.S,主要是根据开发板系统设置一下中断跳转矢量、CPU时钟及状态、禁止看门狗定时器。
  具体修改内容如下:
  ①设置WTCON=0x0,禁止看门狗定时器, 避免处理器强行复位。
  ②设置INTMSK=0X7ffffff,禁止所有中断。Boot loader的执行过程中不必响应任何中断。
  ③根据嵌入式微处理器的工作主频, 修改宏CONFIG_S3C44B0_CLOCK_SPEED,使处理器能够正常工作, 本文的系统板S3C44B0X处理器所设定的工作主频为60MHz。
  ④设置PLLCON寄存器。PLLCON锁相环控制寄存器中存储有计算系统时钟的相关参数, 为了产生正确的系统时钟, 必须根据外接晶振频率和处理器工作主频确定各个倍频数。
  对于serial.c 文件,根据选定的CPU时钟设置波特率参数。
  对于cpu.c基本不用修改。
 (3)在include/configs目录中,修改头文件myboards3c44b0.h,此文件中的相关设置依据开发板系统的硬件配置进行修改。首先修改CPU时钟(60MHz)、设置保存相关参数在FLASH的起始地址,接下来是网络芯片设置及寄存器的起始地址,为了使串口输出正确的信息,设置串口波特率115200bps,修改内存映射相关参数,SDRAM和FLASH起始地址和容量大小。最后就是U-Boot一些环境变量及其他的初始设置,比如运行bootcmd之前的等待时间,宿主机和开发板的IP地址等等参数,这些参数可以在U-Boot启动后用命令setenv、saveenv来修改。
 (4)最后修改U-Boot根目录下的Makefile文件,在此文件中添加: myboards3c44b0x_config : [email=unconfig@./mkconfig]unconfig@./mkconfig[/email] $(@:_config=) arm s3c44b0 myboard3c44b0x myboard
  在@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0x myboard前面的空格是通过TAB键得到的,千万不能用空格代替,因为交叉编译器是靠这个来识别命令的。这点尤为重要,切记!
2.2 U-Boot的编译
  根据以上步骤修改配置好U-Boot文件系统后,执行如下命令编译U-Boot:
  Make distclean (非必要的)
  Make myboards3c44b0x_config
  Make
  如果编译无误将得到如下结果:
  -Map u-boot.map -o u-boot
  arm-elf-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
  arm-elf-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
  如果编译错误,交叉编译器会退出,同时提示错误原因,此时我们可以根据错误提示一步步修改,直到得到正确的结果。
3、移植结果

        将得到的二进制执行代码u-boot.bin通过JTAG烧写到开发板的FLASH中,将开发板用交叉网线和串口线与PC机相连,打开超级终端,上电复位后根据串口输出的信息判断移植是否成功。如果移植成功则在超级终端看到以下信息:
  U-Boot 1.1.4 (Jan 11 2008 - 11:34:59)
  U-Boot code: 0C700000 -> 0C721300 BSS: -> 0C755C4C
  RAM Configuration:
  Bank #0: 0c000000 8 MB
  Flash: 2 MB
  In: serial
  Out: serial
  Err: serial
  Hit any key to stop autoboot: 0
        如果FLASH中烧写了内核,终端将会收到“Uncompressing Kernel Image ...”内核启动信息,系统将被引导进入操作系统。若按任意键,则进入U-Boot命令状态。
4、结论
        Boot Loader是嵌入式系统开发中连接操作系统与硬件系统的桥梁,它将系统的软硬件紧密衔接在一起,为嵌入式系统后继软件的开发奠定了基础。U-Boot是一个功能强大的Boot Loader软件,支持多种CPU构架和嵌入式操作系统。根据本文方法移植后的U-Boot已经稳定的运行在嵌入式系统板上,并能顺利的引导嵌入式µClinux系统。本文是笔者在实际的开发过程中根据相关资料进行摸索,成功地移植了U-Boot的基础上总结出来的。对于不同CPU构架的嵌入式系统其基本方法和步骤是相同的,对进行嵌入式设计人员有一定的参考价值。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/97076/showart_1945622.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP