微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > u-boot 启动过程 —— 基于S3C2410

u-boot 启动过程 —— 基于S3C2410

时间:11-10 来源:互联网 点击:

然后在一个for循环中从init_sequence地址开始,逐个调用初始化C函数至NULL为止。这些routine函数按调用顺序分别是

  1. cpu_init() ——在common/main.c文件,执行初始化中断栈操作
  2. board_init() ——在board/neo1973/gta01/gta01.c文件中,执行板级初始化,主要是更新GPIO和PLL设置
  3. interrupt_init() ——在/cpu/arm920t/s3c24x0/interrupts.c文件中,执行时钟中断初始化
  4. env_init() ——在common/env_nand.c文件中,设置缺省环境变量
  5. init_baudrate() ——在lib_arm/board.c文件中,将环境变量中的baudrate存入bd_info结构bd
  6. serial_init() ——在common/serial.c文件中,调用驱动中真正的init()初始化串口
  7. console_init_f() ——在common/console.c文件中,更新global_data结构gd的have_console标记为1
  8. display_banner() ——在lib_arm/board.c文件中,打印u-boot banner,输出版本、运行地址等信息。比如在控制台看到的
  9. init_func_i2c() ——在lib_arm/board.c文件中,初始化i2c总线
  10. dram_init() ——在board/neo1973/gta01/gta01.c文件中,填充bd->bi_dram[0]的start和size成员,用来描述u-boot可用的ram
  11. display_dram_config() ——在board/neo1973/gta01/gta01.c文件中,打印当前ram配置。在控制台能够看到相应的 DRAM: 128 MB

利用gdb可以清晰的看到调用过程:

DE>         DE>DE>for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { DE>DE>         DE>DE>         DE>DE>if ((*init_fnc_ptr)() != 0) { DE>DE>         DE>DE>         DE>DE>         DE>DE>hang (); DE>DE>         DE>DE>         DE>DE>} DE>DE>         DE>DE>} DE>

接着是一些可选外设的初始化,如显示屏、nor、nand、dataflash、网卡等,此过程执行后全部初始化工作完成。下面仅粘贴nor代码:

DE>#ifndef CFG_NO_FLASH DE>DE>         DE>DE>/* configure available FLASH banks */ DE>DE>         DE>DE>size = flash_init (); DE>DE>         DE>DE>display_flash_config (size); #endif /* CFG_NO_FLASH */ DE>

之后在457行进入无限循环,调用common/main.c文件的278行main_loop()函数,u-boot完成启动过程。main_loop提供一个交互式命令行,可通过串口或usb控制台操作,也可以进一步引导操作系统:

DE>         DE>DE>for (;;) { DE>DE>         DE>DE>         DE>DE>main_loop (); DE>DE>         DE>DE>} DE>

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top