码迷,mamicode.com
首页 > 其他好文 > 详细

BeagleboneBlack的u-boot

时间:2017-02-20 12:36:31      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:arm-linux   变量   oss   linux   匹配   开发   black   olly   build   

在玩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

标签:arm-linux   变量   oss   linux   匹配   开发   black   olly   build   

原文地址:http://www.cnblogs.com/heyxiaotang/p/6418532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!