1、Sensor slave配置
結構體msm_camera_sensor_slave_info定義在media/msm_cam_sensor.h中:
struct msm_camera_sensor_slave_info {
char sensor_name[32]; //sensor名稱
char eeprom_name[32]; //eeprom名稱
char actuator_name[32]; //actuator名稱
enum msm_sensor_camera_id_t camera_id; //camera id號
uint16_t slave_addr; //從地址
enum msm_camera_i2c_reg_addr_type addr_type; //camera i2c寄存器地址類型
struct msm_sensor_id_info_t sensor_id_info; //sensor 芯片id信息
struct msm_sensor_power_setting_array power_setting_array; //上電序列
uint8_t is_init_params_vaild; //初始化參數是否有效
struct msm_sensor_init_params sensor_init_params; //sensor初始化參數
};
1.1、枚舉類型msm_sensor_camera_id_t的定義如下:
enum msm_sensor_camera_id_t {
CAMERA_0, //camera id 號0
CAMERA_1, //camera id 號1
CAMERA_2, //camera id 號2
CAMERA_3, //camera id 號3
MAX_CAMERAS, //支持的最大id號
};
1.2、枚舉類型msm_camera_i2c_reg_addr_type的定義如下:
enum msm_camera_i2c_reg_addr_type{
MSM_CAMERA_I2C_BYTE_ADDR = 1, //1字節型
MSM_CAMERA_I2C_WORD_ADDR,//2字型
MSM_CAMERA_I2C_3B_ADDR,//3字節型
};
1.3、結構體msm_sensor_id_info_t的定義如下:
struct msm_sensor_id_info_t{
uint16_t sensor_id_reg_addr; //對應sensor id號的寄存器地址
uint16_t sensor_id; //sensor id號
};
1.4、結構體 msm_sensor_power_setting_array的定義如下:
enum msm_sensor_power_seq_type_t{
SENSOR_CLK,
SENSOR_GPIO,
SENSOR_VREG,
SENSOR_I2C_MUX,
};
struct msm_sensor_power_setting{ //上電序列
enum msm_sensor_power_seq_typeseq_type;
uint16_t seq_val;
long config_val;
uint16_t delay;
void *data[10];
};
struct msm_sensor_power_setting_array{
struct msm_sensor_power_setting*power_setting;
uint16_t size;
struct msm_sensor_power_setting *power_down_setting;
uint16_t size_down;
};
1.5、結構體msm_sensor_init_params的定義如下:
enum camb_position_t{
BACK_CAMERA_B,//后攝
FRONT_CAMERA_B,//前攝
INVALID_CAMERA_B,//非法
}
struct msm_sensor_init_params{
/* mask of modes supported: 2D, 3D */
int modes_supported; //支持camera的模式
/* sensor position: front, back */
enum camb_position_tposition; //sensor的位置
/* sensor mount angle*/
uint32_t sensor_mount_angle; //sensor安裝的角度
};
舉例:
以下是imx230_lib.c中對sensor初始化參數的設置。
支持模式的值是在枚舉類型camerab_mode_t中:
enum camerab_mode_t{
CAMERA_MODE_2D_B = (1<<0),//2D
CAMERA_MODE_3D_B = (1<<1),//3D
CAMERA_MODE_INVALID = (1<<2),//非法
};
2D模式:平面圖像模式。
3D模式:拍照出使裸眼觀看就具有立體感的圖像的模式,需要使用雙攝像頭。
sensor安裝角度的值是宏定義,在sensor_lib.h中:
/*MOUNT ANGLE >= to this value is considered invalid in sensor lib */
#define SENSOR_MOUNTANGLE_360360 //360度
/* Sensor mount angle. */
#define SENSOR_MOUNTANGLE_00 //0度
#define SENSOR_MOUNTANGLE_9090 //90度
#define SENSOR_MOUNTANGLE_180180 //180度
#define SENSOR_MOUNTANGLE_270270 //270度
2.、Sensor 輸出設置
2.1 、Sensor輸出格式設置
輸出格式:Bayer/YUV.
連接模式:parallel/MIPI. msm8974只支持MIPI.
Raw圖格式:8/10/12 bits.
imx230分別設置為Bayer、MIPI、10bit。
結構體sensor_output_t 定義在sensor_lib.h中:
typedef struct{
sensor_output_format_toutput_format; //輸出格式
sensor_connection_mode_tconnection_mode; //連接模式
sensor_raw_output_traw_output; //raw圖格式
}sensor_output_t;
其中sensor_output_format_t, sensor_connection_mode_t, sensor_raw_output_t為枚舉類型,定義如下:
typedef enum{
SENSOR_BAYER, //Bayer格式
SENSOR_YCBCR //YUV格式(Y,Cb,Cr)
}sensor_output_format_t;
typedef enum{
SENSOR_PARALLEL,//並行
SENSOR_MIPI_CSI, //MIPI CSI
SENSOR_MIPI_CSI_1,//CSI1
SENSOR_MIPI_CSI_2,//CSI2
}sensor_connection_mode_t;
typedef enum{
SENSOR_8_BIT_DIRECT, //8-bit
SENSOR_10_BIT_DIRECT,//10-bit
SENSOR_12_BIT_DIRECT,//12-bit
}sensor_raw_output_t;
10-bit RAW圖數據是通過數據包的格式進行傳輸的,打包之后的數據格式為8-bit。下表是對RAW10數據包格式限制條件的說明,每一個數據包的長度必須是表中數值的整數倍,bit位傳輸順序服從CSI-2規則,LSB優先。
2.2 、Sensor像素格式信息
結構體sensor_pix_fmt_info_t定義在sensor_lib.h中:
struct sensor_pix_fmt_info_t {
uint32_t fourcc;
};
像素格式的值V4L2_PIX_FMT_SRGGB10是宏定義在Linux/videodev2.h中,如下:
/* __u32為unsigned int 型 */
#define v4l2_fourcc(a,b,c,d) \
((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) | ((__u32)(d) << 24)//為什么這么做?
/* www.siliconimaging.com/RGB%20Bayer.htm */
#define V4L2_PIX_FMT_SBGGR8v4l2_fourcc('B','A','8','1') //BGGR 8bit
#define V4L2_PIX_FMT_SGBRG8v4l2_fourcc('G','B','R','G') //GBRG 8bit
#define V4L2_PIX_FMT_SGRBG8v4l2_fourcc('G','R','B','G') //GRBG 8bit
#define V4L2_PIX_FMT_SRGGB8v4l2_fourcc('R','G','G','B') //RGGB 8bit
#define V4L2_PIX_FMT_SBGGR10v4l2_fourcc('B','G','1','0') //BGGR 10bit
#define V4L2_PIX_FMT_SGBRG10v4l2_fourcc('G','B','1','0') //GBRG 10bit
#define V4L2_PIX_FMT_SGRBG10v4l2_fourcc('B','A','1','0') //GRBG 10bit
#define V4L2_PIX_FMT_SRGGB10v4l2_fourcc('R','G','1','0') //RGGB 10bit
#define V4L2_PIX_FMT_SBGGR12v4l2_fourcc('B','G','1','2') //BGGR 12bit
#define V4L2_PIX_FMT_SGBRG12v4l2_fourcc('G','B','1','2') //GBRG 12bit
#define V4L2_PIX_FMT_SGRBG12v4l2_fourcc('B','A','1','2') //GRBG 12bit
#define V4L2_PIX_FMT_SRGGB12v4l2_fourcc('R','G','1','2') //RGGB 12bit
像素格式的值MSM_V4L2_PIX_FMT_META是宏定義在media/msm_cam_sensor.h中:
#define MSM_V4L2_PIX_FMT_METAv4l2_fourcc('M','E','T','A')
2.3 、Sensor輸出尺寸設置
結構體sensor_lib_out_info_t用於保存sensor所支持的不同分辨率的信息。imx230_lib.c中使用結構體sensor_lib_out_info_t定義了一個sensor_out_info[]。sensor_out_info[0]保存最大分辨率信息,sensor_out_info[1]保存1/4最大分辨率的信息。
2.3.1、 各參數含義解釋
結構體sensor_lib_out_info_t的定義如下:
struct sensor_lib_out_info_t {
uint16_t x_output; //sensor 輸出寬度(pixels)
uint16_t y_output; //sensor輸出高度(pixels)
uint16_t line_lenth_pclk; //每一幀每一行多少個pixels
uint16_t frame_length_lines; //每一幀多少行
uint32_t vt_pixel_clk; //sensor 掃描速率(pixels per sec)
uint32_t op_pixel_clk; //sensor實際輸出速率(pixels per sec)
uint16_t bining_factor; /*?: 1 if average is taken, >1 if sum is taken(applies only for if this resolution has binnig) */
float min_fps;//sensor支持的最小幀率
float max_fps;//sensor支持的最大幀率
uint32_t mode; //分辨率所對應的模式
};
使用Chromatix軟件進行tuning設置Image Width和Image Height的值時分別參考此處x_output和y_output。
line_length_pckl 和frame_length_lines 是指包含blanking的寬度值和高度值。
line_lenth_pclk和frame_length_lines決定幀的大小。
什么是blanking?
每一幀圖像的每一行輸出是遵循CSI2的通用幀格式。每一行的行尾(Packet Footer,PF)到下一行行頭(Packet Header,PH)的期間稱為“line blanking”。同樣的,每一幀的幀尾(Frame End,FE)到下一幀幀頭(Frame Start,FS)的期間稱為“frame blanking”。
vt_pixel_clk時鍾用於內部圖像處理,計算曝光時間和幀率等。
曝光時間計算見4.1。
幀率:frame rate = vt_pixel_clk / (line_lenth_pclk * frame_length_lines).
op_pixel_clk = (sensor 輸出實際比特率)/bits-per-pixel.
比如,如果 MIPI DDR 時鍾值 (sensor MIPI 的時鍾 lane 頻率) 為 300Mhz, 同時 sensor 使用4 個 lane 傳輸數據, 每一個 lane 的數據率是 300*2 = 600Mhz. 因此, 總數據率為 600*4= 2400Mhz. 對於 10bit 的 bayer sensor, op_pixel_clk 值可設置為 2400/10 = 240Mhz.這些值可以從 sensor 的寄存器設置中計算出來。
其中的mode的值是宏定義的,如下:
/* HFR模式不用於常規的camera,camcorder */
#define SENSOR_DEFAULT_MODE (1 << 0)//默認模式
#define SENSOR_HFR_MODE (1 << 1) //高幀率模式,用於捕捉慢動作視頻
#define SENSOR_HDR_MODE (1 << 2)//高動態范圍圖像模式
結構體sensor_lib_out_info_array的定義如下:
struct sensor_lib_out_info_array {
struct sensor_lib_out_info_t*out_info; //指向sensor_lib_out_info_t結構體的指針
uint16_t size; //sensor_lib_out_info_t結構體數組長度
};
ARRAY_SIZE的宏定義如下:
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))//獲取數組長度。
2.3.2 、x_output & y_output參數設置
x_output和y_output是sensor輸出圖像的重要參數,分別代表了圖像的寬度和高度,單位是pixel。上層camera app最終就是從這里獲取的sensor輸出圖像的寬度和高度信息,然后根據此信息裁剪出各種尺寸的圖片。
Camera app照相所支持的圖片尺寸在mct_pipeline.c(路徑:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct/pipeline)中定義,如下圖:
因此imx230的x_output和y_output參數設置是不能小於上圖中的最大尺寸,同時要與實際sensor輸出圖像的尺寸一致。
Imx230中控制sensor輸出圖像尺寸的寄存器關系如下圖:
由關系圖可以看出,最終控制sensor圖像輸出尺寸的是寄存器X_OUT_SIZE和Y_OUT_SIZE,所以x_output和y_output的值要與這兩個寄存器的值一致。
一般sensor提供商所提供的這些寄存器的設置,都是由寄存器X_ADD_STA ,Y_ADD_STA, X_ADD_END和Y_ADD_END所確定的尺寸就是sensor最后輸出的尺寸,這樣后面的bining、sub-sampling、digtal crop、scaling 處理都可以省去以節約拍照時間。
2.4 、Sensor輸出寄存器地址設置
結構體 msm_sensor_output_reg_addr_t的定義如下:
struct msm_sensor_output_reg_addr_t {
uint16_t x_output; //寄存器X_OUT_SIZE地址
uint16_t y_output; //寄存器Y_OUT_SIZE地址
uint16_t line_length_pclk; //寄存器LIN_LENGTH_PCK地址
uint16_t frame_length_lines; //寄存器FRM_LENGTH_LINES地址
};
2.5、 圖像裁剪設置
圖像裁剪設置主要用到的結構體為sensor_crop_parms_t和sensor_crop_params_arry, sensor_crop_params_t用於保存裁剪的位置信息。定義在sensor_lib.h中:
struct sensor_crop_parms_t {
uint16_t top_crop; //距離頂部的距離
uint16_t bottom_crop; //距離底部的距離
uint16_t left_crop; //距離左側的距離
uint16_t right_crop; //距離右側的距離
} ;
struct sensor_lib_crop_params_array{
struct sensor_crop_parms_t *crop_params; //結構體指針
uint16_t size; //結構數組長度
};
imx230對於2種分辨率的圖像不裁剪。
2.6 、分辨率切換設置
imx230使用2種分辨率,枚舉類型sensor_res_cfg_type_t說明了進行分辨率切換時所需要進行的操作,在sensor_lib.h中定義如下:
typedef enum {
SENSOR_SET_STOP_STREAM,//停止數據傳輸
SENSOR_SET_START_STREAM,//開始數據傳輸
SENSOR_SET_NEW_RESOLUTION,//設置新的分辨率
SENSOR_SEND_EVENT,//發送事件
SENSOR_SET_CSIPHY_CFG,//CSIPHY參數設置
SENSOR_SET_CSID_CFG,//CSID參數設置
SENSOR_LOAD_CHROMATIX,//加載chromatix參數
} sensor_res_cfg_type_t;
imx230_res_cfg[]數組序列對應着切換分辨率的操作順序:
停止數據傳輸 ----> 設置新的分辨率 ----> CSIPHY參數設置 ----> CSID參數設置
----> 加載chromatix參數 ----> 發送事件 ----> 開始數據傳輸.
3、Camera I2C寄存器設置
I2C寄存器的設置都會用到這兩種結構體:msm_camera_i2c_reg_array 和msm_camera_i2c_reg_setting。其定義在media/msm_camera.h中:
struct msm_camera_i2c_reg_array {
uint16_t reg_addr; //寄存器地址
uint16_t reg_data; //寄存器數據
};
struct msm_camera_i2c_reg_setting {
struct msm_camera_i2c_reg_array *reg_setting; //結構體指針
uint16_t size; //結構數組長度
enum msm_camera_i2c_reg_addr_typeaddr_type; //地址類型
enum msm_camera_i2c_data_typedata_type; //數據類型
uint16_t dalay; //延時
};
其中枚舉類型msm_camera_i2c_reg_addr_type在1.2中已經作過介紹了。 msm_camera_i2c_data_type的定義如下:
enum msm_camera_i2c_data_type {
MSM_CAMERA_I2C_BYTE_DATA = 1,
MSM_CAMERA_I2C_WORD_DATA,
MSM_CAMERA_I2C_SET_BYTE_MASK,
MSM_CAMERA_I2C_UNSET_BYTE_MASK,
MSM_CAMERA_I2C_SET_WORD_MASK,
MSM_CAMERA_I2C_UNSET_WORD_MASK,
MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA,
};
3.1、寄存器初始化設置
表現為在相機啟動時一組一次性寫入的寄存器。init_reg_array[],res0_reg_array[]和res1_reg_arry[]定義在頭文imx230_lib.h中。分別對應excel表RegisterSetting中的全局設置和不同分辨率設置的數據。
寄存器初始化流程為:
上電 —> 外部時鍾輸入 —> XCLR關閉—> 外部時鍾寄存器設置 —> 全局寄存器設置 —> Load Setting
之后寄存器設置根據不同分辨率具有不同的設置。
Load Setting —> 模式設置 —> 輸出格式設置 —> 時鍾設置 —> Data rate設置 —> 曝光時間設置 —> Gain值設置 —> HDR設置 —> DPC2D設置 —> LSC設? —> Stats 設置
3.2 、Grouphold on設置
sensor工作時更新曝光設定需要操作許多寄存器(曝光時間,每幀行數,增益),這些必須在同一幀完成更新。這些寄存器都有雙buffer,並具有按組更新的功能。表現為所有相關寄存器一起完成更新。
地址0x0104就是寄存器GRP_PARAM_HOLD的地址,當其寄存器的值設為1時,寫入的寄存器數據被暫存的buffer寄存器中。
3.3 、Grouphold off設置
當寄存器GRP_PARAM_HOLD的值為0時,所需要寄存器的值會被同時更新,參數的變化會在同一幀生效。
3.4、 啟動輸出設置
MIPI數據包必須以在SoT(Start of Transmission)和EoT(End of Transmission)之間發送。根據參考手冊7.1,在正確的時間設定寄存器MODE_SEL(地址0x0100)為1時,開始進行數據輸出。
啟動數據輸出流程分為兩種情況:
情況1:在上電之后
(1)准備上電序列時序
(2)PLL鎖相環參數設置
(3)初始化設置
(4)設置讀取模式(起始/結束位置,大小,曝光時間,gain值)
(5)設置MIPI接口參數
(6)設置寄存器MODE_SEL的值為1,准備數據輸出
在經過MIPI喚醒時間和初始化時間之后,開始輸出第一幀圖像數據。
情況2:在經過一次數據輸出之后
(1)設置寄存器MODE_SEL的值為0,進入待命狀態
(2)等待MIPI的FE package
(3)設置下一次數據輸出模式
(4)設置寄存器MODE_SEL的值為1,准備數據輸出
在經過MIPI喚醒時間和初始化時間之后,開始輸出第一幀圖像數據。
3.5、停止輸出配置
在正確的時間設定MODE_SEL為0時,結束數據傳輸。
4、曝光設置
4.1 、曝光寄存器地址
結構體msm_sensor_exp_gain_info_t定義在sensor_lib.c中:
struct msm_sensor_exp_gain_info_t {
uint16_t coarse_int_time_addr; //粗曝光時間寄存器地址
uint16_t global_gain_addr; //模擬增益寄存器地址
uint16_t vert_offset; //曝光行偏置
};
粗曝光時間單位為lines,用於計算曝光時間,計算關系如下:
Tsh = Tline * (COARSE_INTEG_TIME + FINE_INTEG_TIME / LINE_LENGTH_PCK)
其中細曝光時間單位為pixels,是定值,其寄存器為只讀寄存器。Tline為行曝光時間,為時間單位。計算如下:
Tline = LINE_LENGTH_PCK * VTPXCK_period
曝光行偏置用於設定以下關系:
COARSE_INTEG_TIME ≤ frame_length_lines – vert_offset
4.2、 AEC參數設置
結構體sensor_aec_data_t定義在sensor_lib.h中:
typedef enum {
SENSOR_MODE_SNAPSHOT,//快照模式
SENSOR_MODE_RAW_SNAPSHOT,//raw圖快照模式
SENSOR_MODE_PREVIEW,//預覽模式
SENSOR_MODE_VIDEO,//視頻錄像模式
SENSOR_MODE_VIDEO_HD,//高清視頻錄像模式
SENSOR_MODE_HFR_60FPS,//60幀率HFR模式
SENSOR_MODE_HFR_90FPS,//90幀率 HFR模式
SENSOR_MODE_HFR_120FPS,//120幀率HFR模式
SENSOR_MODE_HFR_150FPS,//150幀率HFR模式
SENSOR_MODE_ZSL,//零秒快拍
SENSOR_MODE_INVALID,//非法
} sensor_mode_t;
typedef struct {
sensor_mode_t op_mode; //sensor 模式
uint32_t pixels_per_line;//每一幀每一行多少個pixels
uint32_t lines_per_frame; //每一幀多少行
uint32_t pclk;//vt_pixel_clk
uint32_t max_fps;//最大幀率
float digital_gain;//數字增益
float stored_digital_gain;
float max_gain;//最大數字增益
uint32_t max_linecount;//最大曝光行數
} sensor_aec_data_t;
4.3 、曝光增益gain值設置
AEC算法中模擬增益gain用於曝光計算,實際上必須把gain轉換成寄存器gain去設置sensor。以下是imx230的gain轉換函數:
模擬增益real_gain值的范圍是1至8, 對應到reg_gain的范圍為0到448。real_gain與reg_gain的關系為:
real_gain = 512 / (512 - reg_gain)
結構體sensor_exposure_info_t定義在sensor_lib.h中:
typedef struct {
uint16_t reg_gain; //寄存器gain值
uint16_t line_count; //曝光行數
float digital_gain;
float sensor_real_gain;//sensor的模擬gain值
float sensor_digital_gain; //sensor的數字gain值
} sensor_exposure_info_t;
5、鏡頭參數設置
結構體sensor_lens_info_t定義在sensor_lib.c中:
typedef struct {
float focal_length;//焦距
float pix_size;//像素大小
float f_number; //光圈
float total_f_dist;
float hor_view_angle;//水平視角
float ver_view_angle;//垂直視角
} sensor_lens_info_t;
6、Chromatix參數
每一種分辨率都必須有對應的chromatix庫文件。這里對應2種分辨率,設置的是相應的庫文件名稱。
結構體sensor_lib_chromatix_t定義在sensor_lib.h中:
struct sensor_lib_chromatix_t {
char *common_chromatix;
char *camera_preview_chromatix;
char *camera_snapshot_chromatix;
char *camcorder_chromatix;
char *liveshot_chromatix;
};
其數據成員都是字符型指針,用來記錄不同分辨率下不同模式的庫文件名稱。
7. MIPI接收器配置
7.1 、CSI lane參數配置
結構體 csi_lane_params_t定義在media/msm_camera.h中:
struct csi_lane_params_t {
uint16_t csi_lane_assign; //端口映射設置
uint8_t csi_lane_mask;//標識哪一個lane被使用
uint8_t csi_if;//未使用
uint8_t csid_core[2]; //csid硬件選擇
uint8_t csi_phy_sel; //csi-phy設備選擇
};
csi_lane_assign —— 有時候用戶的MIPI lanes可能使用不同與MSM參考設置的端口映射。比如,sensor的lane0連接到MSM的數據lane4等。對於這種情況,csi_lane_assign參數能設置正確的端口映射。csi_lane_assign是一個16bit的值,每位的含義參見下表。lane1用於MIPI時鍾,客戶不可用它來映射到任何數據lane。
csi_lane_mask —— 用於表示哪些lane被使用,這是一個8位值,每一位含義如下:
Bit position Represents
7:5 保留
4 數據lane4是否使用:
- 0 :不
- 1 :是
3 數據lane3是否使用:
- 0 :不
- 1 :是
2 數據lane2是否使用:
- 0 :不
- 1 :是
1 數據lane1是否使用:
- 0 :不
- 1 :是
注意:該位必須設置為1
0 數據lane0是否使用:
- 0 :不
- 1 :是
比如0x1F表示4條數據lane和時鍾都被使用。
csi_if —— 暫不使用。
csid_core —— 設置哪個CSID硬件被該sensor使用。兩個並發的sensor不能使用同一個CSID硬件。
csi_phy_sel —— 設置哪個CSI-PHY硬件被該sensor使用。對於每一個sensor來說必須是獨一無二的,除非有額外的MIPI橋連接兩個sensor到同一個PHY接口上。
7.2 、虛擬通道設置
CSI2傳輸的數據包包頭部分的起始1byte為數據標志符(Data Identifier, DI),由VC[7:6](Virtual Channel)和DT[5;0](Data Type)組成。通過不同的VC和DT值來標志不同的數據流,占2個bit位的虛擬通道VC允許最多4個數據流交叉傳輸,其取值范圍為0~3.
下表表示不同的TD的取值及對應的數據格式。
結構體 msm_camera_csid_vc_cfg用於保存虛擬通道的設置信息,在media/msm_camera.h中定義:
struct msm_camera_csid_vc_cfg {
uint8_t cid; //通道號
uint8_t dt; //數據類型
uint8_t decode_format; //解碼格式
};
imx230的設置如下:
其數據類型和解碼格式的值是宏定義的,其中數據類型的宏定義是根據上述DT表得來的。如下:
#define CSI_EMBED_DATA0x12
#define CSI_RESERVED_DATA_00x13
#define CSI_YUV422_80x1E
#define CSI_RAW80x2A
#define CSI_RAW100x2B
#define CSI_RAW120x2C
#define CSI_DECODE_6BIT0
#define CSI_DECODE_8BIT1
#define CSI_DECODE_10BIT2
#define CSI_DECODE_DPCM_10_8_105
7.3 、數據流設置
typedef struct _sensor_stream_info_t {
uint16_t vc_cfg_size;
struct msm_camera_csid_vc_cfg *vc_cfg; //虛擬通道設置
struct sensor_pix_fmt_info_t *pix_fmt_fourcc;//像素格式
} sensor_stream_info_t;
typedef struct _sensor_stream_info_array_t {
sensor_stream_info_t *sensor_stream_info;
uint16_t size;
} sensor_stream_info_array_t;
7.4、 CSID和CSI-PHY參數設置
struct msm_camera_csid_lut_params {
uint8_t num_cid;//虛擬通道個數
struct msm_camera_csid_vc_cfg *vc_cfg; //虛擬通道參數
};
struct msm_camera_csid_params {
uint8_t lane_cnt; //使用lane的數目
uint16_t lane_assign;
uint8_t phy_sel;
struct msm_camera_csid_lut_params lut_params;
};
struct msm_camera_csiphy_params {
uint8_t lane_cnt;
uint8_t settle_cnt;
uint16_t lane_mask;
uint8_t combo_mode;
uint8_t csid_core;
};
struct msm_camera_csi2_params {
struct msm_camera_csid_params csid_params; //CSID參數
struct msm_camera_csiphy_params csiphy_params; //CSI-PHY參數
};
lane_cnt ——有多少數據 lane 用於數據傳輸. 該值必須在 sensor 最大能力范圍內,而且sensor 寄存器設置必須與該 lane 數匹配.
settle_cnt ——該值須和 sensor 的特性匹配, 保證 sensor 的 MIPI 傳輸和 MSM 的 MIPI 接收能同步.
客戶可以對不同的分辨率模式使用不同CSI 參數設置。imx230采用兩種分辨率,但是使用相同的CSI設置。
8、imx230_ofilm_open_lib
在imx230_lib.c中,最后將所有的參數設置都放入sensor_lib_t類型的結構體sensor_lib_ptr中,定義函數imx230_ofilm_open_lib()來返回sensor_lib_ptr的地址,供外界調用。
結構體sensor_lib_t涵蓋了關於camera設置的幾乎全部信息。如下:
typedef struct {
/* sensor slave info */
struct msm_camera_sensor_slave_info *sensor_slave_info;
/* sensor info */
struct msm_sensor_init_params *sensor_init_params;
/* name of the AF actuator (if any)*/
char* actuator_name;
/* name of the eeprom (if any)*/
char* eeprom_name;
/* sensor output settings */
sensor_output_t *sensor_output;
/* sensor output register address */
struct msm_sensor_output_reg_addr_t *output_reg_addr;
/* sensor exposure gain register address */
struct msm_sensor_exp_gain_info_t *exp_gain_info;
/* sensor aec info */
sensor_aec_data_t *aec_info;
/* sensor snapshot exposure wait frames info */
uint16_t snapshot_exp_wait_frames;
/* number of frames to skip after start stream info */
uint16_t sensor_num_frame_skip;
/* number of frames to skip after start HDR stream info */
uint16_t sensor_num_HDR_frame_skip;
/* sensor pipeline delay */
uint32_t sensor_max_pipeline_frame_delay;
/* sensor exposure table size */
uint16_t exposure_table_size;
/* sensor lens info */
sensor_lens_info_t *default_lens_info;
/* csi lane params */
struct csi_lane_params_t *csi_lane_params;
/* csi cid params */
struct msm_camera_csid_vc_cfg *csi_cid_params;
/* sensor port info that consists of cid mask and fourcc mapaping */
sensor_stream_info_array_t *sensor_stream_info_array;
/* csi cid params size */
uint16_t csi_cid_params_size;
/* init settings */
struct sensor_lib_reg_settings_array *init_settings_array;
/* start settings */
struct msm_camera_i2c_reg_setting *start_settings;
/* stop settings */
struct msm_camera_i2c_reg_setting *stop_settings;
/* group on settings */
struct msm_camera_i2c_reg_setting *groupon_settings;
/* group off settings */
struct msm_camera_i2c_reg_setting *groupoff_settings;
/* resolution config table */
struct sensor_res_cfg_table_t *sensor_res_cfg_table;
/* resolution settings */
struct sensor_lib_reg_settings_array *res_settings_array;
struct sensor_lib_out_info_array *out_info_array;
struct sensor_lib_csi_params_array *csi_params_array;
struct sensor_lib_crop_params_array *crop_params_array;
struct sensor_lib_chromatix_array *chromatix_array;
/* video_hdr mode info*/
struct sensor_lib_meta_data_info_array *meta_data_out_info_array;
/* exposure funtion table */
sensor_exposure_table_t *exposure_func_table;
/* exposure info */
sensor_exposure_info_t exposure_info;
/* flag to sync exp and gain */
uint8_t sync_exp_gain;
/* video hdr func table */
sensor_video_hdr_table_t *video_hdr_awb_lsc_func_table;
/* scale size tbl count*/
uint8_t scale_tbl_cnt;
/* function to get scale size tbl*/
int32_t (*get_scale_tbl)(msm_sensor_dimension_t *);
/* supported Scene mode */
uint32_t *sensor_supported_scene_mode;
/* supported effect mode */
uint32_t *sensor_supported_effect_mode;
/* sensor pipeline immediate delay */
uint32_t sensor_max_immediate_frame_delay;
/* library specific data */
void *data;
} sensor_lib_t;