在上一篇文章中介绍了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 v4l2 示例程序,linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)...相关推荐

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

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

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

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

  3. linux v4l2 示例程序,Linux关于Camera使用V4L2

    简介 Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口. 工作流程 打开设备-& ...

  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. linux驱动由浅入深系列:高通sensor架构实例分析之一

    点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...

  9. linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一

    linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一 linux驱动由浅入深系列:ALSA框架详解 音频子系统之二 目 ...

最新文章

  1. Windows Azure Tools DSInit Error
  2. 关于JavaScript中Function Declaration与Function Expression的进一步说明
  3. spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle
  4. TreeMap实现对中文的排序
  5. 华为认证HCNA-IoT物联网工程师培训视频
  6. MySql 一条更新语句是如何执行的? MySql杂谈、MySql WAL 技术
  7. linux怎么获取目录名,linux下如何获取目录名?(四种方法)
  8. centos cmake安装mysql_CentOS下使用cmake编译安装mysql
  9. 《嵌入式设备驱动开发精解》——1.1 本书内容的组织
  10. DataSet,DataTable,DateView的关系和用法
  11. 实现简单的中英互译的安卓App
  12. 『软件工程5』详解软件项目管理之软件的度量
  13. 功能测试数据测试之因果图分析方法
  14. php用代码写的三行情书,三行情书经典语录_最美的三行情书(两行泪,一段情)
  15. 计算机硬件有问题,计算机硬件有哪些
  16. 苹果账号被盗用户:支付宝、微信被盗刷追偿难
  17. 安装Robo 3T(Robomongo)MongoDB可视化工具
  18. python中set option_python的set_option选择
  19. 【Python学习】数据归一化Scaling与标准化Normalization间的区别与相关实现
  20. 2019年3月计算机等级四级——计算机网络

热门文章

  1. 分析:云存储和电子发现的结合
  2. jfinal后台获取权限树,以供前台展示
  3. [转]用了docker是否还有必要使用openstack?
  4. 作为刚開始学习的人应该怎样来学习FPGA
  5. 路由器与交换机的区别【知识普及】
  6. 岳阳机器人餐厅在哪_普渡科技推出送餐与回盘两款全新餐饮机器人,打造“一来一回”新闭环...
  7. 搭建Mock Server实践(一)理论篇
  8. Python接口测试
  9. ajax能拿到401axios无法拿到,解决axios.interceptors.response 401 403问题
  10. pandas 作图 统计_pandas数据作图方法