在上一篇博文中主要描述了启动流程,及代码执行流程,并重点介绍了一下我重点关注的部分。这个sbl部分也算有点庞大,我们没有精力也没有必要去分析全部,所以接下来就来分析一下sbl1中另外几个需要格外关注的部分:

  • CDT :主要提供平台设备数据
  • log system:log日志系统,当然没有kernel里面那么强大了
  • download:代码下载烧写实现
  • ramdump:异常信息dump
     
    本篇博文就先来分析一下CDT, 其他部分后面再分析。

    CDT

    CDT主要提供Platform ID、ddr硬件配置等平台设备数据。很多module利用这些信息去减少依赖及执行动态初始化。CDT通常被厂家写入EEPROM中,如没有eeprom则会在编译bootloader时链入。
     
    sbl中主要涉及到如下关键文件:

    1234
    boot_images\core\boot\secboot3\hw\msm8916\boot_cdt_array.c // config_data_table配置表定义boot_images\core\systemdrivers\platforminfo\src\PlatformInfo.cboot_images\core\boot\secboot3\scripts\cdt_generator.pyboot_images\core\boot\secboot3\scripts\jedec_lpddr3_single_channel.xml

boot程序加载CDT

对于CDT,boot程序主要有如下动作:

  1. sbl1校验eMMC的boot分区中的CDT分区,如果ok,则加载CDT镜像,如果不ok,则执行第2步;
  2. sbl1从sbl1.mbn中加载默认cdt分区表(config_data_table[]);
  3. sbl1通过SMEM将平台信息传递到lk;sbl1 - SMEM_HW_SW_BUILD_ID,lk - SMEM_BOARD_INFO_LOCATION.
  4. lk获取平台信息,加载dt头,然后搜寻相应的dt入口;
  5. lk通过正确的dt入口地址跳转到kernel。

关键函数:

#sbl1
boot_updat_config_data_table(boot_images\core\boot\secboot3\src\boot_config_emmc.c)
#lk
dev_tree_get_entry_info(bootable\bootloader\lk\platform\msm_shared\dev_tree.c)

关键枚举:

#boot_images\core\api\systemdrivers\DDIChipInfo.h
DALCHIPINFO_ID_APQ8026     = 199,
DALCHIPINFO_ID_MSM8926     = 200,
DALCHIPINFO_ID_MSM8326     = 205,
DALCHIPINFO_ID_MSM8916     = 206,
DALCHIPINFO_ID_MSM8994     = 207,
#boot_images\core\api\systemdrivers\PlatformInfoDefs.h
DALPLATFORMINFO_TYPE_SURF         = 0x01,  /**< Target is a SURF device. */
DALPLATFORMINFO_TYPE_CDP          = DALPLATFORMINFO_TYPE_SURF,  /**< Target is a CDP (aka SURF) device. */
DALPLATFORMINFO_TYPE_MTP_MSM      = 0x08,  /**< Target is a MSM MTP device. */
DALPLATFORMINFO_TYPE_QRD          = 0x0B,  /**< Target is a QRD device. */

DT头

#kernel\arch\arm\boot\dts\qcom\msm8916-cdp.dts
/ {model = "Qualcomm Technologies, Inc. MSM 8916 CDP";compatible = "qcom,msm8916-cdp", "qcom,msm8916", "qcom,cdp";qcom,board-id = <1 0>;// id为0x01则为cdp设备,与下cdt描述xml中对应
};
#kernel\arch\arm\boot\dts\qcom\msm8916-mtp.dts
/ {model = "Qualcomm Technologies, Inc. MSM 8916 MTP";compatible = "qcom,msm8916-mtp", "qcom,msm8916", "qcom, mtp";qcom,board-id = <8 0>; // id为0x08则为mtp设备
};
#kernel\arch\arm\boot\dts\qcom\msm8916-qrd.dts
/ {model = "Qualcomm Technologies, Inc. MSM 8916 QRD";compatible = "qcom,msm8916-qrd", "qcom,msm8916", "qcom, qrd";qcom,board-id = <11 0>; // id为0x0b则为qrd设备
};

