1. arch/arm/lib/ctr0.s
.global _main
_main:
bl board_init_f
2. arch/arm/lib/spl.c
void __weak board_init_f(ulong dummy)
{
board_init_r(NULL, 0);
}
前两布应该还没有初始化串口,所以看不到打印
3. arch/arm/lib/board.c
//从这个函数开始才有打印,而且函数的开头部分也没有打印
void board_init_r(gd_t *id, ulong dest_addr)
{
puts("MMC: ");
mmc_initialize(gd->bd);
}
4. drivers/mmc.c
int mmc_initialize(bd_t *bis)
{
INIT_LIST_HEAD (&mmc_devices);
cur_dev_num = 0;
if (board_mmc_init(bis) < 0) //board_mmc_init实际调用了下面的__def_mmc_init函数
cpu_mmc_init(bis); //cpu_mmc_init确没有调用__def_mmc_init函数
print_mmc_devices(','); //打印mmc总线信息
return 0;
}
static int __def_mmc_init(bd_t *bis)
{
return -1;
}
int cpu_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
int board_mmc_init(bd_t *bis) __attribute__((weak, alias("__def_mmc_init")));
5. arch/arm/cpu/armv7/am33xx/board.c
int cpu_mmc_init(bd_t *bis)
{
int ret;
ret = omap_mmc_init(0, 0, 0);
if (ret)
return ret;
return omap_mmc_init(1, 0, 0);
}
6. drivers/mmc/omap_hsmmc.c
int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max)
{
struct mmc *mmc;
mmc = &hsmmc_dev[dev_index];
sprintf(mmc->name, "OMAP SD/MMC");
mmc->send_cmd = mmc_send_cmd;
mmc->set_ios = mmc_set_ios;
mmc->init = mmc_init_setup;
mmc->getcd = NULL;
mmc_register(mmc);
}
7. drivers/mmc/mmc.c
int mmc_register(struct mmc *mmc)
{
mmc->block_dev.if_type = IF_TYPE_MMC;
mmc->block_dev.dev = cur_dev_num++;
INIT_LIST_HEAD (&mmc->link);
list_add_tail (&mmc->link, &mmc_devices);
}