11 Commits

Author SHA1 Message Date
Oleg
67f3a0be6a Some README changes 2024-07-16 18:11:50 +03:00
Makarenko Oleg
860794b6bb Merge pull request #11 from JacKeTUs/cammus
Added Cammus C5
2024-07-16 16:44:59 +03:00
Oleg
2e5efb2243 Merge branch 'main' into cammus 2024-07-16 12:37:52 +03:00
Makarenko Oleg
5416f537bf Merge pull request #12 from JacKeTUs/quirks-init
Move quirks initialization to the hid_pidff_init function
2024-07-16 12:37:11 +03:00
Oleg
3db0eef19a Rename hid_pidff_init 2024-07-16 12:30:29 +03:00
Oleg
d132ca633f Move quirks initialization to the hid_pidff_init function 2024-07-15 18:17:17 +03:00
Oleg
02a07521ae Add Cammus C5 to README.md 2024-07-15 04:54:18 +03:00
Oleg
ab76f16c32 Merge branch 'main' into cammus 2024-07-15 04:52:26 +03:00
Makarenko Oleg
a0b20c7055 Merge pull request #10 from JacKeTUs/no_delay_quirk_fix
Fix NO_DELAY_EFFECT quirk implementation
2024-07-15 04:51:15 +03:00
Oleg
776dccf8f9 Added Cammus wheel to the list with NO_DELAY quirk 2024-07-15 04:48:39 +03:00
Oleg
96088a6c56 Added Cammus C5 wheelbase ID 2024-07-15 04:47:12 +03:00
5 changed files with 30 additions and 41 deletions

View File

@@ -16,7 +16,8 @@ And that's basically it
## What devices are supported? ## What devices are supported?
### Bases: ### Bases:
1. MOZA R3, R5, R9, R12, R16, R21 1. MOZA R3, R5, R9, R12, R16, R21
2. ... 2. Cammus C5
3. ...
## What works? ## What works?
1. FFB (all effects from device descriptor) 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)) 3. Setup through proprietary software. May require [some tweaking](#how-to-set-up-a-base-parameters))
## How to use this driver? ## 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 ### 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` 2. Clone repository to `/usr/src/universal-pidff`
3. Install the module: 3. Install the module:
`sudo dkms install /usr/src/universal-pidff` `sudo dkms install /usr/src/universal-pidff`
@@ -43,12 +48,13 @@ Alternatively, you can install it through DKMS or manually.
To remove module: To remove module:
`sudo dkms remove universal-pidff/<version> --all` `sudo dkms remove universal-pidff/<version> --all`
### Manually
1. Install `linux-headers-$(uname -r)` ### Manually
2. Clone repository Best for debugging purposes, where you need frequently change codebase/branches
3. `make` 1. Install `linux-headers-$(uname -r)` and `build-essential` packages from your distro package manager
4. `sudo insmod hid-universal-pidff.ko` 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: To unload module:
`sudo rmmod hid_universal_pidff` `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)** **[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 ## 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 - Buttons above 80 simply don't show up. This is a Linux limitation and we're trying to fix that in the upstream

View File

@@ -9,4 +9,7 @@
#define USB_DEVICE_ID_MOZA_R12 0x0006 #define USB_DEVICE_ID_MOZA_R12 0x0006
#define USB_DEVICE_ID_MOZA_R16_R21 0x0000 #define USB_DEVICE_ID_MOZA_R16_R21 0x0000
#define USB_VENDOR_ID_CAMMUS 0x3416
#define USB_DEVICE_ID_CAMMUS_C5 0x0301
#endif #endif

View File

@@ -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 }, .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), { 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 }, .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); MODULE_DEVICE_TABLE(hid, pidff_wheel_devices);
@@ -69,9 +71,9 @@ static int universal_pidff_probe(struct hid_device *hdev,
goto err; goto err;
} }
ret = hid_pidff_init_with_quirks(hdev, id); ret = hid_pidff_init_quirks(hdev, id);
if (ret) { if (ret) {
hid_warn(hdev, "Force feedback not supported\n"); hid_warn(hdev, "Force feedback is not supported\n");
goto err; goto err;
} }

View File

@@ -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 pidff_device *pidff;
struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input *hidinput = list_entry(hid->inputs.next,
@@ -1344,6 +1344,8 @@ int hid_pidff_init(struct hid_device *hid)
return -ENOMEM; return -ENOMEM;
pidff->hid = hid; pidff->hid = hid;
pidff->quirks |= id->driver_data;
hid_dbg(dev, "Device quirks: %d\n", pidff->quirks);
hid_device_io_start(hid); hid_device_io_start(hid);
@@ -1421,29 +1423,3 @@ int hid_pidff_init(struct hid_device *hid)
kfree(pidff); kfree(pidff);
return error; 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;
}

View File

@@ -20,7 +20,6 @@
#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(2) #define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(2)
int hid_pidff_init(struct hid_device *hid); int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id);
int hid_pidff_init_with_quirks(struct hid_device *hid, const struct hid_device_id *id);
#endif #endif