Linux流水灯驱动程序,Linux下控制GPIO实现LED流水灯(DM8168)

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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值