文档视界 最新最全的文档下载
当前位置:文档视界 › V4L2视频采集程序框架

V4L2视频采集程序框架

V4L2视频采集程序框架
V4L2视频采集程序框架

驱动组的架构和相应职责

驱动组的架构和相应职责 伺服驱动器和步进驱动器一般是由功率驱动板和控制板组成的。所以围绕功率驱动板和控制板一般是将驱动设计分成三部分: 第一部分功率驱动设计也就是我们平常说的电源板的设计。这一部分分成三个单元:A功率变换设计,包括整流滤波逆变如下图所示 这一部分的设计任务是根据电机的功率选择相应的整流桥和适当容量的滤波电容以及电流和电压值符合要求的IGBT,早期逆变部分采用分立的IGBT来构成,还要设计相应的保护和驱动电路,设计的难度和工艺要求都很高,随着IPM 智能功率模块的诞生已经让设计人员从中解放出来了。 B直流母线的检查和电机电流检测 这一部分的设计任务是检测母线电压是否处于正常的范围,即包括是否过压,是否欠压,是否达到电压制动点立即开启制动管等。电流检测主要是将检测到的电机的电流的相位和幅值送给控制板,参与空间矢量的计算以便能够实时的控制好电机的转矩。电流检测有以下几种常用的方法: 1)霍尔传感器法,该方法简洁但是成本很高。 2)线性光耦法,该方法成本很低,但是动态范围较低,只是适合小功率的 驱动器(3.5KW以下) 3)专用芯片,比如IR公司的IR2175,TI公司的AMC1203等,其成本介于上 述二者之间但是也存在动态范围较低。 C开关电源部分 这一部分的设计任务是为整个伺服系统提供电源,电源的质量是整个系统优劣的先决条件,对它有如下要求: 1)抗外界的干扰能力要强 2)本身不能产生太大的干扰 3)电源的纹波要符合相应的要求,特别是用于模拟电路部分的电源一定要

将纹波做好 4)电源的启动特性 5)电压调整范围要达到AC100—280V 6)因为伺服的开关电源输出的路数较多,所以要注意负载的交叉调整率。 第二部分控制电路设计也即是我们平常说的控制板设计其框图如下: DSP是控制电路的核心部分,CPLD的作用是起辅助功能,是为了提高DSP 的性能减轻DSP的负担而设立的,它还可以用来对DSP作进一步的加密。DSP 主要是用来实现空间矢量的算法,CPLD可以用来做码盘的计数,数字指令的计数,实现硬件报警等。显示接口部分主要是让用户可以通过设置观察驱动器的一些运行参数,是一种简单的人机界面。CNC接口部分主要用来接收CNC发来的指令和将驱动器的一些相关的信息告知CN C。与电源板的接口电路是将控制IPM 的PWM信号发给电源板和接受电源板的各种报警信号,以及接受电机的电流信息。所以控制板的设计人员,不但是要完成相应的硬件电路设计还要完成CPLD 或者FPGA的程序编制。 第三部分软件设计 软件设计人员首先要熟悉控制板的硬件电路,要对电机控制有深刻的认识,要了解本系统中DSP应该承担的任务后画出程序的框图。经过反复讨论修改验

V4L2编程

以前做的智能家居的项目用的是Linux2.6.13的核,使用的中星微的摄像头,移植了spcaview 进行图像的获取,后来用了2.6.29的核,发现以前移植的spcaview不能用了,后来查了一下,发现2.6.29核采用了UVC的驱动(万能驱动),采用了V4L2框架,而spcaview是基于V4L1的框架,API接口存在差异。所以需要自己写图片获取的应用程序。 下面主要是一些资料的总结,并给出一个可以结果测试的代码: 一.什么是video4linux Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。 二.一般操作流程(视频设备): 1.打开设备文件。int fd=open(”/dev/video0″,O_RDWR); 2.取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability 3.设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format 4.向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers 5.将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap 6.将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer 7.开始视频的采集。VIDIOC_STREAMON 8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF 9.将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF 10.停止视频的采集。VIDIOC_STREAMOFF 11.关闭视频设备。close(fd); 三、常用的结构体(参见/usr/include/linux/videodev2.h): struct v4l2_requestbuffers reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数 struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备 struct v4l2_standard std;//视频的制式,比如PAL,NTSC struct v4l2_format fmt;//帧的格式,比如宽度,高度等 struct v4l2_buffer buf;//代表驱动中的一帧 v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B struct v4l2_queryctrl query;//查询的控制 struct v4l2_control control;//具体控制的值 下面具体说明开发流程(网上找的)

