高通 Camera HAL3:项目开发技术点总结
做高通 Camera HAL3开发的一些技术点的总结、整理。
做个记录,方便后续查阅。
1.目录、so、配置文件
productName是项目名
- out Target路径:\out\target\product\productName\
- chi-cdk:\vendor\qcom\proprietary\chi-cdk\
- ldc node:\vendor\qcom\proprietary\chi-cdk\oem\qcom\node\ldc\
- node编译出来的so:\vendor\lib64\camera\components\
- usecase编译的so: \vendor\lib64\com.qti.chiusecaseselector.so (修改pipeline的xml后需要编译usecase的so)
- chi-cdk编译的so: \vendor\lib64\hw\com.qti.chi.override.so
- usecase xml文件:chi-cdk\oem\qcom\topology\titan\fillmore\fillmore_usecase.xml
- pipelines xml文件:chi-cdk\oem\qcom\topology\titan\usecase-components\usecases\UsecaseZSL\pipelines\
- vendortag文件:chi-cdk\oem\qcom\vendortag\chivendortagoemdefines.h
- RealTimeFeature.xml:chi-cdk\oem\qcom\topology\titan\usecase-components\segments\fillmore\RealTimeFeature.xml
- camxoverridesettings.txt:高通提供给开发者的临时调试方式,控制log打印、数据dump等、在设备目录的vendor/etc/camera/下,目录camera和camxoverridesettings.txt都需要自己手动创建
2.驱动相关路径:
bin文件:/vendor/lib64/camera (如果将bin文件删除到只剩一个,那么驱动上电就只上一个,打开相机就只打开这个摄像头)

