Google Coral PCIe TPU on HAOS Pi 5 — What Actually Works

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 connector
  • dtoverlay=pcie-32bit-dma-pi5 — enables 32-bit DMA for PCIe
  • pcie_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 temperature
  • sensor.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

If you are updating config.txt in the ssh container (port 22).
Does this change stay after updating Home Assistant core thru a major revision?

UPDATE: Recent update broke this again.
change:
device: pci:0001:01:00.0
to:
device: pci