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