jiangdou 发表于 2014-9-2 22:45:40

关于_外部中断驱动异步通知应用程序,

本帖最后由 jiangdou 于 2014-12-24 17:17 编辑

先上图片:

1,file 1,-> ent_test.c/*
* fileent_test.c
* Copyright by jiangdou QQ:344283973
*
* RK3188 ENT test 20140902
* how to compile: $ arm-linux-gnueabihf-gcc -o ent_test ENT_test.c-static

*/


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <poll.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>



int fd;

//信号处理函数
void my_signal_fun(int signum)
{
      
      printf("by jiangdou............\n");
}

int main(void)
{
      unsigned char key_val;
      int ret;
      int Oflags;
      signal(SIGIO, my_signal_fun);
      fd = open("/dev/key", O_RDWR);
      if (fd < 0)
      {
                printf("can't open!\n");
      }
      ret = fcntl(fd, F_SETOWN, getpid());
      if(ret < 0)
      {
                printf("can't fcntl_1!\n");
      }
      
      
      Oflags = fcntl(fd, F_GETFL);
      printf("Oflags is : %d\n", Oflags);//is 2
      if(Oflags < 0)
      {
                printf("can't fcntl_2!\n");
      }
      ret = fcntl(fd, F_SETFL, Oflags | FASYNC);
      if(ret < 0)
      {
                printf("can't fcntl_3!\n");
      }
      while (1)
      {
                sleep(1000);
      }
      
      return 0;
}



1,file 2,-> irq_.c/*
* fileent_test.c
* Driver for irq on GPIO lines capable of generating interrupts.
*
* Copyright by jiangdou
*
*
*
*/

#include <linux/module.h>

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/adc.h>

#include <asm/gpio.h>
#include <mach/board.h>
#include <plat/key.h>
#include <linux/poll.h>



static struct class *keydrv_class;

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

static struct fasync_struct *button_async;


//static volatile int ev_press = 0;




#define ENT0 RK30_PIN1_PB7
#define GPIO_IRQ207


static irqreturn_t irq_isr(int irq, void *dev_id)
{
      //printk("jiangdou....irq_isr...\n");
      
      ev_press = 1;

    wake_up_interruptible(&button_waitq);
   
      
      kill_fasync(&button_async, SIGIO, POLL_IN);
      
      return IRQ_RETVAL(IRQ_HANDLED);
      
      //return 0;
}

static int irq_open(struct inode*inode, struct file *file)
{
      int error;
      
      printk("jiangdou....irq_open...\n");
      if(gpio_request(ENT0,NULL) != 0){
      gpio_free(ENT0);
      printk("gpio_request error\n");
      return -EIO;
    }
      error = request_irq(GPIO_IRQ, irq_isr, IRQF_TRIGGER_FALLING, "irq_dou", 1);
      if(error){
                printk("failed to register irq_isr interrupt\n");
      }
      return error;
}


int irq_close(struct inode *inode,struct file *file)
{
      free_irq(GPIO_IRQ,1);
      return 0;
}


static unsigned irq_poll(struct file *file, poll_table *wait)
{
      unsigned int mask = 0;
      poll_wait(file, &button_waitq, wait); //

      if (ev_press)
                mask |= POLLIN | POLLRDNORM;

      return mask;
}




static int irq_fasync (int fd, struct file *filp, int on)
{
      printk("driver: fifth_drv_fasync\n");
      
      return fasync_helper(fd, filp, on, &button_async);
}





static struct file_operations irq_drv_fops= {

      .owner      =      THIS_MODULE,   
      .open      =      irq_open,            
      .release      =      irq_close,
      //.fasync         =irq_fasync,
      //.poll    =irq_poll,

};

int major;

static intirq_init(void)
{
      printk("jiangdou....irq_init...\n");
      major = register_chrdev(0, "irq_drv", &irq_drv_fops);
      keydrv_class = class_create(THIS_MODULE,"irq_drv");
      device_create(keydrv_class,NULL,MKDEV(major,0),NULL,"key");
      

      return 0;
}
static void irq_drv_exit(void)

{
      unregister_chrdev(major, "irq_drv");
      device_destroy(keydrv_class,MKDEV(major,0));
      class_destroy(keydrv_class);
      

}

module_init(irq_init);

module_exit(irq_drv_exit);

MODULE_LICENSE("GPL");

qiaoge 发表于 2014-9-3 08:49:10

不错,但是要拿A10搞一个

jiangdou 发表于 2014-9-3 10:49:01

qiaoge 发表于 2014-9-3 08:49 static/image/common/back.gif
不错,但是要拿A10搞一个

芯片是次要的,驱动框架更重要,A10,更简单

lin 发表于 2014-9-4 14:24:32

jiangdou又出好东西啦。

hades 发表于 2014-11-14 11:14:13

:lol:lol:lol挺好的,,,
页: [1]
查看完整版本: 关于_外部中断驱动异步通知应用程序,