基於非同步通知機制的按鍵驅動

2021-07-27 16:32:08 字數 2245 閱讀 1215

按下按鍵是驅動程式通知應用程式

應用程式裡面要註冊訊號處理函式

驅動程式給應用程式發訊號

發給誰,這就要應用程式告訴驅動pid了

怎麼發,是驅動裡面呼叫kill_fasync

為了使裝置支援非同步通知機制,驅動程式涉及以下3項工作

1.支援f_setown命令,能在這個控制命令處理中設定filp->f_owner為對應程序id

不過此項工作已經有核心完成,裝置驅動無需處理

2.支援f_setfl命令的處理,每當fasync標誌改變時,驅動程式中的fasync()函式將得以執行

驅動中應該實現fasync函式

3.在裝置資源可以獲得時,呼叫kill_fasync()函式激發相應的訊號

應用程式會呼叫fcntl(fd,f_setown,pid)把它的pid告訴驅動程式

然後還要讀出flags

oflags = fcntl(fd,f_getfl)

要把這個flag進行修改fcntl(fd,f_setfl,oflags | fasync);當應用程式呼叫這個介面的時候,fasync_helper就會被呼叫

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int key_id;

struct cdev cdev;

dev_t devno;

static struct fasync_struct *button_fasync;

/*定義並初始化等待佇列的頭*/

static declare_wait_queue_head(key_qaq);

/*中斷事件標誌,中斷服務程式將它置為1,read函式將它置為0*/

unsigned int wait_val=0;

struct class *my_class;

static irqreturn_t key_func(int irq,void *dev_id)

static int key_open(struct inode *inode,struct file *file)

static int key_close(struct inode *inode,struct file *file)

ssize_t key_read(struct file *filp, char __user *buf, size_t size,loff_t *pos)

static int key_fasync(int fd,struct file *filp,int on)

static unsigned key_poll(struct file *file, poll_table *wait)

static struct file_operations key_fops =

;static int __init key_fasync_init(void)

device_create(my_class, null, devno,null,"key_fasync_driver");

return 0;

}static void key_fasync_exit(void)

module_init(key_fasync_init);

module_exit(key_fasync_exit);

module_license("gpl");

module_author("eight_five");

測試程式如下:

#include

#include

#include

#include

#include

#include

#include

#include

int fd;

void my_signal_func(int signum)

int main(int argc,char **argv)

fcntl(fd,f_setown,getpid());

flag=fcntl(fd,f_getfl);

fcntl(fd,f_setfl,flag | fasync);

while(1);

return 0;

}

按鍵驅動程式(非同步通知)

此驅動程式之前的按鍵驅動程式 中斷方式 上加以優化。用到非同步通知。對於核心來講,既然使用者想得到的是按鍵後的狀態,那麼自然不必時時都要 狀態。當它檢測到中斷發生變主動通知使用者,使用者再來讀。這樣,使用者空間 核心就可以著手幹點其它的事情,而不必忙等按鍵按下或釋放。那麼就先從應用程式上面看。怎麼設...

linux裝置驅動中的非同步通知機制

非同步通知的意思是 一旦裝置就緒,則主動通知應用程式,這樣應用程式根本就不需要查詢裝置狀態,這一點非常類似於硬體上 中斷 的概念,比較準確的稱謂是 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的.訊號是非同步的,乙...

驅動實現非同步通知

在應用層中,通過非同步通知的機制來處理隨時發生的事件。例如用signal來俘獲訊號 void handler int main 如果想讓裝置檔案擁有非同步通知機制,那麼,在主函式中是這樣實現的 int main 完成了這些,在核心相對應的file結構體就會被設定成上面的樣子,也就是擁有了fasync...