高通Android Camera Bring Up Actuator
reference:https://blog.csdn.net/mr_zjc/article/details/105736925
介绍
自动对焦功能需要靠马达带动镜片移动来实现,在拍照时候仔细听能听到对焦马达发出的咔咔声。因此,在Camera sensor bring up以后,就需要关注这个部分的控制。
这篇文章主要介绍在高通平台的CamX框架里面,如何去点亮摄像头马达,需要修改哪些相关的文件。
mm-camera 也是类似的。
大体浏览
先来个整体的浏览,看下涉及到需要修改哪些目录下的文件。要让马达运转起来,我们需要修改的基本就是下面4个目录下的相关文件。
目录 | 意义 |
---|---|
vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator | 各种型号的马达配置文件目录 |
vendor/qcom/proprietary/chi-cdk/oem/qcom/module | Camera sensor配置文件目录 |
vendor/qcom/proprietary/chi-cdk/tools/buildbins | 各个Camera sensor编译配置的文件目录 |
vendor/qcom/proprietary/camera-devicetree | dtsi文件相关,主要配置Camera sensor上电时序等信息 |
修改文件内容详细分析
例如,某个sensor是s5k3p9sx、马达型号是dw9763。
actuator配置
路径:vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator
这个目录下,是各个型号的马达配置文件,高通源码里面已经有一些比较常见的马达型号的配置文件,我们可以进行参考。
vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator$ ls
ak7371_actuator.xml dw9714v_actuator.xml dw9763b_actuator.xml gt9764_actuator.xml lc898217xc_actuator.xml
ak7374_actuator.xml dw9718s_actuator.xml dw9767_actuator.xml gt9772_actuator.xml
bu64297gwz_actuator.xml dw9763_actuator.xml dw9800_actuator.xml
我们随便打开个xml的文件:cat dw9763_actuator.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--========================================================================-->
<!-- Copyright (c) 2017-2018 Qualcomm Technologies, Inc. -->
<!-- All Rights Reserved. -->
<!-- Confidential and Proprietary - Qualcomm Technologies, Inc. -->
<!--========================================================================-->
<actuatorDriver
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../api/sensor/camxactuatordriver.xsd">
<module_version major_revision="1" minor_revision="0" incr_revision="0"/>
<!--Actuator slave information -->
<slaveInfo>
<!--Name of the actuator -->
<actuatorName>dw9763</actuatorName>
<!--8-bit or 10-bit write slave address -->
<slaveAddress>0x18</slaveAddress>
<!--I2C frequency mode of slave
Supported modes are: STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz), CUSTOM (Custom frequency in DTSI) -->
<i2cFrequencyMode>FAST</i2cFrequencyMode>
<!--Actuator type
Supported types are: VCM, BIVCM -->
<actuatorType>VCM</actuatorType>
<!--Data width in bits -->
<dataBitWidth>10</dataBitWidth>
<!--Sequence of power configuration type and configuration value required to control power to the device -->
<powerUpSequence>
<!--Power setting configuration
Contains: configType, configValue and delay in milli seconds -->
<powerSetting>
<!--Power configuration type
Supported types are: MCLK, VANA, VDIG, VIO, VAF, RESET, STANDBY -->
<configType>VAF</configType>
<!--Configuration value for the type of configuration -->
<configValue>0</configValue>
<!--Delay in milli seconds -->
<delayMs>1</delayMs>
</powerSetting>
</powerUpSequence>
<!--Sequence of power configuration type and configuration value required to control power to the device -->
<powerDownSequence>
<!--Power setting configuration
Contains: configType, configValue and delay in milli seconds -->
<powerSetting>
<!--Power configuration type
Supported types are: MCLK, VANA, VDIG, VIO, VAF, RESET, STANDBY -->
<configType>VAF</configType>
<!--Configuration value for the type of configuration -->
<configValue>0</configValue>
<!--Delay in milli seconds -->
<delayMs>1</delayMs>
</powerSetting>
</powerDownSequence>
</slaveInfo>
<!--Sequence of register configuration -->
<registerConfig>
<!--Actuator register configuration -->
<registerParam>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">2</regDataType>
<!--Register address that is accessed -->
<registerAddr>0x03</registerAddr>
<!--Register data to be programmed -->
<registerData>0</registerData>
<!--Actuator operations
Supported operations are: WRITE_HW_DAMP, WRITE_DAC, WRITE, WRITE_DIR_REG, POLL, READ_WRITE -->
<operation>WRITE_DAC_VALUE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
<!--Hardware mask -->
<hwMask>0</hwMask>
<!--Number of bits to shift for HW -->
<hwShift>0</hwShift>
<!--Number of bits to shift for data -->
<dataShift>0</dataShift>
</registerParam>
</registerConfig>
<!--Sequence of register settings to configure the device -->
<initSettings>
<!--Register setting configuration
Contains: register address, register data, register address type, register data type, operation and delay in micro seconds -->
<regSetting>
<!--Register address that is accessed -->
<registerAddr>0x02</registerAddr>
<!--If operation is WRITE, registerData is the data value to be written into the specified register address
If operation is READ, registerData is the number of bytes to be read from the specified register address -->
<registerData>0x02</registerData>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Type of the operation
Valid values are: WRITE, READ, POLL -->
<operation>WRITE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
</regSetting>
<!--Register setting configuration
Contains: register address, register data, register address type, register data type, operation and delay in micro seconds -->
<regSetting>
<!--Register address that is accessed -->
<registerAddr>0x02</registerAddr>
<!--If operation is WRITE, registerData is the data value to be written into the specified register address
If operation is READ, registerData is the number of bytes to be read from the specified register address -->
<registerData>0x02</registerData>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Type of the operation
Valid values are: WRITE, READ, POLL -->
<operation>WRITE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
</regSetting>
<!--Register setting configuration
Contains: register address, register data, register address type, register data type, operation and delay in micro seconds -->
<regSetting>
<!--Register address that is accessed -->
<registerAddr>0x06</registerAddr>
<!--If operation is WRITE, registerData is the data value to be written into the specified register address
If operation is READ, registerData is the number of bytes to be read from the specified register address -->
<registerData>0x41</registerData>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Type of the operation
Valid values are: WRITE, READ, POLL -->
<operation>WRITE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
</regSetting>
<!--Register setting configuration
Contains: register address, register data, register address type, register data type, operation and delay in micro seconds -->
<regSetting>
<!--Register address that is accessed -->
<registerAddr>0x07</registerAddr>
<!--If operation is WRITE, registerData is the data value to be written into the specified register address
If operation is READ, registerData is the number of bytes to be read from the specified register address -->
<registerData>0x3F</registerData>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Type of the operation
Valid values are: WRITE, READ, POLL -->
<operation>WRITE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
</regSetting>
<!--Register setting configuration
Contains: register address, register data, register address type, register data type, operation and delay in micro seconds -->
<regSetting>
<!--Register address that is accessed -->
<registerAddr>0x08</registerAddr>
<!--If operation is WRITE, registerData is the data value to be written into the specified register address
If operation is READ, registerData is the number of bytes to be read from the specified register address -->
<registerData>0x00</registerData>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Type of the operation
Valid values are: WRITE, READ, POLL -->
<operation>WRITE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
</regSetting>
</initSettings>
<!--Actuator tuning parameters -->
<tunedParams>
<!--Initial DAC code -->
<initialCode>180</initialCode>
<!--Actuator region parameters for all regions -->
<regionParams>
<!--Actuator region parameters -->
<region>
<!--Macro step boundary. In Near / forward direction -->
<macroStepBoundary>400</macroStepBoundary>
<!--Infinity step boundary. In Far / backward direction -->
<infinityStepBoundary>0</infinityStepBoundary>
<!--Code per step -->
<codePerStep>1</codePerStep>
<!--Q Value to convert float / double to integer format -->
<qValue>128</qValue>
</region>
</regionParams>
<!--Actuator scenario ringing and damping information
Damping parameters in forward / near direction -->
<forwardDamping>
<!--Actuator ringing scenario value -->
<ringingScenario>400</ringingScenario>
<!--Actuator damping parameters for all scenarios -->
<scenarioDampingParams>
<!--Actuator damping parameters for all regions -->
<scenario>
<!--Actuator damping parameters -->
<region>
<!--Actuator damping step -->
<dampingStep>0x3FF</dampingStep>
<!--Actuator damping delay in micro seconds that must be applied after programming damping step -->
<dampingDelayUs>1000</dampingDelayUs>
<!--Actuator HW parameters -->
<hwParams>0x0</hwParams>
</region>
</scenario>
</scenarioDampingParams>
</forwardDamping>
<!--Actuator scenario ringing and damping information
Damping parameters in backward / far direction -->
<backwardDamping>
<!--Actuator ringing scenario value -->
<ringingScenario>400</ringingScenario>
<!--Actuator damping parameters for all scenarios -->
<scenarioDampingParams>
<!--Actuator damping parameters for all regions -->
<scenario>
<!--Actuator damping parameters -->
<region>
<!--Actuator damping step -->
<dampingStep>0x3FF</dampingStep>
<!--Actuator damping delay in micro seconds that must be applied after programming damping step -->
<dampingDelayUs>1000</dampingDelayUs>
<!--Actuator HW parameters -->
<hwParams>0x0</hwParams>
</region>
</scenario>
</scenarioDampingParams>
</backwardDamping>
</tunedParams>
</actuatorDriver>
基本上,用到的Camera sensor的xml,需要根据实际情况进行配置:
-
如果xml不存在,那么需要在
vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator
添加个一个xml的文件。模组厂会给我们提供关于该颗sensor的相关文档,我们需要获取的马达相关信息,也能从提供的文档中找到。 -
如果sersor 用的马达型号对应的xml已经有了,那基于初始配置就可以了。
根据实际硬件情况,只需要做少量的改动即可(甚至不需要)。
常见的改动有:
- slaveAddress :i2c设备地址。
- i2cFrequencyMode:i2c速率。
- 上下电时序需要根据数据手册进行修改;
powerSetting
...
</powerSetting>
<powerSetting>
<configType>MCLK</configType>
<configValue>24000000</configValue>
<delayMs>1</delayMs>
</powerSetting>
<powerSetting>
...
camera sensor配置
路径:vendor/qcom/proprietary/chi-cdk/oem/qcom/module
这个目录下,就是关于camera sensor的配置文件了,关于某颗sensor的的详细信息,是在这边进行创建添加的。
vendor/qcom/proprietary/chi-cdk/oem/qcom/module$ ls
altek1_imx577_module.xml liteon_ov9282_master_module.xml sunny_imx481_module.xml
altek2_imx577_module.xml liteon_ov9282_slave_module.xml sunny_imx519_module_talos.xml
...
同样地,随便打开一个module配置:cat truly_s5k3p9sx_module.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--========================================================================-->
<!-- Copyright (c) 2018 Qualcomm Technologies, Inc. -->
<!-- All Rights Reserved. -->
<!-- Confidential and Proprietary - Qualcomm Technologies, Inc. -->
<!--========================================================================-->
<cameraModuleData
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="....cdksensorcamxmoduleconfig.xsd">
<module_version major_revision="1" minor_revision="0" incr_revision="0"/>
<!--Module group can contain either 1 module or 2 modules
Dual camera, stereo camera use cases contain 2 modules in the group -->
<moduleGroup>
<!--Module configuration -->
<moduleConfiguration description="Module configuration">
<!--CameraId is the id to which DTSI node is mapped.
Typically CameraId is the slot Id for non combo mode. -->
<cameraId>0</cameraId>
<!--Name of the module integrator -->
<moduleName>truly</moduleName>
<!--Name of the sensor in the image sensor module -->
<sensorName>s5k3p9sx</sensorName>
<!--Actuator name in the image sensor module
This is an optional element. Skip this element if actuator is not present -->
<actuatorName>dw9763</actuatorName>
<oisName></oisName>
<!--EEPROM name in the image sensor module
This is an optional element. Skip this element if EEPROM is not present -->
<!--eepromName>truly_gt24c64</eepromName-->
<!--Flash name is used to used to open binary.
Binary name is of form flashName_flash.bin Ex:- pmic_flash.bin -->
<flashName>pmic</flashName>
<!--Chromatix name is used to used to open binary.
Binary name is of the form sensor_model_chromatix.bin -->
<chromatixName>default</chromatixName>
<!--Position of the sensor module.
Valid values are: REAR, FRONT, REAR_AUX, FRONT_AUX, EXTERNAL -->
<position>REAR</position>
<!--CSI Information -->
<CSIInfo description="CSI Information">
<laneAssign>0x3210</laneAssign>
<isComboMode>0</isComboMode>
</CSIInfo>
<!--Lens information -->
<lensInfo description="Lens Information">
<!--Focal length of the lens in millimeters. -->
<focalLength>3.65</focalLength>
<!--F-Number of the optical system. -->
<fNumber>1.85</fNumber>
<!--Minimum focus distance in meters. -->
<minFocusDistance>0.1</minFocusDistance>
<!--Total focus distance in meters. -->
<maxFocusDistance>1.9</maxFocusDistance>
<!--Horizontal view angle in degrees. -->
<horizontalViewAngle>61.5</horizontalViewAngle>
<!--Vertical view angle in degrees. -->
<verticalViewAngle>46.05</verticalViewAngle>
<!--Maximum Roll Degree. Valid values are: 0 to 359 -->
<maxRollDegree>360</maxRollDegree>
<!--Maximum Pitch Degree. Valid values are: 0, 90, 180, 270 -->
<maxPitchDegree>360</maxPitchDegree>
<!--Maximum Yaw Degree. Valid values are: 0 to 359 -->
<maxYawDegree>360</maxYawDegree>
</lensInfo>
<!--pdafName>s5k3p9sx_pdaf</pdafName-->
</moduleConfiguration>
</moduleGroup>
</cameraModuleData>
如果是厂商会提供这样的配置,那是最好,基本上不用怎么修改,但如果是自己弄的话,就需要注意以下部分:
- actuatorName:马达名称(例如
dw9763
),这个部分要和上面的actuator配置中的actuatorName
匹配 - cameraId:要和设备树匹配。
- position:前后摄像头等
- 上下电时序需要根据数据手册进行修改;
powerSetting
(同上)
编译系统
上面的2个配置已经配好了,但是需要在这里进行编辑才能够最终生效。
yaml文件
路径: vendor/qcom/proprietary/chi-cdk/tools/buildbins
vendor/qcom/proprietary/chi-cdk/tools/buildbins$ ls
buildbins_bengal.yaml buildbins_lito.yaml buildbins_sm6150.yaml linux64 win32
buildbins_kona.yaml buildbins.py buildbins.yaml NOTICE yaml
在Camx架构中,各个功能模块(每颗sensor的module和turning等模块),都可以编译成各自独立的so文件。
修改某个模块的内容后,我们可以切到chi-cdk目录下,进行mm编译,编译生成的对应so文件在vendor/lib*/
目录下。
我们打开其中一个yaml文件,看下里面的内容:
sensor_drivers:
- com.qti.sensormodule.truly_s5k3p9sx:
- sensor/default/s5k3p9sx/s5k3p9sx_sensor.xml
- sensor/default/s5k3p9sx/s5k3p9sx_pdaf.xml # 新增
- module/truly_s5k3p9sx_module.xml
- actuator/default/dw9763_actuator.xml # 新增
- flash/back_sensor_flash.xml
...
mk文件
路径:vendor/qcom/proprietary/common/config/device-vendor.mk
确保对应的camera-sensor以及actuator编译进:
...
MM_CAMERA += com.qti.sensor.s5k3p9sx
...
MM_CAMERA += com.qti.actuator.dw9763
设备树
在驱动框架、编译系统都准备就绪以后,就要实际结合硬件来进行修改了,这部分的工作主要以配置引脚等属性为主。
路径:vendor/qcom/proprietary/devicetree-4.19/qcom/camera
根据版本不同,目录略有差异,但类似,例如
vendor/qcom/proprietary/camera-devicetree
camera-devicetree 这边的dtsi文件,配置的就是和camera上电相关的内容了, 修改了该目录下的文件后,我们需要编译dtbo.img文件来烧录更新修改(保险起见,连同boot.img成对烧录)。
vendor/qcom/proprietary/camera-devicetree$ ls
bengal-camera.dtsi kona-camera-sensor-mtp.dtsi lito-camera.dtsi
bengal-camera-sensor-idp.dtsi kona-camera-sensor-qrd.dtsi lito-camera-sensor-cdp.dtsi
camera.dtsi
我们打开需要编译的dtsi
文件,看下里面的内容:
/*
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
&soc {
led_flash_rear: qcom,camera-flash@0 {
cell-index = <0>;
reg = <0x00 0x00>;
compatible = "qcom,camera-flash";
flash-source = <&pmi8998_flash0 &pmi8998_flash1>;
torch-source = <&pmi8998_torch0 &pmi8998_torch1>;
switch-source = <&pmi8998_switch0>;
status = "ok";
};
led_flash_rear_aux: qcom,camera-flash@1 {
cell-index = <1>;
reg = <0x01 0x00>;
compatible = "qcom,camera-flash";
flash-source = <&pmi8998_flash0 &pmi8998_flash1>;
torch-source = <&pmi8998_torch0 &pmi8998_torch1>;
switch-source = <&pmi8998_switch0>;
status = "ok";
};
led_flash_front: qcom,camera-flash@2 {
cell-index = <2>;
reg = <0x02 0x00>;
compatible = "qcom,camera-flash";
flash-source = <&pmi8998_flash2>;
torch-source = <&pmi8998_torch2>;
switch-source = <&pmi8998_switch1>;
status = "ok";
};
led_flash_iris: qcom,camera-flash@3 {
cell-index = <3>;
reg = <0x03 0x00>;
compatible = "qcom,camera-flash";
flash-source = <&pmi8998_flash2>;
torch-source = <&pmi8998_torch2>;
switch-source = <&pmi8998_switch2>;
status = "ok";
};
actuator_regulator: gpio-regulator@0 {
compatible = "regulator-fixed";
reg = <0x00 0x00>;
regulator-name = "actuator_regulator";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
regulator-enable-ramp-delay = <100>;
enable-active-high;
gpio = <&tlmm 93 0>; /* 马达对应的 pin*/
vin-supply = <&pmi8998_bob>;
};
camera_rear_ldo: gpio-regulator@1 {
compatible = "regulator-fixed";
reg = <0x01 0x00>;
regulator-name = "camera_rear_ldo";
//regulator-min-microvolt = <1050000>;
//regulator-max-microvolt = <1050000>;
regulator-enable-ramp-delay = <135>;
enable-active-high;
gpio = <&pm8998_gpios 12 0>;
pinctrl-names = "default";
pinctrl-0 = <&camera_rear_dvdd_en_default>;
//vin-supply = <&pm8998_s3>;
};
camera_ldo: gpio-regulator@2 {
compatible = "regulator-fixed";
reg = <0x02 0x00>;
regulator-name = "camera_ldo";
//regulator-min-microvolt = <1050000>;
//regulator-max-microvolt = <1050000>;
regulator-enable-ramp-delay = <233>;
enable-active-high;
gpio = <&pm8998_gpios 9 0>;
pinctrl-names = "default";
pinctrl-0 = <&camera_dvdd_en_default>;
//vin-supply = <&pm8998_s3>;
};
};
&cam_cci {
qcom,cam-res-mgr {
compatible = "qcom,cam-res-mgr";
status = "ok";
};
actuator_rear: qcom,actuator@0 {
cell-index = <0>;
reg = <0x0>;
compatible = "qcom,actuator";
cci-master = <0>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <2800000>;
rgltr-max-voltage = <2800000>;
rgltr-load-current = <0>;
};
actuator_rear_aux: qcom,actuator@1 {
cell-index = <1>;
reg = <0x1>;
compatible = "qcom,actuator";
cci-master = <1>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <2800000>;
rgltr-max-voltage = <2800000>;
rgltr-load-current = <0>;
};
actuator_front: qcom,actuator@2 {
cell-index = <2>;
reg = <0x2>;
compatible = "qcom,actuator";
cci-master = <1>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <2800000>;
rgltr-max-voltage = <2800000>;
rgltr-load-current = <0>;
};
ois_rear: qcom,ois@0 {
cell-index = <0>;
reg = <0x0>;
compatible = "qcom,ois";
cci-master = <0>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <2800000>;
rgltr-max-voltage = <2800000>;
rgltr-load-current = <0>;
status = "ok";
};
eeprom_rear: qcom,eeprom@0 {
cell-index = <0>;
reg = <0>;
compatible = "qcom,eeprom";
cam_vio-supply = <&pm8998_lvs1>;
cam_vana-supply = <&pmi8998_bob>;
cam_vdig-supply = <&camera_rear_ldo>;
cam_clk-supply = <&titan_top_gdsc>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vio", "cam_vana", "cam_vdig",
"cam_clk", "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <0 3312000 1050000 0 2800000>;
rgltr-max-voltage = <0 3600000 1050000 0 2800000>;
rgltr-load-current = <0 80000 105000 0 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_active
&cam_sensor_rear_active>;
pinctrl-1 = <&cam_sensor_mclk0_suspend
&cam_sensor_rear_suspend>;
gpios = <&tlmm 13 0>,
<&tlmm 80 0>,
<&tlmm 79 0>;
gpio-reset = <1>;
gpio-vana = <2>;
gpio-req-tbl-num = <0 1 2>;
gpio-req-tbl-flags = <1 0 0>;
gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0",
"CAM_VANA0";
sensor-position = <0>;
sensor-mode = <0>;
cci-master = <0>;
status = "ok";
clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
eeprom_rear_aux: qcom,eeprom@1 {
cell-index = <1>;
reg = <0x1>;
compatible = "qcom,eeprom";
cam_vdig-supply = <&camera_ldo>;
cam_vio-supply = <&pm8998_lvs1>;
cam_vana-supply = <&pmi8998_bob>;
cam_clk-supply = <&titan_top_gdsc>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vdig", "cam_vio", "cam_vana",
"cam_clk", "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <1050000 0 3312000 0 2800000>;
rgltr-max-voltage = <1050000 0 3600000 0 2800000>;
rgltr-load-current = <105000 0 80000 0 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk2_active
&cam_sensor_rear2_active>;
pinctrl-1 = <&cam_sensor_mclk2_suspend
&cam_sensor_rear2_suspend>;
gpios = <&tlmm 15 0>,
<&tlmm 9 0>,
<&tlmm 8 0>;
gpio-reset = <1>;
gpio-vana = <2>;
gpio-req-tbl-num = <0 1 2>;
gpio-req-tbl-flags = <1 0 0>;
gpio-req-tbl-label = "CAMIF_MCLK1",
"CAM_RESET1",
"CAM_VANA1";
sensor-position = <0>;
sensor-mode = <0>;
cci-master = <1>;
status = "ok";
clocks = <&clock_camcc CAM_CC_MCLK2_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
eeprom_front: qcom,eeprom@2 {
cell-index = <2>;
reg = <0x2>;
compatible = "qcom,eeprom";
cam_vio-supply = <&pm8998_lvs1>;
cam_vana-supply = <&pmi8998_bob>;
cam_vdig-supply = <&camera_ldo>;
cam_clk-supply = <&titan_top_gdsc>;
cam_vaf-supply = <&actuator_regulator>;
regulator-names = "cam_vio", "cam_vana", "cam_vdig",
"cam_clk", "cam_vaf";
rgltr-cntrl-support;
rgltr-min-voltage = <0 3312000 1050000 0 2800000>;
rgltr-max-voltage = <0 3600000 1050000 0 2800000>;
rgltr-load-current = <0 80000 105000 0 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk1_active
&cam_sensor_front_active>;
pinctrl-1 = <&cam_sensor_mclk1_suspend
&cam_sensor_front_suspend>;
gpios = <&tlmm 14 0>,
<&tlmm 28 0>,
<&tlmm 8 0>;
gpio-reset = <1>;
gpio-vana = <2>;
gpio-req-tbl-num = <0 1 2>;
gpio-req-tbl-flags = <1 0 0>;
gpio-req-tbl-label = "CAMIF_MCLK2",
"CAM_RESET2",
"CAM_VANA2";
sensor-position = <1>;
sensor-mode = <0>;
cci-master = <1>;
status = "ok";
clocks = <&clock_camcc CAM_CC_MCLK1_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
qcom,cam-sensor@0 { // 后置摄像头
cell-index = <0>;
compatible = "qcom,cam-sensor";
reg = <0x0>;
csiphy-sd-index = <0>;
sensor-position-roll = <270>;
sensor-position-pitch = <0>;
sensor-position-yaw = <180>;
/* 如果用到了闪光灯、马达;则需要对应有关的节点。*/
led-flash-src = <&led_flash_rear>;
actuator-src = <&actuator_rear>;
//ois-src = <&ois_rear>;
//eeprom-src = <&eeprom_rear>;
cam_vio-supply = <&pm8998_lvs1>;
//cam_vana-supply = <&camera_vana_ldo>;
cam_vdig-supply = <&camera_rear_ldo>;
cam_clk-supply = <&titan_top_gdsc>;
regulator-names = "cam_vio","cam_vdig", "cam_clk";
rgltr-cntrl-support;
rgltr-min-voltage = <0 1050000 0>;
rgltr-max-voltage = <0 1050000 0>;
rgltr-load-current = <0 105000 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_active
&cam_sensor_rear_active>;
pinctrl-1 = <&cam_sensor_mclk0_suspend
&cam_sensor_rear_suspend>;
gpios = <&tlmm 13 0>,
<&tlmm 9 0>,
<&tlmm 26 0>,
<&tlmm 8 0>;
gpio-reset = <1>;
gpio-standby = <2>;
gpio-custom1 = <3>; //vana
gpio-req-tbl-num = <0 1 2 3>;
gpio-req-tbl-flags = <1 0 0 0>;
gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0",
"CAM_STANDBY0",
"CAM_CUSTOM1";
sensor-mode = <0>;
cci-master = <0>;
status = "ok";
clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
qcom,cam-sensor@1 { // 前置摄像头
cell-index = <1>;
compatible = "qcom,cam-sensor";
reg = <0x1>;
csiphy-sd-index = <1>;
sensor-position-roll = <270>;
sensor-position-pitch = <0>;
sensor-position-yaw = <0>;
/* 如果用到了闪光灯、马达;则需要对应有关的节点。*/
//actuator-src = <&actuator_front>;
led-flash-src = <&led_flash_front>;
//eeprom-src = <&eeprom_front>;
cam_vdig-supply = <&camera_ldo>;
cam_vio-supply = <&pm8998_lvs1>;
//cam_vana-supply = <&camera_vana_ldo>;
cam_clk-supply = <&titan_top_gdsc>;
regulator-names = "cam_vdig", "cam_vio", "cam_clk";
rgltr-cntrl-support;
rgltr-min-voltage = <1050000 0 0>;
rgltr-max-voltage = <1050000 0 0>;
rgltr-load-current = <105000 0 0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk1_active
&cam_sensor_front_active>;
pinctrl-1 = <&cam_sensor_mclk1_suspend
&cam_sensor_front_suspend>;
gpios = <&tlmm 14 0>,
<&tlmm 7 0>,
<&tlmm 40 0>,
<&tlmm 84 0>;
gpio-reset = <1>;
gpio-standby = <2>;
gpio-custom1 = <3>; //vana
gpio-req-tbl-num = <0 1 2 3>;
gpio-req-tbl-flags = <1 0 0 0>;
gpio-req-tbl-label = "CAMIF_MCLK1",
"CAM_RESET1",
"CAM_STANDBY1",
"CAM_CUSTOM1";
sensor-mode = <0>;
cci-master = <1>;
status = "ok";
clocks = <&clock_camcc CAM_CC_MCLK1_CLK>;
clock-names = "cam_clk";
clock-cntl-level = "turbo";
clock-rates = <24000000>;
};
//...
};