2. bootloader的代码流程
2.1
入口: u-boot15/board/spreadtrum/ums512_1h10_go/u-boot.lds
ENTRY(_start) //当前入口_start
.text : { *(.__image_copy_start) //入口 CPUDIR/start.o (.text*)代码段 *(.text*)
}
2.2 start.S
bl main
2.3 arch/arm/lib/crt0_64.S
设置初始化C运行环境,然后调用board_init_f(0)函数
bl board_init_f
2.4 arch/arm/lib/board.c
这是板级初始化的函数流程的集合
1) board_init(); ==> u-boot15/board/spreadtrum/ums512_1h10_go/ums512_1h10_go.c
一些列初始化: 串口,终端,gpio,led等
2) board_late_init() => ums512_1h10_go.c: 充电初始化,按键初始化
3) 进入循环
819 /* main_loop() can return to retry autoboot, if so just run it again. */
820 for (;;) {
821 main_loop();
822 }
2.5 main.c
main_loop(); 循环处理命令
准备:
include/env_default.h : default_environment默认环境变量设置
35 "bootcmd=" CONFIG_BOOTCOMMAND "\0"
==> include/configs/ums512_1h10_go.h
216 #define CONFIG_BOOTCOMMAND "cboot normal"
main_loop ==> s = bootdelay_process(); //获取环境变量,获取boot_cmd参数
==> 执行 cboot 和 normal 命令 : autoboot_command(s);
2.6 autoboot_command(s);
解析: 处理命令列表
最终: cmdtp = find_cmd(argv[0]); ==》 rc = cmd_call(cmdtp, flag, argc, argv);
2.7 uboot 命令之cboot的执行
common/cmd_cboot.c
==> do_cboot 此处,判断开机的模式
cboot, CONFIG_SYS_MAXARGS, 1, do_cboot
命令cboot 需要带一个参数, 所以cboot normal 就是执行参数。
疑问:display 的初始化和亮屏都在哪里设置呢?
cboot ==> 开机模式 ==》 正常开机模式:
normal_mode ==> vlx_nand_boot(BOOT_PART, BACKLIGHT_ON, LCD_ON);
==> _uboot_set_preload(lcd_enable, backlight_set);
==> preload->display(LOGO_NORMAL_POWER, brightness, lcd_enable);
==> ./common/loader/loader_nvm.c : .display = logo_display,
==> void logo_display(int index, int backlight_value, int lcd_enable)
==> drv_lcd_init(); //lcd 的初始化
set_backlight(backlight_value);// 设置背光
ps : drv_lcd_init ==> lcd_init(lcd_base); ==> lcd_ctrl_init(lcdbase); ==>
drivers/video/sprd/sprd_main.c : sprdfb_probe
==>
178 static int sprdfb_probe(void)
179 {
180 sprd_panel_probe();
181 sprd_dispc_probe();
182
183 return 0;
184 }
至此: uboot 流程已经分析完毕.