[PATCH] Logitech Wii Speed Force Wireless Wheel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Attached is a preliminary patch to enable support for the Logitech Wii
Speed Force Wireless Wheel, currently being sold on 'clearance' for around
$10.

The dongle/wheel do not automatically register with each other, a small
libhid app can be used to make a connection as follows:
--
$ sudo echo -n "3-2:1.0" > /sys/bus/usb/drivers/usbhid/unbind
$ sudo python wii_wheel_bond.py
$ sudo echo -n "3-2:1.0" > /sys/bus/usb/drivers/usbhid/bind
--

Basic functions work, but I believe that there if further work needed to
fully understand the configuration process of the dongle. Once understood
this function should be performed by the kernel driver.

I've also attached some notes on the configuration of the dongle. Since
the dongle is based around the nRF24L01 this might be similar to the other
Logitech 2.4GHz devices.

Cheers,
Simon
(aka. Mungewell)
The following is an attempt to document what I have reversed-engineered with the Logitech
'Speed Force Wheel for Wii' and it's associated USB dongle.

The default behaviour is to do nothing when dongle is plugged into the PC. The dongle is 
recognised as a HID gaming device and a new joystick device is generated, however the 
RF link between the dongle and wheel is not made/activated.

The radio link is based around the nRF24L01 transceiver, which is controlled via the SPI bus.

The Wheel
--
The wheel hardware contains the nRF24L01, a ATMEGA micro, and a PWM/Full-bridge driver (for controlling the motor). The micro (presumable) scans the buttons mounted on the wheel, digitised the wheel/acc/brake positions and sends them to the PC/Dongle.



When powered the wheel energises the motor and the wheel turns to the central position,
whilst doing this the micro also scans the buttons (until on is pressed) and continualy
configures the nRF24L01 (presumably looking for a radio partner).

The configuration string for the nRF24L01 is:


Which (in order) sets:
	Sets 'Setup' to 0x70
		Clear RX/TX FIFO and MAX_RT Interupt flags
	Sets 'RF Channel' to a continuously increasing value
	Sets 'Config' to 0x3F 
		Turn off interrupts for RX, TX, MAX_RT
		Enables CRC with 2 Byte scheme
		Powers up
		Sets RX Priority
	Sets 'RX_Addr' to 0xAE,0xFF,0xFF,0xFF,0xFF and 0xAE,0xAC,0x67,0xAC,0x67
	Sets 'TX_Addr' to 0xAE,0xFF,0xFF,0xFF,0xFF and 0xAE,0xAC,0x67,0xAC,0x67
	...

	2nd RX/TX Address changes randomly, it could just be whatever comes up in micros RAM (or the previously set address)

The Dongle
--
The hardware on the Dongle contains a CY7C64215 micro along with the nRF24L01.


The USB descriptor is as follows:


Which describes a read interrupt endpoint, a write interrupt endpoint and a 'feature' port. It would appear that the USB dongle can be configured via the 'feature' port and the assumption that only data is passed over the read/write endpoints.


The feature port was found to respond to particular 'commands', reading the feature port back would indicate that the 'command' had completed by clearing the MSB of the first byte.

Power On Reset
	[0x31(0x0E)0x07(0x00)]
	[0x2A(0x0E)0xAE(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)
	 0x30(0x0E)0xAE(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)
	 0x23(0x0E)0x03(0x00)
	 0x22(0x0E)0x01(0x00)
	 0x24(0x0E)0x00(0x00)
	 0x21(0x0E)0x00(0x00)
	 0x20(0x0E)0x3F(0x00)
	 0x25(0x0E)0x12(0x00)
	 0x26(0x0E)0x07(0x00)]

Command '0xA9' : Configure RX/TX Address
	Sets up RX/TX address that the nRF24L01 will use, causing a SPI configuration of the nRF24L01
	P1 = 2nd and 4th Address Bytes
	P2 = 3rd and 5th Address Bytes

	So a write of '0xa9, 0xac, 0x67, 0, 0, 0, 0, 0, 0' would cause the following SPI write:
	[0x31(0x0E)0x07(0x00)
	 0x2A(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)
	 0x30(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)
	 0x23(0x0E)0x03(0x00)
	 0x22(0x0E)0x01(0x00)
	 0x24(0x0E)0x00(0x00)
	 0x21(0x0E)0x00(0x00)
	 0x20(0x0E)0x3F(0x00)
	 0x25(0x0E)0x12(0x00)
	 0x26(0x0E)0x07(0x00)]

