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
194
195
196
197
198
199
|
From 352709cfaa3b518b06a7ac5722686682d08707c8 Mon Sep 17 00:00:00 2001
From: "Luke D. Jones" <luke@ljones.dev>
Date: Sat, 5 Oct 2024 15:40:09 +1300
Subject: [PATCH 12/29] hid-asus-ally: Turbo settings for buttons
Signed-off-by: Luke D. Jones <luke@ljones.dev>
---
drivers/hid/hid-asus-ally.c | 72 +++++++++++++++++++++++++++++--------
drivers/hid/hid-asus-ally.h | 50 ++++++++++++++++++++++++++
2 files changed, 108 insertions(+), 14 deletions(-)
diff --git a/drivers/hid/hid-asus-ally.c b/drivers/hid/hid-asus-ally.c
index 08e953f6a3c5..53c2b36c14fb 100644
--- a/drivers/hid/hid-asus-ally.c
+++ b/drivers/hid/hid-asus-ally.c
@@ -236,6 +236,7 @@ static const char* btn_to_name(u64 key)
struct btn_data {
u64 button;
u64 macro;
+ bool turbo;
};
struct btn_mapping {
@@ -530,6 +531,46 @@ static int _gamepad_apply_btn_pair(struct hid_device *hdev, struct ally_gamepad_
return ret;
}
+static int _gamepad_apply_turbo(struct hid_device *hdev, struct ally_gamepad_cfg *ally_cfg)
+{
+ struct btn_mapping *map = &ally_cfg->key_mapping[ally_cfg->mode - 1];
+ u8 *hidbuf;
+ int ret;
+
+ /* set turbo */
+ hidbuf = kzalloc(FEATURE_ROG_ALLY_REPORT_SIZE, GFP_KERNEL);
+ if (!hidbuf)
+ return -ENOMEM;
+ hidbuf[0] = FEATURE_ROG_ALLY_REPORT_ID;
+ hidbuf[1] = FEATURE_ROG_ALLY_CODE_PAGE;
+ hidbuf[2] = xpad_cmd_set_turbo;
+ hidbuf[3] = xpad_cmd_len_turbo;
+
+ hidbuf[4] = map->dpad_up.turbo;
+ hidbuf[6] = map->dpad_down.turbo;
+ hidbuf[8] = map->dpad_left.turbo;
+ hidbuf[10] = map->dpad_right.turbo;
+
+ hidbuf[12] = map->btn_ls.turbo;
+ hidbuf[14] = map->btn_rs.turbo;
+ hidbuf[16] = map->btn_lb.turbo;
+ hidbuf[18] = map->btn_rb.turbo;
+
+ hidbuf[20] = map->btn_a.turbo;
+ hidbuf[22] = map->btn_b.turbo;
+ hidbuf[24] = map->btn_x.turbo;
+ hidbuf[26] = map->btn_y.turbo;
+
+ hidbuf[28] = map->btn_lt.turbo;
+ hidbuf[30] = map->btn_rt.turbo;
+
+ ret = asus_dev_set_report(hdev, hidbuf, FEATURE_ROG_ALLY_REPORT_SIZE);
+
+ kfree(hidbuf);
+
+ return ret;
+}
+
static ssize_t _gamepad_apply_all(struct hid_device *hdev, struct ally_gamepad_cfg *ally_cfg)
{
int ret;
@@ -559,6 +600,9 @@ static ssize_t _gamepad_apply_all(struct hid_device *hdev, struct ally_gamepad_c
if (ret < 0)
return ret;
ret = _gamepad_apply_btn_pair(hdev, ally_cfg, btn_pair_lt_rt);
+ if (ret < 0)
+ return ret;
+ ret = _gamepad_apply_turbo(hdev, ally_cfg);
if (ret < 0)
return ret;
@@ -586,22 +630,22 @@ ALLY_DEVICE_ATTR_WO(gamepad_apply_all, apply_all);
/* button map attributes, regular and macro*/
ALLY_BTN_MAPPING(m1, btn_m1);
ALLY_BTN_MAPPING(m2, btn_m2);
-ALLY_BTN_MAPPING(a, btn_a);
-ALLY_BTN_MAPPING(b, btn_b);
-ALLY_BTN_MAPPING(x, btn_x);
-ALLY_BTN_MAPPING(y, btn_y);
-ALLY_BTN_MAPPING(lb, btn_lb);
-ALLY_BTN_MAPPING(rb, btn_rb);
-ALLY_BTN_MAPPING(ls, btn_ls);
-ALLY_BTN_MAPPING(rs, btn_rs);
-ALLY_BTN_MAPPING(lt, btn_lt);
-ALLY_BTN_MAPPING(rt, btn_rt);
-ALLY_BTN_MAPPING(dpad_u, dpad_up);
-ALLY_BTN_MAPPING(dpad_d, dpad_down);
-ALLY_BTN_MAPPING(dpad_l, dpad_left);
-ALLY_BTN_MAPPING(dpad_r, dpad_right);
ALLY_BTN_MAPPING(view, btn_view);
ALLY_BTN_MAPPING(menu, btn_menu);
+ALLY_TURBO_BTN_MAPPING(a, btn_a);
+ALLY_TURBO_BTN_MAPPING(b, btn_b);
+ALLY_TURBO_BTN_MAPPING(x, btn_x);
+ALLY_TURBO_BTN_MAPPING(y, btn_y);
+ALLY_TURBO_BTN_MAPPING(lb, btn_lb);
+ALLY_TURBO_BTN_MAPPING(rb, btn_rb);
+ALLY_TURBO_BTN_MAPPING(ls, btn_ls);
+ALLY_TURBO_BTN_MAPPING(rs, btn_rs);
+ALLY_TURBO_BTN_MAPPING(lt, btn_lt);
+ALLY_TURBO_BTN_MAPPING(rt, btn_rt);
+ALLY_TURBO_BTN_MAPPING(dpad_u, dpad_up);
+ALLY_TURBO_BTN_MAPPING(dpad_d, dpad_down);
+ALLY_TURBO_BTN_MAPPING(dpad_l, dpad_left);
+ALLY_TURBO_BTN_MAPPING(dpad_r, dpad_right);
static void _gamepad_set_xpad_default(struct ally_gamepad_cfg *ally_cfg)
{
diff --git a/drivers/hid/hid-asus-ally.h b/drivers/hid/hid-asus-ally.h
index f7e21be50d8e..63a3b5caa71c 100644
--- a/drivers/hid/hid-asus-ally.h
+++ b/drivers/hid/hid-asus-ally.h
@@ -24,6 +24,7 @@ enum xpad_cmd {
xpad_cmd_set_mapping = 0x02,
xpad_cmd_set_leds = 0x08,
xpad_cmd_check_ready = 0x0A,
+ xpad_cmd_set_turbo = 0x0F,
};
/* the xpad_cmd determines which feature is set or queried */
@@ -31,6 +32,7 @@ enum xpad_cmd_len {
xpad_cmd_len_mode = 0x01,
xpad_cmd_len_mapping = 0x2c,
xpad_cmd_len_leds = 0x0C,
+ xpad_cmd_len_turbo = 0x20,
};
/* Values correspond to the actual HID byte value required */
@@ -228,6 +230,37 @@ enum btn_pair_index {
return count; \
}
+#define ALLY_TURBO_SHOW(_fname, _btn_name) \
+ static ssize_t _fname##_show(struct device *dev, \
+ struct device_attribute *attr, char *buf) \
+ { \
+ struct ally_gamepad_cfg *ally_cfg = drvdata.gamepad_cfg; \
+ struct btn_data *btn; \
+ if (!drvdata.gamepad_cfg) \
+ return -ENODEV; \
+ btn = &ally_cfg->key_mapping[ally_cfg->mode - 1]._btn_name; \
+ return sysfs_emit(buf, "%d\n", btn->turbo); \
+ }
+
+#define ALLY_TURBO_STORE(_fname, _btn_name) \
+ static ssize_t _fname##_store(struct device *dev, \
+ struct device_attribute *attr, \
+ const char *buf, size_t count) \
+ { \
+ struct ally_gamepad_cfg *ally_cfg = drvdata.gamepad_cfg; \
+ struct btn_data *btn; \
+ bool turbo; \
+ int ret; \
+ if (!drvdata.gamepad_cfg) \
+ return -ENODEV; \
+ btn = &ally_cfg->key_mapping[ally_cfg->mode - 1]._btn_name; \
+ ret = kstrtobool(buf, &turbo); \
+ if (ret) \
+ return ret; \
+ btn->turbo = turbo; \
+ return count; \
+ }
+
#define ALLY_BTN_ATTRS_GROUP(_name, _fname) \
static struct attribute *_fname##_attrs[] = { \
&dev_attr_##_fname.attr, \
@@ -260,3 +293,20 @@ enum btn_pair_index {
.name = __stringify(btn_##_fname), \
.attrs = _fname##_attrs, \
}
+
+#define ALLY_TURBO_BTN_MAPPING(_fname, _btn_name) \
+ _ALLY_BTN_REMAP(_fname, _btn_name) \
+ _ALLY_BTN_MACRO(_fname, _btn_name) \
+ ALLY_TURBO_SHOW(btn_mapping_##_fname##_turbo, _btn_name); \
+ ALLY_TURBO_STORE(btn_mapping_##_fname##_turbo, _btn_name); \
+ ALLY_DEVICE_ATTR_RW(btn_mapping_##_fname##_turbo, turbo); \
+ static struct attribute *_fname##_turbo_attrs[] = { \
+ &dev_attr_btn_mapping_##_fname##_remap.attr, \
+ &dev_attr_btn_mapping_##_fname##_macro.attr, \
+ &dev_attr_btn_mapping_##_fname##_turbo.attr, \
+ NULL, \
+ }; \
+ static const struct attribute_group btn_mapping_##_fname##_attr_group = { \
+ .name = __stringify(btn_##_fname), \
+ .attrs = _fname##_turbo_attrs, \
+ }
--
2.48.1
|