-
-
Save dataslayermedia/714ec5a9601249d9ee754919dea49c7e to your computer and use it in GitHub Desktop.
#!/bin/bash | |
cd / | |
sudo apt update | |
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list | |
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - | |
sudo apt-get update | |
sudo apt-get install libedgetpu1-std | |
sudo apt install -y devscripts debhelper | |
sudo apt install dkms | |
sudo apt-get install dh-dkms | |
# Clone the Gasket driver repository | |
sudo git clone https://github.com/google/gasket-driver.git | |
# Change directory to the cloned repository | |
cd gasket-driver | |
# Build the Gasket driver package | |
sudo debuild -us -uc -tc -b | |
# Go back to the parent directory | |
cd .. | |
# Install the built Gasket driver package | |
sudo dpkg -i gasket-dkms_1.0-18_all.deb | |
sudo sh -c "echo 'SUBSYSTEM==\"apex\", MODE=\"0660\", GROUP=\"apex\"' >> /etc/udev/rules.d/65-apex.rules" | |
sudo groupadd apex | |
sudo adduser $USER apex | |
# Update the boot configuration for Raspberry Pi | |
echo "kernel=kernel8.img" | sudo tee -a /boot/firmware/config.txt | |
# Back up the Device Tree Blob (DTB) | |
sudo cp /boot/firmware/bcm2712-rpi-5-b.dtb /boot/firmware/bcm2712-rpi-5-b.dtb.bak | |
# Decompile the DTB into a DTS file | |
sudo dtc -I dtb -O dts /boot/firmware/bcm2712-rpi-5-b.dtb -o ~/test.dts | |
# Modify the Device Tree Source (DTS) | |
sudo sed -i '/pcie@110000 {/,/};/{/msi-parent = <[^>]*>;/{s/msi-parent = <[^>]*>;/msi-parent = <0x67>;/}}' ~/test.dts | |
# Recompile the DTS back into a DTB | |
sudo dtc -I dts -O dtb ~/test.dts -o ~/test.dtb | |
# Replace the old DTB with the new one | |
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb | |
sudo reboot now |
I believe the Linux kernel version 6.6 made the script incompatible. The following kernel version was working for me 1 week ago:
user@raspberrypi5: $ uname -r
6.1.0-rpi7-rpi-v8
If anyone knows how to downgrade the Raspberry Pi 5 kernel please let me know at the forked gist.
Thank you.
Hello, does anyone know of any rpi HAT that can provide two pcie slots. One for the coral M2 and the other for a NVME? thanks
I've been fiddling and managed to get this working on the Linux pi5 6.6.20+rpt-rpi-v8 kernel. Instead of using the value <0x66> I used <0x67> which matches the phandle value (which was previsouly <0x66> and now it works. So to be clear for the 6.6 kernal the change is:
msi-parent=<0x2c> should be changed to msi-parent=<0x67>
Thank you very much It worked for me too...
@ezaul did you install the drivers (especially Gasket) before your Pi upgraded the kernel?
I'm struggling with gasket-dkms installation failures.
@Jumble0470 you mention updated versions, can you provide a link.
Setting up gasket-dkms (1.0-18) ...
Loading new gasket-1.0 DKMS files...
Deprecated feature: REMAKE_INITRD (/usr/src/gasket-1.0/dkms.conf)
Building for 6.6.20+rpt-rpi-2712 6.6.20+rpt-rpi-v8
Building initial module for 6.6.20+rpt-rpi-2712
Deprecated feature: REMAKE_INITRD (/var/lib/dkms/gasket/1.0/source/dkms.conf)
Error! Bad return status for module build on kernel: 6.6.20+rpt-rpi-2712 (aarch64)
Consult /var/lib/dkms/gasket/1.0/build/make.log for more information.
dpkg: error processing package gasket-dkms (--configure):
installed gasket-dkms package post-installation script subprocess returned error exit status 10
Processing triggers for man-db (2.11.2-2) ...
Errors were encountered while processing:
gasket-dkms
E: Sub-process /usr/bin/dpkg returned an error code (1)
askpatrickw
Hi askpatrickw
Sorry friend, I don't use gasket-dkms, I ended up here on Google search with the same problem that you have to change rasp's dtb
What I use is
HatDrive!
SATA Controller: ASMedia Technology Inc. Device 1064 (rev 02) (prog-if 01 [AHCI 1.0]
that to work it needs to change
Change the line: msi-parent = <0x2c>; (under pcie@110000
)
To: msi-parent = <0x67>;
Then save the file.
Quick update - The issue was with the MPW7 hat. I switched to a Pineberry Pi base and I now have the apex_0 device.
Hi, have you managed to make the MPW7 work?
Hello, does anyone know of any rpi HAT that can provide two pcie slots. One for the coral M2 and the other for a NVME? thanks
Confirming that the MPW7 hat does not work. The TPU appears at first but after installing the driver it disappears. The Pineberry Pi AI hat works.
@Gus1994 @dataslayermedia @askpatrickw @ezaul i am getting this error
mv: failed to preserve ownership for '/boot/firmware/bcm2712-rpi-5-b.dtb': Operation not permitted
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
can someone please help me i have a project and my Raspberry pi is not able to recognize the peripheral device
mv: failed to preserve ownership for '/boot/firmware/bcm2712-rpi-5-b.dtb': Operation not permitted sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
It's just saying it had to change permissions while moving the file. If you check the destination folder it should be there.
@mjforan but the problem is that i cannot check the destination folder as it is not even a folder rather its a device tree file in which made changes
these are the commands that i followed
sudo cp /boot/firmware/bcm2712-rpi-5-b.dtb /boot/firmware/bcm2712-rpi-5-b.dtb.bak
Decompile the DTB into a Device Tree Source (DTS) file for editing
- Ignore any warnings during decompilation
sudo dtc -I dtb -O dts /boot/firmware/bcm2712-rpi-5-b.dtb -o ~/test.dts
Modify the Device Tree Source
Replace 'msi-parent' value to change the Message Signaled Interrupts (MSI) parent setting
sudo sed -i '/pcie@110000 {/,/msi-parent = <0x2[fc]>;/{s/<0x2f>/<0x66>/; s/<0x2c>/<0x66>/}' ~/test.dts
Recompile the DTS back into a DTB
sudo dtc -I dts -O dtb ~/test.dts -o ~/test.dtb
Replace the old DTB with the new one
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
now the problem is that it is still not recognizing my TPU
and i have made changes of 67 instead of 66 as said above
the script is also outdated if you can tell me your way of recognizing if you can for pineberry
as one of my friends had a NVME base and a M B/E key it worked fine for him just using the offical coral documentation but for me who has the "official pineberry stuff" it is not working i have even contacted the pineberry customer care they gave me link to this git repo
if someone can please HELPPPPP!!!!!!!!!!!!!!!!!!
@ChetanKukreja
the problem is that i cannot check the destination folder as it is not even a folder rather its a device tree file in which made changes
You are using the mv
command, which takes two arguments. The first argument is the source path and the second is the destination. You can use the ls
command on the destination path to verify the file was moved correctly.
Did you reboot after applying these changes? Did you verify you are running the correct kernel? Have you installed the driver packages? Does the device show at all in lspci
?

@ChetanKukreja
You must think for yourself a little my friend. You can see in that image that the file you moved is there in the correct place.
Line 27 of the gist shows how to set the correct kernel version, and it can be verified by uname -r
, making sure -v8 is at the end.
The TPU device does not show up in your lspci
output. Make sure the hardware is connected properly.
@mjforan i will tell you in detail what i did till now and what is my terminal i am on
Linux raspberrypi 6.6.20+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 GNU/Linux
i followed the following commands
sudo apt-get install vim curl wget -y
Add the Google Coral Edge TPU repository to the system's source list
This repository contains packages specifically for the Coral Edge TPU
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
Download and add the Google GPG key to the system
This key is used to ensure the integrity and authenticity of the packages
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
Update the package lists for packages that need upgrading, as well as new packages that have just come to the repositories
sudo apt-get update
and then when it came to gasket it showed error so i installed gasket from a forum i found https://forum.proxmox.com/threads/update-error-with-coral-tpu-drivers.136888/#post-608975
using this i did install the gasket file also the libedgetpu1
now i followed this command
echo "kernel=kernel8.img" | sudo tee -a /boot/config.txt
but on opening found that /boot/config.txt is moved to /boot/firmware/config.txt
so made changes in that also
i added this from the jeffgerling blog
dtparam=pciex1
dtparam=pciex1_gen=2
now i executed the following commands sudo cp /boot/firmware/bcm2712-rpi-5-b.dtb /boot/firmware/bcm2712-rpi-5-b.dtb.bak
Decompile the current dtb (ignore warnings)
dtc -I dtb -O dts /boot/firmware/bcm2712-rpi-5-b.dtb -o ~/test.dts
and made changes to test.dtb
instead of 66 made it 67
then followed the following command
dtc -I dts -O dtb ~/test.dts -o ~/test.dtb
sudo mv ~/test.dtb /boot/firmware/bcm2712-rpi-5-b.dtb
after that i dont get a coral device
@ChetanKukreja
How is the coral device connected to your raspberry pi?
@mjforan
as you see the hat is getting power
@ChetanKukreja Looks ok to me. I suggest creating a help post somewhere else (stack overflow, raspberry pi forum, etc.) because this gist is not an appropriate place for extensive debugging help.
For any others experiencing the same issues I had, this helped:
google-coral/edgetpu#808 (comment)
For reference:
I followed Reddimus' guide.
I am on kernel 6.6.20 using the PineberryPi HatDrive! AI.
My issue was that my accelerator wasn't found (solved this using the aforementioned msi-parent = <0x67>).
My next issue was that gasket-dkms package would not correctly install.
What finally worked for me was the following from google-coral/edgetpu issue #808 as follows:
sudo apt update sudo apt upgrade sudo apt install devscripts debhelper -y
Then clone and the rest
❯ git clone https://github.com/google/gasket-driver.git Cloning into 'gasket-driver'... ... ❯ cd gasket-driver; debuild -us -uc -tc -b; cd .. ... dpkg-deb: building package 'gasket-dkms' in '../gasket-dkms_1.0-18_all.deb'. ... ❯ ls -l gasket-dkms* -rw-r--r-- 1 dewet dewet 49000 Jan 17 13:17 gasket-dkms_1.0-18_all.deb -rw-r--r-- 1 dewet dewet 1788 Jan 17 13:18 gasket-dkms_1.0-18_amd64.build -rw-r--r-- 1 dewet dewet 5642 Jan 17 13:17 gasket-dkms_1.0-18_amd64.buildinfo -rw-r--r-- 1 dewet dewet 1017 Jan 17 13:17 gasket-dkms_1.0-18_amd64.changes
You can install that
.deb
on any systems that need to build the kernel module, and it will be rebuilt automatically with newer kernel packages being installed:❯ sudo dpkg -i gasket-dkms_1.0-18_all.deb ... Setting up gasket-dkms (1.0-18) ... ... Building for 6.5.0-14-generic Building initial module for 6.5.0-14-generic ... depmod... Time: 0h:00m:10s ❯ sudo modprobe apex ❯ lsmod | grep apex apex 28672 0 gasket 135168 1 apex
Hope this also helps others in the same boat!
Had to change line #29 to:
echo "kernel=kernel8.img" | sudo tee -a /boot/firmware/config.txt
Had to change line #29 to:
echo "kernel=kernel8.img" | sudo tee -a /boot/firmware/config.txt
Good catch for Raspbian OS latest on the RPI 5.
cat /boot/config.txt
DO NOT EDIT THIS FILE
The file you are looking for has moved to /boot/firmware/config.txt
Yeaha! I have the Dual TPU Running at the AI Hat with bigs
thank you @feranick feranick GH Page and thank you @dataslayermedia for this script
a few changes at RPi5:
Linux escapepod 6.6.20+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 GNU/Linux
echo "kernel=kernel8.img" | sudo tee -a /boot/firmware/config.txt
echo "dtparam=pciex1" | sudo tee -a /boot/firmware/config.txt
echo "pciex1_gen=3" | sudo tee -a /boot/firmware/config.txt
Maybe this is possible in an Onliner
change dts stuff, thanks at @ChetanKukreja
sudo sed -i '/pcie@110000 {/,/msi-parent = <0x2[fc]>;/{s/<0x2f>/<0x67>/; s/<0x2c>/<0x67>/}' ~/test.dts
Python Modules @ Python 3.11:
- numpy 1.26.4
- pillow 10.3.0
- pycoral 0.2.0 from Feranick/pycoral
python -c "import pycoral; print(pycoral.__version__)"
2.0.1
- FFLite-runtime from Feranick/TFlite-builds
python -c "import tflite_runtime; print(tflite_runtime.__version__)"
2.16.1
i ve init my project with rye my pyproject.toml is like this
[project]
name = "coral-t"
version = "0.1.0"
description = "Add your description here"
dependencies = [
"tflite-runtime @ https://github.com/feranick/TFlite-builds/releases/download/v.2.16.1/tflite_runtime-2.16.1-cp311-cp311-linux_aarch64.whl",
"pycoral @ https://github.com/feranick/pycoral/releases/download/v2.0.1TF2.16.1/pycoral-2.0.1-cp311-cp311-linux_aarch64.whl",
]
readme = "README.md"
requires-python = ">= 3.11"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.rye]
managed = true
dev-dependencies = []
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["src/coral_t"]
Output:
(coral-t) ➜ coral_t git:(master) ✗ python3 examples/classify_image.py
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
--labels test_data/inat_bird_labels.txt
--input test_data/parrot.jpg
----Debug2----
test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
12.9ms
2.7ms
2.7ms
2.7ms
2.7ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.75781
Next question is. How can i add the second tpu. I have an Dual TPU M2 Card but can only find /dev/apex_0
@dasTholo The Pi 5 only exposes one PCIe lane so you will need a HAT to multiplex both devices over the single lane. I don't think there are any dual-lane E HATs yet, but Pineberry Pi does make dual-slot HATs. You might be able to install two single-TPU devices, one A+E and one B+M key.
@mjforan
That is sad. I didn't know that. I had specially ordered the DualTPU. But I don't quite understand (I haven't found any other docs on this yet) how you can address both TPUs on an x86, for example. As they are both on the same PCIe port.
I have the Pineberry with M-Key and E-Key
https://pineberrypi.com/products/hatdrive-ai-nvme-2230-2242-gen-2-coral-edge-tpu-for-raspberry-pi-5
If I understand you correctly, then I could put another TPU in the other slot? This one here?
https://coral.ai/products/m2-accelerator-bm/
@dasTholo the m.2 specification is not just a single PCIe "port", but has many different configurations. The "key" is the shape of the connector. The A+E variant of the coral can plug in to the E key port on a computer which is commonly used for WiFi cards while the B+M variant can use the M key port typically used for SSDs. On the dual TPU version there are two separate PCIe devices, each of which requires a separate x1 PCIe interface (x1 means one lane). Even on larger computers, many E-key ports only have one PCIe interface - the coral page you linked to notes:
Although the M.2 Specification (section 5.1.2) declares E-key sockets provide two instances of PCIe x1, most manufacturers provide only one. To use both Edge TPUs, be sure your socket connects both instances to the host.
If I understand you correctly, then I could put another TPU in the other slot? This one here? https://coral.ai/products/m2-accelerator-bm/
Exactly. You will need to cut down the TPU to get it to fit (it is designed to do that). I can't personally guarantee that this will work - you might want to ask Pineberry Pi before buying another TPU. Let us know if it does work out for you!
@mjforan That is sad. I didn't know that. I had specially ordered the DualTPU. But I don't quite understand (I haven't found any other docs on this yet) how you can address both TPUs on an x86, for example. As they are both on the same PCIe port.
I have the Pineberry with M-Key and E-Key https://pineberrypi.com/products/hatdrive-ai-nvme-2230-2242-gen-2-coral-edge-tpu-for-raspberry-pi-5
If I understand you correctly, then I could put another TPU in the other slot? This one here? https://coral.ai/products/m2-accelerator-bm/
The dual TPU requires special considerations you need a specific adapter as well as a motherboard that will allow it. Magic Blue Smoke makes available a range of such adapters here.
But getting it to work on a Raspberry Pi 5 introduces yet another obstacle you would need a PCIe expansion slot and even then it's likely the motherboard will only make one TPU available. But I will try that soon to determine if it works.
I fixed the script as of April 7th, it looks like the gasket package now needs some finessing to work on the RPI. But the latest revision worked for me.
I've been fiddling and managed to get this working on the Linux pi5 6.6.20+rpt-rpi-v8 kernel. Instead of using the value <0x66> I used <0x67> which matches the phandle value (which was previsouly <0x66> and now it works. So to be clear for the 6.6 kernal the change is:
msi-parent=<0x2c> should be changed to msi-parent=<0x67>