当前位置: 首页 > article >正文

展锐平台手机camera 软硬件架构

曾经在紫光展锐做过几年的camera驱动,经历过从2013 年最初的几人团队,每人独当一面,负责很多的模块,到后面的逐步的精细化,设计部门按照内核驱动,hal驱动,tuning效果,3A,效果算法等展开,个人和团组只需专注于某一层面的模块或者算法的反复迭代。虽然离开展锐已经数年,对其中软硬件开发过程中的映像还是比较深刻,对开发的规范执行和架构和feature实现的优化选择尤为感慨,这里做个对当时情景的分享回顾,让大家对手机里面的camera架构有个了解。

在这里插入图片描述

以上是当时camera系统的软硬件大致架构。最底下是展锐的isp 硬件系统和外部sensor。其上是内核层的各类对应驱动。再上面是内核层之上,hal层之下的hal 分层驱动,最上就是安卓自带的cameraserver,在app 和 hal之间来调用传递帧和各类参数。

HW 层

HW这个对应的层级是硬件层,主要是芯片里面的isp 硬件系统,相机后处理模块cpp,csi /mipi,外部的各类典型的sensor。

这里isp 硬件系统包含了online 处理部分的DCAM 和offline的isp,不包括mipi csi controller和dphy,展锐对于isp硬件的定义和行业稍有差异,业内把所有从sensor 进入的mipi dphy 到最终输出到DDR buffer 之前的所有关于图像流处理的硬件系统都称之为isp,如上图虚线框内的这部分。

online 部分的DCAM 硬件接收从mipi csi controller 过来的数据流,实现预览录像和拍照的数据分流,还有其他的pdaf,vch 虚拟通道的解包分流等。这些通路接受sensor过来的全尺寸图像,变换为最终输出的图像流的各种尺寸。在通路内部增加了不同的效果处理模块,这些模块会在后续展开。dcam 分流出来的通路最终会把图像帧吐到驱动设定的各个轮转buffer内,给offline的isp 做输入。
offline部分的isp硬件接收送来的图像帧,在原先的30fps的基础上做分时的预览/拍照/录像的帧的效果处理,一般来说,一个33ms内分成4个slot,按照预览/拍照/录像/拍照 这样的顺序做处理,之所以这样设计isp,是因为针对大尺寸的拍照图片,在online 的处理上带宽不容易满足,容易产生瓶颈导致右堵塞通路的情形。做成这种offline 处理后,将图像在宽度方向上按照2592 的最大切片宽度做分割,这样64M 或者上亿分辨率的大图像,在宽度方向上切割成几个slice切片,针对每个slice 做分别处理,在设置上做准备的配置,使isp输出在每个行上对应的切片位置,最终输出完整的一帧处理后的大图像,绕开了超级大图带来带宽瓶颈。唯一的不足就是拍照牺牲了实时性。需要几帧的时间来完成大图的isp 处理。
对于预览和录像来说,没有这种切片需求,1个slot 内基本都能处理完毕。如果在运行期间没有拍照,那isp 会把拍照这部分的带宽让出来优先处理正在运行的预览录像。

cpp 这部分是相机的后处理模块,主要是关于图像的旋转和拉伸,拉伸主要用于在拍照过程中需要的输出320*240的thubmbnail 图,这样方便和大图一起合成最终的jpeg图,在PC 上能被正确的看到图标。旋转主要是90,180,270 ,mirror,flip这类简单的翻转。

csi/phy 是关于mipi csi controller和dphy,cphy 这类,展锐有自己实现的这类模块,这些

sensor 就是手机上的各类sensor,包括前后摄像头,双摄的第2颗辅助摄像头,其他应用场景的摄像头等,同i2c来写入配置,产生mipi 总线上的图像流输出到ISP系统

kenerl 驱动层

