设为首页 加入收藏

TOP

特殊按键--休眠键驱动(六)
2014-11-24 07:27:14 】 浏览:5594
Tags:特殊 按键 休眠 驱动
inode,struct file *filp)
{
struct powerkey_t *p = &pwk;
p->ifopen++;
return 0;
}
int pb_release(struct inode *inode,struct file *filp)
{
struct powerkey_t *p = &pwk;
if(p->ifopen > NOOPENED)
p->ifopen--;
release_fasync(filp); //处理FASYNC标志
return 0;
}
/*
static ssize_t pb_read(struct file *filp,char *buf,size_t size,loff_t *ppos)
{
return 0;
}
static ssize_t pb_write(struct file *filp,const char *buf,size_t size,loff_t *ppos)
{
return 0;
}
*/
static int pb_ioctl(struct inode *inodep,struct file *filp,unsigned int cmd,unsigned long arg)
{
int ret = 0;
struct powerkey_t *ppwk = &pwk;
switch(cmd)
{
case HANDSHAKE_EVENT_OK:
ppwk->handshake = HANDSHAKE_EVENT_OK;
wake_up_interruptible(&ppwk->keywaitq);
break;
case GET_EVENT_STATE:
if(copy_to_user((int *)arg,&ppwk->event,sizeof(ppwk->event)))
{
ret = -1;
}
else
{
ppwk->event = NORMAL_EVENT;
}
break;
case FREE_HANDSHAKE_EVENT:
release_fasync(filp);
break;
//case SUSPEND_EVENT:
//break;
default:
break;
}
return 0;
}
static struct file_operations pb_fops = {
.owner = THIS_MODULE,
//.read = pb_read,
//.write = pb_write,
.ioctl = pb_ioctl,
.open = pb_open,
.release = pb_release,
.fasync = pb_fasync,
};
static struct miscdevice pb_miscdev = {
.minor = 100,
.name = PB_DEVICE_NAME,
.fops = &pb_fops,
};
static int pb_probe(struct platform_device *pdev)
{
int ret;
ret = misc_register(&pb_miscdev);
wakeup_init();
wakeup_ack_irq();
ret = pb_irq_init(); //中断初始化
if(ret)
{
misc_deregister(&pb_miscdev);
}
driver_data_init();
ret = create_powerkey_thread(); //创建内核线程
if(ret)
{
free_irq(IRQ_WAKEUP0,NULL);
misc_deregister(&pb_miscdev);
}
return 0;
}
static int pb_remove(struct platform_device *pdev)
{
int ret;
struct powerkey_t *ppwk = &pwk;
ret = wakeup_ack_irq();
wake_up_interruptible(&ppwk->keywaitq); //唤醒等待队列
delete_powerkey_thread(); //干掉内核线程
free_irq(IRQ_WAKEUP0, NULL); //干掉中断
misc_deregister(&pb_miscdev);
return 0;
}
#ifdef CONFIG_PM
static int pb_suspend(struct platform_device *pdev, pm_message_t state)
{
wakeup_ack_irq();
disable_wakeup();
free_irq(IRQ_WAKEUP0, NULL);
return 0;
}
static int pb_resume(struct platform_device *pdev)
{
pb_irq_init();
return 0;
}
#else
#define pb_suspend NULL
#define pb_resume NULL
#endif
static struct platform_driver pb_driver = {
.driver = {
.name = "william_pmb",
},
.probe = pb_probe,
.remove = pb_remove,
.suspend = pb_suspend,
.resu
首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HEVC帧间预测之三――TEncCu::xCh.. 下一篇STL,迭代器的C++简单实现

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目