embedded-deck
TEKNİK REHBER GÖMÜLÜ LİNUX BUILDROOT BSP 2026

Buildroot Custom Board BSP
External tree ile tam özelleştirme.

BR2_EXTERNAL konseptinden custom board defconfig'e, kernel config fragment'larından rootfs overlay'e, özel paket ekleme kurallarından genimage ile disk imajı üretimine ve Raspberry Pi CM4 için tam BSP oluşturmaya kadar Buildroot BSP geliştirmenin eksiksiz rehberi.

00 External tree konsepti

BR2_EXTERNAL, board/paket/konfigürasyon dosyalarını Buildroot kaynak ağacından tamamen bağımsız bir dizinde tutmanızı sağlar. Buildroot sürümünü güncellemek board özelleştirmelerini etkilemez.

Dizin yapısı

my-bsp/                         ← BR2_EXTERNAL root
├── Config.in                   ← menü entrypoint (zorunlu)
├── external.mk                 ← paket include (zorunlu)
├── external.desc               ← isim ve açıklama (zorunlu)
│
├── configs/
│   └── myboard_defconfig       ← board defconfig
│
├── board/
│   └── myboard/
│       ├── genimage.cfg        ← disk imaj tanımı
│       ├── linux.config        ← kernel config (isteğe bağlı)
│       ├── linux-fragments/    ← kernel config fragment'ları
│       │   ├── base.config
│       │   └── myboard.config
│       ├── post-build.sh       ← rootfs tamamlandıktan sonra
│       ├── post-image.sh       ← imaj oluşturulduktan sonra
│       └── rootfs_overlay/     ← rootfs üzerine kopyalanır
│           ├── etc/
│           └── usr/
│
└── package/
    └── mypackage/
        ├── Config.in           ← Kconfig menü entry
        └── mypackage.mk        ← derleme tarifi
    

external.desc ve temel dosyalar

# external.desc — zorunlu
cat my-bsp/external.desc
# name: MY_BSP
# desc: Custom BSP for MyBoard

# Config.in — zorunlu (paketlerin Kconfig entry'leri dahil edilir)
cat my-bsp/Config.in
# source "$BR2_EXTERNAL_MY_BSP_PATH/package/mypackage/Config.in"

# external.mk — zorunlu (paket makefile'ları dahil edilir)
cat my-bsp/external.mk
# include $(sort $(wildcard $(BR2_EXTERNAL_MY_BSP_PATH)/package/*/*.mk))

Build ile bağlama

# Buildroot'u klonla
git clone https://git.buildroot.net/buildroot --branch 2024.02
cd buildroot

# External tree ile yapılandır
make BR2_EXTERNAL=/path/to/my-bsp myboard_defconfig

# veya birden fazla external tree
make BR2_EXTERNAL="/path/to/my-bsp:/path/to/other-ext" myboard_defconfig

# Konfigürasyon menüsü
make BR2_EXTERNAL=/path/to/my-bsp menuconfig

# Build
make -j$(nproc)

01 Board defconfig

Board defconfig, hedef board için tüm Buildroot seçeneklerini içeren tam konfigürasyon dosyasıdır. Toolchain, kernel, bootloader, rootfs formatı ve paket seçimleri burada yapılır.

Temel defconfig yapısı

cat my-bsp/configs/myboard_defconfig

# ─── Toolchain ───────────────────────────────────────
BR2_aarch64=y                         # ARM64 hedef
BR2_TOOLCHAIN_BUILDROOT_MUSL=y        # musl libc (küçük)
# veya glibc:
# BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
BR2_GCC_VERSION_13_X=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y         # C++ desteği

# External toolchain:
# BR2_TOOLCHAIN_EXTERNAL=y
# BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/poky/sysroots/x86_64-pokysdk-linux/usr"
# BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y

# ─── Kernel ──────────────────────────────────────────
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_VERSION=y
BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.6.30"
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux.config"
BR2_LINUX_KERNEL_IMAGE_TARGET_NAME="Image"     # ARM64 kernel image
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="myboard"

# ─── U-Boot ──────────────────────────────────────────
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="myboard"
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2024.04"

