1  camera基本代码架构

高通平台对于camera的代码组织,大体上还是遵循Android的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略;在kernel中实现sensor的底层驱动。但是,对于最核心的sensor端的底层设置、ISP效果相关等代码则是单独进行了抽离,放在了一个daemon进程中进行管理:

图1 Qualcomm平台camera代码架构简图

由于高通把大部分具体的设置及参数放到了daemon进程中,所以在kernel部分只是进行了V4L2的设备注册、IIC设备注册等简单的动作:

图2 kernel层camera主要代码简图

如上图,camera在kernel层的主文件为msm.c,负责设备的具体注册及相关方法的填充;在msm_sensor.c文件中,主要维护高通自己的一个sensor相关结构体—msm_sensor_ctrl_t,同时把dts文件中的配置信息读取出来;kernel层对于不同的sensor对应自己的一个驱动文件— xxsensor.c,主要是把power setting的设定填充到msm_sensor_ctrl_t中。

在vendor目录下,高通把各个sensor实质性的代码放置在此。一部分代码是高通自己实现的daemon进程和kernel层及HAL层进行通讯的框架代码;另一部分则是和sensor相关的chromatix效果代码和sensor lib部分代码(init setting、lens info、output info)。

图3 vendor下主要camera代码简图

如上图,高通平台通过一个函数指针数组sub_module_init来管理sensor相关的组件;其中重要的是sensor_sub_module_init和chromatix_sub_module_init模块,对于sensor模块需要对应填充sensor_lib_t下的接口,对于chromatix模块则是通过高通的chromatix工具生成。

从更高的层次来看,sensor部分的代码只是camera子系统的一部分。打开高通vendor下面关于camera的源码也可以看到,/mm-camera2/media-controller/modules目录下面,sensors只是modules文件下面其中的一个子目录。

图4  高通camera子系统模块草图

2  主要移植步骤

2.1  kernel层代码移植

对于kernel层的代码移植,实际上对dts文件的移植。因为kernel层驱动代码基本已经被高通的框架以及vendor下代码架空,只剩下一个上电的列表。具体步骤为:

1.  在目录kernel/arch/arm/boot/dts/下的对应dtsi文件中新增camera节点,主要关注节点中的IIC地址、sensro的ID信息、电压设定信息:

图5 dtsi中camera中的节点信息截选

2.在目录kernel/drivers/media/platform/msm/camera_v2/sensor/目录新增xxsensor.c文件,主要填充msm_sensor_power_setting结构体:sensor上电的包含的引脚设定和电压设定,具体格式可以参考同目录下的其他文件。

3.  kernel下面的相关mk文件:

图6 kernel目录下camera相关配置文件

其他:如果sensor中带有eeprom,需要在dts文件中增加eeprom的节点信息;同样,sensor带有对焦功能,需要在dts文件中增加actuator节点信息;对于带eeprom的sensor,还需要配置eeprom的时钟控制代码(有待研究)。

2.2  vendor下代码移植

Vendor下面的代码主要是两部分,一个是sensor_libs目录下的sensor具体设定、配置文件,另一个是chromatix下面的ISP效果文件。具体为:

1. sensor_libs目录下文件:包括一个Android.mk文件和一个.c文件。其中Android.mk文件参考同目录下其他.mk文件修改和对应sensor有关设定即可;.c文件中需要填充的为一个sensor_lib_t类型的结构体:

图7 sensor_lib_t成员截选图

2.  chromatix目录下相关文件,在对应sensor目录下包含4个目录和一个Android文件,总共13个文件,这些文件都会由chromatix调试工具生成。下面为IMX179文件实例:

图8  vendor下chromatix相关文件示例图

3. vendor下还有eeprom文件,模组自带的eeprom数据处理相关;AF相关文件,调试工具生成的关于AF的效果文件;配置文件,把需要编译的模块填进配置文件中。

图9  vendor下其他camera文件

3  调试常见问题

3.1  kernel和vendor下命名匹配

对于不是高通释放的标准驱动来说,在参考其他代码移植调试一个新sensor的过程中,要注意在对应的dts文件中给sensor配置节点信息的过程中,“qcom,sensor-name”字段的配置要和vendor下面的sensor lib代码中的“xxx_open_lib”函数名以及对应的Android.mk中的“LOCAL_MODULE”名称匹配,否则相应sensor的vendor下库文件无法调用,这时打开camera会出现闪退现象。具体可参考平台代码sensor.c中的sensor_load_library()函数。

图10  camera name匹配详图

3.2  sensor lib中的sensor_lib_out_info_t填充

一般来说,每个sensor可以配置输出不同大小的图像。此时,除了进行对应的sensor setting来改变sensor自身的输出及相关配置外;还需要将相关的输出大小、帧率等信息通知平台端,即填充struct sensor_lib_out_info_t结构体。

图11 高通平台获取sensor信息框图

填充的这个sensor_lib_out_info_t中的成员,最终会作为sensor基本信息的一部分被HAL层获取到,上图为高通平台获取sensor信息的一个简单框图。

在调试过程中,需要注意的是这个结构体的成员max_fps需要填写至少大于等于30;否则会因为在获取capability时无法得到有效的previewsize、video size而无法进入预览。具体可参考平台代码mct_pipeline.c中的mct_pipeline_populate_query_cap_buffer()函数。

