Compare commits
11 Commits
no_delay_q
...
docs-updat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
67f3a0be6a | ||
|
|
860794b6bb | ||
|
|
2e5efb2243 | ||
|
|
5416f537bf | ||
|
|
3db0eef19a | ||
|
|
d132ca633f | ||
|
|
02a07521ae | ||
|
|
ab76f16c32 | ||
|
|
a0b20c7055 | ||
|
|
776dccf8f9 | ||
|
|
96088a6c56 |
27
README.md
27
README.md
@@ -16,7 +16,8 @@ And that's basically it
|
||||
## What devices are supported?
|
||||
### Bases:
|
||||
1. MOZA R3, R5, R9, R12, R16, R21
|
||||
2. ...
|
||||
2. Cammus C5
|
||||
3. ...
|
||||
|
||||
## What works?
|
||||
1. FFB (all effects from device descriptor)
|
||||
@@ -29,11 +30,15 @@ And that's basically it
|
||||
3. Setup through proprietary software. May require [some tweaking](#how-to-set-up-a-base-parameters))
|
||||
|
||||
## How to use this driver?
|
||||
There's an [AUR packege](https://aur.archlinux.org/packages/universal-ff-dkms-git) for Arch Linux maintained by @Lawstorant
|
||||
You can install it through AUR package, through DKMS or manually.
|
||||
|
||||
### AUR package
|
||||
There's an [AUR package](https://aur.archlinux.org/packages/universal-ff-dkms-git) for Arch Linux maintained by [@Lawstorant](https://github.com/Lawstorant).
|
||||
|
||||
Alternatively, you can install it through DKMS or manually.
|
||||
### DKMS
|
||||
1. Install `dkms`
|
||||
DKMS will install module into system, and will update it every time you update your kernel. Module will persist after reboots. It's the preferrable way to install it on the most distros.
|
||||
|
||||
1. Install `dkms` package from your distro package manager
|
||||
2. Clone repository to `/usr/src/universal-pidff`
|
||||
3. Install the module:
|
||||
`sudo dkms install /usr/src/universal-pidff`
|
||||
@@ -43,12 +48,13 @@ Alternatively, you can install it through DKMS or manually.
|
||||
|
||||
To remove module:
|
||||
`sudo dkms remove universal-pidff/<version> --all`
|
||||
### Manually
|
||||
|
||||
1. Install `linux-headers-$(uname -r)`
|
||||
2. Clone repository
|
||||
3. `make`
|
||||
4. `sudo insmod hid-universal-pidff.ko`
|
||||
### Manually
|
||||
Best for debugging purposes, where you need frequently change codebase/branches
|
||||
1. Install `linux-headers-$(uname -r)` and `build-essential` packages from your distro package manager
|
||||
2. Clone repository anywhere you want and `cd` into that directory
|
||||
3. `make`. Alternatively, you can enable debug logs from the driver with `make debug`
|
||||
4. Load module into system with `sudo insmod hid-universal-pidff.ko`
|
||||
|
||||
To unload module:
|
||||
`sudo rmmod hid_universal_pidff`
|
||||
@@ -59,6 +65,9 @@ To unload module:
|
||||
|
||||
**[Android App](https://play.google.com/store/apps/details?id=com.gudsen.mozapithouse)**
|
||||
|
||||
### Cammus
|
||||
**[Android App](https://play.google.com/store/apps/details?id=com.cammus.simulator)**
|
||||
|
||||
## Known issues with the driver
|
||||
- Buttons above 80 simply don't show up. This is a Linux limitation and we're trying to fix that in the upstream
|
||||
|
||||
|
||||
@@ -9,4 +9,7 @@
|
||||
#define USB_DEVICE_ID_MOZA_R12 0x0006
|
||||
#define USB_DEVICE_ID_MOZA_R16_R21 0x0000
|
||||
|
||||
#define USB_VENDOR_ID_CAMMUS 0x3416
|
||||
#define USB_DEVICE_ID_CAMMUS_C5 0x0301
|
||||
|
||||
#endif
|
||||
|
||||
@@ -23,6 +23,8 @@ static const struct hid_device_id pidff_wheel_devices[] = {
|
||||
.driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R16_R21),
|
||||
.driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C5),
|
||||
.driver_data = PIDFF_QUIRK_NO_DELAY_EFFECT },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, pidff_wheel_devices);
|
||||
@@ -69,9 +71,9 @@ static int universal_pidff_probe(struct hid_device *hdev,
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = hid_pidff_init_with_quirks(hdev, id);
|
||||
ret = hid_pidff_init_quirks(hdev, id);
|
||||
if (ret) {
|
||||
hid_warn(hdev, "Force feedback not supported\n");
|
||||
hid_warn(hdev, "Force feedback is not supported\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
32
hid-pidff.c
32
hid-pidff.c
@@ -1320,9 +1320,9 @@ static int pidff_check_autocenter(struct pidff_device *pidff,
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the device is PID and initialize it
|
||||
* Check if the device is PID and initialize it, with quirks
|
||||
*/
|
||||
int hid_pidff_init(struct hid_device *hid)
|
||||
int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id)
|
||||
{
|
||||
struct pidff_device *pidff;
|
||||
struct hid_input *hidinput = list_entry(hid->inputs.next,
|
||||
@@ -1344,6 +1344,8 @@ int hid_pidff_init(struct hid_device *hid)
|
||||
return -ENOMEM;
|
||||
|
||||
pidff->hid = hid;
|
||||
pidff->quirks |= id->driver_data;
|
||||
hid_dbg(dev, "Device quirks: %d\n", pidff->quirks);
|
||||
|
||||
hid_device_io_start(hid);
|
||||
|
||||
@@ -1421,29 +1423,3 @@ int hid_pidff_init(struct hid_device *hid)
|
||||
kfree(pidff);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the device is PID and initialize it
|
||||
* Add quirks after initialisation
|
||||
*/
|
||||
int hid_pidff_init_with_quirks(struct hid_device *hid, const struct hid_device_id *id)
|
||||
{
|
||||
int error = hid_pidff_init(hid);
|
||||
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
struct hid_input *hidinput = list_entry(hid->inputs.next,
|
||||
struct hid_input, list);
|
||||
struct input_dev *dev = hidinput->input;
|
||||
struct pidff_device *pidff = dev->ff->private;
|
||||
|
||||
/* set quirks on the pidff device */
|
||||
hid_device_io_start(hid);
|
||||
pidff->quirks |= id->driver_data;
|
||||
hid_device_io_stop(hid);
|
||||
|
||||
hid_dbg(dev, "Device quirks: %d\n", pidff->quirks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(2)
|
||||
|
||||
|
||||
int hid_pidff_init(struct hid_device *hid);
|
||||
int hid_pidff_init_with_quirks(struct hid_device *hid, const struct hid_device_id *id);
|
||||
int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user