# ─── Rootfs formatları ───────────────────────────────
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
BR2_TARGET_ROOTFS_SQUASHFS=y          # Read-only

# ─── Post-build ve overlay ───────────────────────────
BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/rootfs_overlay"
BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/post-image.sh"

# ─── Paketler ────────────────────────────────────────
BR2_PACKAGE_BUSYBOX=y
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_MYPACKAGE=y

Defconfig kaydetme ve güncelleme

# Değişiklikleri defconfig'e kaydet
make savedefconfig BR2_DEFCONFIG=../my-bsp/configs/myboard_defconfig

# Mevcut defconfig'i yükle
make myboard_defconfig

# Farkları göster
make diffconfig

02 Custom Linux kernel config

Kernel konfigürasyonu tam config dosyası veya daha esnek olan config fragment sistemi ile yönetilebilir. Fragment'lar, temel defconfig üzerine küçük değişiklikler uygulamayı kolaylaştırır.

Config fragment yaklaşımı

# defconfig'de fragment listesi
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="\
    $(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux-fragments/base.config \
    $(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/linux-fragments/myboard.config"

# base.config — genel gömülü Linux ayarları
cat my-bsp/board/myboard/linux-fragments/base.config
# CONFIG_PROC_FS=y
# CONFIG_SYSFS=y
# CONFIG_DEVTMPFS=y
# CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_NET=y
# CONFIG_UNIX=y
# # Gereksiz olanları kapat:
# # CONFIG_SOUND is not set
# # CONFIG_USB_SUPPORT is not set

# myboard.config — board'a özgü sürücüler
cat my-bsp/board/myboard/linux-fragments/myboard.config
# # Board'a özgü sürücüler
# CONFIG_MXC_SPI=y
# CONFIG_I2C_IMX=y
# CONFIG_SERIAL_IMX=y
# CONFIG_MMC=y
# CONFIG_MMC_SDHCI=y
# CONFIG_MMC_SDHCI_ESDHC_IMX=y

Fragment merge mekanizması

# Buildroot, kernel defconfig'i şu şekilde merge eder:
# 1. arch/arm64/configs/imx8mp_evk_defconfig yükle
# 2. Her fragment dosyasını scripts/kconfig/merge_config.sh ile uygula

# Manuel test:
cd /path/to/linux-src
scripts/kconfig/merge_config.sh \
    arch/arm64/configs/imx8mp_evk_defconfig \
    /path/to/my-bsp/board/myboard/linux-fragments/base.config \
    /path/to/my-bsp/board/myboard/linux-fragments/myboard.config

# Sonuç kernel .config dosyasını kontrol et
grep "CONFIG_MMC_SDHCI" .config

Kernel menuconfig ile etkileşimli düzenleme

# Buildroot üzerinden kernel menuconfig
make linux-menuconfig

# Değişiklikleri kaydet
make linux-update-defconfig
# veya direkt fragment'a ekle

# Kernel rebuild (sadece kernel)
make linux-rebuild
make linux-rebuild all   # + imaj yeniden oluştur

03 Board support dosyaları

Post-build/post-image scriptleri ve rootfs overlay, board'a özgü özelleştirmelerin ana mekanizmalarıdır. Bu scriptler build sürecinin belirli aşamalarında otomatik çalışır.

Rootfs overlay

# Overlay yapısı — doğrudan rootfs üzerine kopyalanır
my-bsp/board/myboard/rootfs_overlay/
├── etc/
│   ├── hostname              ← "myboard"
│   ├── network/
│   │   └── interfaces        ← statik IP konfigürasyonu
│   ├── inittab               ← özel init konfigürasyonu
│   └── myapp.conf            ← uygulama konfigürasyonu
├── usr/
│   └── share/
│       └── myapp/
│           └── data/
└── lib/
    └── firmware/
        └── myboard.fw        ← board firmware

# /etc/hostname içeriği:
echo "myboard" > my-bsp/board/myboard/rootfs_overlay/etc/hostname

post-build.sh — rootfs tamamlandıktan sonra

cat my-bsp/board/myboard/post-build.sh
#!/bin/bash
set -e

