高通mm-camera平台 Camera移植
高通Cam-X平台 Camera移植
注:此文档以在高通8916平台移植OV5648为例,给大家讲解Android SOC的底层Camera。
Reference:
- https://blog.csdn.net/weijory/article/details/53811140
- https://www.jianshu.com/p/70bdb79e5026
- 80-p9301-97_l_camera_sensor_driver_bringup_guide
介绍
camera原理:外部光线穿过lens后,经过color filter滤波后照射到sensor面上,sensor将从lens上传到过来的光线转换成电信号,再通过内部的AD转换为数字信号,如果sensor没有集成DSP,则通过DVP的方式传输到baseband,此时的数据格式是RAW DATA。必须通过平台的isp来处理。如果集成了DSP,这RAW DATA数据经过AWB,color matrix,lens shading,gamma,sharpness,AE和de-noise处理后输出YUV或者RGB格式的数据。最后会由CPU送到framebuffer中进行显示。
我们所说的Camera实际上是指Camera
模组,包括以下部分:
- 感光元件:Sensor
- 对焦马达:Actuator
- 储存介质:EEPROM
- 闪光灯:Flash
- 总线:CSIPHY、CSID
高通平台的Camera方案
高通Camera的调试主要是以Senor的bring-up以及tuning。注意这里的Sensor是在Camera中,而不是传统意义上的Senor(例如三轴传感器等)。
顺带提一下,高通平台的Camera架构从以前用的mm-camera
转向camx-chi
,完全是两样不同的东西:软件架构不同、代码位置不同。
CamX架构:
但是如果没有特殊的客制化需求,一般不在框架中进行修改。后面我们会专门介绍这个部分。
准备
准备资料
调试之前,需要有下列资料:
文档清单 |
---|
Sensor 以及 AF 的 数据手册 |
供应商针对高通 Chromatix 工具调试好的Chromatix代码 |
AF的用户空间驱动、以及AF效果代码 |
EEPROM用户空间驱动和EEPROM效果代码 |
确定硬件
MIPI相关:MIPI CLK 以及 DATA 线
复位:下电PWDW 以及 Reset
供电:AVDD(2.8V)、DVDD(1.2V)、IOVDD(1.8V)、AFVDD(2.8V)
通信相关:I2C等通信总线,具体根据模组的情况以及SOC平台来决定。
高通 的CCI 接口,不能作为普通 i2c 使用,只能连接 camera。
Cam-x平台添加驱动
Kernel 部分
Device Tree
包括Sensor、GPIO、供电以及驱动控制所需的定义等
1、Sensor:
- 供电:PMIC
- GPIO、Pinctrl
2、AF:供电、最大最小电压以及工作模式
3、EEPROM
4、闪光灯
代码路径:kernel/arch/arm/boot/dts/qcom
文件名:msm8916-camera-sensor-qrd-skui.dtsi
需添加的代码:
qcom,camera@6a { //这需要与1.3节中添加的Clock地址向对应。
cell-index = <0>; //唯一标识,用来区分多个摄像头。
compatible = "ovti,ov5648";// 这要与驱动代码中的名字相对应,即:static const struct of_device_id ov5648_dt_match[] = {..
{
.compatible = "ovti,ov5648",
.data = &ov5648_s_ctrl
},
reg = <0x6a 0x0>; //// 这需要与1.3节中添加的Clock地址向对应。
qcom,slave-id = <0x6c 0x300a 0x5648>;
// 0x6c为摄像头的I2C地址,0x300a为摄像头存放ID的寄存器地址,0x5648为摄像头的ID,这都需要查看datasheet或直接问模组厂。
qcom,csiphy-sd-index = <1>; // 用于接收传感器数据的csiphy实例,可以配置的值:0,1,2
qcom,csid-sd-index = <1>; // 用于接收传感器数据的csid核心实例,可以配置的值:0,1,2
// 以上两个设置需要查看主板原理图,看主板上摄像头是接在CSI0还是CSI1上的,一般后摄像头都会接到CSI0上,前摄像头会接在CSI1上。
qcom,mount-angle = <270>; // 摄像头在设备上的物理安装角度(sensor raw图默认的方向都是90或者270!)
// 该参数为摄像头预览界面的方向,如果预览方向有被旋转,可以通过修改这个参数进行修正。
qcom,eeprom-src = <&eeprom0>; // 如果支持otp(eeprom)的话,就配置成各种的eeprom节点,否则不配置。
qcom,actuator-src = <&actuator0>; // 如果支持马达的话,就配置成各自的马达节点,否则不配置。
qcom,led-flash-src = <&led_flash0>; // 如果支持闪光灯的话,就配置成各自的闪光灯节点,否则不配置。
qcom,sensor-name = "ov5648_oty5f03";
// 这个对应vendor中lib文件夹的文件名,具体可参看2.2节。
cam_vdig-supply = <&pm8916_l2>;
cam_vana-supply = <&pm8916_l17>;
cam_vio-supply = <&pm8916_l6>;
// 以上三个参数分别对应DVDD(vdig)、AVDD(vana)、DOVDD(vio)三个电压,具体所接的是哪路电压,需要参看主板原理图。
qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
qcom,cam-vreg-type = <0 1 0>;
qcom,cam-vreg-min-voltage = <1200000 0 2850000>;
qcom,cam-vreg-max-voltage = <1200000 0 2850000>;
qcom,cam-vreg-op-mode = <200000 0 80000>;
//这五个配置要分别与上面的三个电压一一对应(按照从上到下的顺序),如果有对焦马达的还要在后面填一路AF的电压,如下所示:
cam_vaf-supply = <&pm8916_l10>; // avdd供电,是否是要配置,配置成哪路系统供电,需要和硬件沟通!
qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", "cam_vaf";
/* 配置sensor需要的所有电源。
可配置选项:"cam_vdig", "cam_vana", "cam_vio", "cam_vaf"
分别代表含义:dvdd,avdd,iovdd,af供电
不一定要全部配置,用到哪路配哪路,有些电路硬件自己拉高了,具体跟硬件沟通。
*/
qcom,cam-vreg-type = <0 1 0 0>; // 指定用于此sensor的电源类型,0表示ldo电源,1表示lvs电源。默认配0.
qcom,cam-vreg-min-voltage = <1200000 0 2850000 2800000>;
qcom,cam-vreg-max-voltage = <1200000 0 2850000 2800000>; // 供电电源的最大值,单位mV
qcom,cam-vreg-op-mode = <200000 0 80000 100000>; // 供电电源的最佳电压水平
// 上述电压值分别是按`qcom,cam-vreg-name = "cam_vdig","cam_vio","cam_vana","cam_vaf";` 顺序一一对应的!
pinctrl-names = "cam_default", "cam_suspend"; // 默认就这么配置,前面代表clk,后面代表reset脚和standby脚,唤醒作用。
pinctrl-0 = <&cam_sensor_mclk1_default &cam_sensor_front_default>; // 按照顺序一一对应的
pinctrl-1 = <&cam_sensor_mclk1_sleep &cam_sensor_front_sleep>; // 按照顺序一一对应的
// 以上这两个需要区分的就是前后摄像头的配置不一样,上面这种配置是前摄像头的配置,后摄像头的配置如下所示:
/* 如果是后摄像头,配置如下所示
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>;
pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
*/
gpios = <&msm_gpio 27 0>, <&msm_gpio 28 0>, <&msm_gpio 33 0>, <&msm_gpio 119 0>;
qcom,gpio-reset = <1>; // 传感器 reset脚的索引
qcom,gpio-standby = <2>; // 传感器 standby脚的索引
qcom,gpio-vana = <3>;
qcom,gpio-req-tbl-num = <0 1 2 3>; // mclk,reset,stanby的索引;
// 由于mclk为0,qcom,gpio-reset = <1>,qcom,gpio-standby = <2>;因此配置成 <0,1,2,3>
qcom,gpio-req-tbl-flags = <1 0 0 0>; // gpio的方向,mclk为1,表示输出,reset、standby和vana都为0,表示输入。
qcom,gpio-req-tbl-label = "CAMIF_MCLK", "CAM_RESET", "CAM_STANDBY", "CAM_VANA";
/* gpio的名称。
常用值:
"CAMIF_MCLK", "CAM_RESET","CAM_STANDBY";
"CAMIF_MCLK0", "CAM_RESET0","CAM_STANDBY0";
"CAMIF_MCLK1", "CAM_RESET1","CAM_STANDBY1";
"CAMIF_MCLK2", "CAM_RESET2","CAM_STANDBY2";
*/
// 上面这部分主要是配置GPIO口,这里需要注意的是gpios的数组要与gpio-req-tbl-label的名字一一对应,即gpio 27对应CAMIF_MCLK,而reset 、standby 、vana 分别对应gpios数组中的第1、2、3参数,gpio-req-tbl-num也对应于gpios中数组的标号。
qcom,gpio-set-tbl-num = <1 1>;
qcom,gpio-set-tbl-flags = <0 2>;
qcom,gpio-set-tbl-delay = <1000 4000>;
// 这三个参数是前摄像头的固定模式,后摄像头不需要这个设置,在配置后摄像头时直接去掉即可。
qcom,csi-lane-assign = <0x4320>;
// 该参数为主芯片mipi Lane个数配置寄存器。
qcom,csi-lane-mask = <0x3>;
// 该参数为配置mipi Lane个数,0x3为1组数据线加1组时钟线,0x07为2组数据线加1组时钟线,0x1f为4组数据线加1主时钟线。
qcom,sensor-position = <1>;
// 该参数,如果添加的是前摄像头需要配置成1,如果是后摄像头需要配置成0
qcom,sensor-mode = <1>; // 传感器模式支持
/*
0 -> back camera 2D
1 -> front camera 2D
2 -> back camera 3D
3 -> back camera int 3D
*/
qcom,cci-master = <0>; // sensor使用的master id。可选值: `0 -> MASTER 0`、`1 -> MASTER 1`
status = "ok";
clocks = <&clock_gcc clk_mclk1_clk_src>, <&clock_gcc clk_gcc_camss_mclk1_clk>; // 设备使用的时钟
clock-names = "cam_src_clk", "cam_clk"; // 设备所需时钟的名称
// 上面两个Clocks和Clock-names是前摄像头的配置,后摄像头的配置如下:
/*
clocks = <&clock_gcc clk_mclk0_clk_src>, <&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";
*/
};
另外如果有对焦马达还需要修改对焦马达的地址,如下所示:
actuator0: qcom,actuator@6e {
cell-index = <3>;
reg = <0x18>;
compatible = "qcom,actuator";
qcom,cci-master = <0>;
};
编译系统
代码路径:kernel/arch/arm/configs
文件名:msm8916_defconfig
和msm8916-perf_defconfig
需添加的代码:CONFIG_OV5648=y
Clock
代码路径:kernel/arch/arm/mach-msm
文件名:clock-8226.c
需添加的代码:
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6f.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk1_clk_src.c, "90.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6d.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6a.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6c.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "20.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "78.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6f.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk1_clk.c, "90.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6d.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6a.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6c.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "78.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "20.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "62.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "62.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "0.qcom,camera"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "1.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "0.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "1.qcom,camera"),
需要注意的是这里的标示(如:6a)不能重复,并且添加的时候需要同时添加一组代码。
添加编译系统
Kconfig和Makefile文件中添加对应IC代码:
代码路径:
- Kconfig:
kernel/drivers/media/platform/msm/camera_v2/Kconfig
- Makefile:
kernel/drivers/media/platform/msm/camera_v2/sensor/Makefile
添加Kconfig
config OV5648
bool "Sensor OV5648 (BAYER 5M)"
depends on MSMB_CAMERA
—help—
OmniVision 5 MP Bayer Sensor, only use 1 mipi lane,
preview set to 1296*972 at 30 fps,
snapshot set to 2592*1944 at 12 fps,
This sensor driver does not support auto focus.
添加Makefile
obj-$(CONFIG_OV5648) = ov5648.o
Camera驱动
代码路径:kernel/drivers/media/platform/msm/camera_v2sensor
文件名:ov5648.c
需添加的代码
该部分主要要注意电源的设置,它包括传感器电源信息,IO控制和Mclk。
通常情况下,无需修改该部分内容,因为大部分配置已在设备树文件中完成;但可以修改.delay = 0 字段来和时间匹配。
static struct msm_sensor_power_setting ov5648_power_setting[] = {
{
.seq_type = SENSOR_VREG,
.seq_val = CAM_VIO,
.config_val = 0,
.delay = 0,
},
{
.seq_type = SENSOR_VREG,
.seq_val = CAM_VAF,
.config_val = 0,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_VDIG,
.config_val = GPIO_OUT_LOW,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_VDIG,
.config_val = GPIO_OUT_HIGH,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_VANA,
.config_val = GPIO_OUT_HIGH,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_STANDBY,
.config_val = GPIO_OUT_LOW,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_STANDBY,
.config_val = GPIO_OUT_HIGH,
.delay = 10,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_RESET,
.config_val = GPIO_OUT_LOW,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_RESET,
.config_val = GPIO_OUT_HIGH,
.delay = 10,
},
{
.seq_type = SENSOR_CLK,
.seq_val = SENSOR_CAM_MCLK,
.config_val = 23880000,
.delay = 10,
},
{
.seq_type = SENSOR_I2C_MUX,
.seq_val = 0,
.config_val = 0,
.delay = 0,
},
};
static struct msm_sensor_power_setting ov5648_power_down_setting[] = {
{
.seq_type = SENSOR_VREG,
.seq_val = CAM_VIO,
.config_val = 0,
.delay = 0,
},
{
.seq_type = SENSOR_VREG,
.seq_val = CAM_VAF,
.config_val = 0,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_VANA,
.config_val = GPIO_OUT_LOW,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_STANDBY,
.config_val = GPIO_OUT_LOW,
.delay = 5,
},
{
.seq_type = SENSOR_GPIO,
.seq_val = SENSOR_GPIO_RESET,
.config_val = GPIO_OUT_LOW,
.delay = 10,
},
{
.seq_type = SENSOR_CLK,
.seq_val = SENSOR_CAM_MCLK,
.config_val = 23880000,
.delay = 10,
},
{
.seq_type = SENSOR_I2C_MUX,
.seq_val = 0,
.config_val = 0,
.delay = 0,
},
};
Vendor部分
Makefile
在Makefile
文件中添加IC代码:
代码路径:qcom/proprietary/common/config
文件名:device-xx-vendor.mk
需添加的代码:
MM_CAMERA = libchromatix_ov5648_oty5f03_common
MM_CAMERA = libchromatix_ov5648_oty5f03_default_video
MM_CAMERA = libchromatix_ov5648_oty5f03_preview
MM_CAMERA = libchromatix_ov5648_oty5f03_snapshot
MM_CAMERA = libchromatix_ov5648_oty5f03_zsl
MM_CAMERA = libmmcamera_ov5648_oty5f03
注意:如果这里没有添加以上代码,在编译的时候就不会生成相应的so文件。
这so文件可以在src/LINUX/android/out/target/product/msm8916_32/system/vendor/lib
目录下找到:
libchromatix_ov5648_oty5f03_common.so
libchromatix_ov5648_oty5f03_default_video.so
libchromatix_ov5648_oty5f03_preview.so
libchromatix_ov5648_oty5f03_snapshot.so
libchromatix_ov5648_oty5f03_zsl.so
libmmcamera_ov5648_oty5f03.so
Lib驱动
代码路径:
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs
文件夹名:ov5648_oty5f03
需添加的代码如下。
移植相机接口配置
这部分内容定义了传感器接口配置,包括I2C和MIPI。请确认设置不会和dtsi文件中的类似内容冲突。
static struct msm_camera_sensor_slave_info sensor_slave_info = {
.camera_id = CAMERA_0,
.slave_addr = 0x6c,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {
.sensor_id_reg_addr = 0x300a,
.sensor_id = 0x5648,
},
.power_setting_array = {
.power_setting = ov5648_oty5f03_power_setting,
.size = ARRAY_SIZE(ov5648_oty5f03_power_setting),
.power_down_setting = ov5648_oty5f03_power_down_setting,
.size_down = ARRAY_SIZE(ov5648_oty5f03_power_down_setting),
},
};
static sensor_output_t sensor_output = {
.output_format = SENSOR_BAYER,
.connection_mode = SENSOR_MIPI_CSI,
.raw_output = SENSOR_10_BIT_DIRECT,
};
#ifndef VFE_40
static struct csi_lane_params_t csi_lane_params = {
.csi_lane_assign = 0xE4,
.csi_lane_mask = 0x3,
.csi_if = 1,
.csid_core = {0},
.csi_phy_sel = 0,
};
#else
static struct csi_lane_params_t csi_lane_params = {
.csi_lane_assign = 0x4320,
.csi_lane_mask = 0x3,
.csi_if = 1,
.csid_core = {0},
.csi_phy_sel = 1,
};
#endif
移植传感器输出配置
这部分内容介绍了传感器不同模式的配置和设置,包含各模式的I2C 寄存器设备、CSI参数、crop参数、传感器输出信息和chormatix数组。这些配置的数组大小应和传感器支持的模式种类相同。
static struct msm_camera_i2c_reg_setting res_settings[] = {
{
.reg_setting = res0_reg_array,
.size = ARRAY_SIZE(res0_reg_array),
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.data_type = MSM_CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
{
.reg_setting = res1_reg_array,
.size = ARRAY_SIZE(res1_reg_array),
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.data_type = MSM_CAMERA_I2C_BYTE_DATA,
.delay = 0,
},
};
// ……
static struct msm_camera_csi2_params *csi_params[] = {
&ov5648_oty5f03_csi_params,
&ov5648_oty5f03_csi_params,
};
// ……
static struct sensor_crop_parms_t crop_params[] = {
{0, 0, 0, 0},
{0, 0, 0, 0},
};
// ……
static struct sensor_lib_out_info_t sensor_out_info[] = {
{
.x_output = 2592,
.y_output = 1944,
.line_length_pclk = 2816,
.frame_length_lines = 2380,
.vt_pixel_clk = 84000000,
.op_pixel_clk = 84000000,
.binning_factor = 1,
.max_fps = 12.5,
.min_fps = 7.5,
.mode = SENSOR_DEFAULT_MODE,
},
{
.x_output = 1296,
.y_output = 972,
.line_length_pclk = 1408,
.frame_length_lines = 992,
.vt_pixel_clk = 42000000,
.op_pixel_clk = 42000000,
.binning_factor = 1,
.max_fps = 30.0,
.min_fps = 7.5,
.mode = SENSOR_DEFAULT_MODE,
},
};
// ……
static struct sensor_lib_chromatix_t ov5648_oty5f03_chromatix[] = {
{
.common_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(common),
.camera_preview_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(snapshot),
.camera_snapshot_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(snapshot),
.camcorder_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(default_video),
},
{
.common_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(common),
.camera_preview_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(preview),
.camera_snapshot_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(preview),
.camcorder_chromatix = OV5648_OTY5F03_LOAD_CHROMATIX(default_video),
},
};
镜头信息移植
相机处理流程(比如曝光计算)需要镜头信息。因此,以下结构需添加正确的镜头信息。
static sensor_lens_info_t default_lens_info = {
.focal_length = 2.37,
.pix_size = 1.4,
.f_number = 2.4,
.total_f_dist = 1.97,
.hor_view_angle = 70.24,
.ver_view_angle = 52.68,
};
曝光配置移植
通常情况下,不同传感器有不同的曝光控制方式。所以,当传感器打开后,需移植曝光配置以成功调试传感器的曝光控制。
包括以下函数:
ov5648_real_to_register_gain – 将实际逻辑增益转换为寄存器值。
ov5648_register_to_real_gain – 将寄存器值转换成真实的逻辑增益。
ov5648_calculate_exposure – 获取曝光时间和增益的另一个曝光配置.
ov5648_fill_exposure_array – 准备另一个曝光配置数组。
添加Chromatix文件
代码路径:vendor/qcom/proprietary/mm-camera/mm-camera2media-controller/modules/sensor/schro/matix1/libchromatix
文件夹名:chromatix_ov5648_oty5f03
需添加的代码:该部分主要是针对raw格式是摄像头,而yuv格式的摄像头不需要做该步骤,而这添加的内容主要是raw摄像头效果参数的.h文件,这需要向模组或IC厂索要该部分的文件。
高通mm-camera平台 Camera移植的更多相关文章
- Android图形合成和显示系统---基于高通MSM8k MDP4平台
介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...
- Qualcomm平台camera调试移植入门
1 camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循Android的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略:在kernel中实现se ...
- 高通camera基本代码架构【转】
本文转载自:http://blog.sina.com.cn/s/blog_c0de2be70102vyn1.html 1 camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循 ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- 高通Android平台硬件调试之Camera篇
之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...
- Android : 高通平台Camera调试之SetpropKey/camxoverridesettings.txt
高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note等)Chipcode: https://chipc ...
- 高通平台Camera调试(一)【转】
本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESE ...
- 【分析笔记】展讯 RDA8810PL 平台 Camera 驱动分析和移植(Android 4.4 )
前言概述 因以下原因,导致不得不通过代码分析来学习如何在该平台下进行摄像头驱动移植 香橙派开发商(迅龙软件)仅提供能跑起来的源代码.固件,以及简单的编译文档,不提供其它技术支持 baidu.googl ...
- 高通camera结构【转】
本文转载自:http://www.cnblogs.com/whw19818/p/5853407.html 摄像头基础介绍 一.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上, ...
- 高通camera结构(摄像头基础介绍)
摄像头基础介绍 一.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进 ...
随机推荐
- STM32【HAL库】使用外部SRAM程序
#include <board.h> #ifdef BSP_USING_SRAM #include <drv_common.h> #include <rtthread.h ...
- 在线程中使用Spring的Bean的方法、不推荐把“线程”注入到Spring
一.不推荐把"线程"注入到spring 将线程注入到Spring容器中并不是一个常见的做法,而且通常也不推荐这样做,原因如下: 生命周期管理困难: Spring管理的Bean生命周 ...
- Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目
Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 每博一文案 有句谚语说:"一怒之下踢石头,只有痛着脚趾头." 比一件糟糕的事情更可拍的,是你用糟糕的态度 ...
- Solution Set - 图上问题
CF360E Link&Submission. 首先显然可以选择的边的权值一定会取端点值.事实上,第一个人经过的边选最小,第一个人不经过的边选最大,这样一定不劣.进一步,如果 \(s_1\) ...
- ES Monitoring 整理笔记
Monitoring是elastic stack的监控模块,监控信息存在es索引中,并且可以通过kibana进行可视化的展示.(收集监控数据的方式从6.5版本起由Collectors-Exporter ...
- HDU 多校 2023 Round #6 题解
HDU 多校 2023 Round #6 题解 \(\text{By DaiRuiChen007}\) A. Count Problem Link 题目大意 求有多少个长度为 \(n\),字符集大小为 ...
- cesium常见问题和解决
- vue特殊attribute-ref
vue.js中文社区文档:ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引 ...
- sass变量的详细使用
sass变量同javascript变量,可以用来存储一些信息,并且可以重复使用. 先来对比一下css中的变量 同css变量对比 CSS 变量是由 CSS 作者定义的,它包含的值可以在整个文档或指定的范 ...
- NumPy 正态分布与 Seaborn 可视化指南
正态分布(高斯分布) 简介 正态分布(也称为高斯分布)是一种非常重要的概率分布,它描述了许多自然和人为现象的数据分布情况.正态分布的形状呈钟形,其峰值位于平均值处,两侧对称下降. 特征 正态分布可以用 ...