button-e3x0.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. struct e3x0_button
  14. {
  15. struct rt_input_device parent;
  16. int press_irq, release_irq;
  17. };
  18. static void e3x0_button_press_isr(int irqno, void *param)
  19. {
  20. struct e3x0_button *btn = param;
  21. rt_input_report_key(&btn->parent, KEY_POWER, 1);
  22. rt_input_sync(&btn->parent);
  23. }
  24. static void e3x0_button_release_isr(int irqno, void *param)
  25. {
  26. struct e3x0_button *btn = param;
  27. rt_input_report_key(&btn->parent, KEY_POWER, 0);
  28. rt_input_sync(&btn->parent);
  29. }
  30. static rt_err_t e3x0_button_probe(struct rt_platform_device *pdev)
  31. {
  32. rt_err_t err;
  33. struct rt_device *dev = &pdev->parent;
  34. struct e3x0_button *btn = rt_calloc(1, sizeof(*btn));
  35. if (!btn)
  36. {
  37. return -RT_ENOMEM;
  38. }
  39. if ((btn->press_irq = rt_dm_dev_get_irq_by_name(dev, "press")) < 0)
  40. {
  41. err = btn->press_irq;
  42. goto _fail;
  43. }
  44. if ((btn->release_irq = rt_dm_dev_get_irq_by_name(dev, "release")) < 0)
  45. {
  46. err = btn->release_irq;
  47. goto _fail;
  48. }
  49. rt_input_set_capability(&btn->parent, EV_KEY, KEY_POWER);
  50. if ((err = rt_input_device_register(&btn->parent)))
  51. {
  52. goto _fail;
  53. }
  54. dev->user_data = btn;
  55. rt_hw_interrupt_install(btn->press_irq, e3x0_button_press_isr, btn, "button-e3x0-press");
  56. rt_hw_interrupt_umask(btn->press_irq);
  57. rt_hw_interrupt_install(btn->release_irq, e3x0_button_release_isr, btn, "button-e3x0-release");
  58. rt_hw_interrupt_umask(btn->release_irq);
  59. return RT_EOK;
  60. _fail:
  61. rt_free(btn);
  62. return err;
  63. }
  64. static rt_err_t e3x0_button_remove(struct rt_platform_device *pdev)
  65. {
  66. struct e3x0_button *btn = pdev->parent.user_data;
  67. rt_hw_interrupt_mask(btn->press_irq);
  68. rt_pic_detach_irq(btn->press_irq, btn);
  69. rt_hw_interrupt_mask(btn->release_irq);
  70. rt_pic_detach_irq(btn->release_irq, btn);
  71. rt_input_device_unregister(&btn->parent);
  72. rt_free(btn);
  73. return RT_EOK;
  74. }
  75. static const struct rt_ofw_node_id e3x0_button_ofw_ids[] =
  76. {
  77. { .compatible = "ettus,e3x0-button" },
  78. { /* sentinel */ }
  79. };
  80. static struct rt_platform_driver e3x0_button_driver =
  81. {
  82. .name = "e3x0-button",
  83. .ids = e3x0_button_ofw_ids,
  84. .probe = e3x0_button_probe,
  85. .remove = e3x0_button_remove,
  86. };
  87. RT_PLATFORM_DRIVER_EXPORT(e3x0_button_driver);