Target
Board
STM32MP157F-EV1(ST)
Host
PC - Ubuntu 22.04
목표
STM32MP1 개발 환경 구축 - hello-world application

아래 링크를 참조하여 진행 한다.

1. 준비

1-1. cross-compilation via SDK

- SDK 환경 설정 스크립트 실행

PC $ source /home/본인PC이름/STM/Developer-package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
 

1-2. Prepare kernel source code

- ST 패치

PC $ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
 

1-3. Configure kernel source code

- fragment 적용

PC $ make ARCH=arm multi_v7_defconfig "fragment*.config"
 
PC $ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
 
PC $ yes '' | make ARCH=arm oldconfig
 

 

2. Compile kernel source code

2-1. Kernel images 빌드(시간 오래 걸림)

PC $ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
 

2-2. Kernel module 빌드(시간 오래 걸림)

PC $ make ARCH=arm modules
 

- Output build artifacts 생성

PC $ mkdir -p $PWD/install_artifact/
PC $ make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
 

 

3. Kernel 배포

3-1. Kernel을 보드에 올리기

PC $ scp arch/arm/boot/uImage root@<board ip address>:/boot
 

3-2. Devicetree를 보드에 올리기

PC $ rm install_artifact/lib/modules/5.15.67/build install_artifact/lib/modules/5.15.67/source
 

3-3. Kernel module 복사

