거의 6년만에 STM32MP 보드를 다시 하나 입수했다(이번에는 STM32MP257F-DK 보드다). 이번 시간 부터는 앞으로 몇차례에 걸쳐서, STM32MP257F-DK 보드 기반 embedded linux와 관련한 다양한 주제를 다뤄 보고자 한다. 😎
목차
1. STM32MP257F-DK 보드 소개
2. 부팅 image 설치와 Booting flow
3. Yocto project 기반 booting image 생성하기
4. Buildroot 기반 booting image 생성하기
5. OpenSTLinux BSP#1 - u-boot, Linux kernel
6. OpenSTLinux BSP#2 - Device Tree 및 Device Drivers
7. Rust Kernel Programming
8. Cortex-M33 CPU#1 - STM32CubeIDE 기반 Application 돌려 보기
9. Cortex-M33 CPU#2 - Zephyr RTOS Application 돌려보기
10. Qt6 Application 돌려 보기 - C++ or PySide6
11. WireGuard Rust 돌려 보기
References
Keywords: STM32MP257F-DK, booting flow, u-boot, linux kernel, device tree, yocto project, Buildroot, Rust kernel module, STM32CubeIDE, Zephyr RTOS, PySide6
1. STM32MP257F-DK 보드 소개
보드가 도착하였으니, 제일 먼저 할 일은 STM32MP257F-DK(Discovery Kit) 보드의 h/w적인 특징을 파악해 보는 것이다. 🎶
[그림 1.1] STM32MP257F-DK 보드 [출처 - 참고문헌 1]
--------------------------------------------------------------------------
[1] SoC(microprocessor): STM32MP257FAK3 = Arm® dual‑core Cortex®‑A35 at 1.5 GHz + Cortex®‑M33 at 400 MHz
[1] SoC(microprocessor): STM32MP257FAK3 = Arm® dual‑core Cortex®‑A35 at 1.5 GHz + Cortex®‑M33 at 400 MHz
-> Linux(Cortex-A35) + RTOS(Cortex-M33) 구성 가능
[2] PMIC: STPMIC25
-> Power managenemt IC
-> Cortex-A35 i2c7 controller를 통해 제어 가능함.
[3] RAM: 4GB LPDDR4
-> Micron D8DVT(모바일 및 임베디드 기기에 사용되는 고속 저전력 메모리인 LPDDR4/4X SDRAM의 FBGA(Fine-pitch Ball Grid Array))
[4] flash memory: 8GB eMMC
-> SDMMC2 controller에 연결되어 있음.
[5] microSD
-> SDMMC1 controller에 연결되어 있음.
[6] 주변 장치(Peripherals)
- 1 Gbps ethernet phy(RTL8211F) & RJ45 connector
- USB 2.0 x 2 HUB
- USB 3.0 DRD : USB booting -> STM32CubeProgrammer를 이용한 flashing
- Wi-Fi 802.11b/g/n, BLE 4.1 : LBEE5KL1YN-814 Murata Wi-Fi/Bluetooth module
- MIPI CSI-2 connector for camera(2 data lanes)
- DSI to HDMI bridge and HDMI connector
- LVDS connector(4 data lanes)
- LED x 4
- Button x 5
- 40pin GPIO 확장 connector
- VBAT(battery)
- boot pin switch x 4 (microSD, eMMC, USB flashing 등 선택 용)
[7] On-board STLINK-V3EC
-> Cortex-M33 CPU에 대한 flash programming or Cortex-A35 debugging port(serial console 연결)로 사용
[8] Power input: 5 V/3 A USB-C
--------------------------------------------------------------------------
보드 앞면(top view)과 뒷면(bottom view)을 자세히 살펴보면 다음과 같다.
[그림 1.2] STM32MP257F-DK 보드 top view [출처 - 참고문헌 2]
📌 가운데에 있는 정사각형 chip이 STM32MP257FAK3 microprocessor(MPU)이다.
보드 뒷면(bottom view)은 microSD만 있고, 나머지는 깨끗하다. 🏂
[그림 1.3] STM32MP257F-DK 보드 bottom view [출처 - 참고문헌 2]
다음으로 회로도(Schematics)를 확인해 보아야 하는데, 이에 앞서 block도를 먼저 확인해 보는 것이 먼저 일 것 같다(전체 h/w 구성을 한눈에 확인할 수 있다).
[그림 1.4] STM32MP257F-DK 보드 block diagram [출처 - 참고문헌 2]
<여기서 잠깐!>
Embedded board의 SoC는 CPU Core(예: ARM core)와 다양한 Device(or Peripheral) Controller(예: DRAM controller, MMC controller, RGMII Ethernet Controller, USB DRD or Host Controller, UART controller, GPIO controller 등)로 구성되어 있다. 한편 Board에는 SoC(정확하게는 Device Controller)와 연결된 다양한 주변 장치(consumer device or peripheral)가 장착되어 있다. 따라서 Board에 장착된 device는 반드시 SoC 내의 device controller와 연결되는 구조로 이해할 수 있다. 이는 회로도를 분석하는 과정에서 중요한 point가 될 뿐만아니라, device driver(device tree)를 설계하는 입장에서 볼 때도, controller(or adapter)용 device driver와 consumer device용 device driver라는 2가지 종류로 나누어 생각해야 한다는 의미이기도 하다.
[그림 1.5] ARM SoC과 주변 장치와의 관계 [출처 - 참고문헌 8]
_________________________________________________________________
회로도(Schematics)와 관련해서는 여기에서 모든 내용을 일일히 소개할 수는 없는 관계로, booting device인 microSD와 eMMC의 연결도만을 살펴보기로 한다. 따라서 나머지 부분에 대해서는 (독자 여러분이 직접) SoC 내의 device controller와 주요 장치(device)와의 연결 부분을 중심으로 하나씩 따져보기 바란다. 😋
[그림 1.6] STM32MP257F-DK 보드 회로도 시작 page [출처 - 참고문헌 5]
먼저, 아래 회로는 (그림 좌측의) SoC 내의 SDMMC1 controller와 (우측의)microSD connector가 연결된 모습을 보여준다. 이 내용을 통해서 알 수 있는 것은 microSD는 4가닥의 data line(SDMMC1_D0 ~ D3)과 1개의 Clock(SDMMC1_CK) 및 1개의 CMD interface(SDMMC1_CMD)를 통해 연결되어 있다는 사실이다.
[그림 1.7] STM32MP257F-DK 보드 회로도 - microSD 연결부[출처 - 참고문헌 5]
다음으로, 아래 회로는 SoC내의 SDMMC2 controller와 eMMC chip간의 연결도를 나타낸다. eMMC도 microSD와 유사하게 8가닥의 data line(SDMMC2_D0 ~ D7)과 1개의 Clock(SDMMC2_CK) 및 1개의 CMD interface(SDMMC2_CMD)를 통해 연결되어 있음을 확인할 수가 있다. Data line이 상대적으로 많은 걸 보니, eMMC가 microSD에 비해 data read/write 속도가 빠를 것으로 예상된다.
📌 위 회로도에 표시된 eMMC chip의 하단에 표시된 모델명 즉, THGBMUG6C1LBAIL을 검색해 보니, Kioxia America Inc라는 회사명이 나온다.
-------------------------------------
한편, Embedded board 설계 시, 가장 중요한 부분 중 하나는 power management 관련 부분이다. 아래 그림은 PMIC chip인 STPMIC25를 이용하여 CPU(or MPU) 및 주변 장치에 power가 어떻게 공급되고 있는지(power tree)를 보여준다. 사실 h/w 담당자가 아닌 이상 이런 내용을 쉽게 이해하는 것이 어렵긴 하지만, 그래도 매우 중요한 부분이니 대략적으로라도 이해하려고 노력해 볼 필요가 있을 듯하다. 😂
STM32MP257F-DK 보드는 3가지 부팅 방법 즉, USB booting(flash programming을 위해), SD card booting 및 eMMC booting을 지원한다. 따라서 이들 간의 전환을 위해서는 아래 그림과 같이 별도의 boot switch가 마련되어 있다.
끝으로, 이번 장에서 마지막으로 살펴 볼 내용은 40pin GPIO 확장 커넥터의 pinout에 관한 것이다. 이 부분 역시 Device tree & driver 작성 시 자주 참조되는 부분이라고 말할 수 있겠다.
📌 위 내용은 [참고문헌 4] 즉, CPU(STM32MP257FAK3) 관련 datasheet와 연계해서 보아야 한다.
지금까지 STM32MP257F-DK 보드의 h/w 구성에 관하여 대략적으로 살펴 보았다. 이어지는 장에서는 board를 부팅시키는 방법을 살펴보기로 하자.
2. 부팅 image 설치하기
이번 장에서는 STM32MP257F-DK 보드를 부팅시키는 방법을 알아 보도록 하자. 이번 장에서 설명하는 내용은 아래 site의 내용을 기초로 하였다.
먼저, STM32MP257F-DK 보드에는 2개의 USB-C port가 있는데, (처음 접할 때에 헷갈릴 수가 있으니) 각각의 용도를 명확히 해 보면 다음과 같다.
[그림 2.2] STM32MP257F-DK 보드 USB port 연결
<2개의 USB-C port의 역할 정리>
a) CN21 port: 5V/3A Power Input 혹은 ST-LINK(Cortex-M33 CPU flash programming용) 용이다. 또한, Cortex-A35 debugging(serial console)을 위해서도 이 포트가 사용한다. 따라서 Serial console을 연결하고 싶을 때는 5V/3A power input 대신 PC <-> CN21 port 간을 USB-A to C cable로 연결해 주면 된다.
b) CN15 port: USB DRD(Dual Role Device) 포트로, 호스트 역할과 디바이스 역할 간에 자동으로 전환을 가능하게 해준다(USB 3.1 스펙에서 정의됨). 또한 이 포트는 USB(정확히는 ROM code -> u-boot)를 통한 flash programming을 하기 위해서도 사용된다.
다음으로 알아볼 사항은 부팅 image 설치에 관한 것인데, 먼저 대략적인 절차를 알아본 후, 이어서 상세 설정 과정을 살펴 보기로 하자.
<부팅 image 설치 절차 요약>
1) Linux PC에 STM32CubeProgrammer를 설치한다.
-> STM32CubeProgrammer는 CN15 pin USB port를 통해 linux image를 설치하거나, CN21 STLINK를 이용해 Cortex-M33용 firmware를 설치하는 program이다.
2) stm32mp2 openlinux-6.6-yocto prebuilt image를 내려 받는다.
-> 참고로, 이 image는 3장에서 yocto project를 통해서 만든 것과 일치한다.
3) USB-C to A cable을 target board CN15 pin과 Linux PC 사이에 연결한다.
4) boot switch를 USB booting mode(Boot0 ~ 3 : 0 0 0 0)로 조정한다.
5) 5V/3A 전원을 인가한 후, STM32CubeProgrammer를 이용하여 booting image를 microSD에 설치한다.
-> USB 연결 버튼 선택
-> FlashLayout_sdcard_stm32mp257f-dk-optee.tsv 선택
-> Binaries path 지정
6) 설치가 완료된 후에는 (전원을 끈 상태에서) boot switch를 SD card booting mode(Boot0 ~ 3 : 1 0 0 0)로 재 조정한 후, 전원을 다시 인가하여 부팅을 시도한다.
7) 이때 serial console 상태에서 부팅하는 모습을 확인하고자 한다면, 5V/3A power adapter 대신에 USB-C to A cable을 대신 연결한 후, minicom과 같은 serial console program을 통해 booting 과정을 확인한다.
-> minicom -D /dev/ttyACM0
------------------------------------------------------------------------
USB booting의 진정한 의미는 ROM code로 하여금 USB interface를 통해 전달한 firmware image를 target device 즉, eMMC or microSD에 writing하는 것을 말한다.
자, 그럼 이제부터는 위에서 언급한 순서대로 상세 절차(Ubuntu 22.04 기준으로 설명함)를 진행해 보기로 하자.
<Step#1 STM32CubeProgrammer 설치>
먼저, 아래 site에서 SetupSTM32CubeProgrammer_linux_64.zip 파일을 내려 받는다.
zip 파일의 압축을 푼 후, 아래 program을 실행하여, 설치를 시작한다.
$ ./SetupSTM32CubeProgrammer-2.22.0.linux
[그림 2.6] STM32CubeProgrammer 설치
$ vi ~/.bashrc
$ export PATH=/home/chyi/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin:$PATH
$ source ~/.bashrc
다음으로, OpenSTLinux prebuilt image를 내려 받도록 한다.
<Step#2 STM32MP2 prebuilt image 내려 받기>
-> STM32MP2 OpenSTLinux Starter Package for A35-TD flavor
$ tar xvzf FLASH-stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v26.02.18.tar.gz
$ cd stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v26.02.18/images/stm32mp2
$ ls -l
drwxr-xr-x 7 chyi chyi 12288 2월 11 20:53 arm-trusted-firmware
drwxr-xr-x 3 chyi chyi 4096 2월 11 20:53 arm-trusted-firmware-m
-rw-r--r-- 1 chyi chyi 1449 2월 11 20:53 build-st-image-weston-openstlinux-weston-stm32mp2
drwxr-xr-x 2 chyi chyi 36864 2월 11 20:53 fip
drwxr-xr-x 8 chyi chyi 4096 2월 11 20:53 flashlayout_st-image-weston
drwxr-xr-x 2 chyi chyi 4096 2월 11 20:53 kernel
drwxr-xr-x 3 chyi chyi 20480 2월 11 20:53 optee
drwxr-xr-x 2 chyi chyi 4096 2월 11 20:53 scripts
-rw-r--r-- 1 chyi chyi 8459749 2월 11 20:53 st-image-resize-initrd-openstlinux-weston-stm32mp2.rootfs.cpio.gz
-rw-r--r-- 1 chyi chyi 1776 2월 11 20:53 st-image-resize-initrd-openstlinux-weston-stm32mp2.rootfs.manifest
-rw-r--r-- 1 chyi chyi 175218 2월 11 20:53 st-image-resize-initrd-openstlinux-weston-stm32mp2.rootfs.spdx.tar.zst
-rw-r--r-- 1 chyi chyi 535547 2월 11 20:53 st-image-resize-initrd-openstlinux-weston-stm32mp2.rootfs.testdata.json
-rw-r--r-- 1 chyi chyi 488488 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.rootfs-license_content.html
-rw-r--r-- 1 chyi chyi 47893 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.rootfs.license
-rw-r--r-- 1 chyi chyi 114498 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.rootfs.manifest
-rw-r--r-- 1 chyi chyi 3948132 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.rootfs.spdx.tar.zst
-rw-r--r-- 1 chyi chyi 550071 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.rootfs.testdata.json
-rw-r--r-- 1 chyi chyi 67108864 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.splitted-bootfs.ext4
-rw-r--r-- 1 chyi chyi 788515840 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.splitted-rootfs.ext4
-rw-r--r-- 1 chyi chyi 87122944 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.splitted-userfs.ext4
-rw-r--r-- 1 chyi chyi 50331648 2월 11 20:53 st-image-weston-openstlinux-weston-stm32mp2.splitted-vendorfs.ext4
-rw-r--r-- 1 chyi chyi 68 2월 11 20:53 st-initrd-openstlinux-weston-stm32mp2
drwxr-xr-x 3 chyi chyi 4096 2월 11 20:53 u-boot
📌 눈치챘겠지만, 위의 파일들은 yocto project의 build 결과물에 해당한다.
<Step#3 STM32CubeProgrammer로 microSD 부팅 이미지 설치>
이번에 할 일은 STM32CubeProgrammer를 이용하여 microSD에 부팅 image를 설치하는 것이다.
<STM32CubeProgrammer 기반 부팅 이미지 설치 단계 요약>
a) STM32CubeProgrammer를 실행한다(d 단계 진행 후 실행해도 된다).
b) USB-C to A cable을 이용하여 target board CN15 port와 Linux PC 사이를 연결한다.
c) boot switch를 USB booting mode로 조정한다.
d) 5V/3A 전원을 입력한다.
e) STM32CubeProgrammer 우측 창에서 STLink(or UART) 대신 USB를 선택하고, Connect 버튼을 누른다.
___________________________________________________________
$ STM32CubeProgrammer
[그림 2.7] STM32CubeProgrammer 최초 실행 모습
STM32CubeProgrammer 우측 창에서 STLink(or UART) 대신 USB를 선택하고, Connect 버튼을 누른다. 정상적으로 연결된 경우, 하단 로그 창에 SN(Serial Number) 등이 출력된다. 만일 실패한다면, reset 버튼을 누른 후, 동일한 과정을 반복해 보기 바란다.
다음으로, 상단의 Open file 메뉴를 눌러, microSD 카드에 설치할 flashlayout file을 선택하도록 한다.
stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v26.02.18/images/stm32mp2/flashlayout_st-image-weston/optee/FlashLayout_sdcard_stm32mp257f-dk-optee.tsv
[그림 2.9] FlashLayout_sdcard_stm32mp257f-dk-optee.tsv 파일 선택 모습
이후, Browse 버튼을 선택하여, Binaries path 란에, 아래 path를 입력해 준다.
stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v26.02.18/images/stm32mp2
[그림 2.10] Binaries path 지정 모습
마지막으로, Download 버튼을 눌러, flash writing(microSD writing)을 시작한다.
[그림 2.11] image 설치 진행 모습
대략 3-4분 정도의 시간이 경과한 후, 아래와 같이 성공 popup을 띄우면서 flash writing이 마무리된다.
[그림 2.12] image 설치 완료 모습
이후, 아래의 절차를 통해 Linux 부팅을 시도하도록 한다.
<부팅 이미지 설치 후, microSD 부팅 과정 요약>
a) disconnect 버튼을 누르고, STM32CubeProgrammer를 종료한다.
b) 전원을 끈다.
c) boot switch를 SDcard booting mode로 재 조정한다.
d) 5V/3A 전원 대신 USB-C to A cable을 연결하고, minicom으로 부팅 message를 확인해 본다.
[그림 2.13] STM32MP257F-DK 보드 부팅 모습
📌 serial console을 사용하기 위해, 5V/3A power adapter 대신, PC와 C21 port 간에 USB-C to A cable을 연결하였다.
참고로, ROM code에서 출발하여, Linux kernel이 구동되기 까지의 절차를 요약해 보면 다음 2개의 그림과 같다.
그렇다면, 정말로 위의 그림과 같이 부팅이 진행되는지를, Serial console을 통해 확인해 보도록 하자.
-> 115200, 8N1
이상으로, microSD를 통해 STM32MP257F-DK board가 정상 부팅되는 과정까지 진행해 보았다. 😎
<TODO>
1. eMMC booting
2. Display를 연결하고 화면에 어떤 내용이 출력되는지 확인하기
__________________________________________
이어지는 장에서는 OpenSTLinux Yocto project source code를 내려 받아 build하는 과정을 소개해 보도록 하자.
3. Yocto project 기반 booting image 생성하기
이번 장에서는 Cortex-A35 CPU에 Linux를 올리기 위해 yocto project code를 내려 받아 build하는 절차를 소개해 보고자 한다.
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] https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP2_boards/STM32MP257x-DK
[7] https://wiki.st.com/stm32mpu/wiki/STM32MP2_boot_chain_overview
[8] https://bootlin.com/pub/conferences/2012/lsm/arm-kernel-consolidation/arm-kernel-consolidation.pdf
[9] https://bootlin.com/doc/training/embedded-linux/embedded-linux-stm32mp2-labs.pdf
[11] And Google and Gemini~
Slowboot








































댓글 없음:
댓글 쓰기