14 摄像头
1 摄像头介绍
现代社会,随着芯片算力的提升和AI赋能,摄像头作为几乎成为中高端嵌入式设备必不可少的传感器,正经历不断的革新和性能优化。
以下是一个COMS传感器相机的组成结构图,大致分为镜头,图像传感器和图像处理单元,下文将根据笔者的理解给大家进行说明。
1.1 镜头介绍
先介绍镜头,如上图所示,它由多个镜片组合成。理论上,只需要一个镜片就可以成像,但存在色差,像散等多种问题,通过多个镜片组合的方式可以有效矫正像差,此外,通过改变多个镜片的位置,可以实现变焦,当然最重要的一点,大部分摄像头的对焦也是通过改变镜片组的位置来实现的。
使用支持变焦和自动对焦的摄像头一般都有一个微型马达来改变镜片的位置,常见的摄像头马达类型是VCM(线圈马达),结构示意图如下:
线圈通电会产生磁场,通过调整流经磁场的电流大小就可以实现镜片的前后移动,这种结构就叫作VCM(Voice Coil Moto)。
1.2 CMOS传感器介绍
再来浅谈一下相机最重要的部分,他的图像传感器,也就是大家常说的CMOS。COMS的作用是吸收光电子,使得里面每一个像素上可以积累不同程度的电荷量,这些采集的电荷经过像素下面的放大器被转换成对应强度的电压信号,电压信号作为模拟量,通过ADC转换为数字信号,以12位ADC为例,每一个像素的就根据亮度被划分为4096个等级,这时就可以得到一副黑白图片的raw文件。
在每个像素处前加入滤光片,如绿色的滤光片只运行通过绿光,那么这个点的光强数值就是绿色光强度的等级值,整个由RGB三原色的亮度等级描述的数字网格就是相机的raw文件。
到这里,朋友们就知道为什么,我们晚上使用手机拍照时,点击快门后要等几秒才能完成,而白天就会很快,因为需要等CMOS单元多采集一些光电子,不然得到的就是一副全黑的图片了。如果是有摄影基础的朋友,也就知道了摄影三要素(光圈,快门,感光度)的由来,都是通过不同方式控制进光量!
1.3 图像处理单元介绍
图像处理单元ISP会对raw文件进行处理,他会根据每个像素点的值,通过算法去估计每一个像素的真实颜色(比如说它发现左边的红色像素(R)值是50,右边的红色像素值是55。那么它就会合理地推测:"嗯,这个位置的红色值大概在52左右")。经过算法处理后,一份彩色图片就诞生了,如果需要输出JPG等格式的图片,处理器就会对raw文件进行白平衡矫正、锐化、降噪以及压缩等过程最终生成我们需要的图像。
2 摄像头接口在板卡中的位置
板卡预留了一个MIPI摄像头接口,目前对格科微电子的GC8034和豪威科技的OV5695这两个摄像头做了适配。
具体参数可以查看下表:
参数 | GC8034 | OV5695 |
---|---|---|
制造商 | 中国 Galaxycore (格科微) | 美国 OmniVision (豪威科技) |
分辨率 | 3264H x 2448V (约800万像素) | 2592H x 1944V (约500万像素) |
光学尺寸 | 1/4英寸 | 1/4英寸 |
输出格式 | RAW10 / RAW8 | 10-bit RGB RAW |
接口 | MIPI (支持2 lane或4 lane) | MIPI (支持1 lane或2 lane) |
帧率 | 全尺寸下30fps (MIPI 4 lane) | 全尺寸(5MP)下30fps |
3 摄像头测试
3.1 设备树详解
提示
下文的文件路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip
需要先编译码源。
由于摄像头的设备树配置比较复杂,根据SDK对摄像头的配置,数据传输过程大致分为以下几个阶段:
摄像头数据传输流程:
步骤 | 组件/阶段 | 功能描述 | 数据流向 |
---|---|---|---|
1 | 摄像头模块 | 图像传感器采集光信号 | 光信号 → 电信号 |
2 | I2C控制配置 | 配置摄像头参数 | 控制信号传输 |
3 | 图像数据采集 | 将电信号转换为数字信号 | 模拟信号 → 数字信号 |
4 | MIPI CSI-2/DVP接口传输 | 高速数据接口传输 | 数字图像数据传输 |
5 | CSI2 D-PHY物理层处理 | 物理层信号处理和同步 | 信号调理和时钟恢复 |
6 | ISP图像信号处理 | 图像质量优化处理 | 原始数据 → 处理后数据 |
7 | 去噪、色彩校正等 | 图像增强和校正 | 图像质量提升 |
8 | 数据输出 | 处理完成的图像数据 | 最终图像数据 |
9 | 存储到内存 | 数据缓存和存储 | 内存写入 |
10 | 显示 | 图像显示输出 | 屏幕显示 |
由于摄像头的设备树配置比较复杂,这里就不详细展开了。
在板级匹配文件rk3568-toybrick-x10.dtsi
的i2c4节点中,截取了其中gc8034 和 ov5695 进行举例:
&i2c4 {
status = "okay"; // 启用 I2C4 总线
gc8034: gc8034@37 { // GC8034 摄像头模块,I2C 地址 0x37
compatible = "galaxycore,gc8034"; // 兼容性字符串,用于驱动匹配
reg = <0x37>; // I2C 设备地址
clocks = <&cru CLK_CIF_OUT>; // 时钟源:CRU 的 CIF 输出时钟
clock-names = "xvclk"; // 时钟名称:外部时钟
power-domains = <&power RK3568_PD_VI>; // 电源域:视频输入电源域
pinctrl-names = "default"; // 引脚控制状态名称
pinctrl-0 = <&cif_clk>; // 默认引脚配置:CIF 时钟引脚
reset-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; // 复位 GPIO,低电平有效
pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_LOW>; // 电源控制 GPIO,低电平有效
rockchip,grf = <&grf>; // 通用寄存器文件引用
rockchip,camera-module-index = <0>; // 摄像头模块索引号
rockchip,camera-module-facing = "back"; // 摄像头朝向:后置
rockchip,camera-module-name = "RK-CMK-8M-2-v1"; // 摄像头模块名称
rockchip,camera-module-lens-name = "CK8401"; // 镜头名称
port { // 端口定义,用于连接其他设备
gc8034_out: endpoint { // 输出端点
remote-endpoint = <&mipi_in_ucam1>; // 连接至 MIPI CSI 的 ucam1 输入
data-lanes = <1 2 3 4>; // 使用 4 条数据线
};
};
};
......
ov5695: ov5695@36 { // OV5695 摄像头模块,I2C 地址 0x36
status = "okay"; // 启用该设备
compatible = "ovti,ov5695"; // 兼容性字符串,OmniVision 驱动
reg = <0x36>; // I2C 设备地址
clocks = <&cru CLK_CIF_OUT>; // 时钟源:CRU 的 CIF 输出时钟
clock-names = "xvclk"; // 外部时钟名称
power-domains = <&power RK3568_PD_VI>; // 电源域:视频输入电源域
pinctrl-names = "default"; // 引脚控制状态名称
pinctrl-0 = <&cif_clk>; // 默认引脚配置:CIF 时钟引脚
reset-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; // 复位控制 GPIO,低电平有效
pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_LOW>; // 电源控制 GPIO,低电平有效
rockchip,camera-module-index = <0>; // 摄像头模块索引号
rockchip,camera-module-facing = "back"; // 摄像头朝向:后置
rockchip,camera-module-name = "TongJu"; // 模块厂商名称
rockchip,camera-module-lens-name = "CHT842-MD"; // 镜头型号
port { // 端口配置
ov5695_out: endpoint { // 输出端点
remote-endpoint = <&mipi_in_ucam2>; // 连接至 MIPI CSI 的 ucam2 输入
data-lanes = <1 2>; // 使用 2 条数据线
};
};
};
};
3.2 摄像头效果文件说明
对于输出raw图的camera,图像效果需要经过ISP调整才能满足正常需求。目前M4R1效果文件默认适配了GC8034,如果需要适配其他raw摄像头,相对应的也需要修改板子上的效果文件!
下面以适配ov5695为例进行说明。
安装好HDC工具后,在终端输入:
# 赋予修改系统文件夹的权限
hdc shell mount -o remount,rw /vendor
# 推送效果文件
hdc file send "C:\Users\Administrator\Documents\ov5695_TongJu_CHT842-MD.json" /vendor/etc/iqfil.json
# 重启板子
hdc shell reboot
重启板子后,板子上的ISP模块会读取这个json文件,使得ov5695出图正常。
提示
ov5695的效果文件位于以下路径"M4-R1\05-开发资料\01-OpenHarmory 开发资料\iqfile"
3.3 测试摄像头具体演示
以上文中适配的OV5695为例,在断电情况下把摄像头接入MIPI CAM 接口。注意不要热插拔!!!(笔者就是这样烧了一块板子和摄像头)
点开鸿蒙系统自带的相机应用:
成功出图,测试正常。