dt.img的格式,参考dtbtool.txt和bootable\bootloader\lk\platform\msm_shared\smem.h

CDT描述的xml文件

#boot_images\core\boot\secboot3\scripts\jedec_lpddr3_single_channel.xml<device id="cdb0"><props name="platform_id" type="DALPROP_ATTR_TYPE_BYTE_SEQ">/*byte0 - platform id版本byte1 - platform id,因此此为mtp设备byte2 - platform id硬件版本*/         0x03, 0x08, 0x01, 0x00, 0x00, 0x00, end </props></device>
...

上述xml中设备对应的结构体包如下:

typedef PACKED struct
{uint8                 nVersion;uint8                 nPlatform;      //平台id,用于高通不同平台,不能修改。uint8                 nHWVersionMajor;     //硬件版本号uint8                 nHWVersionMinor;uint8                 nSubtype;    // 默认为0,可以用来区分项目uint8                 nNumKVPS;PlatformInfoKVPSCDTType  aKVPS[];
} PlatformInfoCDTType;

platform info

在上一篇博文分析的sbl执行流程中,有两个和platform info有关的两个关键函数,如下:

boot_config_data_table_init

此函数主要初始化配置数据表,如果eeprom/emmc中存在cdt,则更新编译时链入的cdt表。

#boot_images\core\boot\secboot3\src\boot_config_data.c
void boot_config_data_table_init(bl_shared_data_type* bl_shared_data)
{char bootlog_buffer[BOOT_LOG_TEMP_BUFFER_SIZE];uint32 bytes_read = 0;/* Reset the flash byte counter so the number of bytes read from flashcan be retreived later. */boot_statistics_reset_flash_byte_counter();boot_log_message("boot_config_data_table_init, Start");boot_log_start_timer();/*populate configuration data table's info*/config_data_table_info.size = config_data_table_size;config_data_table_info.cdt_ptr = config_data_table; // 定义在boot_cdt_array.c boot_update_config_data_table(&config_data_table_info);/*put a pointer to the table info into sbl shared data so next sbl can access it*/bl_shared_data->sbl_shared_data->config_data_table_info = &config_data_table_info;/* Retreive the number of bytes read from flash via boot statistics. */bytes_read = boot_statistics_get_flash_byte_counter();/* Convert CDT size to string for boot logger. */snprintf(bootlog_buffer,BOOT_LOG_TEMP_BUFFER_SIZE,"(%d Bytes)",bytes_read);boot_log_stop_timer_optional_data("boot_config_data_table_init, Delta",bootlog_buffer);
}

config_data_table

config_data_table定义了与上xml文件对应的配置表,存储在memory,用于初始化cdt,如此表存在则此表数据为最终数据。源码如下:

