Camera知识体系架构之驱动&应用&调试学习笔记-以瑞芯微RV1109为例(一)

简介: Camera知识体系架构之驱动&应用&调试学习笔记-以瑞芯微RV1109为例(一)

Camera知识体系庞大、又杂、又难,虽然资料也不少,但是都很乱,很容易让人感到迷茫,失去学习的信心。对于初入这个体系的小白很难找到自己的学习的目标和方法。众所周知,学好Camera相关的知识,能够在音视频相关等行业拿到非常高的报酬:

640.png

640.png

根据最近自己调试瑞芯微RV1109平台Camera的一些心得体会,我将它们一一总结出来分享给大家:

1、瑞芯微平台Camera调试知识体系

1.1、调试RK平台摄像头的一些关键缩写语
缩写 全称
3A =>(AWB, AE, AF) 表示AWB, AE, AF的简写
AE =>(Auto Exposure) 表示自动曝光
AF =>(Auto Focus) 表示自动对焦
AWB =>(Auto White Balance) 表示自动白平衡
FBC =>(Frame Buffer Compressed) 表示帧缓冲压缩
FBC0 =>f(Rockchip yuv420sp fbc encoder) 表示RK平台yuv420sp fbc 编码
FBC2 =>(Rockchip yuv422sp fbc encoder) 表示RK平台yuv422sp fbc 编码
RkAiq =>(Rockchip Automatical Image Quality) 表示RK平台自动图像质量
IQ =>(Image Quality) 表示图像质量
ISP =>(Image Signal Process) 表示图像信号处理
ISPP =>(Image Signal Post Process) 表示图像信号后处理
1.2、瑞芯微平台Camera调试知识体系划分

640.png

以上分为:软件控制流程、图像算法、图像效果,这是相对于Android平台来划分的(图片来源于韦东山老师专家计划的Camera相关章节的学习笔记)。对于驱动工程师,我们只需要关注以下两个点:


