otp
vendor/qcom/proprietary/camx/src/core/camxeepromdata.cpp
EEPROMData::EEPROMData(
EEPROMDriverData* pEEPROMDriverData,
HwSensorInfo* pSensorInfoTable,
const HwDeviceTypeInfo* pDeviceInfo,
CSLHandle hCSL)
{
LoadEEPROMLibrary();
// @todo (CAMX-1996) - Implement library mechanism for OTP data parsing/formating.
FormatModuleAndBarData();
FormatAFData();
FormatWBData();
FormatLSCData();
FormatSPCData();
FormatOISData();
FormatDualCameraData();
FormatPDAFDCCData();
FormatPDAF2DData();
FormatLensData();
}
查询flash设备能力接口
CSLQueryDeviceCapabilitiesHW
CSLHwInternalFlashUMDQueryCapability
查看camera枚举了哪些设备
adb shell setprop persist.vendor.camera.logVerboseMask 0x30404
adb shell setprop persist.vendor.camera.logInfoMask 0x30404
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/video0 (Type:CSLHwRequestManager, FD:9, Index:-1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/video0 (Type:CSLHwRequestManager, FD:9, Index:-1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/video0 (Type:CSLHwRequestManager, FD:9, Index:-1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev0 (Type:CSLHwCPAS_TOP, FD:12, Index:-1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev1 (Type:CSLHwTFE, FD:14, Index:0)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev2 (Type:CSLHwCSIPHY, FD:13, Index:1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev3 (Type:CSLHwCSIPHY, FD:15, Index:2)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev4 (Type:CSLHwLensActuator, FD:16, Index:3)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev5 (Type:CSLHwLensActuator, FD:17, Index:4)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev6 (Type:CSLHwImageSensor, FD:18, Index:0)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev7 (Type:CSLHwImageSensor, FD:19, Index:1)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev8 (Type:CSLHwEEPROM, FD:20, Index:5)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev9 (Type:CSLHwEEPROM, FD:21, Index:6)
camxcslhwinternal.cpp:3203 CSLHwInternalDefaultIoctl() Ioctl succeeded for device /dev/v4l-subdev10 (Type:CSLHwOPE, FD:22, Index:7)
查看sensor加载的子设备
- CreateSensorSubModules
- adb指令
adb shell setprop persist.vendor.camera.logVerboseMask 0x2
adb shell setprop persist.vendor.camera.logInfoMask 0x2
c
camximagesensormoduledata.cpp:812 CreateSensorSubModules() Actuator device found on camera 0, name:xtc_gt9778
camximagesensormoduledata.cpp:853 CreateSensorSubModules() OIS driver data not found, skip OIS setup camera 0
camximagesensormoduledata.cpp:881 CreateSensorSubModules() Flash driver data not found, sensor 0 have no flash support
camximagesensormoduledata.cpp:828 CreateSensorSubModules() Actuator driver data not found, skip Actuator setup camera 1
camximagesensormoduledata.cpp:853 CreateSensorSubModules() OIS driver data not found, skip OIS setup camera 1
camximagesensormoduledata.cpp:881 CreateSensorSubModules() Flash driver data not found, sensor 1 have no flash support
查看AF OTP数据
CalibrateActuatorDriverData
c
camxactuatordata.cpp:113 CalibrateActuatorDriverData() Infinity:439, Macro: 687: WithMargin:
Infinity:353, Macro: 724, InfinityMargin:-0.350000, MacroMargin: 0.150000
camxactuatordata.cpp:127 CalibrateActuatorDriverData() pRegionParams[0].codePerStep: 0.782178
camxactuatordata.cpp:131 CalibrateActuatorDriverData() stepTableSize: 202: codePerStep: 0.782178,
DACRange: 158, macroDAC: 511, infinityDAC: 353
1.加载SO库
camximagesensordata.cpp
- CamxResult ImageSensorData::LoadSensorLibrary()
camxhwenvironment.cpp
- HwEnvironment::CreateTuningDataManager
2.模式
chxutils.cpp
- VOID ChxUtils::FillTuningModeData
camxopenode.cpp
- CamxResult OPENode::ExecuteProcessRequest()
3.camxoverridesettings
camxoverridesettingsfile.cpp
430 Initialize()
4.HAL数据流关键文件
camxsession.cpp
对应关系
c
Preview HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED
SnapShot HAL_PIXEL_FORMAT_BLOB
CallBack HAL_PIXEL_FORMAT_YCbCr_420_888
5.查看usercase
- AdvancedCameraUsecase::Initialize
6. Jpg编码关键日志
c
Line 173641: 06-28 18:25:23.204 565 752 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:750 ExecuteProcessRequest() [KPI_Perf]: Jpegsw seq 0 reqid 35
Line 173641: 06-28 18:25:23.204 565 752 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:750 ExecuteProcessRequest() [KPI_Perf]: Jpegsw seq 0 reqid 35
Line 173655: 06-28 18:25:23.555 565 750 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:750 ExecuteProcessRequest() [KPI_Perf]: Jpegsw seq 1 reqid 35
Line 173655: 06-28 18:25:23.555 565 750 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:750 ExecuteProcessRequest() [KPI_Perf]: Jpegsw seq 1 reqid 35
Line 173656: 06-28 18:25:23.556 565 750 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:1626 StartJpegEncoding() [KPI_Perf]: use_dsp: 0, max_no_of_cores: 4, Rotation: 270, quality: 100
Line 173657: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Source (WxH) = 2592 x 1944
Line 173658: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Source Rotation = 270
Line 173659: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Scale En = 0
Line 173660: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Stride En = 1
Line 173661: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Stride in Y = 2688
Line 173662: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Stride in UV = 2688
Line 173663: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Stride out Y = 0
Line 173664: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_start : Stride out UV = 0
Line 173665: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_configure : Slice Num = 0, Slice Height = 656
Line 173666: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_configure : Slice Num = 1, Slice Height = 656
Line 173667: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_configure : Slice Num = 2, Slice Height = 640
Line 173668: 06-28 18:25:23.557 565 750 E JPEG_SW_LIB: jpege_engine_hybrid_configure : Slice Num = 3, Slice Height = 640
Line 173685: 06-28 18:25:23.654 565 4042 E JPEG_SW_LIB:
Line 173686: 06-28 18:25:23.654 565 4042 E JPEG_SW_LIB: Encoding Completed
Line 173687: 06-28 18:25:23.654 565 4042 D CamX : [DEBUG][JPEG ] camxjpegswencnode.cpp:1626 StartJpegEncoding() [KPI_Perf]: use_dsp: 0, max_no_of_cores: 4, Rotation: 0, quality: 80
gyro数据相关
Dear Customer:
For AF/AE/Fd modules, data is got in by function like CAFIOUtil::PopulateGyroData(), then filled to below param, which will be used for AF algorithm.
m_AFOutputGyroValue.pAngularVelocityX[index] = pGyroData->x;
m_AFOutputGyroValue.pAngularVelocityY[index] = pGyroData->y;
m_AFOutputGyroValue.pAngularVelocityZ[index] = pGyroData->z;
m_AFOutputGyroValue.timeStamp[index] = pGyroData->timestamp;
For EIS, data is got from following data
ChiNodeWrapper::FNGetData
测光模式
vendor/qcom/proprietary/camx/src/swl/stats/camxaecengine.cpp
c
CamxResult CAECEngine::Initialize() {
m_HALParam.AEMeteringMode = 0;
}
vendor/qcom/proprietary/camx/src/swl/stats/camxcaecstatsprocessor.cpp
c
VOID CAECStatsProcessor::ReadInputVendorTag() {
READ("org.codeaurora.qcamera3.exposure_metering", "exposure_metering_mode", pHALParam->AEMeteringMode);
}
CamxResult CAECStatsProcessor::SetBestShotModeSettings() {
if (NULL != pHALParam)
{
bestShotmode = pHALParam->controlSceneMode;
switch (bestShotmode)
{
case ControlSceneModeAction:
case ControlSceneModeSteadyphoto:
case ControlSceneModeSports:
pHALParam->AEMeteringMode = AECAlgoMeteringModeCenterWeighted; // Center_Weighted
}
vendor/qcom/proprietary/chi-cdk/api/stats/chiaecinterface.h
c
/// @brief Defines the AEC metering mode
typedef enum
{
AECAlgoMeteringModeFrameAverage, ///< Frame average
AECAlgoMeteringModeCenterWeighted, ///< Center weighted
AECAlgoMeteringModeSpot, ///< Spot metering
AECAlgoMeteringModeCustom, ///< Custom Metering Table
AECAlgoMeteringModeMax = 0x7FFFFFFF ///< Anchor to indicate the last item in the defines
} AECAlgoMeteringModeType;
c
private void applyExposureMeteringModes(CaptureRequest.Builder request) {
String value = mSettingsManager.getValue(SettingsManager.KEY_EXPOSURE_METERING_MODE);
if (value != null) {
int intValue = Integer.parseInt(value);
request.set(CaptureModule.exposure_metering, intValue);
}
}
private void applyCommonSettings(CaptureRequest.Builder builder, int id) {
builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode);
applyAfModes(builder);
applyFaceDetection(builder);
applyTouchTrackFocus(builder);
applyWhiteBalance(builder);
applyExposure(builder);
applyIso(builder);
applyColorEffect(builder);
applySceneMode(builder);
applyZoom(builder, id);
applyInstantAEC(builder);
applySaturationLevel(builder);
applyAntiBandingLevel(builder);
applySharpnessControlModes(builder);
applyExposureMeteringModes(builder);
applyHistogram(builder);
applyAWBCCTAndAgain(builder);
applyBGStats(builder);
applyBEStats(builder);
applyWbColorTemperature(builder);
applyToneMapping(builder);
}
touch af
vendor/qcom/proprietary/camx/src/swl/stats/camxcaecstatsprocessor.cpp
c
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CAECStatsProcessor::SetTouchROISettings
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VOID CAECStatsProcessor::SetTouchROISettings(
AECEngineHALParam* pHALParam,
WeightedRectangle* pTouchROIInfo
) const
{
// Taking local variable to save multiple derefrence and type cast.
FLOAT xMax = static_cast<FLOAT>(pTouchROIInfo->xMax);
FLOAT yMax = static_cast<FLOAT>(pTouchROIInfo->yMax);
FLOAT xMin = static_cast<FLOAT>(pTouchROIInfo->xMin);
FLOAT yMin = static_cast<FLOAT>(pTouchROIInfo->yMin);
FLOAT activeWidth = static_cast<FLOAT>(m_hardwareInfo.sensorInfo.sensorActiveResWidth);
FLOAT activeHeight = static_cast<FLOAT>(m_hardwareInfo.sensorInfo.sensorActiveResHeight);
FLOAT resWidth = static_cast<FLOAT>(m_hardwareInfo.sensorInfo.sensorResWidth);
FLOAT resHeight = static_cast<FLOAT>(m_hardwareInfo.sensorInfo.sensorResHeight);
StatsRectangle statsROI = { 0 };
AECAlgoROI touchROI;
if (0 != pTouchROIInfo->weight)
{
GetCropWindow(&statsROI);
CAMX_LOG_VERBOSE(CamxLogGroupAEC, "Input CamId:%d Max(x:%d y:%d) Min(x:%d y%d)",
m_cameraId,
pTouchROIInfo->xMax,
pTouchROIInfo->yMax,
pTouchROIInfo->xMin,
pTouchROIInfo->yMin);
// Convert input AE regions to CAMIF size from Sensor Active pixel size
touchROI.x = xMin * resWidth / activeWidth;
touchROI.y = yMin * resHeight / activeHeight;
touchROI.dx = (xMax - xMin) * resWidth / activeWidth;
touchROI.dy = (yMax - yMin) * resHeight / activeHeight;
// Input Touch region can be 0 and less then statsROI.left
// tested using cts.CaptureRequestTest#testDigitalZoom
// tested using cts.CaptureRequestTest#testZoomRatio
touchROI.x -= statsROI.left;
touchROI.x = Utils::MaxFLOAT(touchROI.x,0.0f);
touchROI.y -= statsROI.top;
touchROI.y = Utils::MaxFLOAT(touchROI.y,0.0f);
if (Utils::RoundFLOAT(touchROI.dx + touchROI.x) > static_cast<INT32>(statsROI.width))
{
touchROI.dx = statsROI.width - touchROI.x;
}
if (Utils::RoundFLOAT(touchROI.dy + touchROI.y) > static_cast<INT32>(statsROI.height))
{
touchROI.dy = statsROI.height - touchROI.y;
}
// Calculate ratio of AE region to Crop window and send to Algo
pHALParam->touchROI.x = touchROI.x / statsROI.width;
pHALParam->touchROI.y = touchROI.y / statsROI.height;
pHALParam->touchROI.dx = touchROI.dx / statsROI.width;
pHALParam->touchROI.dy = touchROI.dy / statsROI.height;
pHALParam->touchROI.weight = static_cast<FLOAT>(pTouchROIInfo->weight);
CAMX_LOG_VERBOSE(CamxLogGroupAEC, "Output x:%f y:%f dx:%f dy %f weight:%f",
pHALParam->touchROI.x,
pHALParam->touchROI.y,
pHALParam->touchROI.dx,
pHALParam->touchROI.dy,
pHALParam->touchROI.weight);
}
else
{
pHALParam->touchROI.weight = 0.0f;
}
}