Chinaunix首页 | 论坛 | 博客
  • 博客访问: 479427
  • 博文数量: 130
  • 博客积分: 2111
  • 博客等级: 大尉
  • 技术积分: 1373
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-28 09:55
个人简介

IT民工

文章分类

全部博文(130)

文章存档

2021年(1)

2019年(1)

2017年(3)

2014年(1)

2013年(3)

2012年(2)

2011年(3)

2010年(2)

2009年(114)

分类: LINUX

2009-09-03 13:06:17

linux按键驱动讲解五[zt]
2008-04-07 11:48:36
linux键盘驱动(模块动态加载)五(结束)

转载请注明来源为:qiangren.blog.edu.cn 

更多的资讯欢迎登录:qiangren.blog.edu.cn

九.在设备驱动中实现异步通知

   虽然大多数时候阻塞型和非阻塞型操作的组合及poll方法可以有效查询设备是否可以读写,但是如果驱动程序能避免主动的查询,改主动为被动的信号通知触 发,则可以提高程序的效率,这也就是异步通知的目的。异步通知向进程发送SIGIO信号,通知访问设备的进程,表示该设备已经准备好IO读写了。

  之后就是如何实现异步通知的问题了,要启动异步通知,必须执行两个步骤:首先,须要制定某个作为文件的“属主”。文件属主的进程ID保存在filp- >f_owner中,这可以通过fcntl()系统调用执行F_SETOWN命令设置。此外,用户程序还必须曙色之设备的FASYNC标志,以真正 启动异步通知机制。这里的FASYNC标志也使用fcntl()设置。

  在完成这两个步骤之后,当新数据到达时就会产生一个SIGNO信号,此信号发送到存放在filp->owner中的进程。

  从驱动的角度看,则主要时通过调用两个内核提供的函数来实现就是了。他们分别是:int fasync_helper()和void kill_fasync();这两个函数定义在:include\linux\fs\fcntl.h

    要实现异步,驱动中只要如下编写即可

static struct fasync_struct *fasync;//首先是定义一个结构体

static int Keypad_release(struct inode *inode,struct file *filp)

{

   Keypad_fasync(-1,filp,0);//这是一个异步通知

 。。。。。。。

}

static int Keypad_fasync(int fd,struct file *filp,int on)

{

   int retval;

  retval=fasync_helper(fd,filp,on,&fasync);

  if(retval<0)

     return retval;

  return 0;

}

到此为止,键盘驱动已经介绍完了,接下来就介绍下一个利用使用驱动的应用实例了。

更多的资讯欢迎登录:qiangren.blog.edu.cn

以下程序的主体是一个条件循环,每次循环执行一次,就读取一次键值。

1。打开Keypad设备

 #define DEV_NAME "/dev/Keypad"

int fb=0;

fb=open(DEV_NAME,O_RNONLY);

if(!fb){

    printf("Error:cannot open Keypad device.\n"); 

   exit(1);

}

printf("The Keypad device was opened successfully.\n");

}

2.读取键值

unsigned long keydata[2];

int input=1;

while(input!=0)

{

    if(read(fd,(char*)keydata,sizeof(keydata))==-1){

       printf("Error reading the keypad data");

       close(fb);

       exit(2);

     }

     if(keydata[0]){

      switch(keydata[1]){

          case 1:printf("KEYPUSED 1");//1键被按下

                      input=0;////下此循环退出

                      break;

          。。。。。。。。。。。。。。。。。。

      }

    }

}

3。关闭Keypad设备

close(fb);

printf("Good bye Keypad");

 

阅读(716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~