图像算法:ISP算法(硬件)、3A算法(AE(曝光),AF(自动对焦),AWB(自动白平衡)、后处理算法(HDR、MFNR)


图像效果调试(Tunning):ISP调试、3A调试、后处理算法调试

1.3、瑞芯微平台中Camera的数据流通路

640.png

如上图(图片来源于瑞芯微原厂文档)所示,这张图反馈了以下信息:


Camera数据经过ISP20采集,ISP20再输出经过一系列图像处理算法后的数据,RkAiq不断从ISP20获取统计数据,并经过3A等算法生成新的参数反馈给ISP20,如上所示,以上的设备节点并不是固定的,它可能会改变,我们可以使用media-ctl查看对应的节点。


RKISP驱动主要是依据v4l2 / media framework实现硬件的配置、中断处理、控制 buffer轮转,以及控制subdevice(如mipi dphy及sensor)的上下电等功能,它的处理过程其实是非常复杂的,我们来看下面这张图(图片来源于瑞芯微原厂文档)就知道了:

640.png

1.3.1、通过搜索/sys目录下查找对应的节点名称
grep "" /sys/class/video4linux/*/name

来获取相应的节点,如下所示,这是通过grep "" /sys/class/video4linux/*/name来获取的节点信息:

640.png

640.png

640.png

640.png

这里你可能会发现,一个ISP节点有多个video节点的对应关系,其实它们是位于不同的media设备下的,因此在不同的media下所对应的video节点也是不同的。


其中,冒号前面的一部分表示video节点,冒号后面一部分就是ISP节点:

640.png

如上所示,video节点为:

/sys/class/video4linux/v4l-subdev0/name

ISP节点为:

rkispp-subdev
1.3.2、通过media-ctl获取拓扑信息

我们可以通过media-ctl获取拓扑信息,然后找到相应的数据通路,分别输入以下指令:

media-ctl -p -d /dev/media0
media-ctl -p -d /dev/media1
media-ctl -p -d /dev/media2
media-ctl -p -d /dev/media3

然后我们就可以找到ISP20输出的四路数据的信息了:

640.png

也就是说,我们在应用程序中只需要去操作:

/dev/video30  或  rkispp_m_bypass
/dev/video31  或  rkispp_scale0
/dev/video32  或  rkispp_scale1
/dev/video33  或  rkispp_scale2

就可以对摄像头进行驱动了,另外:


rkispp_m_bypass这路数据流比较特殊,其不支持设置分辨率,其输出分辨率由ISP输入的分辨率决定,可以通过media-ctl查看拓扑结构确定ISP输入的分辨率:

640.png

如上所示,rkispp_m_bypass这路输出的分辨率为1920x1080。


其它三路数据:rkispp_scale0、rkispp_scale1、rkispp_scale2节点支持缩放,每一路支持的最大分辨率如下所示:

节点名称 视频设备ID 最大支持宽度 支持输出格式
rkispp_m_bypass /dev/video30 不支持设置分辨率,不支持缩放 NV12/NV16/YUYV/FBC0/FBC2/
rkispp_scale0 /dev/video31 max width: 3264,最大支持8倍缩放 NV12/NV16/YUYV
rkispp_scale1 /dev/video32 max width: 1280,最大支持8倍缩放 NV12/NV16/YUYV
rkispp_scale2 /dev/video33 max width: 1280,最大支持8倍缩放 NV12/NV16/YUYV

video id 节点不是固定的,我的节点也是通过media-ctl查看的。当然我们也可以使用v4l2-ctl来抓图,测试数据是否正常通信。

1.3.3、图像优化调试3A算法

当Sensor输出RAW BAYER RGB格式时,如RGGB,BGGR,GBRG,GRBG等,需要ISP20提供一系列图像处理算法来优化图像效果,此时需要RkAiq模块介入。


SDK提供了一种3A独立进程的方式(ispserver)集成了RkAiq库librkaiq.so,当我们使用RK提供的RKMEDIA进行编程获取据流时,能够得到具有ISP调试效果的图像。

2、RKISP调试

21、查看摄像头sensor驱动的适配情况

我选用的是gc2053这款摄像头,并且在Linux设备树中已经做了相应的支持,故我们可以通过获取内核启动信息来查看摄像头驱动的加载情况,获取方法:

dmesg | grep "gc2053"

我们可以看到如下信息:

640.png

其中,如果能在内核信息中看到以上两行信息:

[    0.831096] gc2053 1-0037: Detected GC2053 sensor
[    0.831201] rockchip-mipi-dphy-rx ff4b0000.csi-dphy: match m00_f_gc2053 1-0037:bus type 4

即表示摄像头已经适配成功了!

2.2、获取驱动版本号

搜索应的字段:

dmesg | grep "rkisp driver version"
dmesg | grep "rkispp driver version"

如下:

640.png

或者通过以下命令获取:

cat /sys/module/video_rkisp/parameters/version
cat /sys/module/video_rkispp/parameters/version

如下:

640.png

2.3、如何判断RKISP驱动加载状态

RKISP驱动如果加载成功,会有video及media设备存在于/dev/目录下。系统中可能存在多个/dev/video设备,通过/sys可以查询到RKISP注册的video节点:

grep '' /sys/class/video4linux/video*/name

查询信息如下:

640.png

当然也可以通过media-ctl命令来打印拓扑结构查看pipeline的状态是否正常,如果RKISP驱动加载成功,则在内核中能看到如下打印:

dmesg | grep Async


640.png

如果没有的话,则需要返回到1.1步骤去检查摄像头sensor驱动是否有报错,检测I2C通讯是否正常。

往期精彩

超轻量级网红软件定时器multi_timer(51+stm32双平台实战)


使您的软件运行起来: 防止缓冲区溢出(C语言精华帖)


RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)


数显仪表盘显示“速度、方向、计数器”的跑马灯


MCU串口命令解析器的实现TKM32F499评估板串口通信学习与实践笔记