TARGET_DIR=$1    # Buildroot bunu otomatik geçirir

echo "=== post-build.sh: $TARGET_DIR ==="

# Sürüm bilgisini rootfs'e yaz
echo "MyBoard BSP v1.0 ($(date +%Y%m%d))" \
    > "$TARGET_DIR/etc/myboard-version"

# Gereksiz dosyaları temizle (boyut küçültme)
rm -rf "$TARGET_DIR/usr/share/doc"
rm -rf "$TARGET_DIR/usr/share/man"
find "$TARGET_DIR" -name "*.a" -delete   # static kütüphaneler

# Binary'leri strip et
find "$TARGET_DIR/usr/bin" -type f \
    -exec $HOST_DIR/bin/aarch64-linux-strip --strip-unneeded {} \; 2>/dev/null || true

# Init script izinleri
chmod +x "$TARGET_DIR/etc/init.d/S99myapp" 2>/dev/null || true

post-image.sh — imaj oluşturulduktan sonra

cat my-bsp/board/myboard/post-image.sh
#!/bin/bash
set -e

BINARIES_DIR=$1
BOARD_DIR="$(dirname $0)"

echo "=== post-image.sh: $BINARIES_DIR ==="

# genimage ile SD kart imajı oluştur
GENIMAGE_CFG="$BOARD_DIR/genimage.cfg"
GENIMAGE_TMP="$BUILD_DIR/genimage.tmp"

rm -rf "$GENIMAGE_TMP"
genimage \
    --rootpath "$TARGET_DIR" \
    --tmppath  "$GENIMAGE_TMP" \
    --inputpath "$BINARIES_DIR" \
    --outputpath "$BINARIES_DIR" \
    --config "$GENIMAGE_CFG"

echo "SD kart imajı: $BINARIES_DIR/sdcard.img"
ls -lh "$BINARIES_DIR/sdcard.img"

04 Custom package ekleme

Buildroot paket sistemi, otomatik araçlar (autotools), CMake ve manuel derleme desteği sunar. Her paket bir Config.in (Kconfig menü) ve bir .mk (derleme tarifi) dosyasından oluşur.

Config.in — Kconfig menü entry

cat my-bsp/package/mypackage/Config.in

config BR2_PACKAGE_MYPACKAGE
    bool "mypackage"
    depends on BR2_PACKAGE_LIBSOMELIB
    select BR2_PACKAGE_LIBJSON_C
    help
      MyPackage — Gömülü sistem yönetim uygulaması.

      Bu paket cihaz durumunu izler ve MQTT üzerinden
      rapor eder.

      https://github.com/example/mypackage

Autotools paketi (.mk)

cat my-bsp/package/mypackage/mypackage.mk

MYPACKAGE_VERSION  = 1.2.3
MYPACKAGE_SITE     = https://github.com/example/mypackage/archive
MYPACKAGE_SOURCE   = v$(MYPACKAGE_VERSION).tar.gz
MYPACKAGE_LICENSE  = MIT
MYPACKAGE_LICENSE_FILES = LICENSE

# Bağımlılıklar (Config.in'deki select/depends ile örtüşmeli)
MYPACKAGE_DEPENDENCIES = libjson-c mosquitto

# Autotools configure seçenekleri
MYPACKAGE_CONF_OPTS = \
    --enable-mqtt \
    --disable-tests \
    --with-json=$(STAGING_DIR)/usr

# Ek kurulum adımı
define MYPACKAGE_INSTALL_INIT_SYSV
    $(INSTALL) -m 0755 $(MYPACKAGE_PKGDIR)/S99mypackage \
        $(TARGET_DIR)/etc/init.d/S99mypackage
endef

MYPACKAGE_POST_INSTALL_TARGET_HOOKS += MYPACKAGE_INSTALL_INIT_SYSV

$(eval $(autotools-package))

CMake paketi (.mk)

MYAPP_VERSION  = 2.0.0
MYAPP_SITE     = https://github.com/example/myapp/archive
MYAPP_SOURCE   = $(MYAPP_VERSION).tar.gz
MYAPP_LICENSE  = Apache-2.0