Command '0xAC' : RF Test Mode?
	Caused SPI bus write which enables RF Testing on the Dongle
	P2 = Test Mode
		0 - Normal Mode (LED flashes on/off as normal)
		1 - Constant TX (LED on), RF channel in 'P3' (can kill WiFi ;-)
		2 - Pulsed TX (LED flashes long-on/short-off)
		3 - Receive Only? (LED off), RF channel in 'P3'. Continually polls nRF24L01 status and clears

	ie. 0xac,0x00,0x34,0x11,0x22,0x33,0x44,0x55 gives SPI write:
	[0x31(0x0E)0x07(0x00)]
	[0x2A(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)
	 0x30(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)
	 0x23(0x0E)0x03(0x00)
	 0x22(0x0E)0x01(0x00)
	 0x24(0x0E)0x00(0x00)
	 0x21(0x0E)0x00(0x00)
	 0x20(0x0E)0x3F(0x00)
	 0x25(0x0E)0x34(0x00)]
	[0x26(0x0E)0x07(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x26(0x0E)0x07(0x00)]
	...

	[0x31(0x0E)0x07(0x00)
	 0x2A(0x0E)0xAE(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)
	 0x30(0x0E)0xAE(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)0xFF(0x00)
	 0x23(0x0E)0x03(0x00)
	 0x22(0x0E)0x01(0x00)
	 0x24(0x0E)0x00(0x00)
	 0x21(0x0E)0x00(0x00)]
	[0x20(0x0E)0x3F(0x00)
	 0x25(0x0E)0x12(0x00)
	 0x26(0x0E)0x07(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x26(0x0E)0x07(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x25(0x0E)0x12(0x00)
	 0x20(0x0E)0x3E(0x00)]
	[0xA0(0x0E)0x00(0x00)0x00(0x00)0x20(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)Couldn't keep up

	ie. 0xac,0x01,0x12,0x00,0x00,0x00,0x00,0x00 gives SPI write:
	[0x88(0x0E)]
	[0x20(0x0E)0x72(0x00)
	 0x25(0x0E)0x12(0x00)
	 0x26(0x0E)0x17(0x00)] - set up RF, force PLL

	ie. 0xac,0x02,0x34,0x00,0x00,0x00,0x00,0x00 gives SPI write:
	[0x27(0x0E)0x60(0x00)
	 0x25(0x0E)0x34(0x00)
	 0x20(0x0E)0x3E(0x00)]
	[0xA0(0x0E)0xAC(0x00)0x67(0x00)0x20(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)][0x00(0x00)][0x33(0x00)][0x5A(0x00)][0xFF(0x00)] - write TX, 31 bytes

	ie. 0xac,0x03,0x34,0x00,0x00,0x00,0x00,0x00 gives SPI write:
	[0x20(0x0E)0x3F(0x00)
	 0x25(0x0E)0x34(0x00) - set RF channel
	 0x26(0x0E)0x17(0x00)] - set up RF, force PLL
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	...

Command '0xAF' : Initialise communications???
	Cause a SPI bus write to configure channels to predetermined values if P2 < 0x0F.
	Sometimes triggers micro into continuous SPI activity, is this enabling channel hopping?

	ie. '\xaf\x01\x12\x00\x00\x00\x00\x00' gives SPI:

	[0x31(0x0E)0x07(0x00) - set RX Pipeline 0 length to 7 bytes
	 0x2A(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00) - set RX address (according to command '0xA9')
	 0x30(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00) - set TX address
	 0x23(0x0E)0x03(0x00)] - set address widths
	[0x22(0x0E)0x01(0x00) - enable RX address
	 0x24(0x0E)0x00(0x00) - disable retransmit
	 0x21(0x0E)0x00(0x00) - disable auto ack
	 0x20(0x0E)0x3F(0x00) - set config
	 0x25(0x0E)0x12(0x00) - set RF channel
	 0x26(0x0E)0x07(0x00)] - set up RF 
	[0x27(0x0E)0x60(0x00) - set status reg
	 0x20(0x0E)0x3F(0x00)] - set config
	[0x26(0x0E)0x07(0x00)] - set up RF
	[0x27(0x0E)0x60(0x00) - set status reg
	 0x25(0x0E)0x3A(0x00) - set RF channel
	 0x20(0x0E)0x3E(0x00)] - set config
	[0xA0(0x0E)0x00(0x00)0x00(0x00)0x20(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00).... - write TX payload

	'\xaf\x01\x00\x00\x00\x00\x00\x00'
[0x31(0x0E)0x07(0x00)0x2A(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)0x30(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00)0x23(0x0E)0x03(0x00)0x22(0x0E)0x01(0x00)0x24(0x0E)0x00(0x00)0x21(0x0E)0x00(0x00)0x20(0x0E)0x3F(0x00)0x25(0x0E)0x12(0x00)0x26(0x0E)0x07(0x00)][0x27(0x0E)0x60(0x00)0x25(0x0E)0x12(0x00)0x20(0x0E)0x3E(0x00)][0xA0(0x0E)0x00(0x00)0x00(0x00)0x20(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)Couldn't keep up

Command '0xB2' : Reset?
	Causes a SPI bus write to configure RX/TX channels to default (0xA0,0xAC,0x67,0xAC,0x67), RF Channel 0x12
	P2 and P3 do something unknown (they are reported in Command '0xB3')

	[0x31(0x0E)0x07(0x00) - set RX Pipeline 7 bytes
	 0x2A(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00) - set RX address
	 0x30(0x0E)0xAE(0x00)0x67(0x00)0xAC(0x00)0x67(0x00)0xAC(0x00) - set TX address
	 0x23(0x0E)0x03(0x00) - set address widths
	 0x22(0x0E)0x01(0x00) - enable RX address
	 0x24(0x0E)0x00(0x00) - disable retransmit
	 0x21(0x0E)0x00(0x00) - disable auto ack
	 0x20(0x0E)0x3F(0x00) - set config
	 0x25(0x0E)0x12(0x00) - set RF channel
	 0x26(0x0E)0x07(0x00)] - set up RF

Command '0xA8' : Check Status?
	Returns RX/TX bytes in R5 and R6
	Returns 'button' pressed in R7 bit 5
	Returns something in R7 bits 4..0 related to 'LED mode' (not a direct map)
	Returns something in R8 which depends on P2

Command '0xAA' : LED Mode
	P2 changes the way the LED flashes, unknown what is actually happening

Command '0xAE' : Unknown
	Doesn't clear R1 bit 7, like the other commands. Perhaps it is waiting for something...
	Returns 0x14 in R5 and 0x00 in R6

Command '0xB3' : Unknown
	Only clears R1 bit 7 if Command '0xAF' is issued first
	Returns values in R5 and R6 which are the values from Command '0xB2' P2/P3




---

Got some communications working with the wheel.

	[0x27(0x2E)0x60(0x00) - clear RX/TX flags (note Status is 0x2E = Packet TXed)
	 0x20(0x0E)0x3F(0x00)] - set config RX priority
	[0x26(0x40)0x07(0x00) - set RF setup (note Status is 0x40 = Data in RX pipe)
	 0x61(0x40)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x7E)0x00(0xFF)0x00(0xFF) - Read RX data pipe
	0x27(0x4E)][0x40(0x00)] - clear RX flag
	[0x27(0x0E)0x60(0x00)
	 0x25(0x0E)0x2D(0x00) - Set RF channel
	 0x20(0x0E)0x3E(0x00)] - set config TX priority
	[0xA0(0x0E)0x00(0x00)0x00(0x00)0x40(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)Couldn't keep up - Write data to TX pipe (note contents has changed)

	[0x27(0x2E)0x60(0x00)
	 0x20(0x0E)0x3F(0x00)]
	[0x26(0x40)0x07(0x00)
	 0x61(0x40)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x7E)0x00(0xFF)0x00(0xFF)0x27(0x4E)]
	[0x40(0x00)]
	[0x27(0x0E)0x60(0x00)
	 0x25(0x0E)0x45(0x00) - Set RF channel
	 0x20(0x0E)0x3E(0x00)]
	[0xA0(0x0E)0x00(0x00)0x00(0x00)0x40(0x00)0x03(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)Couldn't keep up


	0x61(0x40)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x7E)0x00(0xFF)0x00(0xFF)0x27(0x4E)]
	0x61(0x40)0x00(0x00)0x00(0x46)0x00(0x10)0x00(0x00)0x00(0x16)0x00(0xE5)0x00(0x4C)0x27(0x4E)]
	0x61(0x40)0x00(0x00)0x00(0x4E)0x00(0x10)0x00(0x00)0x00(0x7C)][0x00(0xE5)0x00(0x4C) = 'A' pressed
	0x61(0x40)0x00(0x00)0x00(0x4E)0x00(0x12)0x00(0x00)0x00(0x7C)][0x00(0xE5)0x00(0x4C)0x27(0x4E)] = 'A2' pressed
	0x61(0x40)0x00(0x00)0x00(0x4E)0x00(0x00)0x00(0x00)0x00(0xFF)0x00(0xE5)0x00(0x4C)0x27(0x4E)] = Turn Right
	0x61(0x40)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0x00)0x00(0xFF)0x00(0xFF)0x27(0x4E)] = Turn Left
