本篇笔记为一个简单总结,主要为了说明一下在软件项目中对于新的sensor器件适配所需要注意的点(个人经验,仅供参考)。
数据手册
一般通过FAE拿到器件手册。拿到手册后重点查看:
sensor的管脚描述,主要是时钟,GPIO,电源等重要管脚描述
sensor的硬件上电时序,一般来说sensor会有一个XSHUTDOWN或类似的信号线来控制芯片的power up,这根信号线通过主机端来控制。
sensor的启动流程。重点关注sensor内部的状态机,如何切换状态机。
sensor的寄存器。很多sensor的寄存器都会划分为静态配置访问和动态配置访问两大类,部分sensor会分的更细,比如boot read和standby状态下能访问的寄存器也不一样。分清除哪些是静态,哪些是动态,什么情况下哪些寄存器的值会生效对于软件代码非常重要。一般来说,对于行长,PLL等的设置都是静态的,动态的配置一般针对积分时间,模拟增益,数字增益等。
sensor的工作时序。了解sensor的工作时序,理清楚如何设置行长,帧长,以及它们和帧率的关系等,曝光参数和增益参数的上下限等。每个厂家的sensor这块都会略有不同。本笔记总结几个常见的概念:
行长(line length) | 表示一行的长度,一般按照像素为单位。 有些sensor厂家会用HTS相关参数表示,具体意义需要和厂家确认 注意:行长包括了实际一行的有效像素以及horizontal blanking 从原理上讲,控制帧率可以通过对行长控制来实现,但是通过这个参数控制帧率比较麻烦,一般来说手册里会建议用户配置行长为一个推荐的最小值(根据ADC的精度而定),帧率的控制一般通过帧长来实现较为容易。 |
帧长(frame length) | 表示一帧的长度,以行为单位。 某些sensor厂家会用VTS相关参数表示,具体意义需要和厂家确认 注意:帧长包含了实际的有效行数以及vertical blanking |
行时间(line time) | 一行数据的时间,和行长相关,其关系如下: line_time = line_length / pixel_clock pixel clock是像素时钟频率 1/pixel_clock就是扫描一个像素的时间 |
积分时间(integration time) | 一般可以认为是曝光行数(exposure lines)的表达, 用来控制曝光时间 |
曝光时间(exposure time) | 有些sensor厂家也写为exposure interval 表示一帧数据曝光的总时间,sensor里配置曝光时间的寄存器,一般以行为单位计算。 因此 exposure time = line_time * integration_time = line_length / pixel_clock * integration_time |
另外,对于有多sensor同步需求的场景(如作为slave角色的sensor),需要从数据手册里找到相关控制寄存器(一般是GPIO或I2C命令同步)。如果要控制闪光灯,找到strobe相关控制的寄存器。
原理图
原理图中对软件来讲,最重要的关注点有:
控制sensor电源开关的信号线,一般为GPIO控制,需要理清连接关系以便写sensor的上下电代码。
如果有做多sensor同步需求的场景,搞清楚trigger方式,如果使用GPIO做触发,搞清楚使用的GPIO管脚。
软件接口实现
根据原理图,配置好相关的GPIO管脚功能。
初始化好sensor的输入时钟。
按照sensor上电要求编写代码,一般是通过对电源开关GPIO管脚进行控制,完成硬件上电操作。
配置好sensor的时钟相关参数(如PLL分频、倍频参数)
加载默认模式下的(例如800*600, 30fps,HDR on)sensor参数配置,一般来说FAE会提供不同分辨率,不同模式下的预设寄存器配置表。
编写上层需要提供start/stop sensor的接口,目的是让sensor进入和退出streaming状态
编写曝光控制,增益控制,白平衡,暗电流相关控制接口