手机上电启动过程如下:
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 ) .