#!/usr/bin/python
#
# Small script to configure the USB Dongle for the
# Logitech Wii Speed Force Wireless Wheel
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Should you need to contact me, the author, you can do so by
# e-mail - mail your message to <simon@xxxxxxxxxxxxx>

import sys
import binascii
import random

from hid import *

def main():
  #hid_set_debug(HID_DEBUG_ALL)
  hid_set_debug_stream(sys.stderr)
  hid_set_usb_debug(0)

  ret = hid_init()
  if ret != HID_RET_SUCCESS:
    sys.stderr.write("hid_init failed with return code %d.\n" % ret)

  hid = hid_new_HIDInterface()
  matcher = HIDInterfaceMatcher()
  matcher.vendor_id = 0x046d
  matcher.product_id = 0xc29c

  ret = hid_force_open(hid, 0, matcher, 3)
  if ret != HID_RET_SUCCESS:
    sys.stderr.write("hid_force_open failed with return code %d.\n" % ret)

  command = '\xaf\x01\x00\x00\x00\x00\x00\x00'

  ret = hid_set_feature_report(hid, [], command)
  if ret != HID_RET_SUCCESS:
    sys.stderr.write("hid_set_feature_report failed with return code %d.\n" % ret)

  while (1):
    ret, buffer = hid_get_feature_report(hid, [], 8)
    if ret != HID_RET_SUCCESS:
      sys.stderr.write("hid_get_feature_report failed with return code %d.\n" % ret)

    # Wait for bit 7 to be cleared
    if (ord(buffer[0]) < 0x80):
      break
    print ".",

  print "\nRecieved", binascii.hexlify(buffer)

  # Pick a random Address
  command = '\xb2'+chr(random.randrange(0,255))+chr(random.randrange(0,255))+'\x00\x00\x00\x00\x00'

  ret = hid_set_feature_report(hid, [], command)
  if ret != HID_RET_SUCCESS:
    sys.stderr.write("hid_set_feature_report failed with return code %d.\n" % ret)

  while (1):
    ret, buffer = hid_get_feature_report(hid, [], 8)
    if ret != HID_RET_SUCCESS:
      sys.stderr.write("hid_get_feature_report failed with return code %d.\n" % ret)

    # Wait for bit 7 to be cleared
    if (ord(buffer[0]) < 0x80):
      break
    print ".",

  print "\nRecieved", binascii.hexlify(buffer)

  print "\nLink configured. Power up wheel, press button on dongle => LED should go out\n"
    
  ret = hid_close(hid)
  if ret != HID_RET_SUCCESS:
    sys.stderr.write("hid_close failed with return code %d.\n" % ret)

  hid_cleanup()

