1、手把手撸一份驱动 到 点亮 Camera
2、Camera dtsi 完全解析
3、Camera驱动源码全解析上
4、Camera驱动源码全解析下
上篇文章分析了C文件函数的实现,本文继续分析h文件的配置信息。
推荐文章:
MIPI CSI2学习(一):说一说MIPI CSI2
高通camera驱动分析
参照sensor规格书或者咨询fae,配置:
2.1 sensor帧的输出和关闭
sensor以流的方式 输出帧.
2.2 开启sensor 端的group 功能
开启sensor 端的group 功能,将曝光(line),gain等打包,保证在同一帧进去生效
2.3 sensor嵌入式数据
2.4 sensor初始化相关寄存器
2.5 sensor分辨率相关寄存器
以上的sensor寄存器配置一般有fae厂商提供,驱动工程师尽可能的掌握相关寄存器代表的含义。
如控制宽高、帧率、曝光等等寄存器
我们只用到16位,因此
sensor_id_reg_addr = 0x300b,
sensor_id = 0x0D42,
曝光时间以行长世毕绝为单位; PCLK以Hz为单位;
行长以周期数为单位,帧长以行长数为单位;其中周期数就是频率
T 周期以ms为单位;
f 频率以Hz为单位;
f = 1 / T;
可以参考这篇文章:
camera曝光和帧率_songqiangzmt的博客
比如这里又3个寄存器,每个寄存器是8bit:
max_linecount = 0x ff ff -8
暂时没弄清楚
这里指的是暗电流值,
一般来说 raw8 都是 16, raw10为 16x4=64, raw12 =16x4x4
传感器可以流式传输许多不同的 数据类型(DT) 。
该数据被包装在不同的流中。 在一个流中,可以搜姿有一个或多个不同的DT。 一种 虚拟通道(VC) 分配给每个流。 DT和VC的组合应为唯一,并分配了一个通道ID(CID)。
有关如何指定CID的要求/限制。 当前的MIPI CSI_Rx支持四个VC,每个VC最多可以有四个CID,如下表所示。
传感器可能具有内置的pattern generator。 通过设置专用寄存器,传感器可以将生成的图案输出。
当出现图像异常时,可以使用此功能看看sensor本身输出是否有问题。
binning_factor主要是用来控制拍数配照亮度跟预览亮度一致的,当然也可以解决预览噪点过大的问题!
3A算法里,曝光时间 snap_exp_time *= (float)(binning_multiplier)
3A源码
赋值源码
关键日志:
CSI :Camera Serial Interface 定义了一个位于处理器和摄像模组之间的高速串行接口
为使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)
settle_cnt(即稳定计数)– 必须根据传感器输出特性配置该值,以确保传感器的 PHY
发送器与 MSM 的 PHY 接收器无障碍同步。
对于 28 nm 以及更小的 MSM 芯片,使用以下公式计算稳定计数:
settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),
其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如传
感器数据表所指示
如果sensor可以直接流式传输HDR帧,该函数才有用。
这里的 rolloff compensations = Lens Shading Correction (LSC)
有些sensor可以自己内部做lsc补偿。rolloff_config就是用了配置sensor的这些信息。
注意:如果你使用了sensor LSC补偿,平台端 lsc补偿就要关闭,否则双倍补偿,可能会造成图片失真。
typedef enum {
SENSOR_DELAY_EXPOSURE, /* delay for exposure /
SENSOR_DELAY_ANALOG_SENSOR_GAIN, / delay for sensor analog gain /
SENSOR_DELAY_DIGITAL_SENSOR_GAIN, / delay for sensor digital gain /
SENSOR_DELAY_ISP_GAIN, / delay for sensor ISP (error) gain*/
SENSOR_DELAY_MAX,
} sensor_delay_type_t
SENSOR_DELAY_EXPOSURE – Sets the exposure of frame N at frame N + delay
SENSOR_DELAY_ANALOG_SENSOR_GAIN – Sets the analog gain register at frame N + delay
SENSOR_DELAY_DIGITAL_SENSOR_GAIN – Sets the digital gain register at frame N + delay
SENSOR_DELAY_ISP_GAIN – Passes the isp digital gain to the isp module at frame N + delay
如果出现ae闪烁问题,可以尝试修改延迟,让gain和expose同步。
This is the readout time (in nanoseconds) of the sensor’s analog-to-digital converter. Usually it is
the minimum line time when the sensor is running at the maximum pixel clock.
NOTE: This is the sensor module’s own information. Refer to the sensor vendor for more information
noise_coeff 小波里用来定义噪声的模板
噪声系数模型: N(x) = sqrt(Sx + O)
这些参数一般由tunning团队修改。
关于角度
注意:
如果 <MountAngle>360</MountAngle>; 这个值配置成360度,那么以dtsi配置的角度为准。
源码:
关于帧率
https://www.cnblogs.com/ZHJEE/p/10351155.html
继续当一名咸鱼( ̄︶ ̄)!
系列文章
【Camera专题】Qcom-你应该掌握的Camera调试技巧1
【Camera专题】Qcom-你应该掌握的Camera调试技巧2
数指运量:
adb shell setprop persist.vendor.camera.isp.dump_cnt 20
增加性能日志:Tag:[KPI_CAMERA]
日志打印:
kernel/arch/arm/boot/dts/qcom/msm8909.dtsi
I2C资料:80-NU767-1,参考68-69页
举个例子逗唯:
i2c速率(I2C_FS_CLK ):400k
I2C_CLK:24M
占空比改成:50%
I2C_FS_CLK = I2C_CLK/(fs_div+hs_div+6)
fs_div + hs_div = 24M/400k - 6 = 60-6=54
如果占空比为50%
则
fs_div=hs_div=54/2=27
kernel/arch/arm/boot/dts/qcom/msm8909.dtsi
I2C节点解释:
kernel/Documentation/devicetree/bindings/i2c/i2c-msm-v2.txt
git diff >a.patch
patch -p1 <a.patch
查看pd lib库
adb shell setprop persist.vendor.camera.pdaf_logging 1
then reset device. version will be print out like "PDLib Version: Major: %d Minor: %d Revision: %d"
lib库和校准工具对应关系唯指梁
PD_lib_version Calibration_Version
3.3 J
4.2 J,L3
4.4 J,L3
4.5 J,L3,L4
4.6 J,L3,L4
4.7 J,L3,L4
5.0 L3,L4
5.1 L3,L4
5.2 L3,L4
5.3 L3,L4
关键log
注意,如果pdaf版本库在4.5-5.3之间,OV的sensor left map和right map 和高通是相反的
即:
op_pixel_clk = (传感器总数据传输速率) / 每个像素的位数
op_pixel_clk = sensor_MIPI_speed*lanes/每个像素的位数
传感器总数据传输速率 = sensor_MIPI_speed*lanes
vt_pixel_clk= HTS(0x380c/0x380d)* VTS(0x380e/0x380f)*FPS
op_pixel_clk=sensor_MIPI_speed*lanes/bits-per-pixel
adb shell dumpsys window | findstr mCurrentFocus
adb shell dmesg >kernel.log
1.对焦速度 af_haf_util_end_search
adb root
adb shell setprop persist.vendor.camera.stats.is.debug 5
关键log: eis2_process
经过odex 的apk ,这样apk 是不完整的。
相机 mk 里加上 LOCAL_DEX_PREOPT := false
module_sensor_load_chromatix_stream_on
1.最终的 AF ROI 坐标和大小,如何从 log 中获取?
key word:
0.200000f, /* H Clip Ratio Normal Light /
0.200000f, / V Clip Ratio Normal Light /
0.500000f, / H Clip Ratio Lowlight /
0.500000f, / V Clip Ratio Lowlight */
1、请问 Calculated new ROI 的大小是怎么计算的?
ctr_x = image_width / 2
ctr_y = image_height / 2
dx = image_width * h_ratio * zoom_factor
dy = image_height * v_ratio * zoom_factor
x = ctr_x <(roi_out->dx / 2) ? 0 : (ctr_x - (roi_out->dx / 2))
y = ctr_y <(roi_out->dy / 2) ? 0 : (ctr_y - (roi_out->dy / 2))
2、假设 CAF 默认以中心为 ROI,那么 APP 有接口可以修改 ROI 的位置吗?
As you can see from 1(formula), no parameters are passed to change this value.
adb shell setprop persist.vendor.camera.cal.dump 1
数据路径:"/data/misc/camera/" 或者"/data/vendor/camera/"
8909:
新:
1.开机log里面搜索fdt
OF: fdt:Machine model: Qualcomm Technologies, Inc. SDM429 QRD Spyro DVT Overlay
2.搜索"Qualcomm Technologies, Inc. SDM429 QRD Spyro DVT Overlay"
3.打开kernel/msm-4.9/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-dvt-overlay.dts
adb shell debuggerd -b <camera process PID>
persist.vendor.debug.set.fixedfps
adb logcat -c &&adb logcat -G 256M &&adb logcat -v threadtime -b main -b crash -b kernel 1 >log.txt
aec_settle
ISO = (analog_gain*100)/ISO_100_gain。
效果参数中 ISO_100_gain =1
adb shell dumpsys media.camera
adb shell setprop persist.vendor.camera.HAL3.enabled 1
当我们用mmm编译时,可能找不到某些依赖,又不想又mmma编译。
比如:
mmm packages/apps/Camera2
再编译 mmm packages/apps/Camera2
<uses-feature android:name="android.hardware.type.watch" />
adb shell input keyevent 27
//拍照键
关键字:alg_status
01-02 09:02:12.920 235 2894 D ae_lib : 2429, ae1_calculateEX: alg_status:146 stab: 0, status: 0, flicker: 0, fps: 1.07, effect-(s 34464(0.935698s), g 128, dmy 0), final to sensor: idx: 271, (3683(0.099993s), 0, 581), cur_lum: 133, bv:520, tar_lum [62, 66]
adb shell stop media
adb shell start media
adb shell stop cameraserver
adb shell kill -9 进程ID
frameworks/av/services/camera/libcameraservice/CameraService.cpp
hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp
typedef int64_t nsecs_t
例如:
kernel/drivers/misc/sprd_camera/dcam/dcam_if_r4p0/dcam_ioctrl.
要在makefile中添加你要的调用的路径
adb root
adb shell
读:lookat -l 1 0x40388D2C
写:lookat -s 0x00000081 0x40388D2C
frameworks/av/camera/CameraParameters.cpp
adb shell setprop debug.camera.mf 2
adb shell setprop debug.camera.mf_pos 100
#define VAR_UNUSED(x) (void)(x)
原因:
so后面多了个空格,吐血了!!!
删掉空格后就ok了:
hardware/qcom/camera/QCamera2/HAL/test
vendor/bin/dual_camera_test
kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8937-pinctrl.dtsi
kernel/msm-4.9/arch/arm64/boot/dts/qcom/sdm429-spyro-qrd-evt-camera.dtsi
是的,使用DTSI时需要为其配置硬件中断号。DTSI(Device Tree Source Inclusion)是一种在Linux系统中用于描述硬件设备信息的机制,它岩宏使用一神散种基于文本的语言(即Device Tree Blob或DTB),以树状结构的形式描述硬件设备及其属性。硬件中断是指在微处理器与外围设备之间进行信息传输的信号粗瞎册,是 *** 作系统中实现异步事件响应和多任务调度的重要机制。在DTSI文件中,可以通过设置中断节点的属性来为设备分配硬件中断号。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)