RPi4 support for PoE+ Hat

I’ve purchased an official PoE+ HAT for use with a Raspberry Pi 4.
Note this is different from the PoE HAT i.e. it uses a different overlay rpi-poe-plus vs rpi-poe.

I have confirmed the PoE+ HAT hardware is working correctly by completing the following:

  1. Clean install using 2025-12-04-raspios-trixie-armhf-lite.img
    Fan spins as expected when temp is higher than 40℃
  2. Clean install using OSMC_TGT_rbp4_20251201.img
    Fan spins during initial install wizard stage
    Fan does not spin after completing install wizard

The rpi-poe-plus overlay default configuration will turn the fan on at 40℃ (see dtoverlay output below).
The RPi4 temp is higher than 40℃ however the fan is not spinning.
osmc@osmc:~$ vcgencmd measure_temp
temp=52.1’C

The rpi-poe-plus.dtbo overlay is loaded:
osmc@osmc:~$ sudo vcdbg log msg
005220.365: brfs: File read: /mfs/sd/overlays/rpi-poe-plus.dtbo
005239.197: Loaded overlay ‘rpi-poe-plus’
osmc@osmc:~$ cat /sys/firmware/devicetree/base/rpi-poe-power-supply/status
okay

However these commands suggest it’s not actually loaded.
osmc@osmc:~$ dtoverlay -l
No overlays loaded
osmc@osmc:~$ cat /sys/class/thermal/cooling_device0/type
cat: /sys/class/thermal/cooling_device0/type: No such file or directory

Manually adding the overlay returns an error:

osmc@osmc:~$ sudo dtoverlay -v rpi-poe-plus
DTOVERLAY[debug]: using platform ‘bcm2711’
DTOVERLAY[debug]: overlay map loaded
run_cmd: which dtoverlay-pre >/dev/null 2>&1 && dtoverlay-pre
DTOVERLAY[debug]: loading file ‘/boot/overlays/rpi-poe-plus.dtbo’
DTOVERLAY[debug]: fragment 5 disabled
DTOVERLAY[debug]: fragment 6 disabled
DTOVERLAY[debug]: merge_fragment(/fragment@4/overlay/poe@51,/fragment@11/overlay)
DTOVERLAY[debug]: merge_fragment(/fragment@4/overlay/poe@51/rpi-poe-power-supply@f2,/fragment@11/overlay/rpi-poe-power-supply@f2)
DTOVERLAY[debug]:   +prop(compatible)
DTOVERLAY[debug]:   +prop(reg)
DTOVERLAY[debug]:   +prop(status)
DTOVERLAY[debug]: merge_fragment() end
DTOVERLAY[debug]: merge_fragment() end
DTOVERLAY[debug]: wrote 4337 bytes to ‘/tmp/.dtoverlays/0_rpi-poe-plus.dtbo’
DTOVERLAY[debug]: wrote 4337 bytes to ‘/sys/kernel/config/device-tree/overlays/0_rpi-poe-plus/dtbo’

Failed to apply overlay ‘0_rpi-poe-plus’ (kernel)
run_cmd: which dtoverlay-post >/dev/null 2>&1 && dtoverlay-post

Adding the following to /boot/firmware/config-user.txt does not change the behaviour.
dtoverlay=rpi-poe-plus
dtparam=poe_fan_temp0=50000
dtparam=poe_fan_temp1=60000
dtparam=poe_fan_temp2=70000
dtparam=poe_fan_temp3=80000

It appears a similar issue occurred with the original PoE HAT.
This post PoE fan issue - #28 by porksoda103 suggests the culprit is the missing cooling_device0 device.
I wonder if there is a kernel option that needs to be enabled.

Looking at the kernel config this is what I see but I have no idea what might be required.
Perhaps CONFIG_PWM_RASPBERRYPI_POE based on this thread PoE+ Hat fan not spinning unless manually setting the overlay. · Issue #1734 · raspberrypi/firmware · GitHub which indicates pwn-fan is used (in Raspberry Pi OS).

osmc@osmc:/proc$ less /boot/config-5.15.92-1-osmc | grep POE
CONFIG_PPPOE=m
CONFIG_RPI_POE_POWER=y
CONFIG_MFD_RASPBERRYPI_POE_HAT is not set
CONFIG_PWM_RASPBERRYPI_POE is not set

osmc@osmc:/proc$ less /boot/config-5.15.92-1-osmc | grep FAN
CONFIG_SENSORS_AXI_FAN_CONTROL is not set
CONFIG_SENSORS_GPIO_FAN=m
CONFIG_SENSORS_PWM_FAN is not set
CONFIG_REGULATOR_FAN53555 is not set
CONFIG_REGULATOR_FAN53880 is not set
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set

osmc@osmc:/proc$ less /boot/config-5.15.92-1-osmc | grep RPI
CONFIG_JOYSTICK_RPISENSE=m
CONFIG_RPIVID_MEM=m
CONFIG_RPI_POE_POWER=y
CONFIG_MFD_RPISENSE_CORE=m
CONFIG_FB_RPISENSE=m
CONFIG_BACKLIGHT_RPI=m
CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m
CONFIG_SND_BCM2708_SOC_RPI_DAC=m
CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m
CONFIG_SND_RPI_WM8804_SOUNDCARD=m
CONFIG_VIDEO_RPIVID=m
CONFIG_RPI_AXIPERF=m

