点击打开链接

在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构。本文以高通+android平台为示例,首先看一下整体框图:

这张图是从整体上来看的
1,图中最下面的是kernel层的驱动,其中按照V4L2架构实现了camera sensor等驱动,向用户空间提供/dev/video0节点

2,在往上是HAL层,高通代码实现了对/dev/video0的基本操作,对接了android的camera相关的interface。(ps,HAL层的库中也封装了sensor端一些核心逻辑代码。将驱动的操作逻辑放在HAL层是为了避免linux的开源属性对厂商私有技术的泄露)3,在之上就是android的架构对camera的处理,不是本文重点,暂不展开。

V4L2架构图
本小节内容摘自(http://blog.csdn.net/rubyboss/article/details/14053523)


V4L2支持三类设备:视频输入输出设备、VBI设备和radio设备(其实还支持更多类型的设备,暂不讨论),分别会在/dev目录下产生videoX、radioX和vbiX设备节点。
Linux系统中视频输入设备主要包括以下四个部分:
字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间;
V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。

V4L2的核心源码位于drivers/media/v4l2-core,源码以实现的功能可以划分为四类:
核心模块实现:由v4l2-dev.c实现,主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
V4L2框架:由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件实现,构建V4L2框架;
Videobuf管理:由videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
Ioctl框架:由v4l2-ioctl.c文件实现,构建V4L2ioctl的框架。

kernel层高通关于camera的主要代码简图

由于高通将大部分驱动逻辑代码放到了HAL层,因此在kernel部分只进行了V4L2的设备注册、IIC设备驱动等基本动作。
camera在kernel层的主文件为msm.c,负责设备的具体注册及相关方法的填充;
在msm_sensor.c文件中,主要维护高通自己的一个sensor相关结构体—msm_sensor_ctrl_t,同时把dts文件中的配置信息读取出来;
kernel层对于不同的sensor对应自己的同一个驱动文件 — msm_sensor_driver.c,主要是把vendor下面的sensor_lib_t的设定填充到msm_sensor_ctrl_t中

在msm_sensor_init.c中主要是一些IOCTL处理,处理vendor传下来的IOCTL,vendor下面的power_setting,ret_setting等信息都是通过这里的ioctl传下来的

vendor目录下相关代码

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

camera调试
对于kernel层的代码移植,实际上对dts文件的移植。因为kernel层驱动代码基本已经被高通的框架以及vendor下代码架空。 具体步骤为:
1. 在目录kernel/arch/arm/boot/dts/下的对应dtsi文件中新增camera节点,主要关注节点中的IIC地址、 sensro的ID信息、电压设定信息,例如:
设备树源文件为kernel/arch/arm/boot/dts/qcom/下的<target>_camera*.dtsi,例如msm8916-camera-sensor-mtp.dtsi。客户应使用如下所示的摄像头插槽:
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
. . .
}
2.高通关于camera的dts节点属性值解释,有关各个属性的解释,请参考以下目录下的文档:
kernel/Documentation/devicetree/bindings/media/video/

3,修改kernel下面的相关mk文件

Vendor下代码移植

Vendor下面的代码关系着camera是否点亮的代码主要是两部分,一个是sensor_libs目录下的sensor具体设定文件,另一个是chromatix下面的ISP效果文件。具体为:
1. sensor_libs目录下文件:包括一个Android.mk文件和一个.c文件。其中Android.mk文件参考同目录下其他.mk文件修改和对应sensor有关设定即可; .c文件中需要填充的为一个sensor_lib_t类型的结构体(ov7251填充示例):

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

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

linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析相关推荐

  1. linux v4l2 示例程序,linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)...

    在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构.本文以高通+android平台为示例,首先看一下整体框图: 这张图是从整体上来看的 1,图中最下面的是ker ...

  2. linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)

    在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构.本文以高通+android平台为示例,首先看一下整体框图: 这张图是从整体上来看的 1,图中最下面的是ker ...

  3. 数字音频接口(二) 高通平台MI2S总线调试

    硬件平台:高通SM6125 基线代码:LA.UM.8.11.1.c1 git clone https://git.codelinaro.org/clo/la/platform/vendor/opens ...

  4. 高通平台开发系列讲解(外设篇)高通平台Camera摄像头驱动移植

    文章目录 一.高通平台摄像头软件框架 二.相关代码目录 三.驱动移植 3.1.新增camera节点 3.2.配置相关的GPIO 沉淀.分享.成长,让自己和他人都能有所收获!

  5. sd 卡驱动--基于高通平台

    点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...

  6. 高通平台开发系列讲解(外设篇)高通平台EMMC适配说明

    文章目录 一.EMMC的内部框图说明 二.EMMC 设备树配置 三.EMMC 内核配置 四.EMMC 源码 沉淀.分享.成长,让自己和他人都能有所收获!

  7. 高通平台开发系列讲解(QMI篇)高通平台QMI介绍

    文章目录 一.背景 一.QMI服务初始化 二.QMI CLIENT消息 2.1.消息发送 2.2.消息接收 2.3.消息发送给MODEM 三.QMI SERVER消息 3.1.初始化 3.2.消息分类 ...

  8. 高通平台Camera 框架简介

    接触高通平台camera不长时间,了解的不够深入,下面个人所了解内容的是基于高通平台的camera,有的地方能描述不一定会很清楚,以后会慢慢补充! 一 框架介绍 Package -> Framw ...

  9. linux查看录音驱动程序,linux驱动由浅入深系列:ALSA框架详解 音频子系统之二

    本文以高通平台为例,介绍一下android下的音频结构.android使用的是tinyALSA作为音频系统,使用方法和基本框架与linux中常用的ALSA音频子系统是一致的. ALSA音频框架 ALS ...

最新文章

  1. mysql pt_mysql之pt工具之pt-fifo-split用法介绍
  2. 洛谷 P1589 泥泞路 2019青岛市竞赛(贪心)
  3. php统计字数指定位置,php实现的统计字数函数定义与使用示例
  4. session实现购物系统的简例和application实现统计页面访问次数的简例
  5. Intermapper系列网络管理工具中文版教程
  6. Linux shell脚本详解及实战(三)——shell脚本循环
  7. idea调代码时返回到上一步的快捷键
  8. 有限自动机字符串匹配
  9. C语言与或非应用案例,与或非(生活中与或非例子)
  10. 我的世界做计算机运算原理,我的世界加法计算器原理解说及BCD全加器教程
  11. 充电器pps功能是什么_科普:PPS充电器为何不兼容笔电?
  12. 关闭Tomcat报错The web application [ROOT] appears to have started a thread named [Abandoned connectio
  13. dither技术的原理及应用
  14. 移动端安卓开发学习记录--Android Studio使用adb链接夜神模拟器常用指令
  15. 学习《华为基本法》(13):市场营销
  16. pc端和移动端两套样式在vue中的切换
  17. c语言中百分号后面跟的数字_C语言中的各种百分号都代表什么意思
  18. PHP.ini 中文注解
  19. 14.深入浅出:信号的运算——参考《模拟电子技术基础》清华大学华成英主讲
  20. 似然函数 极大似然估计 本质讲解

热门文章

  1. 计算机故障吧,摊上事了!我给客户修电脑说主板硬盘坏了,客户:你也太坑了吧!...
  2. [Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用
  3. 时间序列分析之排列熵(Permutation Entropy)
  4. fwknop核心配置fwknopd.conf参数--中文书虫
  5. Unity场景中导出模型插件
  6. html化学方程式显示,化学方程式格式化(宏)
  7. 人月神话(3)外科手术队伍
  8. JavaWeb基础(2):熟悉HTMLCSS、Servlet、JSP、EL、JSTL、会话控制、jQuery、JSON、Filter、Listener
  9. linux深度学习环境配置随笔
  10. DataStage:DataStage Job优化指导原则(不定时更新中)