字元裝置驅動按鍵防抖

2021-09-29 02:02:14 字數 1541 閱讀 2304

由於機械開關按鍵時,金屬彈片會出現多次抖動,這樣就會產生多次中斷,讀取多次鍵值。需要引入定時器,比如10ms後再處理定時器函式,這樣每次抖動產生中斷會過10ms後再處理,這樣多次抖動會響應一次定時器中斷處理。

定時器使用:兩要素:a.時間 b.函式4

1)定義乙個定時器結構體:static  struct  timer_list  button_timer;

2)定時器初始化:驅動入口函式init進行定時器初始化

init_timer(&button_timer);

//button_timer.data  =  (unsigned  long)scpnt;//給function處理函式用的

//button_timer.expires = jiffies + 100*hz;/*10s*/,hz定義為100  在中斷處理程式用程式

//button_timer.function = (void (*)(unsigned long)) timer_expired;

button_timer.function = buttons_timer_function;

3)編寫定時器處理函式

static void  buttons_timer_function(unsigned long data)

struct pin_desc *pindesc = (struct pin_desc *)dev_id;

unsigned int pinval;

if(!pindesc )//判斷是否有按鍵按下,即是否為空

return;

pinval = s3c2410_gpio_getpin(pindesc->pin);

if(pinval)

else

ev_press = 1; /*表示中斷發發生了*/

wake_up_interruptible(&button_waitq);

kill_fasync(&buton_async,sigio,poll_in);

//printk("irq = %d\n",irq);

4)在入口函式即init使用add_timer(&button_timer),因為此時超時時間系統初始化button_timer.expires =0;此時呼叫add_timer函式時jiffies >=0,即立即執行定時器處理函式,但是因為現在沒有按鍵按下,所以需要在定時器處理函式判斷dev_id是否為空即是否有按鍵按下。用這個函式把定時器告訴核心,當裡面定時器時間到了之後,就呼叫定時器處理函式void  buttons_timer_function(unsigned long data)

5)在中斷處理函式中新增下面內容,先定義引腳static  struct  pin_desc *irq_pd

static irqreturn_t buttons_irq(int irq,void *dev_id)

irq_pd  = (struct  pin_desc *)dev_id;

mod_timer(&button_timer, jiffies + hz/100);//10ms過後啟動定時器

return irq_retval(irq_handled);

輸入裝置驅動之按鍵裝置驅動

linux輸入子系統就是乙個基於分層模式的系統,其基本的層次分解如下圖所示。在圖中我們可以發現輸入子系統主要包括三個部分裝置驅動層 input driver 核心層 input core 和輸入事件驅動層。輸入子系統的劃分使得輸入裝置的驅動程式設計越來越簡單,但是其中的思想採用我們學習的重點和難點。...

Linux字元裝置驅動之中斷按鍵

驅動程式 include 模組有關的 include 核心有關的 include 檔案系統有關的 include include include include include include linux中斷 include include include include copy to user ...

Linux字元裝置驅動之中斷按鍵

驅動程式 include 模組有關的 include 核心有關的 include 檔案系統有關的 include include include include include include linux中斷 include include include include copy to user ...