目录
相关文章
|
3天前
|
Kubernetes Cloud Native 持续交付
探索云原生架构:打造弹性可扩展的应用
【9月更文挑战第29天】在云计算的浪潮中,云原生架构成为企业追求高效、灵活和可靠服务的关键。本文将深入解析云原生的概念,探讨如何利用容器化、微服务和持续集成/持续部署(CI/CD)等技术构建现代化应用。我们将通过一个简易的代码示例,展示如何在Kubernetes集群上部署一个基于Node.js的应用,从而揭示云原生技术的强大能力和潜在价值。
14 6
|
4天前
|
监控 Cloud Native 持续交付
云原生架构:构建弹性与高效的现代应用##
随着云计算技术的不断成熟,云原生架构逐渐成为企业技术转型的重要方向。本文将深入探讨云原生的核心概念、主要技术和典型应用场景,以及如何通过云原生架构实现高可用性、弹性扩展和快速迭代,助力企业在数字化转型中保持竞争优势。 ##
22 6
|
5天前
|
运维 Cloud Native 持续交付
云原生架构:构建未来应用的基石
本文将深入探讨云原生架构的核心概念、主要优势以及实际应用案例,揭示其在现代IT领域的重要性。通过详细解析云原生技术的各个方面,帮助读者更好地理解和应用这一前沿技术。
|
7天前
|
Cloud Native 持续交付 云计算
探索云原生架构:构建现代应用的新范式
在当今数字化浪潮中,云原生架构以其敏捷性、弹性和可扩展性成为企业技术转型的核心驱动力。本文将引领读者深入理解云原生的概念,剖析其关键技术组件——微服务、容器化、DevOps实践及持续交付/持续部署流程,并揭示这些技术如何相互协作,共同构建高效、可靠且易于管理的现代软件系统。通过对云原生架构的全面解读,我们旨在为开发者、架构师乃至企业决策者提供有价值的见解与指导,助力其在快速变化的市场环境中保持竞争力。
|
12天前
|
Kubernetes Cloud Native Serverless
探索云原生技术:从基础架构到应用实践
本文深入探讨了云原生技术的各个方面,包括其定义、核心原则、关键技术组件以及在现代企业中的应用。通过分析云原生如何推动数字化转型和提高业务敏捷性,文章旨在为读者提供对这一领域的全面了解和实际应用的指导。
41 7
|
14天前
|
Kubernetes Cloud Native 持续交付
深入理解云原生技术及其在现代IT架构中的应用
【9月更文挑战第18天】云原生技术,作为推动企业数字化转型的引擎,正以它独特的魅力重塑着信息技术的未来。本文将带你一探究竟,从云原生的基础概念出发,逐步深入到其核心组件、设计理念以及如何在实际应用中发挥巨大作用。你将了解到容器化、微服务架构、持续集成与持续部署(CI/CD)等关键实践,并见证它们如何帮助企业构建更加灵活、高效和可靠的应用。
|
6天前
|
前端开发 测试技术 API
探索微前端架构:构建现代化的前端应用
在软件开发中,传统单体架构已难以满足快速迭代需求,微前端架构应运而生。它将前端应用拆分成多个小型、独立的服务,每个服务均可独立开发、测试和部署。本文介绍微前端架构的概念与优势,并指导如何实施。微前端架构具备自治性、技术多样性和共享核心的特点,能够加速开发、提高可维护性,并支持灵活部署策略。实施步骤包括定义服务边界、选择架构模式、建立共享核心、配置跨服务通信及实现独立部署。尽管面临服务耦合、状态同步等挑战,合理规划仍可有效应对。
|
6天前
|
Cloud Native Devops 持续交付
探秘云原生架构:构建高效、灵活的现代应用
在当今数字化时代,企业面临着日益复杂的技术挑战和快速变化的业务需求。为了适应这种环境,云原生架构应运而生。本文将带您深入了解云原生的核心概念、关键技术和应用案例,揭示其在提升业务效率、降低运维成本方面的独特优势。通过阅读本文,您将获得关于如何利用云原生技术构建现代化应用的宝贵见解。
20 0
|
9天前
|
传感器 监控 物联网
无线传感器网络的基本架构及其广泛应用
无线传感器网络的基本架构及其广泛应用
34 0
|
14天前
|
Kubernetes Cloud Native Devops
云原生架构的崛起与应用##
云原生架构是现代企业数字化转型的关键,通过容器化、微服务、DevOps等技术,实现高效、灵活的应用部署和管理。本文探讨云原生的核心概念、主要技术及其实际应用价值,揭示其在提升企业运营效率和创新能力中的重要性。 ##
19 0
下一篇
无影云桌面