驱动:中断以及实现防抖

        本文是以按键中断为例
首先这是我们对按键中断设备树的编写,写入后,在每次内核启动时。设备树中的资源会自动转化成我们想要的资源。如下
这个表示有两个资源,因为在设备树中我们写入了两个中断资源,第一个数字表示中断的index--->start,第二个表示中断的触发类型----->end

写好设备树后,我们就可以对驱动进行编写;
因为我们是用设备树,那么在驱动中,我们应该是注册平台总线进行匹配,所以在init函数中,我们注册平台总线
exit函数注销(设备树会将中断相关的资源放入平台总线当中;



按照固定思路,我们会定义一个platform_driver pdrv对象,然后分别填充该对象的资源;
其中我们要分别实现probe(申请资源,初始化等操作),remove(释放资源等操作)方法
中,是表示我们支持的设备名称。也就是我们用来匹配对像的
名字。(注意:在of开头的表示是设备树文件操作)
所以在这个里面填充的将是跟设备树一样的,以完成匹配


接着我们实现probe方法,probe中参数有设备详细信息对象pdev,这是在与device匹配成功后获取的(通过平台总线)首先我们得用一个相同对象变量key_pdv保存设备信息对象pdev,然后再probe函数申请各种资源。
1.首先是中断的申请,第一个参数表示的资源1中的中断id,第二个是中断处理方法
2.为了方便与用户程序进行交互,我们创建一个字符设备框架。(申请各种字符设备框架资源)
3.为了防止并发问题对访问临界资源的问题,我们可以初始化一个等待队列进行临界资源的保护(即每次只允许一个进程访问该资源)
4.防抖动功能的实现:初始化一个计时器,并且定义计时器时间到了之后的处理方法--->key_timer_handler,然后加入一个计时器。



对应的remove函数对probe函数中申请各种资源进行释放

每次在read时,我们会有一个等待队列,并且定义一个havedata标记。wait_event_interruptible(wq,havedata==1)
这个等待队列表示只有满足havedata==1才能访问资源;
刚开始访问时,havedata是0,那么等待队列会阻塞。最后我们在中断处理完成后将havedata值1,并且唤醒队列。
注意 :在等待队列唤醒后,唤醒的第一个进程访问 了资源要立马将havedata==0,因为等待队列会唤醒所有正在休眠的进程。只要当第一个进程唤醒后,把havadata==0,才能把剩下的继续休眠;



接下来执行中断函数,当有中断发生时,会调用该函数;此时我们在中断处理的时候设置定时器时间,mod_timer,其中第二个参数是jiffier+100,前面是不变的,后面加的时间表示延时的时间,单位是ms
注意:该函数只执行最后一次设置的时间,也就是说中间防抖产生的设置以最后一次为准。也就是在按键稳定后才真正开始计时。我们在中断处理函数中要获取处理中断的资源,并且保存在data中,当时间到了后会执行key_time_handler,在这个函数中,真正实现中断操作。操作完过后,我们唤醒等待队列。在唤醒前,要把havadata==1.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值