配置文件:
- \vendor\qcom\proprietary\chi-cdk\oem\qcom\buildbins\build\android\binary_taro
- /vendor/qcom/proprietary/chi-cdk/oem/qcom/module
驱动文件:
- \vendor\qcom\proprietary\chi-cdk\oem\qcom\sensor\s5khm6
3.camxsettings.xml
在/vendor/qcom/proprietary下查找camxsettings.xml,找到后通过修改camxoverridesettings.txt来改变camxsettings.xml中定义的变量的值
- /vendor/etc/camera # echo enableDSM=FALSE >> camxoverridesettings.txt
- /vendor/etc/camera # cat camxoverridesettings.txt
4.camxoverridesettings.txt日志设置:
chi log:例如:CHX_LOG_ERROR(fmt, args);
adb shell "echo overrideLogLevels=0x1f >> /vendor/etc/camera/camxoverridesettings.txt"
或:adb shell setprop vendor.debug.camera.overrideLogLevels 0x1F (camxsettings.xml中定义,不同的代码可能有区别)
平常开的log(按需要开,全部都开会丢日志且影响性能):
hal/core/chi
- adb shell "echo logInfoMask=0x50080 >> /vendor/etc/camera/camxoverridesettings.txt"
- adb shell setprop persist.vendor.camera.logVerboseMask 0xFFFFFFFF
- adb shell setprop persist.vendor.camera.logEntryExitMask 0xFFFFFFFF
- adb shell setprop persist.vendor.camera.logInfoMask 0xFFFFFFFF
- adb shell setprop persist.vendor.camera.logWarningMask 0xFFFFFFFF
- adb shell setprop persist.vendor.camera.logConfigMask 0xFFFFFFFF
- adb shell setprop persist.vendor.camera.systemLogEnable TRUE
- adb shell setprop persist.vendor.camera.logLogDRQMask 0xFFFFFFFF
camx log:
- adb shell "echo overrideLogLevels=0xF >> /vendor/etc/camera/camxoverridesettings.txt"
- adb shell "echo logVerboseMask=0x1000 >> /vendor/etc/camera/camxoverridesettings.txt"
- adb shell "echo logInfoMask=0xFFFFFFFF >> /vendor/etc/camera/camxoverridesettings.txt"
5.选择featuregraph的日志:
Chifeature2graphselector.cpp:1549 SelectFeatureGraphforRequestFromTable()
Tag:"Selected feature graph for request:"
通常需要先执行如下命令才能打印出Log:
- adb shell echo "overrideLogLevels=0x9" >>/vendor/etc/camera/camxoverridesettings.txt
- adb shell echo overrideLogLevels=8 >>echo/vendor/etc/camera/camxoverridesettings.txt
平台不同,具体也有所区别:
8350:
- static const UINT32 CHX LOG CONFIG MASK =4:
- adb shell echo overrideLogLevels=4 >>/vendor/etc/camera/camxoverridesettings.txt
8450:
- adb shell overrideLogLevels=8 >>"echo/vendor/etc/camera/camxoverridesettings.txt
- CHX LOG INFO("Selected feature graph for request %u : %spFeature2RequestObject->GetAppFrameNumber (),requestGraph. pGraphDesc->pFeatureGraphName);
sm4350:
- adb shell "echo overrideLogLevels=4>>/vendor/etc/camera/camxoverridesettings.txt
- CHX LOG CONFIG(Feature2Mapping: Selected feature graph : %s"pChiFeature2GraphDesc->pFeatureGraphName);
6.如何查找pipeline
代码查找:
找到chifeature2rawhdrdescriptor.cpp
查找ChiFeature2PipelineDescriptor

日志查找:
Tag: "StreamingOn"
7.CreatePipelines()
AdvancedCameraUsecase,UsecaseMultiCamera等usecase 会 调用CreatePipelines()创建 pipeline
chifeature2也会调用 CreatePipelines() 创建 pipeline
举个例子:
在SAT模式下,预览走的是非featue2,拍照走的是feature2:
//创建的三个pipeline:SATOfflinePreview;RealtimePreviewSATO;Merge3YuvCustomTolYuv



8. 如何查找pipeline node配置文件:
1.Log TAG:"StreamingOn for pipeline"查当前pipeline
2.\vendor\qcom\proprietary\chi-cdk\oem\qcom\topology\titan 目录下找pipeline的xml
3.pipeline xml里看<CamxInclude segment="xxxxxxxxxx"/>
4.找到CamxInclude的xml
5.添加node
9.添加堆栈打印:
在\camx\src\core\hal\camxhal3stream.cpp中添加堆栈打印
camx/src/lib/build/android/Android.mk 里添加 LOCAL_SHARED_LIBRARIES += libutilscallstack
代码中要打印堆栈的地方添加:android::CallStack stackprintf("xxxxxx");
10.添加一个VendorTag用于控制Feature:
详细见《Add a VendorTag》篇
高通 Camera HAL3:添加一个VendorTag_shawn·xiao的博客-CSDN博客
11.摄像头Id配置文件
chi-cdk\oem\qcom\multicamera\chimcxcameraconfig\configs\fillmore\fillmore_legacymc.xml
12.排查node中算法影响
可以只用memcopy Node来排除:

13.底层添加debug系统属性:
头文件:#include <cutils/properties.h>
\chi-cdk\oem\qcom\node\awrawhdr\build\android\Android.mk下添加:
LOCAL_SHARED_LIBRARIES :=
libcutils \
代码:if(property_get_int32("debug.vendor.camera.dumpawraw",0))
13.查看AEC日志:
主要看第二个
(1).05-14 06:40:13.737 7710 7779 V CamX : [ VERB][STATS_AEC] caecxcontrol.h:586: PrintFrameControl CID 1 role 0 fID 227 mode PerFrame skipped:0 flash off lux 276.5 ISO 640 (short safe long) G 13.319 13.319 13.319 ET 60000000 60000000 60000000 SI 799110720 799110720 799110720 settled 1 brightness settled 1 FL 219.9 snapshot normal LED1 0 LED2 0 LEDAF 0 LEDFD 0 predictive 1.0 flashduration 0 compenDB 1.000 compenADRC 1.000 shortBlend 1.000000 FinalFlickerMode 1
(2) Gain:ExpTime

14.去掉驱动配置的QCFA Size
找到注摄的驱动setting文件
qssi12_7450/vendor/qcom/proprietary/chi-cdk/oem/qcom/sensor/s5khm6/s5khm6_sensor.xml
找到Qcfa定义,全部去掉
15.查找最大,中间,最小曝光值
\chi-cdk\core\chiframework\chimcxdevicecaps.cpp
填曝光值函数:FillExposureTime()
\camx\src\core\camximagesensordata.cpp
从sensor xml中获取配置并计算 赋值最小、中间和最大曝光值:GetSensorStaticCapability()
/chi-cdk/oem/qcom/sensor/s5khm6/s5khm6_sensor.xml
驱动配置文件里配置:
<exposureControllnfo>
<verticalOffset>10<verticalOffset>
<maxLineCount>65525<maxLineCount>
16.常见usecase、pipeline
之前的博文中也有列举过,再列举一次
不同机型,产品性能及定位不同,即使基线一样usecase等也有可能不一样,
高通这么做给了手机厂商极大的自定义空间,举个某机型例子,UseCase可以场景复用,对应的pipeline也可以不用或复用

17.文件权限修改
标定结果写入calib_result的patch,文件777权限没有设置成功,导致生成的calib_result文件没有第三方可读权限,
可通过adb shell ls -laZ calib_result查看为-rwx------
如下改动patch,经调试第三方可以读取calib_result,权限变为-rwxrwxrwx:
{mode_t pCurMask = umask(0);......umask(pCurMask);}
18.未完待续、持续补充
相关文章:
高通 Camera HAL3:项目开发技术点总结
做高通 Camera HAL3开发的一些技术点的总结、整理。 做个记录,方便后续查阅。 1.目录、so、配置文件 productName是项目名 out Target路径:\out\target\product\productName\chi-cdk:\vendor\qcom\proprietary\chi-cdk\ldc node࿱…...
chatgpt赋能python:Python怎么删除列表中的最大值和最小值
Python怎么删除列表中的最大值和最小值 在Python中,一个列表(List)是一种非常常见的数据结构,它允许我们以有序的方式存储和访问数据。但是,有时候我们需要从列表中删除最大或最小的值,以满足我们的特定需…...
简述Vue的生命周期以及每个阶段做的事情
03_简述Vue的生命周期以及每个阶段做的事情 思路 给出概念 列举出生命周期各个阶段 阐述整体流程 结合实际 扩展:vue3变化 回答范例 每个vue组件实例被创建后都会经过一系列步骤。比如它需要数据观测、模板编译、挂载实例到dom、以及数据变化的时候更新dom、…...
LeetCode-C#-0004.寻找两个正序数组的中位数
0.声明 该题目来源于LeetCode 如有侵权,立马删除。 解法不唯一,如有新解法可一同讨论。 1.题目 0004寻找两个正序数组的中位数 给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。 请你找出并返回着两个正序数组的中位…...
Vue.js 中的 $emit 和 $on 方法有什么区别?
Vue.js 中的 $emit 和 $on 方法有什么区别? 在 Vue.js 中,$emit 和 $on 方法是两个常用的方法,用于实现组件间的通信。它们可以让我们在一个组件中触发一个自定义事件,并在另一个组件中监听这个事件,从而实现组件间的…...
LAZADA平台的商品评论Python封装API接口接入文档和参数说明
LAZADA是一个位于东南亚的电商平台,成立于2012年。该平台覆盖的国家包括新加坡、马来西亚、印尼、菲律宾、泰国和越南等地。它提供了一个多样化的产品选择,包括时尚、美容、数码、母婴等商品,并且拥有许多知名品牌的官方旗舰店。同时…...
云原生Docker镜像管理
docker是什么? docker是一个go语言开发的应用容器引擎。 docker的作用? ①运行容器里的应用; ②docker是用来管理容器和镜像的一种工具。 #容器 与 虚拟机 的区别? 容器虚拟机所有容器共享宿主机内核每个虚拟机都有独立的操…...
ChatGPT+小红书的8种高级玩法
掌握了这套万能命令,让你快速做出小红书爆款文案! 一、用ChatGPT做定位 我是一个大龄的普通人,没有什么特殊的技能,接下来,请你作为一位小红书的账号定位专家,通过与我对话的方式,为我找到我的小红书账号定…...
shell脚本学习记录1(运算符)
Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 以下实例我们向脚本传递三个…...
vector 迭代器失效问题
vector 迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向…...
docker使用与服务器上的可视化(ROS rviz等)
1.安装docker 安装docker:官网教程,按照官网命令一步步来即可。 添加当前用户到docker用户组: 【docker】添加用户到docker组,这样后面运行docker的时候前面不需要加sudo命令,否则运行docker的时候一直需要在前面加su…...
最新版本Portraiture4.1中文版ps磨皮滤镜插件安装包
在Portraiture有非常强大的手动功能,可以为用户进行手动调整照片中的皮肤区域以达到更加完美的效果,软件还支持同时导入上千张照片,用户可以通过自动识别照片中的人脸从而依照自己的风格进行批量处理十分的方便快捷。 最新版本Portraiture 4…...
仓储WMS对接淘宝奇门详细说明【亲测可用】
文章目录 简介名词解释奇门对接方案前期准备系统调用流程代码实现思路关键点(个人观点)奇门对接关键代码可能遇到的问题 简介 淘宝奇门项目支持 ERP、WMS 之间的系统标准化对接,通过构建 ERP、WMS 系统之间标准通信协议来实现不同系统之间的打通;对商家…...
RFID软件:简介、功能和应用范围
在当今快节奏的商业环境中,RFID(射频识别)技术已经成为物流、供应链和库存管理等领域中不可或缺的工具。本文将向您介绍RFID软件的基本知识,探讨其功能和广泛应用的范围。 第一部分:RFID软件简介 RFID软件是一种应用…...
Android 逆向之安全防护基本策略
对抗反编译 混淆 使用混淆主要可以减小包的大小。混淆对于安全保护来说,只是增加了阅读难度而已。混淆不会把关键代码混淆掉,比如MainActivity,Application等,可以通过分析smali和阅读jar包定位代码。 资源混淆也是换汤不换药&…...
基站机房:保障通信网络稳定,如何解决安全隐患?
基站机房作为无线通信网络的关键组成部分,承载着大量的网络设备和通信设施,对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商,动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…...
sqlmap -os-shell 使用方法
一、burp suite抓包。 如上图所示,红框处很明显是一个传参点,我们就在这个页面抓包。 抓到包之后将内容保存到桌面的1000.txt文件下。 二、sqlmap跑包。 打开sqlmap跑包。 python sqlmap.py -r C:\Users\16434\Desktop\1000.txt -dbmsmysql --os-shell…...
Go语言并发之Select多路选择操作符
1、Go语言并发之Select多路选择操作符 select 是类 UNIX 系统提供的一个多路复用系统 API,Go 语言借用多路复用的概念,提供了 select 关键字,用 于多路监听多个通道。当监听的通道没有状态是可读或可写的,select 是阻塞的&#…...
黄金回收小程序开发功能有哪些?
一、用户端: 1、实时查询:通过对接三方接口实现实时金价动态查看; 2、多种类珠宝实时回收:小程序支持多品类珠宝的实时回收包含黄金饰品、金条、铂金、K金、白银等,同步实现价格实时更新; …...
nginx的详解与应用
前言 说明 要义 nginx 有一个master 进程和多个worker 进程。主进程的主要目的是读取和评估配置,以及维护工作进程。工作进程对请求进行实际处理。nginx 采用基于事件的模型和依赖于操作系统的机制在工作进程之间有效地分发请求。工作进程的数量在配置文件中定义…...
Vite+React+TypeScript构建个人作品集网站:从技术选型到GitHub Pages自动化部署
1. 项目概述:一个现代开发者如何构建自己的技术名片最近刚把自己的个人作品集网站重构上线,地址是https://yucco-k.github.io。这不仅仅是一个展示作品的静态页面,更是一个我用来实践和整合现代前端技术栈的“游乐场”。对于开发者而言&#…...
Windows平台实战:CMake与MinGW联手编译libmodbus动态库
1. 为什么要在Windows下编译libmodbus动态库 很多工业自动化领域的开发者都会遇到这样一个需求:需要在Windows平台上开发Modbus通信工具。libmodbus作为一款开源的Modbus协议栈实现,因其轻量级和跨平台特性广受欢迎。但在Windows环境下直接使用源码会遇到…...
Neovim涂抹光标插件:提升编码体验的动态轨迹设计
1. 项目概述:一个为Neovim设计的“涂抹光标”插件 如果你和我一样,是个重度Neovim用户,每天有超过8小时的时间泡在终端和代码编辑器里,那你肯定对光标的“存在感”有要求。默认的方块或下划线光标,在长时间编码后&…...
搞定气象数据的基础统计与可视化
是不是看着一堆气象原始数据就头大? 不会处理、不会统计、更不会做可视化图表? 其实根本不用懂编程、不用啃复杂专业知识,普通小白也能零基础玩转气象数据,从数据整理、基础统计到出专业好看的成品图,新手也能一键拿…...
保姆级教程:彻底解决CondaHTTPError网络连接失败(附.condarc文件完整配置流程)
深度解析CondaHTTPError:从网络诊断到.condarc文件全配置指南 遇到CondaHTTPError: HTTP 000 CONNECTION FAILED错误时,很多开发者会感到束手无策。这个问题通常出现在国内网络环境下,尤其是公司内网、校园网或使用某些代理服务后。本文将带你…...
别只盯着SQL了!GaussDB健康度巡检,这5个‘外围’命令和日志文件更重要
别只盯着SQL了!GaussDB健康度巡检,这5个‘外围’命令和日志文件更重要 当数据库出现性能波动时,大多数DBA的第一反应是检查慢SQL或调整参数。但根据某金融客户的生产环境统计,超过60%的数据库故障其实源于日志溢出、网络闪断或备份…...
应急通信无人机中继部署与覆盖率优化【附仿真】
✨ 长期致力于应急通信、无人机、中继部署、通信覆盖率、无人机部署数目研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流,点击《获取方式》 (1)视距概率信道建模与高度部署&a…...
终极指南:BepInEx 6.0插件框架如何彻底解决Unity游戏模组开发的稳定性难题
终极指南:BepInEx 6.0插件框架如何彻底解决Unity游戏模组开发的稳定性难题 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个革命性的Unity游戏插件与模组开…...
告别PPO采样地狱!用SAC算法在连续控制任务中实现高效训练(附PyTorch代码)
SAC算法实战:突破PPO采样瓶颈的连续控制解决方案 在机器人控制、自动驾驶和游戏AI开发中,强化学习工程师们经常面临一个共同困境:算法需要与环境进行海量交互才能学到有效策略。以Ant机器人行走任务为例,传统PPO算法可能需要500万…...
Speechless:你的微博数字记忆永久保存方案,告别内容丢失焦虑
Speechless:你的微博数字记忆永久保存方案,告别内容丢失焦虑 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 你是否曾经历过精…...
