Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177558310
D61318.1794717399.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None
D61318.1794717399.diff
View Options
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
@@ -3,7 +3,7 @@
.\"
.\" 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
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
@@ -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
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 15, 4:36 AM (9 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41738090
Default Alt Text
D61318.1794717399.diff (3 KB)
Attached To
Mode
D61318: hid: ps5dsense: Report battery state through sysctl
Attached
Detach File
Event Timeline