当前位置:文档之家› 基于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;//具体控制的值 下面具体说明开发流程(网上找的)

嵌入式点亮一个LED灯的程序

飞凌OK6410开发板(裸板)第一个点亮LED灯程序,主要的C程序,完整程序请下载附件。 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) void msDelay(int time) { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j

1.设计要求 EM-STM3210E开发板上有一个LED灯D1,编写程序点亮该灯。 2.硬件电路连接 在开发板上,D1与STM32F103ZE芯片上的引脚PF6相连,如下图所示。 3.软件程序设计

根据任务要求,程序内容主要包括: 1、配置Reset and clock control (RCC)以使能GPIOF端口模块的时钟 2、配置GPIOF端口的PF6引脚(50MHz,推挽输出) 3、调用STM32标准固件库函数GPIO_WriteBit以令PF6引脚输出高电平,从而点亮LED灯D1。 整个工程用户只需要实现源代码文件:main.c,其他工程文件由MDK和STM32标准固件库提供。 main.c文件的内容如下: [cpp] /** ********************************************************** ******************** * @file main.c * @author Max Liao * @version * @date 02-Novenber-2012 * @brief Main program body ********************************************************** ******************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/

V4l2驱动的流程说明

V4l2 基础知识,附图说明 https://www.doczj.com/doc/e810599813.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,然后对这个文件描述符进行参数初始化。

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; };

LED驱动程序设计

LED驱动程序设计 分类:ARM系统进阶班(arm裸机程序)2012-08-24 13:23 1561人阅读评论(0) 收藏举报 首先声明,此文章是基于对国嵌视频教程中tiny6410有关视频教程的总结,为方便大家的复习。再次予以感谢,感谢国嵌各位老师为我们提供如此好的视频教程,为对于想要迈入嵌入式大门却迟迟找不到合适方法的学子们指引一条光明的方向。好了,接下来步入正题,此处将介绍tiny6410 LED驱动程序的设计。

2 下面来看看tiny6410关于LED 的原理图如图(1)所示:

图1 LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c [cpp]view plaincopy 1./********************************************************** 2.*实验要求:用Tiny6410上的4个LED资源实现跑马灯程序。 3.*功能描述: Tiny6410用下面4个引脚连接了LED发光二极管,分别是 4.* GPK4--LED1 5.* GPK5--LED2 6.* GPK6--LED3 7.* GPK7--LED4 8.* 本程序将控制这四个管脚的输出电平,实现跑马灯的效果 9.*日期: 2011-3-10 10.*作者:国嵌 11.**********************************************************/ 12.#include "def.h" 13.#include "gpio.h" 14. 15.#define LED1_ON ~(1<<4) 16.#define LED2_ON ~(1<<5) 17.#define LED3_ON ~(1<<6) 18.#define LED4_ON ~(1<<7) 19. 20.#define LED1_OFF (1<<4)

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)

嵌入式LED灯显示

【设计题目】 矩阵LED字符显示控制系统设计 【设计目的】 1.掌握无操作系统下的硬件软件设计原理和方法; 2.进一步熟悉ARM 处理器的基本结构、指令集、存储系统以及基本接口编程; 3.熟悉嵌入式系统各部件的硬件初始化过程以及基本IO控制方法。 4.掌握矩阵LED 的应用原理 【设计内容】 1.利用sys_init初始化程序,利用串口实现PC和开发板的数据通信; 2.编写S3C2410X 处理器的点阵屏驱动程序; 3.编写S3C2410X 处理器的点阵屏应用程序。 4. 当程序运行等待要求从串口输入学生姓名的字符串在矩阵LED上显示出来。【实验环境】 硬件:Embest EduKit-IV 平台,ULINK2 仿真器套件,PC 机; 软件:μVision IDE for ARM 集成开发环境,Windows XP。 【相关知识综述】 背景知识、原理算法等 一、硬件部分 1.点阵屏的结构电路

