Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数

一:    ioctl函数的作用

ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息 ,其中的数据是辅助的数据。

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,所谓对I/O通道进行管理,就是对设备的一些特性进行控制 ,例如,在串口线上收发数据通过read/write操作,而串口的波特率、校验位、停止位通过ioctl设置,A/D转换的结果通过read读取,而A/D转换的精度和工作频率通过ioctl设置。

ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。

如果不用ioctl的话,也可以实现对设备I/O通道的控制,但那就是蛮拧了。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。

所以,我们就使用ioctl来实现控制的功能 。要记住,用户程序所作的只是通过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。

二: ioctl()用法

int ioctl(int fd, ind cmd, …);

其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。下面是一个关于V4L视频采集中用到的用ioctl来配置视频采集设备(USB摄像头)的一些特性参数的例子:

1.   定义设备结构体

struct vdIn {

int fd ; //设备描述符

char *videodevice ; //设备节点,在linux下,通用的视频采集设备节点为/dev/video0

struct video_mmap vmmap;

struct video_capability videocap;

int mmapsize;

struct video_mbuf videombuf;

struct video_picture videopict;

struct video_window videowin;

struct video_channel videochan;

int cameratype ;

char *cameraname;

char bridge[9];

int sizenative; // available size in jpeg

int sizeothers;    // others palette

int palette; // available palette

int norme ; // set spca506 usb video grabber

int channel ; // set spca506 usb video grabber

int grabMethod ;

unsigned char *pFramebuffer;

unsigned char *ptframe[4];

int framelock[4];

pthread_mutex_t grabmutex;

int framesizeIn ;

volatile int frame_cour;

int bppIn;

int  hdrwidth;

int  hdrheight;

int  formatIn;

int signalquit;

};

2.   设备节点赋值, "/dev/video0"是真实的物理摄像头设备在linux中的表示

if (videodevice == NULL || *videodevice == 0)

{

videodevice = "/dev/video0";

}

3.  调用 设备 初始化函数

struct vdIn videoIn;  //在spcav4l.h中定义

videodevice = "/dev/video0"; //节点

int width = 352;  //宽

int height = 288;   //高

int format = VIDEO_PALETTE_JPEG; //格式

int grabmethod = 1;

memset (&videoIn, 0, sizeof (struct vdIn));

if (init_videoIn(&videoIn, videodevice, width, height, format,grabmethod) != 0)

if(debug) printf (" damned encore rate !!/n");

4.   设备初始化函数传值

int init_videoIn (struct vdIn *vd, char *device, int width, int height,

int format, int grabmethod)

{

int err = -1;

int i;

if (vd == NULL || device == NULL)

return -1;

if (width == 0 || height == 0)

return -1;

if(grabmethod < 0 || grabmethod > 1)

grabmethod = 1; //read by default;

// check format

vd->videodevice = NULL;

vd->cameraname = NULL;

vd->videodevice = NULL;

vd->videodevice = (char *) realloc (vd->videodevice, 16);

vd->cameraname = (char *) realloc (vd->cameraname, 32);

snprintf (vd->videodevice, 12, "%s", device);

if(debug) printf("video %s /n",vd->videodevice);

memset (vd->cameraname, 0, sizeof (vd->cameraname));

memset(vd->bridge, 0, sizeof(vd->bridge));

vd->signalquit = 1;//信号设置

vd->hdrwidth = width;

vd->hdrheight = height;

/*          compute the max frame size   */

vd->formatIn = format; //传进来的 format = VIDEO_PALETTE_JPEG;

vd->bppIn = GetDepth (vd->formatIn);

vd->grabMethod = grabmethod;        //mmap or read

vd->pFramebuffer = NULL;

/* init and check all setting */

err = init_v4l (vd); // V4L初始化函数

....................................................

}0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给管道注册事件,用于用户是否登录!

1.一个网站项目的自定义cs文件&#xff0c;如图&#xff1a; 2.CheckRight.cs中的代码如下&#xff1a; public class CheckRight : IHttpModule{ public void Dispose() { } public void Init(HttpApplication app) { app.AcquireRequestState new EventHandler(app_AcquireR…

