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中的 中断还是会有。