高通平台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>;

不一致導致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM