(一)相关调用流程
我们忽略和分区不相干的代码,研究一下preloader阶段分区相关的代码
platform/mt6765/src/core/main.c
main()
...
bldr_pre_process()
...
platform_init(); //Murphy.liu note:平台初始化
mt_mem_init(); //Murphy.liu note:内存Dram初始化
init_dram_buffer(); //Murphy.liu note:这里你可以理解为保留内存,把内存的一块空间专门拿出来用来存一些数据
...
/*Murphy.liu note:这里CFG_DRAM_ADDR宏是dram的起始地址,platform_memory_size()函数用来获取dram的总大小
*/
if ((u64)CFG_DRAM_ADDR + platform_memory_size() > (u64)DRAM_4GB_SIZE) // Murphy.liu note:如果Dram大小大于4GB
g_dram_buf = DRAM_4GB_SIZE - (5*1024*1024); //Murphy.liu note:这里把“Dram起始地址+4G”位置用来存g_dram_buf
else
//Murphy.liu note:如果Dram大小小于等于4GB
//Murphy.liu note:这里把“Dram末尾地址-5M”位置用来存g_dram_buf
g_dram_buf = CFG_DRAM_ADDR + platform_memory_size() - (5*1024*1024); // Max DRAM size - 5MB
...
boot_device_init(); //Murphy.liu note:启动设备初始化,对于我们来说就是EMMC
return (u32)mmc_init_device();
...
part_init(); //Murphy.liu note:来了,分区初始化(下面有重点去说明这个函数)
/*Murphy.liu note:这个read_gpt用来从pgpt中读取出所需分区的信息*/
read_gpt() //Murphy.liu note:下面有重点去说明这个函数
...
part_dump(); //Murphy.liu note:这里会打印出分区表信息
...
uart_handshake_init(); //Murphy.liu note:初始化用于下载的VCOM口
/*Murphy.liu note:
* 对于我们来说,这个bldr_handshake最重要的作用就是
* 去调用usb_handshake函数去和flash tool USB握手,若成功就load DA进入了download模式了
* DA.bin的作用就是和flashtool通信,用scatter.txt来烧录
*/
bldr_handshake(&handler);
...
/*Murphy.liu note:
* 这里要关心一下了,这里涉及AB分区的概念了
* 简单来说,每一个img都有两个区:AB区,AB去都存同样的img,比如laf.img
* 这里就是对lk两个区的img文件进行检查,那个区的img文件没问题就用那个
*/
ab_ota_boot_check();
...
/*Murphy.liu note:
* 下面这个bldr_load_images函数加载