饶国明
(展讯通信< 上海> 有限公司 上海 201210)
随着智能手机终端的高速发展,相机功能成为智能手机终端消费者高度关注的一个重要特性,同时也是智能终端控制芯片最重要、最具有技术含量的多媒体技术之一;随着手机相机功能采用单反相机的技术,手机终端控制芯片硬件模块设计越来越复杂,同时客户在智能手机中对相机的需求要求也越来越高,硬件模块的技术快速发展和创新演进以及客户新的需求,要求相机软件能够快速地响应,完成开发和迭代。相机驱动软件作为串联整个相机软件与手机控制芯片中相机硬件模块的基础层,需要能够快速满足多个手机控制芯片的硬件模块适配实现,快速演进和满足客户新需求开发的交付要求。
根据上述的发展和要求,本研究对目前的智能手机驱动相机驱动软件,从软件架构上进行全新的系统架构重新设计,提出了智能手机单软多硬的驱动软件架构,设计一套完整的相机驱动软件架构,利用货架化思路和分层封装设计思路[1],来达到同一套驱动软件支持不同的芯片项目的目的,使得后续新增芯片支持或者新增需求,相机驱动软件能够快速高效的完成,减少开发和维护成本。
当前主流的相机驱动软件架构,大多数是基于最早的第一批智能机时代设计的软件架构,当时的架构设计缺乏下面的考虑和设计:
1)基于单芯片的软件架构出发,没有考虑同时有多个手机控制芯片的研发。
2)没有考虑多个不同的智能终端控制芯片在硬件模块上有一定继承性的。
3)缺乏考虑芯片硬件模块之间的共性技术处理。4)软件架构的可扩展性差。
5)软件内部的解耦性和货架化差。6)缺乏软件系统的分层封装设计。当前软件架构的问题,导致在软件开发维护和新的需求开发上,维护成本高,开发效率低,体现在:
1)每增加一个智能终端控制芯片,由于驱动软件架构设计的缺陷,导致只能简单地复制一份当前相机驱动软件,再根据智能终端芯片硬件模块的修改,在复制的相机驱动软件基础上进行修改,形成新的相机驱动软件,没有任何系统思维的设计分析。
2)如果某一智能终端控制芯片的相机驱动软件修改了一个共性问题,必须在所有有问题的智能终端控制芯片平台的相机驱动软件上逐一进行单独修改,维护的工作量大,且容易出错。
3)对一个共性问题的修改,在不同的智能终端控制芯片平台上,由于是复制再修改,也增加了测试的工作量,延长了项目交付的时间点。
4)对于新需求的开发,如果涉及相机软件数据链路的调整,修改工作量繁琐,支持不够灵活,软件数据链的设计没有组件货架化的思想。
相机驱动软件所驱动的相关的芯片硬件模块基本结构如图1 所示,每一个芯片的相机芯片硬件模块都需要相机驱动软件来驱动其正常工作,芯片中相机硬件模块包括:连接摄像头的接口、相机设备和处理器之间的串行接口、图像信号处理等。
目前的相机驱动软件系统的系统架构设计,还是基于单个芯片的设计,没有考虑多芯片适配,没有考虑支持多芯片下驱动架构的设计,当前的架构如图2 所示:
在此架构基础上,照相驱动软件与硬件模块是按照不同的芯片项目进行区分的,有几个芯片项目,就有几份类似的相机驱动软件复制和修改,其基本的结构基本是类似的,图2 软件结构框图中:
1)驱动软件对外的统一接口都是从用户接口层的标准应用编程接口调用开始。
2)与数据流相关的控制直接和模块控制层进行交互。
3)和控制信息相关以及参数相关的配置,需要先经过中间件&参数管理控制层后,再到驱动软件的模块控制层;中间件&参数管理控制层主要控制的是各个芯片硬件模块的配置信息、相关图像质量管理的控制调度以及与算法相关的控制信息和参数配置信息。
4)模块控制层主要负责配置各种芯片的参数和接受对应数据流的回调。
5)设备控制层主要根据对应的参数配置来完成对应的图像处理操作。
对于多芯片的相机驱动软件,按照芯片项目来进行区分,随着芯片项目增多,软件代码将会非常分散和冗余。这种设计完全没有考虑软件架构的复用性、可扩展性、软件的可维护性,没有考虑软件工程的货架化交付,没有考虑软件的维护成本、测试成本和人力投入。针对不同的芯片硬件模块,需要建立在对多芯片的硬件模块能力了解的基础上,进行理解抽象,分层封装,同时要考虑对外提供统一的用户编程接口中,包含差异化的参数信息[2]。目标是能够达到图3 所示的从分散型的多芯片支持到集中式的多芯片结构上的变化,实现单软多硬设计方案。
为了达到上述单软多硬的多芯片支持,从下面几个方面对架构进行了思考和重构:
1)总体思路是在满足对外统一接口的前提下根据不同芯片的硬件模块配置情况完成所有接口所需要的功能,统一接口中包含的差异化的参数和控制信息,在整个驱动软件内部可以根据这些差异化信息进行正确的处理,如果外部输出的差异化参数信息存在异常,也能够进行有效的识别和相应的错误处理[3]。
2)对图2 中的中间件&参数管理控制层进行了扩展重构,导入货架化设计思想,所有模块,按子模块解耦设计,项目按需进行组合,形成产品项目功能特性。各硬件模块之间的差异,通过不同模块进行区分组合,不同芯片项目,不同客户同模块的不同图像效果要求,通过模块对应的不同参数版本进行分处理。
3)对图2 中设备控制层中与逻辑无关的寄存器控制部分分离出来,增加寄存器控制层。
4)在设备控制层和寄存器控制层之间添加适配控制层,适配控制层提供统一的接口供设备控制层进行调用。
新的多芯片相机驱动子系统结构框图如图4:
对于多芯片单软多硬相机驱动软件子系统的适配控制层的整体结构框图如图5:
整个设计思路如下[4]:
1)适配控制层处于模块控制层和芯片硬件模块之间,完成模块控制层的参数配置,反馈图像统计信息和图像数据,提供芯片硬件模块输入输出能力。
2)不同项目的适配控制层所特有的芯片硬件模块信息和适配控制层提供给模块控制层的接口操作都会在设备树DT(Device Tree)解析阶段通过不同项目的设备节点进行自适应,匹配挂载;用于挂载多芯片硬件模块的信息接口,通常在手机开机启动阶段通过设备树来进行配置的。
3)各个软件模块的数据流和参数流分离,通过一些列操作独立控制,互不影响,具备货架化交付。
4)各种图像数据流可配置,依据芯片硬件模块特性进行数据通路的配置。
在图5 中,为了支持多芯片的单软多硬的方案,需要能够对多芯片的数据通道的数据流进行控制,这是实现单软多硬方案的核心,因此需要对数据通路的数据状态机进行设计
1)适配控制层会根据不同芯片不同数据通路的不同应用场景设定好各自的通路状态。
2)模块控制层收到回调指令后根据对应的数据通路状态完成各个硬件模块的数据通路之间数据的流转处理。
数据通路状态机的设计结构如图6 所示,主要的设计关键点:
1)每条通路的初始状态都为空闲状态。
2)每个状态的转变表示一次数据通路的的数据处理。
3)当状态由其它状态变为空闲状态时,表示完成一次完整的数据通路的闭环处理,处理完的帧信息需要送往下一个数据通路。
4)不同项目的相同数据通路,可以是不同的数据通路状态的闭环处理。
为了实现多芯片的单软多硬方案,下面几点技术点的实现将要考虑:
1)用于挂载多芯片硬件模块的适配控制层,通常在开机阶段通过设备树配置发起,通过一个包含所有与芯片硬件模块相关的信息和静态全局的数据结构来管理。不同的项目挂载不同的芯片硬件模块对应的适配控制层。
2)用于配置或者控制多芯片硬件模块与芯片其它模块交互的部分,需要考虑对各个硬件模块的操作,包括:clock 时钟操作、AXI 总线相关、Qos 相关操作等。
3)要考虑配置或控制多芯片硬件模块的各自中断处理,包括使能Enable、使无能Disable、清除Clear、请求Request、释放Free、处理Process、错误处理Error_process 等中断处理等。
4)不同项目的芯片之间用于图像效果处理的模块通常差异较大,包含的处理模块可能存在差异,同样模块的参数配置也可能存在差异,需要根据不同项目各个芯片的支持情况进行配置。通过设计一个公共函数,获取各芯片硬件模块支持的图像效果处理模块操作函数,此函数会根据传递进来的软件块标识信息,从一个包含所有芯片相关硬件块的表中获取对应的软件块的模块操作函数。
5)对于不同芯片硬件模块的默认参数,包括一些寄存器的默认配置,需要设立一个通用的参数接口来对不同芯片硬件模块进行配置。
6)在整个相机驱动软件运行中,很多功能都需要各个芯片硬件模块可以根据每一帧图像和上层配置的命令动态的调整变化对应的参数,这些在不同的项目之间存在差异,需要设计时考虑提供一些对应的统一接口。
综上所述,通过单软多硬的设计思路,对多芯片的相机软件驱动子系统进行重构,通过适配控制层的提取和设计,解决了长期存在相机驱动软件开发难和维护难的痛点,确保了驱动软件子系统的可维护性、可扩展性、可重用性,提升了驱动软件开发的效率,缩短了驱动软件的开发和交付周期。
当然,要基于此新的驱动子系统,后续增加新的芯片平台或者增加新的硬件模块,需要对新增的芯片平台了解下面芯片的硬件能力:
1)各芯片硬件模块所支持的数据通路数目。
2)各芯片硬件模块所支持的最大处理图像大小。
3)各芯片硬件模块所支持的图像处理模块。
4)各芯片硬件模块所支持的图像处理格式。
5)各芯片硬件模块所特有的硬件限制。
了解了上述芯片硬件模块的基本信息,这样才能更好的在此软件架构基础上,进行新增芯片的硬件模块的驱动软件实现,实现货架化交付。