歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

U-Boot代碼運行問題解決

相關閱讀:U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

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 (board\samsung\smdk6410)         void nand_init(void)

2、Nand.c (drivers\nand)                                        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 (board\samsung\smdk6410)    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

---------------------------------------------------------------

Copyright © Linux教程網 All Rights Reserved