Skip to content

nakerlund/YoctoRPI

Repository files navigation

Yocto för RPI

Detta VS Code projekt använder en Dev Container med byggverktyg för Yocto. För att ladda ner Yocto och allt som behövs används git verktyget repo. Repo använder ett manifest som beskriver git repon som ska hämtas.

I detta project hämtas:

  • poky: Grundläggande mall för Linux skapade med Yocto
  • OpenEmbedded: meta_openembedded, Byggsystemet för Yocto, ungefär som West är för Zephyr OS.
  • RaspberryPi: meta_raspberrupy, Hårdvarulager för RPI enheter

Yocto använder lager och detta project har meta-lager.

Steg för steg

1. Setup

Kör endast detta steg första gången.

Öppna bash i dev-containern och kör dessa kommandon rad för rad:

# Gå till yocto mappen
cd /yocto

# Använd repo för att lägga till git dependancies från manifestet 
repo init -u /yocto/project -m /yocto/project/default.xml

# Ladda ner git dependancies
repo sync

2. Starta byggmiljön

Detta steg måste göras varje gång man öppnar en ny terminal.

# Starta byggmiljön
source /yocto/sources/poky/oe-init-build-env /yocto/project

3. Bygg en egen Linux

Detta tar långt tid. Bitbake cachar bra så det gåt att avbryta med ctrl+c.

# Bygg en minimal Linux med Bitbake
bitbake -k core-image-minimal

4. Kör emulerat

QEMU finns med i Yocto: runqemu

nographic argumentent gör att qemu körs direkt i terminalen. För att avsluta tryck Ctrl + A följt av X. Alternativt Ctrl + A och C för att köra kommandot quit.

Utan nographic kan man öppna /dev/ttyS1 med Ctrl + Alt 2 på samma sätt som om man skulle ha anslutit via serie port: YouTube.

Lösenordet vid inloggning är root

# Kör bygget emulerat med Qemu
runqemu qemux86-64 nographic

5. Bygg för RPI

Enligt: meta-raspberrypi

# Bygg för rpi5 64bit
MACHINE=raspberrypi5 bitbake -k core-image-base

6. Skapa RPI SD kort

För att skriva till ett sdkort:

  • Skaffa programmet BalenaEtcher
  • Spara image från /yocto/tmp/deploy/images/raspberrypi5/core-image-base-raspberrypi5.rootfs.wic.bz2
  • Använd balenaEtcher för att skriva imagen till ett SDKort

Exempel recept med c program som körs med systemD

Receptet hello-world läggs till custom-distro och byggs när DISTRO=custom-distro.

Receptet har två filer:

I QEMU eller på en RPI kan du köra programmet:

# Kör programmet
hello-world

# Se information om tjänsten
systemctl status hello-world

# Starta tjänsten igen
systemctl start hell-world

# Se loggen för tjänsten
journalctl -u hello-world

Konfigurera kärnan

Testa köra menukonfig för att konfigurera kärnan enligt: https://github.com/bluez/bluez/wiki/test%E2%80%90runner

bitbake -c menuconfig virtual/kernel 

Övning 1

Skapa en egen SystemD som skickar http post anrop till t.ex webhook.site eller annan webhook testsida. Vill du använda någon mer avanserad tjänst för att koppla upp enheten t.ex. Leshan eller en MQTT broker direkt i docker-compose.yml så går det också utmärkt.

Skapa projekt på github med receptet och skicka in adressen som inlämning.

Lösningsförslag

Kopiera receptet hello-world till hello-internet

Ta bort c programmet hello-world och ändra systemD tjänsten så den heter hello-internet.service och postar data direkt med wget.

Övning 2, Bluetooth

Bygg yocto igen för att få med BlueZ stacken och kernel konfigurationen för att köra bluetooth.

Kör scripter rad för rad. Kopiera inte hela script.

Steg 1 - Starta QEMU

Det finns två alternativ för att köra detta.

Alternativ 1 - Bygg själv

Funkar inte detta så ladda ner en imagefil från Nackadmin och kör Alternativ 2.

# Bygg för custom-distro om det inte redan är satt i konfigurationen 
DISTRO=custom-distro bitbake -k core-image-base

Kör igång med egen image

# Kör qemu
runqemu qemux86-64 nographic

