1、Fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。Include:头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件。Lib_arm:存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数,与ARM体系结构相关的代码。Lib_*:某一架构通用的文件。Lib_generic:通用的多功能函数实现。Nand_spl:Uboot一般从ROM、NORFlash等设备启动,现在开始执行NANDFlash启动,但是支持的CPU种类还不多。Net:与网络有关的代码,BOOTP协议、TFTP协议RA
2、RP协议和NFS文件系统的实现。Post:上电自检程序。Rtc: 实时时钟驱动。Tools:创建S-Record格式文件和U-BOOT images的工具。1.2 编译程序进入源码目录执行:make distclean -清除所有生成的文件make NAME_config -根据自己使用的开发板进行配置make all -编译源码2、uboot的配置过程从README文件中我们知道了make NAME_config是用来对自己的开发板进行配置的,那就先来看下到底是怎么配置的。这边假设我们的板子是smdk6410,那么应该在源码目录执行make smdk6410_configmake调用的是顶层
3、目录下的Makefile文件,我们传参数是smdk6410_config,所以在Makefile中找到smdk6410_config的相应部分如下:smdk6410_config : unconfig$(MKCONFIG) $(:_config=) arm s3c64xx smdk6410 samsung s3c6410先分析下这条规则:smdk6410_config:规则的目标名unconfig:规则的依赖,这个在Makefile文件的342行可以找到,如下:unconfig:rm -f $(obj)include/config.h $(obj)include/config.mk $(obj
4、)board/*/config.tmp $(obj)board/*/*/config.tmp这个就不在分析,就是删除一些文件。第二行开头的:表示该行命令的输出被抑制,即执行的时候不会在终端上打印出来。$(MKCONFIG):MKCONFIG这个变量在92行定义MKCONFIG:=$(SRCTREE)/mkconfig,而变量SRCTREE在87行定义SRCTREE :=$(CURDIR),而CURDIR是Makefile自带的变量表示当前目录,所以$(MKCONFIG)就是当前目录下的mkconfig文件,即顶层目录下的mkconfig文件。$(:_config=):$是make的自动变量,标
5、识规则的目标名,即smdk6410_config。_config=)意思就是 $ 中的“_config”替换为空,也就是删掉目标中“_config”这个子串。所以这边$(:_config=)为smdk6410。这样看的话在配置时,执行make smdk6410_config实际上执行的是:./mkconfig smdk6410 arm s3c64xx smdk6410 samsung s3c6410到这才真正地开始配置开发板,接下来带着这条命令详细分析下mkconfig这个文件。1 #!/bin/sh -e/选项-e表示一个命令在执行后返回一个非0状态值时,就退出23 # Script to
6、create header files and links to configure4 # U-Boot for a specific board.5 #6 # Parameters: Target Architecture CPU Board VENDOR SOC7 #8 # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk 9 #1011 APPEND=no # Default: Create new config file/APPEND=no这边表示重新创建一个文件,APPEND=yes表示将内容追加到原来的文件中12 BOAR
7、D_NAME= # Name to print in make output/BOARD_NAME为开发板的名字1314 while $# -gt 0 ; do15 case $1 in16 -) shift ; break ;17 -a) shift ; APPEND=yes ;18 -n) shift ; BOARD_NAME=$1%_config ; shift ;19 *) break ;20 esac21 done/$# 将扩展成传递给脚本的参数的数目$* 将扩展成传递给脚本的所有参数shift 将$*中的剩余的参数向左移动一个位置并减少$#的值1/14-21行判断“./mkconf
8、ig smdk6410 arm s3c64xx smdk6410 samsung s3c6410”命令中是否有“-”,“-a”,“-n”等符号,/这边没有,所以不做任何事情,11行和12行的变量仍然维持原来的值。2223 $BOARD_NAME | BOARD_NAME=/先判断BOARD_NAME是否为空,为空将命令中的第一个参数smdk6410赋值给BOARD_NAME,即这边BOARD_NAME为“smdk6410”2425 $# -lt 4 & exit 126 $# -gt 6 & 表示参数的个数,如果参数个数小于4或者大于6就退出,这边$#=6,所以可以继续往下执行。2728 ec
9、ho Configuring for $BOARD_NAME board./打印出开发板的名字2930 #31 # Create link to architecture specific headers/创建体系结构相关的头文件链接32 #33 if $SRCTREE != $OBJTREE ; then34 mkdir -p $OBJTREE/include35 mkdir -p $OBJTREE/include236 cd $OBJTREE/include237 rm -f asm38 ln -s $SRCTREE/include/asm-$2 asm39 LNPREFIX=././in
10、clude2/asm/40 cd ./include41 rm -rf asm-$242 rm -f asm43 mkdir asm-$244 ln -s asm-$2 asm45 else46 cd ./include47 rm -f asm48 ln -s asm-$2 asm49 fi/33行判断源码目录SRCTREE和目标文件目录SRCTREE是否一样,SRCTREE和SRCTREE在顶层Makefile中定义,/这边要判断,是因为可以选择在其他目录下编译u-boot的源码,这样可以令源代码目录保存干净,这时SRCTREE和SRCTREE的值就不一样了/不过我们一般都习惯直接就在源码目
11、录下编译的,所以SRCTREE和OBJTREE都为当前目录,/那么33行条件不成立,将执行else分支的代码。/46-48行进入include目录,删除asm文件(这是上一次配置时建立的链接文件),/然后再次建立asm文件,并令它链接向asm-$2目录,即asm-arm($2表示第二个参数arm)5051 rm -f asm-$2/arch/删除asm-$2/arch目录,即删除asm-arm/arch5253 if -z $6 -o = NULL54 ln -s $LNPREFIXarch-$3 asm-$2/arch55 else56 ln -s $LNPREFIXarch-$6 asm-
12、$2/arch57 fi/$6表示第6个参数s3c6410,不为空,也不为“NULL”,53行条件不满足,将执行else分支/其中LNPREFIX为空,$6表示第6个参数s3c6410,$2表示第2个参数arm/所以“ln -s $LNPREFIXarch-$6 asm-$2/arch”即ln -s arch-s3c6410 asm-arm/arch/前面有进入include目录,这时还在include目录下,/所以意思是在asm-arm下创建符号链接arch指向arch-s3c64105859 # create link for s3c24xx SoC60 if $3s3c24xx61 rm
13、 -f regs.h62 ln -s $6.h regs.h63 rm -f asm-$2/arch64 ln -s arch-$3 asm-$2/arch65 fi6667 # create link for s3c64xx SoC68 if s3c64xx69 rm -f regs.h70 ln -s $6.h regs.h71 rm -f asm-$2/arch72 ln -s arch-$3 asm-$2/arch73 fi/$3表示第三个参数s3c64xx,所以满足68行的if语句,注意的是,这时还在include目录下操作/删除regs.h文件,$6表示第6个参数s3c6410,所以“ln -s $6.h regs.h”表示“ln -s s3c6410.h regs.h”/$2表示第2个参数arm,$3表示第三个参数s3c64xx,所以后面两句分别是/rm
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1