精华内容
下载资源
问答
  • V4L2框架 译注:这是目前看到关于V4L2框架内众多结构关系最提纲挈领的一张图。 子设备:v4l2_subdev struct ●通常芯片连接到i2c或SPI总线,或通过GPIO引脚控制,但它们也可以表示SoC / FPGA内部模块。 ●子...

    V4L2框架


    译注:这是目前看到关于V4L2框架内众多结构关系最提纲挈领的一张图。



    子设备:v4l2_subdev struct

    通常芯片连接到i2cSPI总线,或通过GPIO引脚控制,但它们也可以表示SoC / FPGA内部模块。

    子设备驱动程序可以由不同的桥驱动程序使用,因此它们不能依赖于任何特定的桥驱动程序。

    不能进行探测,因此桥接器驱动程序必须显式加载子驱动程序。

    必须可以寻址一个,一个子集或所有子驱动程序。

    API必须与总线无关。

    大量的硬件导致大量的API:如何保持高效?


    译注:由于V4L2框架本身支持的设备类型众多,而每种设备的操作函数又大有不同,因此除了核心回调v4l2_subdev_core_ops以外,每一种都各自封装。此外框架也提供了一个宏v4l2_subdev_call巧妙地调用不同的操作。

    struct v4l2_subdev_ops {
    const struct v4l2_subdev_core_ops *core;
    const struct v4l2_subdev_tuner_ops *tuner;
    const struct v4l2_subdev_audio_ops *audio;
    const struct v4l2_subdev_video_ops *video;
    const struct v4l2_subdev_vbi_ops *vbi;
    const struct v4l2_subdev_ir_ops *ir;
    const struct v4l2_subdev_sensor_ops *sensor;
    const struct v4l2_subdev_pad_ops *pad;
    };
    struct v4l2_subdev_core_ops {
    int (*log_status)(struct v4l2_subdev *sd);
    int (*s_config)(struct v4l2_subdev *sd, int irq, void
    *platform_data);
    int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
    struct v4l2_subdev_io_pin_config *pincfg);
    …
    };
    #define v4l2_subdev_call(sd, o, f, args...) \
    (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
    (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
    ret = v4l2_subdev_call(sd, core, s_config, 0, &pdata); 
    

    实用工具

    实用工具

    v4l2-ctlv4l2的瑞士军刀。

    v4l2兼容性:V4L2驱动程序兼容性测试。

    v4l2-dbg:允许访问DBG_G_CHIP_INFODBG_G / S_REGISTER

    qv4l2Qt测试应用程序。

    核心调试:“echo 1> / sys / class / video4linux /videoX / debug'

    - 1:显示ioctl名称

    - 2:也显示参数


    展开全文
  • linux drm框架

    千次阅读 2017-03-10 13:33:56
    转自:  ... 根据自己的理解来转述一下: ...DRM 是Linux 下的图形渲染架构(Direct Render Manager) , 具体的说是显卡驱动的一种架构(驱动如何玩? 把功能封装成 open/close/io

    转自: 

    http://manpages.ubuntu.com/manpages/utopic/man7/drm-kms.7.html


    根据自己的理解来转述一下:


    摘要:

    DRM 是Linux 下的图形渲染架构(Direct Render Manager) ,  具体的说是显卡驱动的一种架构(驱动如何玩? 把功能封装成 open/close/ioctl 等标准接口,应用程序调用这些接口来驱动设备)。

    作为显卡,最基本的功能就是把用户的绘图输出到显示屏上,DRM 如何去实现呢,先看看DRM 把“这件事”给你概括的几个基本要素:

    画布(FrameBuffer) ,  绘图现场(CRTC) , 输出转换器(Encoder) ,  连接器(Connector)  ,  然后就到显示屏了


    1  画布( FrameBuffer )

    对计算机来说,FrameBuffer 就是一块驱动和应用层都能访问的内存,当然画图之前要有一定的格式化,比方说我可以规定什么样的色彩模式(RGB24 , I420 , YUUV 等等), 分辨率是多大,还有啥参数,那就要到绘图现场去看了 :p

    2  绘图现场(CRTC)  

    简写翻译过来是阴级摄像管上下文,在DRM 里 CRTC 就表示显示输出的上下文了,首先 CRTC 内指一个 FrameBuffer 地址, 外连一个Encoder。 它们俩之间如何沟通? 这就是显示模式(ModeSet)要做的事情,ModeSet 包括了像前面提到的色彩模式 , 还有说显示的时序(timings , ModeLines 等都代表了这个意西)等, 通常时序可以按以下来表达 

    PCLK  HFPHBP  HSWX_RES  VFPVBP  VSWY_RES

    像素时钟  水平前回扫水平后回扫  水平同步头水平有效长度  垂直前回扫垂直后回扫  垂直同步头垂直有效长度

    一个CRTC 可以连接多个 Encoder , 干啥用,实现复制屏幕功能。


    3  输出转换器(Encoder )

    想想 CRT 这种土疙瘩就够复杂了,我们的显卡很牛奔的可以连接各种不同的设备,显然输出需要不同的信号转换器,将内存的像素转换成显示器需要的信号(DVID , VGA , YPbPr , CVBS 等等……)


    4 连接器 (Connector )

    不是指物理线,回到DRM 这是一个抽象的数据结构 ,代表连接的显示设备,从这里我们可以得到设备的EDID , DPMS 连接状态等.


    5 显示面(Planner) 

    咦,怎么多出来一个。我也很呐闷,以上的东东不够地干活? 其实很多创新往往源于人对现实界的不满足。你又要看文字学习,又要看电影打游戏, 还有厉害的可以一边聊天一边看电影。 这里对立出来两个概念,像文字交互这种小范围更新的Graphics 模式,和全幅更新速度奇快的 Video 模式,这两种模式将显卡的使用拉上了两个极端。

    于是 Planner 的概念就发挥了很好的作用,它给视频刷新提供了一条绿色通道,偶不和图形搞在一起了,偶是一个新的图层(或overlay),可以叠加在Graphic之上或之下,偶还可以缩放…

    文档上说 Planner 也在 FrameBuffer 上,这个没关系,这里我们看出来 CRTC 里要显示的东东应该是一种组合(blending)了。 



    看懂了概念,下一篇来分析具体的数据结构和接口。



    参考文档:

    http://manpages.ubuntu.com/manpages/utopic/man7/drm-kms.7.html

    http://events.linuxfoundation.org/sites/events/files/lcjpcojp13_pinchart.pdf

    http://landley.NET/kdocs/htmldocs/drm.html

    http://events.linuxfoundation.org/sites/events/files/slides/brezillon-drm-kms.pdf

    http://elinux.org/images/7/71/Elce11_dae.pdf

    展开全文
  • linux设备驱动框架

    万次阅读 多人点赞 2018-05-26 11:32:00
    一.Linux设备分类字符设备: 以字节为单位读写的设备。块设备 : 以块为单位(效率最高)读写的设备。网络设备 : 用于网络通讯设备。字符设备: 字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,...

    转载请注明:https://blog.csdn.net/kai_zone/article/details/80459334

    一.Linux设备分类

    字符设备: 以字节为单位读写的设备。

    块设备    : 以块为单位(效率最高)读写的设备。

    网络设备 : 用于网络通讯设备。


    字符设备:
            字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序
    来实现这种特性。字符设备驱动程序通常至少要实现open、close、read和write的系统调
    用。字符终端(/dev/console)和串口(/dev/ttyS0以及类似设备)就是两个字符设备,
    它们能很好的说明“流”这种抽象概念。字符设备可以通过FS节点来访问,比如/dev/tty1
    和/dev/lp0等。这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以前后
    移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。然而,也存在具有数据
    区特性的字符设备,访问它们时可前后移动访问位置。例如framebuffer就是这样的一个设
    备,app可以用mmap或lseek访问抓取的整个图像。
    块设备:
            和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备(例如磁盘)
    上能够容纳filesystem。在大多数的Unix系统中,进行I/O操作时块设备每次只能传输一个
    或多个完整的块,而每块包含512字节(或2的更高次幂字节的数据)。Linux可以让app像
    字符设备一样地读写块设备,允许一次传递任意多字节的数据。因此,块设备和字符设备的
    区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不
    同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。
    网络设备:
            任何网络事物都需要经过一个网络接口形成,网络接口是一个能够和其他主机交换数据的设
    备。接口通常是一个硬件设备,但也可能是个纯软件设备,比如回环(loopback)接口。
    网络接口由内核中的网络子系统驱动,负责发送和接收数据包。许多网络连接(尤其是使用
    TCP协议的连接)是面向流的,但网络设备却围绕数据包的传送和接收而设计。网络驱动程
    序不需要知道各个连接的相关信息,它只要处理数据包即可。
    由于不是面向流的设备,因此将网络接口映射到filesystem中的节点(比如/dev/tty1)比
    较困难。Unix访问网络接口的方法仍然是给它们分配一个唯一的名字(比如eth0),但这个
    名字在filesystem中不存在对应的节点。内核和网络设备驱动程序间的通信,完全不同于内
    核和字符以及块驱动程序之间的通信,内核调用一套和数据包相关的函数而不是read、
    write等。


    在linux的世界里一切皆文件,所有的硬件设备操作到应用层都会被抽象成文件的操作。我们知道如果应用层要访问硬件设备,它必定要调用到硬件对应的驱动程序。Linux内核有那么多驱动程序,应用怎么才能精确的调用到底层的驱动程序呢?

    在这里我们拿字符设备为例,来看一下应用程序如何和底层驱动程序关联起来。

      必须知道的知识:

    (1) 在Linux文件系统中,每个文件都用一个struct inode结构体来描述,这个结构体记录了这个文件的所有信息,例如文件类型,访问权限等。

    (2) 在linux操作系统中,每个驱动程序在应用层的/dev目录或者其他如/sys目录下都会有一个文件与之对应。

    (3) 在linux操作系统中,   每个驱动程序都有一个设备号。

    (4) 在linux操作系统中,每打开一次文件,Linux操作系统会在VFS层分配一个struct file结构体来描述打开的文件。

    注意:常常我们认为,struct inode描述的是文件的静态信息,即这些信息很少会改变,而struct file描述的是动态信息,即对文件的操作的时候,struct file里面的信息经常会发生变化。典型的是struct file结构体里面的f_ops(记录当前文件的位移量),每次读写一个普通文件时f_ops的值都会发生改变。

                       

     

        通过上图我们可以知道,如果想访问底层设备,就必须打开对应的设备文件。也就是在这个打开的过程中,Linux内核将应用层和对应的驱动程序关联起来。

    (1) 当open函数打开设备文件时,可以根据设备文件对应的struct inode结构体描述的信息,可以知道接下来要操作的设备类型(字符设备还是块设备),还会分配一个struct file结构体。

    (2) 根据struct inode结构体里面记录的设备号,可以找到对应的驱动程序。这里以字符设备为例。在Linux操作系统中每个字符设备都有一个struct cdev结构体。此结构体描述了字符设备所有信息,其中最重要的一项就是字符设备的操作函数接口。

    (3) 找到struct cdev结构体后,linux内核就会将struct cdev结构体所在的内存空间首地址记录在struct inode结构体i_cdev成员中,将struct cdev结构体中的记录的函数操作接口地址记录在struct file结构体的f_ops成员中。

    (4) 任务完成,VFS层会给应用返回一个文件描述符(fd)。这个fd是和struct file结构体对应的。接下来上层应用程序就可以通过fd找到struct file,然后在有struct file找到操作字符设备的函数接口了。

    三 .   如何编写字符设备驱动。

                 

    四.  字符驱动相关函数分析。  

               

                

                

    五. 开始写字符设备驱动程序

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/cdev.h>
    #include <linux/fs.h>
    
    #define MAJOR_NUM 168
    struct mycdev
    {
    		unsigned char buffer[50];
    		struct cdev cdev;
    }dev_fifo;
    
    MODULE_LICENSE("GPL");
    
    static int dev_fifo_open(struct inode *inode,struct file *file){
    
    	printk("dev_fifo_open success!")
    	
    	return 0;
    }
    
    static ssize_t dev_fifo_read(struct file *file,char __user *buf,size_t size,loff_t *ppos)
    {
    	printk("dev_fifo_read success");
    	return 0;
    }
    
    static ssize_t dev_fifo_write(struct file *file,const char __user *buf,size_t size,loff_t *ppos)
    {
    	printk("dev_fifo_write success");
    	return 0;
    }
    
    static const struct file_operations fifo_operations = {
    .owner = THIS_MODULE,
    .open = dev_fifo_open,
    .read = dev_fifo_read,
    .write = dev_fifo_write,
    };
    
    int __init dev_fifo_init(void)
    {
    	int ret;
    	dev_t dev_num;
    	
    	//初始化字符设备
    	cdev_init(&dev_fifo.cdev,&fifo_operations);
    	
    	//设备号:主设备号(12Bit)|次设备号(20BIT)
    	dev_num = MKDEV(MAJOR_NUM,0);
    	//注册设备号
    	ret = register_chrdev_region(dev_num,1,"dev_fifo");
    	if(ret < 0)
    	{
    		printk("Fail to register_chrdev_region");
    		return -EIO;
    	}
    	//添加设备到操作系统。
    	
    	ret = cdev_add(&dev_fifo.cdev,dev_num,1);
    	if(ret < 0)
    	{
    		printk("fail to cdev_add");
    		goto unregister_chrdev;
    	}
    	
    	printk("Register dev_fifo to system.ok!\n");
    	
    	return 0;
    	
    	unregister_chrdev:
    			unregister_chrdev_region(MKDEV(MAJOR_NUM,0),1);
    			return -1;	
    }
    
    void __exit dev_fifo_exit(void)
    {
    		//从系统中删除添加的字符设备
    		cdev_del(&dev_fifo.cdev);
    		//释放申请的设备号
    		unregister_chrdev_region(MKDEV(MAJOR_NUM,0),1);
    		printk("Exit dev_fifo ok!");
    		return;
    }
    
    module_init(dev_fifo_init);
    module_exit(dev_fifo_exit);

        

    展开全文
  • linux fuse 框架

    千次阅读 2010-06-24 18:41:00
    fuse 架构
    展开全文
  • Linux Thermal 框架解析

    千次阅读 2018-06-20 21:12:09
    Linux Thermal 是 Linux 系统下温度控制相关的模块,...Thermal 的主要框架要实现一个温度控制的需求,试想一下我们是不是最少要有获取温度的设备和控制温度的设备这两个最基本的东西?当然附带的也会产生一些使用温...
  • Linux 应用编程框架

    千次阅读 2018-08-12 19:23:42
    粗略的复习下linux应用编程的一些知识,画个导图记录总结下:
  • Linux下安装Scrapy框架

    千次阅读 2018-08-25 13:28:29
    Linux系统:Centos7 64位 Scrapy框架:python的一个爬虫框架 python版本:python3.6.3 安装步骤: [root@localhost Python3.6.3]# pip3 install scrapy 安装过程可能报的错,解决方案: 解决Could not find...
  • linux多进程框架

    千次阅读 2017-02-19 23:06:33
    话不多说,第一篇是关于linux下多进程通信用到的比较简单但却不得不用到的代码段,自己姑且将其定义为多进程框架吧,方便以后会用到,对我自己来说,linux最诱人的地 方就在于高级编程这一块,比如多进程通信,多...
  • Linux PPP 框架分析

    千次阅读 2012-07-29 13:05:50
    通过对Linux源代码的分析,了解PPP设备在Linux内的工作原理.顺便了解一下PPPoE如何利用PPP设备来完成上网的工作的.下面是代码研究的基础版本:   Software  version Linux内核 2.6.15 PPPd ...
  • linux驱动(一):linux驱动框架

    万次阅读 多人点赞 2017-12-23 11:46:28
    编写linux驱动先看一下驱动框架是什么样子的。 驱动编写和应用层编写有什么区别呢? (一)首先 入口函数的问题。应用层编写我们的入口就是main函数,但在驱动编写时不是这样的,有两种情况, 1、缺省情况下 int...
  • linux中spi驱动框架

    千次阅读 2018-10-12 11:39:32
    linux中spi驱动框架 2016年09月14日 15:57:06 andylauren 阅读数:403 &lt;span class="tags-box artic-tag-box"&gt; &...
  • 于此,将框架(Framework)和设计模式(Design Pattern)应用于Linux驱动开发,说明了如何以面向对象、设计模式和框架概念来看待Linux驱动程序的架构。其直接的益处就是:让我们能基于一致的设计理念来结合Android HAL与...
  • Linux ALSA音频框架分析三:ALSA框架

    千次阅读 2017-10-10 10:25:45
    Linux ALSA音频框架分析三:ALSA框架 一、概述  ALSA 是 Advanced Linux Sound Architecture 的缩写,即高级 Linux声音架构,在 Linux 操作系统上提供了对音频和 MIDI(Musical InstrumentDigital Interface,音乐...
  • Linux 安装python爬虫框架 scrapy

    千次阅读 2015-08-21 15:57:19
    Linux 安装python爬虫框架 scrapy
  • Linux Standard Base测试框架

    千次阅读 2012-01-31 10:41:12
    LSB(Linux standard base)是一套测试框架,它作为Linux发行版和应用软件开发者之间的中间层,以减少发行版本差异带来的不兼容问题。LSB可分为Application tools和Distribution tools两个部分。这里只讨论...
  • Linux内核转发框架

    千次阅读 2021-04-11 16:33:29
  • Linux下DMA驱动框架分析

    千次阅读 2017-07-16 13:55:35
    linux下的DMA驱动框架drivers\dma\dmaengine.c文件内,在linux下编写DMA的设备驱动一般步骤如下。 申请DMA通道 struct dma_chan *dma_request_channel(dma_cap_mask_t mask, dma_filter_fn filter_fn, void *...
  • Linux内存管理基本框架

    千次阅读 2012-02-17 13:30:18
    Linux内存管理基本框架 Linux内核的映射机制设计成三层:页面目录(PGD),中间目录(PMD),页面表(PT) 【其中页面表项简写为PTE】 1、三层地址映射示意图: 当地址位数为32位时,linux内核采用二层映射...
  • linux图形框架DRI

    千次阅读 2016-10-18 14:25:42
    网站:...上篇文章(Linux graphic subsytem(1)_概述)介绍了linux图形子系统基本的软件框架,以及GUI、Windowing system、3D渲染等基本概念。文中提到了linux DRI(Direct Render Infrastru
  • 整理--Linux驱动框架概念之LED

    千次阅读 2017-01-29 01:28:17
    知识整理Linux驱动框架入门之LED 驱动框架;驱动框架也用模块这种’机制’实现;驱动框架是内核开发人员提供,属于整个驱动的一部分
  • Linux各模块框架

    千次阅读 2012-07-25 11:04:52
    整理自<<Essential Linux Device Driver>> 1. Serial 2. Input 3. I2C 4. USB 5. Video 6. Audio ...
  • Linux驱动程序框架介绍

    千次阅读 2011-08-09 21:34:55
    嵌入式linux中文站向广大嵌入式linux爱好者介绍Linux驱动程序框架。  一、linux的设备驱动程序与外界的接口可以分为三个部分:  1.驱动程序与操作系统内核的接口。通过file_operations(include/linux/fs.h)数据...
  • linux图形系统框架

    千次阅读 2016-10-18 14:20:29
    1. 前言 图形子系统是linux系统中比较复杂的子系统之一:对下,它要管理形态各异的、性能各异的显示相关的器件;对上,它要向应用程序提供易用的、友好的、功能强大的...因此,它是linux系统中少有的、和用户空
  • 1-Linux驱动基本框架结构

    千次阅读 2016-09-01 18:54:51
    学习linux驱动编程,首先应该学习linux的驱动框架,而本次博文是最基本的驱动框架,对学习很实用!
  • Linux SPI框架(上)

    千次阅读 2012-07-10 16:51:12
     Linux的SPI子系统采用主机驱动和外设驱动分离的思想,首先主机SPI控制器是一种平台设备,因此它以platform的方式注册进内核,外设的信息是以boardinfo形式静态定义的,在创建spi_master时,会根据外设的
  • Linux摄像头驱动框架

    千次阅读 2019-06-14 11:18:05
    qemu没有摄像头驱动模拟, 就用驱动程序读取文件系统中的bmp图片当做摄像头的输出图像,做了一个摄像头驱动程序。 左边的为根文件系统中的3张bmp图片,驱动程序每次读取一张图片当做摄像头输出图像,送给内核驱动,...
  • linux内核的nfs实现框架

    千次阅读 2010-02-09 21:14:00
    linux内核中实现了nfs,nfs具体是用rpc来实现的,于是linux内核实现了rpc,rpc到底是什么,以及协议细节本文不讨论,网上书上多的是,包括协议编码规范也不说,本文仅仅描述一下linux内核的rpc实现框架linux内核...
  • Linux USB驱动框架分析

    千次阅读 2009-09-18 10:49:00
    Linux USB驱动框架分析http://hi.baidu.com/nuaabus/blog/item/dff2ea50f5de2b6a85352494.html 补充一些网上资源:一个USBinterface对应一种USB逻辑设备,比如鼠标、键盘、音频流。所以,在USB范畴中,device一般...
  • Linux KUnit 单元测试框架

    千次阅读 2019-09-23 21:02:50
    当前Linux社区正在推KUnit单元测试框架,相关的文档在如下地址: https://google.github.io/kunit-docs/third_party/kernel/docs/
  • linux安装golang 以及beego框架

    千次阅读 2016-09-13 14:29:00
    linux安装golang 以及beego框架下载golang安装包 下载地址:http://www.golangtc.com/download也可以直接在linux上面 wget下载 wget http://www.golangtc.com/static/go/1.7/go1.7.linux-amd64.tar.gz放到root...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 356,443
精华内容 142,577
关键字:

linux框架

linux 订阅