文章详情

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

linux键盘驱动(模块动态加载)二

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

linux键盘驱动(模块动态加载)二

接下来我们介绍其他几个文件接口函数的实现

四.先介绍关闭函数keypad_release(),为什么先介绍它呢?道理很简单,应该它比较简单,先让大家做下热身运动,在介绍完这个之后,继续会介绍一个比较复杂的函数,看你吃得消没有哦500){this.resized=true;this.style.width=500;}">

    关闭操作主要实现的是:关闭设备异步通知,设备计数器减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()函数的实现了,该函数的功能就是从我们定义的循环队列缓冲区中读出我们要的键值,所以其实很简单的如果理解循环队列的原理,在此不多加解释,大家应该具备一般的数据结构相关的知识吧500){this.resized=true;this.style.width=500;}">

static KEY_EVENT get_data(void)

{

     int last=tail

     if(++tail==BUFSIZE)

        tail=0;

     return buf[last];

}

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

大武道最新版

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

宝宝巴士手机版(babybus)

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

宝宝巴士快乐启蒙游戏

休闲益智 下载