免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 842 | 回复: 0
打印 上一主题 下一主题

linux键盘驱动(模块动态加载)二 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-29 15:50 |只看该作者 |倒序浏览
linux键盘驱动(模块动态加载)二
接下来我们介绍其他几个文件接口函数的实现
四.先介绍关闭函数keypad_release(),为什么先介绍它呢?道理很简单,应该它比较简单,先让大家做下热身运动,在介绍完这个之后,继续会介绍一个比较复杂的函数,看你吃得消没有哦

    关闭操作主要实现的是:关闭设备异步通知,设备计数器减1,删除定时器信号中断
static int Keypad_release(struct inode *inode,struct)
{
   Keypad_fasync(-1,filp,0);
  module_put(THIS_MODULE);
del_timer(&timer);
return 0;
}
五.设备读取操作接口函数实现Keypad_read()
   主要作用是从缓冲区读取键值,通过调用get_data()实现,通过copy_to_user()函数将键值复制到用户的数据区中
static ssize_t Keypad_read(struct file *filp,char *buf,ssize_t count,loff_t *l)
{
   DECLEARE_WAITQUEUE(wait,current);//声明等待队列,将当前进程加入到等待队列中
   KEY_EVENT t;
   ulong out_buf[2];
   if(head==tail)//当前循环队列中没有数据可以读取
   {
        if(filp->f_flags & O_NONBLOCK)//假如用户采用的是非堵塞方式读取
             return _EAGAIN;
       add_wait_queue(&queue,&wait);//将当前进程加入等待队列
       current->state=TASK_INTERRUPTIBLE;//设置当前进程的状态
       while((head==tail)&&!signal_pending(current))//假若还没有数据到循环队列并且当前进程没有受到信号
        {
              shedule();//进程调度
              current->state=TASK_INTERRUPTIBLE;
        }
        current->state=TASK_RUNNING;
        remove_wait_queue(&queue,&wait);
        if(head==tail)
           return count;
        t=get_data();//调用get_data()函数,得到缓冲区中的数据,下面将给予详细的 介绍
        out_buf[0]=t.status;
        out_buf[1]=t.click;
        copy_to_user(buf,&out_buf,sizeof(out_buf));//将得到的键值拷贝到用户数据区
        return count;
      
   }
}
很自然我们就应该要介绍get_data()函数的实现了,该函数的功能就是从我们定义的循环队列缓冲区中读出我们要的键值,所以其实很简单的如果理解循环队列的原理,在此不多加解释,大家应该具备一般的数据结构相关的知识吧

static KEY_EVENT get_data(void)
{
     int last=tail
     if(++tail==BUFSIZE)
        tail=0;
     return buf[last];
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13229/showart_239595.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP