第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2025/5/24 3:01:56 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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(\

搜索更多关于: Linux内核红外遥控子系统-LIRC 的文档
Linux内核红外遥控子系统-LIRC.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6zw1c28jl36h1tx45fds_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top