[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用

news2024/11/23 20:24:52
  • 🍇 博主主页: 【Systemcall小酒屋】
  • 🍇 博主追寻:热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是林群院士说过的一句话,另外“成就是最好的老师”,技术既要沉淀,也得分享,成就感的正反馈是支持我持续耕耘的动力!
  • 🍇 专栏目录: 【Firefly-RK356x板卡】
  • 🍇 专栏说明:基于Firefly旗下的RK356x板卡进行入门篇讲述,欢迎订阅,博主会持续更新!

文章目录

    • 一、MIPI CSI
      • 1.1 Full Mode特点
      • 1.2 Split Mode特点
    • 二、Full Mode配置
      • 2.1 配置sensor端
      • 2.2 csi2_dphy0相关配置
      • 2.3 isp相关配置
    • 三、Split Mode配置
      • 3.1 配置sensor端
      • 3.2 csi2_dphy1/csi2_dphy2相关配置
      • 3.3 isp相关配置
    • 四、软件相关目录
    • 五、单目CAM-8MS1M/双目CAM-2MS2MF摄像头的使用
      • 5.1 使用单目摄像头CAM-8MS1M
      • 5.2 使用双目摄像头CAM-2MS2MF
    • 六、Camera底层调试
    • 七、Android系统使用camera应用
    • 八、IQ文件

一、MIPI CSI

RK3566/RK3568平台仅有一个标准物理mipi csi2 dphy,可以工作在两个模式:full mode 和split mode,拆分为csi2_dphy0/csi2_dphy1/csi2_dphy2三个逻辑dphy

1.1 Full Mode特点

  • 仅使用csi2_dphy0。csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用
  • data lane最大4 lanes
  • 最大速率2.5Gbps/lane

1.2 Split Mode特点

  • 仅使用csi2_dphy1和csi2_dphy2,两者与 csi2_dphy0 互斥,不可同时使用
  • csi2_dphy1和csi2_dphy2可同时使用
  • csi2_dphy1和csi2_dphy2各自的data lane最大是2 lanes
  • csi2_dphy1对应物理dphy的lane0/lane1
  • csi2_dphy2对应物理dphy的lane2/lane3
  • 最大速率2.5Gbps/lane

请添加图片描述

一般来说,如果用单目摄像头可以配置full mode,若使用双目摄像头可以配置split mode

二、Full Mode配置

链接关系: sensor->csi2_dphy0->isp

2.1 配置sensor端

需要根据板子原理图的MIPI CSI接口找到sensor是挂在哪个I2C总线上,然后在对应的I2C节点配置camera节点,正确配置camera模组的I2C设备地址、引脚等属性。

如下ROC-RK3568-PC的xc7160配置:

&i2c4 {
    status = "okay";
    XC7160: XC7160b@1b {
        status = "okay";
        compatible = "firefly,xc7160";
        reg = <0x1b>;
        clocks = <&cru CLK_CIF_OUT>;
        clock-names = "xvclk";
        power-domains = <&power RK3568_PD_VI>;
        pinctrl-names = "default";
        pinctrl-0 = <&cif_clk>;

        power-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
        reset-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
        pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;

        firefly,clkout-enabled-index = <0>;
        rockchip,camera-module-index = <0>;
        rockchip,camera-module-facing = "back";
        rockchip,camera-module-name = "NC";
        rockchip,camera-module-lens-name = "NC";
        port {
            xc7160_out: endpoint {
                remote-endpoint = <&mipi_in_ucam4>;
                data-lanes = <1 2 3 4>;
            };
        };
    };
};

2.2 csi2_dphy0相关配置

csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用。另外需要使能csi2_dphy_hw节点:

&csi2_dphy0 {
    status = "okay";
    /*
    * dphy0 only used for full mode,
    * full mode and split mode are mutually exclusive
    */
    ports {
        #address-cells = <1>;
        #size-cells = <0>;
        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;
...
            mipi_in_ucam4: endpoint@5 {
                    reg = <5>;
                    remote-endpoint = <&xc7160_out>;
                    data-lanes = <1 2 3 4>;
            };
        };
        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            csidphy_out: endpoint@0 {
                    reg = <0>;
                    remote-endpoint = <&isp0_in>;
            };
        };
    };
};

