高通 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.通过配置camxoverridesettings.txt实现dump yuv和raw

dump raw:

autoImageDumpMask=1 
offlineImageDumpOnly=FALSE 
reprocessDump=TRUE 
autoImageDump=TRUE 
autoInputImageDumpMask=0x1
autoImageDumpIFEoutputportMask=0xFB8

dump yuv:

autoImageDumpMask=1 
offlineImageDumpOnly=FALSE 
reprocessDump=TRUE 
autoImageDump=TRUE  
autoImageDumpIPEoutputportMask=0x700

19.未完待续、持续补充 

猜你喜欢

转载自blog.csdn.net/geyichongchujianghu/article/details/131139208