V4l2驱动的流程说明

V4l2 基础知识,附图说明 https://www.docsj.com/doc/fc1905621.html, 时间:2011-05-17 作者:网络编辑:hawk 点击:176 [ 评论] V4l2 基础知识,附图说明,易于理解 Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux 操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。 一、Video for Linux two 在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。V4L2从Linux 2.5.x版本的内核中开始出现。 V4L2规范中不仅定义了通用API元素(Common API Elements),图像的格式(Image Formats),输入/输出方法(Input/Output),还定义了Linux内核驱动处理视频信息的一系列接口(Interfaces),这些接口主要有: 视频采集接口——Video Capture Interface; 视频输出接口——Video Output Interface; 视频覆盖/预览接口——Video Overlay Interface; 视频输出覆盖接口——Video Output Overlay Interface; 编解码接口——Codec Interface。 二、应用程序通过V4L2进行视频采集的原理 V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集,本文重点讨论内存映射方式的视频采集。 应用程序通过V4L2接口采集视频数据分为五个步骤: 首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式; 其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据; 第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集; 第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据; 第五,停止视频采集。 1.视频采集的参数初始化 在Linux下,摄像头硬件已经被映射为设备文件“/dev/video0”,用open函数打开这个设备文件,获得其文件描述符fd_v4l2,然后对这个文件描述符进行参数初始化。

软件功能结构设计

软件功能结构设计 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。 作为计算机应用的一部分,使用计算机对网上新闻发布进行管理,具有着手于管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高网上新闻发布的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。Active Server Pages即ASP,是一套微软开发的服务器脚本环境,使用它可以创建和运行动态、交互的Web服务器应用程序。ASP内含于IIS3.0和IIS4.0之中,通过ASP我们可以结合HTML网页、ASP指令和ActiveX元件建立动态、交互且高效的Web服务器应用程序。 目前,ASP技术已风靡全球,在Internet上几乎处处都能看到它的身影,ASP技术的出现和发展给曾经以静态内容为主的Web带来了全新的动态效果,使其具有更加灵活和方便的交互特性,在Internet中实现信息的传递和检索越来越容易。正因为如此,ASP迅速被广大网络设计和开发人员所接受,成为首选的网站开发和编程技术。 一、基本功能结构 (一)数据库管理系统结构 数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。 数据库技术是由传统的文件系统发展而来的,从层次模型、网状模型发展到关系模型。数据库技术是数据管理的最新技术,是计算机科学的一个重要分支,它能指导我们正确地设计数据库系统,它的出现极大地促进了计算机应用的发展。采用数据库技术的原理和方法可以有效地设计实用的数据库系统。一个完整的数据库系统包括数据库管理系统(DBMS),数据库管理员(DBA)、数据库(DB)、应用程序和相应的硬件设施。 目前许多数据库管理系统都基于关系模型,关系模型的主要特点是用表格结构表达实体,用键表示实体与实体之间的联系。与层次模型和网状模型相比,关系模型比较简单,容易为初学者接受。关系模型是由若干个关系模式组成的集合,关系模式相当于记录类型,它的实例称为关系。每个关系是一张表格。表格简单,用户易懂,用户只需用简单的查询语句就可以对数据库进行数据操作,并不涉及到存储结构,访问技术等细节。关系模型是数学化的模型,要用到集合论,离散数学等知识。SQL语言是关系数据库的代表性语言,已经得到广泛

V4L2视频采集程序框架

