OpenHarmony-v3.0-LTS Camera相机驱动框架(L2)解析1_初始化 原创 精华
OpenHarmony-v3.0-LTS Camera相机驱动框架(L2)解析1_初始化
说明
- 解析源码基于 OpenHarmony-v3.0-LTS 版本,代码结构和部分源码与当前维护的主线分支有差别。
- 解析示例代码 drivers\peripheral\camera\hal\init\demo_main.cpp
1. 简介
HarmonyOS 相机驱动框架模型对上实现相机HDI接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
各层的基本概念如下:
- HDI实现层,对上实现OHOS相机标准南向接口。
- 框架层,对接HDI实现层的控制、流的转发,实现数据通路的搭建、管理相机各个硬件设备等功能。
- 适配层,屏蔽底层芯片和OS差异,支持多平台适配。
2. 框架图
3. 代码结构
4. 源码解析
上层demo代码相对简单,这里只贴出关键部分代码
4.1 Hos3516Demo::InitSensors()
4.1.1 上层代码
上层获取HDI层的ICameraHost:设备管理接口,并设置Host层的回调。
4.1.2 时序图
- CameraHostProxy 提供上层调用的代理接口。
- CameraHostStub 提供对应代理接口的HDI层的 ‘桩’。
- CameraHostImpl 是接口层的具体实现。
Proxy-Stub 负责上下接口参数的数据转换等工作。
4.1.3 ICameraHost::Get(const char *serviceName)
从ServiceManager中取出CameraHostProxy。并返回ICameraHost接口类指针
4.1.4 CameraHostProxy::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback)
ICameraHostCallback 回调接口类定义了下面两个回调接口,在CameraHostCallback类中具体实现并通过IPC通讯最终设置到CameraHostImpl
client::host_proxy发起IPC —> server::host_service_stub
注意 这里有个坑! 通常 SendRequest() 和 OnRemoteRequest() 是一对。sendRequest()在client::XXX_proxy调用,OnRemoteRequest() 在server::XXX_stub调用。但是CamereaHost 的OnRemoteRequest是由 HDF中的 HdfCameraService来接收 通过Dispatch接口再调用具体的CameraHostStub!!
这里的proxy和stub 的cmdID 宏定义名字不一样,不太利于代码阅读。
最终调用到HDI 接口层的camera_host 完成callback的设置。
4.2 Hos3516Demo::InitCameraDevice()
4.2.1 上层代码
获取CameraIds 、获取默认前置的摄像头设备的ability、创建CameraDeviceCallbak 并OpenCamera
4.2.2 时序图
4.2.3 GetCameraIds()和GetCameraAblilty()
先来看下两个简单的设备信息获取接口。
获取系统配置中的cameraIds和CameraAbility
IPC 的过程和setcallback一样 此处 略去 IPC相关代码和时序图
直接看实现CameraHostImpl::GetCameraIds() 和 CameraHostImpl::GetCameraAbility(),调用了CameraHostConfig::GetCameraIds()和CameraHostConfig::GetCameraAbility()
CameraHostConfig负责从camera_host_config.hcb文件读出设备驱动信息。
hcb文件是由hcs文件通过build_hcs.py工具生成的具体生成的相关代码在驱动芯片适配的BUILD.gn中
4.2.4 OpenCamera()
先简单说下callback。
这里会先创建一个CameraDeviceCallback设备回调 作为Camera设备的回调接口。CameraDeviceCallback的接口类定义在
开始OpenCamera()。还是通过一次ipc 最后到HDI的camera_host
CameraHostImpl::OpenCamera 先从cameraDeviceMap_中查找cameraId对应的CameraDeviceImpl,然后通过CameraDeviceImpl设置device的callback.
再通过cameraId从CameraHostConfig查出对应的phyCameraIds,在调用CameraPowerUp接口完成上电.
最后把CameraDevice的status set true.
至此上层的相机初始化就完成了。
5 这里留下了两个问题
- cameraDeviceMap_中的值什么时候设置的?
- CameraPowerUp() 如何完成上电的功能?
将在下一章节进行解析
期待楼主后续解答
怎么把这个应用编译出来?