if __name__ == '__main__':
  main()
diff -ur linux-source-2.6.32/drivers/hid/hid-core.c linux-2.6.32-sdw/drivers/hid/hid-core.c
--- linux-source-2.6.32/drivers/hid/hid-core.c	2010-07-28 00:06:55.000000000 -0600
+++ linux-2.6.32-sdw/drivers/hid/hid-core.c	2010-07-06 18:56:15.000000000 -0600
@@ -1329,6 +1329,7 @@
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
diff -ur linux-source-2.6.32/drivers/hid/hid-ids.h linux-2.6.32-sdw/drivers/hid/hid-ids.h
--- linux-source-2.6.32/drivers/hid/hid-ids.h	2010-07-28 00:06:55.000000000 -0600
+++ linux-2.6.32-sdw/drivers/hid/hid-ids.h	2010-07-06 18:55:19.000000000 -0600
@@ -308,6 +308,7 @@
 #define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG	0xc293
 #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL	0xc295
 #define USB_DEVICE_ID_LOGITECH_G25_WHEEL	0xc299
+#define USB_DEVICE_ID_LOGITECH_WII_WHEEL	0xc29c
 #define USB_DEVICE_ID_LOGITECH_ELITE_KBD	0xc30a
 #define USB_DEVICE_ID_S510_RECEIVER	0xc50c
 #define USB_DEVICE_ID_S510_RECEIVER_2	0xc517
