首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
  • M4-R1

    • 一、简介

      • M4-R1简介
    • 二、快速上手

      • 01 OpenHarmony概述
      • 02 镜像烧录
      • 03 应用开发快速上手
      • 04 设备开发快速上手
    • 三、应用开发

      • 01 ArkUI

        • 1 ArkTS语言简介
        • 2 UI 组件-Row 容器介绍
        • 3 UI 组件-Column 容器介绍
        • 4 UI 组件-Text 组件
        • 5 UI 组件-Toggle 组件
        • 6 UI 组件-Slider 组件
        • 7 UI 组件-Animation 组件&Transition 组件
      • 02 资料获取

        • 1 OpenHarmony 官方资料
      • 03 开发须知

        • 1 Full-SDK替换教程
        • 2 引入和使用三方库
        • 3 HDC调试
        • 4 命令行恢复出厂模式
        • 5 升级App为system权限
      • 04 构建第一个应用

        • 1 构建第一个ArkTs应用-HelloWorld
      • 05 案例

        • 01 串口调试助手应用案例
        • 02 手写板应用案例
        • 03 数字时钟应用案例
        • 04 WIFI 信息获取应用案例
    • 四、设备开发

      • 1 Ubuntu环境开发

        • 01 环境搭建
        • 02 下载源码
        • 03 编译源码
      • 2 使用DevEco Device Tool 工具

        • 01 工具简介
        • 02 开发环境的搭建
        • 03 导入SDK
        • 04 HUAWEI DevEco Tool 功能介绍
    • 五、内核外设与接口

      • 01 指南
      • 02 设备树介绍
      • 03 GPIO介绍
      • 04 I2C通讯
      • 05 SPI通信
      • 06 PWM 控制
      • 07 串口通讯
      • 08 TF卡
      • 09 屏幕
      • 10 触摸
      • 11 Ethernet(以太网)
      • 12 M.2 硬盘
      • 13 音频
      • 13 WIFI & BT
      • 14 摄像头
    • 六、资料下载

      • 资料下载
  • M5-R1

    • 一、简介

      • M5-R1简介
    • 二、快速上手

      • 镜像烧录
      • 环境搭建
      • 下载源码
    • 三、外设与接口

      • 树莓派接口
      • GPIO 接口
      • I2C 接口
      • SPI通信
      • PWM控制
      • 串口通讯
      • TF Card
      • 屏幕
      • 触摸
      • 音频
      • RTC
      • Ethernet
      • M.2
      • MINI-PCIE
      • Camera
      • WIFI&BT
    • 四、资料下载

      • 资料下载

14 摄像头

1 摄像头介绍

现代社会,随着芯片算力的提升和AI赋能,摄像头作为几乎成为中高端嵌入式设备必不可少的传感器,正经历不断的革新和性能优化。

以下是一个COMS传感器相机的组成结构图,大致分为镜头,图像传感器和图像处理单元,下文将根据笔者的理解给大家进行说明。

CMOS传感器相机组成结构图

1.1 镜头介绍

先介绍镜头,如上图所示,它由多个镜片组合成。理论上,只需要一个镜片就可以成像,但存在色差,像散等多种问题,通过多个镜片组合的方式可以有效矫正像差,此外,通过改变多个镜片的位置,可以实现变焦,当然最重要的一点,大部分摄像头的对焦也是通过改变镜片组的位置来实现的。

镜头结构图

使用支持变焦和自动对焦的摄像头一般都有一个微型马达来改变镜片的位置,常见的摄像头马达类型是VCM(线圈马达),结构示意图如下:

VCM线圈马达结构图

线圈通电会产生磁场,通过调整流经磁场的电流大小就可以实现镜片的前后移动,这种结构就叫作VCM(Voice Coil Moto)。

1.2 CMOS传感器介绍

再来浅谈一下相机最重要的部分,他的图像传感器,也就是大家常说的CMOS。COMS的作用是吸收光电子,使得里面每一个像素上可以积累不同程度的电荷量,这些采集的电荷经过像素下面的放大器被转换成对应强度的电压信号,电压信号作为模拟量,通过ADC转换为数字信号,以12位ADC为例,每一个像素的就根据亮度被划分为4096个等级,这时就可以得到一副黑白图片的raw文件。

CMOS传感器工作原理图

在每个像素处前加入滤光片,如绿色的滤光片只运行通过绿光,那么这个点的光强数值就是绿色光强度的等级值,整个由RGB三原色的亮度等级描述的数字网格就是相机的raw文件。

到这里,朋友们就知道为什么,我们晚上使用手机拍照时,点击快门后要等几秒才能完成,而白天就会很快,因为需要等CMOS单元多采集一些光电子,不然得到的就是一副全黑的图片了。如果是有摄影基础的朋友,也就知道了摄影三要素(光圈,快门,感光度)的由来,都是通过不同方式控制进光量!

1.3 图像处理单元介绍

图像处理单元ISP会对raw文件进行处理,他会根据每个像素点的值,通过算法去估计每一个像素的真实颜色(比如说它发现左边的红色像素(R)值是50,右边的红色像素值是55。那么它就会合理地推测:"嗯,这个位置的红色值大概在52左右")。经过算法处理后,一份彩色图片就诞生了,如果需要输出JPG等格式的图片,处理器就会对raw文件进行白平衡矫正、锐化、降噪以及压缩等过程最终生成我们需要的图像。

2 摄像头接口在板卡中的位置

摄像头接口位置

板卡预留了一个MIPI摄像头接口,目前对格科微电子的GC8034和豪威科技的OV5695这两个摄像头做了适配。

具体参数可以查看下表:

参数GC8034OV5695
制造商中国 Galaxycore (格科微)美国 OmniVision (豪威科技)
分辨率3264H x 2448V (约800万像素)2592H x 1944V (约500万像素)
光学尺寸1/4英寸1/4英寸
输出格式RAW10 / RAW810-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摄像头模块图像传感器采集光信号光信号 → 电信号
2I2C控制配置配置摄像头参数控制信号传输
3图像数据采集将电信号转换为数字信号模拟信号 → 数字信号
4MIPI CSI-2/DVP接口传输高速数据接口传输数字图像数据传输
5CSI2 D-PHY物理层处理物理层信号处理和同步信号调理和时钟恢复
6ISP图像信号处理图像质量优化处理原始数据 → 处理后数据
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 接口。注意不要热插拔!!!(笔者就是这样烧了一块板子和摄像头)

点开鸿蒙系统自带的相机应用:

相机应用测试

成功出图,测试正常。

在 GitHub 上编辑此页
上次更新:
贡献者: fxx
Prev
13 WIFI & BT