MYAPP_CONF_OPTS = \
    -DBUILD_TESTS=OFF \
    -DENABLE_OPTIMIZATION=ON \
    -DTARGET_PLATFORM=embedded

$(eval $(cmake-package))

Manuel paket (.mk)

MYBARE_VERSION = 1.0
MYBARE_SITE    = $(BR2_EXTERNAL_MY_BSP_PATH)/src/mybare
MYBARE_SITE_METHOD = local

define MYBARE_BUILD_CMDS
    $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
endef

define MYBARE_INSTALL_TARGET_CMDS
    $(INSTALL) -D -m 0755 $(@D)/mybare \
        $(TARGET_DIR)/usr/bin/mybare
    $(INSTALL) -D -m 0644 $(@D)/mybare.conf \
        $(TARGET_DIR)/etc/mybare.conf
endef

$(eval $(generic-package))

05 Bootloader entegrasyonu

U-Boot, Buildroot ile entegre edilebilir. Custom board için U-Boot defconfig, SPL (Secondary Program Loader) ve platform spesifik yapılandırma adımları.

U-Boot defconfig entegrasyonu

# Buildroot defconfig içinde
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_VERSION=y
BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2024.04"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="imx8mp_evk"   # configs/imx8mp_evk_defconfig

# Custom U-Boot konfigürasyonu için:
BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES=\
"$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/uboot-fragment.config"

# SPL desteği
BR2_TARGET_UBOOT_SPL=y
BR2_TARGET_UBOOT_SPL_NAME="spl/u-boot-spl.bin"

# Çıktı dosyaları
BR2_TARGET_UBOOT_FORMAT_BIN=y          # u-boot.bin
BR2_TARGET_UBOOT_FORMAT_IMX=y          # u-boot.imx (i.MX6/7/8)

uboot-fragment.config

cat my-bsp/board/myboard/uboot-fragment.config

# Önyükleyici konfigürasyon override'ları
CONFIG_SYS_TEXT_BASE=0x40200000
CONFIG_BOOTDELAY=3
CONFIG_BOOTCOMMAND="run myboard_boot"

# Ortam değişkeni özelleştirme
CONFIG_EXTRA_ENV_SETTINGS="myboard_boot=load mmc 0:1 ${kernel_addr_r} Image && booti\0"

# eMMC desteği
CONFIG_CMD_MMC=y
CONFIG_MMC_SDHCI=y

# TFTP boot (geliştirme)
CONFIG_CMD_NET=y
CONFIG_CMD_TFTP=y

U-Boot özelleştirme

# U-Boot menuconfig
make uboot-menuconfig

# Değişiklikleri kaydet
make uboot-update-defconfig

# Sadece U-Boot rebuild
make uboot-rebuild

# ATF (Arm Trusted Firmware) entegrasyonu (ARM64 için zorunlu)
BR2_TARGET_ARM_TRUSTED_FIRMWARE=y
BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y
BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE="v2.10"
BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM="imx8mp"
BR2_TARGET_ARM_TRUSTED_FIRMWARE_FIP=y

06 Device tree entegrasyonu

Buildroot, kernel ağaç içi DTS dosyalarını ve custom DTS dosyalarını derler. DTS overlay'leri ile base board DTS'ini değiştirmeden uzantı eklenebilir.

Kernel ağaç içi DTS

# Defconfig'de DTS seçimi
BR2_LINUX_KERNEL_DTS_SUPPORT=y
# Birden fazla DTS (boşlukla ayrılmış)
BR2_LINUX_KERNEL_INTREE_DTS_NAME="imx8mp-evk imx8mp-myboard"

# Kernel kaynak içindeki DTS yolu:
# arch/arm64/boot/dts/freescale/imx8mp-myboard.dts

External (custom) DTS

# Defconfig'de
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH=\
"$(BR2_EXTERNAL_MY_BSP_PATH)/board/myboard/dts/imx8mp-myboard.dts"

