1. 程式人生 > >高通Camera驅動分析【轉】

高通Camera驅動分析【轉】

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_type seq_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_t position; //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_360 360         //360度
/* Sensor mount angle. */
#define SENSOR_MOUNTANGLE_0 0 //0度
#define SENSOR_MOUNTANGLE_90 90 //90度
#define SENSOR_MOUNTANGLE_180 180         //180度

#define SENSOR_MOUNTANGLE_270 270         //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_t output_format; //輸出格式
sensor_connection_mode_t connection_mode; //連線模式
sensor_raw_output_t raw_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 Bayer.htm */

#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') //BGGR 8bit
#define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G','B','R','G') //GBRG 8bit
#define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G','R','B','G') //GRBG 8bit
#define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R','G','G','B') //RGGB 8bit
#define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B','G','1','0') //BGGR 10bit
#define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G','B','1','0') //GBRG 10bit
#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B','A','1','0') //GRBG 10bit
#define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R','G','1','0') //RGGB 10bit
#define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B','G','1','2') //BGGR 12bit
#define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G','B','1','2') //GBRG 12bit
#define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B','A','1','2') //GRBG 12bit
#define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R','G','1','2') //RGGB 12bit

畫素格式的值MSM_V4L2_PIX_FMT_META是巨集定義在media/msm_cam_sensor.h中:

#define MSM_V4L2_PIX_FMT_META v4l2_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 的資料率是 3002 = 600Mhz. 因此, 總資料率為 6004= 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_type addr_type; //地址型別
enum msm_camera_i2c_data_type data_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;
};

其資料成員都是字元型指標,用來記錄不同解析度下不同模式的庫檔名稱。

  1. 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_DATA 0x12
#define CSI_RESERVED_DATA_0 0x13
#define CSI_YUV422_8 0x1E
#define CSI_RAW8 0x2A
#define CSI_RAW10 0x2B
#define CSI_RAW12 0x2C


#define CSI_DECODE_6BIT 0
#define CSI_DECODE_8BIT 1
#define CSI_DECODE_10BIT 2
#define CSI_DECODE_DPCM_10_8_10 5

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;