linux v4l2 示例程序,linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)...
在上一篇文章中介绍了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结构及代码分析)...相关推荐
- linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析)
在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构.本文以高通+android平台为示例,首先看一下整体框图: 这张图是从整体上来看的 1,图中最下面的是ker ...
- linux驱动由浅入深系列:camera驱动之二(基于高通平台的V4L2结构及代码分析
点击打开链接 在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构.本文以高通+android平台为示例,首先看一下整体框图: 这张图是从整体上来看的 1,图中最 ...
- linux v4l2 示例程序,Linux关于Camera使用V4L2
简介 Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版.V4L2是linux操作系统下用于采集图片.视频和音频数据的API接口. 工作流程 打开设备-& ...
- 高通平台开发系列讲解(外设篇)高通平台Camera摄像头驱动移植
文章目录 一.高通平台摄像头软件框架 二.相关代码目录 三.驱动移植 3.1.新增camera节点 3.2.配置相关的GPIO 沉淀.分享.成长,让自己和他人都能有所收获!
- sd 卡驱动--基于高通平台
点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...
- 高通平台开发系列讲解(外设篇)高通平台EMMC适配说明
文章目录 一.EMMC的内部框图说明 二.EMMC 设备树配置 三.EMMC 内核配置 四.EMMC 源码 沉淀.分享.成长,让自己和他人都能有所收获!
- 高通平台开发系列讲解(QMI篇)高通平台QMI介绍
文章目录 一.背景 一.QMI服务初始化 二.QMI CLIENT消息 2.1.消息发送 2.2.消息接收 2.3.消息发送给MODEM 三.QMI SERVER消息 3.1.初始化 3.2.消息分类 ...
- linux驱动由浅入深系列:高通sensor架构实例分析之一
点击打开链接 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分析之一(整体概览+AP侧代码分析) linux驱动由浅入深系列:高通sensor架构实例分析之二(adsp驱动代码结构 ...
- linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一
linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一 linux驱动由浅入深系列:ALSA框架详解 音频子系统之二 目 ...
最新文章
- Windows Azure Tools DSInit Error
- 关于JavaScript中Function Declaration与Function Expression的进一步说明
- spring的钩子_高级java开发必须掌握的Spring接口——SmartLifecycle
- TreeMap实现对中文的排序
- 华为认证HCNA-IoT物联网工程师培训视频
- MySql 一条更新语句是如何执行的? MySql杂谈、MySql WAL 技术
- linux怎么获取目录名,linux下如何获取目录名?(四种方法)
- centos cmake安装mysql_CentOS下使用cmake编译安装mysql
- 《嵌入式设备驱动开发精解》——1.1 本书内容的组织
- DataSet,DataTable,DateView的关系和用法
- 实现简单的中英互译的安卓App
- 『软件工程5』详解软件项目管理之软件的度量
- 功能测试数据测试之因果图分析方法
- php用代码写的三行情书,三行情书经典语录_最美的三行情书(两行泪,一段情)
- 计算机硬件有问题,计算机硬件有哪些
- 苹果账号被盗用户:支付宝、微信被盗刷追偿难
- 安装Robo 3T(Robomongo)MongoDB可视化工具
- python中set option_python的set_option选择
- 【Python学习】数据归一化Scaling与标准化Normalization间的区别与相关实现
- 2019年3月计算机等级四级——计算机网络
热门文章
- 分析:云存储和电子发现的结合
- jfinal后台获取权限树,以供前台展示
- [转]用了docker是否还有必要使用openstack?
- 作为刚開始学习的人应该怎样来学习FPGA
- 路由器与交换机的区别【知识普及】
- 岳阳机器人餐厅在哪_普渡科技推出送餐与回盘两款全新餐饮机器人,打造“一来一回”新闭环...
- 搭建Mock Server实践(一)理论篇
- Python接口测试
- ajax能拿到401axios无法拿到,解决axios.interceptors.response 401 403问题
- pandas 作图 统计_pandas数据作图方法