V4L2应用程序框架 V4L2较V4L有较大的改动,并已成为2.6的标准接口,函盖video\dvb\FM...,多数驱动都在向V4l2迁移。更好地了解V4L2先从应用入手,然后再深入到内核中结合物理设备/接口的规范实现相应的驱动。本文先就V4L2在视频捕捉或camera方面的应用框架。 V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioct l函数来实现。 1.打开视频设备 在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备: // 用非阻塞模式打开摄像头设备 int cameraFd; cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK, 0); // 如果用阻塞模式打开摄像头设备,上述代码变为: //cameraFd = open("/dev/video0", O_RDWR, 0); 应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。 2. 设定属性及采集方式 打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。这一步是可选的。在Linux编程中,一般使用ioctl 函数来对设备的I/O通道进行管理: int ioctl (int __fd, unsigned long int __request, .../*args*/) ; 在进行V4L2开发中,常用的命令标志符如下(some are optional): ?VIDIOC_REQBUF S:分配内存 ?VIDIOC_QUERYBUF:把VIDIOC_REQBUF S中分配的数据缓存转换成物理地址 ?VIDIOC_QUERYCAP:查询驱动功能 ?VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 ?VIDIOC_S_FMT:设置当前驱动的频捕获格式 ?VIDIOC_G_FMT:读取当前驱动的频捕获格式 ?VIDIOC_TRY_FMT:验证当前驱动的显示格式 ?VIDIOC_CROPCAP:查询驱动的修剪能力 ?VIDIOC_S_CROP:设置视频信号的边框 ?VIDIOC_G_CROP:读取视频信号的边框

Windows驱动程序框架理解_经典入门

标题: 【原创】Windows驱动程序框架 windows驱动程序入门比较坑爹一点,本文旨在降低入门的门槛。注:下面的主要以NT式驱动为例,部分涉及到WDM驱动的差别会有特别说明。 首先,肯定是配置好对应的开发环境啦,不懂的就百度下吧,这里不再次描述了。 在Console控制台下,我们的有一个入口函数main;在Windows图形界面平台下,有另外一个入口函数Winmain。我们只要在这入口函数里面调用其他相关的函数,程序就会按照我们的意愿跑起来了。在我们用IDE开发的时候,也许你不会发现这些细微之处是如何配置出来的,一般来说我们也不用理会,因为在新建工程的时候,IDE已经帮我们把编译器(Compiler)以及连接器(Linker)的相关参数设置好,在正式编程的时候,我们只要按照规定的框架编程就行了。 同样,在驱动程序也有一个入口函数DriverEntry,这并不是一定的,但这是微软默认的、推荐使用的。在我们配置开发环境的时候我们有机会指定入口函数,这是链接器的参数/entry:"DriverEntry"。 入口函数的声明 代码: DriverEntry主要是对驱动程序进行初始化工作,它由系统进程(System)创建,系统启动的时候System系统进程就被创建了。 驱动加载的时候,系统进程将会创建新的线程,然后调用执行体组件中的对象管理器,创建一个驱动对象(DRIVER_OBJECT)。另外,系统进程还得调用执行体组件中的配置管理程序,查询此驱动程序在注册表中对应项。系统进程在调用驱动程序的Driv erEntry的时候就会将这两个值传到pDriverObject和pRegistryPath。 接下来,我们介绍下上面出现的几个数据结构: typedef LONG NTSTATUS 在驱动开发中,我们应习惯于用NTSTATUS返回信息,NTSTATUS各个位有不同的含义,我们可以也应该用宏NT_SUCCESS来判断是否返回成功。 代码: NTSTAUS的编码意义: 其中 Ser是Serviity的缩写,代表严重程度。 00:成功01:信息10:警告11:错误 C是Customer的缩写,代表自定义的位。

V4L2几个api和结构体

struct video_device { #if defined(CONFIG_MEDIA_CONTROLLER) struct media_entity entity; #endif /* device ops */ const struct v4l2_file_operations *fops;

/* sysfs */ struct device dev; /* v4l device */ struct cdev *cdev; /* character device */ /* Set either parent or v4l2_dev if your driver uses v4l2_device */ struct device *parent; /* device parent */ struct v4l2_device *v4l2_dev; /* v4l2_device parent */ /* Control handler associated with this device node. May be NULL. */ struct v4l2_ctrl_handler *ctrl_handler; /* device info */ char name[32]; int vfl_type; /* 'minor' is set to -1 if the registration failed */ int minor; u16num; /* use bitops to set/clear/test flags */ unsigned long flags; /* attribute to differentiate multiple indices on one physical device */ int index; /* V4L2 file handles */ spinlock_t fh_lock; /* Lock for all v4l2_fhs */ struct list_head fh_list; /* List of struct v4l2_fh */ int debug; /* Activates debug level*/ /* Video standard vars */ v4l2_std_id tvnorms; /* Supported tv norms */ v4l2_std_id current_norm; /* Current tvnorm */ /* callbacks */ void (*release)(struct video_device *vdev); /* ioctl callbacks */ const struct v4l2_ioctl_ops *ioctl_ops; /* serialization lock */ struct mutex *lock; };

