蛻變成蝶 Linux裝置驅動之按鍵裝置驅動

2021-07-23 18:02:03 字數 2353 閱讀 9635

在上述的驅動系列部落格中,我們已經了解了關於阻塞和非阻塞、非同步通知、輪詢、記憶體和i/o口訪問、併發控制等知識,按鍵裝置驅動相對來說是比較簡單的,本章內容可以加深我們對字元裝置驅動架構、阻塞與非阻塞、中斷定時器等相關知識的理解。在嵌入式的系統中,按鍵的硬體原理簡單,就是通過乙個上拉電阻將處理器的外部中斷引腳拉高,電阻的另一端接按鈕並接地就可以實現。

1、按鍵的確認流程如下

2 按鍵驅動中的有關資料結構

2.1 按鍵裝置結構體以及定時器

#define max key buf 16 // 鍵緩衝區大小                                  

typedef unsigned char key ret;

//裝置結構體:

typedef struct

key dev;

static struct timer list key timer[key num];//4個 鍵去抖定時器

2.2 按鍵硬體資源、鍵值資訊結構體

static struct key info

key info tab [4] =,,

,,};

2.3 按鍵裝置驅動檔案操作結構體

static struct file operations s3c2410 key fops =

;

3 按鍵裝置的模組載入和解除安裝函式

3.1 載入函式

static int    init s3c2410 key init (void)

3.2 解除安裝函式

static void     exit s3c2410 key exit (void)

3.3 中斷申請函式

/*申請系統中斷,中斷方式為下降沿觸發*/

static int request irqs(void)

}return 0;

}

3.4 中斷釋放函式

/*釋放中斷*/

static void free irqs(void)

}

4 按鍵裝置驅動中斷和定時器處理程式

在按鍵按下之後,將發生中斷,在中斷處理程式中,應該先關閉中斷進去查詢模式,延時以消抖如下中斷處理過程只有頂半部,沒有底半部。

4.1 中斷處理程式

static void s3c2410 eint key (int irq, void *dev id, struct pt regs *reg)

4.2 定時器處理流程

按鍵按下時,該按鍵將記錄字啊緩衝區,同時定時器啟動延時,每次記錄新的鍵值時,等待佇列被喚醒,其**如下。

//按鍵裝置驅動的定時器處理函式

static void key timer handler (unsigned long data)

else

}else //鍵已抬起

5 開啟和釋放函式

這裡主要是設定keydev.head和keydev.tail還有按鍵事件函式指標keyevent的值,按鍵裝置驅動的開啟、釋放函式如下:

static int s3c2410 key open (struct inode *inode, struct file *filp)

static int s3c2410 key release (struct inode *inode, struct file *filp)

6 讀函式

讀函式主要是提供對按鍵裝置結構體緩衝區的讀並複製到使用者空間,當keydev.head != keydev.tail時,說明緩衝區有資料,使用copy_to_user()函式拷貝到使用者空間,反之根據使用者空間是阻塞還是非阻塞讀分為以下兩種情況:

//按鍵裝置驅動的讀函式

static ssize t s3c2410 key read (struct file *filp,char *buf,ssize tcount, loff t*ppos)

else

interruptible sleep on (&(keydev .wq));

//使用者採用阻塞方式讀取,呼叫該函式使程序睡眠

goto retry;

}return 0;

}

蛻變成蝶 Linux裝置驅動之CPU與記憶體和I O

那是世上最遠的距離 思念讓我無法去呼吸 你的一動和一舉 佔據我心裡 陪我每個孤獨無盡的夜裡 用我心中盛放的畫筆 描繪你微笑時的絢麗 愛讓人痛徹心底 我卻不懷疑 你的存在是我生命的奇蹟 感受你的每一次的呼吸 多想告訴你我有多愛你 如果我說我願意 為你而死去 可否你的夢裡留下我痕跡 無數悸動變換歲月裡 ...

蛻變成蝶 Linux裝置驅動中的併發控制

併發和競爭發生在兩類體系中 訪問共享資源的 區域稱為臨界區 critical sections 臨界區需要以某種互斥機制加以保護。在驅動程式中,當多個執行緒同時訪問相同的資源 critical sections 時 驅動程式中的全域性變數是一種典型的共享資源 可能會引發 競態 因此我們必須對共享資源...

蛻變成蝶 Linux裝置驅動中的阻塞和非阻塞I O

今天意外收到乙個訊息,真是驚呆我了,部落格軒給我發了資訊,說是俺的部落格文章有特色可以出本書,這簡直讓我受寵若驚,俺只是個大三的技術宅,寫的部落格也是自己所學的一些見解和在網上看到我一些博文以及帖子裡綜合起來寫的,總之這又給了額外的動力,讓自己繼續前進,希望和大家能夠分享一些自己的經驗,在最需要奮鬥...