【高通SDM660平臺 Android 10.0】Camera Sensor lib 與 Kernel Camera Probe 代碼分析
- 一、libmmcamera_imx258.so 代碼分析
- 1.1 struct sensor_lib_t 結構體
- 1.2 imx258_lib.h 頭文件分析
- 二、 Kernel Camera Probe 代碼分析
- 2.1 msm_sensor_driver_probe() 代碼分析
- 2.1.1 創(chuàng)建 /dev/videoX、 /dev/v4l-subdevX 節(jié)點
《【高通SDM660平臺】(1) — Camera 驅動 Bringup Guide》
《【高通SDM660平臺】(2) — Camera Kernel 驅動層代碼邏輯分析》
《【高通SDM660平臺】(3) — Camera V4L2 驅動層分析 》
《【高通SDM660平臺】(4) — Camera Init 初始化流程 》
《【高通SDM660平臺】(5) — Camera Open 流程》
《【高通SDM660平臺】(6) — Camera getParameters 及 setParameters 流程》
《【高通SDM660平臺】(7) — Camera onPreview 代碼流程》
《【高通SDM660平臺】(8) — Camera MetaData介紹》
《【高通SDM660平臺 Android 10.0】(9) — Qcom Camera Daemon 代碼分析》
《【高通SDM660平臺 Android 10.0】(10) — Camera Sensor lib 與 Kernel Camera Probe 代碼分析》
《【高通SDM660平臺】Camera Capture 流程》
《【高通SDM660平臺】Camera mm-qcamera-app 代碼分析》
在前面《【高通SDM660平臺 Android 10.0】Qcom Camera Daemon 代碼分析》 中,
我們分析了 Camera module_sensor_init() 的整個過程,考慮到篇幅的問題,本文是接module_sensor_init() 繼續(xù)分析的。
主題如下:
分析 Camera lib 庫的代碼vendor 下發(fā) CFG_SINIT_PROBE 后,Kernel 中 Camera Probe的流程 好, 開始吧!
一、libmmcamera_imx258.so 代碼分析
Sensor LIB 庫代碼位于 /vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor/libs
本文以 imx258 為例。
先來看下imx258_lib.c,其最核心的函數就是 sensor_open_lib,
返回 sensor_lib_ptr 結構體,所有的 Camera 信息,都保存在該結構體中。
@
/vendor
/qcom
/proprietary
/mm
-camera
/mm
-camera2
/media
-controller
/modules
/sensors
/sensor
/libs
/imx258
/imx258_lib
.c
- FUNCTION: sensor_open_lib
- DESCRIPTION: Open sensor library and returns data pointer
**/
void *sensor_open_lib(void)
{
return &sensor_lib_ptr;
}
我們來看下 sensor_lib_ptr 結構體的定義
1.1 struct sensor_lib_t 結構體
@
/vendor
/qcom
/proprietary
/mm
-camerasdk
/sensor
/includes
/sensor_lib
.h
typedef struct { struct camera_sensor_slave_info sensor_slave_info
;
sensor_output_t sensor_output;
struct sensor_output_reg_addr_t output_reg_addr;
struct sensor_exp_gain_info_t exp_gain_info;
sensor_aec_data_t aec_info;
unsigned short sensor_num_frame_skip;
unsigned short sensor_num_HDR_frame_skip;
unsigned int sensor_max_pipeline_frame_delay;
sensor_property_t sensor_property;
sensor_imaging_pixel_array_size pixel_array_size_info;
sensor_color_level_info color_level_info;
sensor_stream_info_array_t sensor_stream_info_array;
struct camera_i2c_reg_setting_array start_settings;
struct camera_i2c_reg_setting_array stop_settings;
struct camera_i2c_reg_setting_array groupon_settings;
struct camera_i2c_reg_setting_array groupoff_settings;
struct camera_i2c_reg_setting_array embedded_data_enable_settings;
struct camera_i2c_reg_setting_array embedded_data_disable_settings;
struct camera_i2c_reg_setting_array aec_enable_settings;
struct camera_i2c_reg_setting_array aec_disable_settings;
struct camera_i2c_reg_setting_array dualcam_master_settings;
struct camera_i2c_reg_setting_array dualcam_slave_settings;
sensor_test_info test_pattern_info;
struct sensor_effect_info effect_info;
struct sensor_lib_reg_settings_array init_settings_array;
struct sensor_lib_reg_settings_array res_settings_array;
struct sensor_lib_out_info_array out_info_array;
struct sensor_csi_params csi_params;
struct sensor_csid_lut_params_array csid_lut_params_array;
struct sensor_lib_crop_params_array crop_params_array;
sensor_exposure_table_t exposure_func_table;
struct sensor_lib_meta_data_info_array meta_data_out_info_array;
sensor_optical_black_region_t optical_black_region_info;
sensor_capability_t sensor_capability;
sensor_awb_table_t awb_func_table;
<span class="token comment">/* sensor_awb_table_t */</span>
sensor_fps_table_t fps_func_table;
sensor_RDI_parser_stats_t parse_RDI_stats;
sensor_rolloff_config rolloff_config;
long long adc_readout_time;
unsigned short sensor_num_fast_aec_frame_skip;
unsigned char app_delay[SENSOR_DELAY_MAX];
struct sensor_noise_coefficient_t noise_coeff;
unsigned char external_library;
sensorlib_pdaf_apis_t sensorlib_pdaf_api;
pdaf_lib_t pdaf_config;
sensor_orientation_type_t sensor_orientation;
} sensor_lib_t;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
1.2 imx258_lib.h 頭文件分析
@
/vendor
/qcom
/proprietary
/mm
-camera
/mm
-camera2
/media
-controller
/modules
/sensors
/sensor
/libs
/imx258
/imx258_lib
.h
- Copyright ? 2015-2018 Qualcomm Technologies, Inc.
- All Rights Reserved.
- Confidential and Proprietary - Qualcomm Technologies, Inc.
*/
#ifndef IMX258_LIB_H
#define IMX258_LIB_H
#include “sensor_lib.h”
#include “eeprom_lib.h”
#include “pdaf_api.h”
#include “pdaf_camif_api.h”
#define SENSOR_MODEL “imx258”
#define IMX258_DIG_GAIN_GR_ADDR 0x020E
#define IMX258_DIG_GAIN_R_ADDR 0x0210
#define IMX258_DIG_GAIN_B_ADDR 0x0212
#define IMX258_DIG_GAIN_GB_ADDR 0x0214
#define IMX258_EXP_RATIO_ADDR 0x0222
#define IMX258_ABS_GAIN_R_WORD_ADDR 0x0B90
#define IMX258_ABS_GAIN_B_WORD_ADDR 0x0B92
#define IMX258_MAX_INTEGRATION_MARGIN 20
#define IMX258_CSI_PD_ISTATS 0x2F
#define IMX258_DATA_PEDESTAL 0x40
#define IMX258_MIN_AGAIN_REG_VAL 0
#define IMX258_MAX_AGAIN_REG_VAL 480
#define IMX258_MIN_DGAIN_REG_VAL 256
#define IMX258_MAX_DGAIN_REG_VAL 256
#define IMX258_MAX_DGAIN_DECIMATOR 256
#define IMX258_MIN_AGAIN (512 / (512 - IMX258_MIN_AGAIN_REG_VAL))
#define IMX258_MAX_AGAIN (512 / (512 - IMX258_MAX_AGAIN_REG_VAL))
#define IMX258_MIN_DGAIN (IMX258_MIN_DGAIN_REG_VAL / 256)
#define IMX258_MAX_DGAIN (IMX258_MAX_DGAIN_REG_VAL / 256)
#define IMX258_MIN_GAIN IMX258_MIN_AGAIN * IMX258_MIN_DGAIN
#define IMX258_MAX_GAIN IMX258_MAX_AGAIN * IMX258_MAX_DGAIN
#define START_REG_ARRAY
{
{0x0100, 0x01, 0x00},
}
#define STOP_REG_ARRAY
{
{0x0100, 0x00, 0x00},
}
#define GROUPON_REG_ARRAY
{
{0x0104, 0x01, 0x00},
}
#define GROUPOFF_REG_ARRAY
{
{0x0104, 0x00, 0x00},
}
#define INIT0_REG_ARRAY
{
{0x0136, 0x18, 0x00},
{0x0137, 0x00, 0x00},
{0x3051, 0x00, 0x00},
......
{0x3006, 0x00, 0x00},
{0x3007, 0x00, 0x00},
}
#ifndef FLIP_MIRROR
#define FLIP_MIRROR_SETTING {{0x0101, 0x00, 0x00}}
#else
#define FLIP_MIRROR_SETTING {{0x0101, 0x03, 0x00}}
#endif
#define RES0_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
......
{0x0818, 0x00, 0x00},
{0x0819, 0x47, 0x00},
}
#define RES1_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
{0x0301, 0x05, 0x00},
{0x0303, 0x02, 0x00},
......
{0x0818, 0x00, 0x00},
{0x0819, 0x47, 0x00},
}
#define RES2_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
......
{0x0819, 0x47, 0x00},
{0x3031, 0x00, 0x00},
}
#define RES3_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
......
{0x0819, 0x47, 0x00},
{0x3031, 0x00, 0x00},
}
#define RES4_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
......
{0x0819, 0x47, 0x00},
{0x3031, 0x00, 0x00},
}
#define RES5_REG_ARRAY
{
{0x0112, 0x0A, 0x00},
{0x0113, 0x0A, 0x00},
......
{0x0819, 0x47, 0x00},
{0x3031, 0x00, 0x00},
}
static sensor_lib_t sensor_lib_ptr =
{
.sensor_slave_info =
{
.sensor_name = SENSOR_MODEL,
.slave_addr = 0x20,
.i2c_freq_mode = SENSOR_I2C_MODE_FAST,
.addr_type = CAMERA_I2C_WORD_ADDR,
.sensor_id_info =
{
.sensor_id_reg_addr = 0x0016,
.sensor_id = 0x0258,
},
.power_setting_array =
{
.power_setting_a =
{
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_RESET,
.config_val = GPIO_OUT_LOW,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VANA,
.config_val = GPIO_OUT_HIGH,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VANA,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VDIG,
.config_val = GPIO_OUT_HIGH,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VDIG,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VIO,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VAF,
.config_val = GPIO_OUT_HIGH,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_CLK,
.seq_val = CAMERA_MCLK,
.config_val = 24000000,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_RESET,
.config_val = GPIO_OUT_HIGH,
.delay = 12,
},
},
.size = 9,
.power_down_setting_a =
{
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_RESET,
.config_val = GPIO_OUT_LOW,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_CLK,
.seq_val = CAMERA_MCLK,
.config_val = 0,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VIO,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VDIG,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VDIG,
.config_val = GPIO_OUT_LOW,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_VREG,
.seq_val = CAMERA_VANA,
.config_val = 0,
.delay = 0,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VANA,
.config_val = GPIO_OUT_LOW,
.delay = 1,
},
{
.seq_type = CAMERA_POW_SEQ_GPIO,
.seq_val = CAMERA_GPIO_VAF,
.config_val = GPIO_OUT_LOW,
.delay = 1,
},
},
.size_down = 8,
},
},
.sensor_output =
{
.output_format = SENSOR_BAYER,
.connection_mode = SENSOR_MIPI_CSI,
.raw_output = SENSOR_10_BIT_DIRECT,
#ifndef FLIP_MIRROR
.filter_arrangement = SENSOR_RGGB,
#else
.filter_arrangement = SENSOR_BGGR,
#endif
},
.output_reg_addr =
{
.x_output = 0x034C,
.y_output = 0x034E,
.line_length_pclk = 0x0342,
.frame_length_lines = 0x0340,
},
.exp_gain_info =
{
.coarse_int_time_addr = 0x0202,
.global_gain_addr = 0x0204,
.vert_offset = IMX258_MAX_INTEGRATION_MARGIN,
},
.aec_info =
{
.min_gain = IMX258_MIN_GAIN,
.max_gain = IMX258_MAX_GAIN,
.max_analog_gain = IMX258_MAX_AGAIN,
.max_linecount = 65525 - IMX258_MAX_INTEGRATION_MARGIN,
},
.sensor_num_frame_skip = 2,
.sensor_num_HDR_frame_skip = 2,
.sensor_max_pipeline_frame_delay = 2,
.sensor_property =
{
.pix_size = 1.12,
.sensing_method = SENSOR_SMETHOD_ONE_CHIP_COLOR_AREA_SENSOR,
.crop_factor = 5.78,
},
.pixel_array_size_info =
{
.active_array_size =
{
.width = 4208,
.height = 3120,
},
.left_dummy = 8,
.right_dummy = 8,
.top_dummy = 8,
.bottom_dummy = 8,
},
.color_level_info =
{
.white_level = 1023,
.r_pedestal = IMX258_DATA_PEDESTAL,
.gr_pedestal = IMX258_DATA_PEDESTAL,
.gb_pedestal = IMX258_DATA_PEDESTAL,
.b_pedestal = IMX258_DATA_PEDESTAL,
},
.start_settings =
{
.reg_setting_a = START_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
.stop_settings =
{
.reg_setting_a = STOP_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
.groupon_settings =
{
.reg_setting_a = GROUPON_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
.groupoff_settings =
{
.reg_setting_a = GROUPOFF_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
.dualcam_master_settings =
{
.reg_setting_a = DUALCAM_MASTER_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
.size = 8,
},
.embedded_data_enable_settings =
{
.reg_setting_a = {},
.addr_type = 0,
.data_type = 0,
.delay = 0,
},
.embedded_data_disable_settings =
{
.reg_setting_a = {},
.addr_type = 0,
.data_type = 0,
.delay = 0,
},
.test_pattern_info =
{
.test_pattern_settings =
{
{
.mode = SENSOR_TEST_PATTERN_OFF,
.settings =
{
.reg_setting_a =
{
{0x0600, 0x0000, 0x00},
},
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_WORD_DATA,
.delay = 0,
}
},
{
.mode = SENSOR_TEST_PATTERN_SOLID_COLOR,
.settings =
{
.reg_setting_a =
{
{0x0600, 0x0001, 0x00},
},
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_WORD_DATA,
.delay = 0,
},
},
{
.mode = SENSOR_TEST_PATTERN_COLOR_BARS,
.settings =
{
.reg_setting_a =
{
{0x0600, 0x0002, 0x00},
},
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_WORD_DATA,
.delay = 0,
},
},
{
.mode = SENSOR_TEST_PATTERN_COLOR_BARS_FADE_TO_GRAY,
.settings =
{
.reg_setting_a =
{
{0x0600, 0x0003, 0x00},
},
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_WORD_DATA,
.delay = 0,
},
},
{
.mode = SENSOR_TEST_PATTERN_PN9,
.settings =
{
.reg_setting_a =
{
{0x0600, 0x0004, 0x00},
},
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_WORD_DATA,
.delay = 0,
},
},
},
.size = 5,
.solid_mode_addr =
{
.r_addr = 0x0602,
.gr_addr = 0x0604,
.gb_addr = 0x0608,
.b_addr = 0x0606,
},
},
.init_settings_array =
{
.reg_settings =
{
{
.reg_setting_a = INIT0_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = FLIP_MIRROR_SETTING,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
},
.size = 2,
},
.res_settings_array =
{
.reg_settings =
{
{
.reg_setting_a = RES0_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = RES1_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = RES2_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = RES3_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = RES4_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting_a = RES5_REG_ARRAY,
.addr_type = CAMERA_I2C_WORD_ADDR,
.data_type = CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
},
.size = 6,
},
.out_info_array =
{
.out_info =
{
{
.x_output = 4208,
.y_output = 3120,
.line_length_pclk = 5352,
.frame_length_lines = 3224,
.op_pixel_clk = 480000000,
.binning_factor = 1,
.min_fps = 7.500,
.max_fps = 30.04,
.mode = SENSOR_DEFAULT_MODE,
.offset_x = 0,
.offset_y = 0,
.scale_factor = 1.000,
.is_pdaf_supported = 1,
.data_rate = 1296000000ULL 4
},
{
.x_output = 4208,
.y_output = 2352,
.line_length_pclk = 5352,
.frame_length_lines = 2852,
.op_pixel_clk = 458400000,
.binning_factor = 1,
.min_fps = 7.500,
.max_fps = 30.03,
.mode = SENSOR_DEFAULT_MODE,
.offset_x = 0,
.offset_y = 384,
.scale_factor = 1.000,
.is_pdaf_supported = 1,
.data_rate = 1296000000ULL 4
},
{
.x_output = 2100,
.y_output = 1560,
.line_length_pclk = 5352,
.frame_length_lines = 2851,
.op_pixel_clk = 458400000,
.binning_factor = 2,
.min_fps = 7.500,
.max_fps = 30.04,
.mode = SENSOR_DEFAULT_MODE,
.offset_x = 0,
.offset_y = 0,
.scale_factor = 1.000,
.is_pdaf_supported = 0,
.data_rate = 1296000000ULL 4
},
{
.x_output = 2100,
.y_output = 1176,
.line_length_pclk = 5352,
.frame_length_lines = 1424,
.op_pixel_clk = 458400000,
.binning_factor = 2,
.min_fps = 7.500,
.max_fps = 60.14,
.mode = SENSOR_HFR_MODE | SENSOR_DEFAULT_MODE,
.offset_x = 0,
.offset_y = 384,
.scale_factor = 1.000,
.is_pdaf_supported = 0,
.data_rate = 1296000000ULL 4
},
{
.x_output = 1400,
.y_output = 784,
.line_length_pclk = 5352,
.frame_length_lines = 948,
.op_pixel_clk = 458400000,
.binning_factor = 2,
.min_fps = 7.500,
.max_fps = 90.18,
.mode = SENSOR_HFR_MODE,
.offset_x = 0,
.offset_y = 384,
.scale_factor = 1.000,
.is_pdaf_supported = 0,
.data_rate = 1296000000ULL 4
},
{
.x_output = 1400,
.y_output = 760,
.line_length_pclk = 5352,
.frame_length_lines = 828,
.op_pixel_clk = 480000000,
.binning_factor = 2,
.min_fps = 7.500,
.max_fps = 120.47,
.mode = SENSOR_HFR_MODE,
.offset_x = 0,
.offset_y = 384,
.scale_factor = 1.000,
.is_pdaf_supported = 0,
.data_rate = 1296000000ULL 4
},
},
.size = 6,
},
.csi_params =
{
.lane_cnt = 4,
.settle_cnt = 0xB,
.is_csi_3phase = 0,
},
.exposure_func_table =
{
.sensor_calculate_exposure = sensor_calculate_exposure,
.sensor_fill_exposure_array = sensor_fill_exposure_array,
},
.meta_data_out_info_array =
{
.meta_data_out_info =
{
{
.width = 80,
.height = 1920,
.stats_type = PD_STATS,
.dt = IMX258_CSI_PD_ISTATS,
},
},
.size = 1,
},
.sensor_capability = 0,
.awb_func_table =
{
.sensor_fill_awb_array = 0,
.awb_table_size = 0,
},
.parse_RDI_stats =
{
.parse_VHDR_stats = NULL,
},
.rolloff_config =
{
.enable = FALSE,
.full_size_info =
{
.full_size_width = 0,
.full_size_height = 0,
.full_size_left_crop = 0,
.full_size_top_crop = 0,
},
},
.adc_readout_time = 0,
.sensor_num_fast_aec_frame_skip = 0,
.noise_coeff = {
.gradient_S = 3.738032e-06,
.offset_S = 3.651935e-04,
.gradient_O = 6.396835e-11,
.offset_O = -2.968624e-04,
},
.pdaf_config = {
#ifndef FLIP_MIRROR
#include “imx258_pdaf.h”
#else
#include “imx258_pdaf_flip_mirror.h”
#endif
},
};
#endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 633
- 634
- 635
- 636
- 637
- 638
- 639
- 640
- 641
- 642
- 643
- 644
- 645
- 646
- 647
- 648
- 649
- 650
- 651
- 652
- 653
- 654
- 655
- 656
- 657
- 658
- 659
- 660
- 661
- 662
- 663
- 664
- 665
- 666
- 667
- 668
- 669
- 670
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 678
- 679
- 680
- 681
- 682
- 683
- 684
- 685
- 686
- 687
- 688
- 689
- 690
- 691
- 692
- 693
- 694
- 695
- 696
- 697
- 698
- 699
- 700
- 701
- 702
- 703
- 704
- 705
- 706
- 707
- 708
- 709
- 710
- 711
- 712
- 713
- 714
- 715
- 716
- 717
- 718
- 719
- 720
- 721
- 722
- 723
- 724
- 725
二、 Kernel Camera Probe 代碼分析
前面我們 mm-camera/mm-camera2/media-controller/modules/sensors/module/sensor_init.c 中,會下發(fā) CFG_SINIT_PROBE 給到kernel 中。
memset(&cfg
, 0, sizeof(cfg
));cfg
.cfgtype
= CFG_SINIT_PROBE
;cfg
.cfg
.setting
= slave_info
;ioctl(fd
, VIDIOC_MSM_SENSOR_INIT_CFG
, &cfg
);
Kernel 中處理的地方為:
@
/kernel
/msm
-4.14/drivers
/media
/platform
/msm
/camera_v2
/sensor
/msm_sensor_init
.c
static int32_t msm_sensor_driver_cmd(struct msm_sensor_init_t s_init,void arg)
{
struct sensor_init_cfg_data cfg = (struct sensor_init_cfg_data *)arg;
<span class="token keyword">switch</span> <span class="token punctuation">(</span>cfg<span class="token operator">-></span>cfgtype<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> CFG_SINIT_PROBE<span class="token punctuation">:</span>s_init<span class="token operator">-></span>module_init_status <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>rc <span class="token operator">=</span> <span class="token function">msm_sensor_driver_probe</span><span class="token punctuation">(</span>cfg<span class="token operator">-></span>cfg<span class="token punctuation">.</span>setting<span class="token punctuation">,</span> <span class="token operator">&</span>cfg<span class="token operator">-></span>probed_info<span class="token punctuation">,</span> cfg<span class="token operator">-></span>entity_name<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">break</span><span class="token punctuation">;</span>
}
前面代碼中, cfg.setting 就是 cfg.cfg.setting = slave_info;, 而最終probe 的結果,保存在 cfg->probed_info 中。
2.1 msm_sensor_driver_probe() 代碼分析
獲取上層下發(fā)的slave_info 信息根據camera id 獲取該camera 的控制函數如果已經probe 過了,則更新 probed_info 信息獲取 power 上下電信息保存 Camera_info 結構體,包括 slave_addr,sensor id, setting填充上電信息填充下電信息更新外設設備信息解析eeprom、actuator、flash 等的dts 信息開始上電,上電后會進行check_id 操作,如果 sensor id 匹配成功,則返回成功將sensor 加加載到V4L2 subdev 中,創(chuàng)建 節(jié)點 /dev/videoX下電,保存 sensor_info 信息到 s_strl 中
@
/kernel
/msm
-4.14/drivers
/media
/platform
/msm
/camera_v2
/sensor
/msm_sensor_driver
.c
int32_t
msm_sensor_driver_probe(void *setting
,struct msm_sensor_info_t
*probed_info
, char *entity_name
)
{slave_info
= kzalloc(sizeof(*slave_info
), GFP_KERNEL
);{copy_from_user(slave_info
, (void __user
*)setting
, sizeof(*slave_info
));id_info
= &(slave_info
->sensor_id_info
);reg_setting
= kzalloc(id_info
->setting
.size
* (sizeof(struct msm_camera_i2c_reg_array
)), GFP_KERNEL
);copy_from_user(reg_setting
, (void __user
*) slave_info
->sensor_id_info
.setting
.reg_setting
,slave_info
->sensor_id_info
.setting
.size
* sizeof(struct msm_camera_i2c_reg_array
));slave_info
->sensor_id_info
.setting
.reg_setting
= reg_setting
;}CDBG("camera id %d Slave addr 0x%X addr_type %d\n",slave_info
->camera_id
, slave_info
->slave_addr
,slave_info
->addr_type
);CDBG("sensor_id_reg_addr 0x%X sensor_id 0x%X sensor id mask %d",slave_info
->sensor_id_info
.sensor_id_reg_addr
,slave_info
->sensor_id_info
.sensor_id
,slave_info
->sensor_id_info
.sensor_id_mask
);CDBG("power up size %d power down size %d\n",slave_info
->power_setting_array
.size
,slave_info
->power_setting_array
.size_down
);CDBG("position %d",slave_info
->sensor_init_params
.position
);CDBG("mount %d",slave_info
->sensor_init_params
.sensor_mount_angle
);CDBG("bypass video node creation %d",slave_info
->bypass_video_node_creation
);
<span class="token comment">// 2. 根據camera id 獲取該camera 的控制函數</span>
<span class="token comment">/* Extract s_ctrl from camera id */</span>
s_ctrl <span class="token operator">=</span> g_sctrl<span class="token punctuation">[</span>slave_info<span class="token operator">-></span>camera_id<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token function">CDBG</span><span class="token punctuation">(</span><span class="token string">"s_ctrl[%d] %pK"</span><span class="token punctuation">,</span> slave_info<span class="token operator">-></span>camera_id<span class="token punctuation">,</span> s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 如果已經probe 過了,則更新 probed_info 信息</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>is_probe_succeed <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">/* Different sensor on this camera slot has been connected* and probe already succeeded for that sensor. Ignore this probe */</span><span class="token keyword">if</span> <span class="token punctuation">(</span>slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id <span class="token operator">==</span> s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>cam_slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id <span class="token operator">&&</span> <span class="token operator">!</span><span class="token punctuation">(</span><span class="token function">strcmp</span><span class="token punctuation">(</span>slave_info<span class="token operator">-></span>sensor_name<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>cam_slave_info<span class="token operator">-></span>sensor_name<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">pr_err</span><span class="token punctuation">(</span><span class="token string">"slot%d: sensor name: %s sensor id%d already probed\n"</span><span class="token punctuation">,</span>slave_info<span class="token operator">-></span>camera_id<span class="token punctuation">,</span>slave_info<span class="token operator">-></span>sensor_name<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>cam_slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">msm_sensor_fill_sensor_info</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">,</span> probed_info<span class="token punctuation">,</span> entity_name<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> rc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">goto</span> free_slave_info<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token comment">// 4.獲取 power 上下電信息</span>
rc <span class="token operator">=</span> <span class="token function">msm_sensor_get_power_settings</span><span class="token punctuation">(</span>setting<span class="token punctuation">,</span> slave_info<span class="token punctuation">,</span> <span class="token operator">&</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 5. 保存 Camera_info 結構體,包括 slave_addr,sensor id, setting</span>
camera_info <span class="token operator">=</span> <span class="token function">kzalloc</span><span class="token punctuation">(</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">struct</span> msm_camera_slave_info<span class="token punctuation">)</span><span class="token punctuation">,</span> GFP_KERNEL<span class="token punctuation">)</span><span class="token punctuation">;</span>
s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>slave_info <span class="token operator">=</span> camera_info<span class="token punctuation">;</span><span class="token comment">/* Fill sensor slave info */</span>
camera_info<span class="token operator">-></span>sensor_slave_addr <span class="token operator">=</span> slave_info<span class="token operator">-></span>slave_addr<span class="token punctuation">;</span>
camera_info<span class="token operator">-></span>sensor_id_reg_addr <span class="token operator">=</span> slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id_reg_addr<span class="token punctuation">;</span>
camera_info<span class="token operator">-></span>sensor_id <span class="token operator">=</span> slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id<span class="token punctuation">;</span>
camera_info<span class="token operator">-></span>sensor_id_mask <span class="token operator">=</span> slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>sensor_id_mask<span class="token punctuation">;</span>
camera_info<span class="token operator">-></span>setting <span class="token operator">=</span> <span class="token operator">&</span><span class="token punctuation">(</span>slave_info<span class="token operator">-></span>sensor_id_info<span class="token punctuation">.</span>setting<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">/* Fill sensor address type */</span>
s_ctrl<span class="token operator">-></span>sensor_i2c_client<span class="token operator">-></span>addr_type <span class="token operator">=</span> slave_info<span class="token operator">-></span>addr_type<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>sensor_i2c_client<span class="token operator">-></span>client<span class="token punctuation">)</span>s_ctrl<span class="token operator">-></span>sensor_i2c_client<span class="token operator">-></span>client<span class="token operator">-></span>addr <span class="token operator">=</span> camera_info<span class="token operator">-></span>sensor_slave_addr<span class="token punctuation">;</span>cci_client <span class="token operator">=</span> s_ctrl<span class="token operator">-></span>sensor_i2c_client<span class="token operator">-></span>cci_client<span class="token punctuation">;</span>cci_client<span class="token operator">-></span>cci_i2c_master <span class="token operator">=</span> s_ctrl<span class="token operator">-></span>cci_i2c_master<span class="token punctuation">;</span>
cci_client<span class="token operator">-></span>sid <span class="token operator">=</span> slave_info<span class="token operator">-></span>slave_addr <span class="token operator">>></span> <span class="token number">1</span><span class="token punctuation">;</span>
cci_client<span class="token operator">-></span>retries <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
cci_client<span class="token operator">-></span>id_map <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
cci_client<span class="token operator">-></span>i2c_freq_mode <span class="token operator">=</span> slave_info<span class="token operator">-></span>i2c_freq_mode<span class="token punctuation">;</span><span class="token comment">// 6. 填充上電信息</span>
<span class="token comment">/* Parse and fill vreg params for powerup settings */</span>
rc <span class="token operator">=</span> <span class="token function">msm_camera_fill_vreg_params</span><span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>cam_vreg<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>num_vreg<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>power_setting<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>power_setting_size<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 7. 填充下電信息</span>
<span class="token comment">/* Parse and fill vreg params for powerdown settings*/</span>
rc <span class="token operator">=</span> <span class="token function">msm_camera_fill_vreg_params</span><span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>cam_vreg<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>num_vreg<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>power_down_setting<span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>power_info<span class="token punctuation">.</span>power_down_setting_size<span class="token punctuation">)</span><span class="token punctuation">;</span>
CSID_TG:
s_ctrl->sensordata->sensor_name = slave_info->sensor_name;
s_ctrl->sensordata->eeprom_name = slave_info->eeprom_name;
s_ctrl->sensordata->actuator_name = slave_info->actuator_name;
s_ctrl->sensordata->ois_name = slave_info->ois_name;
s_ctrl->sensordata->flash_name = slave_info->flash_name;
rc = msm_sensor_fill_eeprom_subdevid_by_name(s_ctrl);
rc = msm_sensor_fill_actuator_subdevid_by_name(s_ctrl);
rc = msm_sensor_fill_laser_led_subdevid_by_name(s_ctrl);
rc = msm_sensor_fill_ois_subdevid_by_name(s_ctrl);
rc = msm_sensor_fill_flash_subdevid_by_name(s_ctrl);
<span class="token comment">// 10. 開始上電,上電后會進行check_id 操作,如果 sensor id 匹配成功,則返回成功,</span>
<span class="token comment">/* Power up and probe sensor */</span>
rc <span class="token operator">=</span> s_ctrl<span class="token operator">-></span>func_tbl<span class="token operator">-></span><span class="token function">sensor_power_up</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">></span>
<span class="token operator">+</span> @ <span class="token operator">/</span>kernel<span class="token operator">/</span>msm<span class="token operator">-</span><span class="token number">4.14</span><span class="token operator">/</span>drivers<span class="token operator">/</span>media<span class="token operator">/</span>platform<span class="token operator">/</span>msm<span class="token operator">/</span>camera_v2<span class="token operator">/</span>sensor<span class="token operator">/</span>msm_sensor<span class="token punctuation">.</span>c
<span class="token operator">+</span> <span class="token keyword">static</span> <span class="token keyword">struct</span> msm_sensor_fn_t msm_sensor_func_tbl <span class="token operator">=</span> <span class="token punctuation">{</span>
<span class="token operator">+</span> <span class="token punctuation">.</span>sensor_config <span class="token operator">=</span> msm_sensor_config<span class="token punctuation">,</span>
<span class="token operator">+</span> <span class="token punctuation">.</span>sensor_power_up <span class="token operator">=</span> msm_sensor_power_up<span class="token punctuation">,</span>
<span class="token operator">+</span> <span class="token punctuation">.</span>sensor_power_down <span class="token operator">=</span> msm_sensor_power_down<span class="token punctuation">,</span>
<span class="token operator">+</span> <span class="token punctuation">.</span>sensor_match_id <span class="token operator">=</span> msm_sensor_match_id<span class="token punctuation">,</span>
<span class="token operator">+</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token operator">+</span>
<span class="token operator">+</span> rc <span class="token operator">=</span> <span class="token function">msm_camera_power_up</span><span class="token punctuation">(</span>power_info<span class="token punctuation">,</span> s_ctrl<span class="token operator">-></span>sensor_device_type<span class="token punctuation">,</span> sensor_i2c_client<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">+</span> rc <span class="token operator">=</span> <span class="token function">msm_sensor_check_id</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator"><=</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>
<span class="token function">pr_err</span><span class="token punctuation">(</span><span class="token string">"%s probe succeeded"</span><span class="token punctuation">,</span> slave_info<span class="token operator">-></span>sensor_name<span class="token punctuation">)</span><span class="token punctuation">;</span>s_ctrl<span class="token operator">-></span>bypass_video_node_creation <span class="token operator">=</span> slave_info<span class="token operator">-></span>bypass_video_node_creation<span class="token punctuation">;</span><span class="token comment">/** Create /dev/videoX node, comment for now until dummy /dev/videoX* node is created and used by HAL*/</span>
<span class="token comment">// 11. 將sensor 加加載到V4L2 subdev 中,創(chuàng)建 節(jié)點 /dev/videoX</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>sensor_device_type <span class="token operator">==</span> MSM_CAMERA_PLATFORM_DEVICE<span class="token punctuation">)</span>rc <span class="token operator">=</span> <span class="token function">msm_sensor_driver_create_v4l_subdev</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">else</span>rc <span class="token operator">=</span> <span class="token function">msm_sensor_driver_create_i2c_v4l_subdev</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 12. 下電,保存 sensor_info 信息到 s_strl 中。</span>
<span class="token comment">/* Power down */</span>
s_ctrl<span class="token operator">-></span>func_tbl<span class="token operator">-></span><span class="token function">sensor_power_down</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">)</span><span class="token punctuation">;</span>rc <span class="token operator">=</span> <span class="token function">msm_sensor_fill_slave_info_init_params</span><span class="token punctuation">(</span>slave_info<span class="token punctuation">,</span> s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>sensor_info<span class="token punctuation">)</span><span class="token punctuation">;</span>
rc <span class="token operator">=</span> <span class="token function">msm_sensor_validate_slave_info</span><span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>sensor_info<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">/*Save sensor info*/</span>
s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>cam_slave_info <span class="token operator">=</span> slave_info<span class="token punctuation">;</span>
<span class="token function">msm_sensor_fill_sensor_info</span><span class="token punctuation">(</span>s_ctrl<span class="token punctuation">,</span> probed_info<span class="token punctuation">,</span> entity_name<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/** Set probe succeeded flag to 1 so that no other camera shall* probed on this slot*/</span>
s_ctrl<span class="token operator">-></span>is_probe_succeed <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> rc<span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
2.1.1 創(chuàng)建 /dev/videoX、 /dev/v4l-subdevX 節(jié)點
創(chuàng)建 /dev/videoX 節(jié)點初始化 s_ctrl->msm_sd.sd 節(jié)構體信息,將ops 綁定到 sd 中更新 subdev 信息,并注冊subdev將 subdev 添回到 subdev list 鏈表中創(chuàng)建 /dev/v4l-subdevX 節(jié)點
@ msm
-4.14/drivers
/media
/platform
/msm
/camera_v2
/sensor
/msm_sensor_driver
.c
static int32_t
msm_sensor_driver_create_v4l_subdev(struct msm_sensor_ctrl_t
*s_ctrl
)
{if (s_ctrl
->bypass_video_node_creation
== 0) {rc
= camera_init_v4l2(&s_ctrl
->pdev
->dev
, &session_id
);=============>+ @ msm
-4.14/drivers
/media
/platform
/msm
/camera_v2
/camera
/camera
.c
+ strlcpy(pvdev
->vdev
->name
, "msm-sensor", sizeof(pvdev
->vdev
->name
));+ pvdev
->vdev
->fops
= &camera_v4l2_fops
;+ pvdev
->vdev
->ioctl_ops
= &camera_v4l2_ioctl_ops
;+ video_register_device(pvdev
->vdev
,VFL_TYPE_GRABBER
, -1);+ ----------------->+ @ msm
-4.14/include
/media
/v4l2
-dev
.h
+ __video_register_device(vdev
, type
, nr
, 1, vdev
->fops
->owner
);+ ------------>+ name_base
= "video";+ + minor_offset
= 0;+ minor_cnt
= 64;+ nr
= devnode_find(vdev
, 0, minor_cnt
);+ video_device
[vdev
->minor
] = vdev
;+ + vdev
->cdev
->ops
= &v4l2_fops
;+ vdev
->cdev
->owner
= owner
;+ ret
= cdev_add(vdev
->cdev
, MKDEV(VIDEO_MAJOR
, vdev
->minor
), 1);+ + vdev
->dev
.class
= &video_class
;+ vdev
->dev
.devt
= MKDEV(VIDEO_MAJOR
, vdev
->minor
);+ vdev
->dev
.parent
= vdev
->dev_parent
;+ dev_set_name(&vdev
->dev
, "%s%d", name_base
, vdev
->num
);+ ret
= device_register(&vdev
->dev
);+ <------------+ <-----------------<=============}
<span class="token function">CDBG</span><span class="token punctuation">(</span><span class="token string">"rc %d session_id %d"</span><span class="token punctuation">,</span> rc<span class="token punctuation">,</span> session_id<span class="token punctuation">)</span><span class="token punctuation">;</span>
s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>sensor_info<span class="token operator">-></span>session_id <span class="token operator">=</span> session_id<span class="token punctuation">;</span><span class="token comment">// 2. 初始化 s_ctrl->msm_sd.sd 節(jié)構體信息,將ops 綁定到 sd 中</span>
<span class="token comment">/* Create /dev/v4l-subdevX device */</span>
<span class="token function">v4l2_subdev_init</span><span class="token punctuation">(</span><span class="token operator">&</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">,</span> s_ctrl<span class="token operator">-></span>sensor_v4l2_subdev_ops<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 3. 更新 subdev 信息,并注冊</span>
<span class="token comment">// imx258</span>
<span class="token function">snprintf</span><span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"%s"</span><span class="token punctuation">,</span>s_ctrl<span class="token operator">-></span>sensordata<span class="token operator">-></span>sensor_name<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">v4l2_set_subdevdata</span><span class="token punctuation">(</span><span class="token operator">&</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">,</span> s_ctrl<span class="token operator">-></span>pdev<span class="token punctuation">)</span><span class="token punctuation">;</span>
s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>flags <span class="token operator">|</span><span class="token operator">=</span> V4L2_SUBDEV_FL_HAS_DEVNODE<span class="token punctuation">;</span>
<span class="token function">media_entity_pads_init</span><span class="token punctuation">(</span><span class="token operator">&</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>entity<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>function <span class="token operator">=</span> MSM_CAMERA_SUBDEV_SENSOR<span class="token punctuation">;</span>
s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>name <span class="token operator">=</span> s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>sd<span class="token punctuation">.</span>name<span class="token punctuation">;</span> <span class="token comment">// imx258</span>
s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">.</span>close_seq <span class="token operator">=</span> MSM_SD_CLOSE_2ND_CATEGORY <span class="token operator">|</span> <span class="token number">0x3</span><span class="token punctuation">;</span>
rc <span class="token operator">=</span> <span class="token function">msm_sd_register</span><span class="token punctuation">(</span><span class="token operator">&</span>s_ctrl<span class="token operator">-></span>msm_sd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span><span class="token operator">></span>@ msm<span class="token operator">-</span><span class="token number">4.14</span><span class="token operator">/</span>drivers<span class="token operator">/</span>media<span class="token operator">/</span>platform<span class="token operator">/</span>msm<span class="token operator">/</span>camera_v2<span class="token operator">/</span>msm<span class="token punctuation">.</span>c<span class="token function">__msm_sd_register_subdev</span><span class="token punctuation">(</span><span class="token operator">&</span>msm_subdev<span class="token operator">-></span>sd<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-></span><span class="token comment">// 3.1 將 subdev 添回到 subdev list 鏈表中</span>rc <span class="token operator">=</span> <span class="token function">v4l2_device_register_subdev</span><span class="token punctuation">(</span>msm_v4l2_dev<span class="token punctuation">,</span> sd<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-></span><span class="token function">list_add_tail</span><span class="token punctuation">(</span><span class="token operator">&</span>sd<span class="token operator">-></span>list<span class="token punctuation">,</span> <span class="token operator">&</span>v4l2_dev<span class="token operator">-></span>subdevs<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token function">strlcpy</span><span class="token punctuation">(</span>vdev<span class="token operator">-></span>name<span class="token punctuation">,</span> sd<span class="token operator">-></span>name<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>vdev<span class="token operator">-></span>name<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// imx258</span>vdev<span class="token operator">-></span>v4l2_dev <span class="token operator">=</span> msm_v4l2_dev<span class="token punctuation">;</span>vdev<span class="token operator">-></span>fops <span class="token operator">=</span> <span class="token function">msm_cam_get_v4l2_subdev_fops_ptr</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>vdev<span class="token operator">-></span>release <span class="token operator">=</span> msm_sd_unregister_subdev<span class="token punctuation">;</span><span class="token comment">// 3.2 創(chuàng)建 /dev/v4l-subdevX 節(jié)點</span>rc <span class="token operator">=</span> <span class="token function">__video_register_device</span><span class="token punctuation">(</span>vdev<span class="token punctuation">,</span> VFL_TYPE_SUBDEV<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span>sd<span class="token operator">-></span>owner<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-></span>@ msm<span class="token operator">-</span><span class="token number">4.14</span><span class="token operator">/</span>drivers<span class="token operator">/</span>media<span class="token operator">/</span>v4l2<span class="token operator">-</span>core<span class="token operator">/</span>v4l2<span class="token operator">-</span>dev<span class="token punctuation">.</span>cname_base <span class="token operator">=</span> <span class="token string">"v4l-subdev"</span><span class="token punctuation">;</span>minor_offset <span class="token operator">=</span> <span class="token number">128</span><span class="token punctuation">;</span>minor_cnt <span class="token operator">=</span> <span class="token number">64</span><span class="token punctuation">;</span><span class="token comment">/* Pick a device node number */</span>nr <span class="token operator">=</span> <span class="token function">devnode_find</span><span class="token punctuation">(</span>vdev<span class="token punctuation">,</span> nr <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token punctuation">:</span> nr<span class="token punctuation">,</span> minor_cnt<span class="token punctuation">)</span><span class="token punctuation">;</span>video_device<span class="token punctuation">[</span>vdev<span class="token operator">-></span>minor<span class="token punctuation">]</span> <span class="token operator">=</span> vdev<span class="token punctuation">;</span><span class="token comment">/* Part 3: Initialize the character device */</span>vdev<span class="token operator">-></span>cdev<span class="token operator">-></span>ops <span class="token operator">=</span> <span class="token operator">&</span>v4l2_fops<span class="token punctuation">;</span>vdev<span class="token operator">-></span>cdev<span class="token operator">-></span>owner <span class="token operator">=</span> owner<span class="token punctuation">;</span>ret <span class="token operator">=</span> <span class="token function">cdev_add</span><span class="token punctuation">(</span>vdev<span class="token operator">-></span>cdev<span class="token punctuation">,</span> <span class="token function">MKDEV</span><span class="token punctuation">(</span>VIDEO_MAJOR<span class="token punctuation">,</span> vdev<span class="token operator">-></span>minor<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">/* Part 4: register the device with sysfs */</span>vdev<span class="token operator">-></span>dev<span class="token punctuation">.</span>class <span class="token operator">=</span> <span class="token operator">&</span>video_class<span class="token punctuation">;</span>vdev<span class="token operator">-></span>dev<span class="token punctuation">.</span>devt <span class="token operator">=</span> <span class="token function">MKDEV</span><span class="token punctuation">(</span>VIDEO_MAJOR<span class="token punctuation">,</span> vdev<span class="token operator">-></span>minor<span class="token punctuation">)</span><span class="token punctuation">;</span>vdev<span class="token operator">-></span>dev<span class="token punctuation">.</span>parent <span class="token operator">=</span> vdev<span class="token operator">-></span>dev_parent<span class="token punctuation">;</span><span class="token function">dev_set_name</span><span class="token punctuation">(</span><span class="token operator">&</span>vdev<span class="token operator">-></span>dev<span class="token punctuation">,</span> <span class="token string">"%s%d"</span><span class="token punctuation">,</span> name_base<span class="token punctuation">,</span> vdev<span class="token operator">-></span>num<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// v4l-subdevX</span>ret <span class="token operator">=</span> <span class="token function">device_register</span><span class="token punctuation">(</span><span class="token operator">&</span>vdev<span class="token operator">-></span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span><span class="token operator"><</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
<span class="token operator"><=</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token function">msm_cam_copy_v4l2_subdev_fops</span><span class="token punctuation">(</span><span class="token operator">&</span>msm_sensor_v4l2_subdev_fops<span class="token punctuation">)</span><span class="token punctuation">;</span>
#ifdef CONFIG_COMPAT
msm_sensor_v4l2_subdev_fops.compat_ioctl32 = msm_sensor_subdev_fops_ioctl;
#endif
s_ctrl->msm_sd.sd.devnode->fops = &msm_sensor_v4l2_subdev_fops;
<span class="token keyword">return</span> rc<span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
至此,整個probe 過程就 完畢了。
</div><link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet"></div>
總結
以上是生活随笔為你收集整理的android_驱动_qcom_【高通SDM660平台 Android 10.0】(10) --- Camera Sensor lib 与 Kernel Camera Probe 代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。