45
45
#define LG4FF_MODE_G25_IDX 3
46
46
#define LG4FF_MODE_DFGT_IDX 4
47
47
#define LG4FF_MODE_G27_IDX 5
48
- #define LG4FF_MODE_MAX_IDX 6
48
+ #define LG4FF_MODE_G29_IDX 6
49
+ #define LG4FF_MODE_MAX_IDX 7
49
50
50
51
#define LG4FF_MODE_NATIVE BIT(LG4FF_MODE_NATIVE_IDX)
51
52
#define LG4FF_MODE_DFEX BIT(LG4FF_MODE_DFEX_IDX)
52
53
#define LG4FF_MODE_DFP BIT(LG4FF_MODE_DFP_IDX)
53
54
#define LG4FF_MODE_G25 BIT(LG4FF_MODE_G25_IDX)
54
55
#define LG4FF_MODE_DFGT BIT(LG4FF_MODE_DFGT_IDX)
55
56
#define LG4FF_MODE_G27 BIT(LG4FF_MODE_G27_IDX)
57
+ #define LG4FF_MODE_G29 BIT(LG4FF_MODE_G29_IDX)
56
58
57
59
#define LG4FF_DFEX_TAG "DF-EX"
58
60
#define LG4FF_DFEX_NAME "Driving Force / Formula EX"
62
64
#define LG4FF_G25_NAME "G25 Racing Wheel"
63
65
#define LG4FF_G27_TAG "G27"
64
66
#define LG4FF_G27_NAME "G27 Racing Wheel"
67
+ #define LG4FF_G29_TAG "G29"
68
+ #define LG4FF_G29_NAME "G29 Racing Wheel"
65
69
#define LG4FF_DFGT_TAG "DFGT"
66
70
#define LG4FF_DFGT_NAME "Driving Force GT"
67
71
@@ -140,6 +144,7 @@ static const struct lg4ff_wheel lg4ff_devices[] = {
140
144
{USB_DEVICE_ID_LOGITECH_G25_WHEEL , lg4ff_wheel_effects , 40 , 900 , lg4ff_set_range_g25 },
141
145
{USB_DEVICE_ID_LOGITECH_DFGT_WHEEL , lg4ff_wheel_effects , 40 , 900 , lg4ff_set_range_g25 },
142
146
{USB_DEVICE_ID_LOGITECH_G27_WHEEL , lg4ff_wheel_effects , 40 , 900 , lg4ff_set_range_g25 },
147
+ {USB_DEVICE_ID_LOGITECH_G29_WHEEL , lg4ff_wheel_effects , 40 , 900 , lg4ff_set_range_g25 },
143
148
{USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 , lg4ff_wheel_effects , 40 , 270 , NULL },
144
149
{USB_DEVICE_ID_LOGITECH_WII_WHEEL , lg4ff_wheel_effects , 40 , 270 , NULL }
145
150
};
@@ -157,6 +162,9 @@ static const struct lg4ff_multimode_wheel lg4ff_multimode_wheels[] = {
157
162
{USB_DEVICE_ID_LOGITECH_G27_WHEEL ,
158
163
LG4FF_MODE_NATIVE | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFP | LG4FF_MODE_DFEX ,
159
164
LG4FF_G27_TAG , LG4FF_G27_NAME },
165
+ {USB_DEVICE_ID_LOGITECH_G29_WHEEL ,
166
+ LG4FF_MODE_NATIVE | LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX ,
167
+ LG4FF_G29_TAG , LG4FF_G29_NAME },
160
168
};
161
169
162
170
static const struct lg4ff_alternate_mode lg4ff_alternate_modes [] = {
@@ -165,7 +173,8 @@ static const struct lg4ff_alternate_mode lg4ff_alternate_modes[] = {
165
173
[LG4FF_MODE_DFP_IDX ] = {USB_DEVICE_ID_LOGITECH_DFP_WHEEL , LG4FF_DFP_TAG , LG4FF_DFP_NAME },
166
174
[LG4FF_MODE_G25_IDX ] = {USB_DEVICE_ID_LOGITECH_G25_WHEEL , LG4FF_G25_TAG , LG4FF_G25_NAME },
167
175
[LG4FF_MODE_DFGT_IDX ] = {USB_DEVICE_ID_LOGITECH_DFGT_WHEEL , LG4FF_DFGT_TAG , LG4FF_DFGT_NAME },
168
- [LG4FF_MODE_G27_IDX ] = {USB_DEVICE_ID_LOGITECH_G27_WHEEL , LG4FF_G27_TAG , LG4FF_G27_NAME }
176
+ [LG4FF_MODE_G27_IDX ] = {USB_DEVICE_ID_LOGITECH_G27_WHEEL , LG4FF_G27_TAG , LG4FF_G27_NAME },
177
+ [LG4FF_MODE_G29_IDX ] = {USB_DEVICE_ID_LOGITECH_G29_WHEEL , LG4FF_G29_TAG , LG4FF_G29_NAME },
169
178
};
170
179
171
180
/* Multimode wheel identificators */
@@ -197,8 +206,24 @@ static const struct lg4ff_wheel_ident_info lg4ff_dfgt_ident_info = {
197
206
USB_DEVICE_ID_LOGITECH_DFGT_WHEEL
198
207
};
199
208
209
+ static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info = {
210
+ LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX ,
211
+ 0xfff8 ,
212
+ 0x1350 ,
213
+ USB_DEVICE_ID_LOGITECH_G29_WHEEL
214
+ };
215
+
216
+ static const struct lg4ff_wheel_ident_info lg4ff_g29_ident_info2 = {
217
+ LG4FF_MODE_G29 | LG4FF_MODE_G27 | LG4FF_MODE_G25 | LG4FF_MODE_DFGT | LG4FF_MODE_DFP | LG4FF_MODE_DFEX ,
218
+ 0xff00 ,
219
+ 0x8900 ,
220
+ USB_DEVICE_ID_LOGITECH_G29_WHEEL
221
+ };
222
+
200
223
/* Multimode wheel identification checklists */
201
224
static const struct lg4ff_wheel_ident_info * lg4ff_main_checklist [] = {
225
+ & lg4ff_g29_ident_info ,
226
+ & lg4ff_g29_ident_info2 ,
202
227
& lg4ff_dfgt_ident_info ,
203
228
& lg4ff_g27_ident_info ,
204
229
& lg4ff_g25_ident_info ,
@@ -237,6 +262,12 @@ static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g27 = {
237
262
0xf8 , 0x09 , 0x04 , 0x01 , 0x00 , 0x00 , 0x00 } /* Switch mode to G27 with detach */
238
263
};
239
264
265
+ static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext09_g29 = {
266
+ 2 ,
267
+ {0xf8 , 0x0a , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , /* Revert mode upon USB reset */
268
+ 0xf8 , 0x09 , 0x05 , 0x01 , 0x01 , 0x00 , 0x00 } /* Switch mode to G29 with detach */
269
+ };
270
+
240
271
/* EXT_CMD1 - Understood by DFP, G25, G27 and DFGT */
241
272
static const struct lg4ff_compat_mode_switch lg4ff_mode_switch_ext01_dfp = {
242
273
1 ,
@@ -650,6 +681,23 @@ static const struct lg4ff_compat_mode_switch *lg4ff_get_mode_switch_command(cons
650
681
return NULL ;
651
682
}
652
683
break ;
684
+ case USB_DEVICE_ID_LOGITECH_G29_WHEEL :
685
+ switch (target_product_id ) {
686
+ case USB_DEVICE_ID_LOGITECH_DFP_WHEEL :
687
+ return & lg4ff_mode_switch_ext09_dfp ;
688
+ case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL :
689
+ return & lg4ff_mode_switch_ext09_dfgt ;
690
+ case USB_DEVICE_ID_LOGITECH_G25_WHEEL :
691
+ return & lg4ff_mode_switch_ext09_g25 ;
692
+ case USB_DEVICE_ID_LOGITECH_G27_WHEEL :
693
+ return & lg4ff_mode_switch_ext09_g27 ;
694
+ case USB_DEVICE_ID_LOGITECH_G29_WHEEL :
695
+ return & lg4ff_mode_switch_ext09_g29 ;
696
+ /* G29 can only be switched to DF-EX, DFP, DFGT, G25, G27 or its native mode */
697
+ default :
698
+ return NULL ;
699
+ }
700
+ break ;
653
701
case USB_DEVICE_ID_LOGITECH_DFGT_WHEEL :
654
702
switch (target_product_id ) {
655
703
case USB_DEVICE_ID_LOGITECH_WHEEL :
@@ -1232,12 +1280,13 @@ int lg4ff_init(struct hid_device *hid)
1232
1280
entry -> wdata .set_range (hid , entry -> wdata .range );
1233
1281
1234
1282
#ifdef CONFIG_LEDS_CLASS
1235
- /* register led subsystem - G27 only */
1283
+ /* register led subsystem - G27/G29 only */
1236
1284
entry -> wdata .led_state = 0 ;
1237
1285
for (j = 0 ; j < 5 ; j ++ )
1238
1286
entry -> wdata .led [j ] = NULL ;
1239
1287
1240
- if (lg4ff_devices [i ].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL ) {
1288
+ if (lg4ff_devices [i ].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL ||
1289
+ lg4ff_devices [i ].product_id == USB_DEVICE_ID_LOGITECH_G29_WHEEL ) {
1241
1290
struct led_classdev * led ;
1242
1291
size_t name_sz ;
1243
1292
char * name ;
0 commit comments