dev_touch.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-05-20 tyustli the first version
  9. */
  10. #ifndef __DEV_TOUCH_H__
  11. #define __DEV_TOUCH_H__
  12. #include <rtthread.h>
  13. #include "dev_pin.h"
  14. /**
  15. * @addtogroup Drivers RTTHREAD Driver
  16. * @defgroup Touch Touch
  17. *
  18. * @brief Touch driver api
  19. *
  20. * <b>Example</b>
  21. * @code {.c}
  22. * #include <rtthread.h>
  23. * #include "rtdevice.h"
  24. *
  25. * static rt_thread_t gt9147_thread = RT_NULL;
  26. * static rt_sem_t gt9147_sem = RT_NULL;
  27. * static rt_device_t dev = RT_NULL;
  28. * static struct rt_touch_data *read_data;
  29. *
  30. * // 读取数据线程入口函数
  31. * static void gt9147_entry(void *parameter)
  32. * {
  33. * struct rt_touch_data *read_data;
  34. * read_data = (struct rt_touch_data *)rt_malloc(sizeof(struct rt_touch_data) * 5);
  35. *
  36. * while (1)
  37. * {
  38. * // 请求信号量
  39. * rt_sem_take(gt9147_sem, RT_WAITING_FOREVER);
  40. * // 读取五个点的触摸信息
  41. * if (rt_device_read(dev, 0, read_data, 5) == 5)
  42. * {
  43. * for (rt_uint8_t i = 0; i < 5; i++)
  44. * {
  45. * if (read_data[i].event == RT_TOUCH_EVENT_DOWN || read_data[i].event == RT_TOUCH_EVENT_MOVE)
  46. * {
  47. * rt_kprintf("%d %d %d %d %d\n",
  48. * read_data[i].track_id,
  49. * read_data[i].x_coordinate,
  50. * read_data[i].y_coordinate,
  51. * read_data[i].timestamp,
  52. * read_data[i].width);
  53. * }
  54. * }
  55. * }
  56. * // 打开中断
  57. * rt_device_control(dev, RT_TOUCH_CTRL_ENABLE_INT, RT_NULL);
  58. * }
  59. * }
  60. *
  61. * // 接收回调函数
  62. * static rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
  63. * {
  64. * // 关闭中断
  65. * rt_device_control(dev, RT_TOUCH_CTRL_DISABLE_INT, RT_NULL);
  66. * // 释放信号量
  67. * rt_sem_release(gt9147_sem);
  68. * return 0;
  69. * }
  70. *
  71. * static int gt9147_sample(void)
  72. * {
  73. * // 查找 Touch 设备
  74. * dev = rt_device_find("touch");
  75. *
  76. * if (dev == RT_NULL)
  77. * {
  78. * rt_kprintf("can't find device:%s\n", "touch");
  79. * return -1;
  80. * }
  81. * // 以中断的方式打开设备
  82. * if (rt_device_open(dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK)
  83. * {
  84. * rt_kprintf("open device failed!");
  85. * return -1;
  86. * }
  87. * // 设置接收回调
  88. * rt_device_set_rx_indicate(dev, rx_callback);
  89. * // 创建信号量
  90. * gt9147_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);
  91. *
  92. * if (gt9147_sem == RT_NULL)
  93. * {
  94. * rt_kprintf("create dynamic semaphore failed.\n");
  95. * return -1;
  96. * }
  97. * // 创建读取数据线程
  98. * gt9147_thread = rt_thread_create("thread1",
  99. * gt9147_entry,
  100. * RT_NULL,
  101. * THREAD_STACK_SIZE,
  102. * THREAD_PRIORITY,
  103. * THREAD_TIMESLICE);
  104. * // 启动线程
  105. * if (gt9147_thread != RT_NULL)
  106. * rt_thread_startup(gt9147_thread);
  107. *
  108. * return 0;
  109. * }
  110. * MSH_CMD_EXPORT(gt9147_sample, gt9147 sample);
  111. * @endcode
  112. *
  113. * @ingroup Drivers
  114. */
  115. /*!
  116. * @addtogroup Touch
  117. * @{
  118. */
  119. #ifdef __cplusplus
  120. extern "C" {
  121. #endif
  122. #ifdef RT_USING_RTC
  123. #define rt_touch_get_ts() time(RT_NULL) /* API for the touch to get the timestamp */
  124. #else
  125. #define rt_touch_get_ts() rt_tick_get() /* API for the touch to get the timestamp */
  126. #endif
  127. /* Touch vendor types */
  128. #define RT_TOUCH_VENDOR_UNKNOWN (0) /* unknown */
  129. #define RT_TOUCH_VENDOR_GT (1) /* GTxx series */
  130. #define RT_TOUCH_VENDOR_FT (2) /* FTxx series */
  131. /* Touch ic type*/
  132. #define RT_TOUCH_TYPE_NONE (0) /* touch ic none */
  133. #define RT_TOUCH_TYPE_CAPACITANCE (1) /* capacitance ic */
  134. #define RT_TOUCH_TYPE_RESISTANCE (2) /* resistance ic */
  135. /* Touch control cmd types */
  136. #define RT_TOUCH_CTRL_GET_ID (RT_DEVICE_CTRL_BASE(Touch) + 0) /* Get device id */
  137. #define RT_TOUCH_CTRL_GET_INFO (RT_DEVICE_CTRL_BASE(Touch) + 1) /* Get touch info */
  138. #define RT_TOUCH_CTRL_SET_MODE (RT_DEVICE_CTRL_BASE(Touch) + 2) /* Set touch's work mode. ex. RT_TOUCH_MODE_POLLING,RT_TOUCH_MODE_INT */
  139. #define RT_TOUCH_CTRL_SET_X_RANGE (RT_DEVICE_CTRL_BASE(Touch) + 3) /* Set x coordinate range */
  140. #define RT_TOUCH_CTRL_SET_Y_RANGE (RT_DEVICE_CTRL_BASE(Touch) + 4) /* Set y coordinate range */
  141. #define RT_TOUCH_CTRL_SET_X_TO_Y (RT_DEVICE_CTRL_BASE(Touch) + 5) /* Set X Y coordinate exchange */
  142. #define RT_TOUCH_CTRL_DISABLE_INT (RT_DEVICE_CTRL_BASE(Touch) + 6) /* Disable interrupt */
  143. #define RT_TOUCH_CTRL_ENABLE_INT (RT_DEVICE_CTRL_BASE(Touch) + 7) /* Enable interrupt */
  144. #define RT_TOUCH_CTRL_POWER_ON (RT_DEVICE_CTRL_BASE(Touch) + 8) /* Touch Power On */
  145. #define RT_TOUCH_CTRL_POWER_OFF (RT_DEVICE_CTRL_BASE(Touch) + 9) /* Touch Power Off */
  146. #define RT_TOUCH_CTRL_GET_STATUS (RT_DEVICE_CTRL_BASE(Touch) + 10) /* Get Touch Power Status */
  147. /* Touch event */
  148. #define RT_TOUCH_EVENT_NONE (0) /* Touch none */
  149. #define RT_TOUCH_EVENT_UP (1) /* Touch up event */
  150. #define RT_TOUCH_EVENT_DOWN (2) /* Touch down event */
  151. #define RT_TOUCH_EVENT_MOVE (3) /* Touch move event */
  152. /**
  153. * @brief Touch information
  154. */
  155. struct rt_touch_info
  156. {
  157. rt_uint8_t type; /* The touch type */
  158. rt_uint8_t vendor; /* Vendor of touchs */
  159. rt_uint8_t point_num; /* Support point num */
  160. rt_int32_t range_x; /* X coordinate range */
  161. rt_int32_t range_y; /* Y coordinate range */
  162. };
  163. /**
  164. * @brief Touch configuration
  165. */
  166. struct rt_touch_config
  167. {
  168. #ifdef RT_TOUCH_PIN_IRQ
  169. struct rt_device_pin_mode irq_pin; /* Interrupt pin, The purpose of this pin is to notification read data */
  170. #endif
  171. char *dev_name; /* The name of the communication device */
  172. void *user_data;
  173. };
  174. typedef struct rt_touch_device *rt_touch_t;
  175. /**
  176. * @brief Touch device
  177. */
  178. struct rt_touch_device
  179. {
  180. struct rt_device parent; /* The standard device */
  181. struct rt_touch_info info; /* The touch info data */
  182. struct rt_touch_config config; /* The touch config data */
  183. const struct rt_touch_ops *ops; /* The touch ops */
  184. rt_err_t (*irq_handle)(rt_touch_t touch); /* Called when an interrupt is generated, registered by the driver */
  185. };
  186. /**
  187. * @brief Touch data
  188. */
  189. struct rt_touch_data
  190. {
  191. rt_uint8_t event; /* The touch event of the data */
  192. rt_uint8_t track_id; /* Track id of point */
  193. rt_uint8_t width; /* Point of width */
  194. rt_uint16_t x_coordinate; /* Point of x coordinate */
  195. rt_uint16_t y_coordinate; /* Point of y coordinate */
  196. rt_tick_t timestamp; /* The timestamp when the data was received */
  197. };
  198. /**
  199. * @brief Touch device operations
  200. */
  201. struct rt_touch_ops
  202. {
  203. rt_size_t (*touch_readpoint)(struct rt_touch_device *touch, void *buf, rt_size_t touch_num);
  204. rt_err_t (*touch_control)(struct rt_touch_device *touch, int cmd, void *arg);
  205. };
  206. /**
  207. * @brief register a touch device
  208. * @param touch the touch device
  209. * @param name the name of touch device
  210. * @param flag the flag of touch device
  211. * @param data the user data of touch device
  212. * @return rt_err_t error code
  213. */
  214. int rt_hw_touch_register(rt_touch_t touch,
  215. const char *name,
  216. rt_uint32_t flag,
  217. void *data);
  218. /**
  219. * @brief Touch irq handle
  220. * @param touch the touch device
  221. *
  222. * @note If you doesn't use pin device. you must call this function in your touch irq callback
  223. */
  224. void rt_hw_touch_isr(rt_touch_t touch);
  225. #ifdef __cplusplus
  226. }
  227. #endif
  228. /*! @}*/
  229. #endif /* __DEV_TOUCH_H__ */