Commit d7ae8ff9 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

Merge branch 'for-6.1/rc-controllers' into for-linus

- Support for various RC controllers (Marcus Folkesson)
parents b0400ff2 acc3e346
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -9053,6 +9053,12 @@ L: linux-input@vger.kernel.org
S:	Supported
F:	drivers/hid/hid-playstation.c
HID PHOENIX RC FLIGHT CONTROLLER
M:	Marcus Folkesson <marcus.folkesson@gmail.com>
L:	linux-input@vger.kernel.org
S:	Maintained
F:	drivers/hid/hid-pxrc.c
HID SENSOR HUB DRIVERS
M:	Jiri Kosina <jikos@kernel.org>
M:	Jonathan Cameron <jic23@kernel.org>
@@ -9065,6 +9071,12 @@ F: drivers/hid/hid-sensor-*
F:	drivers/iio/*/hid-*
F:	include/linux/hid-sensor-*
HID VRC-2 CAR CONTROLLER DRIVER
M:	Marcus Folkesson <marcus.folkesson@gmail.com>
L:	linux-input@vger.kernel.org
S:	Maintained
F:	drivers/hid/hid-vrc2.c
HID WACOM DRIVER
M:	Ping Cheng <ping.cheng@wacom.com>
M:	Jason Gerecke  <jason.gerecke@wacom.com>
+19 −0
Original line number Diff line number Diff line
@@ -454,6 +454,16 @@ config HID_VIEWSONIC
	help
	  Support for ViewSonic/Signotec PD1011 signature pad.

config HID_VRC2
	tristate "VRC-2 Car Controller"
	depends on HID
	help
        Support for VRC-2 which is a 2-axis controller often used in
        car simulators.

        To compile this driver as a module, choose M here: the
        module will be called hid-vrc2.

config HID_XIAOMI
	tristate "Xiaomi"
	help
@@ -899,6 +909,15 @@ config PLAYSTATION_FF
	  Say Y here if you would like to enable force feedback support for
	  PlayStation game controllers.

config HID_PXRC
       tristate "PhoenixRC HID Flight Controller"
       depends on HID
       help
       Support for PhoenixRC HID Flight Controller, a 8-axis flight controller.

       To compile this driver as a module, choose M here: the
       module will be called hid-pxrc.

config HID_RAZER
	tristate "Razer non-fully HID-compliant devices"
	help
+2 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ hid-picolcd-$(CONFIG_DEBUG_FS) += hid-picolcd_debugfs.o
obj-$(CONFIG_HID_PLANTRONICS)	+= hid-plantronics.o
obj-$(CONFIG_HID_PLAYSTATION)	+= hid-playstation.o
obj-$(CONFIG_HID_PRIMAX)	+= hid-primax.o
obj-$(CONFIG_HID_PXRC)		+= hid-pxrc.o
obj-$(CONFIG_HID_RAZER)	+= hid-razer.o
obj-$(CONFIG_HID_REDRAGON)	+= hid-redragon.o
obj-$(CONFIG_HID_RETRODE)	+= hid-retrode.o
@@ -137,6 +138,7 @@ obj-$(CONFIG_HID_XINMO) += hid-xinmo.o
obj-$(CONFIG_HID_ZEROPLUS)	+= hid-zpff.o
obj-$(CONFIG_HID_ZYDACRON)	+= hid-zydacron.o
obj-$(CONFIG_HID_VIEWSONIC)	+= hid-viewsonic.o
obj-$(CONFIG_HID_VRC2)		+= hid-vrc2.o

wacom-objs			:= wacom_wac.o wacom_sys.o
obj-$(CONFIG_HID_WACOM)		+= wacom.o
+1 −0
Original line number Diff line number Diff line
@@ -1389,6 +1389,7 @@

#define USB_VENDOR_ID_MULTIPLE_1781	0x1781
#define USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD	0x0a9d
#define USB_DEVICE_ID_PHOENIXRC        0x0898

#define USB_VENDOR_ID_DRACAL_RAPHNET	0x289b
#define USB_DEVICE_ID_RAPHNET_2NES2SNES	0x0002

drivers/hid/hid-pxrc.c

0 → 100644
+112 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * HID driver for PhoenixRC 8-axis flight controller
 *
 * Copyright (C) 2022 Marcus Folkesson <marcus.folkesson@gmail.com>
 */

#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>

#include "hid-ids.h"

struct pxrc_priv {
	u8 slider;
	u8 dial;
	bool alternate;
};

static __u8 pxrc_rdesc_fixed[] = {
	0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
	0x09, 0x04,        // Usage (Joystick)
	0xA1, 0x01,        // Collection (Application)
	0x09, 0x01,        //   Usage (Pointer)
	0xA1, 0x00,        //   Collection (Physical)
	0x09, 0x30,        //     Usage (X)
	0x09, 0x36,        //     Usage (Slider)
	0x09, 0x31,        //     Usage (Y)
	0x09, 0x32,        //     Usage (Z)
	0x09, 0x33,        //     Usage (Rx)
	0x09, 0x34,        //     Usage (Ry)
	0x09, 0x35,        //     Usage (Rz)
	0x09, 0x37,        //     Usage (Dial)
	0x15, 0x00,        //     Logical Minimum (0)
	0x26, 0xFF, 0x00,  //     Logical Maximum (255)
	0x35, 0x00,        //     Physical Minimum (0)
	0x46, 0xFF, 0x00,  //     Physical Maximum (255)
	0x75, 0x08,        //     Report Size (8)
	0x95, 0x08,        //     Report Count (8)
	0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
	0xC0,              //   End Collection
	0xC0,              // End Collection
};

static __u8 *pxrc_report_fixup(struct hid_device *hdev, __u8 *rdesc,
				unsigned int *rsize)
{
	hid_info(hdev, "fixing up PXRC report descriptor\n");
	*rsize = sizeof(pxrc_rdesc_fixed);
	return pxrc_rdesc_fixed;
}

static int pxrc_raw_event(struct hid_device *hdev, struct hid_report *report,
	 u8 *data, int size)
{
	struct pxrc_priv *priv = hid_get_drvdata(hdev);

	if (priv->alternate)
		priv->slider = data[7];
	else
		priv->dial = data[7];

	data[1] = priv->slider;
	data[7] = priv->dial;

	priv->alternate = !priv->alternate;
	return 0;
}

static int pxrc_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
	int ret;
	struct pxrc_priv *priv;

	priv = devm_kzalloc(&hdev->dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;
	hid_set_drvdata(hdev, priv);

	ret = hid_parse(hdev);
	if (ret) {
		hid_err(hdev, "parse failed\n");
		return ret;
	}

	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
	if (ret) {
		hid_err(hdev, "hw start failed\n");
		return ret;
	}

	return 0;
}

static const struct hid_device_id pxrc_devices[] = {
	{ HID_USB_DEVICE(USB_VENDOR_ID_MULTIPLE_1781, USB_DEVICE_ID_PHOENIXRC) },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(hid, pxrc_devices);

static struct hid_driver pxrc_driver = {
	.name = "hid-pxrc",
	.id_table = pxrc_devices,
	.report_fixup = pxrc_report_fixup,
	.probe = pxrc_probe,
	.raw_event = pxrc_raw_event,
};
module_hid_driver(pxrc_driver);

MODULE_AUTHOR("Marcus Folkesson <marcus.folkesson@gmail.com>");
MODULE_DESCRIPTION("HID driver for PXRC 8-axis flight controller");
MODULE_LICENSE("GPL");
Loading