input.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. #ifndef __INPUT_H__
  11. #define __INPUT_H__
  12. #include <rtthread.h>
  13. #include <bitmap.h>
  14. #include <drivers/dev_touch.h>
  15. #include <dt-bindings/input/event-codes.h>
  16. struct rt_input_poller;
  17. struct rt_input_absinfo;
  18. struct rt_input_event
  19. {
  20. rt_tick_t tick;
  21. rt_uint16_t type;
  22. rt_uint16_t code;
  23. rt_int32_t value;
  24. };
  25. struct rt_input_device
  26. {
  27. struct rt_device parent;
  28. RT_BITMAP_DECLARE(cap, EV_CNT);
  29. RT_BITMAP_DECLARE(key_map, KEY_CNT);
  30. RT_BITMAP_DECLARE(rel_map, REL_CNT);
  31. RT_BITMAP_DECLARE(abs_map, ABS_CNT);
  32. rt_list_t list;
  33. rt_list_t handler_nodes;
  34. struct rt_spinlock lock;
  35. rt_err_t (*trigger)(struct rt_input_device *idev,
  36. rt_uint16_t type, rt_uint16_t code, rt_int32_t value);
  37. struct rt_input_poller *poller;
  38. struct rt_input_absinfo *absinfo;
  39. #ifdef RT_INPUT_TOUCHSCREEN
  40. void *touch;
  41. #endif
  42. #ifdef RT_INPUT_UAPI
  43. void *uapi;
  44. #endif
  45. };
  46. struct rt_input_handler
  47. {
  48. rt_list_t list;
  49. struct rt_input_device *idev;
  50. rt_bool_t (*identify)(struct rt_input_handler *handler, struct rt_input_device *idev);
  51. rt_bool_t (*callback)(struct rt_input_handler *handler, struct rt_input_event *ev);
  52. void *priv;
  53. };
  54. struct rt_input_poller
  55. {
  56. #define RT_INPUT_POLL_INTERVAL_DEFAULT 17 /* 60fps */
  57. rt_uint32_t interval;
  58. struct rt_timer timer;
  59. void (*poll)(struct rt_input_device *idev);
  60. };
  61. struct rt_input_absinfo
  62. {
  63. rt_int32_t value;
  64. rt_int32_t minimum;
  65. rt_int32_t maximum;
  66. rt_int32_t fuzz;
  67. rt_int32_t flat;
  68. rt_int32_t resolution;
  69. };
  70. rt_err_t rt_input_device_register(struct rt_input_device *idev);
  71. rt_err_t rt_input_device_unregister(struct rt_input_device *idev);
  72. rt_err_t rt_input_set_capability(struct rt_input_device *idev,
  73. rt_uint16_t type, rt_uint16_t code);
  74. rt_err_t rt_input_set_absinfo(struct rt_input_device *idev, rt_uint32_t axis,
  75. rt_int32_t min, rt_int32_t max, rt_int32_t fuzz, rt_int32_t flat);
  76. rt_err_t rt_input_setup_touch(struct rt_input_device *idev,
  77. rt_uint32_t num_slots, struct rt_touch_info *info);
  78. rt_err_t rt_input_parse_touch_position(struct rt_input_device *idev,
  79. rt_uint32_t *out_x, rt_uint32_t *out_y);
  80. rt_err_t rt_input_setup_polling(struct rt_input_device *idev,
  81. void (*work)(struct rt_input_device *idev));
  82. rt_err_t rt_input_set_poll_interval(struct rt_input_device *idev,
  83. rt_uint32_t interval_ms);
  84. void rt_input_remove_config(struct rt_input_device *idev);
  85. rt_err_t rt_input_trigger(struct rt_input_device *idev,
  86. rt_uint16_t type, rt_uint16_t code, rt_int32_t value);
  87. void rt_input_event(struct rt_input_device *idev,
  88. rt_uint16_t type, rt_uint16_t code, rt_int32_t value);
  89. rt_inline void rt_input_report_key(struct rt_input_device *idev,
  90. rt_uint16_t code, rt_int32_t value)
  91. {
  92. rt_input_event(idev, EV_KEY, code, !!value);
  93. }
  94. rt_inline void rt_input_report_rel(struct rt_input_device *idev,
  95. rt_uint16_t code, rt_int32_t value)
  96. {
  97. rt_input_event(idev, EV_REL, code, value);
  98. }
  99. rt_inline void rt_input_report_abs(struct rt_input_device *idev,
  100. rt_uint16_t code, rt_int32_t value)
  101. {
  102. rt_input_event(idev, EV_ABS, code, value);
  103. }
  104. rt_inline void rt_input_report_touch_slot(struct rt_input_device *idev,
  105. rt_uint32_t slot)
  106. {
  107. rt_input_event(idev, EV_ABS, ABS_MT_SLOT, slot);
  108. }
  109. rt_bool_t rt_input_report_touch_inactive(struct rt_input_device *idev,
  110. rt_bool_t active);
  111. void rt_input_report_touch_position(struct rt_input_device *idev,
  112. rt_uint32_t x, rt_uint32_t y, rt_bool_t multitouch);
  113. rt_inline void rt_input_sync(struct rt_input_device *idev)
  114. {
  115. rt_input_event(idev, EV_SYN, SYN_REPORT, 0);
  116. }
  117. rt_err_t rt_input_add_handler(struct rt_input_handler *handler);
  118. rt_err_t rt_input_del_handler(struct rt_input_handler *handler);
  119. #endif /* __INPUT_H__ */