Page MenuHomeFreeBSD

D56026.id.diff
No OneTemporary

D56026.id.diff

diff --git a/sys/dev/hid/hid.h b/sys/dev/hid/hid.h
--- a/sys/dev/hid/hid.h
+++ b/sys/dev/hid/hid.h
@@ -105,6 +105,8 @@
#define HUG_SYSTEM_MENU_DOWN 0x008d
#define HUG_SYSTEM_POWER_UP 0x008e
#define HUG_SYSTEM_RESTART 0x008f
+#define HUG_RADIO_CONTROL 0x000c
+#define HUG_RADIO_BUTTON 0x00c6
#define HUG_D_PAD_UP 0x0090
#define HUG_D_PAD_DOWN 0x0091
#define HUG_D_PAD_RIGHT 0x0092
diff --git a/sys/dev/hid/hsctrl.c b/sys/dev/hid/hsctrl.c
--- a/sys/dev/hid/hsctrl.c
+++ b/sys/dev/hid/hsctrl.c
@@ -45,6 +45,8 @@
#include <dev/hid/hidbus.h>
#include <dev/hid/hidmap.h>
+static hidmap_cb_t hsctrl_radio_cb;
+
#define HSCTRL_MAP(usage, code) \
{ HIDMAP_KEY(HUP_GENERIC_DESKTOP, HUG_SYSTEM_##usage, code) }
@@ -64,12 +66,49 @@
HSCTRL_MAP(MENU_DOWN, KEY_DOWN),
HSCTRL_MAP(POWER_UP, KEY_POWER2),
HSCTRL_MAP(RESTART, KEY_RESTART),
+ { HIDMAP_REL_CB(HUP_GENERIC_DESKTOP, HUG_RADIO_BUTTON,
+ &hsctrl_radio_cb) },
};
static const struct hid_device_id hsctrl_devs[] = {
{ HID_TLC(HUP_GENERIC_DESKTOP, HUG_SYSTEM_CONTROL) },
+ { HID_TLC(HUP_GENERIC_DESKTOP, HUG_RADIO_CONTROL) },
};
+/*
+ * Synthesize key-down + key-up for the wireless radio button,
+ * which only reports a relative pulse (value=1) on press.
+ * The firmware latches value=1 and never resets it, so we
+ * track the last value via HIDMAP_CB_UDATA64 and only fire
+ * on the 0 -> non-zero transition.
+ */
+static int
+hsctrl_radio_cb(HIDMAP_CB_ARGS)
+{
+ struct evdev_dev *evdev = HIDMAP_CB_GET_EVDEV();
+ int32_t last;
+
+ switch (HIDMAP_CB_GET_STATE()) {
+ case HIDMAP_CB_IS_ATTACHING:
+ evdev_support_event(evdev, EV_KEY);
+ evdev_support_key(evdev, KEY_RFKILL);
+ HIDMAP_CB_UDATA64 = 0;
+ break;
+ case HIDMAP_CB_IS_RUNNING:
+ last = (int32_t)HIDMAP_CB_UDATA64;
+ HIDMAP_CB_UDATA64 = (uint64_t)ctx.data;
+ if (ctx.data == 0 || ctx.data == last)
+ return (ENOMSG);
+ evdev_push_key(evdev, KEY_RFKILL, 1);
+ evdev_push_key(evdev, KEY_RFKILL, 0);
+ break;
+ default:
+ break;
+ }
+
+ return (0);
+}
+
static int
hsctrl_probe(device_t dev)
{

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 20, 12:07 PM (20 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31833562
Default Alt Text
D56026.id.diff (2 KB)

Event Timeline