1 #include <linux/miscdevice.h>
2 #include <linux/delay.h>
3 #include <asm/irq.h>
4 #include <mach/regs-gpio.h>
5 #include <mach/hardware.h>
6 #include <linux/kernel.h>
7 #include <linux/module.h>
8 #include <linux/init.h>
9 #include <linux/mm.h>
10 #include <linux/fs.h>
11 #include <linux/types.h>
12 #include <linux/delay.h>
13 #include <linux/moduleparam.h>
14 #include <linux/slab.h>
15 #include <linux/errno.h>
16 #include <linux/ioctl.h>
17 #include <linux/cdev.h>
18 #include <linux/string.h>
19 #include <linux/list.h>
20 #include <linux/pci.h>
21 #include <linux/gpio.h>
22 #include <asm/uaccess.h>
23 #include <asm/atomic.h>
24 #include <asm/unistd.h>
25
26 /*定义设备名*/
27 #define DEVICE_NAME "leds"
28
29 /*定义led的引脚号*/
30 static unsigned long led_table [] = {
31 S3C2410_GPB(5),
32 S3C2410_GPB(6),
33 S3C2410_GPB(7),
34 S3C2410_GPB(8),
35 };
36 /*定义引脚配置的数组*/
37 static unsigned int led_cfg_table [] = {
38 S3C2410_GPIO_OUTPUT,
39 S3C2410_GPIO_OUTPUT,
40 S3C2410_GPIO_OUTPUT,
41 S3C2410_GPIO_OUTPUT,
42 };
43 /*对应应用层的ioctl操作*/
44 static int sbc2440_leds_ioctl(
45 struct inode *inode,
46 struct file *file,
47 unsigned int cmd,
48 unsigned long arg)
49 {
50 /*解析cmd*/
51 switch(cmd) {
52 case 0:
53 case 1:
54 if (arg > 4) {
55 return -EINVAL;/*返回非法参数错误*/
56 }
57 s3c2410_gpio_setpin(led_table[arg], !cmd);/*设置相应引脚电平*/
58 return 0;
59 default:
60 return -EINVAL;
61 }
62 }
63
64 /*文件操作*/
65 static struct file_operations dev_fops = {
66 .owner = THIS_MODULE,
67 .ioctl = sbc2440_leds_ioctl,
68 };
69
70 static struct miscdevice misc = {
71 .minor = MISC_DYNAMIC_MINOR,/*在linux/miscdevice.h 中定义,值为255,在 misc_register()中再动态分配一个minor */
72 .name = DEVICE_NAME,
73 .fops = &dev_fops,
74 };
75
76 static int __init dev_init(void) //模块初始化函数
77 {
78 int ret;
79
80 int i;
81
82 /*把四个led对应的引脚初始化置为输出,且输出為低电平,灯亮*/
83 for (i = 0; i < 4; i++) {
84 s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);//配置引脚模式
85 s3c2410_gpio_setpin(led_table[i], 0);//设置引脚电平
86 }
87
88 /*注册特殊设备,可自动生成设备节点;此处应该加个错误处理吧。。*/
89 ret = misc_register(&misc);
90
91 printk (DEVICE_NAME"\tinitialized\n");
92
93 return ret;
94 }
95
96 static void __exit dev_exit(void)
97 {
98 /*注销设备*/
99 misc_deregister(&misc);
100 }
101
102 module_init(dev_init);
103 module_exit(dev_exit);
104 MODULE_LICENSE("GPL");
105 MODULE_AUTHOR("FriendlyARM Inc.");
|