我的NPI项目之设备系统启动(三) -- CDT的一个实例

news2024/9/27 15:33:24

上面说了这么多,这里就添加一个CDT的使用实例和简单的代码解析。

首先生成cdt_configure.xml配置文件,然后执行如下命令:

python cdt_generator.py cdt_configure.xml CDT.bin; 

就可以生成对应的CDT.bin文件。同时也会生成, 我们会利用hardware major/minor version number来定义同平台的不同SKU.

同样,对应我们可以定义sku的dtsi中的board id。 bootloader透过的CDT中的board id进行对应device tree的选择。

对应,同平台的多SKU的情况,利用CDT进行ID的定义,大概就是这样一个情况。

bootloaer中对cdt的解析代码,先参考如下的高通的说明,知道具体是使用什么接口进行CDT的解析的;

对应目录搜索涉及到的文件:

核心代码如下:

/*===========================================================================

**  Function :  get_config_data_block

** ==========================================================================
*/
/*!
* 
* @brief
*    given a pointer to the start of cdt and an configuration data block index,
*    return a pointer to beginning of that configuration data block.
*     //此时CDT是刷在ufs/emmc中。其实如果有好的方案,我们建议把CDT.bin备份到eeprom中,那样即使使用高通的刷机软件/或者手动 full reset ,CDT.bin依然保留;某种层度上可以避免机器便转。
* @param[in] uint8* pointer to the start of cdt table //怎么理解这里的指针呢?emmc文件系统中的地址?
* @param[in] uint32 Index of the configuration data block.
*
* @param[out] uint32* length of the configuration data block   
* 
* @return   pointer to the beginning of request cdb. 
*           Null if error or cdb doesn't exist 
*
* @par Dependencies
*   None
*   
* @retval
*   None
* 
* @par Side Effects
*   None
*/
bl_error_boot_type boot_get_config_data_block(const uint8 *raw_cdt, uint32 index, uint32 *length, uint8** cdb_data_ptr)
{
  struct cdb_meta *cdb_meta_ptr;
  uint8 *cdb_ptr;
  bl_error_boot_type return_status = BL_ERR_NONE; 
  *length = 0;
  
  do{
    if(raw_cdt != NULL)
    {
      cdb_meta_ptr = (struct cdb_meta*)((uintnt)raw_cdt + sizeof(struct cdt_header));
        //直接跳过header部分;
      /* Integer overflow check */
    if(((uintnt)raw_cdt > ((uintnt)raw_cdt + (uintnt)cdb_meta_ptr->offset)))
    {
      return_status = BL_ERR_INTEGER_OVERFLOW;
      break;
    }

      cdb_ptr = (uint8*)((uintnt)raw_cdt + (uintnt)cdb_meta_ptr->offset);
      
      /*get the meta data of request block*/      
      cdb_meta_ptr += index;
      
      if(
          /*first check if cdt has valid magic number*/
          (((struct cdt_header*)raw_cdt)->magic == CONFIG_DATA_MAGIC) &&
          /*then check if meta data pointer of requested block is in valid range*/
          ((uintnt)cdb_meta_ptr < (uintnt)cdb_ptr)  &&
          (((uintnt)raw_cdt + (uintnt)cdb_meta_ptr->offset) >= (uintnt)cdb_ptr) &&
          ((uintnt)cdb_meta_ptr->offset < CONFIG_DATA_TABLE_MAX_SIZE) &&
          /*at last check if requested block has valid size*/
          (cdb_meta_ptr->size > 0) &&
          (((uintnt)cdb_meta_ptr->offset + (uintnt)cdb_meta_ptr->size) > (uintnt)cdb_meta_ptr->offset) &&
          (((uintnt)cdb_meta_ptr->offset + (uintnt)cdb_meta_ptr->size) < CONFIG_DATA_TABLE_MAX_SIZE) 
        )
      {
        *length = cdb_meta_ptr->size;
        *cdb_data_ptr = (uint8*) (uintnt)((uintnt)raw_cdt + (uintnt)cdb_meta_ptr->offset); 
      }
    }

    if(*cdb_data_ptr == NULL)
    {
      return_status =  BL_ERR_GET_CDT_FAIL;
      break;
    }
  }while(FALSE);
  return return_status;
}

看下参数:@param[in] uint8* pointer to the start of cdt table //溯源地址来源:

//* @param[in] uint8* pointer to the destination CDT
boot_copy_config_data_block(
  uint8 *dst_cdt, 
 uint32 cdb_index, 
  const uint8 *src_cdb_data, 
  uint32 src_cdb_size
);

 这个boot_copy_config_data_blcok(..);的调用点,在源码里面尽然没有找到,后面提个case问问高通。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1387279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新】Unity Meta Quest MR 开发(一):Passthrough 透视配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;配置透视的串流调试功能&#x1f4d5;第一步&#xff1a;设置 OVRManager&#x1f4d5;第二步&#xff1a;添加 OVRPassthroughLayer 脚本&#x1f4d5;第三步&#xff1a;在场景中添加虚拟物体&#x1f4d5;第四步&#xff1a;设置…

Nginx——强化基础配置

1、牢记Context Context是Nginx中每条指令都会附带的信息&#xff0c;用来说明指令在哪个指令块中使用&#xff0c;可以将Context 理解为配置环境。 每个指令都拥有自己的配置环境&#xff0c;如果把配置环境记错了&#xff0c;或者在设计时未考虑配置环境的作用&#xff0c;…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图的圆切图,Kotlin(4)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图的圆切图&#xff0c;Kotlin&#xff08;4&#xff09; 这篇 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&am…

