GCC Code Coverage Report


Directory: main/
File: adapter/mapping_quirks.c
Date: 2025-10-04 14:03:00
Exec Total Coverage
Lines: 36 202 17.8%
Functions: 3 16 18.8%
Branches: 17 32 53.1%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2021-2025, Jacques Gagnon
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6 #include <stdio.h>
7 #include <string.h>
8 #include "zephyr/types.h"
9 #include "tools/util.h"
10 #include "adapter.h"
11 #include "mapping_quirks.h"
12
13 static void face_btns_invert(struct raw_src_mapping *map) {
14 uint32_t tmp = map->btns_mask[PAD_RB_LEFT];
15
16 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_UP];
17 map->btns_mask[PAD_RB_UP] = tmp;
18
19 tmp = map->btns_mask[PAD_RB_DOWN];
20 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
21 map->btns_mask[PAD_RB_RIGHT] = tmp;
22 }
23
24 8 static void face_btns_rotate_right(struct raw_src_mapping *map) {
25 8 uint32_t tmp = map->btns_mask[PAD_RB_UP];
26
27 8 map->btns_mask[PAD_RB_UP] = map->btns_mask[PAD_RB_LEFT];
28 8 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_DOWN];
29 8 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
30 8 map->btns_mask[PAD_RB_RIGHT] = tmp;
31 8 }
32
33 static void face_btns_trigger_to_6buttons(struct raw_src_mapping *map) {
34 map->desc[0] = 0x200200FF;
35
36 map->btns_mask[PAD_LM] = map->btns_mask[PAD_RB_LEFT];
37 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_DOWN];
38 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
39 map->btns_mask[PAD_RB_RIGHT] = 0;
40
41 map->axes_idx[TRIG_RS] = map->axes_idx[TRIG_L];
42 map->axes_idx[TRIG_L] = -1;
43 memcpy(&map->meta[TRIG_RS], &map->meta[TRIG_L], sizeof(map->meta[0]));
44
45 map->axes_idx[BTN_RIGHT] = map->axes_idx[TRIG_R];
46 map->axes_idx[TRIG_R] = -1;
47 memcpy(&map->meta[BTN_RIGHT], &map->meta[TRIG_R], sizeof(map->meta[0]));
48 }
49
50 static void face_btns_trigger_to_8buttons(struct raw_src_mapping *map) {
51 map->desc[0] = 0x100200FF;
52
53 map->btns_mask[PAD_LM] = map->btns_mask[PAD_LS];
54 map->btns_mask[PAD_LS] = map->btns_mask[PAD_RB_LEFT];
55 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_DOWN];
56 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
57
58 map->btns_mask[PAD_RB_RIGHT] = 0;
59 map->axes_idx[BTN_RIGHT] = map->axes_idx[TRIG_R];
60 memcpy(&map->meta[BTN_RIGHT], &map->meta[TRIG_R], sizeof(map->meta[0]));
61
62 map->axes_idx[TRIG_R] = map->axes_idx[TRIG_L];
63 map->axes_idx[TRIG_L] = -1;
64 memcpy(&map->meta[TRIG_R], &map->meta[TRIG_L], sizeof(map->meta[0]));
65 }
66
67 10 static void trigger_pri_sec_invert(struct raw_src_mapping *map) {
68 10 uint32_t tmp = map->btns_mask[PAD_LM];
69
70 10 map->desc[0] &= ~0x11000000;
71
72 10 map->btns_mask[PAD_LM] = map->btns_mask[PAD_LS];
73 10 map->btns_mask[PAD_LS] = tmp;
74
75 10 tmp = map->btns_mask[PAD_RM];
76 10 map->btns_mask[PAD_RM] = map->btns_mask[PAD_RS];
77 10 map->btns_mask[PAD_RS] = tmp;
78 10 }
79
80 static void n64_8bitdo(struct raw_src_mapping *map) {
81 map->mask[0] = 0x23150FFF;
82 map->desc[0] = 0x0000000F;
83
84 map->btns_mask[PAD_RY_UP] = BIT(8);
85 map->btns_mask[PAD_RX_RIGHT] = BIT(9);
86 map->btns_mask[PAD_RY_DOWN] = map->btns_mask[PAD_RB_LEFT];
87 map->btns_mask[PAD_RX_LEFT] = map->btns_mask[PAD_RB_UP];
88 map->btns_mask[PAD_LM] = map->btns_mask[PAD_MS];
89 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_RIGHT];
90 map->btns_mask[PAD_RB_RIGHT] = 0;
91 map->btns_mask[PAD_RB_UP] = 0;
92 map->btns_mask[PAD_MS] = 0;
93 map->btns_mask[PAD_RT] = 0;
94 }
95
96 static void n64_8bitdo_mk(struct raw_src_mapping *map) {
97 map->mask[0] = 0x33550FFF;
98 map->desc[0] = 0x000000FF;
99
100 map->btns_mask[PAD_RB_LEFT] = BIT(1);
101 map->btns_mask[PAD_RB_RIGHT] = 0;
102 map->btns_mask[PAD_MT] = BIT(12);
103 map->btns_mask[PAD_LM] = BIT(8);
104 map->btns_mask[PAD_RM] = BIT(9);
105 }
106
107 static void m30_8bitdo(struct raw_src_mapping *map) {
108 map->desc[0] = 0x100200FF;
109
110 map->btns_mask[PAD_LM] = map->btns_mask[PAD_LS];
111 map->btns_mask[PAD_LS] = map->btns_mask[PAD_RB_LEFT];
112 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_DOWN];
113 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
114 map->btns_mask[PAD_RB_RIGHT] = 0;
115
116 map->btns_mask[PAD_RB_RIGHT] = 0;
117 map->axes_idx[BTN_RIGHT] = map->axes_idx[TRIG_R];
118 memcpy(&map->meta[BTN_RIGHT], &map->meta[TRIG_R], sizeof(map->meta[0]));
119
120 map->axes_idx[TRIG_R] = map->axes_idx[TRIG_L];
121 map->axes_idx[TRIG_L] = -1;
122 memcpy(&map->meta[TRIG_R], &map->meta[TRIG_L], sizeof(map->meta[0]));
123 }
124
125 static void m30_8bitdo_modkit(struct raw_src_mapping *map) {
126 map->btns_mask[PAD_RB_LEFT] = BIT(0);
127 map->btns_mask[PAD_RB_RIGHT] = BIT(5);
128 map->btns_mask[PAD_RB_DOWN] = BIT(1);
129 map->btns_mask[PAD_RB_UP] = BIT(3);
130 map->btns_mask[PAD_LS] = BIT(2);
131 map->btns_mask[PAD_RS] = BIT(4);
132 }
133
134 static void saturn_diy_8bitdo(struct raw_src_mapping *map) {
135 uint32_t tmp = map->btns_mask[PAD_LS];
136
137 map->btns_mask[PAD_LS] = map->btns_mask[PAD_RB_LEFT];
138 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_DOWN];
139 map->btns_mask[PAD_RB_DOWN] = map->btns_mask[PAD_RB_RIGHT];
140 map->btns_mask[PAD_RB_RIGHT] = map->btns_mask[PAD_RS];
141 map->btns_mask[PAD_RS] = tmp;
142 }
143
144 static void gc_diy_8bitdo(struct raw_src_mapping *map) {
145 map->mask[0] = 0xFF1F0FFF;
146 map->desc[0] = 0x110000FF;
147
148 uint32_t tmp = map->btns_mask[PAD_RB_LEFT];
149 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_RIGHT];
150 map->btns_mask[PAD_RB_RIGHT] = tmp;
151 map->btns_mask[PAD_RS] = map->btns_mask[PAD_MS];
152 map->btns_mask[PAD_LT] = BIT(8);
153 map->btns_mask[PAD_RT] = BIT(9);
154 map->btns_mask[PAD_MS] = 0;
155 map->btns_mask[PAD_LM] = 0;
156 map->btns_mask[PAD_RM] = 0;
157 map->btns_mask[PAD_LS] = 0;
158 }
159
160 static void gc_gbros_8bitdo(struct raw_src_mapping *map) {
161 map->mask[0] = 0xFF5F0FFF;
162 map->desc[0] = 0x110000FF;
163
164 uint32_t tmp = map->btns_mask[PAD_RB_LEFT];
165 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_RIGHT];
166 map->btns_mask[PAD_RB_RIGHT] = tmp;
167 map->btns_mask[PAD_LT] = map->btns_mask[PAD_LS];
168 map->btns_mask[PAD_RT] = map->btns_mask[PAD_RS];
169 map->btns_mask[PAD_RS] = map->btns_mask[PAD_MS];
170 map->btns_mask[PAD_MS] = 0;
171 map->btns_mask[PAD_LM] = 0;
172 map->btns_mask[PAD_RM] = 0;
173 map->btns_mask[PAD_LS] = 0;
174 }
175
176 static void n64_bluen64(struct raw_src_mapping *map) {
177 map->mask[0] = 0x23150FFF;
178 map->desc[0] = 0x000000FF;
179
180 map->btns_mask[PAD_RB_LEFT] = map->btns_mask[PAD_RB_RIGHT];
181 map->btns_mask[PAD_RX_LEFT] = BIT(3);
182 map->btns_mask[PAD_RY_DOWN] = BIT(4);
183 map->btns_mask[PAD_LM] = BIT(8);
184 map->btns_mask[PAD_MM] = BIT(5);
185 }
186
187 static void rf_warrior(struct raw_src_mapping *map) {
188 map->mask[0] = 0x337F0FFF;
189 map->desc[0] = 0x000000FF;
190
191 map->btns_mask[PAD_RB_LEFT] = BIT(1);
192 map->btns_mask[PAD_RB_RIGHT] = BIT(2);
193 map->btns_mask[PAD_LM] = BIT(4);
194 map->btns_mask[PAD_LS] = 0;
195 map->btns_mask[PAD_RM] = BIT(5);
196 map->btns_mask[PAD_RS] = BIT(6);
197 map->btns_mask[PAD_MS] = 0;
198 }
199
200 enum {
201 OUYA_O = 0,
202 OUYA_U,
203 OUYA_Y,
204 OUYA_A,
205 OUYA_L1,
206 OUYA_R1,
207 OUYA_L3,
208 OUYA_R3,
209 OUYA_UP,
210 OUYA_DOWN,
211 OUYA_LEFT,
212 OUYA_RIGHT,
213 OUYA_L2,
214 OUYA_R2,
215 OUYA_MENU,
216 };
217
218 static void ouya(struct raw_src_mapping *map) {
219 map->mask[0] = 0xBB1F0FFF;
220 map->desc[0] = 0x110000FF;
221
222 memset(map->btns_mask, 0, sizeof(map->btns_mask));
223
224 map->btns_mask[PAD_LD_LEFT] = BIT(OUYA_LEFT);
225 map->btns_mask[PAD_LD_RIGHT] = BIT(OUYA_RIGHT);
226 map->btns_mask[PAD_LD_DOWN] = BIT(OUYA_DOWN);
227 map->btns_mask[PAD_LD_UP] = BIT(OUYA_UP);
228 map->btns_mask[PAD_RB_LEFT] = BIT(OUYA_U);
229 map->btns_mask[PAD_RB_RIGHT] = BIT(OUYA_A);
230 map->btns_mask[PAD_RB_DOWN] = BIT(OUYA_O);
231 map->btns_mask[PAD_RB_UP] = BIT(OUYA_Y);
232 map->btns_mask[PAD_MM] = BIT(OUYA_MENU);
233 map->btns_mask[PAD_LS] = BIT(OUYA_L1);
234 map->btns_mask[PAD_LJ] = BIT(OUYA_L3);
235 map->btns_mask[PAD_RS] = BIT(OUYA_R1);
236 map->btns_mask[PAD_RJ] = BIT(OUYA_R3);
237 }
238
239 static void mapping_quirks_apply_pnp(struct bt_data *bt_data) {
240 switch (bt_data->base.vid) {
241 }
242 }
243
244 55 void mapping_quirks_apply(struct bt_data *bt_data) {
245 55 mapping_quirks_apply_pnp(bt_data);
246
1/2
✗ Branch 0 (3→4) not taken.
✓ Branch 1 (3→5) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_FACE_BTNS_INVERT)) {
247 face_btns_invert(&bt_data->raw_src_mappings[PAD]);
248 }
249
2/2
✓ Branch 0 (6→7) taken 8 times.
✓ Branch 1 (6→8) taken 47 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_FACE_BTNS_ROTATE_RIGHT)) {
250 8 face_btns_rotate_right(&bt_data->raw_src_mappings[PAD]);
251 }
252
1/2
✗ Branch 0 (9→10) not taken.
✓ Branch 1 (9→11) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_FACE_BTNS_TRIGGER_TO_6BUTTONS)) {
253 face_btns_trigger_to_6buttons(&bt_data->raw_src_mappings[PAD]);
254 }
255
1/4
✗ Branch 0 (11→12) not taken.
✓ Branch 1 (11→15) taken 55 times.
✗ Branch 2 (13→14) not taken.
✗ Branch 3 (13→15) not taken.
55 if (bt_data->base.vid == 0x045E && atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_FACE_BTNS_TRIGGER_TO_8BUTTONS)) {
256 face_btns_trigger_to_8buttons(&bt_data->raw_src_mappings[PAD]);
257 }
258
2/2
✓ Branch 0 (16→17) taken 10 times.
✓ Branch 1 (16→18) taken 45 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_TRIGGER_PRI_SEC_INVERT)) {
259 10 trigger_pri_sec_invert(&bt_data->raw_src_mappings[PAD]);
260 }
261
1/2
✗ Branch 0 (19→20) not taken.
✓ Branch 1 (19→21) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_N64)) {
262 n64_8bitdo(&bt_data->raw_src_mappings[PAD]);
263 }
264
1/2
✗ Branch 0 (22→23) not taken.
✓ Branch 1 (22→24) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_N64_MK)) {
265 n64_8bitdo_mk(&bt_data->raw_src_mappings[PAD]);
266 }
267
1/2
✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_M30)) {
268 m30_8bitdo(&bt_data->raw_src_mappings[PAD]);
269 }
270
1/2
✗ Branch 0 (28→29) not taken.
✓ Branch 1 (28→30) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_M30_MODKIT)) {
271 m30_8bitdo_modkit(&bt_data->raw_src_mappings[PAD]);
272 }
273
1/2
✗ Branch 0 (31→32) not taken.
✓ Branch 1 (31→33) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_SATURN)) {
274 saturn_diy_8bitdo(&bt_data->raw_src_mappings[PAD]);
275 }
276
1/2
✗ Branch 0 (34→35) not taken.
✓ Branch 1 (34→36) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_BLUEN64_N64)) {
277 n64_bluen64(&bt_data->raw_src_mappings[PAD]);
278 }
279
1/2
✗ Branch 0 (37→38) not taken.
✓ Branch 1 (37→39) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_RF_WARRIOR)) {
280 rf_warrior(&bt_data->raw_src_mappings[PAD]);
281 }
282
1/2
✗ Branch 0 (40→41) not taken.
✓ Branch 1 (40→42) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_OUYA)) {
283 ouya(&bt_data->raw_src_mappings[PAD]);
284 }
285
1/2
✗ Branch 0 (43→44) not taken.
✓ Branch 1 (43→45) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_GC)) {
286 gc_diy_8bitdo(&bt_data->raw_src_mappings[PAD]);
287 }
288
1/2
✗ Branch 0 (46→47) not taken.
✓ Branch 1 (46→48) taken 55 times.
55 if (atomic_test_bit(&bt_data->base.flags[PAD], BT_QUIRK_8BITDO_GBROS)) {
289 gc_gbros_8bitdo(&bt_data->raw_src_mappings[PAD]);
290 }
291 55 }
292