Page MenuHomeFreeBSD

D61318.1794717404.diff
No OneTemporary

Authored By
Unknown
Size
4 KB
Referenced Files
None
Subscribers
None

D61318.1794717404.diff

diff --git a/share/man/man4/ps5dsense.4 b/share/man/man4/ps5dsense.4
--- a/share/man/man4/ps5dsense.4
+++ b/share/man/man4/ps5dsense.4
@@ -1,9 +1,9 @@
.\"
-.\" Copyright (c) 2026 Christos Longros <chris.longros@gmail.com>
+.\" Copyright (c) 2026 Christos Longros <longros@FreeBSD.org>
.\"
.\" SPDX-License-Identifier: BSD-2-Clause
.\"
-.Dd August 29, 2026
+.Dd November 8, 2026
.Dt PS5DSENSE 4
.Os
.Sh NAME
@@ -96,6 +96,17 @@
Player indicator LEDs,
where -1 is off and
0 to 4 select the player number.
+.It Va dev.ps5dsense.%d.battery_capacity
+Battery charge level in percent.
+Read-only.
+.It Va dev.ps5dsense.%d.battery_status
+Battery status,
+where 0 is unknown,
+1 is charging,
+2 is discharging,
+3 is not charging and
+4 is full.
+Read-only.
.El
.Pp
The following variable is available as both
@@ -132,7 +143,7 @@
The
.Nm
driver was written by
-.An Christos Longros Aq Mt chris.longros@gmail.com .
+.An Christos Longros Aq Mt longros@FreeBSD.org .
.Sh BUGS
The
.Nm
diff --git a/sys/dev/hid/ps5dsense.c b/sys/dev/hid/ps5dsense.c
--- a/sys/dev/hid/ps5dsense.c
+++ b/sys/dev/hid/ps5dsense.c
@@ -2,7 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2020 Vladimir Kondratyev <wulf@FreeBSD.org>
- * Copyright (c) 2026 Christos Longros <chris.longros@gmail.com>
+ * Copyright (c) 2026 Christos Longros <longros@FreeBSD.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -193,6 +193,17 @@
PS5DS_LED_CNT,
};
+#define PS5DS_STATUS0_BATTERY_CAPACITY 0x0f
+#define PS5DS_STATUS0_CHARGING 0xf0
+
+enum ps5ds_battery_status {
+ PS5DS_BATTERY_UNKNOWN,
+ PS5DS_BATTERY_CHARGING,
+ PS5DS_BATTERY_DISCHARGING,
+ PS5DS_BATTERY_NOT_CHARGING,
+ PS5DS_BATTERY_FULL,
+};
+
struct ps5ds_softc {
struct hidmap hm;
@@ -200,6 +211,10 @@
enum ps5ds_led_state led_state;
struct ps5ds_led led_color;
int player_leds; /* 0-4: player number, -1: off */
+
+ struct hid_location status_loc;
+ int battery_capacity;
+ int battery_status;
};
#define PS5DS_OFFSET(field) offsetof(struct ps5ds_softc, field)
@@ -258,19 +273,70 @@
HID_TLC(HUP_GENERIC_DESKTOP, HUG_GAME_PAD) },
};
+static void
+ps5ds_battery(struct ps5ds_softc *sc, uint8_t status)
+{
+ uint8_t battery_data, charging_status;
+
+ battery_data = status & PS5DS_STATUS0_BATTERY_CAPACITY;
+ charging_status = (status & PS5DS_STATUS0_CHARGING) >> 4;
+
+ switch (charging_status) {
+ case 0x0:
+ /*
+ * Each unit of battery data corresponds to 10%
+ * 0 = 0-9%, 1 = 10-19%, .. and 10 = 100%
+ */
+ sc->battery_capacity = MIN(battery_data * 10 + 5, 100);
+ sc->battery_status = PS5DS_BATTERY_DISCHARGING;
+ break;
+ case 0x1:
+ sc->battery_capacity = MIN(battery_data * 10 + 5, 100);
+ sc->battery_status = PS5DS_BATTERY_CHARGING;
+ break;
+ case 0x2:
+ sc->battery_capacity = 100;
+ sc->battery_status = PS5DS_BATTERY_FULL;
+ break;
+ case 0xa: /* voltage or temperature out of range */
+ case 0xb: /* temperature error */
+ sc->battery_capacity = 0;
+ sc->battery_status = PS5DS_BATTERY_NOT_CHARGING;
+ break;
+ case 0xf: /* charging error */
+ default:
+ sc->battery_capacity = 0;
+ sc->battery_status = PS5DS_BATTERY_UNKNOWN;
+ }
+}
+
static int
ps5ds_final_cb(HIDMAP_CB_ARGS)
{
+ struct ps5ds_softc *sc = HIDMAP_CB_GET_SOFTC();
struct evdev_dev *evdev = HIDMAP_CB_GET_EVDEV();
- if (HIDMAP_CB_GET_STATE() == HIDMAP_CB_IS_ATTACHING) {
+ switch (HIDMAP_CB_GET_STATE()) {
+ case HIDMAP_CB_IS_ATTACHING:
+ sc->status_loc = (struct hid_location) { 8, 0, 416 };
evdev_support_prop(evdev, INPUT_PROP_DIRECT);
evdev_set_cdev_mode(evdev, UID_ROOT, GID_GAMES,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+ break;
+
+ case HIDMAP_CB_IS_RUNNING:
+ /* Only packets with ReportID=1 are accepted */
+ if (HIDMAP_CB_GET_RID() != 1)
+ return (ENOTSUP);
+ ps5ds_battery(sc, HIDMAP_CB_GET_UDATA(&sc->status_loc));
+ break;
+
+ default:
+ break;
}
- /* Do not execute callback at interrupt handler and detach */
- return (ENOSYS);
+ /* Do execute callback at interrupt handler and detach */
+ return (0);
}
static int
@@ -421,6 +487,15 @@
PS5DS_SYSCTL_PLAYER_LEDS, ps5ds_sysctl, "I",
"Player indicator LEDs: -1 - off, 0-4 - player number.");
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "battery_capacity", CTLFLAG_RD, &sc->battery_capacity, 0,
+ "Battery charge, percent.");
+
+ SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+ "battery_status", CTLFLAG_RD, &sc->battery_status, 0,
+ "Battery status: 0 - unknown, 1 - charging, 2 - discharging, "
+ "3 - not charging, 4 - full.");
+
error = hidmap_attach(&sc->hm);
if (error) {
sx_destroy(&sc->lock);

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 15, 4:36 AM (8 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41738122
Default Alt Text
D61318.1794717404.diff (4 KB)

Event Timeline