一、 MSM8K Boot Flow

                              图1:

高通MSM8K平台bootloader启动流程基本类似,但具体各平台,比如MSM8974、MSM8916、MSM8994等,会有微小区别。

从上图,可以看出高通8K平台的boot过程非常不一般啊。相比MTK平台,或者高通7K平台,复杂了非常多。 下图是高通文档对启动流程的说明,

已经很清楚了,我这边就直接贴出来啦。

                                   图2:

系统上电后从RPM PBL启动到 APPS PBL 然后SBL1 ,再启动APPSBL 等等,整个过程看似非常复杂,但其实很多代码OEM厂家是看不到,也修改不了的。

那我们需要我们做什么? 能做点什么呢? 呵呵!不会没事情做的。 SBL1和appsbl高通是有开放代码。

本章我重点关注SBL1,且主要描述我认为重点的几方面:

1、    CDT : Platform ID和DDR参数

2、 debug log :

3、 download : msm8K 新平台软件download支持两种协议,sahara和firehose

4、 ramdump :死机异常信息dump

好的,下面将SBL1我比较关注的点调用流程总结成如下图,后面再针对关注点展开,逐个分析。

                           图3:

二、CDT:Platform ID和DDR参数

1、CDT(Configuration Data Table ) 里到底有什么内容?

参考下图,可知CDT包含CDB0: platform info信息和CDB1: DDR配置参数。
                图4:
platform info 包含平台id,主板的版本号,项目号等信息
          图5:
CDB0: platform info 如下结构体表现:
typedef PACKED struct
{
  uint8                 nVersion;
  uint8                 nPlatform;      //这个是平台id,用于高通不同平台类型。我们不能去修改。
  uint8                 nHWVersionMajor;   //硬件版本号暂时没有使用,默认为0
  uint8                 nHWVersionMinor;
  uint8                nSubtype;    // 默认为0没有用。我们可以用它来做项目区分   
  uint8                 nNumKVPS;
  PlatformInfoKVPSCDTType  aKVPS[];
} PlatformInfoCDTType;

参考如下文档和code:
80-N3411-1_B_EEPROM_SW_CDT.pdf
boot_images/core/boot/secboot3/hw/msm8916/boot_cdt_array.c

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.xml

2、CDB0: platform info信息有什么用处?

 上图3可以看到CDB0: platform info相关的代码调用有如下二函数:

voidboot_config_data_table_init(bl_shared_data_type* bl_shared_data)
{
  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;
//getdefault config_data_table array from boot_cdt_array.c

boot_update_config_data_table(&config_data_table_info);
  //read the cdt from eMMC and update the default config_data_table array

/*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;
  
  boot_log_stop_timer("boot_config_data_table_init, Delta");
}  //该函数获取到cdt,并存放在config_data_table_info

void sbl1_hw_platform_smem(bl_shared_data_type* bl_shared_data)
{
    .......

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);

//调用 PlatformInfo.c 中的PlatformInfo_InitSMem保存platform info 到smem.
      boot_DAL_DeviceDetach(phPlatform);
    }
  }
  
}/* sbl1_hw_platform_smem() */

//好了

static DALResultPlatformInfo_InitSMem
(
PlatformInfoDrvCtxt *pDrvCtxt
)
{
//申请共享内存区:SMEM_HW_SW_BUILD_ID
  pSMem = (DalPlatformInfoSMemType *)

smem_alloc(SMEM_HW_SW_BUILD_ID, sizeof(DalPlatformInfoSMemType));
...............

 //保存platform info到共享内存
  pSMem->ePlatformType = pDrvCtxt->PlatformInfo.platform;

pSMem->nPlatformVersion = pDrvCtxt->PlatformInfo.version;
pSMem->nPlatformSubtype = pDrvCtxt->PlatformInfo.subtype;
pSMem->bFusion = pDrvCtxt->PlatformInfo.fusion;
   .................

return DAL_SUCCESS;

} /* END PlatformInfo_InitSMem */

花了这么多精力谈如何存platform info,得用啊?这些platform info在lk和kernel有何用呢?

lk 根据platform id及subtype id匹配正确的dts,这样后面kernel也可以利用dts里的

platform info。

:msm8916-mtp.dts 包含如下platform id & subtype id信息。

{
model = "Qualcomm Technologies, Inc. MSM 8916 MTP xxx";
compatible = "qcom,msm8916-mtp", "qcom,msm8916", "qcom,mtp", "qcom,xxxx";
qcom,board-id = <8 0x21>;   //platform id & subtype id
};

lk请参考这些函数,后面专门研究lk,再详细描述。

platform_detect   //board.c , smem.h : enum platform_subtype

board_hardware_subtype //board.c , smem.h : enum platform_subtype

board_hardware_id   //board.c , smem.h : enum platform_subtype

dev_tree_get_entry_info  //dev_tree.c

kernel请参考setup.c

从上面CDT格式及代码分析,可以看出,如果不同项目cdt的nPlatform和nSubtype项配置成不同的值, 与dts 包含的platform id & subtype id信息进行匹配。就可以用来区分不同的项目。

即:我们在项目开发过程中,同一个分支代码要进行多项目开发时,

sbl、lk、kernel可以利用这些信息来区分不同项目,实现一套代码多项目配置目标。如下图:

图6:

总结:通过修改cdt和dts,sbl、lk、kernel阶段使用如下接口,可以将同一个branch代码中多项目区分出来!

sbl_board_subtype      // sbl高通没有,自己开发一个接口

board_hardware_subtype   // lk接口

of_board_is_xxx     // kernel 接口

3、CDB1:DDR参数的配置流程?

cdt中还有一项重要内容是CDB1: DDR参数,下面看看如何利用这些参数进行ddr初始化的。

ddr初始化涉及如下重要三函数:

boot_procedure_func_type load_qsee_pre_procs[] = 
{
  .......
  /* Copy the configure data table from eeprom */
  boot_config_data_table_init,
  .......
  /* Configure ddr parameters based on eeprom CDT table data. */
  sbl1_ddr_set_params,   //  保存cdt ddr 参数到底层
  /* Initialize DDR */
  (boot_procedure_func_type)sbl1_ddr_init,    //初始化ddr
   .......

/* Last entry in the table. */
  NULL 
};

下面重点介绍这三个函数:

图7:

cdt数据config_data_table保存config_data_table_info.cdt_ptr

图8:

sbl1_ddr_set_params调用ddr_set_params,将ddr参数保存到ddr_device_table。

获取num_of_device保存到ddr_device_table_entry_num 。


图9:

sbl1_ddr_init 通过 HAL_SDRAM_Init调用到如下函数,

HAL_SDRAM_Ram_Rank_Detection,========》cs auto detect

HAL_SDRAM_Ram_Size_Detection, =========> ram size auto detect by :rowcolbankwidth , manufacture_id

ddr_params_detection , ========》 two DDR chips auto detect

HAL_SDRAM_DPE_Update_AC_Paramenters  =========> update ddr timing with new DDR timing

上图说明,通过ddr_params_detection 实现一个项目自动支持多种ddr timing的方法。

好了,ddr timing就不再多说了,详细请阅读代码及参考文档:

80-NJ172-1_A_LPDDR2_CUSTOMIZATION_FOR_MSM8x26_DEVICES.pdf

三、Debug log

坑跌的高通,MSM6K/7K平台,包括旧的MSM8K平台bootloader都不支持uart。
需要自己添加uart debug log,否则只能连接jtag接口,使用Trace32调试。
哎,Trace32那价钱,咱这贫民企,都调试不起啦。
高通也赚了够多的,总算有良心,在MSM8916平台默认支持uart啦!
好了,不骂高通了,看下面代码。
void sbl1_main_ctl(boot_pbl_shared_data_type *pbl_shared)
{
 
。。。。。。。。。
//sbl入口足够早的地方就开始log初始化。再前面就没法打印log了,就当作前面的代码不出错吧。
  
  /* Initialize boot logger and start the log timer */
  sbl1_boot_logger_init(&boot_log_data,
                        pbl_shared);
。。。。。。。。。
}
sbl1_boot_logger_init调用boot_log_init进行ram log , timer ,uart 初始化。
void boot_log_init(boot_log_init_data *init_data)
{
  /*we must first set meta info becasue boot_log_init_ram and
   * boot_log_init_timer will use the meta info structure*/
  boot_log_set_meta_info(init_data->meta_info_start);
boot_log_init_ram(init_data);  //初始化ram log
  boot_init_timer(init_data);        //初始化timer ,可用于打印sbl各阶段的启动时间
  boot_log_init_uart();                //初始化uart

}
/* boot_log_init */
做完初始化的工作后,就可直接使用boot_log_message将log打印到ram和uart啦!
使用方法参考:
static char error_message[BOOT_ERROR_MSG_LEN];
//自己将打印的信息格式化到自定义的buffer:error_message
      snprintf(error_message, BOOT_ERROR_MSG_LEN, 
             "Error code %lx at %s Line %lu", err_code, filename_ptr, line);
      //打印log       
      boot_log_message(error_message);
参考代码:
boot_logger.c
boot_logger_uart.c
boot_logger_ram.c
boot_logger_timer.c

四、SW download

 待续:《高通 MSM8K bootloader之二: SBL1》

五、Crash ramdump

 待续:《高通 MSM8K bootloader之二: SBL1》

参考资料:

80_NA157_7_C_MSM8974_Boot_Architecture_Overview.pdf

80-NL239-1_A_MSM8916_Boot_Architecture_Overview.pdf

80-N3411-1_B_EEPROM_SW_CDT.pdf

80-NJ172-1_A_LPDDR2_CUSTOMIZATION_FOR_MSM8x26_DEVICES.pdf

高通 MSM8K bootloader : SBL1 .相关推荐

  1. 高通 MSM8K bootloader 之三: LK

  2. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  3. 高通平台Bootloader启动流程【转】

    本文转载自:http://blog.csdn.net/fang_first/article/details/49615631 ====================基本知识============= ...

  4. 高通android bootloader

    高通LK(little kernel). little kernel是bootloader,其作用是硬件初始化,读取linux 内核和ramdisk到RAM里,设置初始寄存器以及内核命令行参数,并跳转 ...

  5. 高通 MSM8K GPT异常导致无法开机问题分析

    问题分析步骤如下: 一. MSM8916平台gpt概率性问题:使用QPST emmc software download工具下载完软件后,无法开机.如下图: log分析是userdata分区没有成功m ...

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

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

  7. 高通安卓调试LCD几方面总结

    来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...

  8. android edl模式,重磅干货!高通9008模式与数据提取

    原标题:重磅干货!高通9008模式与数据提取 上一期的镜像基础知识更完后,本期我们上高级镜像干货! 大家还记得Android手工镜像的方法吗?我们有读者读完之后提出了新的问题,刚好和Wendy最近计划 ...

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

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

最新文章

  1. 搭建环境_maven: 搭建工程: ssm整合: 搭建测试:
  2. SQL经典问题1——产品、颜色、数量
  3. dotNET Core 3.X 依赖注入
  4. 在Atlas服务器端实现中推荐使用Web Service而不是Page Method
  5. CLR via C#学习笔记-第十章-无参属性
  6. 《公共安全视频监控联网信息安全技术要求》(国标GB/35114-2017)
  7. 网页自动调入软键盘输入中文
  8. CppCheck C++静态代码检查工具在Visual Studio(VS)下的配置和使用
  9. Java applet 类
  10. 通信原理及系统系列38——图解过采样和欠采样
  11. 微服务网关SpringCloud Gateway
  12. word目录缩进设置
  13. nc361t支持的服务器,使用5760/3850 WLC的外部RADIUS服务器EAP身份验证配置示例
  14. latex大括号公式编辑
  15. 编写批量修改扩展名脚本
  16. 卸载xampp并重装mysql
  17. 如何轻松学习C语言编程!
  18. latex行内公式和行间公式
  19. 像素、分辨率、DPI、PPI
  20. 线上问题---程序假死

热门文章

  1. jdk1.8hashmap为什么对hash进行了一次扰动处理
  2. equals方法变量和常量位置区别
  3. @Configuration
  4. mysql的字符集设置为什么_为什么Mysql默认的字符集都是latin1
  5. 生成pojo mysql_通过数据库表反向生成pojo类
  6. python unix时间戳转换成时间_关于python:将unix时间戳字符串转换为可读日期
  7. Android LayoutAnimation使用及扩展
  8. 存储器的分配与回收算法实现_垃圾内存回收算法
  9. java之面向对象知识体系_JAVA基础知识总结5(面向对象特征之一:继承)
  10. 计算机软考知识点总结,历年计算机软考《系统分析师》复习知识点总结(8)