# Custom DTS dosyası
cat my-bsp/board/myboard/dts/imx8mp-myboard.dts
# /dts-v1/;
# #include "imx8mp.dtsi"
#
# / {
#     model = "MyBoard i.MX8M Plus";
#     compatible = "mycompany,myboard", "fsl,imx8mp";
#
#     chosen {
#         bootargs = "console=ttymxc1,115200 rootwait";
#     };
# };
#
# &uart2 { status = "okay"; };
# &ecspi1 { status = "okay"; };

DTS overlay

# Overlay ile base DTS'i değiştir
cat my-bsp/board/myboard/dts/myboard-spi-sensor.dts

# /dts-v1/;
# /plugin/;
#
# &spi0 {
#     sensor@0 {
#         compatible = "mycompany,mysensor";
#         reg = <0>;
#         spi-max-frequency = <1000000>;
#         status = "okay";
#     };
# };

# DTS overlay derleme
BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT=y

# Overlay derle + uygula:
# post-build.sh içinde:
dtc -I dts -O dtb \
    -o $BINARIES_DIR/myboard-spi-sensor.dtbo \
    $BOARD_DIR/dts/myboard-spi-sensor.dts

07 genimage ile disk imajı

genimage, birden fazla partition ve dosya sistemi içeren disk imajları (SD kart, eMMC) oluşturur. post-image.sh'den çağrılır.

genimage.cfg — SD kart düzeni

cat my-bsp/board/myboard/genimage.cfg

image boot.vfat {
    vfat {
        files = {
            "Image",              # Kernel (ARM64)
            "imx8mp-myboard.dtb", # Device tree
            "u-boot.imx"          # Bootloader (bazı platformlar)
        }
    }
    size = 64M
}

image rootfs.ext4 {
    ext4 {
        label = "rootfs"
    }
    size = 256M
    # Buildroot rootfs.ext2 çıktısını kullanır
}

image sdcard.img {
    hdimage {
        partition-table-type = "mbr"
    }

    partition mbr {
        # MBR signature — i.MX8 için
        image = "u-boot-with-spl.imx"
        offset = 33K
        size   = 1M
    }

    partition boot {
        partition-type = 0x0C   # FAT32
        bootable = true
        image = "boot.vfat"
        offset = 8M
        size   = 64M
    }

    partition rootfs {
        partition-type = 0x83   # Linux
        image = "rootfs.ext4"
        offset = 72M
    }
}

eMMC için özel düzen

image emmc.img {
    hdimage {
        partition-table-type = "gpt"
    }

    partition boot-a {
        partition-type-uuid = "linux-boot"
        image = "boot.vfat"
        offset = 1M
        size   = 128M
    }

    partition boot-b {
        partition-type-uuid = "linux-boot"
        image = "boot.vfat"
        offset = 129M
        size   = 128M
    }

    partition rootfs-a {
        partition-type-uuid = "linux-data"
        image = "rootfs.ext4"
        offset = 257M
        size   = 512M
    }

    partition rootfs-b {
        partition-type-uuid = "linux-data"
        image = "rootfs.ext4"
        offset = 769M
        size   = 512M
    }

    partition data {
        partition-type-uuid = "linux-data"
        offset = 1281M
        # boyut: kalan alan
    }
}

SD karta yazma

# İmajı SD karta yaz
sudo dd if=output/images/sdcard.img \
    of=/dev/sdX \
    bs=4M status=progress conv=fsync

# veya bmaptool (çok daha hızlı — sadece yazılı bloklar)
sudo bmaptool copy --bmap output/images/sdcard.img.bmap \
    output/images/sdcard.img /dev/sdX

08 Pratik: Raspberry Pi CM4 için tam custom Buildroot BSP

Raspberry Pi Compute Module 4 için kernel + bootloader + rootfs + imaj üretecek tam bir Buildroot BSP kurulumu, adım adım.

Adım 1: External tree iskeletini oluştur

mkdir -p rpi-cm4-bsp/{configs,board/rpi-cm4/{linux-fragments,rootfs_overlay/etc},package}

# Zorunlu dosyalar
cat > rpi-cm4-bsp/external.desc <<'EOF'
name: RPI_CM4_BSP
desc: Raspberry Pi Compute Module 4 BSP
EOF

