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

linux驱动ioctl函数,Linux中与驱动相关的ioctl函数一:ioctl函数的作用ioctl用于向设备发控制和配置命令,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据。也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据。ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,所谓对I/O通道进行管理…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一:    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初始化函数

…………………………………………….

}

5.V4L初始化函数

static int init_v4l (struct vdIn *vd)

{

int f;

int erreur = 0;

int err;

if ((vd->fd = open (vd->videodevice, O_RDWR)) == -1)//打开

exit_fatal (“ERROR opening V4L interface”);

if (ioctl (vd->fd, VIDIOCGCAP, &(vd->videocap)) == -1)

exit_fatal (“Couldn’t get videodevice capability”);

………………………………

在视频采集之前,先要对Video4Linux进行初始化

初始化阶段用ioctl(int fd, ind cmd, …) 函数和设备进行“对话”。Fd是设备的文件描述符,cmd是用户程序对设备的控制命令 ,省略号一般是一个表示类型长度的参数,也可以没有。初始化步骤如下:

1.打开视频:

open (vd->videodevice, O_RDWR))

2. 读video_capability 中信息包括设备名称,支持最大最小分辨率,信号源信息等。

调用函数ioctl (vd->fd, VIDIOCGCAP, &(vd->videocap))成功后可读取vd->capability各分量

video_capability是Video4linux支持的数据结构,video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等),包含的分量:

•name[32]   //设备名称

•maxwidth ,maxheight,minwidth,minheight

•Channels //信号源个数

•type    //是否能capture,彩色还是黑白,是否能裁剪等等。值如VID_TYPE_CAPTURE等

struct video_capability

{

char name[32];

int type;

int channels;        /* Num channels */

int audios;        /* Num audio devices */

int maxwidth;        /* Supported width */

int maxheight;        /* And height */

int minwidth;        /* Supported width */

int minheight;        /* And height */

};

3.对采集图象的各种属性进行设置,分为两步 首先获取摄象头缓冲区中video_picture中信息调用函数ioctl(vd->fd, VIDIOCGPICT, &(vd->picture));然后改变video_picture中分量的值,为vd->videopict分量赋新值,调用 ioctl (vd->fd, VIDIOCSPICT, &vd->videopict)即可实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180949.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • unity串口 连接多个串口崩溃_hdmi视频矩阵切换器串口连接说明景阳华泰科技

    unity串口 连接多个串口崩溃_hdmi视频矩阵切换器串口连接说明景阳华泰科技需要做拼接盒与矩阵联动拼接上大屏,在大屏软件上控制矩阵切换器,那么必须要连接上矩阵的232串口;下面是串口连接的具体步骤:方法一:以大屏拼接盒为中心做环通连接(推荐)1、电脑主机引串口连到大屏拼接盒232输入端,(由于大屏拼接盒232是用网口来定义的,所以电脑端要用USB转网口或者232转网口来连接大屏);2、各大屏拼接盒RS232环通连接;3、大屏环通后的RS232…

    2022年10月21日
    0
  • 程序员必知的8大排序(三)——-冒泡排序,快速排序(java实现)

    程序员必知的8大排序(三)——-冒泡排序,快速排序(java实现)接上一篇:程序员必知的8大排序(二)——-简单选择排序,堆排序(java实现) 5.冒泡排序(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。(2)实例:(3)用java实现publicclass

    2022年6月22日
    26
  • nslookup命令的使用方法_nslookup测试命令

    nslookup命令的使用方法_nslookup测试命令介绍nslookup(nameserverlookup)是和dig类似的命令,都是用来查询域名信息的指令,但是在功能上没有dig强大,这个指令在Windows系统是自带的,要想在Linux中使用,就需要下载和dig相同的工具包使用nslookupdomain[dnsserver]#domain:要查询的域名dnsserver:指定域名服务器,如果不指定,系统就会使用默认的DNS服务器如果没有指定查询的服务类型,系统会默认查询A记录查询其他的服务nsloo

    2022年10月18日
    0
  • python自定义异常和主动抛出异常(raise)

    python自定义异常和主动抛出异常(raise)前言有时候python自带异常不够用,如同java,python也可以自定义异常,并且可以手动抛出。注意,自定义异常只能由自己抛出。python解释器是不知道用户自定义异常是什么鬼的。raise语句主动抛出异常。格式:主动抛出异常终止程序raise异常名称(‘异常描述’)raiseRuntimeError(‘testError’)主动抛出这个异常,并加以解释。自定义异常pytho

    2022年10月17日
    0
  • 透视投影矩阵推导[通俗易懂]

    透视投影矩阵推导[通俗易懂]透视投影矩阵(PerspectiveMatrix)近截面与远截面之间构成的四棱台称为视锥体,而透视投影矩阵的任务就是把位于视锥体内的物体的顶点x,y,zx,y,zx,y,z坐标映射到[−1,1][-1,1][−1,1]范围。这相当于把这个四棱台扭曲变形成一个立方体。这个立方体叫做规范观察体(CanonicalViewVolume,CVV)。矩阵的形式(1aspect⋅tan⁡(fovy2)00001tan⁡(fovy2)0000−zNear−zFarzNear−zFar2⋅zNea

    2022年10月4日
    0
  • 分布式事务中的Saga模式「建议收藏」

    分布式事务中的Saga模式「建议收藏」微服务架构(MSA)已经变得非常流行。但是,一个常见问题是如何跨多个微服务管理分布式事务。当微服务架构将单体系统分解为自封装服务时,意味着单体系统中的本地事务现在分布到将按顺序调用的多个服务中。说到分布式事务,通常熟悉的是两阶段提交,TCC等常见模式。初次之外还有基于Saga实现的分布式事务。什么是Saga?Saga事务模型又叫做长时间运行的事务(Long-running-transact…

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号