diff -ur linux-source-2.6.32/drivers/hid/hid-lg.c linux-2.6.32-sdw/drivers/hid/hid-lg.c
--- linux-source-2.6.32/drivers/hid/hid-lg.c	2009-12-02 20:51:21.000000000 -0700
+++ linux-2.6.32-sdw/drivers/hid/hid-lg.c	2010-07-12 21:18:31.222442036 -0600
@@ -33,6 +33,7 @@
 #define LG_NOGET		0x100
 #define LG_FF			0x200
 #define LG_FF2			0x400
+#define LG_WIIWHEEL		0x2000
 
 /*
  * Certain Logitech keyboards send in report #3 keys which are far
@@ -51,6 +52,18 @@
 		rdesc[84] = rdesc[89] = 0x4d;
 		rdesc[85] = rdesc[90] = 0x10;
 	}
+
+        if ((quirks & LG_WIIWHEEL) && rsize >= 101 && 
+                        rdesc[41] == 0x95 && rdesc[42] == 0x0B &&
+                        rdesc[47] == 0x05 && rdesc[48] == 0x09) {
+                dev_info(&hdev->dev, "fixing up Logitech WiiWheel button "
+                                "descriptor\n");
+                rdesc[41] = 0x05;
+                rdesc[42] = 0x09;
+                rdesc[47] = 0x95;
+                rdesc[48] = 0x0B;
+        }
+
 }
 
 #define lg_map_key_clear(c)	hid_map_usage_clear(hi, usage, bit, max, \
@@ -299,6 +312,8 @@
 		.driver_data = LG_FF },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL),
 		.driver_data = LG_FF },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL),
+		.driver_data = LG_FF | LG_WIIWHEEL },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ),
 		.driver_data = LG_FF },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
diff -ur linux-source-2.6.32/drivers/hid/hid-lgff.c linux-2.6.32-sdw/drivers/hid/hid-lgff.c
--- linux-source-2.6.32/drivers/hid/hid-lgff.c	2009-12-02 20:51:21.000000000 -0700
+++ linux-2.6.32-sdw/drivers/hid/hid-lgff.c	2010-07-12 21:16:40.890453659 -0600
@@ -70,6 +70,7 @@
 	{ 0x046d, 0xc293, ff_joystick },
 	{ 0x046d, 0xc294, ff_wheel },
 	{ 0x046d, 0xc295, ff_joystick },
+	{ 0x046d, 0xc29c, ff_wheel },
 	{ 0x046d, 0xca03, ff_wheel },
 };
 

[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux