在上一篇文章中介绍了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/下的_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,图中最 ...

  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. Eclipse Jetty 9.4.15 发布,建议使用 JDK 12
  2. JVM 性能调优之定位问题
  3. BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()
  4. 在技​​术团队中发展的7个关键技能
  5. 全国计算机等级考试题库二级C操作题100套(第67套)
  6. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
  7. 决策树的选择,哪个放在第一个需要决策的环节
  8. 解决性能问题中SQL Server警报:SQL Server警报基础
  9. 你与产品经理之间差的才不只是一段代码!
  10. centos6.7 搭建jenkins
  11. Java并发编程技术
  12. FPGA工程师笔试面试题(一)
  13. 单片机攻略3——C51入门
  14. linux误删除文件恢复
  15. 盘点那些大学生自习室最无法忍受的行为!
  16. App 上线被拒绝的原因有哪些?
  17. 再探矩阵求逆引理 : Woodbury恒等式的证明
  18. SAP ERP统驭科目
  19. 百度easydl数据标注
  20. 论文笔记-精读-8.22-Manifold Regularized Dynamic Network Pruning

热门文章

  1. 交通信息工程学习笔记
  2. python中array是什么意思_Python库Numpy里ndarray.ndim 是什么意思?
  3. LBT(CCA) in LAA/Multefire (一)
  4. Xception场景分类模型的实践
  5. 兆、字节、位之间的转换
  6. 20190308 搜索基础测试题
  7. IC卡 PBOC指令
  8. 锁定计算机minling,suyangminling
  9. Windows7+Windows10原版镜像集合
  10. WASM 原生时代已经到来 | 解读 WebAssembly 的 2022