基于MVC的Web应用框架设计与实现

基于MVC的Web应用框架设计与实现 摘要:本文简要介绍了MVC设计模式,讨论了JSP/Servlet和JavaBean技术的概念。主要采用B/S结构以及JSP/Servlet技术作为网站开发工具。Web应用程序的开发中存在着Framework的应用,从而使得程序员主要精力专注于业务逻辑的实现。这种开发方式不仅实现简单,而且便于系统的开发和代码维护。论文关键词:B/S结构,JSP/Servlet,开发模式 随着网络技术的飞速发展和社会经济模式的不断变化,MVC(model-view-controller)模式对于web应用的开发无疑是一种非常先进的思想。模型(Model),视图(View)和控制Controller)。MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务逻辑,通常可以JavaBean或EJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。 2.MVC工作方式 MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。 视图 视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML

依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services. 如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。 模型 模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。3.基于MVC模式Web应用系统的设计 一个Web应用一般分为浏览器端和服务器端两个部分。Java技术结合MVC设计模式在构建企业级Web应用的实现中,HTML页面、JSP

Linux设备驱动程序架构分析之MMCSD五

Linux设备驱动程序架构分析之MMC-SD(五)Linux设备驱动程序架构分析之MMC/SD(五) 回到s3cmci_probe函数: 1638-1648行,通过gpio_request函数申请获取GPE5-GPE10。从Mini2440原理图可以看出,Mini2440SDI使用的GPE7-GPE10作为4根数据信号线,使用GPE6作为命令信号线,使用GPE5作为时钟信号线。另外,使用GPG8的外部中断功能来作SD卡的插拨检测,使用GPH8来判断SD卡是否有写保护。 1650行,通过调用mmc_priv(mmc)取得s3cmci_host指针变量host。下面的内容就是初始化host的各个成员变量。 1681行,调用platform_get_resource(pdev,IORESOURCE_MEM, 0)取得IORESOURCE_MEM类型资源。IORESOURCE_MEM宏定义在include/linux/ioport.h文件中: platform_get_resource函数定义在drivers/base/platform.c文件中: resource_type定义在include/linux/ioport.h文件中: 回忆一下,Mini2440的资源文件s3c_sdi_resource定义在arch/arm/plat-samsung/devs.c文件中:

宏S3C24XX_PA_SDI定义在arch/arm/mach-s3c24xx/include/mach/map.h文件中: 宏S3C2410_PA_SDI定义在arch/arm/mach-s3c24xx/include/mach/map.h文件中: 0x5A000000是S3C2440 SDICON寄存器的地址。 宏S3C24XX_SZ_SDI定义在arch/arm/mach-s3c24xx/include/mach/map.h文件中: 宏SZ_1M定义在include/linux/sizes.h文件中: 所以s3cmci_probe函数1681行,platform_get_resource(pdev, IORESOURCE_MEM, 0)函数返回的就是s3c_sdi_resource[0]。1690-1691行,调用request_mem_region(host->mem->start,resource_size(host->mem), pdev->name)函数,该函数用于获取参数指定的内存空间。request_mem_region函数定义在include/linux/ioport.h 文件中: 177#define request_mem_region(start,n,name)__request_region(&iomem _resource, (start), (n), (name), 0)

软件系统的架构设计方案

软件系统的架构设计方案 架构的定义 定义架构的最短形式是:“架构是一种结构”,这是一种正确的理解,但世界还没太平。若做一个比喻,架构就像一个操作系统,不同的角度有不同的理解,不同的关切者有各自的着重点,多视点的不同理解都是架构需要的,也只有通过多视点来考察才能演化出一个有效的架构。 从静态的角度,架构要回答一个系统在技术上如何组织;从变化的角度,架构要回答如何支持系统不断产生的新功能、新变化以及适时的重构;从服务质量的角度,架构要平衡各种和用户体验有关的指标;从运维的角度,架构要回答如何充分利用计算机或网络资源及其扩展策略;从经济的角度,架构要回答如何在可行的基础上降低实现成本等等 软件系统架构(Software Architecture)是关于软件系统的结构、行为、属性、组成要素及其之间交互关系的高级抽象。任何软件开发项目,都会经历需求获取、系统分析、系统设计、编码研发、系统运维等常规阶段,软件系统架构设计就位于系统分析和系统设计之间。做好软件系统架构,可以为软件系统提供稳定可靠的体系结构支撑平台,还可以支持最大粒度的软件复用,降低开发运维成本。如何做好软件系统的架构设计呢? 软件系统架构设计方法步骤 基于体系架构的软件设计模型把软件过程划分为体系架构需求、设计、文档化、复审、实现和演化6个子过程,现逐一简要概述如下。 体系架构需求:即将用户对软件系统功能、性能、界面、设计约束等方面的期望(即“需求”)进行获取、分析、加工,并将每一个需求项目抽象定义为构件(类的集合)。

