Samodzielna kompilacja bootloadera

Forum poświęcone układom SBC (Single Board Komputer) opartych o SoC Amlogic
Regulamin forum
Obrazek

Amlogic Khadas VIM1 BASIC
SoC: Amlogic S905 Quad Core ARM Cortex-A53 Mali-T450MP5 GPU UHD H.265/VP9 60fps HDR10 oraz HLG HDR

Obrazek

Amlogic Khadas VIM2 PRO
SoC: Amlogic S912 Octa Core ARM Cortex-A53 Mali-T820MP3 GPU HW UHD H.265/VP9 60fps HDR10 oraz HLG HDR
ODPOWIEDZ
Awatar użytkownika
elvis
Użytkownik
Posty: 35
Rejestracja: 30 lis 2018, 17:50

Samodzielna kompilacja bootloadera

Post autor: elvis » 19 cze 2019, 18:05

Poprzednio opisałem jak wykorzystać Yocto do przygotowania obrazu systemu. To bardzo wygodna, chociaż zasobochłonna metoda.
Warto jednak zajrzeć "pod maskę" yocto i zabaczyć jaka magia tam siedzi.
Ponieważ jako pierwszy z naszej pamięci flash uruchamiany jest booloader, warto poświęcić mu chwilę.

Na początek krótkie spojrzenie na warstwę meta-mason, recepturę na bootloader znajdziemy w katalogu: meta-meson/recipes-bsp/u-boot.
Główny plik to u-boot-khadas-vim_v2015.01.bb, jednak w nim nie znajdziemy zbyt wiele interesujących informacji, poza tym że włącza on kolejny: u-boot-khadas-vim-common_v2015.01.inc
Ten plik jest na tyle ciekawy, że zamieszczę go poniżej:

Kod: Zaznacz cały

HOMEPAGE = "http://www.denx.de/wiki/U-Boot/WebHome"
SECTION = "bootloaders"

LICENSE = "GPLv2+"
PE = "1"

S = "${WORKDIR}/git"

LIC_FILES_CHKSUM = "file://Licenses/README;md5=c7383a594871c03da76b3707929d2919"

SRCREV = "ffc14fcca35f499ba1489400dfe801901683ee60"

PV = "v2015.01+git${SRCPV}"
PR = "r0"

SRC_URI = "git://github.com/khadas/u-boot.git;branch=ubuntu \
           https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2;md5sum=8a4a74872830f80c788c944877d3ad8c \
           http://releases.linaro.org/archive/14.09/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux.tar.bz2;md5sum=844189ae1604613d94a1f922bff1c11f \
           file://0002-fix-build-error-under-gcc6.patch \
           file://0003-fix-s3c-udc-otg-build.patch \
           file://0004-remove-warnings-errors.patch \
           file://0005-disable-pedantic-for-firmware-build.patch \
           "

EXTRA_OEMAKE = 'CROSS_COMPILE=aarch64-linux-gnu- V=1'
EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"'

do_compile_prepend() {
	export PATH=${S}/../gcc-arm-none-eabi-4_9-2015q3/bin:$PATH
	export PATH=${S}/../gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin:$PATH
	(cd ${S} ; ln -s ${B} build)
}
Receptury yocto są dość łatwe do czytania, to taka mieszanka skryptów powłoki z pythonem. Nas interesuje fragment SRC_URI.
To co jest przypisywane do zmiennej to miejsca skąd yocto pobiera kody źródłowe podczas budowania u-boota oraz patche.
Widzimy więc że do kompilacji używane są źródła pobrane z git://github.com/khadas/u-boot.git;branch=ubuntu.
Co ciekawe zamiast używać własnej wersji gcc, recepura pobiera dwa kompilatory ze strony linaro: jeden dla 64-bitowej wersji ARM i jeden dla 32-bitowej.

Zacznijmy więc od pobrania kodu samego u-boota:

Kod: Zaznacz cały

git clone -b ubuntu git://github.com/khadas/u-boot.git
Warto chwilę poświęcić na zapoznanie się z kodem, to co nas będzie interesowało to pliki:
  • configs/kvim_defconfig - domyślna konfiguracja dla VIM
  • configs/kvim2_defconfig - domyślna konfiguracja dla VIM2
  • board/khadas/configs/kvim.h - konfiguracja zaszyta w kodzie dla VIM
  • board/khadas/configs/kvim2.h - to samo dla VIM2
U-boot ma spore możliwości konfiguracyjne, jednak część parametrów jest niestety na stałe w kodzie. Wspomniane pliki kvim.h definiują bardzo ciekawe opcje. Można w nich zmienić domyślne polecenia wykonywane przez bootloader, ale też pogrzebać w nieco groźniejszych opcjach, jak chociażby:

Kod: Zaznacz cały

/* cpu */
#define CONFIG_CPU_CLK					1200 //MHz. Range: 600-1800, should be multiple of 24

/* ddr */
#define CONFIG_DDR_SIZE					0 //MB //0 means ddr size auto-detect
#define CONFIG_DDR_CLK					768  //MHz, Range: 384-1200, should be multiple of 24
#define CONFIG_DDR4_CLK					1008  //MHz, for boards which use different ddr chip
Ktoś na forum podobno jest miłośnikiem overclockingu...

Do skompilowania bootloadera potrzebujemy tak samo jak yocto 2 wersji kompilatora. Ja używam domyślnego gcc-none-eabi- w Ubuntu 16.04, natomiast dla 64-bitów mam zainstalowaną wersję 4.9 od linaro. W każdym razie pobranie gotowego toolchaina to nic trudnego: https://releases.linaro.org/components/ ... linux-gnu/

Na początek ustawiamy domyślną konfigurację:

Kod: Zaznacz cały

make vim_defconfig
Jeśli chcemy pogrzebać w ustawieniach, możemy użyć:

Kod: Zaznacz cały

make menuconfig
Do konfiguracji używane jest bardzo podobne rozwiązanie jak w przypadku jądra linuksa:
Obrazek
Teraz można skompilować bootloader poleceniem:

Kod: Zaznacz cały

make CROSS_COMPILE=aarch64-linux-gnu- -j88
Gdzie aarch64-linux-gnu- to przedrostek naszego kompilatora (tego od linaro), a po wstawiamy ile wątków może nasz komputer uciągnąć.
Po chwili zobaczymy, że w katalogi fip powstał znajomy plik o nazwie: u-boot.bin.sd.bin
Pozostaje nagrać go podobnie jak poprzednio na kartę:

Kod: Zaznacz cały

sudo dd if=fip/u-boot.bin.sd.bin of=/dev/sdg conv=fsync bs=1 count=442
sudo dd if=fip/u-boot.bin.sd.bin of=/dev/sdg conv=fsync bs=512 skip=1 seek=1
I gotowe. Możemy uruchmić system z samemu przygotowanego bootloadera.
Co ciekawe w moim przypadku nie było konieczne stosowanie łątek dodawanych przez yocto. Ale na pewno warto o nich pamiętać i sprawdzić czy czegoś ważnego w nich nie ma.

ODPOWIEDZ