高通平台camera bring-up
传感器驱动程序调试
1.1相机传感器的参考驱动程序
用户空间驱动程序位于vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs中
ov8856
s5k4h8
sp2509
1.2添加新驱动程序所需修改的文件
设备树源文件为kernel\msm-3.18\arch\arm\boot\dts\qcom\ hp50b65-msm8937-camera-sensor-qrd.dtsi中
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
reg = <0x0>;
配置
在 vendor/qcom/proprietary/common/config/device-vendor.mk 中,将新库条目添加在要包括
在该版本的文件中。
MM_CAMERA += libchromatix_ov8856_a3_default_preview
MM_CAMERA += libchromatix_ov8856_a3_default_video
MM_CAMERA += libchromatix_ov8856_a3_hfr_120
MM_CAMERA += libchromatix_ov8856_a3_hfr_60
MM_CAMERA += libchromatix_ov8856_a3_hfr_90
MM_CAMERA += libchromatix_ov8856_zsl_preview
MM_CAMERA += libchromatix_ov8856_zsl_video
MM_CAMERA += libchromatix_ov8856_common
MM_CAMERA += libchromatix_ov8856_cpp_ds_chromatix
MM_CAMERA += libchromatix_ov8856_cpp_hfr_120
MM_CAMERA += libchromatix_ov8856_cpp_hfr_60
MM_CAMERA += libchromatix_ov8856_cpp_hfr_90
MM_CAMERA += libchromatix_ov8856_cpp_liveshot
MM_CAMERA += libchromatix_ov8856_cpp_preview
MM_CAMERA += libchromatix_ov8856_cpp_snapshot
MM_CAMERA += libchromatix_ov8856_cpp_us_chromatix
MM_CAMERA += libchromatix_ov8856_cpp_video
MM_CAMERA += libchromatix_ov8856_hfr_120
MM_CAMERA += libchromatix_ov8856_hfr_60
MM_CAMERA += libchromatix_ov8856_hfr_90
MM_CAMERA += libchromatix_ov8856_liveshot
MM_CAMERA += libchromatix_ov8856_preview
MM_CAMERA += libchromatix_ov8856_snapshot
MM_CAMERA += libchromatix_ov8856_default_video
MM_CAMERA += libchromatix_ov8856_postproc
MM_CAMERA += libchromatix_s5k4h8_a3_default_preview
MM_CAMERA += libchromatix_s5k4h8_a3_default_video
MM_CAMERA += libchromatix_s5k4h8_a3_hfr_60
MM_CAMERA += libchromatix_s5k4h8_a3_hfr_90
MM_CAMERA += libchromatix_s5k4h8_a3_hfr_120
MM_CAMERA += libchromatix_s5k4h8_zsl_preview
MM_CAMERA += libchromatix_s5k4h8_zsl_video
MM_CAMERA += libchromatix_s5k4h8_common
MM_CAMERA += libchromatix_s5k4h8_cpp_hfr_60
MM_CAMERA += libchromatix_s5k4h8_cpp_hfr_90
MM_CAMERA += libchromatix_s5k4h8_cpp_hfr_120
MM_CAMERA += libchromatix_s5k4h8_cpp_liveshot
MM_CAMERA += libchromatix_s5k4h8_cpp_preview
MM_CAMERA += libchromatix_s5k4h8_cpp_snapshot
MM_CAMERA += libchromatix_s5k4h8_cpp_video
MM_CAMERA += libchromatix_s5k4h8_hfr_60
MM_CAMERA += libchromatix_s5k4h8_hfr_90
MM_CAMERA += libchromatix_s5k4h8_hfr_120
MM_CAMERA += libchromatix_s5k4h8_liveshot
MM_CAMERA += libchromatix_s5k4h8_preview
MM_CAMERA += libchromatix_s5k4h8_snapshot
MM_CAMERA += libchromatix_s5k4h8_default_video
MM_CAMERA += libchromatix_s5k4h8_postproc
MM_CAMERA += libchromatix_sp2509_a3_default_preview
MM_CAMERA += libchromatix_sp2509_a3_default_video
MM_CAMERA += libchromatix_sp2509_a3_hfr_60
MM_CAMERA += libchromatix_sp2509_a3_hfr_90
MM_CAMERA += libchromatix_sp2509_a3_hfr_120
MM_CAMERA += libchromatix_sp2509_zsl_preview
MM_CAMERA += libchromatix_sp2509_zsl_video
MM_CAMERA += libchromatix_sp2509_common
MM_CAMERA += libchromatix_sp2509_cpp_ds_chromatix
MM_CAMERA += libchromatix_sp2509_cpp_hfr_60
MM_CAMERA += libchromatix_sp2509_cpp_hfr_90
MM_CAMERA += libchromatix_sp2509_cpp_hfr_120
MM_CAMERA += libchromatix_sp2509_cpp_liveshot
MM_CAMERA += libchromatix_sp2509_cpp_preview
MM_CAMERA += libchromatix_sp2509_cpp_snapshot
MM_CAMERA += libchromatix_sp2509_cpp_us_chromatix
MM_CAMERA += libchromatix_sp2509_cpp_video
MM_CAMERA += libchromatix_sp2509_cpp_video_full
MM_CAMERA += libchromatix_sp2509_hfr_60
MM_CAMERA += libchromatix_sp2509_hfr_90
MM_CAMERA += libchromatix_sp2509_hfr_120
MM_CAMERA += libchromatix_sp2509_liveshot
MM_CAMERA += libchromatix_sp2509_preview
MM_CAMERA += libchromatix_sp2509_snapshot
MM_CAMERA += libchromatix_sp2509_default_video
MM_CAMERA += libchromatix_sp2509_video_full
MM_CAMERA += libchromatix_sp2509_postproc
…
MM_CAMERA += libmmcamera_ov8856
MM_CAMERA += libmmcamera_s5k4h8
MM_CAMERA += libmmcamera_sp2509
…
MM_CAMERA += s5k4h8_chromatix.xml
MM_CAMERA += ov8856_chromatix.xml
MM_CAMERA += sp2509_chromatix.xml
在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\module\ sensor_init.c中的修改#define MAX_CAMERA_CONFIG 20 –> #define MAX_CAMERA_CONFIG 23
用户空间传感器驱动程序为 $(MM_CAMERA_DIR)/mm-camera2/media-controller/modules/ sensors/sensor_libs/ vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs下的 <sensor>_lib.c/h 和 Android.mk,例如 s5k4h8_lib.c/h除驱动程序外,还需修改 Android.mk
在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\msm8937_camera.xml中添加:
<CameraModuleConfig>
<CameraId>2</CameraId>
<SensorName>sp2509</SensorName>
<ChromatixName>sp2509_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>FRONT</Position>
<MountAngle>270</MountAngle>
<CSIInfo>
<CSIDCore>1</CSIDCore>
<LaneMask>0x3</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
<FocalLength>2.93</FocalLength>
<FNumber>2.8</FNumber>
<TotalFocusDistance>1.2</TotalFocusDistance>
<HorizontalViewAngle>54.8</HorizontalViewAngle>
<VerticalViewAngle>42.5</VerticalViewAngle>
<MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>
</CameraModuleConfig>
<CameraModuleConfig>
<CameraId>0</CameraId>
<SensorName>s5k4h8</SensorName>
<ChromatixName>s5k4h8_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>BACK</Position>
<MountAngle>90</MountAngle>
<CSIInfo>
<CSIDCore>1</CSIDCore>
<LaneMask>0x7</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
<FocalLength>2.94</FocalLength>
<FNumber>2.4</FNumber>
<TotalFocusDistance>1.5</TotalFocusDistance>
<HorizontalViewAngle>63.2</HorizontalViewAngle>
<VerticalViewAngle>49.7</VerticalViewAngle>
<MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>
</CameraModuleConfig>
<CameraModuleConfig>
<CameraId>0</CameraId>
<SensorName>ov8856</SensorName>
<ChromatixName>ov8856_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>BACK</Position>
<MountAngle>90</MountAngle>
<CSIInfo>
<CSIDCore>0</CSIDCore>
<LaneMask>0x7</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
<FocalLength>2.54</FocalLength>
<FNumber>2.4</FNumber>
<TotalFocusDistance>1.2</TotalFocusDistance>
<HorizontalViewAngle>68.0</HorizontalViewAngle>
<VerticalViewAngle>51.0</VerticalViewAngle>
<MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>
</CameraModuleConfig>
<CameraModuleConfig>
<CameraId>2</CameraId>
<SensorName>sp5506</SensorName>
<ChromatixName>sp5506_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>FRONT</Position>
<MountAngle>270</MountAngle>
<CSIInfo>
<CSIDCore>1</CSIDCore>
<LaneMask>0x7</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
<FocalLength>3.16</FocalLength>
<FNumber>2.2</FNumber>
<TotalFocusDistance>1.97</TotalFocusDistance>
<HorizontalViewAngle>62.7</HorizontalViewAngle>
<VerticalViewAngle>49.0</VerticalViewAngle>
<MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>
</CameraModuleConfig>
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\ Android.mk中添加:
include $(CLEAR_VARS)
LOCAL_MODULE:= s5k4h8_chromatix.xml
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := s5k4h8_chromatix.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/camera
LOCAL_MODULE_OWNER := qti
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE:= ov8856_chromatix.xml
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := ov8856_chromatix.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/camera
LOCAL_MODULE_OWNER := qti
include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE:= sp2509_chromatix.xml
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := sp2509_chromatix.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/camera
LOCAL_MODULE_OWNER := qti
include $(BUILD_PREBUILT)
在目录vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs中添加文件:
ov8856_chromatix.xml
s5k4h8_chromatix.xml
sp2509_chromatix.xml
2 源代码解释
2.1 内核驱动程序
2.1.1 GPIO 配置
客户可以根据目标板配置传感器特有的 GPIO。有关各个属性的解释,可参考以下目录下的文档:
kernel\msm-3.18\Documentation\devicetree\bindings\media\video基于正在使用的软件,可使用其中一个方法配置 GPIO。
使用 pinctrl
对于使用 pinctrl 框架的芯片组可使用 .dtsi 中的 pinctrl 节点条目配置 GPIO
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_default
&cam_sensor_rear_default>;
pinctrl-1 = <&cam_sensor_mclk0_sleep
&cam_sensor_rear_sleep>;
…
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk2_default
&cam_sensor_front1_default>;
pinctrl-1 = <&cam_sensor_mclk2_sleep
&cam_sensor_front1_sleep>;
使用 GPIO 控制
gpios = <&tlmm 26 0>,
<&tlmm 36 0>,
<&tlmm 35 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0",
"CAM_STANDBY0";
…
gpios = <&tlmm 28 0>,
<&tlmm 40 0>,
<&tlmm 39 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK2",
"CAM_RESET2",
"CAM_STANDBY2";
对于具有 CCI 硬件模块的芯片组,存在专用于数据和时钟的 GPIO。由于这些 GPIO 专用
于 CCI 主器件,因此当 CCI 用于摄像头 I2C 时,客户必须使用这些设置。例如,以下pinctrl 或基于 GPIO 控制的示例显示 GPIO 管脚 29 和管脚 30 专用于 CCI。
CCI 拥有两个独立主器件(0 和 1 可用)。在多数用例中,使用一个 CCI 主器件便已足
够。不过,有时可使用两个 CCI 主器件。例如,在前置和后置摄像头恰好拥有同一个 I2
从器件地址时,将每个摄像头连接至不同的 CCI 主器件(使用与 CCI 主器件相连的独立
GPIO 物理管脚实现)可解决 I2C 从器件地址冲突问题。
qcom,cci-master = <0>;
qcom,cci-master = <0>;
2.1.2 时钟相关设置
对于 .dts 文件中的每个传感器节点,客户可以如下配置时钟源:
clocks = <&clock_gcc clk_mclk0_clk_src>,
<&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";
qcom,clock-rates = <24000000 0>;
…
clocks = <&clock_gcc clk_mclk2_clk_src>,
<&clock_gcc clk_gcc_camss_mclk2_clk>;
clock-names = "cam_src_clk", "cam_clk";
qcom,clock-rates = <24000000 0>;
这两个属性中的排列顺序很重要。clock-name 属性的第 n 个值对应于 clocks 属性的第 n 个条目。因此在上面的 DT 片段中,cam_src_clk 对应 clk_mclk0_clk_src,cam_clk 对应
clk_gcc_camss_mclk0_clk,并依此类推。
以上设置在时钟框架中解析,客户无需修改设置。
2. 1.3 电源句柄
PMIC 情形
cam_vdig-supply = <&pm8937_l23>;
cam_vana-supply = <&pm8937_l17>;
cam_vio-supply = <&pm8937_l6>;
cam_vaf-supply = <&pm8937_l17>;
…
cam_vdig-supply = <&pm8937_l23>;
cam_vana-supply = <&pm8937_l22>;
cam_vio-supply = <&pm8937_l6>;
GPIO 情形
gpios = <&tlmm 26 0>,
<&tlmm 36 0>,
<&tlmm 35 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0",
"CAM_STANDBY0";
…
gpios = <&tlmm 28 0>,
<&tlmm 40 0>,
<&tlmm 39 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK2",
"CAM_RESET2",
"CAM_STANDBY2";
CAM_VANA – 电源电压(模拟)
CAM_VDIG – 电源电压(数字)
CAM_VAF – 电源电压(致动器电压)
CAM_VIO – 输入/输出电压(数字)
2.1.4 I2C 从器件配置
在 .dtsi 文件中:
qcom,camera@40 {
cell-index = <0>;
compatible = "qcom,camera";
reg = <0x0>;
…
qcom,camera@2 {
cell-index = <2>;
compatible = "qcom,camera";
reg = <0x01>;
这是一个 8 位地址,其中 7 个 MSB 为 I2C 从器件地址,1 个 LSB 是写标记 0。
2.2 用户空间驱动程序
本节介绍创建用户空间驱动程序的必要信息
2.2.1 传感器初始化参数
传感器初始化参数包括支持的模式 (2D/3D) 以及设备中摄像头的安装位置(前/后)和安装
角度。如果将安装角度指定为 360 度,则驱动程序将获取在内核 dtsi 中指定的安装角度。 vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\msm8937_camera.xml中
<CameraModuleConfig>
<CameraId>2</CameraId>
<SensorName>sp2509</SensorName>
<ChromatixName>sp2509_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>FRONT</Position>
<MountAngle>270</MountAngle>
…
</CameraModuleConfig>
2.2.2 传感器输出参数
传感器输出参数包括输出格式,用于指定是 Bayer 还是 YUV 传感器。连接模式指定传感器和接收器之间的接口(MIPI 或并联)。输出大小在 raw_output 中指定
.sensor_output =
{
.output_format = SENSOR_BAYER,
.connection_mode = SENSOR_MIPI_CSI,
.raw_output = SENSOR_10_BIT_DIRECT,
.filter_arrangement = SENSOR_GRBG,
},
2.2.3 从器件配置
.sensor_slave_info =
{
.sensor_name = SENSOR_MODEL,
.slave_addr = 0x5a,
.i2c_freq_mode = SENSOR_I2C_MODE_FAST,
.addr_type = CAMERA_I2C_WORD_ADDR,
.sensor_id_info =
{
.sensor_id_reg_addr = 0x0000,
.sensor_id = 0x4088,
},
.power_setting_array =
{
.power_setting_a =
{
…
.size = 8,
.power_down_setting_a =
{
…
.size_down = 6,
},
},
这是一个 8 位地址,其中 7 个 MSB 为 I2C 从器件地址,1 个 LSB 是写标记 0。
2.2.3.1传感器芯片 id
必须从数据表中找到传感器型号 ID/芯片 ID 寄存器,然后写入 sensor_id_info 中。
.sensor_id_info =
{
.sensor_id_reg_addr = 0x0000,
.sensor_id = 0x4088,
},
2.2.3.2上电/掉电时序
传感器上电/掉电时序以数组格式添加在每个用户空间传感器驱动程序的
msm_sensor_power_setting 结构中。
.power_setting_array =
{
上电和掉电时序都可添加在 msm_sensor_power_setting_array 结构中。如果
.power_setting_a =/power_down_setting_a 数组成员没有添加,掉电时序会使用上电时序的反时序
.power_setting_array =
{
.power_setting_a =
{
…
},
.size = 8,
.power_down_setting_a =
{
…
},
.size_down = 6,
},
该 power_setting 将指向包含用于配置每个传感器的 GPIO/CLK/VREG 信息的数组
在内核的 kernel/msm-3.18/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c的函数 msm_camera_power_up() 中使用该结构来配置传感器的上电时序。
参见 kernel\msm-3.18\include\uapi\media\msm_cam_sensor.h 中的枚举类型。
根据客户硬件设计,电源可来自 .dtsi 文件中配置的 PMIC 或 GPIO。
2.2.4 尺寸表
使用 sensor_lib_out_info_t 结构添加尺寸表
.out_info_array =
{
.out_info =
{
/* Res 0 */
{
…
},
/* Res 1 */
{
…
},
/* Res 2 */
{
…
},
/* Res 3 */
{
…
},
/* Res 4 */
{
…
},
},
.size = 5,
},
x_output – 有效宽度
y_output – 有效高度
line_length_pclk – 包含消隐的宽度
frame_length_lines – 包含消隐的高度
vt_pixel_clk(视频计时时钟值) – 虚拟时钟值用于计算快门时间,并且 AEC 使用该值纠
正带状干扰
vt_pixel_clk = line_length_pclk * frame_length_lines * frame rate
op_pixel_clk – 表示要设置 VFE 时钟,需要通过 MIPI 通道从摄像头获取的数据量
op_pixel_clk = (传感器总数据传输速率)/每个像素的位数
例如,如果 MIPI DDR 时钟值(MIPI 摄像头传感器时钟通道的速度)为 300 MHz,且
传感器在 4 个通道上传输数据,每个通道的数据传输速率为 600 MHz。从而,总的数
据传输速率为 2400 MHz。对于每像素 10 位的 Bayer 数据,这相当于 op_pixel_clk 值
为 2400/10 = 240 MHz。这些值必须按照传感器技术规范赋值。
这些值可基于为摄像头传感器配置的寄存器设置进行计算。
2.2.5 Chromatix 参数
每种分辨率下为 Chromatix 参数更新适当的头文件。在 vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs
s5k4h8_chromatix.xml中文件生成。
效果文件路径:
endor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\chromatix\0309
2.2.6 传感器寄存器地址
必须根据传感器数据表正确赋值曝光和输出尺寸的寄存器地址字段。
2.2.6.1曝光寄存器地址
在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
.exp_gain_info =
{
.coarse_int_time_addr = 0x0202,
.global_gain_addr = 0x0204,
.vert_offset = s5k4h8_MAX_INTEGRATION_MARGIN,
},
vert_offset – 曝光行数上限,曝光行数任何情况下都应小于 frame_length_lines 减去
vert_offset。
2.2.6.2输出寄存器地址
.output_reg_addr =
{
.x_output = 0x034C,
.y_output = 0x034E,
.line_length_pclk = 0x0342,
.frame_length_lines = 0x0340,
},
2.2.7MIPI 接收器配置
感器使用 MIPI CSI2 协议传输成像数据。QTI 接收器通过 MIPI CSI PHY 和 CSID 接收
这些数据。
2.2.7.1CSI-PHY 配置
该结构显示 CSI 通道参数。在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs
msm8937_camera.xml中
<CSIInfo>
<CSIDCore>1</CSIDCore>
<LaneMask>0x3</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
.csi_params =
{
.lane_cnt = 2,
.settle_cnt = 0x12,
.is_csi_3phase = 0,
},
csi_lane_assign – 有时客户硬件的管脚映射设计可能不同于 MSM™ 芯片组摄像头数据
通道的参考管脚映射,例如传感器数据通道 0 可能连接到 MSM 数据通道 4。可配置
csi_lane_assign 参数配置来处理这类情况。该参数是一个 16 位值,每个位域的含义显示
如下:
csi_lane_mask – 这个 8 位字段用于指示有效和要启用的 MIPI 通道。
在组合 PHY 上连接单个摄像头时,该值代表的含义如下:
例如,值 0x1F 表示摄像头有 4 个有效数据通道和一个时钟通道。
若是连接两个摄像头 (Cam0:2 通道摄像头连接至通道 2:0;Cam1:1 通道摄像头连
接到通道 4:3),则该值代表的含义如下:
csi_if – 未使用
csid_core – 传感器所用 CSID 硬件的索引;若同时使用两个传感器,则该设置不能使用
同一个值。
csi_phy_sel – 传感器所用 CSI-PHY 核心的索引,对于每个传感器都应不同,除非外部
MIPI 桥将两个传感器连接到 MSM 的同一个 PHY 接口。该值应基于客户的硬件原理
图进行配置。
lane_cnt – 传感器在指定工作模式下输出数据所用数据通道的数量;根据传感器的最大
数据通道能力(在数据表中提供)和驱动程序中配置的传感器寄存器设置来确定
该值。
combo_mode – 值 0 表示有一个摄像头连接至指定的 PHY 接口。值 1 表示有两个摄像
头共享该 PHY 接口,在这种情况下:
• 第一个摄像头 – 该摄像头连接至 PHY 通道 2:0。时钟通道连接至 PHY 通道 1。数
据通道(最多 2 个)可连接至 PHY 通道 0 或通道 2
• 第二个摄像头 – 该摄像头连接至 PHY 通道 4:3。时钟通道连接至 PHY 通道 3。数
据通道可连接至 PHY 通道 4。
settle_cnt(即稳定计数)– 必须根据传感器输出特性配置该值,以确保传感器的 PHY
发送器与 MSM 的 PHY 接收器无障碍同步。
2.2.7.2 VFE 时钟频率计算
摄像头传感器时钟通道(即 MIPI DDR 时钟)的工作频率与激活的数据通道数决定摄像头传感器在指定操作模式下的总数据传输速率(吞吐量)。每个通道的数据传输速率是MIPI DDR 时钟速度的两倍。例如,工作在 200 MHz MIPI DDR 时钟频率和 4 个激活通道下的摄像头传感器的总数据传输速率为 1600 Mbps(每个通道的数据传输速率为 200 * 2 =400 Mbps)。
每个帧的分辨率、额外/虚拟像素/线数、水平消隐、垂直消隐、MIPI 包开销、每像素位数、数据格式、内部是否存在多个交错数据流以及每个流的数据传输速率/开销等,都会影响数据传输速率。指定工作模式下初步摄像头调通,计算:
X = 帧宽 * (帧高 * 垂直消隐) * 每像素位数 * 每秒帧数 * (MIPI 协议和其他数据流的开销) 在 VFE 时钟优化中为给定的 MSM 找到大于 X 的最接近的值作为 VFE 时钟的初始值。
2.2.7.3CSI-D 配置
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
.csid_lut_params_array =
{
.lut_params =
{
/* Res 0 */
{
.num_cid = 1,
.vc_cfg_a =
{
{
.cid = 0,
.dt = CSI_RAW10,
.decode_format = CSI_DECODE_10BIT
},
},
},
/* Res 1 */
…
.size = 5,
},
2.2.8 寄存器设置
可配置摄像头传感器寄存器以通过 I2C 传输数据流。也可以按照本节所述为执行特定操作
配置传感器。
2.2.8.1初始化设置
在摄像头启动时执行一次性寄存器配置。
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define INIT0_REG_ARRAY \
{ \
{0x6028, 0x4000, 0x00}, \
…
{0x6F12, 0x0140, 0x00}, \
}
2.2.8.2 Grouphold 开启设置
将曝光设置的运行时更新分配给许多寄存器(粗略的曝光时间、每帧行数和增益),更
新必须在一个图像换帧周期完成。这些寄存器都是双重缓存类型,并具有可一次更新完
成的“分组保存参数”功能。若“分组保存参数”寄存器置 1,则转换数据保存在缓冲寄
存器中。
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define GROUPON_REG_ARRAY \
{ \
{0x0104, 0x01, 0x00}, \
}
2.2.8.3 Grouphold 关闭设置
若“分组保存参数”寄存器设置为 0,曝光寄存器的值就象同时在传输那样被更新,从而
实现帧边界处的参数更改能够平稳更新。
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define GROUPOFF_REG_ARRAY \
{ \
{0x0104, 0x00, 0x00}, \
}
2.2.8.4分辨率设置
传感器可以有多种工作模式,例如以四分之一分辨率预览和以全分辨率拍照。不同的分辨
率可按如下方式配置。
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define RES0_REG_ARRAY \
{ \
{0x6028, 0x4000, 0x00}, \
…
{0x3008, 0x0000, 0x00}, \
}
…
#define RES4_REG_ARRAY \
{ \
{0x6028, 0x4000, 0x00}, \
{0x3008, 0x0000, 0x00}, \
}
2.2.8.5曝光设置
AEC 算法使用实际增益。由于必须将传感器硬件的实际增益转换为寄存器增益才能配置传
感器,因此,客户必须基于传感器数据表实现以下函数。参考传感器数据表中的模拟和数
字增益设置部分。在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
下列函数用于计算下一次曝光配置的曝光时间和增益。
xxxx_calculate_exposure()
以下函数用于准备下一次曝光配置的数组。
xxxx_fill_exposure_array()
2.2.8.6启动数据流设置
MIPI 数据包通过传输开始 (SoT) 和传输结束 (EoT) 来定界。
SoT – LP11→LP01→LP00
EoT – LP00→LP11
在传感器驱动程序中,为满足该准则,应配置以下设置。
找出从 LP11 到 HS Tx 状态的时钟和数据通道:在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define START_REG_ARRAY \
{ \
{0x0100, 0x0100, 0x00}, \
}
2.2.8.7停止数据流设置
应通过停止数据流设置将传感器的时钟和数据通道置于 LP11 状态。设置错误可导致 MIPI
摄像头与 MSM 的同步不一致。在vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
#define STOP_REG_ARRAY \
{ \
{0x0100, 0x0000, 0x00}, \
}
2.2.9更新 CCI 运行速度
根据 I2C 技术规范,CCI(适用于配有 CCI 的芯片组)可工作在 100 和 400 kHz 之间的频
率下,并且由结构 msm_camera_sensor_slave_info 中名为 i2c_freq_mode 的参数进行控制. 相关示例可参见
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\s5k4h8_lib.h中
.sensor_slave_info =
{
…
.i2c_freq_mode = SENSOR_I2C_MODE_FAST,
…
};
可用的 I2C 频率模式在vendor\qcom\proprietary\mm-camerasdk\sensor\includes\sensor_sdk_common.h 中定义,它们分别是标准 (100 kHz)、高速 (400 kHz) 和定制模式。
enum camera_i2c_freq_mode {
SENSOR_I2C_MODE_STANDARD,
SENSOR_I2C_MODE_FAST,
SENSOR_I2C_MODE_CUSTOM,
SENSOR_I2C_MODE_FAST_PLUS,
SENSOR_I2C_MODE_MAX,
};
MSM8937 的 CCI 调试参数设置信息位于
kernel\msm-3.18\arch\arm\boot\dts\qcom\msm8937-camera.dtsi 中
&i2c_freq_custom {
qcom,hw-thigh = <15>;
qcom,hw-tlow = <28>;
qcom,hw-tsu-sto = <21>;
qcom,hw-tsu-sta = <21>;
qcom,hw-thd-dat = <13>;
qcom,hw-thd-sta = <18>;
qcom,hw-tbuf = <25>;
qcom,hw-scl-stretch-en = <1>;
qcom,hw-trdhld = <6>;
qcom,hw-tsp = <3>;
status = "ok";
};
3 故障排除
Camera sensor读出ID不能预览,错误信息为:
SOF Freeze! Sending error message和MCT_BUS_MSG_SEND_HW_ERRO见如下log:
01-01 00:58:02.736 764 3148 E mm-camera: <MCT ><ERROR> 98: mct_bus_sof_thread_run: FATAL Session 1: SOF Freeze! Sending error message
01-01 00:58:02.737 764 3089 E mm-camera: <MCT ><ERROR> 789: mct_controller_proc_bus_msg_internal: MCT_BUS_MSG_SEND_HW_ERROR
01-01 00:58:02.738 764 764 E mm-camera: <MCT ><ERROR> 645: main: main: camera daemon notify error
01-01 00:58:02.738 708 3091 E QCamera : <MCI><ERROR> mm_camera_event_notify: 189: Camera Event DAEMON DIED received
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs
msm8937_camera.xml中
<CameraModuleConfig>
<CameraId>0</CameraId>
<SensorName>s5k4h8</SensorName>
<ChromatixName>s5k4h8_chromatix</ChromatixName>
<ModesSupported>1</ModesSupported>
<Position>BACK</Position>
<MountAngle>90</MountAngle>
<CSIInfo>
<CSIDCore>0</CSIDCore>
<LaneMask>0x7</LaneMask>
<LaneAssign>0x4320</LaneAssign>
<ComboMode>0</ComboMode>
</CSIInfo>
<LensInfo>
<FocalLength>2.94</FocalLength>
<FNumber>2.4</FNumber>
<TotalFocusDistance>1.5</TotalFocusDistance>
<HorizontalViewAngle>63.2</HorizontalViewAngle>
<VerticalViewAngle>49.7</VerticalViewAngle>
<MinFocusDistance>0.1</MinFocusDistance>
</LensInfo>
</CameraModuleConfig>
与
qcom,camera@0 {
cell-index = <0>;
…
qcom,csiphy-sd-index = <0>;
qcom,csid-sd-index = <0>;
…
不一致导致