主程序正常进行3个灯的流水,按下按键1让蜂鸣器响,按键2让马达震动,按键3风扇转。
#include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/timer.h> #include <linux/gpio.h> #include <linux/of_gpio.h> enum keys{ KEY1, KEY2, KEY3 }; enum bmf{ beepno, motorno, fanno }; struct device_node *node,*led_node; unsigned int irqno[3]; char *irq_name[] = {"key1-gpiof9","key2-gpiof7","key3-gpiof8"}; struct timer_list mytimer; int gpiono[3]; char *bmf_name[] = {"key_beep","key_motor","key_fan"}; char *led_name[] = {"led1","led2","led3"}; int led_no[3]; int bmf_no[3]; void timer_function(struct timer_list *list) { int i,status; for(i=0;i<ARRAY_SIZE(gpiono);i++){ status = gpio_get_value(gpiono[i]); if(!status){ gpio_set_value(bmf_no[i],!gpio_get_value(bmf_no[i])); } } } irqreturn_t key_irq_handle(int irq, void *dev) { mod_timer(&mytimer,jiffies+1); return IRQ_HANDLED; } static int __init mycdev_init(void) { int i,ret; mytimer.expires = jiffies+1; timer_setup(&mytimer,timer_function,0); add_timer(&mytimer); node = of_find_node_by_name(NULL,"myirq"); if(node == NULL){ printk("node find error\n"); return -EAGAIN; } for(i=0;i<ARRAY_SIZE(irqno);i++){ gpiono[i] = of_get_named_gpio(node,"key_gpio",i); if(gpiono[i] < 0){ printk("get gpio no error\n"); return gpiono[i]; } bmf_no[i] = of_get_named_gpio(node,bmf_name[i],0); if(bmf_no[i] < 0){ printk("get bmf_no error\n"); return bmf_no[i]; } if(gpio_request(bmf_no[i],NULL)<0){ printk("bmf request error\n"); return -EBUSY; } gpio_direction_output(bmf_no[i],0); irqno[i] = irq_of_parse_and_map(node,i); if(irqno[i] == 0){ printk("get virq error\n"); return -EAGAIN; } ret = request_irq(irqno[i],key_irq_handle,IRQF_TRIGGER_FALLING,irq_name[i],(void *)i); if(ret){ printk("request irq error\n"); return ret; } } led_node = of_find_node_by_path("/myleds"); if(led_node == NULL){ printk("find node leds error\n"); return -EAGAIN; } for(i=0;i<ARRAY_SIZE(led_name);i++){ led_no[i] = of_get_named_gpio(led_node,led_name[i],0); if(led_no[i] < 0){ printk("of get named gpio %d error\n",led_no[i]); return -EAGAIN; } if(gpio_request(led_no[i],NULL)<0){ printk("gpio request error\n"); return -EBUSY; } gpio_direction_output(led_no[i],1); } return 0; } static void __exit mycdev_exit(void) { int i; for(i=0;i<ARRAY_SIZE(irqno);i++){ free_irq(irqno[i],(void *)i); gpio_set_value(bmf_no[i],0); gpio_free(bmf_no[i]); } for(i=0;i<ARRAY_SIZE(led_name);i++){ gpio_set_value(led_no[i],0); gpio_free(led_no[i]); } del_timer(&mytimer); } module_init(mycdev_init); module_exit(mycdev_exit); MODULE_LICENSE("GPL");