css 商城 两列_【云控基础】HTML+CSS基础入门

课程大纲&#xff1a;第一部分&#xff1a;课程概述1、什么是HTML、CSS&#xff0c;能做什么&#xff1f;2、HTML、HTML5、H5的区别3、HTMLCSS全览4、HTML、CSS的学习路径和学习方法第二部分&#xff1a;HTMLCSS开发环境搭建1、谷歌浏览器的安装和简单使用2、Sublime Text 编辑…

asterisk1.8 Makefile分析 (2)

menuselect.makeopts分析 查找makefile&#xff0c;这个目录的依赖关系如下&#xff1a; menuselect.makeopts: menuselect/menuselect menuselect-tree makeopts build_tools/menuselect-deps $(GLOBAL_MAKEOPTS) $(USER_MAKEOPTS) 下面我们逐个分析: 1) menu…

linux定时scp脚本,linux expect 实现定时scp的任务

一&#xff0c;什么是expect?expect 是一种脚本语言&#xff0c;在做系统管理时&#xff0c;我们很多时候需要输入密码&#xff0c;例如&#xff1a;连接 ssh,连接ftp,那么如何能做到不输入密码吗&#xff1f;我们需要有一个工具&#xff0c;能代替我们实现与终端的交互&#…

搜索不包含关键词_亚马逊listing关键词优化

亚马逊是一个客户至上的平台&#xff0c;它将客户体验置于一切之上。根据亚马逊的说法&#xff0c;消费者找到产品的速度越快&#xff0c;他们的购物体验就会越好。因此&#xff0c;亚马逊的A9算法被设计用来寻找对客户购物体验有价值的相关listing。如果你想提高你的搜索排名&…

asterisk1.8启动信息分析(未完)

将main/asterisk.c的开启守护进程的那行代码修改一下&#xff0c;即可看到asterisk的启动打印信息。 if (daemon(1, 0) < 0) 改为 if (daemon(1, 1) < 0) 下面分析启动信息 init_manager() Unable to open AMI configuration manager.conf, or configuration is inva…

excel文件损坏修复绝招_高手都在用的PDF转换PPT、WORD、EXCEL工具

点击上方关注我&#xff0c;UUUhooo&#xff0c;你最好了……首先说标题提到转换是在格式间转换&#xff0c;而不是软件间转换&#xff0c;所以标题是为了大多数人认知方便而起的&#xff0c;PDF是一种文档格式&#xff0c;全程叫便携式文档格式&#xff0c;而打开它的软件叫PD…

cowboy源码分析

2013-01-21 by 谢鸿锋   原创文章&#xff0c;转载请注明&#xff1a;转载自Erlang云中漫步 目录 一、概述 二、ranch源码分析 三、cowboy源码分析 1、Request调度规则 2、http协议实现分析 3、http协议之chunked编码 4、http协议之long_polling 5、http协议之websocket 6、…

linux解压tz zip,TZ 文件扩展名: 它是什么以及如何打开它?

TZ 疑难解答常见的 TZ 打开问题Smith Micro StuffIt Deluxe 已删除尝试打开 TZ 文件时&#xff0c;您收到错误 “无法打开 TZ 文件类型”。 发生这种情况时&#xff0c;通常是由于 %%os%% 中缺少 Smith Micro StuffIt Deluxe。 操作系统不知道如何处理你的 TZ 文件&#xff0c;…

python table对象_(RPA学习):Python-docx 常用方法

原标题&#xff1a;(RPA学习)&#xff1a;Python-docx 常用方法**1.**引用库from docx import Document**2.**新建一个空 docxdocument Document()**3.**保存 docxdocument.save(‘c:/test2.docx’)**4.**打开指定的 docxdocument Document(‘c:/test.docx’)**5.**在末尾增加…

ubuntu13.10无法登陆

在启动时到了登录界面后&#xff0c;输入用户名和密码&#xff0c;系统黑一下屏又回到了登录界面&#xff0c;怎么也进不去&#xff1f; 这时&#xff0c;按CtrlAltF1可以进入普通用户shell&#xff0c;CtrlAltF2可以进入root用户shell&#xff0c;AltF7可以回到图形界面。 进…

