Google Coral PCIe TPU on HAOS Pi 5 — What Actually Works
NOTE: Please don’t ask me any questions about this. I barely understand what is going on. Claude.ai helped with most of the debugging, gemini got me over the finish line with the pci:0001:01:00.0 thing. I had Claude summarize what all happend below. Hopefully this saves someone alot of time.
The Problem
Every guide says use device: pci or device: pci:0 in your Frigate detector config.
On HAOS with a Pi 5, this fails silently with:
No EdgeTPU was detected.
ValueError: Failed to load delegate from libedgetpu.so.1.0
The device node (/dev/apex_0) exists, the drivers load, everything looks fine —
but libedgetpu can’t initialize the TPU. Hours of debugging ensue.
The Fix
Use the full PCI bus address instead of the generic device string.
detectors:
coral:
type: edgetpu
device: pci:0001:01:00.0
The address 0001:01:00.0 is specific to this hardware combination (Pi 5 +
GeeekPi P33 HAT). Yours may differ — see below for how to find it.
How to Find Your PCI Address
From the HAOS SSH terminal (Advanced SSH addon, port 22):
for d in /sys/bus/pci/devices/*/; do
echo -n "$d: "
cat "$d/vendor" "$d/device" 2>/dev/null | tr '\n' ' '
echo
done
Look for the entry with vendor 0x1ac1 and device 0x089a — that’s the Coral.
The directory name gives you the address. Example output:
/sys/bus/pci/devices/0001:01:00.0/: 0x1ac1 0x089a <-- this one
/sys/bus/pci/devices/0002:01:00.0/: 0x1de4 0x0001
Strip the /sys/bus/pci/devices/ prefix and trailing slash — you get 0001:01:00.0.
Note: lspci is not available in the HAOS Alpine shell, hence the sysfs approach.
Editing config.txt on HAOS
No special setup or port 22222 access needed. From the regular Advanced SSH addon
(port 22), the boot partition can be mounted directly using -t vfat:
mkdir -p /mnt/boot
mount -t vfat /dev/mmcblk0p1 /mnt/boot
nano /mnt/boot/config.txt
umount /mnt/boot
ha host reboot
The -t vfat flag is required — omitting it causes a permission denied error
even as root. Use /mnt/boot as the mount point; /tmp/boot does not work.
config.txt Changes
Add these to /mnt/boot/config.txt:
dtparam=pciex1=on
dtoverlay=pcie-32bit-dma-pi5
kernel=kernel8.img
And add this to /mnt/boot/cmdline.txt (space-separated, on the existing line):
pcie_aspm=off
What each does:
kernel=kernel8.img— switches to 4K page kernel (Coral requires 4K pages)dtparam=pciex1=on— enables the external PCIe connectordtoverlay=pcie-32bit-dma-pi5— enables 32-bit DMA for PCIepcie_aspm=off— disables PCIe power management that interferes with Coral
We also tried dtoverlay=pciex1-compat-pi5,no-mip to fix the MSI-X interrupt
error (Couldn't initialize interrupts: -28) but it did not resolve it.
The interrupt error persists in dmesg even after the working fix — suggesting
the full PCI address workaround bypasses whatever the interrupt issue was
causing at the generic device enumeration level.
Recommendation: Apply all the config.txt changes anyway. They are documented
best practice for Pi 5 Coral and harmless to have in place.
Environment
- Hardware: Raspberry Pi 5
- HAT: GeeekPi P33 M.2 HAT
- Coral: Google Coral M.2 Accelerator (A+E key)
- HAOS: 17.1
- Kernel: 6.12.47-haos-raspi
- Frigate: 0.17.1 (Full Access addon,
ccab4aaf_frigate-fa) - Inference speed achieved: ~7-8ms (vs 100-200ms CPU)
Monitoring
Enable these two entities in the Frigate integration (disabled by default):
sensor.frigate_apex_0_temperature— TPU die temperaturesensor.frigate_coral_inference_speed— inference time in ms
Normal values:
- Temperature: 120-140°F at idle, throttles at ~185°F (85°C)
- Inference: 5-15ms; above 50ms suggests TPU has fallen back to CPU