加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

U-Boot代码运行问题处理

发布时间:2021-11-23 13:28:25 所属栏目:教程 来源:互联网
导读:1、 今天才发现的问题,关于U-Boot源码的运行问题。今天在分析U-Boot源码的start_armboot 函数中的源码时,遇到了下面这几行代码,如下所示: ------------------------------------------------------------ #if defined(CONFIG_NAND) puts (NAND: ); nand_i
1、
 
今天才发现的问题,关于U-Boot源码的运行问题。今天在分析U-Boot源码的start_armboot 函数中的源码时,遇到了下面这几行代码,如下所示:
 
------------------------------------------------------------
 
   #if defined(CONFIG_NAND)
    puts ("NAND:    ");
    nand_init();/* go init the NAND */
   #endif
 
----------------------------------------------------------------------------------------------
 
于是我就追踪nand_init()这个函数的源码,在两个地方出现了:
 
--------------------------------------------------------------------------
 
1、Smdk6410.c (boardsamsungsmdk6410)         void nand_init(void)
 
2、Nand.c (driversnand)                                        void nand_init(void)
 
--------------------------------------------------------------------------
 
于是我就很想当然的认为应该运行 上面      1     中的nand_init(void)函数(因为我关注的是smdk6410平台,当时还有点疑惑,为什么运行第一个而不是第二个?)结果证明我是错误的。
 
2、错误的发现。
 
我打开开发板运行时停在uboot下,通过 串口看到一个现象,如下所示:
 
 
 
--------------------------------------------------------------------------------------------------
 
很明显上面打印信息中的NAND是通过下面打印的,那s3c_nand_oob_mlc_128是在那里打印的呢?
 
-------------------------------------------------------------------------
 
   #if defined(CONFIG_NAND)
   puts ("NAND:    ");
   nand_init();/* go init the NAND */
   #endif
 
-------------------------------------------------------------------------
 
于是我就追踪s3c_nand_oob_mlc_128,结果发现,按在上面第 1 种方式调用函数根本就无法输出这样的信息,只有按第2中方式调用,才能打印出上面的信息,虽然证实了是第2中调用方式,但不太明白为什么?
 
3、
 
原来我忽略了一个很重要的问题--------------条件编译,直接看代码:
 
---------------------------------------------------------------
 
1、Smdk6410.c (boardsamsungsmdk6410)    void nand_init(void)中的代码:
 
 
 
#if (CONFIG_COMMANDS & CFG_CMD_NAND) && defined(CFG_NAND_LEGACY)
#include <linux/mtd/nand.h>
extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
void nand_init(void)
{
nand_probe(CFG_NAND_BASE);
        if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN) {
                print_size(nand_dev_desc[0].totlen, "n");
        }
}
#endif

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读