This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x u-boot 编译疑惑



  大家好。我最近在学习U-Boot(版本为2013-05),但是在分析源码的时候,有一个疑惑。

  U-boot的两个阶段(生成MLO和u-boot.img)是公用一个start.S的,但是在start.S中有这样一段代码:

  #ifndef CONFIG_SKIP_LOWLEVEL_INIT

        bl   cpu_init_cp15

        bl   cpu_init_crit

#endif

而在include/configs/am335x_evm,.h中有这样的定义:

#ifndef   CONFIG_SPL_BUILD

#define  CONFIG_SKIP_LOWLEVEL_INIT

#endif

照理来说,cpu_init_cp15、 cpu_init_crit在第一阶段(SPL)会编译,而第二阶段不参与编译。

但是我编译成功后分别参考了spl下的u-boot-spl.map和顶层目录的u-boot.map(当然我这里是没指定O=的)

发现两个map文件都执行了cpu_init_cp15这个函数,我猜想可能在某个地方定义这个宏,但是我用egrep

找的时候没找到答案。主要是这个疑惑,希望了解的人可以解答一下,谢谢。

  • 可以考虑用jtag跟下,看是不是真的运行了两遍

  • CONFIG_SPL_BUILD这个宏在编译SPL的时候define了,可以参考uboot/spl/目录下的makefile。

    而在编译u-boot的时候,CONFIG_SPL_BUILD这个宏没有define,在am335x_evm.h中就会define CONFIG_SKIP_LOWLEVEL_INIT,因此对于U-boot,start.s中的这段代码:

    #ifndef CONFIG_SKIP_LOWLEVEL_INIT
     bl cpu_init_cp15
     bl cpu_init_crit
    #endif

    表明在u-boot下cpu_init_cp15()和cpu_init_crit()这两个函数都不会被调用执行。

  • 谢谢回复。我本来也是这样想的,但是看编译好的u-boot.map中确实编译了cpu_init_cp15这个函数,这也是我不解的。顺道问一下U-Boot进入board_init_r进行各个初始化之后,最后调用main_loop(),但是在main_loop()实现中我一直找不到引导内核的函数?能否告知下?谢谢。

  • 编译了不等于运行了。

    关于uboot,我建议可以一边读代码,一边参考 http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/16735.aspx 进行调试看看。

  • 你好,谢谢回复。.map文件不是根据.bin或者.img生成的吗?当我们执行这两者的时候,不是就执行了吗?可能我对这个的认识是错的。这份文档我之前看过了,但

    是我手上也没有JTAG,学生仔。对了,我又衍生了一个问题。我看了am335x的数据手册第26章初始化这一章,当系统上电的时候(我的开发板是从eMMC或SD启

    动),会先执行ROM的代码,而ROM会拷贝MLO到内部的SRAM执行, 手册说image header(这里指MLO吧)会说明拷贝到哪以及拷贝镜像的大小,我也看到了,

    比如该头部会说明下载到哪个地址,比如0x402F_0400,还有image大小,这里我就有一个疑惑,是只拷贝MLO,还拷贝MLO和u-boot.img一部分(两个都拷贝肯

    定不行,SRAM没那么大),这个拷贝大小是在链接文件里说明的吗,请问是哪个链接文件?

  • 1. map文件不是执行的,只是一个index,表明了函数的入口,有入口,不代表会执行。

    2. 你可以考虑买个第一代的beaglebone,也不贵,而且这个板子本身就带有xds100v2的仿真器。

    3. 关于你问的MLO和uboot的问题,你可以上我们的wiki上看看uboot的文档。