NanoPC-T2 Uboot启动过程分析 - 2-3 init_sequence_f[] part 1

在继续分析之前,先回顾一下当前相关寄存器的值与内存空间的使用情况。


Registers:

r0 = 0

r9 = 0x42BF_FF60 @ &gd

r13 = &( bl mmu_turn_on ) @ /uboot-root/arch/arm/cpu/slsiap/s5p4418/start.S

sp = 0x42BF_FF60

lr = &( bl board_init_f ) @ /uboot-root/arch/arm/cpu/slsiap/s5p4418/start.S

RAM:

0xC000_0000

 UBoot

0x42C0_0000

 GD (struct global_data)

0x42BF_FF60

 UBoot-Stack

0x4000_0000

现在,我们从 \/uboot-root\/common\/board_f.c 的 board_init_f() 继续进行分析。在上一节中,我们已经分析了initcall_run_list() 这个函数要调用 init_sequence_f[] 里的函数。在调用之前,先整理一下当前 UBoot 栈里大致的内容:


== stack buttom ==

/uboot-root/common/board_f.c -- board_init_f()

&init_sequence_f[]

==>

/uboot-root/lib/initcall.c -- initcall_run_list()

==>

首先,被调用的是 setup_mon_len()。其代码如下:


static int setup_mon_len(void)

{

 gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;

 return 0;

}

由于 gd->mon_len 不容易计算出具体的值是多少,因此本人将该值通过板子直接输出出来,得到的结果是473476。因此 gd 的内容得到的更新如下:


unsigned long flags = 0

unsigned long have_console = 0

unsigned long mon_len = 0x0007_7988

接下来调用的是 setup_fdt()。其代码如下:


static int setup_fdt(void)

{

 /* Allow the early environment to override the fdt address */

 gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,

 (uintptr_t)gd->fdt_blob);

 return 0;

}

在这段代码中,使用了 getenv_ulong() 去取环境变量的值。该函数如果找到环境变量,则返回该环境变量的值,否则返回设定的默认值。在这里,默认的环境变量保存在 \/uboot-root\/include\/env_default.h 中的 default_environment[] 数组里。由于默认没有 fdtcontroladdr 这个环境变量,因此 gd->fdt_blob 的值没有变。

接下来调用的是 trace_early_init() 和 arch_cpu_init()。由于其代码为空,因此忽略。

接下来调用的是 mark_bootstage()。该函数用于记录 UBoot 运行的阶段,仅为里程碑式的作用。因此忽略。

接下来调用的是 board_early_init_f()。该函数为于 \/uboot-root\/board\/s5p4418\/nanopi2\/board.c 中。其代码如下:


int board_early_init_f(void)

{

 bd_gpio_init();

 bd_alive_init();

 bd_bootdev_init();

 bd_onewire_init();

 return 0;

}

该函数做的是和板子相关的初始化工作。首先是初始化所有GPIO引脚的寄存器,定义所有GPIO的功能。第二是设置唤醒功能。第三是判断CPU是从EMMC(通道2)启动还是从SD卡(通道0)启动。第四是初始化LCD触摸屏的操作。由于这里四个工作与板子硬件有关,而且与UBOOT的执行流程没有较大影响,因此这里不详细展开分析。

接下来调用的是 env_init()。该函数位于 \/uboot-root\/common\/env_mmc.c 中。其代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值