【0006】字符设备驱动之-定时器

 1 struct second_dev {
 2     struct cdev cdev;
 3     atomic_t counter;
 4     struct timer_list s_timer;
 5 };
 6 
 7 static struct second_dev *second_devp;
 8 
 9 
10 #define SECOND_MAJOR 248
11 static int second_major = SECOND_MAJOR;
12 module_param(second_major,int,S_IRUGO);
13 
14 
15 static second_setup_cdev()
16 {
17 
18 }
19 
20 
21 static int __init second_init(void)
22 {
23     int ret;
24     dev_t devno = MKDEV(second_major,0);
25     
26     if (second_major)
27         ret = register_chrdev_region(devno,1,"second");
28     else{
29         ret = alloc_chrdev_region(&devno,0,1,"second");
30         secon_major = MAJOR(devno);
31     }
32     
33     if (ret < 0)
34         return ret;
35         
36     second_devp = kazlloc(sizeof(*secon_devp),GFP_KERNEL);
37     if (!secon_devp){
38         ret = -ENOMEM;
39         goto fail_malloc;
40     }
41     
42     second_setup_cdev(second_devp,0);
43     
44     return 0;
45 fail_malloc:    
46     unregister_chrdev_region(devno,1);
47     return ret;
48 }
49 
50 
51 static void __exit second_exit(void)
52 {
53     cdev_del(&second_devp->cdev);
54     kfree(second_devp);
55     unregister_chrdev_region(MKDEV(second_major,0),1);
56     
57 
58 }
59 module_init(second_init);
60 module_exit(second_exit);

 

posted @ 2017-04-28 17:38  OzTaking  阅读(183)  评论(0)    收藏  举报