거의 6년만에 STM32MP 보드를 다시 하나 입수했다(이번에는 STM32MP257F-DK 보드다). 이번 시간 부터는 앞으로 몇차례에 걸쳐서, STM32MP257F-DK 보드 기반 embedded linux와 관련한 다양한 주제를 다뤄 보고자 한다. 이번이 그 세번째 시간이다. 😎
목차
7. Linux Kernel and Bootloader 작업하기
8. Buildroot와 Device Tree & Device Drivers
9. Cortex-M33 CPU#1 - STM32CubeIDE 기반 Application 돌려 보기
10. Cortex-M33 CPU#2 - Zephyr RTOS Application 돌려보기
11. Application 돌려 보기 - WireGuard Rust, Qt6 Application
References
Keywords: STM32MP257F-DK, booting flow, u-boot, linux kernel, device tree, yocto project, Buildroot, Rust kernel module, STM32CubeIDE, Zephyr RTOS, PySide6
Embedded linux(echosystem)는 점점 더 복잡해져 가고 있다. 이중 삼중의 bootloader(거기에 TrustZone까지), device tree로 무장한 linux kernel, kernel에 합류한 Rust, build system의 대세 Yocto project ! 어느 하나 무시할 수 없는 것들 뿐이다. 그 중에서도 이번 시간에는 Yocto Project환경에서 bootloader와 kernel을 개발하는 내용을 다뤄 보기로 하자. 😋
bootloader가 닦아 놓은 길 위에서 linux kernel이 굴러간다~ K5G fighting 졌잘싸 !
7. Linux Kernel and Bootloader 작업하기
이번 장에서는 STM32MP257F-DK 보드의 Cortex-A35 CPU에 Linux kernel을 올리기 위해 yocto project devtool & bitbake를 사용하는 방법에 관하여 소개해 보고자 한다. 😋
7.1 devtool로 kernel build 하기
먼저, 이절에서는 devtool을 사용하여 linux kernel을 build(kernel config 조정 포함)하는 방법부터 확인해 보도록 하자.
$ DISTRO=openstlinux-weston MACHINE=stm32mp2 source layers/meta-st/scripts/envsetup.sh
📌 시작할 때는 항상 envsetup.sh script를 실행해 주어야 한다는 것을 잊지 말도록 하자.
Kernel에 대한 recipe명은 virtual/kernel으로 하면 되지만, STM32MP257F-DK board에서 사용하는 구체적인 명칭을 확인하고 싶다면, 아래와 같이 검색을 해보면 된다.
$ devtool search linux-*
...
gobject-introspection Middleware layer between GObject-using C libraries and language bindings
linux-stm32mp Linux STM32MP Kernel
systemtap Script-directed dynamic tracing and performance analysis tool for Linux
linux-stm32mp Linux STM32MP Kernel
systemtap Script-directed dynamic tracing and performance analysis tool for Linux
...
자, 이제 linux-stm32mp라는 kernel recipe 명을 찾았으니, 다음으로 할 일은 devtool modify 명령을 사용하여 linux kernel code를 workspace로 복사(정확히는 git clone을 함)해 오는 것이다.
$ devtool modify -x linux-stm32mp
-> 이렇게 하면, workspace/sources/linux-stm32mp 아래에 kernel source code가 복사된다.
📌 devtool modify 명령은 자동으로 kernel_configme 처리(여러개로 분할된 config를 하나로 모아 적용하는 option)를 자동으로 해준다.
다음으로 kernel menuconfig 창을 띄워, 원하는 대로 config를 조정해 보도록 하자.
$ devtool menuconfig linux-stm32mp
-> 여기에서는 테스트를 위해, WireGuard를 Module 형태로 enable 시켜 보기로 한다.
[그림 7.1.1] kernel menuconfig
[그림 7.1.2] WireGuard Module enable 하기
이렇게 설정 변경한 내용은 workspace/sources/linux-stm32mp/oe-local-files/devtool-fragment.cfg 파일에 저장된다.
[그림 7.1.3] devtool-fragment.cfg 파일
또한, 아래와 같이 .config.new file도 만들어 진다.
$ cd workspace/sources/linux-stm32mp
$ ls -l .config.*
lrwxrwxrwx 1 chyi chyi 172 3월 5 14:46 .config.new -> /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.6.116-stm32mp-r3/build/.config
📌 symbolic link된 path를 보니, 결국은 tmp-glibc/ 아래의 원래 build 위치로 연결되는 것을 알 수 있다.
이 상태에서, kernel build를 해 보도록 한다.
-> sources/linux-stm32mp/oe-workdir/build 디렉토리 아래에서 kernel build를 진행한다.
📌 oe-workdir은 아래와 같이 tmp-glibc 아래의 디렉토리로 symbolic link되어 있다. 이는 devtool을 사용해서 kernel을 build하는 것이나, bitbake를 직접 사용해서 build하는 것이나, 모두 동일한 위치에서 build되는 것을 말해 준다.
oe-workdir -> /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.6.116-stm32mp-r3
(앞단계의 과정을 거쳐) Kernel build 결과물이 설치되는 위치는 아래와 같다.
$ cd tmp-glibc/deploy/images/stm32mp2/kernel
$ tree .
.
├── Image -> Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image-stm32mp2.bin -> Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz -> Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz-stm32mp2.bin -> Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── config-6.6.116-gf05ce960395e
├── modules--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stm32mp2.tgz -> modules--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stripped--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stripped-stm32mp2.tgz -> modules-stripped--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── stm32mp215f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk.dtb
├── stm32mp215f-dk-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-psci-osi--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-psci-osi-stm32mp2.dtb -> stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-stm32mp2.dtb -> stm32mp215f-dk.dtb
├── stm32mp215f-dk.dtb
├── stm32mp235f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp235f-dk.dtb
├── stm32mp235f-dk-stm32mp2.dtb -> stm32mp235f-dk.dtb
├── stm32mp235f-dk.dtb
├── stm32mp257f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk.dtb
├── stm32mp257f-dk-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-stm32mp2.dtb -> stm32mp257f-dk.dtb
├── stm32mp257f-dk.dtb
├── stm32mp257f-ev1--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-psci-osi--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-psci-osi-stm32mp2.dtb -> stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-stm32mp2.dtb -> stm32mp257f-ev1.dtb
├── stm32mp257f-ev1.dtb
├── vmlinux -> vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
└── vmlinux-stm32mp2.bin -> vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
0 directories, 53 files
---------------------------------------------------------------------------
.
├── Image -> Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image-stm32mp2.bin -> Image--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz -> Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── Image.gz-stm32mp2.bin -> Image.gz--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── config-6.6.116-gf05ce960395e
├── modules--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stm32mp2.tgz -> modules--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stripped--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── modules-stripped-stm32mp2.tgz -> modules-stripped--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.tgz
├── stm32mp215f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk.dtb
├── stm32mp215f-dk-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp215f-dk-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-ca35tdcid-ostl.dtb
├── stm32mp215f-dk-psci-osi--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-psci-osi-stm32mp2.dtb -> stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-psci-osi.dtb
├── stm32mp215f-dk-stm32mp2.dtb -> stm32mp215f-dk.dtb
├── stm32mp215f-dk.dtb
├── stm32mp235f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp235f-dk.dtb
├── stm32mp235f-dk-stm32mp2.dtb -> stm32mp235f-dk.dtb
├── stm32mp235f-dk.dtb
├── stm32mp257f-dk--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk.dtb
├── stm32mp257f-dk-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-dk-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-ca35tdcid-ostl.dtb
├── stm32mp257f-dk-stm32mp2.dtb -> stm32mp257f-dk.dtb
├── stm32mp257f-dk.dtb
├── stm32mp257f-ev1--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-m33-examples.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl-stm32mp2.dtb -> stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-ca35tdcid-ostl.dtb
├── stm32mp257f-ev1-psci-osi--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.dtb -> stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-psci-osi-stm32mp2.dtb -> stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-psci-osi.dtb
├── stm32mp257f-ev1-stm32mp2.dtb -> stm32mp257f-ev1.dtb
├── stm32mp257f-ev1.dtb
├── vmlinux -> vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
├── vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
└── vmlinux-stm32mp2.bin -> vmlinux--6.6.116-stm32mp-r3-r0.4-stm32mp2-20260305055611.bin
0 directories, 53 files
---------------------------------------------------------------------------
자, 이제 target board에 앞에서 생성한 kernel image와 modules 파일을 올려 볼 차례이다.
[그림 7.1.4] Target board - STM32MP257F-DK
우선, 다음과 같이 (target board의) ip 주소를 설정한 후,
scp를 사용하여 kernel image 파일과 kernel module 묶음을 target board로 복사하도록 한다.
$ scp ./Image.gz root@192.168.8.227:~/workspace
$ scp ./modules-stripped-stm32mp2.tgz root@192.168.8.227:~/workspace
<Target Board>
Target board로 복사한 내용을 system에 반영한 후, 재부팅하도록 하자.
$ cd workspace
$ cp -f ./Image.gz /boot
$ tar xvzf ./modules-stripped-stm32mp2.tgz -C /
$ sync; sync; reboot
<After reboot>
$ depmod -a
-> depmod는 kernel module에 대한 의존성을 분석한 후, /lib/modules/6.6.116-xxx/modules.dep 파일을 새롭게 갱신시킨다.
-> modprobe 명령은 modules.dep 파일의 내용을 보고, 모듈의 위치를 파악하게 된다.
-> 이 명령 실행 후에는 반드시 reboot을 해 주도록 하자.
$ modprobe wireguard
-> OK, wireguard kernel module이 제대로 올라온다.
[그림 7.1.6] lsmod wireguard
<여기서 잠깐!>
kernel menuconfig로 변경한 사항을 영구적으로 반영하려면 어떻게 해야 할까 ? 이 방법은 생각보다 좀 절차가 까다롭다. 😂
==========================================================================
$ bitbake -c savedefconfig linux-stm32mp
-> menuconfig한 내용을 저장(.config -> defconfig)한다. 불행히도 devtool에는 이를 한방에 처리하는 option이 제공되지 않는다.
-> menuconfig한 내용을 저장(.config -> defconfig)한다. 불행히도 devtool에는 이를 한방에 처리하는 option이 제공되지 않는다.
...
Saving defconfig to:
/mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.6.116-stm32mp-r3/build/defconfig
NOTE: Tasks Summary: Attempted 555 tasks of which 547 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 2 seconds
/mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.6.116-stm32mp-r3/build/defconfig
NOTE: Tasks Summary: Attempted 555 tasks of which 547 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 2 seconds
이전 posting 6장에서 만든 meta-my-custo-layer 아래에 kernel config를 저장하기 위해, 아래와 같은 디렉토리를 만든다.
$ cd ../layers/meta-st/meta-my-custo-layer
$ mkdir -p recipes-kernel/linux/linux-stm32mp/
$ mkdir -p recipes-kernel/linux/linux-stm32mp/
$ cd recipes-kernel/linux/linux-stm32mp/
이어서, 아래의 내용으로 구성된 bbappend 파일을 하나 만든다.
$ vi linux-stm32mp_%.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://fragment.cfg"
~
📌 %.bbapend는 linux-stm32mp의 모든 버젼에 적용된다는 의미이다.
마지막으로 savedefconfig하여 생성한 defconfig 파일을 meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/fragment.cfg 파일로 복사한다.
$ cd build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/linux-stm32mp/6.6.116-stm32mp-r3/build
$ cp defconfig /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/fragment.cfg
자, 이제 kernel config 교체 작업이 모두 끝났으니, 새로운 kernel이 포함된 image를 만들어 테스트해 보면 된다. 😀
$ bitbake my-custom-image
==========================================================================
7.2 device tree 변경하기
이번 절에서는 GPIO LED 관련 device tree를 수정하고, devtool을 사용하여 변경사항을 project에 반영하는 과정을 살펴 보기로 하자.
먼저, stm32mp257f-dk 보드에는 아래와 같이 4개의 GPIO LED가 존재한다.
[그림 7.2.1] stm32mp257f-dk schematics 중 LED 관련 부분 발췌 [출처 - 참고문헌 5]
여기서는 (간단한 device tree 변경 시험을 위해) LED 관련 코드를 아래와 같이 수정해 보도록 하겠다.
blue LED(LED1, PH7) off -> green LED(LED8, PH5) on
우선 board 상에서 LED1과 LED8이 어느 위치에 있는지 확인해 보도록 한다.
[그림 7.2.2] stm32mp257f-dk 보드 top view 중 LED 관련 부분 발췌 [출처 - 참고문헌 2]
또한, LED1과 LED8의 GPIO pin 번호 등과 관련한 정보를 파악해 보도록 하자.
[그림 7.2.3] stm32mp257f-dk 보드 LED pinout [출처 - 참고문헌 2]
[그림 7.2.4] stm32mp257f-dk 보드 alternate functions table(Port H)[출처 - 참고문헌 4]
[그림 7.2.5] stm32mp257f-dk.dts 내용 중 gpio-leds node 부분 발췌
참고로, 위의 gpio-leds와 관련한 device drivers는 linux-stm32mp/drivers/leds/leds-gpio.c이다.
[그림 7.2.6] gpio-leds 관련 device driver code
참고로, device tree 변경 전에 LED 상태를 확인해 보면, 다음과 같이 blue LED가 깜빡이고 있는 것을 알 수가 있다(사진 still image라 구분이 어렵기 하지만... 😂).
--------------------------------------------------------------------
gpio-leds {
compatible = "gpio-leds";
/*
led-blue {
function = LED_FUNCTION_HEARTBEAT;
color = <LED_COLOR_ID_BLUE>;
gpios = <&gpioh 7 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
*/
compatible = "gpio-leds";
/*
led-blue {
function = LED_FUNCTION_HEARTBEAT;
color = <LED_COLOR_ID_BLUE>;
gpios = <&gpioh 7 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
*/
/* added by chunghan.yi@gmail.com, 03/07/2026 */
led-green {
function = LED_FUNCTION_HEARTBEAT;
color = <LED_COLOR_ID_GREEN>;
gpios = <&gpioh 5 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
default-state = "on";
status = "okay";
};
};
--------------------------------------------------------------------
이후, devtool build 명령 대신, bitbake 명령으로 kernel compile 이후 절차를 진행하도록 하자.
$ bitbake -C compile linux-stm32mp
linux-stm32mp-6.6.116-stm32mp-r3-r0 do_compile
linux-stm32mp-6.6.116-stm32mp-r3-r0 do_compile_kernelmodules
...
📌 이 경우 -C는 대문자인데, 대문자를 사용하게 되면, 주어진 task(여기서는 compile) 이후의 작업이 한번에 처리하게 된다.
다음으로, 결과 dtb 파일을 target board에 올려 보도록 하자.
$ cd build-openstlinuxweston-stm32mp2/tmp-glibc/deploy/images/stm32mp2/kernel
$ scp ./stm32mp257f-dk.dtb root@192.168.8.227:~/workspace/03072026
<Target board>
root@stm32mp2-e3-d2-e5:~/workspace/03072026# cp -f ./stm32mp257f-dk.dtb /boot/stm32mp257f-dk.dtb
root@stm32mp2-e3-d2-e5:~/workspace/03072026# sync
root@stm32mp2-e3-d2-e5:~/workspace/03072026# reboot
root@stm32mp2-e3-d2-e5:~/workspace/03072026# sync
root@stm32mp2-e3-d2-e5:~/workspace/03072026# reboot
(부팅 후) OK, 이제 blue LED는 꺼지고, green LED가 깜빡이는 것을 확인할 수가 있다.
[그림 7.2.8] LED8(green led)이 깜빡이는 모습
일단, 여기까지 작업한 내용을 기존 코드에 반영하려면 다음과 같이 하면 된다.
$ git add arch/arm64/boot/dts/st/stm32mp257f-dk.dts
$ git commit -m "Changed gpio-leds node"
[devtool ac0c8426b] Changed gpio-leds node
1 file changed, 10 insertions(+)
📌 git으로 commit하는 것을 까먹지 말자.
$ devtool update-recipe linux-stm32mp -a ../layers/meta-st/meta-my-custo-layer
-> 지금까지 사용자가 수정한 내용을 반영한다(patch를 만든다).
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openst
linuxweston-stm32mp2/cache/prserv.sqlite3, Address: 127.0.0.1:39879, PID: 26076
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openst
linuxweston-stm32mp2/cache/prserv.sqlite3, Address: 127.0.0.1:46275, PID: 26108
Loading cache: 100% |######################################################################| Time: 0:00:01
Loaded 5014 entries from dependency cache.
Parsing recipes: 100% |####################################################################| Time: 0:00:01
Parsing of 3050 .bb files complete (3046 cached, 4 parsed). 5017 targets, 615 skipped, 0 masked, 0 errors.
INFO: Handling main branch (devtool)...
NOTE: Writing append file /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my
-custo-layer/recipes-kernel/linux/linux-stm32mp_%.bbappend
NOTE: Copying 0001-Changed-gpio-leds-node.patch to /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/0001-Changed-gpio-leds-node.patch
...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openst
linuxweston-stm32mp2/cache/prserv.sqlite3, Address: 127.0.0.1:39879, PID: 26076
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openst
linuxweston-stm32mp2/cache/prserv.sqlite3, Address: 127.0.0.1:46275, PID: 26108
Loading cache: 100% |######################################################################| Time: 0:00:01
Loaded 5014 entries from dependency cache.
Parsing recipes: 100% |####################################################################| Time: 0:00:01
Parsing of 3050 .bb files complete (3046 cached, 4 parsed). 5017 targets, 615 skipped, 0 masked, 0 errors.
INFO: Handling main branch (devtool)...
NOTE: Writing append file /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my
-custo-layer/recipes-kernel/linux/linux-stm32mp_%.bbappend
NOTE: Copying 0001-Changed-gpio-leds-node.patch to /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my-custo-layer/recipes-kernel/linux/linux-stm32mp/0001-Changed-gpio-leds-node.patch
...
위의 명령 실행 결과, 추가된 내용을 확인해 보면 다음과 같다.
$ cd layers/meta-st/meta-my-custo-layer/recipes-kernel/linux
$ ls -l
drwxrwxr-x 2 chyi chyi 4096 3월 9 13:59 linux-stm32mp
-rw-rw-r-- 1 chyi chyi 103 3월 9 13:56 linux-stm32mp_%.bbappend
$ vi linux-stm32mp_%.bbappend
[그림 7.2.9] linux-stm32mp_%.bbappend file
$ cd linux-stm32mp
$ ls -la
-rw-rw-r-- 1 chyi chyi 928 3월 9 13:56 0001-Changed-gpio-leds-node.patch
-rw-r--r-- 1 chyi chyi 29572 3월 6 13:26 fragment.cfg
-rw-rw-r-- 1 chyi chyi 80 3월 6 13:22 linux-stm32mp_%.bbappend
$ devtool reset linux-stm32mp
-> 지금까지 workspace 상에서 작업한 모든 내용(원본 source 포함)을 삭제한다.
📌 단, 이 명령을 자주 사용할 필요는 없으며, 필요시 사용하면 된다.
참고로, devtool finish linux-stm32mp /path/to/custom/layer 명령을 사용하면, 앞서 두개의 명령(update-recipe, reset)을 연이어 수행하는 것과 동일하다.
$ devtool finish linux-stm32mp ../layers/meta-st/meta-my-custo-layer
-------------------------------------------------------------------------
여기까지 DTS 수정 작업이 모두 끝났으니, 이를 확인하고자 한다면 아래와 같이 새로운 kernel이 포함된 image를 만들어 돌려 보면 된다.
$ bitbake my-custom-image
7.3 kernel module 추가하기
이번에는 devtool을 사용하여 out-of-tree kernel module을 추가하는 시험을 진행해 보기로 하자.
7.2절에서 devtool reset(or finish) 명령을 실행했으므로, devtool modify를 시도하여 kernel code를 workspace로 가져오는 부분부터 다시 하도록 한다.
$ devtool modify -x linux-stm32mp
$ cd workspace/sources/linux-stm32mp
$ git branch
* devtool
devtool-no-overrides
devtool-override-aarch32
devtool-override-aarch64
devtool-override-arm
master
----------------------------------
$ devtool menuconfig linux-stm32mp
$ devtool build linux-stm32mp
---------------------------------------------------------------------------
그럼, 본격적으로 out-of-tree kernel module 추가 시험을 진행해 보도록 하자.
시험할 내용은 user button(예: USER2)을 하나 눌렀을 경우, interrupt가 발생하고 이 사실을 console로 출력하는 간단한 kernel module(소위 GPIO interrupt driver) 추가 작업이 되겠다.
먼저, 회로도와 PCB 상으로 user button이 어떻게 구성되어 있는지를 확인해 본다.
[그림 7.3.1] stm32mp257f-dk board 회로도 - Button 관련 부분 발췌 [출처 - 참고문헌 5]
[그림 7.3.3] stm32mp257f-dk 보드 User button pinout [출처 - 참고문헌 2]
마지막으로, device tree를 통해 USER1 button과 USER2 button이 어떻게 기술되어 있는지를 확인해 보도록 하자.
[그림 7.3.4] stm32mp257f-dk.dts 내용 중 gpio-keys node 부분 발췌
자, 그럼 아래와 같이 stm32mp257f-dk.dts 파일을 수정해 보도록 하자.
------------------------------------------------------------------------
gpio-keys {
compatible = "gpio-keys";
button-user-1 {
label = "User-1";
linux,code = <BTN_1>;
gpios = <&gpioc 5 GPIO_ACTIVE_HIGH>;
status = "okay";
};
/* blocked by chunghan.yi@gmail.com, 03/09/2026 --
button-user-2 {
label = "User-2";
linux,code = <BTN_2>;
gpios = <&gpioc 11 GPIO_ACTIVE_HIGH>;
status = "disabled";
};
*/
...
compatible = "gpio-keys";
button-user-1 {
label = "User-1";
linux,code = <BTN_1>;
gpios = <&gpioc 5 GPIO_ACTIVE_HIGH>;
status = "okay";
};
/* blocked by chunghan.yi@gmail.com, 03/09/2026 --
button-user-2 {
label = "User-2";
linux,code = <BTN_2>;
gpios = <&gpioc 11 GPIO_ACTIVE_HIGH>;
status = "disabled";
};
*/
...
/* added by chunghan.yi@gmail.com, 03/09/2026 -- */
user-button-2 {
compatible = "stm32mp257,userbutton2";
myxxx-gpios = <&gpioc 11 GPIO_ACTIVE_HIGH>;
interrupt-parent = <&gpioc>;
interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
status = "okay";
};
------------------------------------------------------------------------
user-button-2 {
compatible = "stm32mp257,userbutton2";
myxxx-gpios = <&gpioc 11 GPIO_ACTIVE_HIGH>;
interrupt-parent = <&gpioc>;
interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
status = "okay";
};
------------------------------------------------------------------------
이후, 아래 명령으로 kernel compile 이후 절차를 진행하도록 하자.
$ bitbake -C compile linux-stm32mp
아직 관련 device driver가 준비되지 않았지만, 일단 결과 dtb 파일을 target board에 올려 보도록 하자.
$ cd build-openstlinuxweston-stm32mp2/tmp-glibc/deploy/images/stm32mp2/kernel
$ scp ./stm32mp257f-dk.dtb root@192.168.8.227:~/workspace/03092026
<Target board>
root@stm32mp2-e3-d2-e5:~/workspace/03092026# cp -f ./stm32mp257f-dk.dtb /boot/stm32mp257f-dk.dtb
root@stm32mp2-e3-d2-e5:~/workspace/03092026# sync
root@stm32mp2-e3-d2-e5:~/workspace/03092026# reboot
root@stm32mp2-e3-d2-e5:~/workspace/03092026# sync
root@stm32mp2-e3-d2-e5:~/workspace/03092026# reboot
----------------------------------------------------------
자, 그럼 이제부터 device driver를 만들어 볼 차례이다.
$ mkdir -p mysources/kernel_modules
$ ls -la
-rw-rw-r-- 1 chyi chyi 487 3월 9 16:53 Makefile
-rw-rw-r-- 1 chyi chyi 3129 3월 9 16:53 stm32mp2_gpiokey.c
-rw-rw-r-- 1 chyi chyi 487 3월 9 16:53 Makefile
-rw-rw-r-- 1 chyi chyi 3129 3월 9 16:53 stm32mp2_gpiokey.c
$ cd mysources/kernel_modules
$ vi stm32mp2_gpiokey.c
[그림 7.3.5] stm32mp2_gpiokey.c
$ make
$ scp ./stm32mp2_gpiokey.ko root@192.168.8.227:~/workspace/03092026
<Target board>
$ cd ~/workspace/03092026
$ insmod ./stm32mp2_gpiokey.ko
-> OK, 이 상태에서 USER2 button을 누르면, 아래와 같이 정상적으로 message가 출력된다.
[그림 7.3.6] stm32mp2 gpio interrupt driver 동작 모습
------------------------------------------------------------------
지금까지 작업한 내용을 yocto project에 추가해 보도록 하자.먼저 devtool add 명령을 사용하여 kernel module 관련 recipe 파일을 생성하도록 한다.
$ devtool add mymodule mysources/kernel_modules/
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:45281, PID: 833061
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:37271, PID: 833073
WARNING: Unable to find means of passing kernel path into install makefile - if kernel path is hardcoded you will need to patch the makefile. Note t
hat the variable KERNEL_SRC will be passed in as the kernel source path.
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Reconnecting to bitbake server...
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:33437, PID: 833084
INFO: Using source tree as build directory since that would be the default for this recipe
INFO: Recipe /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/workspace/recipes/mymodule/mymodule.bb has been automatically created; further editing may be required to make it fully functional
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:45281, PID: 833061
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:37271, PID: 833073
WARNING: Unable to find means of passing kernel path into install makefile - if kernel path is hardcoded you will need to patch the makefile. Note t
hat the variable KERNEL_SRC will be passed in as the kernel source path.
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Reconnecting to bitbake server...
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Retrying server connection (#1)... (16:55:18.021363)
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:33437, PID: 833084
INFO: Using source tree as build directory since that would be the default for this recipe
INFO: Recipe /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/workspace/recipes/mymodule/mymodule.bb has been automatically created; further editing may be required to make it fully functional
$ cd workspace/recipes/mymodule
$ ls -la
-rw-rw-r-- 1 chyi chyi 1426 3월 9 17:02 mymodule.bb
이후, devtool edit-recipe 명령으로 자동 생성된 mymodule recipe file을 편집하도록 한다.
$ devtool edit-recipe mymodule
[그림 7.3.7] 자동 생성된 mymodule.bb recipe 파일 편집하기(1)
[그림 7.3.8] 자동 생성된 mymodule.bb recipe 파일 편집하기(2)
다음으로 mymodule에 이상이 없는지 build해 보도록 한다.
$ devtool build mymodule
이번에는 scp 대신 deploy-target 명령을 사용하여, kernel module을 target board에 올려 보도록 하자.
$ devtool deploy-target -Ss mymodule root@192.168.8.227:~/workspace/03092026_2
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:34799, PID: 837651
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (17:05:23.025959)
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:36729, PID: 837662
Loading cache: 100% |################################################################################################################| Time: 0:00:00
Loaded 5014 entries from dependency cache.
Parsing recipes: 100% |##############################################################################################################| Time: 0:00:00
Parsing of 3051 .bb files complete (3046 cached, 5 parsed). 5018 targets, 615 skipped, 0 masked, 0 errors.
devtool_deploy.list 100% 93 137.9KB/s 00:00
devtool_deploy.sh 100% 1017 2.0MB/s 00:00
./
./usr/
./usr/lib/
./usr/lib/modules/
./usr/lib/modules/6.6.116-gba4c4a7c8ff2-dirty/
./usr/lib/modules/6.6.116-gba4c4a7c8ff2-dirty/stm32mp2_gpiokey.ko
INFO: Successfully deployed /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/mymodule/1.0/devtool-deploy-target-stripped
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:34799, PID: 837651
NOTE: Reconnecting to bitbake server...
NOTE: Retrying server connection (#1)... (17:05:23.025959)
NOTE: Started PRServer with DBfile: /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/cache/prserv.sqlite3,
Address: 127.0.0.1:36729, PID: 837662
Loading cache: 100% |################################################################################################################| Time: 0:00:00
Loaded 5014 entries from dependency cache.
Parsing recipes: 100% |##############################################################################################################| Time: 0:00:00
Parsing of 3051 .bb files complete (3046 cached, 5 parsed). 5018 targets, 615 skipped, 0 masked, 0 errors.
devtool_deploy.list 100% 93 137.9KB/s 00:00
devtool_deploy.sh 100% 1017 2.0MB/s 00:00
./
./usr/
./usr/lib/
./usr/lib/modules/
./usr/lib/modules/6.6.116-gba4c4a7c8ff2-dirty/
./usr/lib/modules/6.6.116-gba4c4a7c8ff2-dirty/stm32mp2_gpiokey.ko
INFO: Successfully deployed /mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/build-openstlinuxweston-stm32mp2/tmp-glibc/work/stm32mp2-ostl-linux/mymodule/1.0/devtool-deploy-target-stripped
<Target board>
$ cd ~/workspace/03092026_2
$ insmod ./stm32mp2_gpiokey.ko
-> OK, 정상 동작한다.
--------------------------------------------------------------------
그런데, 이게 끝이 아니다. 앞서 작업한 kernel module을 mysources & workspace로 부터 meta-my-custo-layer로 이동시켜야 한다.
<kernel module source code 파일 복사>
$ mkdir -p ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/mymodule
$ cp mysources/kernel_modules/Makefile ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/mymodule
$ cp mysources/kernel_modules/stm32mp2_gpiokey.c ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/mymodule
<recipe 파일 복사>
$ cp workspace/recipes/mymodule/mymodule.bb ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/
chyi@earth:/mnt/hdd/workspace/ST/STM32MP257K_DK/Distribution-Package/layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule$ tree .
.
├── mymodule
│ ├── Makefile
│ └── stm32mp2_gpiokey.c
└── mymodule.bb
$ vi ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/mymodule.bb
.
├── mymodule
│ ├── Makefile
│ └── stm32mp2_gpiokey.c
└── mymodule.bb
$ vi ../layers/meta-st/meta-my-custo-layer/recipes-custom/mymodule/mymodule.bb
-> (파일 위치가 고정되었으니) 아래와 같이 mymodule.bb 파일을 다시 수정한다. 이번에는 수정하는 김에 LICENSE 부분도 변경하도록 하자.
[그림 7.3.10] mymodule.bb 파일 최종 수정 모습
mymodule이 정상 build되는지 시도해 본다.
$ devtool build mymodule
$ vi my-custom-image.bb
#require recipes-core/images/st-image-weston.bb
require ../meta-st-openstlinux/recipes-st/images/st-image-weston.bb
IMAGE_INSTALL += "helloyocto mymodule"
~
📌 IMAGE_INSTALL에 추가할 내용은 stm32mp2_gpiokey.ko가 아니라, recipe 명이다.
$ bitbake my-custom-image
성공적으로 build가 끝났으면, kernel module(stm32mp2_gpiokey.ko)이 정상적으로 image에 포함되었는지 확인해 본다.
$ cd tmp-glibc/deploy/images/stm32mp2
$ mkdir bbb; tar xvf ./my-custom-image-openstlinux-weston-stm32mp2.splitted-rootfs-20260310042925.tar -C ./bbb; cd bbb
$ find . -name "stm32mp2_gpiokey.ko" -print
./usr/lib/modules/6.6.116-g2139b4c6e7cd/stm32mp2_gpiokey.ko
OK, 정상적으로 추가되었다. 😎
7.4 u-boot SSBL bootloader 수정하기
이번 절에서는 devtool을 사용하여 u-boot를 개발하는 과정을 살펴보기로 하자.
먼저, virtual/bootloader를 사용해도 되지만, stm32mp용 u-boot recipe 명을 찾아 보도록 한다.
$ devtool search u-boot*
...
u-boot-stm32mp Universal Boot Loader for embedded devices for stm32mp
u-boot-tools-stm32mp
u-boot-stm32mp-splash Universal Boot Loader Splash Screen for stm32mp embedded devices
libubootenv U-Boot libraries and tools to access environment
libubootenv-native U-Boot libraries and tools to access environment
nativesdk-u-boot-tools U-Boot bootloader tools
nativesdk-u-boot-tools-stm32mp
u-boot-fw-config-stm32mp U-Boot bootloader fw_printenv/setenv utilities
u-boot-tools U-Boot bootloader tools
u-boot-tools-native U-Boot bootloader tools
u-boot-tools-stm32mp-native
u-boot-tools-stm32mp
u-boot-stm32mp-splash Universal Boot Loader Splash Screen for stm32mp embedded devices
libubootenv U-Boot libraries and tools to access environment
libubootenv-native U-Boot libraries and tools to access environment
nativesdk-u-boot-tools U-Boot bootloader tools
nativesdk-u-boot-tools-stm32mp
u-boot-fw-config-stm32mp U-Boot bootloader fw_printenv/setenv utilities
u-boot-tools U-Boot bootloader tools
u-boot-tools-native U-Boot bootloader tools
u-boot-tools-stm32mp-native
다음으로 u-boot source code를 workspace로 내려 받도록 한다.
$ devtool modify u-boot-stm32mp
$ ls -la workspace/sources
drwxr-xr-x 10 chyi chyi 4096 3월 5 11:39 libmnl
drwxr-xr-x 28 chyi chyi 4096 3월 10 13:14 linux-stm32mp
drwxr-xr-x 27 chyi chyi 4096 3월 10 13:58 u-boot-stm32mp
이후, u-boot code 수정이 필요하다면, 수정 후 build를 시도해 보도록 하자.
$ devtool build u-boot-stm32mp
$ bitbake -c deploy u-boot-stm32mp
$ ls -l tmp-glibc/deploy/images/stm32mp2/u-boot
-rw-r--r-- 2 chyi chyi 57397 3월 10 14:08 configuration-stm32mp21-fastboot-emmc_defconfig
-rw-r--r-- 2 chyi chyi 57318 3월 10 14:08 configuration-stm32mp21-fastboot-sdcard_defconfig
-rw-r--r-- 2 chyi chyi 57397 3월 10 14:08 configuration-stm32mp21_defconfig
-rw-r--r-- 2 chyi chyi 57796 3월 10 14:08 configuration-stm32mp23-fastboot-emmc_defconfig
-rw-r--r-- 2 chyi chyi 57717 3월 10 14:08 configuration-stm32mp23-fastboot-sdcard_defconfig
-rw-r--r-- 2 chyi chyi 57796 3월 10 14:08 configuration-stm32mp23_defconfig
-rw-r--r-- 2 chyi chyi 57798 3월 10 14:08 configuration-stm32mp25-fastboot-emmc_defconfig
-rw-r--r-- 2 chyi chyi 57719 3월 10 14:08 configuration-stm32mp25-fastboot-sdcard_defconfig
-rw-r--r-- 2 chyi chyi 57798 3월 10 14:08 configuration-stm32mp25_defconfig
drwxr-xr-x 2 chyi chyi 4096 3월 10 14:08 debug
-rw-r--r-- 2 chyi chyi 1783296 3월 10 14:08 u-boot-nodtb-stm32mp21-default.bin
-rw-r--r-- 2 chyi chyi 1783296 3월 10 14:08 u-boot-nodtb-stm32mp21-fastboot-emmc.bin
-rw-r--r-- 2 chyi chyi 1783248 3월 10 14:08 u-boot-nodtb-stm32mp21-fastboot-sdcard.bin
-rw-r--r-- 2 chyi chyi 1783296 3월 10 14:08 u-boot-nodtb-stm32mp21-programmer.bin
-rw-r--r-- 2 chyi chyi 1856288 3월 10 14:08 u-boot-nodtb-stm32mp23-default.bin
-rw-r--r-- 2 chyi chyi 1856288 3월 10 14:08 u-boot-nodtb-stm32mp23-fastboot-emmc.bin
-rw-r--r-- 2 chyi chyi 1856240 3월 10 14:08 u-boot-nodtb-stm32mp23-fastboot-sdcard.bin
-rw-r--r-- 2 chyi chyi 1856288 3월 10 14:08 u-boot-nodtb-stm32mp23-programmer.bin
-rw-r--r-- 2 chyi chyi 1856432 3월 10 14:08 u-boot-nodtb-stm32mp25-default.bin
-rw-r--r-- 2 chyi chyi 1856432 3월 10 14:08 u-boot-nodtb-stm32mp25-fastboot-emmc.bin
-rw-r--r-- 2 chyi chyi 1856384 3월 10 14:08 u-boot-nodtb-stm32mp25-fastboot-sdcard.bin
-rw-r--r-- 2 chyi chyi 1856432 3월 10 14:08 u-boot-nodtb-stm32mp25-programmer.bin
-rw-r--r-- 2 chyi chyi 91312 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-default.dtb
-rw-r--r-- 2 chyi chyi 91312 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 91312 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 91296 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-m33-examples-default.dtb
-rw-r--r-- 2 chyi chyi 91296 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-m33-examples-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 91296 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-m33-examples-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 91296 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-m33-examples-programmer.dtb
-rw-r--r-- 2 chyi chyi 91312 3월 10 14:08 u-boot-stm32mp215f-dk-ca35tdcid-ostl-programmer.dtb
-rw-r--r-- 2 chyi chyi 91248 3월 10 14:08 u-boot-stm32mp215f-dk-default.dtb
-rw-r--r-- 2 chyi chyi 91248 3월 10 14:08 u-boot-stm32mp215f-dk-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 91248 3월 10 14:08 u-boot-stm32mp215f-dk-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 91248 3월 10 14:08 u-boot-stm32mp215f-dk-programmer.dtb
-rw-r--r-- 2 chyi chyi 105672 3월 10 14:08 u-boot-stm32mp235f-dk-default.dtb
-rw-r--r-- 2 chyi chyi 105672 3월 10 14:08 u-boot-stm32mp235f-dk-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 105672 3월 10 14:08 u-boot-stm32mp235f-dk-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 105672 3월 10 14:08 u-boot-stm32mp235f-dk-programmer.dtb
-rw-r--r-- 2 chyi chyi 119896 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-default.dtb
-rw-r--r-- 2 chyi chyi 119896 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 119896 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 118984 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-default.dtb
-rw-r--r-- 2 chyi chyi 118984 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 118984 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 118984 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-programmer.dtb
-rw-r--r-- 2 chyi chyi 119896 3월 10 14:08 u-boot-stm32mp257f-dk-ca35tdcid-ostl-programmer.dtb
-rw-r--r-- 2 chyi chyi 119944 3월 10 14:08 u-boot-stm32mp257f-dk-default.dtb
-rw-r--r-- 2 chyi chyi 119944 3월 10 14:08 u-boot-stm32mp257f-dk-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 119944 3월 10 14:08 u-boot-stm32mp257f-dk-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 119944 3월 10 14:08 u-boot-stm32mp257f-dk-programmer.dtb
-rw-r--r-- 2 chyi chyi 118288 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-default.dtb
-rw-r--r-- 2 chyi chyi 118288 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 118288 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 117592 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-default.dtb
-rw-r--r-- 2 chyi chyi 117592 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 117592 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 117592 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-programmer.dtb
-rw-r--r-- 2 chyi chyi 117336 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-default.dtb
-rw-r--r-- 2 chyi chyi 117336 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 117336 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 117336 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-m33-examples-sram-programmer.dtb
-rw-r--r-- 2 chyi chyi 118288 3월 10 14:08 u-boot-stm32mp257f-ev1-ca35tdcid-ostl-programmer.dtb
-rw-r--r-- 2 chyi chyi 119456 3월 10 14:08 u-boot-stm32mp257f-ev1-default.dtb
-rw-r--r-- 2 chyi chyi 119456 3월 10 14:08 u-boot-stm32mp257f-ev1-fastboot-emmc.dtb
-rw-r--r-- 2 chyi chyi 119456 3월 10 14:08 u-boot-stm32mp257f-ev1-fastboot-sdcard.dtb
-rw-r--r-- 2 chyi chyi 119456 3월 10 14:08 u-boot-stm32mp257f-ev1-programmer.dtb
-------------------------------------------------------------------------
다음으로 할 일은 u-boot binary를 FIP(Firmware Image Package) image 안에 끼워 넣도록 하자.
$ bitbake fip-stm32mp
📌 FIP는 u-boot, TF-A 같은 firmware를 구동하기 위해 사용하는 image format으로, Amlogic이나 STMicroelectronics MPU에서 사용된다고 한다.
$ ls -l tmp-glibc/deploy/images/stm32mp2/fip
...
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 373 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 368 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 374 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 375 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 350 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 380 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 356 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 359 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 389 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 365 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-ddr-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3132662 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 1975 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 2668182 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 1946 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2668134 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 1972 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3132614 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 1985 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 412 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 407 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 413 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 414 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 389 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 419 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 395 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 398 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 428 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 404 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-ddr-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3131774 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 2196 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 2667294 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 2167 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2667246 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 2193 3월 10 14:21 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3131726 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 2206 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 3160702 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 2023 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 3131774 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 2191 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 3160702 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 2041 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 2667294 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 2068 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2638366 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 2236 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 2667294 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 2086 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3161590 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 1802 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 3132662 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 1970 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 3161590 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 1820 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 2668182 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 1847 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2639254 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 2015 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 2668182 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 1865 3월 10 14:20 fip-stm32mp257f-dk-ca35tdcid-ostl-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 328 3월 10 14:20 fip-stm32mp257f-dk-ddr-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ddr-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 323 3월 10 14:21 fip-stm32mp257f-dk-ddr-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:21 fip-stm32mp257f-dk-ddr-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 329 3월 10 14:21 fip-stm32mp257f-dk-ddr-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 330 3월 10 14:20 fip-stm32mp257f-dk-ddr-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 305 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 335 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 311 3월 10 14:20 fip-stm32mp257f-dk-ddr-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 314 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 344 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 34480 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 320 3월 10 14:20 fip-stm32mp257f-dk-ddr-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3132778 3월 10 14:20 fip-stm32mp257f-dk-fastboot-emmc.bin
-rw-r--r-- 1 chyi chyi 1720 3월 10 14:20 fip-stm32mp257f-dk-fastboot-emmc.txt
-rw-r--r-- 1 chyi chyi 2668298 3월 10 14:21 fip-stm32mp257f-dk-fastboot-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 1691 3월 10 14:21 fip-stm32mp257f-dk-fastboot-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2668250 3월 10 14:21 fip-stm32mp257f-dk-fastboot-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 1717 3월 10 14:21 fip-stm32mp257f-dk-fastboot-opteemin-sdcard.txt
-rw-r--r-- 1 chyi chyi 3132730 3월 10 14:20 fip-stm32mp257f-dk-fastboot-sdcard.bin
-rw-r--r-- 1 chyi chyi 1730 3월 10 14:20 fip-stm32mp257f-dk-fastboot-sdcard.txt
-rw-r--r-- 1 chyi chyi 3161706 3월 10 14:20 fip-stm32mp257f-dk-optee-emmc.bin
-rw-r--r-- 1 chyi chyi 1547 3월 10 14:20 fip-stm32mp257f-dk-optee-emmc.txt
-rw-r--r-- 1 chyi chyi 3132778 3월 10 14:20 fip-stm32mp257f-dk-optee-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 1715 3월 10 14:20 fip-stm32mp257f-dk-optee-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 3161706 3월 10 14:20 fip-stm32mp257f-dk-optee-sdcard.bin
-rw-r--r-- 1 chyi chyi 1565 3월 10 14:20 fip-stm32mp257f-dk-optee-sdcard.txt
-rw-r--r-- 1 chyi chyi 2668298 3월 10 14:20 fip-stm32mp257f-dk-opteemin-emmc.bin
-rw-r--r-- 1 chyi chyi 1592 3월 10 14:20 fip-stm32mp257f-dk-opteemin-emmc.txt
-rw-r--r-- 1 chyi chyi 2639370 3월 10 14:20 fip-stm32mp257f-dk-opteemin-programmer-usb.bin
-rw-r--r-- 1 chyi chyi 1760 3월 10 14:20 fip-stm32mp257f-dk-opteemin-programmer-usb.txt
-rw-r--r-- 1 chyi chyi 2668298 3월 10 14:20 fip-stm32mp257f-dk-opteemin-sdcard.bin
-rw-r--r-- 1 chyi chyi 1610 3월 10 14:20 fip-stm32mp257f-dk-opteemin-sdcard.txt
...
-------------------------------------------------------------------------
이후, microSD를 PC에 연결한 후, fip binary가 위치할 partition 정보를 확인하도록 하자.
[그림 7.4.2] microSD 카드 partition 정보 확인
dd 명령을 사용하여 앞서 생성한 fip image를 fip-a partition에 write하도록 하자.
$ dd if=fip-stm32mp257f-dk-optee-sdcard.bin of=/dev/sdb5 bs=1M conv=fdatasync
이후, (microSD를 다시 장착한 후) target board를 재부팅하여 u-boot의 변경 사항을 확인해 보면 된다.
만일, u-boot에 수정 사항이 발생했다면, devtool을 사용하여 반영하면 된다. 이는 kernel의 경우와 동일하다.
$ devtool update-recipe u-boot-stm32mp -a ../layers/meta-st/meta-my-custo-layer
$ bitbake my-custom-image
----------------------------------------------------------------------
7.5 TF-A FSBL bootloader 수정하기
이번 절에서는 devtool을 사용하여 TF-A를 개발하는 과정을 살펴보기로 하자. 반복되는 내용이므로 간단하게만 정리하고 넘어가기로 한다. 😋
$ devtool search tf-a*
...
tf-a-stm32mp Trusted Firmware-A for STM32MP1
...
$ devtool modify tf-a-stm32mp
$ ls -la
drwxr-xr-x 10 chyi chyi 4096 3월 5 11:39 libmnl
drwxr-xr-x 28 chyi chyi 4096 3월 10 13:14 linux-stm32mp
drwxr-xr-x 20 chyi chyi 4096 3월 10 14:42 tf-a-stm32mp
drwxr-xr-x 27 chyi chyi 4096 3월 10 14:05 u-boot-stm32mp
$ devtool build tf-a-stm32mp
$ ls -l tmp-glibc/deploy/images/stm32mp2/arm-trusted-firmware
...
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-optee-sdcard.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-m33-examples-opteemin-sdcard.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-optee-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-optee-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-optee-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-optee-sdcard.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-opteemin-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-opteemin-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-opteemin-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-ca35tdcid-ostl-opteemin-sdcard.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-optee-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-optee-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-optee-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-optee-sdcard.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-opteemin-emmc.stm32
-rw-r--r-- 2 chyi chyi 192496 3월 10 14:49 tf-a-stm32mp257f-dk-opteemin-programmer-uart.stm32
-rw-r--r-- 2 chyi chyi 196592 3월 10 14:49 tf-a-stm32mp257f-dk-opteemin-programmer-usb.stm32
-rw-r--r-- 2 chyi chyi 200744 3월 10 14:49 tf-a-stm32mp257f-dk-opteemin-sdcard.stm32
...
-------------------------------------------------------------------------
dd 명령을 사용하여 앞서 생성한 tf-a image를 fsbla1 파티션에 write하도록 하자.
$ dd if=tf-a-stm32mp257f-dk-optee-sdcard.stm32 of=/dev/sdb1 bs=1M conv=fdatasync
이후, target board를 재부팅하여 tf-a image의 변경 사항을 확인해 보면 된다.
만일, tf-a bootloader code에 수정 사항이 발생했다면, 역시 devtool을 사용하면 된다.
$ devtool update-recipe tf-a-stm32mp -a ../layers/meta-st/meta-my-custo-layer
$ bitbake my-custom-image
==================================================================================
이상으로 (조금은 험난한 과정을 거쳐) yocto project의 devtool & bitbake를 이용하여 linux kernel 및 bootloader code를 handling하는 과정을 살펴 보았다.
To be continued...
References
[1] https://www.st.com/en/evaluation-tools/stm32mp257f-dk.html
[2] UM3385 - Discovery kit with STM32MP257F MPU - User manual, STMicroelectronics.
[3] Data brief - STM32MP257F-DK, STMicroelectronics.
[4] STM32MP251C/F STM32MP253C/F, STM32MP255C/F STM32MP257C/F Datasheet, STMicroelectronics.
[5] STM32MP257-DK schematic, STMicroelectronics.
[6] RM0457 Reference manual, STM32MP23/25xx advanced Arm®-based 32/64-bit MPUs
[7] https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP2_boards/STM32MP257x-DK
[8] https://wiki.st.com/stm32mpu/wiki/STM32MP2_boot_chain_overview
[9] https://wiki.st.com/stm32mpu/wiki/STM32MPU_Distribution_Package
-> STM32MP documents
[10] https://docs.yoctoproject.org/
-> yocto project manual
[11] https://bootlin.com/doc/training/embedded-linux/embedded-linux-stm32mp2-labs.pdf
-> bootlin documents
[13] Mastering Embedded Linux Programming, Frank Vasquez, Chris Simmonds, Packt.
[14] And Google and Gemini~
Slowboot
















.jpg)













댓글 없음:
댓글 쓰기