姓名:郑煜烁 学号:19029100010 学院:电子工程学院
转自:https://blog.csdn.net/u012142460/article/details/78951664
【嵌牛导读】简单介绍相关的控制操作和命令
【嵌牛鼻子】ioctl设备基本操作
【嵌牛提问】何为ioctl设备
【嵌牛正文】
对驱动设备除了读写操作,还应该有一个控制操作,内核将对设备的控制操作委派给了ioct接口,ioctl也是一个系统调用,函数原型如下:
int ioctl(int d, int request,......)
d表示文件描述符
request我们理解为命令
后面可以跟命令的参数
在文件操作集合中与ioctl对应的函数是:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
第一个参数表示打开的文件结构指针
第二个参数与request对应
第三个参数与系统调用的第三个参数对应。
对于第二个参数request,需要遵从一定的规则
bit31-30 00 命令不带参数
10 命令需要从驱动中获取数据,读方向
01 命令需要把数据写入驱动,写方向
11 命令既要写数据也要读数据 读写
bit 29-16 如果命令带参数,则指定参数所占用的内存空间大小
bit15-8 每个驱动全局唯一的幻数
bit7-0 命令码
内核有命令码来生成相关命令
命令码如何生成:
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) // 生成一个命令码
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) // 生成一个读命令码
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) // 生成一个写命令码
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) // 生成一个读写命令码
type :8位一个幻数,任意的一个字符
nr :自然数 8位
size :数据的类型 占 14位
dir :方向占用 2位
例:
#define SET_BAUD _IOW('c',0,unsigned int )
————————————————
版权声明:本文为CSDN博主「念念有余」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012142460/article/details/78951664