openharmony camera 模块学习

openharmony camera模块学习

  • 学习目的
  • 学习记录
  • 缩写解释
      • HDI: hardware device interface(硬件设备接口)
      • HDF:hardware driver foundation(硬件驱动层)
      • OSAL:operation system abstraction layer(操作系统适配层)
      • V4L2:video for linux2(linux中关于视频设备的内核驱动)
    • 一、概述
    • 二、CAMERA HDF驱动框架
    • 三、用户应用层
    • 四、camera应用通过ioctl到达内核态后的处理
    • 五、HDI适配硬件
    • 六、具体硬件适配
    • 七、PipelineCore和Stream
  • 总结
  • 参考文章


学习目的

理解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)差异,支持多平台适配。

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

openharmony camera 模块学习_第1张图片
openharmony camera 模块学习_第2张图片
这个图更详细,是从https://blog.51cto.com/harmonyos/4903529粘来的。

引用一些要点来辅助学习

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

二、CAMERA HDF驱动框架

openharmony camera 模块学习_第3张图片
根据参考文章梳理出的图,后续可以对应具体代码去看。
可以参考这个https://blog.51cto.com/harmonyos/4903529。这个图比代码里的readme.md更详细一些。
代码位置为drivers/peripheral/camera。
openharmony camera 模块学习_第4张图片
openharmony camera 模块学习_第5张图片
撸了下代码,流程跟参考文章里的文字描述基本一致。
也可以参考这个去看
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
openharmony camera 模块学习_第6张图片
openharmony camera 模块学习_第7张图片
猜测相机的其他功能也是调用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

你可能感兴趣的:(openharmony,学习,harmonyos,risc-v,ubuntu,c语言)