4 Bootloader optimizations
4.1 Default boot mode
Figure 1은 기본 부팅 순서를 보여준다. 전원을 켜거(power-on)나 재설정(reset)한 후, i.MX8M은 ROM(Read Only Memory)에 저장된 BootROM(the primary program loader:기본 프로그램 로더)을 실행한다. BootROM은 PLL(Phase Locked Loops), 클럭 구성, 메모리 초기화(SRAM)와 같은 기본적인 주변 장치 초기화를 수행하여 SoC(System-on-Chip)를 구성한 다음 부트로더 이미지를 로드할 수 있는 부트 디바이스를 찾는다. U-Boot SPL, ATF, U-Boot 등의 구성 요소가 부트 디바이스에 포함될 수 있다.
일반적인 U-Boot 이미지는 내부 SRAM에 맞지 않기 때문에, SPL(Secondary Program Loader)과 U-Boot proper 두 부분으로 나뉜다.
SPL은 부트로더의 첫 번째 단계로, U-Boot와 동일한 소스를 공유하지만 SRAM에 맞는 최소한의 코드 세트를 가지는 더 작은 프리로더(pre-loader)이다. SPL은 SRAM에 로드된다. 일부 주변 장치와 가장 중요한 DRAM을 구성하고 초기화한다. 그런 다음 ATF와 U-Boot proper을 DRAM에 로드한다. 마지막 단계는 ATF로 이동하는 것이며, ATF는 다시 U-Boot proper로 이동한다.
최신 i.MX8* 제품군에 포함된 ATF(Arm Trusted Firmware)는 Armv8 아키텍처를 위한 신뢰할 수 있는 코드 기반의 레퍼런스를 제공한다. PSCI(Power State Coordination Interface)를 비롯한 다양한 ARM 인터페이스 표준을 구현한다. 바이너리는 일반적으로 부트로더 바이너리에 포함되어 있다. U-Boot의 초기 단계에서 시작된다. ATF가 없으면, 커널은 Secure World 환경에서 실행해야 하는 서비스를 설정할 수 없다.
U-Boot proper는 두 번째 단계의 부트로더이다. Linux Kernel을 로드하고 시작하는 유연한 방법을 제공하며 커맨드라인 인터페이스로 보드의 하드웨어와 상호 작용할 수 있는 최소한의 도구 세트를 제공한다. DRAM에서 실행되어 추가적인 하드웨어 디바이스(네트워크, USB, DSI/CSI 등)를 초기화한다. 그런 다음 디바이스 트리(FDT)를 로드하고 준비한다. U-Boot가 처리하는 주요 작업은 커널 이미지 자체를 로드하고 시작하는 것이다.
Linux Kernel은 DRAM에서 실행되며 시스템을 완전히 장악한다. U-Boot는 이 시점부터 더 이상 시스템을 제어할 수 없다.
4.2 Falcon mode
Falcon 모드는 U-Boot의 기능으로 SPL에서 Linux 커널을 직접 시작하여 U-Boot 로딩과 초기화를 완전히 건너뛰어 부트로더에서 소요되는 시간을 줄이는 효과가 있어 빠른 부팅을 가능하게 한다.
Figure 2는 Falcon 모드의 부팅 순서를 보여준다.
이 모드를 구현하려면 다음 작업을 수행해야 한다.
- Falcon에 대한 몇 가지 특정 구성을 활성화한다.
- FDT(Flattened Device Tree)를 미리 준비한다.
- 커널로 이동하도록 ATF를 구성한다.
- SD 카드에서 ATF, 커널 이미지와 FDT를 파티션 외부의 로우 섹션에 저장한다.
- SPL을 수정하여 ATF와 커널을 로드한 다음 ATF로 이동한다.
4.3 Implementation
다음 수정은 Yocto 환경이 설치된 호스트 컴퓨터에서 이루어진다.
참고:
Windows에서는 MSYS2를 설치하여 dd 커맨드(Linux 용)를 사용할 수 있다. Windows용으로 컴파일된 GNU/Linux Tools이다.
- 구성 파일에서 SPL BootROM 지원을 제거한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/configs/imx8mn_evk_defconfig
# CONFIG_SPL_BOOTROM_SUPPORT is not set
- SD에서 로우 데이터 읽기에 대한 지원을 추가하고, spl export 커맨드를 활성화하고, 레거시 이미지에 대한 지원을 추가하여 Falcon 모드에 대한 특정 구성을 만든다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/include/configs/imx8mn_evk.h
#define CONFIG_CMD_SPL 1 // enable spl export command
#define CONFIG_SPL_MMC_SUPPORT 1 // for reading from MMC
#define CONFIG_SPL_LEGACY_IMAGE_SUPPORT 1
/* Falcon Mode */
//#define CONFIG_SPL_OS_BOOT 1 // activate Falcon Mode
/* (leave this line commented until you finish all the
configurations) */
// RAM FDT address
#define CONFIG_SYS_SPL_ARGS_ADDR 0x43000000
/* Falcon Mode - MMC support */
#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 0x2FAF080
#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 0x58
#define CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR 0x2FAF0E4
- U-Boot 부팅이 첫 번째 선택이 아님을 나타내기 위해 0을 반환하는 spl_start_uboot() 함수를 구현한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/board/freescale/imx8mn_evk/spl.c
#ifdef CONFIG_SPL_OS_BOOT
int spl_start_uboot(void) {
return 0;
}
#endif
- else 문(로드에 헤더가 포함된 경우)에서 spl_parse_legacy_header() 함수의 Kenel 로드 주소 계산 모드를 수정한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/common/spl/spl_legacy.c
다음 라인을
spl_image->load_addr = image_get_load(header) - header_size;
아래와 같이 변경한다.
spl_image->load_addr = image_get_ep(header) - header_size;
- mmc_load_legacy() 함수에서 기존 코드 뒤에 다음 라인을 추가하여 AFT를 로드한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/common/spl/spl_mmc.c
/* existing code */
count = blk_dread(mmc_get_blk_desc(mmc), sector,
image_size_sectors, (void *)(ulong)spl_image->load_addr);
/* end of existing code */
unsigned long count1 = blk_dread(mmc_get_blk_desc(mmc), 0x2FBDAE0, 0x71,
(void*)(ulong)0x00960000); //write ATF from SD to RAM
- board_init_r() 함수에서 ATF로 이동하도록 SPL을 수정한다(Linux 상태로 이동).
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/common/spl/spl.c
#ifdef CONFIG_SPL_OS_BOOT
case IH_OS_LINUX:
debug("Jumping to Linux\n");
#if defined(CONFIG_SYS_SPL_ARGS_ADDR)
spl_fixup_fdt((void *)CONFIG_SYS_SPL_ARGS_ADDR);
#endif
spl_board_prepare_for_linux();
typedef void __noreturn (*image_entry_noargs_t)(void);
image_entry_noargs_t image_entry = (image_entry_noargs_t)0x00960000;
image_entry();
#endif
참고 :
CONFIG_SPL_OS_BOOT가 정의되면, SPL은 오류를 발생시켜 CPU를 재설정하기 위해 dram_init_banksize() 함수를 호출한다. 이는 <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/arch/arm/mach-imx/imx8m/soc.c 소스 파일에서 gd->bd 구조체를 사용하기 전에 메모리를 할당하여 피할 수 있는 초기화되지 않은 함수의 사용으로 인해 발생한다.
gd->bd = (struct bd_info*)malloc(sizeof(struct bd_info));
- Ethernet MAC이 PHY와 상호 작용할 수 있는 작동되는 상태로 가져오려면, U-Boot SPL이나 Linux에서 Ethernet PHY를 재설정해야 한다. 다음 지침은 U-Boot SPL에서 PHY를 재설정하는 자세한 방법을 설명한다.
- FEC 디바이스에 연결된 핀을 확인한다. 이것은 i.MX8MN EVK 보드의 관련 DTS 파일에 설명되어 있다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx<specified_git_folder>/git/arch/arm/dts/imx8mn-evk.dtsi
보드 회로도에 따르면 Ethernet PHY의 리셋 핀은 그룹 4, 핀 22(빨간색으로 표시)에 연결되어 있다.
- 파일에 GPIO 그룹과 GPIO 핀 쌍을 포함하는 매크로를 선언한다. 패드를 GPIO로 사용하는 매크로를 추가한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/common/spl/spl.c
#define RESET_ETH_GPIO IMX_GPIO_NR(4,22)
#define USDHC_GPIO_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_DSE1)
- board_init_r() 함수에 다음 라인을 추가하여 Ethernet PHY를 재설정한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/common/spl/spl.c
/*reset eth*/
gpio_request(RESET_ETH_GPIO, "reset_eth_gpio");
gpio_direction_output(RESET_ETH_GPIO, 0);
mdelay(1);
gpio_direction_output(RESET_ETH_GPIO, 1);
mdelay(1);
- 패치를 만들기 전에, 모든 새로운 수정 사항이 올바른지 확인해야 한다. 호스트에서 다음 bitbake 커맨드를 사용하여 U-Boot 이미지를 다시 빌드한다.
$ bitbake -f -c configure u-boot-imx
$ bitbake -f -c compile u-boot-imx
$ bitbake u-boot-imx imx-boot
- 설정이 완료되면, U-Boot 수정 사항이 포함된 패치를 생성한다.
$ git add –-all
$ git commit –s
$ git format-patch HEAD~1
생성된 패치를 imx-yocto-bsp/sources/ meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx 위치에 복사한 다음, U-Boot에 대한 Yocto 레시피(imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2021.04.bb)에서 소스 위치 식별자에 패치 이름을 추가한다.
SRC_URI = "... \
file://<patch_name>.patch \
"
수정 후 패치가 작동하는지 확인하려면, 다음 커맨드를 적용한다. 그러면 파일에 최신 변경 사항이 포함되어야 한다.
$ bitbake -f -c cleansstate u-boot-imx
$ bitbake u-boot-imx imx-boot
- SPL만으로 부트로더 이미지를 생성한다.
<yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/imx-boot/<specified_git_folder>/git/iMX8M/soc.mak 파일에서 새 이미지를 빌드하기 위한 새로운 대상을 생성한다.
보드가 HDMI로 구성되어 있으면, ifeq($(HDMI),yes) 조건에서 다음 라인을 추가한다.
flash_evk_falcon: $(MKIMG) signed_hdmi_imx8m.bin u-boot-spl-ddr.bin
./mkimage_imx8 -fit -signed_hdmi
signed_hdmi_imx8m.bin -loader u-boot-spl-ddr.bin
$(SPL_LOAD_ADDR) -out $(OUTIMG)
그렇지 않으면, HDMI를 포함하지 않는 새로운 대상을 만들고 구현한다.
flash_evk_falcon: flash_evk_falcon_no_hdmi
flash_evk_falcon_no_hdmi: $(MKIMG) u-boot-spl-ddr.bin
./mkimage_imx8 -version $(VERSION) -loader u-boot-spl-ddr.bin
$(SPL_LOAD_ADDR) -out $(OUTIMG)
flash.bin(imx-boot image)을 다시 생성하려면, make SOC=iMX8MN flash_evk_falcon을 실행한다.
- 위의 수정 사항을 포함하는 패치를 만든다.
$ git add soc.mak
$ git commit –s
$ git format-patch HEAD~1
만들어진 패치를 ~/imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-mkimage/files에 복사한 다음, imx-mkimage(~/imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-mkimage/imx-mkimage_git.inc)에 대한 Yocto 레시피의 소스 위치 식별자에 패치 이름을 추가한다.
SRC_URI = "... \
file://<patch_name>.patch \
"
수정 후 패치가 작동하는지 확인하려면 다음 커맨드를 적용한다. 그러면 파일에 최신 변경 사항이 포함되어야 한다.
$ bitbake –f –c cleansstate imx-boot
$ bitbake imx-boot
$ make SOC=iMX8MN flash_evk_falcon
- SD 카드에 부트로더 이미지를 저장한다.
참고:
저장 장치의 위치는 다를 수 있다. SD 카드 위치를 가리키도록 of 파라미터를 조정한다.
dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync
- Kernel 이미지로 이동하도록 ATF를 구성한다.
bl31_early_platform_setup2() 함수에서 bl33_image_ep_info 구조체의 프로그램 카운터 멤버를 커널 주소로 설정하고 FDT의 주소를 인자로 설정한다.
위치 : <yocto_build_dir>/tmp/work/cortexa53-crypto-mx8mn-poky-linux/imx-atf/<specified_git_folder>/git/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c
//bl33_image_ep_info.pc = PLAT_NS_IMAGE_OFFSET;
bl33_image_ep_info.pc = 0x40400000; // RAM kernel address
bl33_image_ep_info.spsr = get_spsr_for_bl33_entry();
// RAM FDT address
bl33_image_ep_info.args.arg0 = (u_register_t)0x43000000;
bl33_image_ep_info.args.arg1 = 0U;
bl33_image_ep_info.args.arg2 = 0U;
bl33_image_ep_info.args.arg3 = 0U;
SET_SECURITY_STATE(bl33_image_ep_info.h.attr, NON_SECURE);
- ATF 소스를 다시 컴파일한다.
패치를 만들기 전에 소스가 컴파일되는지 확인한다.
$ bitbake imx-atf
build/imx8mn/release 디렉토리에서 ATF 바이너리(bl31.bin)를 찾을 수 있다.
새로운 수정 사항을 포함하는 패치를 만든다.
$ git add plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c
$ git commit –s
$ git format-patch HEAD~1
결과 패치를 imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-atf/files에 복사한다. 기존 레시피에 새로운 레시피를 추가(imx-atf_2.4.bbappend 파일 생성)하고 imx-yocto-bsp/sources/meta-imx/meta-bsp/recipes-bsp/imx-atf/imx-atf_ 2.4.bbappend에 다음 라인을 추가한다.
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://0001-jump-to-kernel.patch \
"
수정 후 패치가 작동하는지 확인하려면, 다음 커맨드를 적용한다. 그러면 파일에 새로운 변경 사항이 포함되어야 한다.
$ bitbake –f –c cleansstate imx-atf
$ bitbake imx-atf
참고:
ATF를 수동으로 빌드하려면, Yocto meta-toolchain을 사용한다.
$ bitbake meta-toolchain
$ cd imx-yocto-bsp/build-wayland/tmp/deploy/sdk
$ ./fsl-imx-wayland-glibc-x86_64-meta-toolchain-cortexa53-
crypto-imx8mn-lpddr4-evk-toolchain-5.10-hardknott.sh
$ source /opt/fsl-imx-wayland/5.10-hardknott/environment-
setup-cortexa53-crypto-poky-linux; unset LDFLAGS
$ cd <yocto_build_dir>/tmp/work/cortexa53-crypto-mx8mn-poky-
linux/imx-atf/<specified_git_folder>/git
$ make PLAT=imx8mn bl31
- SD 카드에 ATF를 저장한다.
참고:
저장 장치의 위치는 다를 수 있다. SD 카드 위치를 가리키려면, of 파라미터를 조정한다.
dd if=bl31.bin of=/dev/sdb bs=512 seek=50060000 conv=fsync
- Kernel 이미지의 진입점(entry point)과 로드 주소를 선택한다.
커널을 부팅하기 전에, U-Boot는 커널 이미지를 2MB의 배수인 주소로 재배치한다. 이 재배치를 우회하려면 동일한 기준을 사용하여 진입점 주소를 미리 설정해야 한다(주소는 2MB의 배수여야 함). 커널이 실행될 주소는 0x40400000이다. uImage의 헤더가 64바이트인 것을 고려하면 로드 주소는 0x403fffc0이 된다. - 이미지에 Kernel 레거시 uImage 파일을 빌드한다.
uImage는 Image 앞에 로더 정보(로드 주소, 진입점, OS 유형 등)가 지정된 64바이트 헤더를 추가하는 특수 이미지 파일이다.
- 빌드 후 Kernel 이미지가 배포되는 디렉터리를 변경한다.
$ cd <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-
linux/linux-imx/<specified_git_folder>/build/arch/arm64/boot
- U-Boot의 mkimage 커맨드를 사용하여 uImage를 생성한다.
$ mkimage -A arm -O linux -T kernel -C none -a 0x403FFFC0
-e 0x40400000 -n "Linux kernel" -d Image uImage
Image Name: Linux kernel
Created: Wed May 4 11:02:52 2022
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 30118400 Bytes = 29412.50 KiB = 28.72 MiB
Load Address: 403fffc0
Entry Point: 40400000
파라미터 정보:
- A [architecture]: 아키텍처 설정
- O [os]: 운영 체제 설정
- T [image type]: 이미지 유형 설정
- C [compression type]: 압축 유형을 설정
- n [image name]: 이미지 이름을 이미지 이름으로 설정
- d [image data file]: 이미지 데이터 파일에서 이미지 데이터를 사용
- a [load address]: 16진수로 로드 주소를 설정
- e [entry point]: 16진수로 진입점을 설정
- Flattened Device Tree를 준비하고 SD에 저장한다.
Falcon Mode로 부팅할 때, 중요한 단계는 디바이스 트리를 준비하는 것이다. 일반적으로 U-Boot는 Linux를 부팅할 때 FDT 수정을 수행한다. 이는 초기 디바이스 트리에 U-Boot가 Kernel 인수를 추가함을 의미한다.
이러한 인수는 구성 파일 중 하나인 <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/include/configs/imx8mn_evk.h에서 bootargs라는 이름 아래에서 찾을 수 있다. 여기에 콘솔 파라미터가 지정되어 있고 루트 파일 시스템을 찾을 위치를 커널에 알려준다.
U-Boot를 스킵하기 위해서, spl export 커맨드를 이용하여 FDT를 미리 준비해야 한다. 일반 부팅에서만 호출해야 한다. 디바이스 트리 수정이 완료될 때까지 bootm을 통과하는 것과 동일한 커맨드이다. 메모리의 디바이스 트리는 falcon 모드에 필요한 것이다. 이 이미지는 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR 매크로가 지정하는 위치로 SD에 저장해야 하며, 최대 크기는 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS 매크로가 지정한다.
FDT 준비 단계:
- 보드를 U-Boot로 부팅하고, 자동 부팅 시퀀스에 들어가기 직전에 중지한다.
- FDT를 RAM에 로드한다.
u-boot=> run loadfdt
41608 bytes read in 2 ms (19.8 MiB/s)
- Kernel uImage를 RAM에 로드한다.
u-boot=> fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} uImage
30118464 bytes read in 320 ms (89.8 MiB/s)
- 지정된 오프셋 섹터로 Kernel Image를 SDHC에 저장한다.
u-boot=> mmc write ${loadaddr} 0x2FAF0E4 0xe5c9
MMC write: dev # 1, block # 50000100, count 58825 ... 58825
blocks written: OK
- FDT 준비
u-boot=> spl export fdt ${loadaddr} - ${fdt_addr_r}
## Booting kernel from Legacy Image at 40400000 ...
Image Name: Linux kernel
Created: 2022-04-08 13:08:28 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 30118400 Bytes = 28.7 MiB
Load Address: 403fffc0
Entry Point: 40400000
Verifying Checksum ... OK
## Flattened Device Tree blob at 43000000
Booting using the fdt blob at 0x43000000
Loading Kernel Image
Using Device Tree in place at 0000000043000000, end 000000004300d287
subcommand not supported
subcommand not supported
Using Device Tree in place at 0000000043000000, end 0000000043010287
Argument image is now in RAM: 0x0000000043000000
- 준비된 FDT를 SD 카드에 저장
u-boot=> mmc write 0x43000000 0x2FAF080 0x58
참고:
SD 카드에 FDT를 다시 저장할 수 있다. PC에서 로컬로 저장하려면, 다음 커맨드를 사용한다.
dd if=/dev/sdb of=imx8mn-evk.dtb bs=512 skip=50000000 count=88 conv=fsync
참고:
저장 장치의 위치는 다를 수 있다. SD 카드 위치를 지정하려면, of 파라미터를 조정한다.
수정 후 만들어진 SD 카드는 Figure 3과 같다.
- 2 단계에서의 CONFIG_SPL_OS_BOOT 정의의 주석 처리를 제거한다.
- 부트로더를 다시 컴파일하고 SD 카드에 저장한다.
$ bitbake -f -c configure u-boot-imx
$ bitbake -f -c compile u-boot-imx
$ cd <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/imx-boot/<specified_git_folder>/git/
$ make SOC=iMX8MN flash_evk_falcon
SD 카드에 U-Boot 이미지를 저장한다.
참고:
저장 장치의 위치는 다를 수 있다. SD 카드 위치를 지정하려면, of 파라미터를 조정한다.
dd if=flash.bin of=/dev/sdb bs=1k seek=32 conv=fsync
4.4 Improve raw MMC read performance in SPL
Falcon 모드를 구현한 후 SPL에서 소비되는 시간이 크게 증가한 것을 관찰할 수 있다. 커널 이미지가 메모리에 느리게 로드되기 때문이다(큰 크기 ~ 30MB). SPL에서 전송 속도를 높이려면 고속 지원(UHS/SD)을 추가한다.
위치 : <yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/configs/imx8mn_evk_defconfig
CONFIG_SPL_MMC_UHS_SUPPORT=y
CONFIG_SPL_MMC_IO_VOLTAGE=y
참고:
<yocto_build_dir>/tmp/work/imx8mn_lpddr4_evk-poky-linux/u-boot-imx/<specified_git_folder>/git/Kconfig 파일에서 사용 가능한 모든 구성을 볼 수 있다.
이러한 수정 사항으로 부트로더를 다시 컴파일하고 20단계와 같이 저장한다.
'NXP i.MX SoC Family > Linux Boot Time Optimizations for i.MX8M' 카테고리의 다른 글
AN13709 - User space optimizations (0) | 2023.05.23 |
---|---|
AN13709 - Kernel space optimizations (0) | 2023.05.22 |
AN13709 - Measurements (0) | 2023.05.16 |
AN13709 - General description (0) | 2023.05.15 |
AN13709 - Introduction (0) | 2023.05.15 |