高通平台Android源码bootloader分析之sbl1(一)
高通平台Android源码bootloader分析之sbl1(二)
高通平台Android源码bootloader分析之sbl1(三)
在上一篇博文中主要描述了启动流程,及代码执行流程,并重点介绍了一下我重点关注的部分。这个sbl部分也算有点庞大,我们没有精力也没有必要去分析全部,所以接下来就来分析一下sbl1中另外几个需要格外关注的部分:
- CDT :主要提供平台设备数据
- log system:log日志系统,当然没有kernel里面那么强大了
- download:代码下载烧写实现
- ramdump:异常信息dump
本篇博文就先来分析一下CDT, 其他部分后面再分析。CDT
CDT主要提供Platform ID、ddr硬件配置等平台设备数据。很多module利用这些信息去减少依赖及执行动态初始化。CDT通常被厂家写入EEPROM中,如没有eeprom则会在编译bootloader时链入。
sbl中主要涉及到如下关键文件:1
2
3
4boot_images\core\boot\secboot3\hw\msm8916\boot_cdt_array.c // config_data_table配置表定义
boot_images\core\systemdrivers\platforminfo\src\PlatformInfo.c
boot_images\core\boot\secboot3\scripts\cdt_generator.py
boot_images\core\boot\secboot3\scripts\jedec_lpddr3_single_channel.xmlboot程序加载CDT
对于CDT,boot程序主要有如下动作:
- sbl1校验eMMC的boot分区中的CDT分区,如果ok,则加载CDT镜像,如果不ok,则执行第2步;
- sbl1从sbl1.mbn中加载默认cdt分区表(config_data_table[]);
- sbl1通过SMEM将平台信息传递到lk;sbl1 - SMEM_HW_SW_BUILD_ID,lk - SMEM_BOARD_INFO_LOCATION.
- lk获取平台信息,加载dt头,然后搜寻相应的dt入口;
- lk通过正确的dt入口地址跳转到kernel。
关键函数:
1 | #sbl1 |
关键枚举:
1 | #boot_images\core\api\systemdrivers\DDIChipInfo.h |
DT头
1 |
|
dt.img的格式,参考dtbtool.txt和bootable\bootloader\lk\platform\msm_shared\smem.h
CDT描述的xml文件
1 | #boot_images\core\boot\secboot3\scripts\jedec_lpddr3_single_channel.xml |
上述xml中设备对应的结构体包如下:
1 | typedef PACKED struct |
platform info
在上一篇博文分析的sbl执行流程中,有两个和platform info有关的两个关键函数,如下:
boot_config_data_table_init
此函数主要初始化配置数据表,如果eeprom/emmc中存在cdt,则更新编译时链入的cdt表。
1 | #boot_images\core\boot\secboot3\src\boot_config_data.c |
config_data_table
config_data_table定义了与上xml文件对应的配置表,存储在memory,用于初始化cdt,如此表存在则此表数据为最终数据。源码如下:
1 | # boot_images\core\boot\secboot3\hw\msm8916\boot_cdt_array.c |
sbl1_hw_platform_smem
此函数主要解析cdt表获得sw-platform id,调用platform id api并传送指针到获得的id,然后调用hw_init_smem存储platform id到SMEM。
1 | #boot_images\core\boot\secboot3\hw\msm8909\sbl1\sbl1_mc.c |
platform info匹配
platform info中的platform id十分重要,lk、kernel中dts都是根据platform id及subtype id等platform info来匹配的。lk和kernel中涉及到的主要函数和代码路径如下:
1 | #lk |
当我们在项目开发时就可以同cdt这些信息来配置不同项目,如下:
1 | ------------------------------------------------------------- |
DDR配置
ddr相关的东西我很少动, 也就不深入分析了,列出几个关键函数,如果需要深入了解的话再分析。ddr初始化主要涉及3个函数,见如下load_qsee_pre_procs函数指针数组:
1 | boot_procedure_func_type load_qsee_pre_procs[] = |