对应于硬件上的结构设计, 在kernel 内部也是做了相应的设计。
isp 的驱动在最早的版本上是实现了V4L2 框架的设计,后续为了方便支持双摄等场景,剥离了V4L2 ,采用了简单的类V4L2 接口的misc 设备节点,在对应V4L2 ioctl 命令的基础上增加了BIND/UNBIND 摄像头对应的dcam 这样的操作接口。这样不用大改user到HAL 这层的驱动,就能沿用上之前的框架。

isp 驱动最上层dcam_core 这层接口,实现输入图像流,各路输出图像的尺寸,格式,帧buffer的配置,最终启动streamon, 通过dequeue,queue 实现各路图像帧的上传输出和排队再次等待接收图像帧。或者streamoff 停止图像流的接收等,这一层完全是逻辑相关的,不涉及到任何的硬件操作。实现了对上的cmr_grab 的适配,对下的dcam_drv 和isp_drv 的调配。
dcam_core下面右dcam drv 和isp drv 这两种驱动模块,分别处理online 和offline 部分,dcam drv主要是关于online的输入图像的接口模块的cap_top和各个输出通路的寄存器的配置,各类中断的响应,输出buffer的排队踢出和压入。还有关于各个效果模块的分别参数配置等等,3A信息帧的配置输出和回收配入,通道sof 等中断信息的发出。isp drv 是关于offline 分时调度的配置和大图slice 切割的配置,中间还是dcam 剩余的效果处理,比如full RGB域,YUV域的效果模块配置。

类似的cpp 也是这样分为cpp_core和cpp_drv 这样的分层处理,cpp_core是逻辑层的接口,主要识别是拉伸还是旋转的配置启动。在cpp_drv里面实现了具体的拉伸还是旋转的寄存器配置和完成通知。

sensor 驱动抽象了所有sesor的供电,配置clk,配置i2c 地址,传输配置参数这类共同的操作接口,还有就是mipi phy和controller的初始化装载和卸载。user 层sensor驱动只需要将具体的配置表(寄存器和值这样)和相关的reset,powerdown有效配置传入,kernel就能正确的驱动。

除此之外,kernel 还有你关于各个模块内需要的上下电接口pw,clk 配置接口等

HAL层驱动

这就是展锐当时的camera 内部的软硬件系统架构。


http://www.kler.cn/news/309536.html

相关文章:

  • 2024ICPC网络赛第一场
  • 【源代码+仿真+原理图+技术文档+演示视频+软件】基于物联网技术的宠物居家状况监测系统设计与实现
  • Kotlin 极简小抄 P1(变量与常量、基本数据类型、流程控制)
  • 【C++】一次rustdesk-server编译记录
  • 从数据仓库到数据中台再到数据飞轮:社交媒体的数据技术进化史
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-12
  • LED灯、蜂鸣器、继电器的控制
  • 【店雷达全网图搜比价盘点】1688、淘宝、阿里国际、亚马逊、速卖通5大平台
  • 一次渲染十万条数据:前端技术优化(上)
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • 分布式中间件-redis相关概念介绍
  • B3636 文字工作
  • LabVIEW编程快速提升的关键技术
  • 【VScode】配置多账户连接远程服务器
  • PWN College 关于sql盲注
  • 【Hot100】LeetCode—72. 编辑距离
  • vue2制作高复用页面
  • 系统架构师考试学习笔记第五篇——架构设计补充知识(25)专业英语
  • Spring部分常见面试题
  • 关于Spring Cloud Gateway中 Filters的理解
  • 健身房预约小程序定制搭建,数字化运营管理
  • Python+Pytest框架,“api_key.py文件怎么编写“?
  • 【乐企-业务篇】生成发票左上角二维码
  • Linux和C语言(Day 12)
  • 华南医电科技集团受邀出席中马建交50周年高级别经贸合作交流活动
  • [Redis] Redis中的set和zset类型
  • 云轴科技ZStack 获鲲鹏应用创新大赛2024上海赛区决赛一等奖
  • vue3-print打印eletable某一行的数据
  • TI AM62X Secure Boot 流程简述
  • (黑马点评)六、好友关注系列功能实现