4412驅動 等待佇列

2021-07-31 11:44:00 字數 2961 閱讀 4466

定義等待佇列:

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...