当前位置: 代码迷 >> 综合 >> GPIO ,ioctl,file-private_data
  详细解决方案

GPIO ,ioctl,file-private_data

热度:82   发布时间:2024-01-17 11:59:08.0

1.应用层的ioctl,int ioctl(int fd, ind cmd, …);fd为你所打开的文件描述符,cmd一般可以为一个宏标志,如

#define  GPIO_REQUEST   _IO('I',1)     第三个参数可以为一个一个结构体的地址,当应用程序调用ioctl 时

驱动中的对应ioctl中的   XX_ioctl(struct file *pfile, unsigned int cmd, unsigned long arg)

中的arg即是传下来的该结构体地址。数据结构struce file 在驱动中的 struct file_operations中的接口(如 open read write ioctl)中都存在,他的pfile->private_data即为私有的数据,你可以将自己的数据结构传到该指针指向的空间里面,前提是你要申请一个空间让该指针指向该申请的空间,对该空间里的数据在 struct file_operations 中定义的各函数接口中进行任意的操作。

2.程序中不要要全局变量,不然你会很痛苦的,把全局变量统统都给干掉

3.应用程序中ioctl(xx,xx ,&xx)最后一个参数传递给驱动程序的地址,你可以对该空间的值做任意的改变,改变之后你再在应用程序中直接取你就能取到改变过后的值。比如你定义了一个结构体:

struce gpio_pri{

int number;

irq_trigger;

}gpio;

你在应用程序中将这个结构体最为参数向驱动中传递,ioctl(fd,cmd,&gpio);

在驱动程序中

XX_ioctl(struct file *pfile, unsigned int cmd, unsigned long arg)

{

struct gpio_pri *gpio = (struct gpio_pri *)arg;

/*你可以改变这个地址里的值*/gpio->irq_trigger = 1;

}

改变了之后,你在应用程序中直接读取gpio->trigger 他的值即是驱动里改变的那个,就是这么神奇,之前都不知道怎么回事,看网上有哥们这样做,亲自验证过真是这么回事。

4.驱动中ioctl返回的值即是应用程序中的ioctl的返回值。

5.用irq_request( , , , (void *)dev_id)申请的中断,当dev_id不为空时,当你在free_irq()释放的时候,/proc/interrupt中的 中断还是会有。



  相关解决方案