meta-dcm/recipes-kernel/linux/linux-stm32mp-dcm_6.6.bb.ba...

246 lines
9.1 KiB
Plaintext

# Speichere diese Datei als:
# /home/mf/Yocto/DCM/layers/meta-dcm/recipes-kernel/linux/linux-stm32mp-dcm_6.6.bb
# Basiert auf dem ST-Kernel-Rezept
require recipes-kernel/linux/linux-stm32mp_6.6.bb
# Ändern Sie den Rezeptnamen, um Konflikte zu vermeiden
PN = "linux-stm32mp-dcm"
# Deaktiviere die separate Kernel-Module-Kompilierung
do_compile_kernelmodules[noexec] = "1"
# Deaktiviere Standard-Kernel-Install-Tasks die Probleme verursachen
do_install_append[noexec] = "1"
do_kernel_link_images[noexec] = "1"
# DCM-spezifische Anpassungen
# Pfad zu den Fragmenten und Patches
FILESEXTRAPATHS:prepend := "${THISDIR}/linux-stm32mp:"
SRC_URI += "file://fragment-01-dcm.config"
SRC_URI += "file://0002-fix-stm32-rifsc-debugfs.patch"
# Verwenden Sie die Standard-STM32-Konfiguration mit Ihrem Fragment
KERNEL_DEFCONFIG = "stm32_defconfig"
KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/fragment-01-dcm.config"
# Deaktiviere den separaten DTB-Build, der Probleme verursacht
KERNEL_DTB_LINK_NAME = ""
# Komplett deaktiviere die post-compile DTB-Verarbeitung
KERNEL_DEVICETREE = ""
KERNEL_DEVICETREE_BUNDLE = ""
STM32_KERNEL_DEVICETREE = ""
# Definiere beide Image-Typen für U-Boot-Kompatibilität
KERNEL_IMAGETYPE = "uImage"
KERNEL_IMAGETYPES = "zImage uImage"
# U-Boot-spezifische Parameter für uImage-Erstellung
UBOOT_ENTRYPOINT = "0xC2000040"
UBOOT_LOADADDRESS = "0xC2000040"
# Stelle sicher, dass U-Boot-Tools verfügbar sind
DEPENDS += "u-boot-tools-native"
# Überschreibe die problematische normalize_dtb-Funktion
normalize_dtb() {
bbplain "Überspringe normalize_dtb für DCM - DTB bereits erstellt"
# Tue nichts - DTB ist bereits von unserem do_compile erstellt
}
# Funktion zum Hinzufügen unserer DTS und aller benötigten DTSIs zum Kernel-Quellverzeichnis
do_prepare_dts() {
# Bestimme Kernel-Quellverzeichnis
KERNEL_SRC="${S}"
# Überprüfe die Verzeichnisstruktur
bbplain "Kernel-Quellverzeichnis: ${KERNEL_SRC}"
# Erstelle das ST-Verzeichnis im Kernel-Quellverzeichnis, falls es nicht existiert
mkdir -p ${KERNEL_SRC}/arch/arm/boot/dts/st
# Kopiere unsere DTS-Datei in das Kernel-Quellverzeichnis
if [ -f ${THISDIR}/linux-stm32mp/stm32mp157c-dcm.dts ]; then
bbplain "Kopiere DTS-Datei ins Kernel-Quellverzeichnis"
cp -f ${THISDIR}/linux-stm32mp/stm32mp157c-dcm.dts ${KERNEL_SRC}/arch/arm/boot/dts/st/
# Überprüfe, ob die DTS-Datei korrekt kopiert wurde
if [ -f "${KERNEL_SRC}/arch/arm/boot/dts/st/stm32mp157c-dcm.dts" ]; then
bbplain "DTS-Datei erfolgreich kopiert"
else
bbfatal "Fehler beim Kopieren der DTS-Datei"
fi
else
bbfatal "DTS-Datei nicht gefunden: ${THISDIR}/linux-stm32mp/stm32mp157c-dcm.dts"
fi
# Aktualisiere die Makefile, um unsere DTB-Datei einzuschließen
if [ -f ${KERNEL_SRC}/arch/arm/boot/dts/st/Makefile ]; then
if ! grep -q "stm32mp157c-dcm.dtb" ${KERNEL_SRC}/arch/arm/boot/dts/st/Makefile; then
bbplain "Füge stm32mp157c-dcm.dtb zur Makefile hinzu"
sed -i 's/stm32mp157c-dk2.dtb \\/stm32mp157c-dk2.dtb \\\n\tstm32mp157c-dcm.dtb \\/g' ${KERNEL_SRC}/arch/arm/boot/dts/st/Makefile
else
bbplain "stm32mp157c-dcm.dtb ist bereits in der Makefile enthalten"
fi
else
bbwarn "Makefile nicht gefunden im ST-Verzeichnis"
fi
}
# Führe die DTS-Vorbereitung nach dem Patchen aber vor der Konfiguration aus
addtask prepare_dts after do_patch before do_configure
# Explizite Abhängigkeiten definieren, um korrekte Ausführungsreihenfolge zu gewährleisten
do_configure[depends] += "${PN}:do_prepare_dts"
do_compile[depends] += "${PN}:do_configure"
do_compile[depends] += "${PN}:do_prepare_dts"
do_compile[depends] += "${PN}:do_patch"
# Korrigierte Python-Funktion
python () {
# Hier keine appendVarFlag für deps mehr verwenden - da es bereits eine Liste ist
bb.debug(2, "Sicherstellen, dass do_compile nach do_patch ausgeführt wird")
}
# Überschreibe die problematische do_compile-Funktion
do_compile() {
bbplain "Verwende angepasstes do_compile für DCM-Board"
# Verwende Standard-Build-Verzeichnis
BUILD_DIR="${B}"
KERNEL_SRC="${S}"
# Ermittle Anzahl der Kerne für parallele Kompilierung
PARALLEL_JOBS="${@oe.utils.cpu_count()}"
# Baue Kernel (zImage + uImage), DTBs in einem Schritt
cd ${KERNEL_SRC}
bbplain "Baue Kernel (zImage + uImage), DTBs parallel mit ${PARALLEL_JOBS} Jobs..."
# Baue zuerst zImage und DTBs
make O=${BUILD_DIR} ARCH=arm CROSS_COMPILE=${TARGET_PREFIX} -j ${PARALLEL_JOBS} zImage dtbs
# Überprüfe zImage
if [ -f "${BUILD_DIR}/arch/arm/boot/zImage" ]; then
bbplain "Kernel zImage erfolgreich erstellt!"
else
bbfatal "Fehler beim Erstellen des Kernel zImages!"
fi
# Erstelle uImage mit expliziten Parametern
bbplain "Erstelle uImage aus zImage..."
mkimage -A arm -O linux -T kernel -C none \
-a ${UBOOT_LOADADDRESS} -e ${UBOOT_ENTRYPOINT} \
-n "Linux Kernel ${KERNEL_VERSION}" \
-d ${BUILD_DIR}/arch/arm/boot/zImage \
${BUILD_DIR}/arch/arm/boot/uImage
# Überprüfe uImage
if [ -f "${BUILD_DIR}/arch/arm/boot/uImage" ]; then
bbplain "Kernel uImage erfolgreich erstellt!"
else
bbfatal "Fehler beim Erstellen des Kernel uImages!"
fi
# Überprüfe DTB
if [ -f "${BUILD_DIR}/arch/arm/boot/dts/st/stm32mp157c-dcm.dtb" ]; then
bbplain "DTB erfolgreich erstellt!"
# Erstelle den erwarteten Symlink für den separaten DTB-Build
mkdir -p ${BUILD_DIR}/dts
ln -sf ../arch/arm/boot/dts/st/stm32mp157c-dcm.dtb ${BUILD_DIR}/dts/stm32mp157c-dcm.dtb
bbplain "Link zu DTB erfolgreich erstellt!"
else
bbwarn "DTB wurde nicht erstellt. Prüfe, ob deine DTS-Datei korrekt ist."
fi
# Debug: Zeige erstellte Dateien
bbplain "Erstellte Dateien im Build-Verzeichnis:"
ls -la ${BUILD_DIR}/arch/arm/boot/ | grep -E "(zImage|uImage)"
ls -la ${BUILD_DIR}/arch/arm/boot/dts/st/ | grep "dcm"
}
do_compile:append() {
# Entferne alle DTB-bezogenen Variablen nach dem Build
unset KERNEL_DEVICETREE 2>/dev/null || true
unset STM32_KERNEL_DEVICETREE 2>/dev/null || true
bbplain "DTB-Variablen nach Build entfernt"
}
# Überschreibe do_install komplett statt nur zu erweitern
do_install() {
bbplain "Verwende angepasstes do_install für DCM-Board"
# Erstelle notwendige Verzeichnisse
install -d ${D}/${KERNEL_IMAGEDEST}
install -d ${D}/boot
# Installiere zImage
if [ -f "${B}/arch/arm/boot/zImage" ]; then
bbplain "Installiere zImage"
install -m 0644 ${B}/arch/arm/boot/zImage ${D}/${KERNEL_IMAGEDEST}/zImage-${KERNEL_VERSION}
ln -sf zImage-${KERNEL_VERSION} ${D}/${KERNEL_IMAGEDEST}/zImage
else
bbfatal "zImage nicht gefunden: ${B}/arch/arm/boot/zImage"
fi
# Installiere uImage
if [ -f "${B}/arch/arm/boot/uImage" ]; then
bbplain "Installiere uImage"
install -m 0644 ${B}/arch/arm/boot/uImage ${D}/${KERNEL_IMAGEDEST}/uImage-${KERNEL_VERSION}
ln -sf uImage-${KERNEL_VERSION} ${D}/${KERNEL_IMAGEDEST}/uImage
else
bbfatal "uImage nicht gefunden: ${B}/arch/arm/boot/uImage"
fi
# Installiere DTB
DTB="${B}/arch/arm/boot/dts/st/stm32mp157c-dcm.dtb"
if [ -f "$DTB" ]; then
bbplain "Installiere DTB: $DTB"
install -m 0644 $DTB ${D}/${KERNEL_IMAGEDEST}/stm32mp157c-dcm-${KERNEL_VERSION}.dtb
ln -sf stm32mp157c-dcm-${KERNEL_VERSION}.dtb ${D}/${KERNEL_IMAGEDEST}/stm32mp157c-dcm.dtb
else
bbwarn "DTB nicht gefunden: $DTB"
fi
# Installiere System.map falls vorhanden
if [ -f "${B}/System.map" ]; then
bbplain "Installiere System.map"
install -m 0644 ${B}/System.map ${D}/${KERNEL_IMAGEDEST}/System.map-${KERNEL_VERSION}
ln -sf System.map-${KERNEL_VERSION} ${D}/${KERNEL_IMAGEDEST}/System.map
fi
# Installiere config falls vorhanden
if [ -f "${B}/.config" ]; then
bbplain "Installiere Kernel-Konfiguration"
install -m 0644 ${B}/.config ${D}/${KERNEL_IMAGEDEST}/config-${KERNEL_VERSION}
ln -sf config-${KERNEL_VERSION} ${D}/${KERNEL_IMAGEDEST}/config
fi
}
# Unterdrücke QA-Warnung für buildpaths
INSANE_SKIP:${PN}-src += "buildpaths"
# Unterdrücke QA-Warnung für packages-list (mehrere Image-Typen)
INSANE_SKIP:${PN} += "packages-list"
INSANE_SKIP:kernel-image-zimage += "packages-list"
INSANE_SKIP:kernel-image-uimage += "packages-list"
# Löse das Packaging-Problem mit mehreren Kernel-Image-Typen
KERNEL_PACKAGE_NAME = "kernel"
KERNEL_OUTPUT_DIR = "${KERNEL_IMAGEDEST}"
# Verhindere doppelte Paket-Einträge für verschiedene Image-Typen
python __anonymous() {
# Stelle sicher, dass Pakete nicht doppelt aufgeführt werden
packages = d.getVar('PACKAGES') or ""
if packages:
# Entferne Duplikate aus der PACKAGES-Liste
packages_list = packages.split()
unique_packages = []
for pkg in packages_list:
if pkg not in unique_packages:
unique_packages.append(pkg)
d.setVar('PACKAGES', ' '.join(unique_packages))
}