mini2440系统移植篇之u-boot分析
来源:互联网 发布时间:2018-08-06 分享至微信


1.Bootloader概念


系统上电后,需要一段程序来初始化重要的硬件,有些程序是固化在固件firmwware上的,如PC的BIOS。然后是Bootloader,如PC上的GRUB。对于嵌入式系统来说,一般只有Bootloader,它负责初始化内核运行的硬件环境,如内存,然后调用操作系统内核。一般最终产品它只需要启动内核就足够了,为了方便开发,还可以增强Bootloader功能,比如网络功能,通过网络下载文件,烧写文件到Flash中。




2.嵌入式系统结构


嵌入式系统一般包含4部分。


1、引导加载程序,包括固化在固件的boot代码(可选)和Bootloader。


2、Linux内核


3、文件系统,包括根文件系统和其他挂载的文件系统。从某方面说,Android也属于嵌入式,只是它的文件系统比较庞大,比QT漂亮而已。


4、用户应用程序,就是如计数器之类的应用。




3.U-Boot


U-Boot全称UniversalBootLoader,即通用Bootloader。确实,现在很多公司的bootloader都采用u-boot,基本上成为标准。u-boot可以看成是一个大型的裸机程序,它的优点是集成了很多好用的工具,命令,支持很多平台。




4.U-Boot配置


4.1.Makefile


u-boot要经过配置、编译、连接过程。先说配置,从readme文件可以知道,要使用开发板board/,要先make_config。比如我的2440开发板,makehyq2440_config。首先要修改makefile,增加编译选项


hyq2440_config:unconfig


@$(MKCONFIG)$(@:_config=)armarm920thyq2440samsungs3c24x0


unconfig是一些清理事情,不重要,根据makefile目标依赖命令的原理,分析一下@$(MKCONFIG)$(@:_config=)armarm920thyq2440samsungs3c24x0


做了什么事情。makefile的前面定义了MKCONFIG:=$(SRCTREE)/mkconfig,STRTREE就是当前目录,所以MKCONFIG就是源码根目录下的mkconfig。$(@:_config=)展开就是hyq2440_config。所以就变成


mkconfighyq2440armarm920thyq2440samsungs3c24x0


$0$1$2$3$4$5$6




4.2.mkconfig


进入mkconfig看看干了什么事情。




4.2.1.确定开发板名称BOARD_NAME


["${BOARD_NAME}"]||BOARD_NAME="$1"。定义了BOARD_NAME=hyq2440。




4.2.2.创建平台相关的头文件链接


ln-s${SRCTREE}/include/asm-$2asm。创建链接ln-sasm-armasm。


ln-s${LNPREFIX}arch-$6asm-$2/arch。创建链接ln-sarch-s3c24x0asm-arm/arch




4.2.3.创建顶层makefile包含的文件include/config.mk


echo"ARCH=$2">config.mk


echo"CPU=$3">>config.mk


echo"BOARD=$4">>config.mk


则config.mk配置文件内容为:


ARCH=arm


CPU=arm920t


BOARD=hyq2440


VENDOR=samsung


SOC=s3c24x0




4.2.4.创建开发板相关头文件config.h


echo"#include">>config.h


echo"#include">>config.h


>config.h表示新建文件


/*Automaticallygenerated-donotedit*/


#include


#include


从配置中可以知道,如果在board新建一个开发板,则在include/configs目录下要建一个.h的头文件。




4.3.配置文件


1、这个文件主要用来定制u-boot的功能,比如:


/*----------------------------------体系配置----------------------------------*/


#defineCONFIG_ARM920T 1 /*ThisisanARM920TCore */


#define CONFIG_S3C2440 1 /*inaSAMSUNGS3C2440SoC*/


#define CONFIG_HYQ2440 1 /*inaHYQ2440Board*/



/*---------------------------------内存配置--------------------------------------*/


#defineCONFIG_NR_DRAM_BANKS 1 /*wehave1bankofDRAM*/


#definePHYS_SDRAM_1 0x30000000/*SDRAMBank#1*/


#definePHYS_SDRAM_1_SIZE 0x04000000/*64MB*/



/*--------------------------------NorFlash驱动配置-----------------------------*/


#definePHYS_FLASH_1 0x00000000/*FlashBank#1*/


#defineCONFIG_SYS_FLASH_BASE PHYS_FLASH_1


