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)
上一篇 2022年10月17日 下午4:16
下一篇 2022年10月17日 下午4:36


相关推荐

  • NodeJS农产品在线交易平台01124-计算机毕设原创(免费领源码+带部署教程)

    NodeJS农产品在线交易平台01124-计算机毕设原创(免费领源码+带部署教程)

    2026年3月15日
    2
  • OCR-CTPN 文字检测

    OCR-CTPN 文字检测文本检测和一般目标检测的不同 文本线是一个 sequence 字符 字符的一部分 多字符组成的一个 sequence 而不是一般目标检测中只有一个独立的目标 这既是优势 也是难点 优势体现在同一文本线上不同字符可以互相利用上下文 可以用 sequence 的方法比如 RNN 来表示 难点体现在要检测出一个完整的文本线 同一文本线上不同字符可能差异大 距离远 要作为一个整体检测出来难度比单个目标更大 因此 作者认为预测文本的竖直位置 文本 boundingbox 的上下边界 比水平位置 文本 boundingbox 的

    2026年3月16日
    2
  • 六大设计原则详解

    六大设计原则详解

    2022年3月7日
    37
  • ADRC学习

    学习ADRC先从提出这个算法的论文《从PID技术到“自抗扰控制”技术》开始。https://download.csdn.net/download/qq_34445388/10309935调试四轮智能车,板球控制系统,两轮直立车,舵机控制,这些控制系统用的都是PID控制,虽然我已经有很多种改进方法,但是还是很难突破传统PID的限制,调节速度和超调一定同时存在,想要得到较好的控制效果,用现…

    2022年4月3日
    50
  • Pycharm修改字体大小「建议收藏」

    Pycharm修改字体大小「建议收藏」点击settings点击Editor点击Font修改Size和linespacing

    2022年8月25日
    10
  • spring cloud搭建教程

    spring cloud搭建教程Springcloud 是一个基于 SpringBoot 实现的服务治理工具包 在微服务架构中用于管理和协调服务的微服务 就是把一个单体项目 拆分为多个微服务 每个微服务可以独立技术选型 独立开发 独立部署 独立运维 并且多个服务相互协调 相互配合 最终完成用户的价值 SpringCloud 是一系列框架的有序集合 其主要的设施有 服务发现与注册 配置中心 消息总线 负载均衡 断路器 数据监控等 通过 SpringBoot 的方式 可以实现一键启动 和部署

    2026年3月17日
    2

发表回复

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

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