高通camera驱动 mm-camera部分 (一)

        想写一份关于qualcomm 平台 的camera driver 的文档 ,想讲清楚 camera 各个 module 和 camera sensor的各个sub module。

        无论是 camx 还是 mm-camera 结构, 无论是android O 还是 N 东西就那么多,就不同的写法和实现,万变不离其宗。他强由他强,清风拂山岗。一理通百里用说的就是这个道理。目前下面的是基于mm-camera的学习。有啥不对的,欢迎指正。会持续更新。

 主进程 andorid.hardware.camera.orovider@2.4-service 主要调用的库有:

              camera hal库 camera.<平台>.so ,如:高通的camera.qcom.so 在设备 vendor/lib/hw 目录下。

              camera 各个submodule库。

              备注:老版的框架调用的是mm-qcamera-deamon。

大致框架有2种:

1. camx 代码需要高通平台权限下载后放置 vendor 目录下 chi-cdk 同级目录即可。camx (没看过,待完善)对应hal,编译生成camera.qcom.so

  chi-cdk 目录下主要为各个module,eeprom sensor chromatix等主要都是通过配置xml实现的功能。吐槽:修改起来很麻烦

2. mm-camera 代码结构,主要调用的库 libmmcamera2_mct_shimlayer.so 入口函数 mct_shimlayrt_process_module_init 注意看函数注释:this function is the direct call from HAL to init all the modules present in backend.

mct_shimlayrt_module_sensor_init
mct_shimlayrt_module_init

 Old 2. 老版本mm-camera  主进程 mm-qcamera-deamon  main函数所在 server.c  server process 。(2和old2的区别及优点每个overview都重复描述,以后补充)

mm-camera 结构

    |- mct——应该就是camera的引擎 里面包含了引擎、pipiline、bus、module、stream及event等定义及封装。

    |- modules ——  这里面就是划分好的一些模块代码,各模块大致功能如下 :

        |- sensor  ——  sensor 的驱动模块(src模块)

        |- iface     ——  ISP interface模块(inter模块)

        |- isp        —— 主要是ISP的处理,其内部又包含了众多的模块(inter模块)

        |- stats    —— 一些统计算法模块,如3A,ASD,AFD,IS,GRRO等数据统计的处理(sink模块)

        |- pproc   —— post process处理(inter模块)

        |- imglib   —— 主要是图片的一些后端处理,如HDR等(sink模块)

以上各模块内部又包含了众多的模块,具体需要看代码分析。

将camera的所有功能划分为不同的模块,让模块自己来决定自己的事情(高内聚,低耦合),模块需要有统一的接口和格式。模块中有端口,通过端口把模块连接起来,又把模块挂在总线上。每一个端口的连接就是一个流,把这些流用pipeline来管理。每次启动一个camera就创建一个会话,由这个会话来管理此camera的一切事物。对于每一个会话,模块是共享的,它可以是camera的硬件资源也可以是其它资源(如一些软件算法等资源)。

 

module_list:

  • module_sensor_init << sensor module
  • module_iface_init
  • module_isp_init
  • stats_module_init
  • pproc_module_init
  • module_imglib_init

sensor module  (正题) /mmcamera/mm-camera2/media-controller_modules/sensors

sensor模块是众多模块中的一个,主要是由模组的各个硬件模块组成,包括sensor、Flash、Af、EEprom、OIS、CSI、ir_cut、ir_led 等。这个模块主要描述了模组硬件的一些工作原理及部分驱动相关部分。sensors目录及子目录下的每个module文件夹包含的都是当前目录的功能实现。

   在前面讲到的server process 或者 mct shimlayer 中提到,调用开始后会初始化各个模块,其中就包括sensor模块,sensor初始化入口函数即为module_sensor_init(...)。这个函数将创建sensor模块并返回其指针,另外将创建它的端口,填充一些功能函数等。它的主要执行流程如下:

    1.创建sensor的MCT module。  —— mct_module_create(name)

        创建完之后填充set mode、query mode、start session、stop session及set session data五个接口函数。

    2.创建module_sensro_ctrl_t结构体,此结构体包含bundle信息,用来构建前面提到的模块树(方便添加、遍历等操作)。

    3.sensor模块是source模块,所以其numsinkports应该设置为0。

    4.eebin相关的操作  << eebin_interface_init

    5.sensor的probe操作,用来probe有效的sensor。

    6.填入所有已probe到sensor的信息。 << sensor_init_probe

    7.填入所以sensor的其它信息(Actuator,Flash,CSID,OIS等)module_sensor_find_other_subdev

    8.初始化sensor模块。 <<  module_sensor_subinit(初始化子模块函数列表)

    9.创建基于CID info的端口 port_sensor_create

    10.初始化eeprom module_sensor_init_eeprom

          (1)open the eeprom sub module

         (2)load eeprom library   

         (3)powerup and parse the eeprom

         (4)read the eeprom data from kernel

        (5)format the cal data

        (6)close the eprom sub module

   11.创建chromatix的管理 module_sensor_init_chromatix

 