&csi2_dphy_hw {
    status = "okay";
};

&csi2_dphy1 {
    status = "disabled";
};

&csi2_dphy2 {
    status = "disabled";
};

2.3 isp相关配置

其中rkisp_vir0节点的remote-endpoint指向csidphy_out:

&rkisp {
    status = "okay";
};

&rkisp_mmu {
    status = "okay";
};

&rkisp_vir0 {
    status = "okay";
    port {
        #address-cells = <1>;
        #size-cells = <0>;

        isp0_in: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&csidphy_out>;
        };
    };
};

三、Split Mode配置

链接关系:

sensor1->csi_dphy1->isp_vir0
sensor2->csi_dphy2->mipi_csi2->vicap->isp_vir1

3.1 配置sensor端

根据板子原理图的MIPI CSI接口找到两个sensor是挂在哪个I2C总线上,然后在对应的I2C节点配置两个camera节点,正确配置camera模组的I2C设备地址、引脚等属性。如下ROC-RK3568-PC的gc2053/gc2093配置:

&i2c4 {
    status = "okay";
    gc2053: gc2053@37 { //IR
        status = "okay";
        compatible = "galaxycore,gc2053";
        reg = <0x37>;

        avdd-supply = <&vcc_camera>;
        power-domains = <&power RK3568_PD_VI>;
        clock-names = "xvclk";
        pinctrl-names = "default";

        clocks = <&pmucru CLK_WIFI>;
        pinctrl-0 = <&refclk_pins>;
        power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;//IR_PWR_EN
        pwdn-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;

        firefly,clkout-enabled-index = <1>;
        rockchip,camera-module-index = <0>;
        rockchip,camera-module-facing = "back";
        rockchip,camera-module-name = "YT-RV1109-2-V1";
        rockchip,camera-module-lens-name = "40IR-2MP-F20";
        port {
            gc2053_out: endpoint {
                remote-endpoint = <&dphy1_in>;
                data-lanes = <1 2>;
            };
        };
    };
    gc2093: gc2093b@7e { //RGB
        status = "okay";
        compatible = "galaxycore,gc2093";
        reg = <0x7e>;

        avdd-supply = <&vcc_camera>;
        power-domains = <&power RK3568_PD_VI>;
        clock-names = "xvclk";
        pinctrl-names = "default";
        flash-leds = <&flash_led>;

        pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;

        firefly,clkout-enabled-index = <0>;
        rockchip,camera-module-index = <1>;
        rockchip,camera-module-facing = "front";
        rockchip,camera-module-name = "YT-RV1109-2-V1";
        rockchip,camera-module-lens-name = "40IR-2MP-F20";
        port {
            gc2093_out: endpoint {
                remote-endpoint = <&dphy2_in>;
                data-lanes = <1 2>;
            };
        };
    };
};

3.2 csi2_dphy1/csi2_dphy2相关配置

csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用:

&csi2_dphy0 {
    status = "disabled";
};

&csi2_dphy1 {
    status = "okay";
    /*
    * dphy1 only used for split mode,
    * can be used concurrently with dphy2
    * full mode and split mode are mutually exclusive
    */
    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;

            dphy1_in: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&gc2053_out>;
                data-lanes = <1 2>;
            };
        };

        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            dphy1_out: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&isp0_in>;
            };
        };
    };
};

&csi2_dphy2 {
    status = "okay";
    /*
    * dphy2 only used for split mode,
    * can be used concurrently with dphy1
    * full mode and split mode are mutually exclusive
    */
    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;

            dphy2_in: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&gc2093_out>;
                data-lanes = <1 2>;
            };
        };

        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            dphy2_out: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&mipi_csi2_input>;
            };
        };
    };
};

&csi2_dphy_hw {
    status = "okay";
};

