bootload 启动过程

2019-04-14 18:10发布

手机上电启动过程如下:       1  上电执行ROM程序加载pre-load(保存在nand emmc )到ISRAM,然后跳转到pre-load执行       2   进行必要的硬件初始化操作,加载uboot到DRAM并跳转到U-boot执行       3  uboot加载kernel,ramdisk 并跳转到kernel执行。 通常分为两个阶段,pre-load 和 Uboot.       pre-load:  安全检查,保护ROM信息(qcm refuse),初始化必要硬件(uart usb)                        CPU 和内存时钟调整,PLL,UART,DRAM,GPIO,PMU,RTC,USB,       Uboot : time 初始化,serial初始化,I2C,PWM,RTC,LED,Power charging,LCD ,NAND.后加载kernel 和ramdisk到RAM,并 跳转到kernel执行。    Android 的bootload启动通过选择u-boot  XXX的一个版本,进行移植以适用手机开发平台的个别需求,加载linux kernel .        其中比较重点的部分:Uboot  传递给Kernel的参数R1(指明Machine Type),R2(Kernel Tags的物理地址)指向一个链表       ATAG_CORE: 必须是第一个,指明系统页大小,设备序列号等       ATAG_MEM:  物理内存的大小,起始地址       ATAG_RAMDISK:解压ramdisk的大小,起始地址        。。。。。。。。。。。。       ATAG_NONE  :结束该链表的标志      这两个R1,R2通常保存在Uboot的全局变量中      接口函数:board_init 获取machine type 并初始化基本硬件(在platformXXXXubootXXX_board.c )                          do_nand_boot 获取kernel tags 并保存在R2 ,从Flash中加载kernel ,ramdisk 到DRAM,并跳转到linux kernel 执行。(bootloadubootarcharmlibootm.c)       通常这些参数都定义在ubootincconfigsxxx.h中,CFG_RAMDISK_LOAD_ADDR, CFG_BOOTIMG_LOAD_ADDR ,CFG_BOOTAGRS_ADDR        也可以通过修改CONFIG_BOOTAGRS 传递给kernel(console , bate root ) .