Linux内核红外遥控子系统-LIRC

发布时间 : 星期六 文章Linux内核红外遥控子系统-LIRC更新完毕开始阅读

3. 附 使用GPIO接收遥控命令驱动代码

#include #include #include #include #include #include #include #include #include #include #include #define GPIO_IRC_MAP RC_MAP_SONY_SIRC12_TV //#define DEBUG static struct input_dev *irc_input_dev; static struct timer_list irc_timer; static atomic_t f_restart; extern u64 gpt_get_cycles(void); extern unsigned long gpt_delta_to_ns(u64 delta); static void gpio_irc_raw_event_reset() { ir_raw_event_reset(irc_input_dev); atomic_set(&f_restart,1); } static void gpio_irc_timer_func(unsigned long data) { struct ir_raw_event ev; /* end pulse */ ev.pulse = false; ev.duration = ~0u; ir_raw_event_store(irc_input_dev,&ev); ir_raw_event_handle(irc_input_dev); gpio_irc_raw_event_reset(); #ifdef DEBUG printk(\#endif } static irqreturn_t gpio_irc_rx_irq(int irq, void *dev_id) { static bool triger_falling = 1; static unsigned long last; struct ir_raw_event ev; if (atomic_read(&f_restart)) { atomic_set(&f_restart,0); } else { ev.pulse = !triger_falling; ev.duration = gpt_delta_to_ns((unsigned long)gpt_get_cycles() - last); ir_raw_event_store(irc_input_dev,&ev); } last = (unsigned long)gpt_get_cycles(); if (triger_falling) set_irq_type(irq,IRQF_TRIGGER_RISING); else set_irq_type(irq,IRQF_TRIGGER_FALLING); triger_falling = !triger_falling; mod_timer(&irc_timer,jiffies + HZ/50); return IRQ_HANDLED; } static struct ir_dev_props gpio_irc_props = { .driver_type = RC_DRIVER_IR_RAW, .allowed_protos = IR_TYPE_SONY, }; static int gpio_irc_probe(struct platform_device *pdev) { int gpio,gpio_irq; int ret; gpio = pdev->resource[0].start; gpio_irq = gpio_to_irq(gpio); if (gpio_request(gpio,\ dev_err(&pdev->dev, \ return -1; } gpio_direction_input(gpio); setup_timer(&irc_timer,gpio_irc_timer_func,gpio_irq); irc_input_dev = input_allocate_device(); if (!irc_input_dev) { ret = -ENOMEM; goto err_input_allocate_device; } irc_input_dev->name = \ ret = ir_input_register(irc_input_dev, GPIO_IRC_MAP, &gpio_irc_props, NULL); if (ret) { pr_err(\ goto err_ir_input_register; } irc_input_dev->rep[REP_DELAY] = 400; irc_input_dev->rep[REP_PERIOD] = 33; gpio_irc_raw_event_reset(); ret = request_irq(gpio_irq,gpio_irc_rx_irq,0,\ if (ret) { dev_err(&pdev->dev,\ goto err_request_irq; } set_irq_type(gpio_irq,IRQF_TRIGGER_FALLING); return 0; err_request_irq: ir_input_unregister(irc_input_dev); err_ir_input_register: input_free_device(irc_input_dev); err_input_allocate_device: gpio_free(gpio); return ret; } static int gpio_irc_remove(struct platform_device *pdev) { int gpio,gpio_irq; del_timer_sync(&irc_timer); gpio = pdev->resource[0].start; gpio_irq = gpio_to_irq(gpio); free_irq(gpio_irq,NULL); gpio_free(gpio); ir_input_unregister(irc_input_dev); input_free_device(irc_input_dev); return 0; } static int gpio_irc_suspend(struct platform_device *pdev, pm_message_t state) { return 0; } static int gpio_irc_resume(struct platform_device *pdev) { return 0; } static struct platform_driver irc_driver = { .driver = { .name = \ }, .probe = gpio_irc_probe, .remove = gpio_irc_remove, .suspend = gpio_irc_suspend, .resume = gpio_irc_resume, }; static int gpio_irc_init(void) { return platform_driver_register(&irc_driver); } static void gpio_irc_exit(void) { platform_driver_unregister(&irc_driver); } late_initcall_sync(gpio_irc_init); module_exit(gpio_irc_exit); MODULE_LICENSE(\MODULE_DESCRIPTION(\

联系合同范文客服:xxxxx#qq.com(#替换为@)