GPIO ,ioctl,file->private_data

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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值