Alternativ 2 - Nedladdad image

Ladda ner image och packa up i projektets mapp.

# Kör qemu med imagen
runqemu qemux86-64 nographic /yocto/project/core-image-base-qemux86-64.rootfs.ext4

Du ska nu vara inne i QEMU emulatorn. Lösenord för inloggning är root.

För att avsluta QEMU tryck först CTRL + A sen X eller Forsätt med nästa steg.

Steg 2 - Starta Bluetooth

Du ska nu vara inne i QEMU emulatorn efter Steg 1.

Använd systemd:

# Kolla att "bluetooth" körs
systemctl status bluetooth

# Om inte, starta
systemctl start bluetooth

Steg 3 - Kolla loggar

Forsätt inne i QEMU efter Steg 2. Detta steg gör inget. Det bara kollar att allt fungerar.

# Kika i loggen för systemd tjänsten "bluetooth" med -u
journalctl -u bluetooth

# Kolla även i systemets logg med dmesg
# För att inte visa allt, pipa dmesg till grep med "-i bluetooth"
dmesg | grep -i bluetooth

Det bör inte ha funnits några fel i loggarna.

Steg 4 - Starta virtuella Bluetooth enheter

Forsätt inne i QEMU efter Steg 2 eller Steg 3

btvirt startar virtuella bluetoothenheter. Vi kör med BLE (Bluetooth LE (Low Energy)) som med i Bluetooth 4. Det finns också Bluetooth classic.

# btvirt är blockande och kommer att köras i "foreground" 
btvirt -U2

# Stoppa btvirt processen och flytta den bakgrunden
# Tryck: CTRL + Z

# Kolla att processen finns i bakgrunden
jobs

# Forsätt btvirt processen i bakgrunden
bg

# Kolla att btvirt körs i bakgrunden
jobs

Det är även möjligt att starta en process direkt i bakgrunden med t.ex: btvirt -U2 &.

Steg 5 - BluetoothCTL

I detta steg ska vi ansluta bluetooth enhterna till varandra. Kör vidare i QEMU

# Starta tmux
tmux

# Dela skärmen i två "panes"
# Tryck CTRL + B and then %

# Kör igång bluetoothCTL consollen
bluetoothctl

# Visa bluetooth enheterna
list
# Notera MAC adressen för enheten som inte är default

# Byt till andra sidan i tmux
# Tryck CTRL + B och sen →

# Öppna bluetoothctl på högra sidan
bluetoothctl

# Välj den andra MAC addressen (byt ut på raden nedan)
select 00:AA:01:00:00:01 

# Visa egenskaperna
show

# Hoppa tillbaka till första panelen
# Tryck CTRL + B och sen ←

# Visa egenskaperna i första panelen också
show

Du bör nu köra tmux med två paneler som kör bluetoothctl med en default BT controller var.

Steg 6 - Anslut enheterna till varandra

Fortsätt från steg 5.

Du kommer behöva hoppa mellan panelerna i tmux.

  1. Starta båda BT enheterna power on
  2. Starta den ena som discoverable (advertising) med discoverable on
    • Detta är peripheral enheten. Den än är even servern.
  3. Sök efter enheter med den andra: scan on
    • Detta är central enheten. Den är även klienten.
  4. Enheterna hittar varandra. Kan behövas omstart av systemet annars.
  5. Parkoppla med central enheten. Den som scannade. Kör: pair (MAC adress)
  6. Verifera parkopplingen. En fråga ska dyka upp.
  7. Lita på enheten med central enheten: trust (MAC adress)
  8. Anslut med central till peripheral: connect (MAC adress)

Här tar tyvärr linux delen av övningen slut då jag inte lyckas få de virtuella btvirt enheterna att ansluta till varandra. Någon som har någon idè varför?

Fortsätt gärna i python med Bleak på egna datorn om möjligt. Testa skapa en peripheral och en central.

Alternativt, hoppa över till Zephyr och Renode och gå igenom denna guide Developing and testing BLE products on nRF52840 in Renode and Zephyr. Använd gärna ZephyrDevContainer som bas för att bygga Zephyr samplen som föreslås i guiden.

Länkar

Webhooks

Yocto and Building

Youtube - Linux

Linux CLI Övningar

About

A yocto project for building a custom Linux for the Raspberry PI or QEMU

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published