openharmony camera 模块学习


学习目的

理解openharmony camera整个模块的各方面内容,方便后续自己可以适配新设备的camera模块。

学习记录

看到哪写到哪,所以本文会比较随意。

缩写解释

HDI: hardware device interface(硬件设备接口)

HDF:hardware driver foundation(硬件驱动层)

 OpenHarmony 系统 HDF 驱动框架主要由驱动基础框架、驱动程序、驱动配置文件和驱动接口这四个部分组成

OSAL:operation system abstraction layer(操作系统适配层)

V4L2:video for linux2(linux中关于视频设备的内核驱动)

在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。

一、概述

OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。 该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层,各层基本概念如下:
HDI实现层:实现OHOS(OpenHarmony Operation System)相机标准南向接口(向下至具体摄像机硬件设备)。
框架层:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。
设备适配层:屏蔽底层芯片和OS(Operation System)差异,支持多平台适配。

请仔细理解引用的部分,可以为后续的学习节省大量时间,防止走弯路。

这个图是从官方文档粘来的
这个图更详细,也是粘来的
这个图更详细,是从https://blog.51cto.com/harmonyos/4903529粘来的。

引用一些要点来辅助学习

Camera HDI框架是通过绑定到HDF框架后在系统启动的时候完成初始化 Camera Host 实例。
应用层通过获取Camera Host 实例来得到设备支持的Camera的能力属性,并Open相应的设备。
应用层通过IPC通讯来调用HDI接口。

二、CAMERA HDF驱动框架

在这里插入图片描述
根据参考文章梳理出的图,后续可以对应具体代码去看。
可以参考这个https://blog.51cto.com/harmonyos/4903529。这个图比代码里的readme.md更详细一些。
代码位置为drivers/peripheral/camera。
在这里插入图片描述
在这里插入图片描述
撸了下代码,流程跟参考文章里的文字描述基本一致。
也可以参考这个去看
https://ost.51cto.com/posts/9858

三、用户应用层

可以参考oh版本的代码,本文看的是3.2-beta2的版本。
应该就是之前那个图中的 camera application 和camera service。
代码位置为drivers/peripheral/camera。当然这个目录里还有camera架构的其他模块代码。
具体点应该是peripheral\camera\hal\adapter\platform\v4l2\src\driver_adapter\main_test\v4l2_main.cpp
在这里插入图片描述
在这里插入图片描述
猜测相机的其他功能也是调用ioctl从用户态到达内核态。到达内核态后的操作流程目前还没有看到。

回看后发现不太建议看V4L2的,建议看华为的demo,更清晰peripheral\camera\hal\init\demo_main.cpp。可以更清晰的发现应用层和HDI层的联系。

四、camera应用通过ioctl到达内核态后的处理

待学习

五、HDI适配硬件

具体代码目录为drivers\peripheral\camera\hal\adapter\platform
目前里面有mpp和v4l2两种。mpp应该是海思(MPP)媒体处理软件平台。
新建硬件设备的设备管理类去继承devicemanager,然后实现父类中的各个接口即可,比如powerup之类的。可以参考peripheral\camera\hal\adapter\platform\v4l2\src\device_manager\v4l2_device_manager.cpp。
借鉴https://ost.51cto.com/posts/9881文章中CameraPowerUp()的讲解。

六、具体硬件适配

参考https://ost.51cto.com/posts/22242
没有实操,感觉挺麻烦,需要对整个oh系统有一定的理解才可以。
后续如果亲自操刀的话会补充。

七、PipelineCore和Stream

CameraHostImpl::Init()创建CameraDevice实例对象的时候会实例化PipelineCore的各个子模块包括HostStreamMgr、StreamPipelineCore。

总结

需要慢慢沉下心去研究camera整体架构,各个子模块的功能,与模块间的联系交互。

参考文章

https://ost.51cto.com/posts/22242
https://blog.51cto.com/harmonyos/4903529
https://www.seaxiang.com/blog/06b9a30dca2c4395bdd0d64592f11238
https://gitee.com/openharmony/drivers_peripheral/tree/master/camera
https://gitee.com/openharmony/drivers_peripheral/blob/master/camera/README_zh.md
https://blog.csdn.net/weixin_42203498/article/details/126753239
https://blog.csdn.net/m0_37033731/article/details/124587908

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值