分类: 嵌入式
2015-05-25 20:18:45
second_drv 查询方式 按键驱动程序
15年4月4月27月27日27日日22:07:06
(1)先写出来框架:
*********************************************************************
1
#include
2
#include
3
#include
4
#include
5
#include
6
#include
7
#include
8
#include
9
#include
10
#include
11
12 static struct class *second_drv_class;
13 static struct class_device *second_drv_class_dev;
14
15 static int second_drv_open(struct inode *inode, struct file *file){
16 return 0;
17 }
18
19 static ssize_t second_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos){
20 return 0;
21 }
22
23 ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){
24
25 return 0;
26 }
27
28 static struct file_operations second_drv_fops = {
29 .owner = THIS_MODULE,
30 .open = second_drv_open,
31 .write = second_drv_write,
32 .read = second_drv_read,
33 };
34
35 int major;
36 static int __init second_drv_init(void){
37 major = register_chrdev(0, "second_drv", &second_drv_fops);
38
39 second_drv_class = class_create(THIS_MODULE, "second_drv");
40 second_drv_class_dev = class_device_create(second_drv_class, NULL, MKDEV(major, 0), NULL, "buttons"); //创建类和类里面的元素。
41
42 return 0;
43 }
44
45 static void __exit second_drv_exit(void){
46 unregister_chrdev(major, "second_drv");
47
48 class_device_unregister(second_drv_class_dev);
49 class_destroy(second_drv_class); //在出口函数里面注销类。
50
51 return 0;
52 }
53
54
55
56 module_init(second_drv_init);
57 module_exit(second_drv_exit);
58
59 MODULE_LICENSE("GPL");
********************************************************************
写驱动的时候,先写出来框架,然后编译以后,试试看看能用不,如果没问题的话,再继续往下做,如果等驱动写完以后再编译,如果出问题的话,就不能确定是哪的问题,不好调试。
(2)写一个驱动
**********************************************************************
1
#include
2
#include
3
#include
4
#include
5
#include
6
#include
7
#include
8
#include
9
#include
10
#include
11
12 static struct class *second_drv_class;
13 static struct class_device *second_drv_class_dev;
14
15 volatile unsigned long *gpfcon;
16 volatile unsigned long *gpfdat;
17
18 volatile unsigned long *gpgcon;
19 volatile unsigned long *gpgdat;
20
21 static int second_drv_open(struct inode *inode, struct file *file){
22
23 *gpfcon &= ~((0x3 << (0*2)) | (0x3 << (2*2)));
24 *gpgcon &= ~((0x3 << (3*2)) | (0x3 << (11*2))); //配置引脚。
25 return 0;
26 }
27
28 static ssize_t second_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos){
29 return 0;
30 }
31
32 ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos){
33 unsigned char key_val[4];
34 int regval;
35
36 if(size != sizeof(key_val))
37 return -EINVAL;
38
39 regval = *gpfdat;
40 key_val[0] = (regval & (1 << 0)) ? 1: 0;
41 key_val[1] = (regval & (1 << 2)) ? 1: 0;
42
43 regval = *gpgdat;
44 key_val[2] = (regval & (1 << 3)) ? 1: 0;
45 key_val[3] = (regval & (1 << 11)) ? 1: 0;
46
47 copy_to_user(buf, key_val, sizeof(key_val));
48
49 return sizeof(key_val);
50 }
51
52 static struct file_operations second_drv_fops = {
53 .owner = THIS_MODULE,
54 .open = second_drv_open,
55 .write = second_drv_write,
56 .read = second_drv_read,
57 };
58
59 int major;
60 static int __init second_drv_init(void){
61 major = register_chrdev(0, "second_drv", &second_drv_fops);
62
63 second_drv_class = class_create(THIS_MODULE, "second_drv");
64 second_drv_class_dev = class_device_create(second_drv_class, NULL, MKDEV(major, 0), NULL, "buttons");
65
66 gpfcon = (unsigned long *)ioremap(0x56000050, 16);
67 gpfdat = gpfcon + 1;
68
69 gpgcon = (unsigned long *)ioremap(0x56000060, 16);
70 gpgdat = gpgcon + 1;
71 return 0;
72 }
73
74 static void __exit second_drv_exit(void){
75 unregister_chrdev(major, "second_drv");
76
77 class_device_unregister(second_drv_class_dev);
78 class_destroy(second_drv_class);
79
80 return 0;
81 }
82
83
84
85 module_init(second_drv_init);
86 module_exit(second_drv_exit);
87
88 MODULE_LICENSE("GPL");
**********************************************************************
测试程序为:
*******************************************************************
1
#include
2
#include
3
#include
4
#include
5
6 int main (int argc, char **argv){
7 int fd;
8 unsigned char key_val[4];
9 int cnt = 0;
10
11 fd = open("/dev/buttons",O_RDWR);
12
13 if (fd < 0)
14 printf("cannot open!\n");
15
16 while (1)
17 {
18 read(fd, key_val, sizeof(key_val));
19 if(!key_val[0] || !key_val[1] || !key_val[2] || !key_val[3])
20 {
21 printf("%04d key pressed: %d %d %d %d\n", cnt++, key_val[0], key_val[1], key_val[2], key_val[3]);
22 }
23 }
24 return 0;
25 }
*********************************************************************