体系架构设计:即采用迭代的方法首先选择一个合适的软件体系架构风格(如C/S、B/S、N层、管道过滤器风格、C2风格等)作为架构模型,然后将需求阶段标识的构件映射到模型中,分析构件间的相互作用关系,最后形成量身订做的软件体系架构。 体系架构文档化:即生成用户和研发人员能够阅读的体系架构规格说明书和体系架构设计说明书。 体系架构复审:即及早发现体系架构设计中存在的缺陷和错误,及时予以标记和排除。 体系架构实现:即设计人员开发出系统构件,按照体系架构设计规格说明书进行构件的关联、合成、组装和测试。 体系架构演化:如果用户需求发生了变化,则需相应地修改完善优化、调整软件体系结构,以适应新的变化了的软件需求。 以上6个子过程是软件系统架构设计的通用方法步骤。但由于软件需求、现实情况的变化是难以预测的,这6个子过程往往是螺旋式向前推进。 软件系统架构设计常用模式 目前软件领域广泛使用的软件系统架构模式,主要有层次化架构设计、企业集成架构设计、嵌入式架构设计和面向服务的架构设计模式。 层次化架构设计模式:分层设计是一种最为常见的架构设计方案,能有效地使系统结构清晰、设计简化。MVC模式是当今最为流行的多层设计模式。该模式把一个应用的输入、处理、输出流程进行分离并抽象为控制器(Controller)、模型(Model)、视图(View)三个模块,实现了业务逻辑层、数据库访问层和用户界面层

关于v4l2驱动的实现

lijierson8 访问: 积分: 等级: 排名:目录视图摘要视图订阅 142616次 1838 第8985名 50篇49篇 原创:转载:

camera_callback函数(该函数好像是有关工作队列的?????)。然后初始化cam ->power_queue队列,初始化cam ->int_lock自旋锁为未上锁。 end init_camera_struct 调用platform_device_register注册mxc_v4l2_devices对象,调用platform_driver_register注册 static struct platform_driver mxc_v4l2_driver = { .driver = { .name = "mxc_v4l2", .owner = THIS_MODULE , .bus = &platform_bus_type , }, .probe = NULL , .remove = NULL , .suspend = mxc_v4l2_suspend , .resume = mxc_v4l2_resume , .shutdown = NULL , }; 对象,调用video_register_device (cam ->video_dev , VFL_TYPE_GRABBER , video_nr )注册一个视频设备在/dev /video0下,end camera_init static int mxc_v4l_open (struct inode *inode , struct file *file ): 先初始化dq_intr_cnt ,dq_timeout_cnt及empty_wq_cnt三个变量(估计与工作队列有关,???),调用mxc_get_video_input函数,其实就是调用cam ->cam_sensor ->get_status (),也就是摄像头提供的函数。上busy_lock锁,调用signal_pending (current )判断当前是否有信号要处理。 if是初次打开:调用wait_event_interruptible(其实在我们的系统中没有启动电源管理,所以cam ->low_power == false应该一直都为真,也就是本函数都不会进入),然后调用prp_enc_select函数设置cam ->enc_update_eba指向prp_enc_update_eba,cam ->enc_enable指向prp_enc_enable,cam ->enc_disable 指向prp_enc_disable。初始化cam ->enc_counter跟skip_frame ,初始化链表cam ->ready_q,cam ->working_q 及cam ->done_q。使能IIC,调用param = cam ->cam_sensor ->reset (),设置摄像头端的参数,返回摄像头初始化参数。根据返回的参数设置csi_param,然后调用csi_init_interface将参数设置入ARM端。调用cam ->cam_sensor ->get_color,cam ->cam_sensor ->get_ae_mode及cam ->cam_sensor ->get_control_params,最后调用prp_init,也就是申请INT_EMMAPRP中断,即函数prp_isr。释放busy_lock .end mxc_v4l_open mxc_v4l_do_ioctl : VIDIOC_QUERYCAP : 查询能力 end VIDIOC_QUERYCAP VIDIOC_G_FMT: 调用mxc_v4l2_g_fmt (cam , gf ): 如果type是V4L2_BUF_TYPE_VIDEO_CAPTURE则返回cam ->v2f ,如果是V4L2_BUF_TYPE_VIDEO_OVERLAY 则返回cam ->win . end VIDIOC_G_FMT VIDIOC_S_FMT: 调用mxc_v4l2_s_fmt: 如果是V4L2_BUF_TYPE_VIDEO_CAPTURE: 这种情况下只支持两种格式--V4L2_PIX_FMT_YUYV与V4L2_PIX_FMT_YUV420,但MX27的PRP通道2支持YUV444。然后将size ,bytesperline ,witdh ,height ,pixelformat设置入cam ->v2f中。 如果是V4L2_BUF_TYPE_VIDEO_OVERLAY: 检查参数,将f ->fmt .win设置入cam ->win end VIDIOC_S_FMT VIDIOC_REQBUFS : 要求传入来的req ->type要为V4L2_BUF_TYPE_VIDEO_CAPTURE,req ->memory要为V4L2_MEMORY_MMAP。然后调用cam ->enc_disable (cam )关闭PRP通道2,置三个frame,cam ->frame [i ].buffer .flags = V4L2_BUF_FLAG_MAPPED,初始化enc_counter ,skip_frame还有cam ->ready_q,cam ->working_q及cam ->done_q三个链表。 调用mxc_free_frame_buf,即调用dma_free_coherent释放掉三个frame缓存(如果有的话)。 调用mxc_allocate_frame_buf申请req ->count个buffer ,其中有一个ENABLE_DEINTERLACE_SCALE宏选项暂时不知道为什么要用??? BUFFER的flag默认为V4L2_BUF_FLAG_MAPPED,type默认为V4L2_BUF_TYPE_VIDEO_CAPTURE,memory 默认为V4L2_MEMORY_MMAP。 end VIDIOC_REQBUFS linux 设备学习学习(一)mx27的GPIO 定义与分析I2C 设备初始化详细分析(linux 设备驱动学习(十三linux 设备驱动学习(九)LINUX 设备驱动学习(十mx27的GPIO 定义与分析LINUX 设备驱动学习(十nfs 服务配置 推荐文章* Nginx 模块开发* 我的2014碎碎念* 2015年10大web预测 * Android Fragment 你应该知道的一切 * C++、Java、JavaScript中的正则表达式 * Spark技术内幕:Shuffle Map Task运算结果的处理 最新评论 关于sleep_on()函数的理解zhaocanxing : “原来由sleep_on 是在内核中,执行的是同层切换,级别没有变。此时ss ,esp 就是当前内核态堆栈... 2.6.18内核和2.6.25以后内核rem gunavy2009: mark!! I2C 设备初始化详细分析(一)GEN216IUS : 检查设备实际使用地址就可以采用“穷举法”?能否给个例子 mx27的GPIO 定义与分析(一)nidetech : i.mx27是非常成熟的一款ARM9处理器,在成都,从2007年以来我们为近10个客户做了产品定制设...linux 设备学习学习(一)RITADAY : GOOD LINUX 设备驱动学习(十)--异步hhmdaive : zan yi ge!!! 华为面试题算什么,这个背会了外企lffpga : select 和poll 函数(一)wuxiazaoyu : 华为面试题算什么,这个背会了外企javadot : 华为面试题算什么,这个背会了外企javadot : (2)(1)(1)(1)(1)(1)(1)(1)(1)

[方案]基于Linux视频驱动接口V4L2视频采集编程

[方案]基于Linux视频驱动接口V4L2视频采集编程Linux系统中,视频设备被当作一个设备文件来看待,设备文件存放在 /dev 目录下,完整路径的设备文件名为: /dev/video0 . 视频采集基本步骤流程如下: 打开视频设备,设置视频设备属性及采集方式、视频数据处理,关闭视频设备,如下图所示: 一、打开视频设备 打开视频设备非常简单,在V4L2中,视频设备被看做一个文件。使用open函数打开这个设备: 1.用非阻塞模式打开摄像头设备 int cameraFd; cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK);

2.如果用阻塞模式打开摄像头设备,上述代码变为: cameraFd = open("/dev/video0", O_RDWR); 关于阻塞模式和非阻塞模式 应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序。 二、Linux视频设备驱动常用控制命令使用说明 设置视频设备属性通过ioctl来进行设置,ioctl有三个参数,分别是fd, cmd,和parameter,表示设备描述符,控制命令和控制命令参数。 Linux 视频设备驱动接口V4L2支持的常用控制命令如下: 1(控制命令 VIDIOC_ENUM_FMT 功能: 获取当前视频设备支持的视频格式。 参数说明:参数类型为V4L2的视频格式描述符类型 struct v4l2_fmtdesc 返回值说明: 执行成功时,函数返回值为 0;struct v4l2_fmtdesc 结构体中 的 .pixelformat和 .description 成员返回当前视频设备所支持的视频格式; 使用举例: ------------------------------------------------------------------------------------------------- struct v4l2_fmtdesc fmt; memset(&fmt, 0, sizeof(fmt)); fmt.index = 0; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while ((ret = ioctl(dev, VIDIOC_ENUM_FMT, &fmt)) == 0) { fmt.index++;

Linux V4L2 摄像头视频采集

Linux V4L2 摄像头视频采集 2011-01-05 17:34 一,什么是 video4linux Video4linux(简称V4L),是linux中关于视频设备的内核驱动,现在已有Video4linux2,还未加入linux内核,使用需自己下载补丁。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在 /dev/videoN下,N可能为0,1,2,3... 一般0. 另,推荐一个用于播放从摄像头采集到的raw数据的播放器RawPlayer,只需要把采集的数据保存到文件***.yuv就OK了。 二,V4L2采集视频流程 1. 打开设备文件。int fd=open(”/dev/video0″,O_RDWR); 2. 取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability 3. 选择视频输入,一个视频设备可以有多个视频输入。 VIDIOC_S_INPUT,struct v4l2_input 4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。 VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format 5. 向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers 6. 将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap 7. 将申请到的帧缓冲全部入队列,以便存放采集到的数 据.VIDIOC_QBUF,struct v4l2_buffer 8. 开始视频的采集。VIDIOC_STREAMON 9. 出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF 10. 将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF 11. 停止视频的采集。VIDIOC_STREAMOFF 12. 关闭视频设备。close(fd); 三、常用的结构体(参见/usr/include/linux/videodev2.h): struct v4l2_requestbuffers reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数 struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备struct v4l2_input input; //视频输入 struct v4l2_standard std;//视频的制式,比如PAL,NTSC struct v4l2_format fmt;//帧的格式,比如宽度,高度等 struct v4l2_buffer buf;//代表驱动中的一帧 v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B

实验九基于文档视图结构的MFC简单应用程序框架设计

实验九基于文档视图结构的MFC简单应用程序框架设计实验九基于文档/视图结构的MFC简单应用程序框架设计(4学时) ,实验目的, 1. 基本掌握Windows环境下MFC程序的开发流程和方法; 2. 基本掌握MFC中的文档/视图框架体系的简单编程方法; ,实验内容与步骤, 创建一个单文档的MFC工程,在其中实现简单的“涂鸦”操作。界面如图9-1 所示,实现如下功能: 图9-1、程序运行界面图 (1) 用户在视图窗口中按下鼠标左键,并拖动鼠标时,在窗口中即可进行“涂鸦”操 作,用户释放鼠标键时,绘图结束。 (2) 在文档类中设计一个数组,以保存视图窗口所绘制的线条坐标。使当窗口 重绘时, 能够重现已绘图形。 ,MFC编程要点,

1. 视图类对象代表了应用程序的窗口客户区,是文档等信息的一个显示窗口,亦为用 户与程序间进行数据交互的桥梁。 2. 本实验中,一旦鼠标在窗口客户区内有所动作,则MFC将有关消息传递给视图类 对象进行处理。 ,VC编程实现, 1、使用AppWizard创建一个单文档的MFC工程test9(在对话框“MFC AppWizard-Step 1”中选中“Single document”,各项设置均取默认值); 1 2、在视图类的头文件test9View.h中声明有关的成员变量: protected: bool m_bDraw; //绘图标识 HCURSOR m_Hcursor; //光标对象 CPoint m_pOld; //记录鼠标位置 在视图类CTest9View的构造函数中对上述成员变量进行初始化: CTest9View::CTest9View() { // TODO: add construction code here m_bDraw=FALSE; //载入“十字”光标 m_Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); }

相关文档
相关文档 最新文档