V4L2驱动内核文档翻译(一)】的更多相关文章

随着一些视频或者图像硬件的复杂化,V4L2驱动也越来越趋于复杂.许多硬件有多个IC,在/dev下生成多个video设备或者其他的诸如,DVB,ALSA,FB,I2C ,IR等等非V4L2的设备.所以,V4L2驱动程序就要为这些硬件设备提供音视频的合成以及编解码的功能接口,另外,通常这些设备都通过多个I2C总线实现和CPU的通讯,不仅是I2C总线,其他的也有可能被使用,比如SPI,1-wire,等等.挂在这些总线上的设备叫做sub-devices,即V4L2设备的子设备. 之前相当长的一段时间内,…
V4L2(video for linux) 可以支持多种设备,它可以有以下5种接口: 1.视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.下面也是着重讲解这种应用: 2.视频输出接口(video output interface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备: 3.直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集…
二.V4L2的应用 下面简单介绍一下V4L2驱动的应用流程. 1.  视频采集的基本流程 一般的,视频采集都有如下流程: 2.  打开视频设备 在V4L2中,视频设备被看做一个文件.使用open函数打开这个设备: // 用非阻塞模式打开摄像头设备 int cameraFd; cameraFd = open("/dev/video0", O_RDWR | O_NONBLOCK, 0); // 如果用阻塞模式打开摄像头设备,上述代码变为: //cameraFd = open("/…
原文地址:Linux 内核文档翻译 - kobject.txt 作者:qh997 Everything you never wanted to know about kobjects, ksets, and ktypes 你永远不会想知道的关于 kobject,kset 和 ktype 的一切   Greg Kroah-Hartman   Based on an original article by Jon Corbet for lwn.net written October 1, 2003…
学习目标:学习V4L2(V4L2:vidio for linux version 2)摄像头驱动框架,分析vivi.c(虚拟视频硬件相关)驱动源码程序,总结V4L2硬件相关的驱动的步骤:  一.V4L2架构 1. 字符类驱动 V4L2(V4L2:vidio for linux version 2)摄像头驱动属于字符类驱动, 对于一般的字符类驱动程序,其编写步骤一般分为: 1)构造一个file_operations: 编写open=drv_open .read=drv_read2)注册设备,告诉内…
转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也得看看include/media/v4l2-dev.h,它定义了许多你将来要打交道的结构体. 一个视频驱动很可能要有处理PCI总线,或USB总线的部分.这里我们不会花什么时间还接触这些东西.通常会有一个内部一I2C接口,我们在这一系列的后续文章中会接触到它.然后还有一个V4L2的子系统接口.这个子系…
转自:http://blog.csdn.net/zoe6553/article/details/17715441 v4l2驱动编写篇第六B--流输入输出 在本系列文章的上一期中,我们讨论了如何通过read()和write()的方式实现视频帧的传输,这样的实现可以完成基本的工作,却并不是普便上用来实现视频输入输出大家偏爱的方法.为了实现最高性能和最好的信息传输,视频驱动应该支持V4L2 流输入输出.使用read()和write()方法,每一帧都要通过I/O操作在用户和内核空间之间拷贝数据.然而,…
转自:http://blog.chinaunix.net/uid-10747583-id-298489.html 原文地址:http://blog.csdn.net/wxzking/archive/2011/03/05/6225187.aspx http://blog.csdn.net/wxzking/archive/2011/03/05/6225196.aspx   二.V4L2的应用 下面简单介绍一下V4L2驱动的应用流程. 1.  视频采集的基本流程 一般的,视频采集都有如下流程: 2. …
Linux V4L2驱动架构解析与开发导引 Andrew按:众所周知,linux中可以采用灵活的多层次的驱动架构来对接口进行统一与抽象,最低层次的驱动总是直接面向硬件的,而最高层次的驱动在linux中被划分为"面向字符设备.面向块设备.面向网络接口"三大类来进行处理,前两类驱动在文件系统中形成类似文件的"虚拟文件",又称为"节点node",这些节点拥有不同的名称代表不同的设备,在目录/dev下进行统一管理,系统调用函数如open.close.re…
Author:CJOK Contact:cjok.liao#gmail.com SinaWeibo:@廖野cjok 1.概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口.凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处.就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况,一个是因为底层屌丝人数多,意见各有不同,措辞也不准,部门经理会把情况汇总后再向上汇报:二个是…
转载:http://blog.csdn.net/gqb_driver/article/details/12946629 对于使用openwrt的嵌入式系统来说,因为硬件绝大多数采用Flash,因此一般使用squashfs文件系统和jffs2文件系统.前者是只读的,后者是可写的.我们一般会把jffs2 mount到某个目录下.这样就存在某些目录如/bin是只读的(squashfs),某些目录是可读写的(jffs2),这样对文件的操作会依赖于文件系统的属性和文件的路径.        openwrt…
UVC设备也是一个usb设备,在uvc_driver.c中的init函数会调用usb_register注册,根据id_table发送可支持的设备后调用probe函数,其会去uvc_register_chains注册所有uvc_device,前面说的根据id_table匹配的过程是usb_bus总线,uvc是另一个东西了 vivi.c是一个摄像头驱动模板或者实例,安装vivi模块后会产生一个虚拟的摄像头,使用应用程序可以获得其提供的虚拟数据并显示. vivi_init vivi_create_in…
转自:http://blog.csdn.net/gatieme/article/details/49491325 目录 1. 问题 2. 驱动源码 3. 内核配置 4. 编译内核和模块驱动 5. 加载驱动 问题 这两天为了做gps和arm的通讯,不得不捣鼓这个东东.开发板是创维特jx2410,usb转串口线的芯片是pl2303.还好是这个芯片,让我没费多少力气,就达成了目的.因为linux对它已经支持了,我们只要编译.加载它的驱动就ok了. 驱动源码 一般来说USB转串口的驱动已经集成在内核中,…
1.windows驱动简介: 1.1 windows组件简介: 1.2 windows驱动类型: windows驱动分为两种基本类型: 用户态驱动在用户态下执行.它们一般提供一套win32应用程序和内核态驱动或者其他操作系统组件之间的接口.譬如,从windows vista开始,所有打印机驱动都执行在用户态下. 内 核态驱动在内核态下执行.包括那些管理I/O,即插即用存储,进程.线程,安全等内核态操作系统组件.内核态驱动一般是分层的.高层驱动从应用程序接受数 据,过滤数据然后把数据传递给底层功能…
sysfs - _The_ filesystem for exporting kernel objects. sysfs – 用于导出内核对象(kobject)的文件系统 Patrick Mochel         <mochel@osdl.org> Mike Murphy <mamurph@cs.clemson.edu> Revised:    16 August 2011 Original:   10 January 2003 What it is: sysfs简介 ~~~~…
==================================================================== Everything you never wanted to know about kobjects, ksets, and ktypes 关于kobject,kset和ktypes的一切,你永远不会想知道 ==================================================================== :Author:…
无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作. 通常要挂钩三个API:NtOpenProcess.NtOpenThread.NtDuplicateObject.但是在 VISTA SP1 以及之后的系统中,我们可以完全抛弃 HOOK 方案了,转而使用一个标准的 API:ObRegisterCallbacks.下面做一个监视进线程句柄操作的程序,并实现保护名为 CALC.EXE 的进程不被结束. 首先介绍一下 ObRegisterCallbacks 这个函数.此函数的前…
突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE.KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动.当然 KPP 和 DSE 并不是不可战胜的,WIN7X64 出来不久,FYYRE 就发布了破解内核的工具,后来有个叫做 Feryno 的人又公开了源代码. 要实现突破 DSE 和 PatchGuard,必须修改两个文件,winload.exe 以及ntoskrnl.exe. 细节就不说了,大体思路就是在winload.exe改一个地方,ntoskr…
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 DriverObject 就是使用双向链表给串起来的,遍历这个链表就可以枚举内核里所有的驱动.示例代码如下 //传入驱动自身的 DriverObject VOID EnumDriver(PDRIVER_OBJECT pDriverObject) { PKLDR_DATA_TABLE_ENTRY entry…
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 API,不能用 WIN32API.在讲解具体的代码之前,先讲解一下文件系统的流程,让大家对整个文件系统有个大概的了解. 假设我们要读写一个文件,无论在 RING3 调用 ReadFile,还是在 RING0 调用 NtReadFile,它们最终会转换为 IRP,发送到 文件系统驱动(具体哪个驱动和分区类型相关,…
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool.RtlMoveMemory. RtlFillMemory.ExFreePool.它们的原型分别是: 需要注意的是,RtlFillMemory 和 memset 的原型不同.ExAllocatePool 和 malloc 的原型也不同.前者只是参数前后调换了一下位置,但是后者则多了一个参数:Pool…
驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. 驱动程序Hello World 之前总结了驱动环境的搭建,这里就直接继续之前搭建好的环境创建项目,打开vs2015创建一个驱动项目: 写代码之前先配置下编译选项: 然后添加一个项目文件main.c(注意后缀是.c,前面名字无所谓可以不叫main),里面的内容如下(下面模板代码来源于网络,作者:胡文亮…
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们. 钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件. 钩子的类型: (1) 键盘钩子和低级键盘钩子可以监视各种键盘消息. (2) 鼠标钩子和低级鼠标钩子可以监视…
X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 InLoadOrderLinks 双向链表:隐藏内核模块的通用方法是把指定的驱动对象从 KLDR_DATA_TABLE_ENTRY中的 InLoadOrderLinks 双向链表上摘除. X64内核模块枚举(注意是在R3) #include <stdio.h> #include <Window…
Ring0 InLineHook 和UnHook 如果是要在R0里hook,作者的建议是InLine HOOK,毕竟SSDT HOOK 和 SHADOW SSDT HOOK比较麻烦,不好修改.目前R3的InLine HOOK 我比较喜欢的是 MINI HOOK ENGINE,但是今天要解决的是R0的InLine HOOK问题. 下面说下InLine HOOK的思路: 一 . 实现  RING0 INLINE HOOK 无论是用户态 Inline Hook 还是内核级 Inline Hook,都要…
SHADOW SSDT HOOK HOOK 和 UNHOOK SHADOW SSDT 跟之前的 HOOK/UNHOOK SSDT 类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了. 一.获得 w KeServiceDescriptorTableShadow的地址 这个跟获得 KeServiceDescriptorTable 差不多,唯一不同就是特征码: ULONGLONG GetKeServiceDescri…
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在 PE32+结构体里的映像基址(变量名称:NtosImageBase) 4.在自身进程里加载内核文件并取得映射地址(变量名称:NtosInProcess)…
HOOK SSDT 在 WIN64 上 HOOK SSDT 和 UNHOOK SSDT 在原理上跟 WIN32 没什么不同,甚至说 HOOK 和 UNHOOK 在本质上也没有不同,都是在指定的地址上填写一串数字而已 (填写代理函数的地址时叫做 HOOK,填写原始函数的地址时叫做 UNHOOK).不过实现起来还是很大不同的. 一 . HOOK SSDT 要挂钩 SSDT,必然要先得到 ServiceTableBase 的地址.和 SSDT 相关的两个结构体 SYSTEM_SERVICE_TABLE…
内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件中. 被调度的函数肯定是异步执行的,它类似于一种"软件中断",而且是处于非进程的上下文中,所以调度函数必须遵守以下规则: 1) 没有 current 指针.不允许访问用户空间.因为没有进程上下文,相关代码和被中断的进程没有任何联系. 2) 不能执行休眠(或可能引起休眠的函数)和调度. 3)…
三.V4L2的demo capture.c是官方示例程序. capture.c 程序中的 process_image 函数: capture.c 程序主要是用来演示怎样使用 v4l2 接口,并没有对采集到的视频帧数据做任何实际的处理,仅仅用 process_image 函数表示了处理图像的代码位置. process_image 函数只有一个参数,就是存储视频帧的内存的地址指针,但是在真正的应用中,通常还需要知道该指针指向的数据的大小. 因此可以修改函数,改成 void process_image…