&mipi_csi2 {
    status = "okay";

    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@0 {
            reg = <0>;
            #address-cells = <1>;
            #size-cells = <0>;

            mipi_csi2_input: endpoint@1 {
                reg = <1>;
                remote-endpoint = <&dphy2_out>;
                data-lanes = <1 2>;
            };
        };

        port@1 {
            reg = <1>;
            #address-cells = <1>;
            #size-cells = <0>;

            mipi_csi2_output: endpoint@0 {
                reg = <0>;
                remote-endpoint = <&cif_mipi_in>;
                data-lanes = <1 2>;
            };
        };
    };
};

&rkcif_mipi_lvds {
    status = "okay";
    port {
        cif_mipi_in: endpoint {
            remote-endpoint = <&mipi_csi2_output>;
            data-lanes = <1 2>;
        };
    };
};

&rkcif_mipi_lvds_sditf {
    status = "okay";
    port {
        mipi_lvds_sditf: endpoint {
            remote-endpoint = <&isp1_in>;
            data-lanes = <1 2>;
        };
    };
};

3.3 isp相关配置

其中rkisp_vir0节点的remote-endpoint指向dphy1_out

&rkisp {
    status = "okay";
};

&rkisp_mmu {
    status = "okay";
};

&rkisp_vir0 {
    status = "okay";
    port {
        #address-cells = <1>;
        #size-cells = <0>;

        isp0_in: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&dphy1_out>;
        };
    };
};

&rkisp_vir1 {
    status = "okay";

    port {
        reg = <0>;
        #address-cells = <1>;
        #size-cells = <0>;

        isp1_in: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&mipi_lvds_sditf>;
        };
    };
};

&rkcif_mmu {
    status = "okay";
};

&rkcif {
    status = "okay";
};

四、软件相关目录

Linux Kernel-4.19
|-- arch/arm/boot/dts #DTS配置文件
|-- drivers/phy/rockchip
    |-- phy-rockchip-mipi-rx.c #mipi dphy驱动
    |-- phy-rockchip-csi2-dphy-common.h
    |-- phy-rockchip-csi2-dphy-hw.c
    |-- phy-rockchip-csi2-dphy.c
|-- drivers/media
    |-- platform/rockchip/cif #RKCIF驱动
    |-- platform/rockchip/isp #RKISP驱动
        |-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
        |-- capture #包含 mp/sp/rawwr的配置及 vb2,帧中断处理
        |-- dmarx #包含 rawrd的配置及 vb2,帧中断处理
        |-- isp_params #3A相关参数设置
        |-- isp_stats #3A相关统计
        |-- isp_mipi_luma #mipi数据亮度统计
        |-- regs #寄存器相关的读写操作
        |-- rkisp #isp subdev和entity注册
        |-- csi #csi subdev和mipi配置
        |-- bridge #bridge subdev,isp和ispp交互桥梁
    |-- platform/rockchip/ispp #rkispp驱动
        |-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
        |-- stream #包含 4路video输出的配置及 vb2,帧中断处理
        |-- rkispp #ispp subdev和entity注册
        |-- params #TNR/NR/SHP/FEC/ORB参数设置
        |-- stats #ORB统计信息

五、单目CAM-8MS1M/双目CAM-2MS2MF摄像头的使用

ROC-RK3568-PC已经配置好相应的dts,单目摄像头CAM-8MS1M和双目摄像头CAM-2MS2MF使用互斥,只需包含相应的dtsi文件即可使用单目摄像头CAM-8MS1M或双目摄像头CAM-2MS2MF

5.1 使用单目摄像头CAM-8MS1M

dts的配置默认使用单目摄像头:

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
index 7e2a8b2..14fa027 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
@@ -7,6 +7,15 @@
+#include "rk3568-firefly-roc-pc-cam-8ms1m.dtsi"
+//#include "rk3568-firefly-roc-pc-cam-2ms2m.dtsi"

5.2 使用双目摄像头CAM-2MS2MF

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
index 7e2a8b2..14fa027 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-firefly-roc-pc.dts
@@ -7,6 +7,15 @@
- #include "rk3568-firefly-roc-pc-cam-8ms1m.dtsi"
+//#include "rk3568-firefly-roc-pc-cam-8ms1m.dtsi"
- //#include "rk3568-firefly-roc-pc-cam-2ms2m.dtsi"
+ #include "rk3568-firefly-roc-pc-cam-2ms2m.dtsi"