图1点阵屏的结构电路 图上QL1-QL16为行驱动信号,每个信号控制一行, LR1~LR16 是点阵屏的列驱动信号,每一个信号控制一列。当行信号为高电平而列信号为低电平,对应的LED 就会亮。 2,S3C2410与点阵屏的连接 LL1 LL8 LL7 LL9

图2 S3C2410ARM处理器与两片CD4094连接得到16位行选信号图以上电路可以通过S3C2410GPIO口把CPU的并行数据(16位两个字节的数据)打入到两个CD4094芯片中并锁存起来变成LL1-LL16的行选信号。 各信号的作用如下表1;

3.点阵屏的保护电路 图3 点阵屏的保护电路图 为了保护LED 屏加了对应的电阻实现行限流作用,即LL1-LL16变为RQ1-RQ16 4.LED 的驱动 加入行驱动电路的目的是实现LED 灯的驱动。这样由RQ1-RQ16变为行驱动信号QL1-QL16。Q11-QL16为图1中的行驱动信号。

关于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

视频驱动V4L2子系统驱动架构

视频驱动V4L2子系统驱动架构 static struct v4l2_ioctl_info v4l2_ioctls[] = { IOCTL_INFO_FNC(VIDIOC_QUERYCAP, v4l_querycap, v4l_print_querycap, ), IOCTL_INFO_FNC(VIDIOC_ENUM_FMT, v4l_enum_fmt, v4l_print_fmtdesc, INFO_FL_CLEAR(v4l2_fmtdesc, type)), IOCTL_INFO_FNC(VIDIOC_G_FMT, v4l_g_fmt, v4l_print_format, ), IOCTL_INFO_FNC(VIDIOC_S_FMT, v4l_s_fmt, v4l_print_format, INFO_FL_PRIO), IOCTL_INFO_FNC(VIDIOC_REQBUFS, v4l_reqbufs, v4l_print_requestbuffers, INFO_FL_PRIO | INFO_FL_QUEUE), IOCTL_INFO_FNC(VIDIOC_QUERYBUF, v4l_querybuf, v4l_print_buffer, INFO_FL_QUEUE | INFO_FL_CLEAR(v4l2_buffer, length)), IOCTL_INFO_STD(VIDIOC_G_FBUF, vidioc_g_fbuf, v4l_print_framebuffer, 0), IOCTL_INFO_STD(VIDIOC_S_FBUF, vidioc_s_fbuf, v4l_print_framebuffer, INFO_FL_PRIO), IOCTL_INFO_FNC(VIDIOC_OVERLAY, v4l_overlay,

基于V4L2的视频设备驱动开发与移植

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识 与技术第6卷第15期(2010年5月)基于V4L2的视频设备驱动开发与移植 张辉,李新华,刘波,钱翔 (安徽大学电子科学技术学院,安徽合肥230039) 摘要:V4L2是Linux2.6内核的一大特征,其主要提供了视频设备的内核驱动协议。文章介绍了V4L2的驱动模型,以此为基础开发设计出针对MediaTek Inc 公司MT6229芯片USB 摄像头视频设备的驱动程序,采用多帧缓存的内存映射技术大大提高了图像采集的速度,在EmbedSky TQ2440平台下移植并给出了网络环境下的测试流程,对视频驱动程序开发方法和实现步骤具有重要的指导意义。 关键词:V4L2;USB 摄像头;设备驱动;程序移植 中图分类号:TP316文献标识码:A 文章编号:1009-3044(2010)15-3988-03 The Video Device Driver Programming and Proting Based on V4L2 ZHANG Hui,LI Xin-hua,LIU Bo,QIAN Xiang (School of Electronic Science and Technology ,Anhui University,Hefei 230039,China) Abstract:V4L2is a major feature of the Linux kernel Version 2.6,which mainly provides the kernel driver of video equipment.This pa -per introduces driver model of V4L2first,and analyzes the webcam driver of MediaTek Inc ’s MT6229chip according it.The memory mapping techniques of multi frame cache is adopted to increasing the speed of image acquisition greatly .Finally ,the program is planted into the development board of EmbedSky TQ2440and gives testing process under the network environment.There are is an important guidance to the development methods and steps of the video driver. Key words:V4L2;USB Webcam;device driver;transplanting V4L2(Video For Linux Two )[1]是Linux 内核中关于视频设备的API 接口,主要用来对视频设备进行开关、采集、输出等操作。在嵌入式系统中多采用Linux 作为其软件平台,V4L2是Linux2.6采用的内核驱动模型[2],与之前版本的V4L 存在很大差别,因而有部分视频设备的驱动还无法支持新版本的V4L2,对新标准下视频设备的一般性开发过程研究就显得特别具有现实意义。 在项目开发中所使用的视频设备为USB 摄像头,其芯片是MediaTek Inc 公司的MT6229,并不能被系统自带的视频设备驱动所识别,在参考中芯zc0301驱动程序的前提下,基于V4L2标准开发设计了视频驱动程序,并采用多帧缓存技术提高了采集帧数。通过交叉编译成模块后,移植加载到EmbedSky TQ2440开发板(ARM920T 架构,Linux2.6.30)上,在网络环境下进行了该驱动程序的测试工作,对我们开发视频驱动程序及其应用具有重要的实用价值。 1V4L2驱动模型 V4L2使在Linux 下开发视频设备驱动程序具有统一的接口规范,这套规范给驱动程序开发提供了清晰的模型和接口,应用程序处于最上层,硬件设备处于最下层,这套规范就处于中间层。在Linux2.6发行版之前此类规范都是V4L ,它将所有的视频设备驱动程序都放在其管理中,为编程人员减少了大量的工作,然而它不能同时打开多个设备以及不能很好地支持带编码能力的设备是其软肋,V4L2是由Bill Dirks [3]重新设计的,与V4L 相比,它的扩展性和灵活性都有了很大的提高,并且支持的硬件设备也更多,已成为Linux2.6的标准接口,涵盖了Video\dvb\Fm ……等等,但它和V4L 结构特点都不尽相同,因而与V4L 是不兼容的。 V4L2是一个两层驱动程序模型,以内核模块加载到系统中,因而当内核补丁安装后不需要重新对内核完全编译[4]。在开发板中对视频设备的驱动是按照以下步骤来完成的:首先,将设备与开发板相连接,若设备支持hot-plug ,系统会自动装载驱动程序,否则需要使用insmod 命令加载驱动程序到上层的videodev 内核模块中,此时驱动程序向系统提交注册请求,成功后返回一个主设备号,根据此设备号生成的第一个视频设备文件为/dev/video0;而下层是V4L2驱动程序,当其初始化后,将驱动程序的成员函数、次设备号以及其他相关信息的结构传递给videodev 。当应用程序触发一个驱动程序调用时将调用V4L2驱动中的处理函数。 V4L2驱动的主要功能是使程序有发现设备的能力并操作设备。它主要是调用一系列的回调函数来实现这些功能,如设置摄像头的工作频率,帧频,视频压缩格式和图像参数等等。 2在V4L2下编写USB 视频设备驱动程序 根据上面所定义的驱动模型以及V4L2所提供的API 函数,结合USB 设备的特性,视频设备驱动可按照以下步骤来开发完成,图1所示为视频设备驱动流程图。 1)编写视频设备驱动首先要确定驱动程序支持的设备,通过结构体struct usb_device_id [5]定义驱动程序支持的设备列表: 收稿日期:2010-03-25 作者简介:张辉(1979-),男,安徽巢湖人,讲师,主要研究方向为信号与信息处理,嵌入式;李新华(1968-),男,安徽铜陵人,副教授, 硕士生导师,研究方向为图像处理计算机视觉MCAI ;刘波(1986-),男,安徽六安人,硕士,研究方向为数字图像处理;钱 翔(1985-),男,安徽石台人,硕士,研究方向为信号与信息处理。 ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.6,No.15,May 2010,pp.3988-3990E-mail:xsjl@https://www.doczj.com/doc/e810599813.html, https://www.doczj.com/doc/e810599813.html, Tel:+86-551-569096356909643988

相关主题
文本预览
相关文档 最新文档