前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux BSP实战课(SoC bringup篇):Uboot的初始化过程

Linux BSP实战课(SoC bringup篇):Uboot的初始化过程

作者头像
刘盼
发布2023-11-13 15:48:38
3810
发布2023-11-13 15:48:38
举报
文章被收录于专栏:人人都是极客人人都是极客
  • Uboot 启动
  • 驱动
  • 交互
    • booti
  • Kernel 启动

Uboot 启动

board_init_r 是执行 Uboot 的关键函数,该函数定义在 common/board_r.c 中,主要作用是进行一些必要的初始化工作,然后根据相关的配置情况,读取 Uboot,并启动它。

代码语言:javascript
复制
void board_init_r(gd_t *new_gd, ulong dest_addr)
{
......
#ifdef CONFIG_NEEDS_MANUAL_RELOC
        int i;
#endif
......
        gd->flags &= ~GD_FLG_LOG_READY;

#ifdef CONFIG_NEEDS_MANUAL_RELOC
        for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
                init_sequence_r[i] += gd->reloc_off;
#endif

        if (initcall_run_list(init_sequence_r))
                hang();

        /* NOTREACHED - run_main_loop() does not return */
        hang();
}

nit_sequence_r 中存储着一系列的初始化函数,initcall_run_list 确保了各系统初始化的顺序运行。根据 CONFIG_XX 来使能相应的驱动,最后 run_main_loop 进入循环。如下所示:

代码语言:javascript
复制
static init_fnc_t init_sequence_r[] = {
        ......
        initr_barrier,
        //初始化gd中与malloc相关的成员
        initr_malloc,
        //log初始化
        log_init,
        initr_bootstage,        /* Needs malloc() but has its own timer */
        ......
#ifdef CONFIG_DM
        //初始化驱动模型相关
        initr_dm,
#endif
#ifdef CONFIG_ADDR_MAP
        initr_addr_map,
#endif
#if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV) || \
        defined(CONFIG_SANDBOX)
        //板子初始化
        board_init,     /* Setup chipselects */
#endif
        ......
        initr_dm_devices,
        stdio_init_tables,
        //串口初始化
        serial_initialize,
        initr_announce,
#if CONFIG_IS_ENABLED(WDT)
        //看门狗初始化
        initr_watchdog,
#endif
        ......
        //上电
        power_init_board,
        ......
#ifdef CONFIG_MMC
        //mmc初始化
        initr_mmc,
#endif
        ......
        //串口
        console_init_r,         /* fully init console as a device */
#ifdef CONFIG_DISPLAY_BOARDINFO_LATE
        console_announce_r,
        //打印版子信息
        show_board_info,
#endif
        ......
        interrupt_init,
#if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
        //定时器
        timer_init,             /* initialize timer */
#endif
#if defined(CONFIG_LED_STATUS)
        //led
        initr_status_led,
#endif
        /* PPC has a udelay(20) here dating from 2002. Why? */
#ifdef CONFIG_CMD_NET
        //网络
        initr_ethaddr,
#endif
        ......
        run_main_loop,
};

驱动

从上面的代码可以知道 init_sequence_r 会根据宏定义初始化相应的功能,这里列出主要的几个,如下所示:

这里我们重点关注 mmc 和 net 驱动的初始化。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人人都是极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Uboot 启动
  • 驱动
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档