无法定位程序输入点 except_软件测试中的功能测试点(三)

testkuaibao|软件测试自学公众号26.输入法半角全角检查再输入信息中&#xff0c;输入一个或连串空格&#xff0c;查看系统如何处理&#xff0c;如对于要求输入符点型数据的项中&#xff0c;输入全角的小数点(“。”或“.”&#xff0c;如4.5)&#xff1b;输入全角的空格等。 27…

ASP.NET站点跨子域名单点登陆(SSO)的实现

http://blog.csdn.net/jason_dct/article/details/8502075 ASP.NET站点跨子域名单点登陆&#xff08;SSO&#xff09;的实现 在MSDN的文档“配置跨应用程序的 Forms 身份验证&#xff08;http://msdn2.microsoft.com/zh-CN/library/eb0zx8fc.aspx&#xff09;” 中&#xff0c;…

linux实验三makefile,实验平台上Makefile详细的解释

作者&#xff1a;甘老师,华清远见嵌入式学院讲师。# CORTEX-A8 PERI DRIVER CODE# VERSION 2.0# ATHUOR www.linuxidc.com# MODIFY DATE#2013.03.28 Makefile/***(下面的解释将用这个的形式进行标注)写好的源文件,要编译成二进制文件.需要指定工具链的,这里指定我们的工具链是…

python esp8266模块_ESP8266使用笔记之常用固件

开发板使用的是NodeMCU开发板&#xff1a;目录1.学习使用ESP8266官方的SDK1.1使用SDK提供的AT固件1.2使用SDK Build固件2.学习使用NodeMCU固件(上层可使用Lua开发)和MicroPython固件(上层可使用MicroPython开发)学习使用ESP8266官方的SDK使用AT固件&#xff1a;下载开发包&…

基础C#总结

由于在学习c#这段视频是为了辅助设计模式的学习,这部分的内容也和VB的内容很大程度上是一样的.虽然在开始的 时候,有些困难.在接触了一些例子和实验后.理解起来变得顺畅了很多.下面是对c#基础内容的总结.很多内容都在VB中有 过接触,所以都是些基础知识.捋一捋,将这些时间脑子的…

e站app改内置hosts_米家踢脚线电暖器E评测:符合现代家居审美 全屋取暖“小钢炮”...

【科技犬】对于没有集中供暖的长江中下游地区居民而言&#xff0c;电暖器是不折不扣的"保命神器"。而在深秋的北方&#xff0c;昼夜温差较大&#xff0c;这种时候使用灵活、易于搬运的电暖器也成为更加明智的选择。在北方每年的冬季&#xff0c;室内温度就直接关系着…

asterisk libxml2

asterisk 在configure的时候&#xff0c;会去/usr/bin下检查有没有xml2-config这个可执行文件&#xff0c;还回去检查 编译的工具链中有没有libxml2.so这个库文件&#xff0c;即使是交叉编译&#xff0c;/usr/bin下应该也是上位机的xml2-config 而且xml2-config和libxml2.so的…

锐炬显卡可以linux吗,Intel Broadwell桌面CPU性能测试:Iris Pro 6200核显无敌了

Intel已经在Computex 2015发布了Broadwell-H桌面版处理器&#xff0c;分别有Core i7-5775C和Core i5-5765C两款&#xff0c;另有3款BGA封装的嵌入式型号。它们的特色是内置Intel史上最强Iris Pro 6200核显、以及较大的超频空间。这款处理器现在已经解禁&#xff0c;发布了评测&…

经纬度转化为xy坐标系_Arcgis添加经纬度矢量点

今天帮舍友作图&#xff0c;才体会到九边说的。学技术使人清醒&#xff0c;清醒的认识自己能力有限。少去网上怨天怨地&#xff0c;踏踏实实去提升实力。这是她给我的原始数据&#xff0c;一堆经纬度点。首先我们先进行数据去重&#xff0c;当然这一步可以根据自己数据考虑是否…