1、定義「等待佇列頭部」
wait_queue_head_t key_q;
2、初始化「等待佇列頭部」
init_waitqueue_head(&key_q);
3、等待事件發生
wait_event(key_q, key_num);
4、喚醒等待事件
wake_up(&key_q);
查詢按鍵狀態
key.c
#include #include #include #include #include #include #include #include #include #include #include #define gph0con 0xe0200c00
#define gph0dat 0xe0200c04
#define device_name "tqkey"
#define ledcon 0xe0200060
#define leddat 0xe0200064
volatile unsigned int *led_config;
volatile unsigned int *led_data;
volatile unsigned int *key_data;
unsigned int key_num;
//等待佇列
wait_queue_head_t key_q;
//1、定義工作
struct work_struct *work;
//(定時器)1、定義定時器結構體
struct timer_list buttons_timer;
void work_func(struct work_struct *work)
//(定時器)5、函式
static void buttons_timer_function(unsigned long data)
else if(key_val == 1) //按鍵按下為低電平
writel(leddata, led_data);
//喚醒等待佇列
wake_up(&key_q);
}void timer_init(void)
static irqreturn_t key_int(int irq, void *dev_id)
void key_hw_init(void)
/*static long key_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
*/static int key_open(struct inode *inode, struct file *file)
static int key_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
else }
static struct file_operations key_fops =
;struct miscdevice key_miscdev =
;//註冊函式
static int __init button_init(void)
//登出函式
static void __exit button_exit(void)
module_init(button_init);
module_exit(button_exit);
module_license("gpl");
module_author("jerry.gou");
module_description("tq210 button driver");
/*********************************************
*author :jerrygou
*date :2017/10/23
*function :通過read函式,獲取核心中是那個按鍵按下
*********************************************/
#include #include #include #include #include #include #include int main()
阻塞型驅動設計
阻塞型驅動設計 1.阻塞的必要性 當乙個裝置無法立刻滿足使用者的讀寫請 求時應當如何處理?例如 呼叫read 時,裝置沒有資料提供,但以後可能會 有 或者乙個程序試圖向裝置寫入資料,但是裝置暫時沒有準備好接收資料。當 上述情況發生的時候,驅動程式應當 預設地 阻塞程序,使它進入等待 睡 眠 狀態,直...
linux裝置驅動(8)阻塞型IO
當驅動程式無法立即滿足請求,該如何響應?如當我們想要寫入的時候,裝置對應的緩衝區已滿,或者是當我們想要讀的時候當前緩衝區是空的。為了提高cpu的效率,我們的驅動程式應該阻塞等待該程序,將其置於休眠狀態直到請求可繼續。休眠 sleep 對於程序來講意味著什麼?當乙個程序被置入休眠時,他會被標記為一種特...
核心驅動驅動物件 Driver OBJECT
目錄在核心中.每乙個驅動模組都是乙個驅動物件.都有乙個driver object結構體代表.可以想象成驅動物件是乙個程序容器.容納百川.下面針對驅動物件做一下簡單的成員輸出.以熟悉驅動物件.驅動物件結構如下 typedef struct driver object driver object typ...