# boot_images\core\boot\secboot3\hw\msm8916\boot_cdt_array.c
uint8 config_data_table[CONFIG_DATA_TABLE_MAX_SIZE] =
{/* Header */0x43, 0x44, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Meta data */0x16, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x88, 0x01, /* Block data */
#ifdef BOOT_PRE_SILICON#ifdef FEATURE_RUMI_BOOT0x03, 0x0F, 0x01, 0x00, 0x00, 0x00,#else0x03, 0x10, 0x01, 0x00, 0x00, 0x00,#endif
#else0x03, 0x0B, 0x01, 0x00, 0x00, 0x00,// platform id 等信息
#endif
....uint32 config_data_table_size = 420; // cdt表size

sbl1_hw_platform_smem

此函数主要解析cdt表获得sw-platform id,调用platform id api并传送指针到获得的id,然后调用hw_init_smem存储platform id到SMEM。

#boot_images\core\boot\secboot3\hw\msm8909\sbl1\sbl1_mc.c
void sbl1_hw_platform_smem(bl_shared_data_type* bl_shared_data)
{....... struct cdt_info *cdt_info_ptr = (struct cdt_info *)bl_shared_data->sbl_shared_data->config_data_table_info;/*get a pointer to platform id data from configuration data table*/platform_id_cdb_ptr = boot_get_config_data_block(cdt_info_ptr->cdt_ptr,CONFIG_DATA_BLOCK_INDEX_V1_PLATFORM_ID,&platform_id_len);  if(platform_id_cdb_ptr != NULL){eResult = boot_DAL_DeviceAttachEx(NULL,DALDEVICEID_PLATFORMINFO,DALPLATFORMINFO_INTERFACE_VERSION,&phPlatform);if (eResult == DAL_SUCCESS) {/*call the following API to store the platform id to DAL and SMEM*/boot_DalPlatformInfo_CDTConfigPostDDR(phPlatform, platform_id_cdb_ptr);      boot_DAL_DeviceDetach(phPlatform);}}
}

platform info匹配

platform info中的platform id十分重要,lk、kernel中dts都是根据platform id及subtype id等platform info来匹配的。lk和kernel中涉及到的主要函数和代码路径如下:

#lk
/*ootable\bootloader\lk\platform\msm_shared\smem.h */
enum platform_subtype /*bootable\bootloader\lk\platform\msm_shared\board.c */
static void platform_detect()
uint32_t board_hardware_subtype(void)
uint32_t board_hardware_id()/*bootable\bootloader\lk\platform\msm_shared\dev_tree.c*/
int dev_tree_get_entry_info(struct dt_table *table, struct dt_entry *dt_entry_info)#kernel
kernel\arch\arm\kernel\setup.c
kernel\arch\arm\boot\dts\qcom

当我们在项目开发时就可以同cdt这些信息来配置不同项目,如下:

-------------------------------------------------------------sbl1        platform subtype_id           boot_cdt_array.c
-------------------------------------------------------------lk              匹配dts                    dev_tree.c
-------------------------------------------------------------kernel     通过传入dts地址创建设备          setup.c
-------------------------------------------------------------

DDR配置

ddr相关的东西我很少动, 也就不深入分析了,列出几个关键函数,如果需要深入了解的话再分析。ddr初始化主要涉及3个函数,见如下load_qsee_pre_procs函数指针数组:

boot_procedure_func_type load_qsee_pre_procs[] =
{/* Save reset register logs */boot_save_reset_register_log,/* Initialize the flash device */boot_flash_init,/* Copy the configure data table from eeprom */boot_config_data_table_init, // 函数一 : 加载配置表/* Store platform id */sbl1_hw_platform_pre_ddr,/* Configure ddr parameters based on eeprom CDT table data. */sbl1_ddr_set_params, // 函数二:配置ddr/* Initialize DDR */(boot_procedure_func_type)sbl1_ddr_init, // 函数三:初始化ddr/*----------------------------------------------------------------------Run deviceprogrammer if compiling the deviceprogrammer_ddr image.----------------------------------------------------------------------*/boot_deviceprogrammer_ddr_main,/* Initialize SBL1 DDR ZI region, relocate boot log to DDR */   sbl1_post_ddr_init,sbl1_hw_init_secondary,/* DDR training */(boot_procedure_func_type)sbl1_wait_for_ddr_training,/* Initialize SBL1 DDR ZI region, relocate page table to DDR */sbl1_post_ddr_training_init, /* Zero out QSEE and QHEE region if needed.  This MUST be done beforeboot_dload_dump_security_regions executes for security reasons. */sbl1_cleanse_security_regions,/* Backup QSEE and QHEE region for ramdumps taken after SBL has executed */boot_dload_dump_security_regions,/* Check to see if DLOAD mode needs to be entered */boot_dload_check,/* Last entry in the table. */NULL
};

高通平台Android源码bootloader分析之sbl1(二)相关推荐

  1. 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)

    前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...

  2. 高通平台Android源码bootloader分析之sbl1(一)

    高通8k平台的boot过程搞得比较复杂, 我也是前段时间遇到一些问题深入研究了一下才搞明白.不过虽然弄得很复杂,我们需要动的东西其实很少,modem侧基本就sbl1(全称:Secondary boot ...

  3. 高通平台android开发总结 MSM平台上的AMSS

    http://blog.csdn.net/mirkerson/article/details/7691029 MSM平台上的AMSS REX启动分析--基于Qualcomm平台 1.高通平台andro ...

  4. 高通平台android开发总结

    http://www.cnblogs.com/yuzaipiaofei/archive/2012/07/24/4124179.html 1.高通平台android开发总结 1.1 搭建高通平台环境开发 ...

  5. 高通平台android 环境配置编译及开发经验总结

    完全转自:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  6. 高通平台android开发总结 .

    http://blog.csdn.net/mirkerson/article/details/7691029 http://blog.csdn.net/mirkerson/article/detail ...

  7. 高通平台android 环境配置编译及开发经验总结【转】

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  8. 高通平台 android 12 定时开关机

    高通平台 android 12 定时开关机 关机 关机实现 开机实现 总结 关机 AlarmManager取消了RTC_POWEROFF_WAKEUP 不支持通过AlarmManager设置关机唤醒设 ...

  9. 一对一视频直播源码|手机视频直播平台android源码/可打包视频直播

    源码介绍 一对一视频直播源码|手机视频直播平台android源码集视频.语音.动态.直播.社交等功能于一身. 前端功能说明: 登入注册:手机验证码登入.编辑个人信息.上传头像 首页直播:查看主播用户. ...

  10. 高通平台 input类 sensor驱动分析 : 光感/距感 stk3x1x driver分析

    stk3x1x driver分析 1:注册驱动 定义 i2c_driver static struct i2c_driver stk_ps_driver = {.driver = {.name = D ...

最新文章

  1. SLAM后端优化中卡尔曼滤波的直观通俗解释
  2. Visual Studio 2013编译Mozilla NPAPI 示例注意事项
  3. 计算机动画课程设计,计算机动画课程设计.doc
  4. list 用法总结2
  5. Memcache-No.03 Memcache相关安装、部署、启动、监控
  6. 数组与集合转换 java
  7. NVIDIA英伟达:深度学习服务器搭建指南 | 交流会笔记
  8. iOS中的三大定时器
  9. windows平台vs2010编译64位libiconv与libxml2
  10. 自定义IBaseAdapter,简化适配器重复的步骤
  11. 自媒体人常用工具,你还不知道的快速保存无水印视频图片方法
  12. 【嗅探工具】wireshark初步认识
  13. Flink服务的HA配置
  14. 局部语义地图构建——HDMapNet
  15. Google的设计原则
  16. AI绘画与虚拟人生成实践(二):智能不智障!用chatgpt自动写爆款内容
  17. node-sass报错
  18. 小程序刷新重置当前页面
  19. 宾馆如何锁定计算机,酒店密码锁怎么反锁 公寓酒店密码门锁使用操作说明
  20. JAVA中的protected的访问权限只有在本类同包类和子类吗?

热门文章

  1. 松下电视切换html,松下等离子电视如何用HDMI连接电脑?
  2. dog log 算子_log算子和dog算子
  3. send()、sendto()和recv()、recvfrom()的使用
  4. Java知识梳理——可达性分析方法原理 finalize
  5. matlab排序函数 下标,Matlab自带排序函数sort用法
  6. 箱线图画法详解:颜色、标签、大小等
  7. java-net-php-python-jsp音像店租赁录像计算机毕业设计程序
  8. 2015广州国际游博会:关于手游安全的那些事儿
  9. 安徽省2019c语言二级答案,2019年全国计算机二级C语言练习及答案二
  10. Gilbreath原理中的数学与魔术(一)——Gilbreath Shuffle First Principle