ST/STM32MP157

STM32MP1 개발(8) - Cortex-A Linux Kernel 수정

engineer4ever 2025. 3. 22. 14:35
 
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