加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

uboot代码运行问题 --- 留给自己的做---提醒

发布时间:2020-12-15 18:39:42 所属栏目:百科 来源:网络整理
导读:1、 今天才发现的问题,关于uboot源码的运行问题。 今天在分析UBOOT源码的 start_armboot 函数中的源码时,遇到了下面这几行代码,如下所示: ----------------------------------------------------------------------------------------------- ? ?#if def

1、

今天才发现的问题,关于uboot源码的运行问题。今天在分析UBOOT源码的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

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

2、Nand.c (driversnand) ? ? ? ? ? ??void nand_init(void)中的代码:


#if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY)


#include <nand.h>


#ifndef CFG_NAND_BASE_LIST
#define CFG_NAND_BASE_LIST { CFG_NAND_BASE }
#endif


int nand_curr_device = -1;
nand_info_t nand_info[CFG_MAX_NAND_DEVICE];


static struct nand_chip nand_chip[CFG_MAX_NAND_DEVICE];
static ulong base_address[CFG_MAX_NAND_DEVICE] = CFG_NAND_BASE_LIST;


static const char default_nand_name[] = "nand";


extern void board_nand_init(struct nand_chip *nand);


static void nand_init_chip(struct mtd_info *mtd,struct nand_chip *nand,
? ulong base_addr)
{
mtd->priv = nand;


nand->IO_ADDR_R = nand->IO_ADDR_W = (void ?__iomem *)base_addr;
board_nand_init(nand);


//printf("nand_init_chip!n");


if (nand_scan(mtd,1) == 0) {
if (!mtd->name)
mtd->name = (char *)default_nand_name;
} else
mtd->name = NULL;


}


void nand_init(void)
{
int i;
unsigned int size = 0;
for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) {
nand_init_chip(&nand_info[i],&nand_chip[i],base_address[i]);
size += nand_info[i].size;
if (nand_curr_device == -1)
nand_curr_device = i;
}
printf("%lu MB ",size / (1024 * 1024));


#if defined(CFG_NAND_FLASH_BBT)
printf("(Flash Based BBT Enabled)");
#endif


printf("n");


#ifdef CFG_NAND_SELECT_DEVICE
/*
* Select the chip in the board/cpu specific driver
*/
board_nand_select_device(nand_info[nand_curr_device].priv,nand_curr_device);
#endif
}


#endif

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

看到上面的两端代码就应该明白了吧!

也意识到uboot的条件编译是多么的重要!

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

(编辑:李大同)

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

    推荐文章
      热点阅读