#defineCONFIG_SYS_MAX_FLASH_BANKS 1 /*maxnumberofmemorybanks*/


#defineCONFIG_AMD_LV160B 1


#definePHYS_FLASH_SIZE 0x00200000/*2MB*/


#defineCONFIG_SYS_MAX_FLASH_SECT (35) /*maxnumberofsectorsononechip*/


#defineCONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ)/*TimeoutforFlashErase*/


#defineCONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ)/*TimeoutforFlashWrite*/


需要哪些代码有效,就开启响应的宏。




5.U-Boot编译链接


先编译u-boot,从编译的log反过来看u-boot编译链接过程。


cd/home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot


&&


arm-linux-ld-Bstatic-Tu-boot.lds-Ttext0x33f80000


$UNDEF_SYMcpu/arm920t/start.o


--start-group


lib_generic/libgeneric.a


lib_generic/lzma/liblzma.a


lib_generic/lzo/liblzo.a


cpu/arm920t/libarm920t.a


cpu/arm920t/s3c24x0/libs3c24x0.a


lib_arm/libarm.afs/cramfs/libcramfs.a


fs/fat/libfat.afs/fdos/libfdos.a


fs/jffs2/libjffs2.a


fs/reiserfs/libreiserfs.a


fs/ext2/libext2fs.a


fs/yaffs2/libyaffs2.a


fs/ubifs/libubifs.a


net/libnet.a


disk/libdisk.a


drivers/bios_emulator/libatibiosemu.a


drivers/block/libblock.a


drivers/dma/libdma.a


drivers/fpga/libfpga.a


drivers/gpio/libgpio.a


drivers/hwmon/libhwmon.a


drivers/i2c/libi2c.a


drivers/input/libinput.a


drivers/misc/libmisc.a


drivers/mmc/libmmc.adrivers/mtd/libmtd.a


drivers/mtd/nand/libnand.a


drivers/mtd/onenand/libonenand.a


drivers/mtd/ubi/libubi.a


drivers/mtd/spi/libspi_flash.a


drivers/net/libnet.a


drivers/net/phy/libphy.a


drivers/net/sk98lin/libsk98lin.a


drivers/pci/libpci.a


drivers/pcmcia/libpcmcia.a


drivers/power/libpower.a


drivers/spi/libspi.a


drivers/rtc/librtc.a


drivers/serial/libserial.a


drivers/twserial/libtws.a


drivers/usb/gadget/libusb_gadget.a


drivers/usb/host/libusb_host.a


drivers/usb/musb/libusb_musb.a


drivers/usb/slave/libusb_slave.a


drivers/video/libvideo.a


drivers/watchdog/libwatchdog.a


common/libcommon.a


libfdt/libfdt.a


api/libapi.a


post/libpost.a


board/samsung/hyq2440/libhyq2440.a



--end-group/home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot/lib_arm/eabi_compat.o


-L/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t


-lgcc-Mapu-boot.map-ou-boot


arm-linux-objcopy-Osrecu-bootu-boot.srec


arm-linux-objcopy--gap-fill=0xff-Obinaryu-bootu-boot.bin


从编译log看出,使用链接脚本u-boot.lds来编译,最后生成的起始地址是0x33f80000,把各个平台和驱动下面的libxxx.a链接进来,最后生成u-boot.bin二进制文件。链接脚本对应的是cpu体系下各自的u-boot.lds,


5.1.链接脚本


SECTIONS


{


.=0x00000000;



.=ALIGN(4);


.text:


{


cpu/arm920t/start.o (.text)


board/samsung/hyq2440/lowlevel_init.o (.text)


board/samsung/hyq2440/nand_read.o (.text)


*(.text)


}



.=ALIGN(4);


.rodata:{*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))}



.=ALIGN(4);


.data:{*(.data)}



.=ALIGN(4);


.got:{*(.got)}



.=.;


__u_boot_cmd_start=.;


.u_boot_cmd:{*(.u_boot_cmd)}


__u_boot_cmd_end=.;



.=ALIGN(4);


__bss_start=.;


.bss(NOLOAD):{*(.bss).=ALIGN(4);}


_end=.;


}


链接脚本指定镜像中代码段text,只读数据段rodata,全局初始化数据区data,u-boot命令和全局未初始化数据区bss的排列位置。并且知道,第一段代码是cpu/arm920t/start.o,对应目录下的汇编文件start.S。




[ 新闻来源:互联网,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!