定義等待佇列:
wait_queue_head_t button_waitq
初始化等待佇列頭:
init_waitqueue_head(button_waitq)
定義並初始化等待佇列頭(相當於上面兩句合併)
static declare_wait_queue_head(button_waitq);//定義並初始化等待佇列頭
驅動
#include #include #include #include //request_irq
#include //中斷號,已包含plat/irqs.h
#include #include //class_create device_create
#include #include //ioremap ioread32 iowrite32
#include #include #include #include #include #define dev_name "wait-dev"
static struct class *keydrv_class;
static struct class_device *keydrv_class_dev;
static declare_wait_queue_head(button_waitq);
/* 中斷事件標誌, 中斷服務程式將它置1,third_drv_read將它清0 */
static volatile int ev_press = 0;
//led燈io口的位址,也就是剛剛我們在上面的晶元手冊看到的address
#define gpm4com 0x110002e0
//定義配置模式的指標變數
volatile unsigned long *led_config = null ;
//定義配置狀態的指標變數
volatile unsigned long *led_dat = null ;
//定義蜂鳴器配置io的位址
#define gpd0con 0x114000a0
volatile unsigned long *bell_config = null ;
volatile unsigned long *bell_dat = null ;
//定義按鍵配置暫存器的位址
#define gpx3con 0x11000c60
volatile unsigned long *button_config = null ;
volatile unsigned long *button_dat = null ;
int major ;
unsigned char key_val ;
/* * 確定按鍵值
*/static irqreturn_t buttons_irq(int irq, void *dev_id)
//open方法
int key_open(struct inode *inode, struct file *filp)
return 0;
}//read方法
ssize_t key_read(struct file *file , char __user *buf ,size_t size ,loff_t *offset)
/* 如果沒有按鍵動作, 休眠 */
wait_event_interruptible(button_waitq, ev_press);
//將獲取到的值拷貝到使用者空間
copy_to_user(buf , &key_val , sizeof(key_val));
ev_press = 0;
//返回鍵值
return 1;
}//write方法
int led_write(struct file *filp , const char __user *buf , size_t count , loff_t *f_pos)
return 0;
}//close方法
int key_close(struct inode *inode, struct file *filp)
struct file_operations fops = ;
int test_init(void)
void test_exit(void)
module_init(test_init);
module_exit(test_exit);
module_license("gpl");
module_author("hai");
module_version("2017.4.30");
應用
#include #include #include #include #include #include #define dev_name "/dev/wait-dev"
void delay(void);
int main(int argc, char **argv)
while(1)
case 11:
case 13:
case 14:
default :
}} return 0;
}void delay(void)
makefile
kern_dir = /home/tools/linux-3.5
all:
make -c $(kern_dir) m=`pwd` modules
clean:
make -c $(kern_dir) m=`pwd` clean
rm -rf modules.order
obj-m += wait_driver.o
Linux裝置驅動,等待佇列
裝置驅動程式 include include include include include include include module license gpl define buf size 256 define device const char kgrunt struct kgrunt de...
linux驅動之等待佇列
linux驅動中,等待某種的事件發生的工作最好不要使用不斷迴圈來完成,而是採用另外一種方法,休眠與喚醒。等待佇列工作過程就是睡眠和喚醒的過程 睡眠和喚醒的過程的基本原理,當驅動程式等待事件發生時候進入休眠狀態,當該事件發生後,就會喚醒休眠狀態的驅動 使用 static declare wait qu...
Linux 裝置驅動 核心等待佇列
在 linux 驅動程式設計中,可以使用等待佇列來實現程序的阻塞.等待佇列可以看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列 當喚醒程序時,從等待佇列中取出程序.linux 2.6 核心提供了如下關於等待佇列的操作 wait queue head t my queue init waitque...