字元裝置驅動(3) 非同步通知

2021-08-19 16:45:14 字數 2386 閱讀 2892

#include #include #include #include #include #include #include #include #include #include #include #include #include static struct class *fifthdrv_class;

static struct class_device *fifthdrv_class_dev;

volatile unsigned long *gpfcon;

volatile unsigned long *gpfdat;

volatile unsigned long *gpgcon;

volatile unsigned long *gpgdat;

static declare_wait_queue_head(button_waitq);

/* 中斷事件標誌, 中斷服務程式將它置1,fifth_drv_read將它清0 */

static volatile int ev_press = 0;

static struct fasync_struct *button_async;

struct pin_desc;

/* 鍵值: 按下時, 0x01, 0x02, 0x03, 0x04 */

/* 鍵值: 鬆開時, 0x81, 0x82, 0x83, 0x84 */

static unsigned char key_val;

struct pin_desc pins_desc[4] = ,

, ,,};

/* * 確定按鍵值

*/static irqreturn_t buttons_irq(int irq, void *dev_id)

else

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

wake_up_interruptible(&button_waitq); /* 喚醒休眠的程序 */

kill_fasync (&button_async, sigio, poll_in);

return irq_retval(irq_handled);

}static int fifth_drv_open(struct inode *inode, struct file *file)

ssize_t fifth_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)

int fifth_drv_close(struct inode *inode, struct file *file)

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

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

static struct file_operations sencod_drv_fops = ;

int major;

static int fifth_drv_init(void)

static void fifth_drv_exit(void)

module_init(fifth_drv_init);

module_exit(fifth_drv_exit);

module_license("gpl");

#include #include #include #include #include #include #include #include #include /* fifthdrvtest 

*/int fd;

void my_signal_fun(int signum)

int main(int argc, char **argv)

fcntl(fd, f_setown, getpid());

oflags = fcntl(fd, f_getfl);

fcntl(fd, f_setfl, oflags | fasync);

while (1)

return 0;

}

1、fasync是為了使驅動的讀寫和應用程式的讀寫分開,使得應用程式可以在驅動讀寫的時候去做別的事。

2、fasync_helper初始化fasync,包括分配記憶體和設定屬性。

3、kill_fasync (&button_async, sigio, poll_in),發sigio訊號給應用程式;

應用程式就呼叫自己安裝的響應函式去處理,signal(sigio, my_signal_fun)。

4、fcntl(fd, f_setfl, oflags | fasync),設定fasync屬性。

字元裝置驅動程式 非同步通知

1.各種讀取按鍵值的方式比較 查詢 耗cpu資源 中斷 在應用程式中的read函式一直會休眠,直到有中斷發生。poll 在一段時間內跟中斷相同,但是超時之後read函式會返回。三種共同點 應用程式主動去讀取按鍵的狀態。2.驅動程式主動去提醒應用的方式 非同步通知 實現方式 signal 舉例 kil...

字元裝置驅動之筆記 非同步通知(fasync)

發訊號 1.誰發 2.發給誰 3.發什麼 4.怎麼發 5.收到訊號後做什麼 驅動和應用 發訊號 1.誰發 按鍵中斷服務程式 2.發給誰 使用按鍵的應用程式 3.發什麼 sigio 4.怎麼發 kill fasync 誰,sigio 5.收到訊號後做什麼 sighandler t signal int...

Linux裝置驅動中的非同步通知和非同步IO

前面兩章分別提到io模型中的阻塞與非阻塞linux驅動 六 裝置驅動中的阻塞與非阻塞io,io多路復用驅動中輪詢操作實現,這一章我們再來看看非同步io,這樣,io模型就可以都搞定了。回顧一下在應用程式中使用非同步io的步驟 1,應用程式 1 設定非同步標誌位 int flags fcntl fd,f...