bbb u-boot mmc总线初始化分析

来源:互联网 发布:成志网络 编辑:程序博客网 时间:2024/06/06 13:05

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);
}


0 0