cat > rpi-cm4-bsp/Config.in <<'EOF'
source "$BR2_EXTERNAL_RPI_CM4_BSP_PATH/package/rpi-cm4-app/Config.in"
EOF

cat > rpi-cm4-bsp/external.mk <<'EOF'
include $(sort $(wildcard $(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/package/*/*.mk))
EOF

Adım 2: Board defconfig

cat > rpi-cm4-bsp/configs/rpi_cm4_defconfig <<'EOF'
# Architecture
BR2_aarch64=y

# Toolchain — external ARM64
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_ARM_AARCH64=y

# Raspberry Pi özel kernel
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_GIT=y
BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/raspberrypi/linux"
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="rpi-6.6.y"
BR2_LINUX_KERNEL_DEFCONFIG="bcm2711"
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\
"$(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/board/rpi-cm4/linux-fragments/cm4.config"
BR2_LINUX_KERNEL_IMAGE_TARGET_NAME="Image"
BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2711-rpi-cm4"

# Raspberry Pi bootloader (firmware)
BR2_PACKAGE_RPI_FIRMWARE=y
BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI4=y

# Rootfs
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="512M"

# Overlay ve scriptler
BR2_ROOTFS_OVERLAY=\
"$(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/board/rpi-cm4/rootfs_overlay"
BR2_ROOTFS_POST_BUILD_SCRIPT=\
"$(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/board/rpi-cm4/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT=\
"$(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/board/rpi-cm4/post-image.sh"
GENIMAGE_CFG=\
"$(BR2_EXTERNAL_RPI_CM4_BSP_PATH)/board/rpi-cm4/genimage.cfg"

# Paketler
BR2_PACKAGE_BUSYBOX=y
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_RPI_CM4_APP=y
EOF

Adım 3: CM4 kernel fragment

cat > rpi-cm4-bsp/board/rpi-cm4/linux-fragments/cm4.config <<'EOF'
# CM4 için ek konfigürasyonlar
CONFIG_USB_GADGET=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_RNDIS=y    # USB ethernet gadget
CONFIG_PCIE_BRCMSTB=y          # PCIe (NVMe boot)
CONFIG_SPI_BCM2835=y
CONFIG_I2C_BCM2835=y
EOF

Adım 4: genimage.cfg (SD/eMMC)

cat > rpi-cm4-bsp/board/rpi-cm4/genimage.cfg <<'EOF'
image boot.vfat {
    vfat {
        files = {
            "rpi-firmware/bootcode.bin",
            "rpi-firmware/fixup4.dat",
            "rpi-firmware/start4.elf",
            "rpi-firmware/bcm2711-rpi-cm4.dtb",
            "rpi-firmware/overlays",
            "Image",
            "config.txt",
            "cmdline.txt"
        }
    }
    size = 64M
}

image sdcard.img {
    hdimage {}

    partition boot {
        partition-type = 0x0C
        bootable = true
        image = "boot.vfat"
        size = 64M
    }

    partition rootfs {
        partition-type = 0x83
        image = "rootfs.ext4"
    }
}
EOF

Adım 5: Build ve flash

# Buildroot'u klonla ve yapılandır
git clone https://git.buildroot.net/buildroot --branch 2024.02
cd buildroot

make BR2_EXTERNAL=../rpi-cm4-bsp rpi_cm4_defconfig

# Build (ilk build ~30-60 dakika)
make -j$(nproc) 2>&1 | tee /tmp/build.log

# Çıktılar:
ls output/images/
# Image  bcm2711-rpi-cm4.dtb  boot.vfat  rootfs.ext4  sdcard.img

# SD karta yaz
sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress

# eMMC flash (rpiboot ile)
sudo rpiboot
sudo dd if=output/images/sdcard.img of=/dev/sdX bs=4M status=progress
ÖZET

BR2_EXTERNAL ile Buildroot kaynak ağacından tamamen bağımsız bir BSP tree oluşturulur. Board defconfig, kernel/U-Boot config fragment'ları, rootfs overlay, post-build/post-image scriptleri ve genimage.cfg kombinasyonu ile tam bir SD kart imajı üretilir. RPi CM4 için rpi-firmware paketi ve bcm2711 defconfig başlangıç noktasıdır.