1 /*
2 * fileName: led_gpio.c3 * just for LED GPIO test4 * GP1_14 -> HDD5 * GP1_15 -> REC6 * GP1_27 -> NC7 * GP1_28 -> IR8 */
9
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 #include
20 #include
21 #include
22 #include
23 #include
24 #include
25 #include
26 #include
27 #include
28 #include
29
30 #define DRIVERNAME "led4"
31
32 #define CTRL_MODULE_BASE_ADDR 0x48140000
33
34 //PANEL CON
35 #define conf_gpio46 (CTRL_MODULE_BASE_ADDR + 0x0B04)
36 #define conf_gpio47 (CTRL_MODULE_BASE_ADDR + 0x0B08)
37 #define conf_gpio59 (CTRL_MODULE_BASE_ADDR + 0x0AB8)
38 #define conf_gpio60 (CTRL_MODULE_BASE_ADDR + 0x0ABC)
39
40 #define WR_MEM_32(addr, data) *(unsigned int*)OMAP2_L4_IO_ADDRESS(addr) = (unsigned int)(data)
41 #define RD_MEM_32(addr) *(unsigned int*)OMAP2_L4_IO_ADDRESS(addr)
42
43 staticdev_t dev;44 static structcdev cdev;45 static struct class *led_gpio_class =NULL;46 static int gpio[4];47
48 static int led_gpio_open(struct inode *inode, struct file *file);49 static int led_gpio_close(struct inode *inode, struct file *file);50 static long led_gpio_ioctl(struct file *file, unsigned int val, unsigned longpin);51 //static int valid_check(unsigned int gpioNum);
52
53 //54 /*-55 static int valid_check(unsigned int gpioNum)56 {57 if((gpioNum==46)||(gpioNum==47)||(gpioNum==59)||(gpioNum==60))58 return 1;59 return -1;60 }61 -*/
62
63 static void store_gpio_pin(void)64 {65 //store gpio pinmux
66 gpio[0] =RD_MEM_32(conf_gpio46);67 gpio[1] =RD_MEM_32(conf_gpio47);68 gpio[2] =RD_MEM_32(conf_gpio59);69 gpio[3] =RD_MEM_32(conf_gpio60);70 }71
72 static void recover_gpio_pin(void)73 {74 //recover gpio pinmux
75 WR_MEM_32(conf_gpio46, gpio[0]);76 WR_MEM_32(conf_gpio47, gpio[1]);77 WR_MEM_32(conf_gpio59, gpio[2]);78 WR_MEM_32(conf_gpio60, gpio[3]);79 gpio_free(gpio[0]);80 gpio_free(gpio[1]);81 gpio_free(gpio[2]);82 gpio_free(gpio[3]);83 }84
85 static void config_gpio_pin(void)86 {87 WR_MEM_32(conf_gpio46, 2);88 gpio_request(46, "gpio46_en"); //request gpio46
89 gpio_direction_output(46, 0);90
91 WR_MEM_32(conf_gpio47, 2);92 gpio_request(47, "gpio47_en"); //request gpio47
93 gpio_direction_output(47, 0);94
95 WR_MEM_32(conf_gpio59, 1);96 gpio_request(59, "gpio59_en"); //request gpio59
97 gpio_direction_output(59, 0);98
99 WR_MEM_32(conf_gpio60, 1);100 gpio_request(60, "gpio60_en"); //request gpio60
101 gpio_direction_output(60, 0);102 }103
104 static int led_gpio_open(struct inode *inode, struct file *file)105 {106 //store gpio pin value
107 store_gpio_pin();108 //configure all used gpio
109 config_gpio_pin();110 return 0;111 }112
113 static int led_gpio_close(struct inode *inode, struct file *file)114 {115 //recover gpio pin mux;
116 recover_gpio_pin();117 return 0;118 }119
120 static long led_gpio_ioctl(struct file *file, unsigned int val, unsigned longpin)121 {122 if(valid_check(pin) < 0){123 printk("GPIO:%d can‘t use!\n", (int)pin);124 return -1;125 }126 gpio_set_value(pin, val);127
128 return 0;129 }130
131
132
133 static struct file_operations led_gpio_fops =
134 {135 .owner =THIS_MODULE,136 .open =led_gpio_open,137 .release =led_gpio_close,138 .unlocked_ioctl =led_gpio_ioctl,139 };140
141 static int __init LED_init(void)142 {143 intresult;144
145 result = alloc_chrdev_region(&dev, 0, 1, DRIVERNAME);146 if(result < 0){147 printk("Error registering led_gpio character device\n");148 return -ENODEV;149 }150 printk(KERN_INFO "led_gpio major#: %d, minor#: %d\n", MAJOR(dev), MINOR(dev));151
152 cdev_init(&cdev, &led_gpio_fops);153 cdev.owner =THIS_MODULE;154 cdev.ops = &led_gpio_fops;155
156 result = cdev_add(&cdev, dev, 1);157 if(result){158 unregister_chrdev_region(dev, 1);159 printk("Error adding led_gpio.. error no:%d\n",result);160 return -EINVAL;161 }162 led_gpio_class =class_create(THIS_MODULE, DRIVERNAME);163 device_create(led_gpio_class, NULL, dev, NULL, DRIVERNAME);164
165 printk(DRIVERNAME "initialized");166
167 return 0;168 }169
170 static void __exit LED_exit(void)171 {172 printk("led chrdev exit!\n");173 cdev_del(&cdev);174 unregister_chrdev_region(dev, 1);175 device_destroy(led_gpio_class, dev);176 class_destroy(led_gpio_class);177 }178
179 module_init(LED_init);180 module_exit(LED_exit);181 MODULE_LICENSE("GPL");