韦东山驱动视频笔记——1.字符设备驱动程序之查询方式的按键驱动程序

linux内核版本:linux-2.6.30.4

目的:当有按键按下时,在终端输出信息

 1 #include <linux/module.h> 
 2 #include <linux/kernel.h>  
 3 #include <linux/fs.h>  
 4 #include <linux/init.h>  
 5 #include <linux/delay.h>  
 6 #include <asm/uaccess.h>  
 7 #include <asm/irq.h>  
 8 #include <asm/io.h>  
 9 #include <linux/device.h>  
10 
11 static struct class *second_drv_class;  
12 static struct class_device  *second_drv_class_dev;  
13   
14 static volatile unsigned long *gpfcon;  
15 static volatile unsigned long *gpfdat;  
16 static int major;  
17   
18 static int second_drv_open(struct inode *inode, struct file *file)  
19 {  
20     *gpfcon &= ~((0x3<<0)| (0x3<<2) | (0x3<<4) | (0x3<<8));  
21     return 0;  
22 }  
23   
24   
25 static ssize_t second_drv_read(struct file *file, char __user *buf,  
26             size_t count, loff_t *ppos)  
27 {  
28     int ret;  
29     unsigned char key_vals[4];  
30   
31     if (count != sizeof(key_vals))  
32         return -EINVAL;  
33   
34     /*k1,k2,k3,k4------gpf1,gpf4,gpf2,gpf0,按下为1*/  
35     ret = *gpfdat;  
36     key_vals[0] = (ret & (1<<1)) ? 0 : 1;//k1  
37     key_vals[1] = (ret & (1<<4)) ? 0 : 1;//k2  
38     key_vals[2] = (ret & (1<<2)) ? 0 : 1;//k3  
39     key_vals[3] = (ret & (1<<0)) ? 0 : 1;//k4  
40   
41     copy_to_user(buf, key_vals, sizeof(key_vals));  
42       
43     return sizeof(key_vals);  
44 }  
45   
46   
47 static struct file_operations second_fops = {  
48     .owner = THIS_MODULE,  
49     .open = second_drv_open,  
50     .read = second_drv_read,  
51 };  
52   
53 static int second_init()  
54 {  
55     int ret;  
56     major = register_chrdev(0, "second_drv", &second_fops);  
57     second_drv_class = class_create(THIS_MODULE, "second_drv");  
58     device_create(second_drv_class, NULL, MKDEV(major, 0), NULL, "buttons");  
59   
60     gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);  
61     gpfdat = gpfcon + 1;  
62       
63     return 0;  
64 }  
65 static void second_exit()  
66 {  
67     unregister_chrdev(major, "second_drv");  
68     device_destroy(second_drv_class, MKDEV(major, 0));  
69     class_destroy(second_drv_class);  
70     iounmap(gpfcon);  
71 }  
72   
73 module_init(second_init);  
74 module_exit(second_exit);  
75   
76 MODULE_LICENSE("GPL");

测试例子:

 1 #include <sys/types.h>  
 2 #include <sys/stat.h>  
 3 #include <fcntl.h>  
 4 #include <stdio.h>  
 5   
 6 /* seconddrvtest  
 7   */  
 8 int main(int argc, char **argv)  
 9 {  
10     int fd;  
11     unsigned char key_vals[4];  
12     int cnt = 0;  
13       
14     fd = open("/dev/buttons", O_RDWR);  
15     if (fd < 0)  
16     {  
17         printf("can't open!\n");  
18     }  
19   
20     while (1)  
21     {  
22         read(fd, key_vals, sizeof(key_vals));  
23         if (key_vals[0] || key_vals[1] || key_vals[2] || key_vals[3])  
24         {  
25             printf("%04d key pressed: %d %d %d %d\n", cnt++, key_vals[0], key_vals[1], key_vals[2], key_vals[3]);  
26         }  
27     }  
28       
29     return 0;  
30 }  

 

 

posted @ 2013-08-08 11:12  linux_rookie  阅读(696)  评论(0编辑  收藏  举报