ioctl的一点理解

首先明确ioctl的作用:向设备文件上写入或者读取数据时使用read()和write(),但是两者不能区别写入或读取的是控制数据还是通信状态数据等信息,这就需要用到ioctl;

在设备驱动中应用ioctl函数需要在file_operation结构体中定义。

设备驱动中的ioctl的形式一般为:xxx_ioctl(struct inode *inode , struct file *filp , unsigned int cmd , unsigned long arg)

其中我们重点了解cmd这个参数以及与之相关的一些宏:

cmd是应用程序用于向驱动请求 处理的内容的标示,不同的cmd标示请求处理的内容不一样。

cmd的大小为32位,被分为4个区域  

1)区别序号;

2)魔数 ,用于判断命令是否属于该驱动 ;

 3)数据大小 

4)区别读写


那么如何生成这些命令呢?

我们通常的做法是写一个头文件,在其中定义驱动使用到的命令(当然是用宏产生的),该头文件是驱动和应用程序共享的。

用于产生命令的宏以及其格式为_IO(魔术,基数) ,_IOR(魔术,基数,变量型),_IOW(魔术,基数,变量型),_IOWR(魔术,基数,变量型),其中变量型一般为一个结构体,这也要在头文件中定义。


解析这些命令用到的宏:IOC_NR:读取基数域值 IOC_TYPE读取模数IOC_SIZE读取数据大小 IOC_DIR读取读写属性。

通常在ioctl函数中用switch区分命令并执行相应的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ioctl是Linux系统中的一个系统调用,用于设备驱动程序和用户空间程序之间的通信。在GPIO驱动程序中,ioctl可以用于控制GPIO的输入输出状态。使用gpiolib库和ioctl命令可以实现GPIO的输入输出操作。 下面是一个使用ioctl控制GPIO的例子: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/gpio.h> #define GPIO_NUM 17 int main(int argc, char *argv[]) { int fd; struct gpiochip_info chip_info; struct gpioline_info line_info; struct gpiohandle_request req; int ret; fd = open("/dev/gpiochip0", O_RDWR); if (fd < 0) { perror("open"); exit(1); } ret = ioctl(fd, GPIO_GET_CHIPINFO_IOCTL, &chip_info); if (ret < 0) { perror("ioctl"); exit(1); } line_info.line_offset = GPIO_NUM; ret = ioctl(fd, GPIO_GET_LINEINFO_IOCTL, &line_info); if (ret < 0) { perror("ioctl"); exit(1); } req.lines = 1; req.lineoffsets[0] = GPIO_NUM; req.default_values[0] = 0; req.consumer_label = "gpio_test"; ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req); if (ret < 0) { perror("ioctl"); exit(1); } while (1) { req.values[0] = 1; ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &req); if (ret < 0) { perror("ioctl"); exit(1); } sleep(2); req.values[0] = 0; ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &req); if (ret < 0) { perror("ioctl"); exit(1); } sleep(2); } close(fd); return 0; } ``` 该例子中使用了Linux内核提供的GPIO驱动程序,通过打开/dev/gpiochip0设备文件,使用ioctl命令控制GPIO的输入输出状态。具体来说,该例子中使用了GPIO_GET_CHIPINFO_IOCTL和GPIO_GET_LINEINFO_IOCTL命令获取GPIO芯片和GPIO线路的信息,使用GPIO_GET_LINEHANDLE_IOCTL命令获取GPIO线路的句柄,使用GPIOHANDLE_SET_LINE_VALUES_IOCTL命令设置GPIO线路的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值