linux 驱动 信号量,Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞...

ret = request_irq(IRQ_EINT0,buttons_irq,IRQT_BOTHEDGE,"S1",&pins_desc[0]);

if(ret<0)

printk("Failed 1 button_drv_open");

ret = request_irq(IRQ_EINT2,"S2",&pins_desc[1]);

printk("Failed 2 button_drv_open");

ret = request_irq(IRQ_EINT11,"S3",&pins_desc[2]);

printk("Failed 3 button_drv_open");

ret = request_irq(IRQ_EINT19,"S4",&pins_desc[3]);

printk("Failed 4 button_drv_open");

return 0;

ssize_t button_drv_read(struct file *file,char __user *userbuf,size_t count,loff_t *off)

int ret;

if(file->f_flags&O_NONBLOCK)

if(ev_press!=1) //没有按键按下直接返回

printk("Failed 1 button_drv_read \n");

return -EAGAIN;

else //阻塞

wait_event_interruptible(button_waitq,ev_press);           //如果按键没有动作则进入休眠

ret = copy_to_user(userbuf,&keyVal,1);

printk("Failed 1 button_drv_read \n");

return -1;

ev_press = 0;

return 1;

int button_drv_close(struct inode *inode,courier; font-size: 18px;">   free_irq(IRQ_EINT0,&pins_desc[0]);

free_irq(IRQ_EINT2,courier; font-size: 18px;">   free_irq(IRQ_EINT11,courier; font-size: 18px;">   free_irq(IRQ_EINT19,courier; font-size: 18px;">   up(&button_lock);                                 //释放互斥信号量

return 0;

unsigned int button_drv_poll(struct file *file,poll_table *wait)

unsigned int mask = 0;

poll_wait(file,&button_waitq,wait);

if(ev_press)

mask |= POLLIN | POLLRDNORM;

return mask;

int button_drv_fasync(int fd,struct file *file,int on)

ret = fasync_helper(fd,file,on,&button_fasync);

printk("Failed 1 button_drv_fasync \n");

return ret;

struct file_operations button_drv_fops = {

.owner = THIS_MODULE,courier; font-size: 18px;">   .open = button_drv_open,courier; font-size: 18px;">   .read = button_drv_read,courier; font-size: 18px;">   .release = button_drv_close,courier; font-size: 18px;">   .poll = button_drv_poll,courier; font-size: 18px;">   .fasync = button_drv_fasync,courier; font-size: 18px;">int __init button_drv_init(void)

major = register_chrdev(0,DRIVER_NAME,&button_drv_fops);

if(major<0)

printk("Failed 1 button_drv_init \n");

button_class = class_create(THIS_MODULE,DEVICE_NAME);

if(button_class<0)

printk("Failed 2 button_drv_init \n");

button_class_device = class_device_create(button_class,NULL,MKDEV(major,0),courier; font-size: 18px;">   if(button_class_device<0)

printk("Failed 3 button_drv_init \n");

gpfcon = (volatile unsigned long *)ioremap(0x56000050,16);

gpfdat = gpfcon + 1;

gpgcon = (volatile unsigned long *)ioremap(0x56000060,courier; font-size: 18px;">   gpgdat = gpgcon + 1;

void __exit button_drv_exit(void)

unregister_chrdev(major,courier; font-size: 18px;">   class_device_unregister(button_class_device);

class_destroy(button_class);

IoUnmap(gpfcon);

IoUnmap(gpgcon);

module_init(button_drv_init);

module_exit(button_drv_exit);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值