sub_module_init << 下列是每个子模块

  • sensor_sub_module_init << sensor/module/sensor.c (camera sensor driver)
  • chromatix_sub_module_init
  • actuator_sub_module_init
  • eeprom_sub_module_init << eeprom/module/eeprom.c (eeprom driver)
  • led_flash_sub_module_init
  • csiphy_sub_module_init
  • csid_sub_moduLe init 
  • ois_ sub_module_init
  • external_sub_module_init
  • ir_led_sub_module_init
  • ir_cut_sub_module_init
  • laser_led_sub_module_init 

sensor driver

/vendor/qcom/proprietary/mm-camera/ mm-camera2/media-controller/modules/sensors/sensor_libs/.

libs 下面的文件

Android.mk - 包含构建规则和包含路径。

<sensor> _lib.c - 包含传感器特定的逻辑和功能。

<sensor> _lib.h - 包含传感器配置和传感器处理器结构。

在power_setting_array中可以添加powerup和powerdown序列 camera_power_setting_array结构体。

.power_setting_array = {

.power_setting = power_setting,

.size = ARRAY_SIZE(power_setting),

},

power_setting指向一个数组,其中包含要用于GPIO / CLK / VREG的信息配置每个传感器。

static struct camera_power_setting power_setting[] = {

{

.seq_type = SENSOR_VREG,

.seq_val = CAM_VDIG,

.config_val = 0,

.delay = 0, //this delay is in ms

},

{

.seq_type = SENSOR_VREG,

.seq_val = CAM_VANA,

.config_val = 0,

.delay = 0, //this delay is in ms

},

这个结构用在内核中的msm_camera_power_up()中来配置传感器启动顺序。

sensor_init_params包含相机模块配置。

80-NV354-3 Rev. A

modes_supported - 屏幕显示支持的模式(2D,3D)。

position - 设置设备上的传感器位置(背面或前置摄像头)。

sensor_mount_angle - 设置相对于显示器的相机安装角度。

 

typedef struct {

sensor_output_format_t output_format;

sensor_connection_mode_t connection_mode;

sensor_raw_output_t raw_output;

sensor_filter_arrangement filter_arrangement;

} sensor_output_t;

output_format - 传感器为RAW帧传送BAYER(SENSOR_BAYER)。

connection_mode - 传输接口 - MIPI(SENSOR_MIPI_CSI)或并行。

raw_output - 传输的数据类型 - RAW10(SENSOR_10_BIT_DIRECT),

RAW12(SENSOR_12_BIT_DIRECT),RAW8(SENSOR_8_BIT_DIRECT),DPCM8等

filter_arrangement - 由传感器流出的帧的拜耳色彩图案

struct sensor_output_reg_addr_t {

unsigned short x_output;

unsigned short y_output;

unsigned short line_length_pclk;

unsigned short frame_length_lines;

};

x_output - x_output寄存器的地址。 该寄存器包含每个活动像素的数量在传感器输出中。

y_output - y_output寄存器的地址。 该寄存器包含每行的活动行数框中传感器输出。

line_length_pclk - line_length_pclk寄存器的地址。 该寄存器包含的号码传感器输出中每行的总像素数。

frame_length_lines - y_output寄存器的地址。 该寄存器包含总数传感器输出中每帧的行数。

struct sensor_exp_gain_info_t {

unsigned short coarse_int_time_addr;

unsigned short global_gain_addr;

unsigned short vert_offset;

};

coarse_int_time_addr。 该寄存器包含帧曝光次数。

global_gain_addr。 该寄存器包含帧模拟增益。 其值由传感器特定功能计算。

vert_offset - 包含max_coarse_integration_margin的值,它是一个传感器 - 具体价值。 它是曝光和帧长度之间的最大值。 曝光不能大于帧长度减去vert_offset。

max_exp <= frame_length – vert_offset

typedef struct {

float min_gain;

float max_gain;

float min_analog_gain;

float max_linecount;

}sensor_aec_data_t;

min_gain - 以标准化单位(1.00x)设置传感器增益的最低可接受值。如果没有另外指定,设置为1.00x。

max_gain - 以标准化单位(1.00x)设置增益的最高可接受值。 这是结果的模拟和数字增益。

max_analog_gain - 以标准化单位(1.00x)设置传感器的模拟增益的最高可接受值。 如果传感器没有数字增益,max_analog_gain和max_gain应该相等。

max_linecount - 设置传感器曝光的最高可接受值。 此值取决于rough_integration_time寄存器分辨率和max_coarse_integration_margin(在vert_offset中设置)。

typedef struct {

float focal_length;

float pix_size;

float f_number;

float total_f_dist;

float hor_view_angle;

float ver_view_angle;

sensor_sensing_method_type_t sensing_method;

float crop_factor; //depends on sensor physical dimentions

float min_focus_distance;

} sensor_lens_info_t;

focal_length - 设置镜头焦距。

pix_size - 设置镜头单元格尺寸。

f_number - 设置镜头的F数。

Total_f_dist - 设置总焦距。 值以米为单位。

hor_view_angle - 设置镜头的水平视角。 值以度为单位。

ver_view_angle - 设置镜头的水平视角。 值以度为单位。

sensing_method - 设置感应方式。 如果方法未知,请设置为

SENSOR_SMETHOD_NOT_DEFINED。

crop_factor - 设置镜头裁剪系数。 该值取决于镜头和传感器的物理尺寸,显示镜头是否从传感器矩阵中裁出。

min_focus_distance - 设置镜头最小移动步长。 如果镜头没有特殊的限制,设置为0.1

 

typedef struct {

float pix_width;

float pix_height;

}sensor_physical_dimensions_t;

包含有关传感器颜色的物理尺寸的信息矩阵。

pix_width - 以毫米为单位设置传感器像素阵列宽度。 (单元大小*有效像素宽度)

pix_height - 以毫米为单位设置传感器像素阵列高度。 (单元格大小*有效像素高度)

 

typedef struct {

sensor_dimension_t active_array_size;

unsigned short left_dummy;

unsigned short right_dummy;

unsigned short top_dummy;

unsigned short bottom_dummy;

} sensor_imaging_pixel_array_size;

typedef struct {

int width;

int height;

} sensor_dimention_t;

active_array_size.width - 以像素数设置传感器有源像素阵列宽度。

active_array_size.height - 设置传感器有源像素阵列高度的行数。

left_dummy - 在左侧的有效和有效像素阵列之间设置传感器缓冲区。 该值为像素数。

right_dummy - 在右侧的有效和有效像素阵列之间设置传感器缓冲区。 该值为像素数。

top_dummy - 在顶部的有效和有效像素阵列之间设置传感器缓冲区。 该值为行数。

bottom_dummy - 在底部的有效和有效像素阵列之间设置传感器缓冲区。 该值为行数。

 

typedef struct {

unsigned short white_level;

unsigned short r_pedestal;

unsigned short gr_pedestal;

unsigned short gb_pedestal;

unsigned short b_pedestal;

} sensor_color_level_info;

white_level - 将传感器DAC的值设置为白色。 这通常是最大可能的值DAC可以输出(1023为RAW10)。

r_pedestal - 设置红色通道的黑色电平/数据基座。 该值用于RAW10数据。 对于RAW12乘以4。

gr_pedestal - 设置绿色(红线)通道的黑色电平/数据基座。 值为RAW10数据。 对于RAW12乘以4。

gr_pedestal - 设置绿色(蓝线)通道的黑色电平/数据基座。 值为RAW10数据。 对于RAW12乘以4。

b_pedestal - 设置蓝色通道的黑色电平/数据基座。 该值用于RAW10数据。 对于RAW12乘以4。

 

start_settings - 寄存器设置命令传感器开始流出帧。

stop_settings - 寄存器设置命令传感器停止流出帧。

groupon_setting - 寄存器设置命令传感器设置组参数保持逻辑。

groupoff_settings - 寄存器设置命令传感器释放组参数保持逻辑。

embedded_data_enable_settings - 寄存器设置以命令传感器启用流式传输嵌入式数据。

embedded_data_disable_settings - 寄存器设置命令传感器禁用流出嵌入式数据。

 

struct camera_i2c_reg_setting {

struct camera_i2c_reg_array *reg_setting;

unsigned short size;

enum camera_i2c_reg_addr_type addr_type;

enum camera_i2c_data_type data_type;

unsigned short delay;

};

struct camera_i2c_reg_array {

unsigned short reg_addr;

unsigned short reg_data;

unsigned int delay;

};

size - 设置当前配置中设置的寄存器编号。

addr_type - 设置I2C寄存器地址长度。

data_type - 设置I2C寄存器数据长度。

delay - 设置配置完成后的等待延迟(以ms为单位)。

reg_setting.reg_addr - 设置要更新的寄存器的传感器寄存器地址。

reg_setting.reg_data - 设置需要写入传感器寄存器的数据。

reg_setting.delay - 设置注册配置完成后的等待延迟(以ms为单位)。

 

传感器分辨率设置

struct sensor_lib_reg_settings_array {

struct camera_i2c_reg_setting reg_settings[MAX_RESOLUTION_MODES];

unsigned int size;

};

传感器分辨率配置表

struct sensor_lib_out_info_array {

/* sensor output for each resolutions */

struct sensor_lib_out_info_t out_info[MAX_RESOLUTION_MODES];

/* Number of valid entries in out_info array */

unsigned short size;

};

struct sensor_lib_out_info_t {

unsigned short x_output;

unsigned short y_output;

unsigned short line_length_pclk;

unsigned short frame_length_lines;

unsigned int vt_pixel_clk;

unsigned int op_pixel_clk;

unsigned short binning_factor;

float min_fps;

float max_fps;

unsigned int mode;

unsigned int offset_x;

unsigned int offset_y;

unsigned int scale_factor;

};

size - 设置传感器模式配置的数量。大小应等于可用的配置,不能大于MAX_RESOLUTION_MODES。

out_info.x_output - 设置每行传感器输出的有效像素数。该值是像素数。

out_info.y_output - 设置每帧传感器输出的有效线数。该值是行数。

out_info.line_length_pclk - 设置每行传感器输出的像素总数。这包括有源像素和水平消隐。该值是像素数。

out_info.frame_length_lines - 设置每帧传感器输出的总线数。这包括有效行和垂直消隐。该值是行数。

out_info.vt_pixel_clk - 设置由传感器内部PLL模块生成的视频域定时时钟值。要计算其值,请使用外部时钟(EXTCLK)频率和PLL设置。传感器使用此时钟进行多项内部任务,其值控制多个传感器参数 - 快门/曝光时间,帧速率,传感器内部ISP处理等。

out_info.op_pixel_clk - 设置由传感器内部PLL模块生成的输出域定时时钟值。 要计算其值,请使用外部时钟(EXTCLK)频率和PLL设置。 传感器使用此时钟作为其输出模块。 该时钟用作MIPI / CSI_Tx速度的基础。

struct sensor_csiphy_params {

unsigned char lane_cnt;

unsigned char settle_cnt;

unsigned short lane_mask;

unsigned char combo_mode;

unsigned char csid_core;

unsigned int csiphy_clk;

};

lane_cnt - 设置CSI2车道数。 根据传感器模式配置,可以使用两个或四个通道进行流出。

sett_cnt - 对于CSI_Tx(传感器)和CRI_Rx(设备)正常工作,需要在它们之间同步的时间段。 这个时间被设置为定时器时钟滴答的数量。 它必须在由公式计算的MIN和MAX值之间:

MIN [Settle count * T(Timer clock)] > T(HS_SETTLE)_MIN

MAX [Settle count * T(Timer clock)] < T(HS-PREPARE)+T(HS_ZERO) - 4*T(Timer clock)

lane_mask - 设置在当前配置中使用哪些CSI2通道。 该值是标志的组合。

 

struct sensor_lib_crop_params_array{

struct sensor_crop_parms_t crop_params[MAX_RESOLUTION_MODES];

unsigned short size;

};

struct sensor_crop_parms_t {

unsigned short top_crop;

unsigned short bottom_crop;

unsigned short left_crop;

unsigned short right_crop;

};

crop_

params.top_crop - 从当前模式的顶端设置裁剪。

crop_params.bottom_crop - 从当前模式的底部设置裁剪。

crop_params.left_crop - 从当前模式的左侧设置裁剪。

crop_params.right_crop - 从当前模式的右侧设置裁剪。

 

struct sensor_lib_chromatix_array {

struct sensor_lib_chromatix_t sensor_lib_chromatix[MAX_RESOLUTION_MODES];

unsigned short size;

};

struct sensor_lib_chromatix_t {

char *common_chromatix;

char *camera_preview_chromatix;

char *camera_snapshot_chromatix;

char *camcorder_chromatix;

char *liveshot_chromatix;

char *cpp_chromatix;

char *cpp_snapchromatix;

char *cpp_videochromatix;

char *cpp_liveshotchromatix;

char *postproc_chromatix;

};

sensor_lib_chromatix.common_chromatix - 为当前传感器模式/分辨率设置指向公共(VFE)chromatix的指针。

sensor_lib_chromatix.camera_preview_chromatix - 设置指针以预览chromatix

用于当前的传感器模式/分辨率。当模式用于图像预览时,它被加载。

sensor_lib_chromatix.camera_snapshot_chromatix - 为当前传感器模式/分辨率设置指向快照chromatix的指针。当模式用于快照时加载。

sensor_lib_chromatix.camcorder_chromatix - 为当前传感器模式/分辨率设置指向摄像机chromatix的指针。当模式用于视频预览/录制时,它被加载。

sensor_lib_chromatix.liveshot_chromatix - 设置指向livehot chromatix的指针电流传感器模式/分辨率。在拍摄时拍摄(快照,录像)。

sensor_lib_chromatix.cpp_chromatix - 为当前传感器模式/分辨率设置指向cpp chromatix的指针。当模式用于图像预览时,将被加载。

sensor_lib_chromatix.cpp_snapchromatix - 为当前传感器模式/分辨率设置指向cpp snapshot chromatix的指针。当模式用于快照时加载。

sensor_lib_chromatix.cpp_videochromatix - 为当前传感器模式/分辨率设置指向cpp video chromatix的指针。当模式用于视频预览/录制时,它被加载。

sensor_lib_chromatix.cpp_liveshotchromatix - 设置指向cpp的照片chromatix

用于当前的传感器模式/分辨率。在拍摄时拍摄(快照,录像)。

sensor_lib_chromatix.postproc_chromatix - 为当前传感器模式/分辨率设置指向后处理chromatix的指针。它用于软件后处理。

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
高通Camera Tuning是指高通公司针对其移动平台的相机功能进行的优化调试工作。高通作为一家领先的移动芯片提供商,致力于提供优质的移动体验,其中相机功能在用户体验中起着重要的作用。 首先,高通Camera Tuning在硬件层面进行了优化。高通的芯片设计了专门的相机引擎,支持多种相机传感器,能够提供更强大的图像处理和摄像功能。此外,高通还在芯片层面解决了相机模块与主芯片之间的协作问题,提高了相机的响应速度和稳定性。 其次,高通Camera Tuning在软件层面进行了优化。高通开发了一系列的相机驱动程序和图像处理算法,通过对白平衡、曝光、对焦等参数进行调试,提高了照片的颜色还原度和曝光平衡性。此外,高通还提供了丰富的相机软件接口,使第三方开发者能够充分发挥相机模块的潜力。 最后,高通Camera Tuning还积极与设备制造商合作,共同打造优秀的相机系统。高通提供了相机调试工具和技术支持,帮助制造商在硬件设计和软件调试方面优化设备的相机性能。通过与高通的合作,设备制造商能够提供更出色的相机体验,满足用户对于拍照的需求。 总的来说,高通Camera Tuning通过在硬件和软件层面进行优化,以及与设备制造商的合作,致力于提供卓越的移动相机体验。这项工作不仅提高了相机的性能和功能,还使用户能够轻松拍摄高质量的照片和视频,享受更好的移动摄影体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值