文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux键盘驱动(模块动态加载)五(结束)

linux键盘驱动(模块动态加载)五(结束)

时间:2007-01-29  来源:rayter

linux键盘驱动(模块动态加载)五(结束)

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

   虽然大多数时候阻塞型和非阻塞型操作的组合及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");

 

 

 

 

键盘驱动到此介绍完毕!!

相关阅读 更多 +
排行榜 更多 +
大武道最新版

大武道最新版

休闲益智 下载
宝宝巴士手机版(babybus)

宝宝巴士手机版(babybus)

休闲益智 下载
宝宝巴士快乐启蒙游戏

宝宝巴士快乐启蒙游戏

休闲益智 下载