Camera 快速指南
本篇主要介绍 Spacemit K1 平台 Camera 模块的快速上手开发。
K1 仅支持 MIPI 类型接口,使用 Spacemit camera 驱动框架。
Camera 快速点亮导览
点亮一款新的摄像头,通常仅需要调整 cam-test 应用层的代码即可快速支持上。
点亮 sensor 所依赖的上下电 GPIO,MCLK 时钟,MIPI lane 配置等硬件功能配置,在方案对外发布前就已经由内部工程师提前开发验证完毕,极少数情况下需要修改配置 dts 和驱动。比如:由于外部不可抗拒原因,必须要对主板的 MIPI CSI 接口电路进行更改,上电 GPIOA 更改为 GPIOB,MCLKA 更改为 MCLKB 等,此情况下需要重新定制内核 dts 配置,详情参阅 3.6 bring up 章节内容。
如果不考虑特殊情况,点亮一款新摄像头,建议按照以下步骤展开:
- 根据当前摄像头型号,复用列表中已支持的相近型号的应用代码(主要是复用摄像头应用的代码结构排布,减少开发工作量),修改函数名称,结构体名称等为当前摄像头型号,详情参阅 4.4 bring up 章节内容。
- 阅读摄像头的数据手册,确定摄像头的寄存器位数,I2C 地址,上电流程,ID 寄存器以及 ID 值,并修改 sensor 应用代码,其中,上电流程可以参阅 3.4 sensor 驱动章节内容.
- 配置摄像头的 setting tab 寄存器数组,并根据原厂提供的信息,或计算出来的数值,确定配置所使用的 lane 数/HTS/VTS/MCLK/FPS/PCLK/分辨率/data Lane 等信息,并完善函数内容(主要关注 xxx_spm_get_sensor_capbility 和 xxx_spm_get_sensor_work_info 函数)。
- 调整 xxx_sensor.c 源文件中使用到的曝光增益等寄存器地址。
- 尝试上电读 ID 测试,如果读 ID 失败,请重新检查步骤 1。
- 尝试出图测试,出图测试可以选用 single online test,详情参阅 5.3 场景介绍章节内容。如果出图失败,可以使用 only viisp case 再测试。如果仍旧失败,请认真检查步骤 3,步骤 4,或寻求工程师协助分析。
- Single online test 正常出图的 log,可以参阅 6.2 章节内容。
备注:关于测试应用以及各个 test 的介绍,可以参阅第 5 章节内容。
Camera 子系统硬件框图
Figure - camera 硬件子系统示意图
各个模块的功能如下:
- SENSOR: 将从镜头传导过来的光线转换为电信号,再通过内部的 AD 转换为数字信号,最终输出 mipi raw 数据。
- CCIC: cmos camera image controller 的简称,解析接收 sensor 发送的 mipi 数据。
- IDI: ISP 硬件内部模块,接收 ccic 发送的数据或者从 ddr 读取数据,发送到 ISP Pipeline;同时可以将 ccic 发送的数据 dump 到 DDR。
- ISP-PIPE: ISP 硬件内部 pipeline,进行一系列图像相关算法的处理。
- ISP-FORMAT: ISP 硬件内部模块,控制输出的图像格式。
- ISP-DMA: ISP 硬件内部模块,将图像输出到 DDR 中。
- CPP: 图像降噪处理和边缘增强。
Camera 驱动框架
本章节内容仅学习了解即可,除了 sensor 驱动部分内容,其余在 bring up senosr 基本不会使用到。
框架简介
Spacemit camera 驱动框架是基于 linux 内核 v4l2 框架实现的,主要提供如下功能:
- 访问 camera 各个模块的硬件寄存器
- 响应中断
- buffer 和 event 的管理
- 给 user space sdk 提供调用接口
在 camera 子系统中各个模块之间的关系如下图所示:
从软件调用关系来看,从上到下依次分为以下三层:
- userspace:运行在用户空间。主要包括 ISP,CPP,VI 和 tuningtools 软件库,ISP, CPP firmware 库及 sensor 模块源码。用户主要通过调用 ISP,CPP,VI 和 sensor 模块的接口来实现 camera 应用场景。firmware 库中的接口会由 ISP 和 CPP 软件库进行内部调用。另外,如果用户需要使用 ASR 的 tuning tool 来调试 ISP/CPP 的输出图像效果,需要在应用程序中调用 libtuningtools.so 的接口创建 tuning server。
- kernel space:运行在内核空间。主要提供 ISP,CPP,VI,CCIC 及 sensor 的驱动。
- hardware layer:驱动实际调用的硬件模块。