使用ChatGPT对进行论文改写与润色

一、内容改写 关键在于明确改写的具体要求。 例如:[论文内容] 可以指明需要提升该段落的流畅性和逻辑连贯性。 常用指令 细微调整文本 轻微编辑 重写以增强表述清晰度 简化句式 校正语法和拼写错误 提升文本的流畅性和条理性 优化词汇使用 调整文本风格 进行深度编辑…

R语言【paleobioDB】——pbdb_richness():绘制指定类群的数量丰度

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_richness (data, rank, res, temporal_ex…

【实战记录】 vagrant+virtualbox+docker 轻松用虚拟机集成组件

用途 最近要学一大堆组件&#xff0c;不想直接安装本机上&#xff0c;然后gpt说&#xff1a;你可以用vagrant起个虚拟机&#xff08;然后docker拉取各种组件的镜像&#xff09;&#xff1b;或者k8s 实战的整体思路 首先安装virtualbox和vagrant。然后cmd依次键入三条命令 安…

网络安全全栈培训笔记(53-WEB攻防-通用漏洞CRLF注入URL重定向资源处理拒绝服务)

第53天 WEB攻防-通用漏洞&CRLF注入&URL重定向&资源处理拒绝服务 知识点&#xff1a; 1、CRLF注入-原理&检测&利用 2、URL重定向-原理&检测&利用 3、Web拒绝服务-原理&检测&利用 #下节预告&#xff1a; 1、JSONP&CORS跨域 2、域名安全…

算法通关村第十六关—滑动窗口经典问题(白银)

滑动窗口经典问题 一、最长子串专题 1.1 无重复字符的最长子串 LeetCode3给定一个字符串s&#xff0c;请你找出其中不含有重复字符的最长子串的长度。例如&#xff1a; 输入&#xff1a;s"abcabcbb" 输出&#xff1a;3 解释&#xff1a;因为无重复字符的最长子串是…

Mindspore 公开课 - CodeGeeX

CodeGeeX: 多语言代码生成模型 CodeGeeX 是一个具有130亿参数的多编程语言代码生成预训练模型。CodeGeeX采用华为MindSpore框架实现&#xff0c;在鹏城实验室“鹏城云脑II”中的192个节点&#xff08;共1536个国产昇腾910 AI处理器&#xff09;上训练而成。截至2022年6月22日&…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

Vue3+Vite项目搭建

为什么选择vite而不是vue-cli&#xff1a; vite下一代前端开发与构建工具 vite创建的项目默认vue3 优势&#xff1a; 开发环境中&#xff0c;无需打包&#xff0c;可快速的冷启动 轻量快速的热重载&#xff08;HMR&#xff09; 真正的按需编译&#xff0c;不在等待整个应用…

SpringBoot+thymeleaf实战遇到的问题

目录 一、控制台&#xff1a; 二、数据库查询异常&#xff1a; 三、前后端错误校验 四、在serviceImp中需要添加一个eq条件&#xff0c;表示和数据库中的哪个字段进行比较&#xff0c;否则会查出所有数据&#xff0c;导致500 五、使用流转换数据更简洁 六、重复报错&…

Python教程44:海龟画图turtle画卡塔尔世界杯吉祥物

---------------turtle源码集合--------------- Python教程42&#xff1a;海龟画图turtle画海绵宝宝 Python教程41&#xff1a;海龟画图turtle画蜡笔小新 Python教程40&#xff1a;使用turtle画一只杰瑞 Python教程39&#xff1a;使用turtle画美国队长盾牌 Python教程38&a…

国内镜像源配置方法(包括临时和永久方法)

国内镜像源&#xff1a; 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣 http://pypi.douban.com/simplePython官方 https://pypi.python.org/simple/v2ex http://pypi.v2ex.com/simple/中国科学院 http://pypi.mi…

Web server failed to start. Port 8080 was already in use. 端口被占用

Web server failed to start. Port 8080 was already in use. 端口被占用。 1、cmd回车打开命令窗口 查看端口号是否被占用 netstat -ano|findstr “8080” 2、查看进程号对应的进程名称 tasklist|findstr “12760” 3、直接杀死进程 taskkill /F /pid 12760或 taskkill /F …

腾讯云服务器租用价格表_2024新版报价

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

Linux-ARM裸机(十一)-UART串口通信

无论单片机开发还是嵌入式 Linux 开发&#xff0c;串口都是最常用到的外设。可通过串口将开发板与电脑相连&#xff0c;然后在电脑上通过串口调试助手来调试程序。还有很多的模块&#xff0c;比如蓝牙、GPS、 GPRS 等都使用的串口来与主控进行通信的&#xff0c;在嵌入式 Linux…

java处理16进制字符串的一些方法和基础知识

前言&#xff1a;本篇文章是对于基础数据的处理的一些简单经验总结里边包含了一些基础的数据储存和数据转化的一些知识&#xff0c;同样也包含有部分快捷的数据处理方法。主要用于个人知识的一个记录和方便进行对应的数据转换和处理。 1、bit,字节和字的关系 1.1 bit和字节的…

leetcode 24两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思想 对于操作链表节点的时候&#xff0c;首先需要就是创建一个虚拟的…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…