BeagleboneBlack的u-boot
Posted 小唐的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BeagleboneBlack的u-boot相关的知识,希望对你有一定的参考价值。
在玩BeagleboneBlack一段时间之后不可避免地接触到了u-boot,之前的玩耍过程大致上是这样的:
在MATLAB下耍,因为MATLAB提供了它的硬件支持,可以直接在命令行与之交互,也可在simulink下直接编译仿真模型下载到板子上运行,当时的感觉是,我勒个去,MATLAB真是无所不能。
在MATLAB下耍了一段时间之后,开始在BBB本身的Linux系统上耍,主要照着Derek Molly的那本书耍,操作GPIO,使用传感器等等。发现在Linux下操作硬件怎么这么容易,以前玩的51,430,STM32貌似都是要操作寄存器的。
接着发现了TI的StartWare,之前玩430的时候在CCS里面看到过这东西,不知道是啥,安装了也不知道是几个意思,现在才知道原来它就相当于BBB的库文件,有裸奔之用。看过几个例程之后发现,接近5k页的datasheet,读完不现实。
不过处理器的启动过程总是值得关注的,AM3358启动过程中需要一个MLO文件,那MLO是怎么来的,于是来到了u-boot面前。。。下载u-boot的源码(2017-03-r1),读了一下readme,大致知道怎么用了,依次敲入
make am335x_boneblack_defconfig
make all CROSS_COMPILE=arm-linux-gnueabihf-
编译了一大堆的文件,貌似有一两百个,看看顶层的Makefile,1600行,这可真够我喝一池子了,一点头绪都没有,然后找了本书《嵌入式Linux系统开发入门宝典——基于Cortex-A8处理器》,人家用2014-04来分析的,于是我也照着来。
敲入make am335x_boneblack_config之后发生了什么:
顶层Makefile:
目标:am335x_boneblack_config
第460行展开:mkconfig -A am335x_boneblack
mkconfig -A am335x_boneblack干了什么:
读取board.cfg文件
创建两个符号链接:
arch-am33xx -->> asm/arch
proc-armv -->> asm/proc
生成两个文件:
include/config.mk
include/config.h
敲入make all CROSS_COMPILE=arm-linux-gnueabihf-之后发生了什么:
顶层Makefile:
目标:all
744行:all: ALL-y
698行:ALL-y展开成u-boot.srec u-boot.bin System.map
703行:CONFIG-SPL=y,第一在include/autoconf.mk文件中,此文件在第1045行依赖include/config.h自动生成。所以ALL-y添加一个spl/u-boot-spl.bin 704行:ALL-y添加一个u-boot.img
以u-boot.bin为例:
771行:u-boot.bin: u-boot FORCE
918行:u-boot: u-boot-init u-boot-main u-boot.lds
930行:u-boot-init u-boot-main: u-boot-dirs
642行:u-boot-init展开为arch/arm/cpu/armv7/start.o
643行:u-boot-main展开为一系列的lib目录后面加上built-in.o,所以编译后每个lib目录下都有个built-in.o文件
636行:u-boot-dirs展开为一些列的lib目录,例如lib/
939行:u-boot-dirs: prepare scripts
命令展开:make -f scripts/Makefile.build obj=u-boot-dirs,表示以scripts/Makefile.build作为文件,变量obj=u-boot-dirs,来执行make。未指定目标。其中,build变量位于scripts/kbuild.include文件中,在第316行包含进来。
scripts/Makefile.build文件:
17 行:目标:__build
172 行:展开成__build: builtin-target
413 行:builtin-target: obj-y
obj-y定义在开头,在第64行包含kbuild-file文件,此文件是需要编译的目录(那一系列的libs目录)下的Makefile文件,以目录lib/为例
lib/Makefile文件:
8 行:根据CONFIG_SPL_BUILD变量修改变量obj-y的内容,也就决定了那些文件需要被编译,
这些CONFIG_打头的变量定义在autoconf.mk文件中。此时的CONFIG_SPL_BUILD还未定义,obj-y展开就是zlib/ crc7.o...obj-y也就是一系列的.o文件和某些目录,他们的依赖关系在哪呢。
对于.o文件,make有隐含规则会将.c文件编译成.o文件,但是Makefile里面很多地方都取消了隐含规则,所以好像不是采用的隐含规则。比较有可能的是在第334行:obj/%.o: src/%.c,但是却又和obj-y的值不匹配,如果再看看顶层Makefile的1340行:%.o: %.c...这样貌似说得通。
对于目录,第480行,变量subdir-ym估计记录了目录信息,然后去该目录下再去执行同样的过程。
这些文件全部编译过之后,在第918行,对于u-boot目标,还缺一个u-boot.lds文件。
1056行: u-boot.lds: LDSCRIPT prepare FORCE
503 行: LDSCRIPT = board/ti/am335x/u-boot.lds
这样所有的文件都有了之后,变得到了u-boot.bin和其他的映像文件
MLO文件在哪儿呢,对与ALL-y,还有一个目标:spl/u-boot-spl.bin
1079行: spl/u-boot-spl.bin: spl/u-boot-spl
1081行: spl/u-boot-spl: tools prepare
@make obj=spl -f spl/Makefile all
以spl/Makefile为文件,变量obj=spl,all为目标,执行make
spl/Makefile:
22 行: 定义了CONFIG_SPL_BUILD变量
191 行: 目标:all: $(ALL-y)
变量ALL-y展开为spl/u-boot-spl.bin MLO MLO.byteswap,其中MLO和MLO.byteswap定义在arch/arm/cpu/armv7/am33xx/config.mk文件中于是在编译spl/u-boot-spl.bin目标的时候便会编译出MLO文件了
再去看看2017-03-r1的u-boot,文件目录有所变化,Makefile变得更长了,执行make am335x_boneblack_defconfig的过程貌似也不太一样,不过主要的结构我想应该还是相似的吧,算了,不打算再仔细看了。。。
以上是关于BeagleboneBlack的u-boot的主要内容,如果未能解决你的问题,请参考以下文章
Beaglebone Black教程Beaglebone Black的引脚分配
beaglebone black 是不是支持 gpu 硬件加速?
BeagleBone Black教程之BeagleBone Black设备的连接