Raspberry Pi 4 details:

osmc@osmc:~$ cat /sys/firmware/devicetree/base/model
Raspberry Pi 4 Model B Rev 1.5

osmc@osmc:~$ uname -r
5.15.92-1-osmc

osmc@osmc:~$ vcgencmd version
Apr 25 2023 18:26:56
Copyright (c) 2012 Broadcom
version d7f9c2b4ef7e4a8c0b04374a879ce89d7a948453 (clean) (release) (start_x)

Current /boot/config-user.txt configuration:

osmc@osmc:~$ cat /boot/config-user.txt
dtoverlay=pisound
dtparam=audio=on
audio_pwm_mode=2
disable_audio_dither=1
dtparam=poe_fan_temp0=40000
dtparam=poe_fan_temp1=50000
dtparam=poe_fan_temp2=60000
dtparam=poe_fan_temp3=70000

dtoverlay output for rpi-poe-plus showing default config

osmc@osmc:~$ dtoverlay -h rpi-poe-plus
Name:   rpi-poe-plus

Info:   Raspberry Pi PoE+ HAT fan

Usage:  dtoverlay=rpi-poe-plus,[=]

Params: poe_fan_temp0           Temperature (in millicelcius) at which the fan turns on (default 40000)
poe_fan_temp0_hyst      Temperature delta (in millicelcius) at which the fan turns off (default 2000)
poe_fan_temp1           Temperature (in millicelcius) at which the fan speeds up (default 45000)
poe_fan_temp1_hyst      Temperature delta (in millicelcius) at which the fan slows down (default 2000)
poe_fan_temp2           Temperature (in millicelcius) at which the fan speeds up (default 50000)
poe_fan_temp2_hyst      Temperature delta (in millicelcius) at which the fan slows down (default 2000)
poe_fan_temp3           Temperature (in millicelcius) at which the fan speeds up (default 55000)
poe_fan_temp3_hyst      Temperature delta (in millicelcius) at which the fan slows down (default 5000)
i2c                     Control the fan via Linux I2C drivers instead of the firmware.

I’ll see if I have this new HAT.
I’m pretty sure I do somewhere.

Sam

@sam_nazarko Thanks for looking into this :blush:
I’ve just tested using the Raspberry Pi OS 2023-02-21 image which was the last to use a 5.15.x kernel.
The fan spins as expected with temp higher than 40℃.
The overlay is loaded and pwm-fan device is present.

root@raspberrypi:/proc# uname -r
5.15.84-v8+

root@raspberrypi:/proc# vcgencmd measure_temp
temp=40.9’C

root@raspberrypi:/proc# vclog --msg | grep poe
005636.538: brfs: File read: /mfs/sd/overlays/rpi-poe-plus.dtbo
005655.436: Loaded overlay ‘rpi-poe-plus’

root@raspberrypi:/proc# cat /sys/firmware/devicetree/base/rpi-poe-power-supply/status
okay

root@raspberrypi:/proc# dtoverlay -l
No overlays loaded

root@raspberrypi:/proc# cat /sys/class/thermal/cooling_device0/type
pwm-fan

Looking at the kernel config there are differences which I’m guessing are relevant.

  • CONFIG_MFD_RASPBERRYPI_POE_HAT is not set (osmc) vs m (Raspberry Pi OS)
  • CONFIG_PWM_RASPBERRYPI_POE is not set (osmc) vs m (Raspberry Pi OS)
  • CONFIG_SENSORS_PWM_FAN is not set (osmc) vs m (Raspberry Pi OS)

Let me know if you want the full kernel option config.

root@raspberrypi:/proc# sudo modprobe configs; zcat /proc/config.gz > /tmp/kernel.config
root@raspberrypi:/proc# less /tmp/kernel.config | grep POE
CONFIG_PPPOE=m
CONFIG_RPI_POE_POWER=m
CONFIG_MFD_RASPBERRYPI_POE_HAT=m
CONFIG_PWM_RASPBERRYPI_POE=m

root@raspberrypi:/proc# less /tmp/kernel.config | grep FAN
CONFIG_SENSORS_AXI_FAN_CONTROL is not set
CONFIG_SENSORS_GPIO_FAN=m
CONFIG_SENSORS_PWM_FAN=m
CONFIG_REGULATOR_FAN53555 is not set
CONFIG_REGULATOR_FAN53880 is not set
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set

root@raspberrypi:/proc# less /tmp/kernel.config | grep RPI
CONFIG_JOYSTICK_RPISENSE=m
CONFIG_RPIVID_MEM=m
CONFIG_RPI_POE_POWER=m
CONFIG_MFD_RPISENSE_CORE=m
CONFIG_FB_RPISENSE=m
CONFIG_BACKLIGHT_RPI=m
CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m
CONFIG_SND_BCM2708_SOC_RPI_DAC=m
CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m
CONFIG_SND_RPI_WM8804_SOUNDCARD=m
CONFIG_VIDEO_RPIVID=m
CONFIG_RPI_AXIPERF=m
1 Like