3.3  sensorlib中的exposure_table_size填写

对于sensor端输出RAW数据,平台端进行ISP处理的情形来说,sensor端除了基本的init配置外,另外一个就是根据平台端AEC计算出来的数据来对应调整sensor的曝光。在高通平台上将平台端的AEC和具体的sensor曝光设置联系起来的是chromatix文件中的一个Exposure Table和sensor lib文件中的exposure对应接口。

这里的exposure_table_size对应着sensor lib中sensor_fill_exposure_array()接口写入的sensor寄存器的个数,平台代码中需要根据这个exposure_table_size来动态分配内存大小。如果这个值的填写和sensor_fill_exposure_array()中实际写入的值大小不一致,就会造成内存方面的crash。具体可参考平台代码sensor.c中的sensor_apply_exposure()函数。

3.4  kernel 层非常规设定

一般情况下,一个新sensor的移植和调试需要在kernel层进行的工作基本上没有问题。但是对于一些sensor来说,对于电压的设定或是MCLK的设定有非常规要求的时候,可能就需要修改平台上相关的默认设定。

对于sensor的几路工作电压 (AVDD、DVDD、IOVDD),平台端一般都是通过PMIC的相应regulator供电,而硬件上regulator的输出能力一般都有限制,代码上也会有体现。如果有sensor需要的电压超过代码上相应regulator的限制值,可以查看PMIC上的说明,如果代码上的限制值并不是硬件的真正极限,可以修改平台代码解决。

对于MCLK的设定,高通平台有一些常规的值设定。如果sensor有特殊要求,而这个MCLK不能被平台识别,这时候可以在平台的clock相关代码中,通过配置平台的PLL参数来生成特定的MCLK时钟给sensor使用。

图12 kernel非常规设定代码片段

------------------------------------------------------------

------------------------------------------------------------

PDF下载地址(结合起来阅读)

Qualcomm平台camera调试移植入门的更多相关文章

  1. Android : 高通平台Camera调试之SetpropKey/camxoverridesettings.txt

    高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note等)Chipcode: https://chipc ...

  2. 高通平台Camera调试(一)【转】

    本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESE ...

  3. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  4. qualcomm platform camera porting

    转载自http://www.cnblogs.com/thjfk/p/4086001.html camera基本代码架构 Camera原理:外部光线穿过lens后,经过color filter滤波后照射 ...

  5. opus在arm的嵌入式平台上的移植和开发

    最近产品中要用到opus,圣上一声令下,把opus移植到我们平台上,什么?opus?opus是什么?在一脸 茫然中,我这特种兵码农就赤手空拳上战场了. 废话少说,赶紧在网站:https://opus- ...

  6. linux 下camera调试笔记【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8801931 linux camera调试 2011-10-23 10:43:37|  分类:  ...

  7. Qualcomm 8X camera过程解析【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/19906687 http://www.01yun.com/mobile_development ...

  8. MTK65XX平台充电调试总结

    MTK平台充电调试总结 摘要:调试电池的充放电管理,首先须要深入了解锂电池的电池原理和特点.充放电特性以及主要的电池安全问题.然后须要对MTK的电池管理驱动程序有深入的了解.理解电池充放电算法的基本原 ...

  9. React Native移动开发实战-5-Android平台的调试技巧

    Android平台的调试和其他平台的调试也很类似,例如:在Android Studio打开的工程中,打开源码MainActivity.java,然后,将鼠标移至代码编辑区的左侧后,单击鼠标即可添加断点 ...

随机推荐

  1. 解读Raft(一 算法基础)

    最近工作中讨论到了Raft协议相关的一些问题,正好之前读过多次Raft协议的那paper,所以趁着讨论做一次总结整理. 我会将Raft协议拆成四个部分去总结: 算法基础 选举和日志复制 安全性 节点变 ...

  2. c语言第三次作业。

    ---恢复内容开始--- (一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数. 源代码 : 第一次编译: 错误原因:if 后面有分号 改正方法:去掉分号 ...

  3. struts2中action的class属性值意义

    整合了spring就不同了,orz struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建(依赖注入).这导致在两种情况下str ...

  4. 【Java关键字-Interface】为什么Interface中的变量只能是 public static final

    三个关键字在接口中的存在原因:public:接口可以被其他接口继承,也可以被类实现,类与接口.接口与接口可能会形成多层级关系,采用public可以满足变量的访问范围: static:如果变量不是sta ...

  5. python读取文本文件数据

    本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...

  6. CSS缩写的样式

    熟悉和了解CSS的朋友都知道,CSS样式表有很多缩写方式.比如,定义字体.定义背景等,都可以把CSS代码缩写到一行.为了能更好的搞清楚CSS缩写方法,我收集整理了一些有关CSS简写的参考资料,也是对自 ...

  7. jQuery 效果 – 淡入淡出

    在在jQuery中可以通过四个方法来实现元素的淡入淡出,这四个方法分别是:fadeIn().fadeOut().fadeToggle() 以及 fadeTo(),本文通过实例来为你讲解如何在jQuer ...

  8. 为什么要用 Docker

    作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker 对系统资源的利用率很 ...

  9. The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01

    1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainland. ...

  10. Cassandra 3.x官方文档(1)---关于Cassandra

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...