PC $ scp -r install_artifact/lib/modules/* root@<ip of board>:/lib/modules
 

3-4. ttyACM에 붙이려면 ST-LINK/V2-1가 연결 되어 있어야 한다.

PC $ ls /dev/ttyACM*
 

3-5. minicom 을 /dev/ttyACM0에 연결

PC $ minicom -D /dev/ttyACM0
 

3-6. 리셋 버튼을 눌러 보드를 리셋하면 부팅 로그가 미니컴 창에 표시됨

3-7. ip 얻기

Board $ ip addr show eth0
 

3-8. modules.dep, modules.symbols 재생성

Board $ /sbin/depmod -a
 

3-8. 디스크 데이터를 메모리와 동기화

Board $ /sync
 

3-10. 보드 재시작

Board $ reboot
 

 

4. Kernel device driver 수정

4-1. Board에서 로그 정보 확인

Board $ dmesg | grep -i stm_drm_platform_probe
 

4-2. 아래 폴더의 drv.c 수정 하여 메시지 추가 하여 저장

/home/본인PC이름/STM/Developer-package/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.15.67-stm32mp-r2-r0/linux-5.15.67/drivers/gpu/stm/

 

static int stm_drm_platform_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct drm_device *ddev;
	int ret;
	[...]

	DRM_INFO("Simple example - %s\n", __func__);

	return 0;
	[...]
}
 

4-3. Kernel 다시 빌드

PC $ make uImage LOADADDR=0xC2000040
 

4-4. Kernel을 보드에 올리기

PC $ scp arch/arm/boot/uImage root@172.xx.xx.xx:/boot
 

4-5. 보드 재시작

Board $ reboot
 

4-6. Board에서 로그 정보 확인

Board $ dmesg | grep -i stm_drm_platform_probe
 
 

 

 
Target
Board
STM32MP157F-EV1(ST)
Host
PC - Ubuntu 22.04
목표
STM32MP1 개발 환경 구축 - Developer Package 실행

Developer Package 실행은 다음과 같다.

1. Linux kernel 빌드

2. U-Boot 빌드

 

설치 과정은 커널 및 U-Boot가 설치된 폴더의 README.HOW_TO.txt를 참조한다.


1. Linux kernel 빌드

1-0. 작업 폴더

/home/본인PC이름/STM/Developer-package/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.15.67-stm32mp-r2-r0/linux-5.15.67

Linux kernel Compile 순서는 다음과 같다.

1-1. Pre-requisite

1-2. Initialize cross-compilation via SDK

1-3. Prepare kernel source code

1-4. Manage kernel source code

1-5. Configure kernel source code

1-6. Compile kernel source code

1-7. Update software on board

1-8. Update Starter Package with kernel compilation outputs

 

1-1. 사전 준비

- OpenSTLinux SDK 설치 되어 있어야 함

- libncurses and libncursesw dev package libyaml-dev

PC $ cd linux-5.15.67/

PC $ sudo apt-get install libncurses5-dev libncursesw5-dev libyaml-dev
 

 

- mkimage 설치

PC $ sudo apt-get install u-boot-tools
 

 

- yaml (check dts) 설치

PC $ sudo apt-get install libyaml-dev
 

 

- git 설치

PC $ sudo apt-get install git-core gitk
 

1-2. cross-compilation via SDK

- SDK 환경 설정 스크립트 실행

PC $ source /home/본인PC이름/STM/Developer-package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
 

 

1-3. Prepare kernel source code

- ST 패치

PC $ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
 

 

1-5. Configure kernel source code

- fragment 적용

PC $ mkdir -p ../build

PC $ make ARCH=arm multi_v7_defconfig "fragment*.config"
 

- gcc 없다고 에러 메시지

- make 설치

PC $ sudo apt-get install make
 

- gcc 설치

PC $  sudo apt-get install gcc
 

- fragment 적용

PC $ make ARCH=arm multi_v7_defconfig "fragment*.config"
 
PC $ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
 
PC $ yes '' | make ARCH=arm oldconfig
 

 

1-6. Compile kernel source code

- Kernel images 빌드(시간 오래 걸림)

PC $ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
 

 

- Kernel module 빌드(시간 오래 걸림)

PC $ make ARCH=arm modules
 

- Output build artifacts 생성

PC $ make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
 
PC $ mkdir -p $PWD/../build/install_artifact/boot/
PC $ cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
PC $ cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
 

- 생성 파일 확인


2. U-Boot 빌드

2-0. 작업 폴더

/home/본인PC이름/STM/Developer-package/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-v2021.10-stm32mp-r2-r0/u-boot-stm32mp-v2021.10-stm32mp-r2

U-Boot Compile 순서는 다음과 같다.

2-1. Pre-requisite

2-2. Initialize cross-compilation via SDK

2-3. Prepare U-Boot source code

2-4. Manage of U-Boot source code with GIT

2-5. Compile U-Boot source code

2-6. Update software on board

2-7. Update starter package with U-Boot compilation outputs

 

2-1. 사전 준비

- OpenSTLinux SDK 설치 되어 있어야 함

 

2-2. cross-compilation via SDK

- SDK 환경 설정 스크립트 실행

PC $ source /home/본인PC이름/STM/Developer-package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
 

 

2-3. Prepare U-Boot source code

- ST 패치

PC $ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
 

 

2-5. Compile U-Boot source code

- 컴파일 환경 설정

PC $ make stm32mp15_defconfig
 

- 빌드

PC $ make DEVICE_TREE=stm32mp157f-ev1 all
 

 

 

Target
Board
STM32MP157F-EV1(ST)
Host
PC - Ubuntu 22.04
목표
STM32MP1 개발 환경 구축 - Developer Package 설치

STM32MP1 Cortex-A에서 실행되는 소프트웨어를 개발하기 위한 Developer Package 설치 순서는 아래와 같다.

 

0. 추가 패키지 설치

1. SDK 다운로드 및 설치

2. SDK 시작

3. OpenSTLinux BSP packages 다운로드 및 설치

4. Linux Kernel 설치

5. gcnano 설치

6. U-Boot 설치

7. TF-A 설치

8. OP-TEE 설치

9. debug symbol files 확인

 

여기까지 하면 작성일 기준으로 아래의 개발 환경이 만들어 진다.

Target Board
STM32mp157F-EV1
STM32 MPU ecosystem release
v4.1.0
Ubuntu
ubuntu-22.04.1-desktop-amd64
yocto version
OpenEmbedded v4.1 (Kirkstone)

 


아래 링크를 참조하여 진행 한다. hello-world application은 개발 환경 설정 후에 하도록 한다.

0. 추가 패키지 설치

basic cross-compilation(Developer Package를 통해)이나 complex cross-compilation(Distribution Package를 통해)를 하려면 추가 우분투 패키지를 설치하라고 한다.

PC $ sudo apt-get update
 
PC $ sudo apt-get install gawk wget git diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint xterm bsdmainutils libssl-dev libgmp-dev libmpc-dev lz4 zstd
 
PC $ sudo apt-get install make xsltproc docbook-utils fop dblatex xmlto
 
PC $ sudo apt-get install libmpc-dev libgmp-dev
 
PC $ sudo apt-get install build-essential libncurses-dev libyaml-dev libssl-dev 
 

 

지금 부터는 아래 링크를 참조하여 진행한다.

1. SDK 다운로드 및 설치

1-1. 아래 링크에서 'Yocto_SDK(Yocto SDK)' Download

 
en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar.gz

 

1-2. 다운로드 받은 파일 gzip 풀기

PC $ gzip -d en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar.gz
 

1-3. tar 풀기

PC $ tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar
 

1-4. 스크립트를 실행 가능하게 하기 위해 권한 변경

PC $ chmod +x st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-4.0.4-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.sh
 

1-5. st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-4.0.4-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.sh

스트립트를 실행 하여 설치

PC $ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-4.0.4-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.sh
 

1-6. 설치 경로는

/home/본인PC이름/STM/Developer-package/SDK

로 지정

Terminal에서 실행하던, X 윈도우에서 실행하던 결과는 동일

1-7. 설치 확인

 

2. SDK 시작

2-1. SDK 환경 설정 스크립트 실행

PC $ source /home/본인PC이름/STM/Developer-package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
 

2-2. 환경 설정 확인

PC $ echo $ARCH
 
PC $ echo $CROSS_COMPILE
 
PC $ $CC --version
 
PC $ echo $OECORE_SDK_VERSION
 

 

3. OpenSTLinux BSP packages 다운로드 및 설치

3-1. 아래 링에서 'STM32MP1Dev(STM32MP1 OpenSTLinux Developer Package)' 다운로드

 
en.SOURCES-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar.gz

 

3-2. 다운로드 받은 파일 gzip 풀기

PC $ gzip -d en.SOURCES-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar.gz
 

3-3. /home/본인PC이름/STM/Developer-package 설치 경로에다 tar 풀기

PC $ tar xvf en.SOURCES-stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23.tar
 

 

/home/본인PC이름/STM/Developer-package/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23/sources/arm-ostl-linux-gnueabi

폴더로 이동

 

4. Linux Kernel 설치

PC $ cd linux-stm32mp-5.15.67-stm32mp-r2-r0/
 
PC $ tar xvf linux-5.15.67.tar.xz
 
PC $ cd linux-5.15.67/
 

 

5. gcnano 설치

PC $ cd gcnano-driver-stm32mp-6.4.9-stm32mp-r2-r0/
 
PC $ tar xvf gcnano-driver-stm32mp-6.4.9-stm32mp-r2-r0.tar.xz
 
PC $ cd gcnano-driver-6.4.9/
 

 

6. U-Boot 설치

PC $ cd u-boot-stm32mp-v2021.10-stm32mp-r2-r0/
 
PC $ tar xvf u-boot-stm32mp-v2021.10-stm32mp-r2-r0.tar.xz
 
PC $ cd u-boot-stm32mp-v2021.10-stm32mp-r2/
 

7. TF-A 설치

PC $ cd tf-a-stm32mp-v2.6-stm32mp-r2-r0/
 
PC $ tar xvf tf-a-stm32mp-v2.6-stm32mp-r2-r0.tar.xz
 
PC $ cd tf-a-stm32mp-v2.6-stm32mp-r2/
 

 

8. OP-TEE 설치

PC $ cd optee-os-stm32mp-3.16.0-stm32mp-r2-r0/
 
PC $ tar xvf optee-os-stm32mp-3.16.0-stm32mp-r2-r0.tar.xz
 
PC $ cd optee-os-stm32mp-3.16.0-stm32mp-r2/
 

 

9. debug symbol files 확인

/home/본인PC이름/STM/Developer-package/stm32mp1-openstlinux-5.15-yocto-kirkstone-mp1-v22.11.23/images/stm32mp1/

폴더로 이동

 

 

라즈베리 파이는 ARM 아키텍처를 사용하기 때문에 윈도우나 리눅스에서 라즈베리 파이를 위한 소프트웨어를 개발하려면 크로스 컴파일 환경을 구축해야 한다.

 

A. 윈도우에 크로스 컴파일 환경 구축 방법

- mingw-w64를 사용하여 GCC 크로스 컴파일러 설치

- Visual Studio에서 크로스 컴파일러를 사용하여 빌드

 

B. 리눅스에 크로스 컴파일 환경 구축 방법

- gcc 또는 clang을 사용하여 ARM 아키텍처용 크로스 컴파일러 설치

 

리눅스에서 ARM 아키텍처용 크로스 컴파일러가 기본적으로 제공되기 때문에 리눅스에서 크로스 컴파일 환경을 구축하는 것이 더 쉽고 빠르다고 알려져 있다.

 

아래에서는 B. 리눅스에 크로스 컴파일 환경 구축 하는 방법을 설명한다.

 

1. Ubuntu 다운로드

https://ubuntu.com/

 

Enterprise Open Source and Linux | Ubuntu

Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.

ubuntu.com

 

 

가급적 LTS(Long Term Support) 다운로드

 

2. VirtualBox 실행

 

가상 머신 만들기

 

메모리 : 8GB

CPU : 4개

 

가상 하드 디스크 : 50GB

 

3. 우분투 설치

설치 완료

 

'Raspberry Pi > Pi4 & Pi5' 카테고리의 다른 글

Raspberry Pi  (0) 2025.03.19

 

Linux?

오픈소스 운영 체제(OS). 운영 체제(Operating System, OS)는 CPU, 메모리, 스토리지처럼 시스템의 하드웨어와 리소스를 직접 관리하는 소프트웨어. OS는 애플리케이션과 하드웨어 사이에서 모든 소프트웨어와 작업을 수행하는 물리적 리소스를 연결

 

Linux는 크게 아래 3가지로 구성 됨

1. 부트로더(Boot loader)

2. 커널(Kernel)

3. 파일 시스템(File system)


 

1. 부트로더(Boot loader)

OS가 시작되기 전 실행되어 커널을 메모리에 올려 OS를 실행 시켜 줌

 

1-1. 부트로더의 기능

- 메모리 초기와

- 하드웨어 초기와

- 네트워크 초기와

- 사용자 인터페이스 기능

 

1-2. 부트로더의 동작

- 압축 되어 있는 커널 이미지를 메모리에 복사

- 커널 이미지의 압축을 품

- 커널을 실행

- 루트 파일시스템을 마운트

- OS 운영에 필요한 프로그램을 실행

 

1-3. 부트로더의 종류

- U-Boot(Universal Bootloadcer)

- LILO(Linux Loader)

- GRUB(GRand Unified Bootloader)

- RedBoot

- BLOB(Boot Loader Object)

 

1-4. U-Boot의 구조

- uboot는 여러개의 디렉토리로 구성 되어 있음

 

 

2. 커널(Kernel)

- 시스템의 자원을 관리해주는 OS의 핵심부

- 컴퓨터 하드웨어솨 소프트웨어를 이어주는 핵심 인터페이스

- 두 가지 관리 리소스 사이에서 최대한 효율적으로 통신

 

2-1. 커널의 기능

OS의 핵심. 메모리에 상주하며 CPU에 명령을 내리는 소프트웨어

커널은 다음과 같은 4가지 기능을 수행

 

- 메모리 관리

: 메모리가 어디에서 무엇을 저장하는데 얼마나 사용되는지 추적

 

- 프로세스 관리

: 어느 프로세스가 CPU를 얼마나 사용할지 결정(스케쥴링)

 

- 장치 드라이버

: 하드웨어와 프로세스 사이에서 중재자/인터프리터 역할을 수행

 

- 시스템 호출 및 보안

: 프로세스의 서비스 요청을 수신

 

2-2. 커널의 종류

- 단일형 커널(Monolithic Kernel)

- 마이크로 커널(Micro Kernel)

- 하이브리드 커널(Hybrid Kernel)

등이 있다.

 

2-3. 시스템 콜(System Call)

- 사용자가 접근할 수 없는 커널 메모리, 커널 데이터 등을 대신해서 접근해 주는 인터페이스

- Application Program은 user mode에서 수행 되며 하드웨어 직접 접근과 메모리에 대한 허용되지 않는 접근이 제한됨

- open(), read(), write(), close() 등이 있음

 

 

3. 파일 시스템(File system)

파일 시스템은 OS에서 파일 또는 자료에 쉽게 접근할 수 있도록 보관하거나 조직하는 체계

저장장치의 많은 파일을 관리하는 방법이 파일 시스템

 

- ex4

: ex4는 1EB까지 지원. ex3은 16TB까지 지원(TB(테라) < PB(페타) < EB(엑사)

 

- swap

: swap 공간으로 사용되는 파일 시스템

 

- xfs

: 64bit 고성능 저널링 파일 시스템

 

- iso9660

: DVD/CD-ROM을 위한 표준 파일 시스템으로 읽기만 가능

 

- nfs(network file system)

: 원격 서버에서 파일 시스템을 마운트 할 때 사용

 

 

'리눅스(Linux) > 기본 지식' 카테고리의 다른 글

QEMU(Quick Emulator)  (0) 2025.04.18
MachineWare  (0) 2025.04.18
리눅스(Linux) 기본 명령어(2) - cd  (0) 2025.03.18
리눅스(Linux) 기본 명령어(1)  (0) 2025.03.18

+ Recent posts