六、Camera底层调试

使用v4l2-ctl抓取camera数据帧:

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 --stream-to=/data/out.yuv

把out.yuv文件拷贝出来通过ubuntu去查看:

ffplay -f rawvideo -video_size 1920x1080 -pix_fmt nv12 out.yuv

七、Android系统使用camera应用

Android系统使用camera的apk打开摄像头需要配置camera3_profiles*.xml,具体可参考Android SDK hardware/rockchip/camera/etc/camera目录下的文件

八、IQ文件

raw摄像头支持的iq文件路径external/camera_engine_rkaiq/iqfiles/isp21, 与以前不一样的地方是iq文件不再采用.xml的方式,而是采用.json的方式。虽有提供xml转json的工具, 但isp20的xml配置转换后也不适用isp21。

若使用raw摄像头sensor,请留意isp21目录所支持的iq文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SVN利用 AS 进行代码对比的方法

第 1 种&#xff1a;如果我们是从 SVN 检出的项目&#xff0c;并且想比较本地代码与从 SVN 检出时的代码相比都有那些区别&#xff0c;可以按如下步骤操作 如上图所示&#xff0c;在代码编辑区&#xff0c;右键唤出功能菜单&#xff0c;然后选择Subversion&#xff0c;进而会展…

沉浸式翻译 – 支持 PDF、EPUB、网页,可同时显示原文与译文的双语翻译工具

使用的理由 自从谷歌翻译不再对大陆用户提供服务后。内心是一阵酸痛的&#xff0c;毕竟我认识单词单词不认识我啊&#xff0c;这简直是天书一般的存在。 期间网络中的很多大神也是推荐了不少方法让我再次拥抱谷歌翻译&#xff0c;比如教我修改 host 文件什么的&#xff0c;但这…

谁能真正替代你?AI辅助编码工具深度对比(chatGPT/Copilot/Cursor/New Bing)

写在开头 这几个月AI相关新闻的火爆程度大家都已经看见了&#xff0c;作为一个被裹挟在AI时代浪潮中的程序员&#xff0c;在这几个月里我也是异常兴奋和焦虑。甚至都兴奋的不想拖更了。不仅仅兴奋于AI对于我们生产力的全面提升&#xff0c;也焦虑于Copilot等AI辅助编码工具&am…

VUE3 学习笔记(八-1)中 EasyUI 组件的使用方法

目录 一、首先看官方 Accordion 文档说明 二、如何使用 Props 属性 三、如何使用 Methods&#xff08;方法&#xff09; 四、如何使用Methods&#xff08;方法&#xff09; 1. 通过 ref 给Vue3中的标签添加引用 2. 在script setup lang"ts"中定义变量引用 3. 增…

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里

最强的文本生成模型GPT-4一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展四、与之前 GPT 系列模型比较五、…

边缘计算那些事儿—边缘智能技术

0 背景 边缘智能是边缘计算中一个非常重要的方向。它将边缘计算和人工智能算法结合起来&#xff0c;在边缘设备上就近处理目标检测、物体跟踪&#xff0c;识别等任务。这种处理方式可以降低时延&#xff0c;减少数据上送云端对回传网络的冲击&#xff0c;同时保证数据的隐私和安…

「线性DP-步入」最大子串和

最大子串和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 样例 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&…

计算机组成原理第五章输入输出系统---概述笔记

我们都知道,外部设备和计算机是不能直接相连的,因为设备是多种多样的&#xff0c;都是通过一个接口设备和主存相连的&#xff0c;主机对外部设备有两种控制方式&#xff0c;程序查询方式和程序中断方式&#xff0c;第三种是DMA方式&#xff0c;这三种方式都是从CPU工作效率的角…

HTML表单和CSS属性以及DOM实现网页版计算器

目录 1、效果展示 2、源码 2.1HTMLCSS源码 2.2JS源码 3、CSS属性 3.1width、height属性 3.2font-size属性 3.3margin属性 3.4padding属性 3.5background-color属性 3.6border属性 3.7border-radius属性 3.8text-align属性 4、DOM 4.1根据id获取元素 4.2根据nam…

06 - 深度学习处理器原理

