logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

azoteq_iqs5xx.h (7523B)


  1. // Copyright 2023 Dasky (@daskygit)
  2. // Copyright 2023 George Norton (@george-norton)
  3. // SPDX-License-Identifier: GPL-2.0-or-later
  4. #pragma once
  5. #include "compiler_support.h"
  6. #include "i2c_master.h"
  7. #include "pointing_device.h"
  8. #include "util.h"
  9. typedef enum {
  10. AZOTEQ_IQS5XX_UNKNOWN,
  11. AZOTEQ_IQS550 = 40,
  12. AZOTEQ_IQS525 = 52,
  13. AZOTEQ_IQS572 = 58,
  14. } azoteq_iqs5xx_product_numbers_t;
  15. typedef enum {
  16. AZOTEQ_IQS5XX_ACTIVE,
  17. AZOTEQ_IQS5XX_IDLE_TOUCH,
  18. AZOTEQ_IQS5XX_IDLE,
  19. AZOTEQ_IQS5XX_LP1,
  20. AZOTEQ_IQS5XX_LP2,
  21. } azoteq_iqs5xx_charging_modes_t;
  22. typedef struct {
  23. uint8_t h : 8;
  24. uint8_t l : 8;
  25. } azoteq_iqs5xx_report_rate_t;
  26. typedef struct PACKED {
  27. bool single_tap : 1; // Single tap gesture status
  28. bool press_and_hold : 1; // Press and hold gesture status
  29. bool swipe_x_neg : 1; // Swipe in negative X direction status
  30. bool swipe_x_pos : 1; // Swipe in positive X direction status
  31. bool swipe_y_pos : 1; // Swipe in positive Y direction status
  32. bool swipe_y_neg : 1; // Swipe in negative Y direction status
  33. uint8_t _unused : 2; // unused
  34. } azoteq_iqs5xx_gesture_events_0_t;
  35. typedef struct PACKED {
  36. bool two_finger_tap : 1; // Two finger tap gesture status
  37. bool scroll : 1; // Scroll status
  38. bool zoom : 1; // Zoom gesture status
  39. uint8_t _unused : 5; // unused
  40. } azoteq_iqs5xx_gesture_events_1_t;
  41. typedef struct PACKED {
  42. azoteq_iqs5xx_charging_modes_t charging_mode : 3; // Indicates current mode
  43. bool ati_error : 1; //
  44. bool reati_occurred : 1; //
  45. bool alp_ati_error : 1; //
  46. bool alp_reati_occurred : 1; //
  47. bool show_reset : 1; //
  48. } azoteq_iqs5xx_system_info_0_t;
  49. typedef struct PACKED {
  50. bool tp_movement : 1; //
  51. bool palm_detect : 1; // Palm detect status
  52. bool too_many_fingers : 1; // Total finger status
  53. bool rr_missed : 1; // Report rate status
  54. bool snap_toggle : 1; // Change in any snap channel status
  55. bool switch_state : 1; // Status of input pin SW_IN
  56. uint8_t _unused : 2; // unused
  57. } azoteq_iqs5xx_system_info_1_t;
  58. typedef struct {
  59. uint8_t h : 8;
  60. uint8_t l : 8;
  61. } azoteq_iqs5xx_relative_xy_t;
  62. typedef struct {
  63. uint8_t previous_cycle_time;
  64. azoteq_iqs5xx_gesture_events_0_t gesture_events_0;
  65. azoteq_iqs5xx_gesture_events_1_t gesture_events_1;
  66. azoteq_iqs5xx_system_info_0_t system_info_0;
  67. azoteq_iqs5xx_system_info_1_t system_info_1;
  68. uint8_t number_of_fingers;
  69. azoteq_iqs5xx_relative_xy_t x;
  70. azoteq_iqs5xx_relative_xy_t y;
  71. } azoteq_iqs5xx_base_data_t;
  72. STATIC_ASSERT(sizeof(azoteq_iqs5xx_base_data_t) == 10, "azoteq_iqs5xx_basic_report_t should be 10 bytes");
  73. typedef struct {
  74. uint8_t number_of_fingers;
  75. azoteq_iqs5xx_relative_xy_t x;
  76. azoteq_iqs5xx_relative_xy_t y;
  77. } azoteq_iqs5xx_report_data_t;
  78. STATIC_ASSERT(sizeof(azoteq_iqs5xx_report_data_t) == 5, "azoteq_iqs5xx_report_data_t should be 5 bytes");
  79. typedef struct PACKED {
  80. bool sw_input : 1;
  81. bool sw_input_select : 1;
  82. bool reati : 1;
  83. bool alp_reati : 1;
  84. bool sw_input_event : 1;
  85. bool wdt : 1;
  86. bool setup_complete : 1;
  87. bool manual_control : 1;
  88. } azoteq_iqs5xx_system_config_0_t;
  89. typedef struct PACKED {
  90. bool event_mode : 1;
  91. bool gesture_event : 1;
  92. bool tp_event : 1;
  93. bool reati_event : 1;
  94. bool alp_prox_event : 1;
  95. bool snap_event : 1;
  96. bool touch_event : 1;
  97. bool prox_event : 1;
  98. } azoteq_iqs5xx_system_config_1_t;
  99. typedef struct PACKED {
  100. bool flip_x : 1;
  101. bool flip_y : 1;
  102. bool switch_xy_axis : 1;
  103. bool palm_reject : 1;
  104. uint8_t _unused : 4;
  105. } azoteq_iqs5xx_xy_config_0_t;
  106. typedef struct PACKED {
  107. bool suspend : 1;
  108. bool reset : 1;
  109. int8_t _unused : 6;
  110. } azoteq_iqs5xx_system_control_1_t;
  111. typedef struct PACKED {
  112. bool single_tap : 1;
  113. bool press_and_hold : 1;
  114. bool swipe_x_minus : 1;
  115. bool swipe_x_plus : 1;
  116. bool swipe_y_plus : 1;
  117. bool swipe_y_minus : 1;
  118. int8_t _unused : 2;
  119. } azoteq_iqs5xx_single_finger_gesture_enable_t;
  120. typedef struct PACKED {
  121. bool two_finger_tap : 1;
  122. bool scroll : 1;
  123. bool zoom : 1;
  124. int8_t _unused : 5;
  125. } azoteq_iqs5xx_multi_finger_gesture_enable_t;
  126. typedef struct PACKED {
  127. azoteq_iqs5xx_single_finger_gesture_enable_t single_finger_gestures;
  128. azoteq_iqs5xx_multi_finger_gesture_enable_t multi_finger_gestures;
  129. uint16_t tap_time;
  130. uint16_t tap_distance;
  131. uint16_t hold_time;
  132. uint16_t swipe_initial_time;
  133. uint16_t swipe_initial_distance;
  134. uint16_t swipe_consecutive_time;
  135. uint16_t swipe_consecutive_distance;
  136. int8_t swipe_angle;
  137. uint16_t scroll_initial_distance;
  138. int8_t scroll_angle;
  139. uint16_t zoom_initial_distance;
  140. uint16_t zoom_consecutive_distance;
  141. } azoteq_iqs5xx_gesture_config_t;
  142. STATIC_ASSERT(sizeof(azoteq_iqs5xx_gesture_config_t) == 24, "azoteq_iqs5xx_gesture_config_t should be 24 bytes");
  143. typedef struct {
  144. uint16_t x_resolution;
  145. uint16_t y_resolution;
  146. } azoteq_iqs5xx_resolution_t;
  147. #define AZOTEQ_IQS5XX_COMBINE_H_L_BYTES(h, l) ((int16_t)(h << 8) | l)
  148. #define AZOTEQ_IQS5XX_SWAP_H_L_BYTES(b) ((uint16_t)((b & 0xff) << 8) | (b >> 8))
  149. #ifndef AZOTEQ_IQS5XX_REPORT_RATE
  150. # define AZOTEQ_IQS5XX_REPORT_RATE 10
  151. #endif
  152. #if !defined(POINTING_DEVICE_TASK_THROTTLE_MS) && !defined(POINTING_DEVICE_MOTION_PIN)
  153. // Polling the Azoteq isn't recommended, ensuring we only poll after the report is ready stops any unexpected NACKs
  154. # define POINTING_DEVICE_TASK_THROTTLE_MS AZOTEQ_IQS5XX_REPORT_RATE + 1
  155. #endif
  156. const pointing_device_driver_t azoteq_iqs5xx_pointing_device_driver;
  157. void azoteq_iqs5xx_init(void);
  158. i2c_status_t azoteq_iqs5xx_wake(void);
  159. report_mouse_t azoteq_iqs5xx_get_report(report_mouse_t mouse_report);
  160. i2c_status_t azoteq_iqs5xx_get_report_rate(azoteq_iqs5xx_report_rate_t *report_rate, azoteq_iqs5xx_charging_modes_t mode, bool end_session);
  161. i2c_status_t azoteq_iqs5xx_set_report_rate(uint16_t report_rate_ms, azoteq_iqs5xx_charging_modes_t mode, bool end_session);
  162. i2c_status_t azoteq_iqs5xx_set_event_mode(bool enabled, bool end_session);
  163. i2c_status_t azoteq_iqs5xx_set_reati(bool enabled, bool end_session);
  164. i2c_status_t azoteq_iqs5xx_set_gesture_config(bool end_session);
  165. i2c_status_t azoteq_iqs5xx_set_xy_config(bool flip_x, bool flip_y, bool switch_xy, bool palm_reject, bool end_session);
  166. i2c_status_t azoteq_iqs5xx_reset_suspend(bool reset, bool suspend, bool end_session);
  167. i2c_status_t azoteq_iqs5xx_get_base_data(azoteq_iqs5xx_base_data_t *base_data);
  168. void azoteq_iqs5xx_set_cpi(uint16_t cpi);
  169. uint16_t azoteq_iqs5xx_get_cpi(void);
  170. uint16_t azoteq_iqs5xx_get_product(void);
  171. void azoteq_iqs5xx_setup_resolution(void);