尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

高通学习6--Camx (TODO)

高通学习6--Camx (TODO) TODOhttps://github.com/quic/sample-apps-for-robotics-platforms/tree/master/RB1RB2/peripheral-devices/camera-hal3-sample高通处理器的相机系统尤其是从骁龙845/865、RB5 到 RB1/RB2 开始用的架构是极为复杂的整体链路从上到下可以分为 4 层第 1 层ROS 2 / 应用层你的业务代码比如调用 Camera 读取图像并发送 ROS2 话题。第 2 层Camera HAL3 Sample就是这个 GitHub 链接 这是一个应用层的 Demo或者是camera_server的简化替代品。它直接去调用 Android 标准的hardware/libhardware/include/hardware/camera3.h接口。它的角色是“消费者”通过发起processCaptureRequest()、配置流Streams强行向底层的硬件索要图像数据。第 3 层CamX高通的硬核核心真正的商业机密这才是真正的CamX / Chi 架构。它作为高通的底层大 So二进制动态库如camera.qcom.so实现了 Android 的 HAL3 标准接口。当上面的 Sample 发出请求时CamX 内部的代码会去调度高通内部的 ISP图像信号处理器、控制 Sensor 上电、配置时钟。注CamX 的源码是绝对闭源的。非高通授权的 Tier-1 客户或没签高额 NDA 的开发者是根本看不到 CamX 源码的里面全是高通极致调优的 ISP 算法和寄存器配置。第 4 层Chi-CDK / Kernel 驱动负责在 Linux 内核层通过v4l2或者是高通专属的msm_cam节点跟摄像头芯片如 IMX577, OV9284进行物理的 I2C 通信和 MIPI 数据接收。可以学而且如果你的目标是在高通平台上真正把 Camera bring-up / debug 做起来我不建议从“CamX 全部源码”开始啃。CamX 太大最有效的方法是沿着一帧 Preview 的 request 和 buffer 到底怎么走来学。Android 官方的 Camera HAL 本质上位于 Camera2/framework 和底层 driver/hardware 之间HAL3 的核心模型就是 framework 下发 capture requestHAL 处理 request、buffer 和 metadata再异步返回 result。(Android Open Source Project)第一阶段先把 HAL3 搞懂先不要碰 CamX 细节。你至少要能解释Camera App ↓ Camera2 API ↓ CameraService ↓ Camera Provider / HAL3 ↓ Camera Driver ↓ Sensor / CSIPHY / ISP尤其搞懂这几个东西camera3_stream_t camera3_stream_configuration_t camera3_capture_request_t camera3_capture_result_t camera3_stream_buffer_t camera_metadata_t最终脑子里要形成这个模型configure_streams() ↓ process_capture_request() │ ├── settings / metadata ├── input buffer └── output buffers ↓ Camera ↓ process_capture_result()如果 HAL3 不熟直接看 CamXSession/Pipeline/Node/Usecase/Feature很容易全部混在一起。Android 官方的 Camera HAL 文档 可以作为这一阶段的基准资料。第二阶段只学 CamX 的五个核心概念CamX 第一轮我建议你只记Usecase → Session → Pipeline → Node外加一个Feature。CamX/CHI 的公开资料也基本围绕这套抽象Pipeline 是一条 topologyNode 是 pipeline 中的逻辑处理单元而 Usecase、Session、Feature 再组织这些 pipeline。(GitHub)例如先粗略理解成Usecase: Preview │ └── Session │ └── Realtime Pipeline │ ▼ Sensor │ ▼ IFE │ ▼ IPE │ ▼ Preview Buffer第一遍不要研究每个 class 的成员变量。你只需要看到代码时能马上判断Usecase ↓ 这是一个 Camera 使用场景 Session ↓ 管理一组 Pipeline 的执行 Pipeline ↓ 描述数据处理路径 / topology Node ↓ 具体处理节点 Feature ↓ HDR / MFNR / Bokeh 等复杂功能组织这一步完成CamX 就从“一坨代码”变成了一张图。第三阶段沿一个 Preview request 追代码这是最重要的一步。假设 AppcameraDevice.createCaptureRequest(...)最后进入 HAL3Framework process_capture_request() ↓ CamX HAL ↓ CHI ↓ Usecase ↓ Session ↓ Pipeline ↓ NodeCamX 常见源码布局中HAL3 入口位于camx/src/core/hal一带核心的 Session、Pipeline、Node 位于camx/src/coreCHI/CDK 则承担大量 usecase/OEM 定制逻辑。不同 Qualcomm baseline/产品代码会有差异所以以你项目里的代码为准。(GitHub)第一轮建议重点搜索这些camxhal3entry.cpp camxhaldevice.cpp camxsession.cpp camxpipeline.cpp camxnode.cpp然后拿纸/笔记自己画process_capture_request │ ▼ XXXXX() │ ▼ XXXXX() │ ▼ Session │ ▼ Pipeline │ ▼ Node不要一进去就研究 IFE 里面几千行代码。先把 request 主干追通。第四阶段第二次追踪不要追 request追 Buffer这个和我们刚才聊的 DMA-BUF / IOMMU 会直接连接起来。问自己Preview 的一块 Buffer 到底哪里来的沿着Framework │ │ output buffer ▼ CamX │ ▼ Buffer Manager │ ▼ DMA-BUF / native buffer │ ▼ DMA mapping │ ▼ SMMU │ │ IOVA ▼ IFE / IPE然后再回来Sensor ↓ CSI ↓ IFE ↓ DDR Buffer ↓ IPE ↓ Preview Buffer ↓ Framework ↓ Surface如果你能回答“一帧 NV12 preview buffer 从哪里申请、谁持有、谁 DMA、什么时候完成、什么时候返回 framework”你的 CamX 理解就已经开始进入工程层面了。第五阶段再追 KernelCamX 里面有一个你应该特别关注的层CSL — Camera Support Layer常见架构资料把 CSL 描述为 CamX 与 Camera kernel driver 之间的统一控制接口。(博客园)于是整个架构开始连起来Android Framework │ ▼ HAL3 │ ▼ CHI │ ▼ CamX │ ├── Session ├── Pipeline ├── Node │ ▼ CSL │ ▼ ioctl() │ ▼ Kernel Camera Driver │ ├── Sensor ├── CSIPHY ├── CSID ├── IFE └── ...这时候你再去看camx/src/csl/才有意义。第六阶段专门攻 Sensor Bring-up如果目标不是“研究 Camera 算法”而是项目中把 Camera 点亮我会把重点明显偏向这一条Sensor Probe ↓ I2C ↓ Power Sequence ↓ MCLK ↓ Sensor ID ↓ Sensor Init ↓ Sensor Mode ↓ MIPI CSI ↓ CSIPHY ↓ CSID ↓ IFE ↓ DDR ↓ Preview你真正应该练的是黑屏以后我怎么判断断在哪一层例如Sensor probe 都没成功 ↓ 先别看 CamX Pipeline Sensor stream on 成功 但 CSIPHY 没数据 ↓ 查 MIPI / lane / clock CSID 有数据 IFE error ↓ 查 format / VC / DT / configuration IFE 正常 Preview 黑 ↓ 再往 Buffer / IPE / HAL / Framework 查这种能力比“我看过 CamX 20 万行源码”值钱得多。结合你前面学的东西其实已经能串起来了你刚才连续问的 DMA、DMA-BUF、IOMMU/SMMU 并不是旁枝Camera │ ▼ CamX │ ┌────────┴────────┐ │ │ Control Data │ │ CSL DMA-BUF │ │ ioctl SMMU │ │ ▼ ▼ Kernel Driver ←────→ Buffer │ ▼ Sensor / CSI / ISP这也是为什么我比较建议你现在开始 Camera而不是继续无限扩展底层概念遇到 DMA-BUF、SMMU、V4L2、media、fence、cache 时再针对性补会快很多。如果按8 周左右来做我会安排成HAL3 → CamX 架构 → Preview Request → Buffer → CSL/Kernel → Sensor/CSI → 实际 log/debug → 独立分析一次 bring-up 问题。另外Qualcomm 现在公开的camera-service仓库也明确展示了 HAL3/CamX backend 与 camera driver 的关系可以作为没有完整商业 CamX 文档时的辅助材料。(GitHub) Qualcomm camera-service如果你手里已经有项目的vendor/qcom/proprietary/camx和chi-cdk源码那就更好下一步最适合直接做一次“从process_capture_request()开始带你逐函数追一帧 Preview”。这会比继续看泛泛的 CamX 教程有效很多。
返回列表