一、通用计算机架构 1. 冯诺依曼架构 冯诺依曼架构的特点:(1)使用存储程序的概念,即数据和指令都存储在内存中;(2)由 CPU、内存、输入/输出设备和总线组成,其中 CPU 包括控制单元、算术逻辑单元和寄存器;(3)控制单元按照取指(Fetch)- 译码(Decode)- 执行(Exec…

IM即时通讯-7-如何设计通知提醒

本文大纲 本文从为什么做通知提醒&#xff0c; 以及如何设计通知提醒&#xff0c; 以及如何衡量通知提醒三方面解释了如何设计通知提醒。 对于重点的如何设计通知提醒&#xff0c; 通过拆分前台和后台&#xff0c; 前台采用自建或者二方通道&#xff0c; 后台采用厂商信令通道…

电厂人员定位怎么做?智慧电厂人员定位系统解决方案告诉你答案

伴随着“泛在电力物联网建设”的提出&#xff0c;构建智慧电厂引起重大关注&#xff0c;全国各地纷纷响应。传统电力企业一直面临着人员管控难、生产环境复杂且危险多等问题&#xff0c;物联网技术的兴起使得电厂的数字化和智慧化转型已成为电力企业保障生产作业安全、提升生产…

工具及方法 - Linux下串口工具Minicom

因为调试设备所以需要打开两个串口&#xff0c;也许是开了Ubuntu虚拟机的影响&#xff0c;或其他的问题&#xff0c;经常有一个或两个串口设备工作不正常&#xff0c;需要重启电脑&#xff0c;很麻烦。 原因大概就是设备驱动问题&#xff0c;比如使用MobaXterm这个工具&#x…

基于NXP iMX8M Mini处理器测试DPDK

By Toradex秦海 1). 简介 DPDK (Data Plane Development Kit) 软件是一组用户空间库和驱动程序&#xff0c;可加速在所有主要 CPU 架构上运行的网络数据包处理工作负载&#xff0c;以便提升整个网络数据服务的QoS。其最早由 Intel 大约 2010年创建&#xff0c;后由6WIND公司发…

赛事报名启动丨百度Apollo星火自动驾驶大赛开始报名啦!

作为汽车智能化、网联化的关键环节&#xff0c;自动驾驶成为全球科技界、产业界竞争的新赛道。随着人工智能、5G通信、激光雷达、高精地图等多项技术不断完善&#xff0c;自动驾驶的判断力和理解力得到了显著提升。为了推动自动驾驶技术的发展、加快人工智能技术的迭代&#xf…

超详细的ARM架构适配介绍!

超详细的ARM架构适配介绍&#xff01; - 掘金 本文主要介绍云联壹云平台如何适配ARM&#xff0c;并运行在ARM CPU架构的机器上。 背景介绍 1、平台服务运行架构 云联壹云平台采用容器化&#xff0c;分布式的架构运行在 Kubernetes&#xff08;K8s&#xff09;之上。下面是平…

小白轻松学Spring Cloud

在了解SpringCloud之前&#xff0c;我们先来大致了解下微服务这个概念吧。 传统单体架构 单体架构在小微企业比较常见&#xff0c;典型代表就是一个应用、一个数据库、一个web容器就可以跑起来。 可以从上图看出&#xff0c;单体架构基本上就是如上所说的&#xff1a;一个应用…

【Python】自动化这么简单吗?——百度网盘自动上传文件教程

文章目录前言一、准备二、授权bypy访问百度网盘三、开始使用bypy四、文件上传功能五.文件同步功能总结前言 要使用Python自动上传文件到百度网盘&#xff0c;你可以使用bypy开源模块&#xff0c;它提供了丰富的功能&#xff0c;包括显示文件列表、同步目录、文件上传。 仅支持…

014 - C++ 类

本期我们要讲的是 C 中的类。 我们终于讲到了面向对象编程&#xff0c;这是一种非常流行的编程方式&#xff0c;面向对象编程实际上只是一种你可以采用的编写代码的方式&#xff0c;其他语言例如 C#、Java 这些主要是面向对象的语言&#xff0c;事实上&#xff0c;用这些语言你…

JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…