<Spec>

  • STM32CubeProgrammer software for Win64

 

지금 까지 sd Card에 dd 명령어를 사용하여 image를 Copy하였다.

STM32CubeProgrammer을 사용하여 Copy해보겠다.

이번장은 Windows10에서 Tool을 사용해보도록 하겠다.

 

- download

https://www.st.com/en/development-tools/stm32cubeprog.html

 

 

1. USB_OTG 케이블 연결

3. Forced USB boot for flashing 부팅

2. STM32CubeProgrammer 실행

3. USB 선택 후 Connet해서 연결

4. *.tsv 파일 open , Binaries path 지정 

 > 아래의 링크에서 Starter Package를 제공한다. 

https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1starter.html

5. download 시작

 

 

USB_OTG를 처음에 USB 허브에 연결하여 사용하니 중간중간에 자꾸 끊긴다. 노트북을 사용하는데 노트북에 direct로 연결하여 download하니 문제없이 한번에 성공된다.

<Spec>

  • Ubuntu version : ubuntu-18.04.5-desktop-amd64
  • tm32mpu Major ecosystem releases version : v1.2.0

현재까지 v3.0.0 version으로 trusted mode booting으로 진행하였다. 이번 장은 basic mode로 실행해보려고 한다.

결론을 먼저 말하면, v2.0.0 이상 version에서는 basic mode로 부팅되지 않는다. ST에서 v2.0.0부터 trusted mode에 중점으로 update를 하면서 basic mode에 관한 update되지 않고 있다. STM32MP1 OpenSTLinux Starter Package만 봐도 v2.0.0부터 basic mode에 관한 내용이나 image file을 제공하지 않는다.

 

아래의 링크에서 Starter Package를 제공한다.

https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1starter.html

 

version별로 부팅 구조가 다르기 때문에 주의해서 봐야한다.

특히 uboot 부분 partitions 1~3 부분 : v3.0.0 부터 fip 형태로 사용하기 때문에 partition3 name이 fip인지 check하는 부분이 존재한다. (이전에는 partition3 name을 ssbl로 쓰고 있었음)

 

먼저 v1.2.0에는 stm32mp157c 시리즈까지 밖에 없기에 아래와 같이 적용할 것이다.

STM32mp157c-ev1 -> STM32mp157f-ev1

STM32mp157a-dk1 -> STM32mp157d-dk1

 

이전에 v3.0.0 trusted mode 빌드하는 것과 거의 유사하다. (trusted와 basic mode 차이점은 uboot쪽이 다르다.)

 

-Working path

$ pwd 
~/STM_v1.2/Developer-Package

 

1. Source download

https://wiki.st.com/stm32mpu-ecosystem-v1/wiki/STM32MP1_Developer_Package

├── en.SDK-x86_64-stm32mp1-openstlinux-20-02-19.tar.xz
├── en.SOURCES-u-boot-stm32mp1-openstlinux-20-02-19.tar.xz
└── en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz

 

2. SDK 설치 

$ tar -xvf en.SDK-x86_64-stm32mp1-openstlinux-20-02-19.tar_v1.2.0.xz
$ cd stm32mp1-openstlinux-20-02-19/sdk
$ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-2.6-openstlinux-20-02-19.sh -d ../../SDK

 

3. u-boot build

 - 압축풀기 및 패치

$ cd ~/STM_v1.2/Developer-Package
$ tar -xvf en.SOURCES-u-boot-stm32mp1-openstlinux-20-02-19.tar.xz
$ $ cd stm32mp1-openstlinux-20-02-19/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2018.11-r0
$ tar -xvf v2018.11.tar.gz
$ cd u-boot-2018.11
$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

 

 - 소스 변경 및 추가

$ vi arch/arm/dts/Makefile
$	# Makefile에 stm32mp157f-whatmam-ev1 추가
$ cp -rfvp arch/arm/dts/stm32mp157c-ev1.dts arch/arm/dts/stm32mp157f-whatmam-ev1.dts
$ cp -rfvp arch/arm/dts/stm32mp157c-ev1-u-boot.dtsi arch/arm/dts/stm32mp157f-whatmam-ev1-u-boot.dtsi

 

 - Makefile 사용

$ source ~/STM_v1.2/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
$ make stm32mp15_basic_defconfig
$ make DEVICE_TREE=stm32mp157f-whatmam-ev1 all

 

 - output copy

$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
$ sudo dd if=/dev/zero of=/dev/sdb3 conv=fdatasync
$ sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync
$ umount /media/whatmam/*	# USB umount

 sd Card의 Partitions 1,2에 u-boot-spl.stm32

                    Partitions 3에 u-boot.img

 

4. kenel build

 - 압축 풀기 및 패치

$ $ cd ~/STM_v1.2/Developer-Package
$ tar -xvf en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz
$ cd stm32mp1-openstlinux-20-02-19/sources/arm-ostl-linux-gnueabi/linux-stm32mp-4.19-r0
$ tar -xvf linux-4.19.94.tar.xz
$ cd linux-4.19.94
$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
$ make ARCH=arm multi_v7_defconfig "fragment*.config"
$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
$ yes '' | make ARCH=arm oldconfig

 

 - <my>_defconfig, <my>.dts 생성

$ cp -rfvp .config arch/arm/configs/stm32_whatmam_defconfig
$ cp -rfvp arch/arm/boot/dts/stm32mp157c-ev1.dts arch/arm/boot/dts/stm32mp157f-whatmam-ev1.dts
$ vi arch/arm/boot/dts/Makefile 
$	# stm32mp157f-whatmam-ev1.dts추가

 

 - Build

$ source ~/STM_v1.2/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
$ make stm32_whatmam_defconfig
$ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040

 

- output copy

$ sudo cp -rfvp arch/arm/boot/dts/stm32mp157f-whatmam-ev1.dtb  /media/whatmam/bootfs/
$ sudo cp -rfvp arch/arm/boot/uImage  /media/whatmam/bootfs/

SD 카드를 삽입 후 bootfs Partition에 image를 넣는다.

 

 

<참고>

https://forum.digikey.com/t/debian-getting-started-with-the-stm32mp157/12459
https://wiki.st.com/stm32mpu/wiki/Wiki_archives
https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1starter.html

<Spec>

  • Ubuntu : ubuntu-18.04.5-desktop-amd64
  • QT version : v4.8.7
  • Cross Compile : gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf
  • TSlib version : v1.22
  • buildroot version : 2021.05.x

이번에는 TSlib 빌드 + QT4 build 하도록 하겠다.

 

tslib와 함께 QT4를 빌드해야 하기 때문에 tslib먼저 빌드 후 QT4를 빌드하도록 하겠다.

<5-1. STM32mp buildroot(Filesystem) + QT4 라이브러리 빌드>에서 생성된 Toolchain을 계속해서 사용한다.

$ pwd
/home/whatmam/STM

 

1. tslib 설치 및 압축 풀기

$ sudo apt-get install m4 autoconf libtool git lib32z1 lib32ncurses5

필요한 package 설치

$ git clone https://github.com/libts/tslib
$ cd tslib

 

2. tslib build

$ mkdir output
$ ./autogen.sh
$ ./configure CC=${PWD}/../Toolchain/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=${PWD}/output
$ make
$ make install

 

3. output 확인

$ tree -L 2 output/
output/
├── bin
│   ├── ts_calibrate
│   ├── ts_conf
│   ├── ts_finddev
│   ├── ts_harvest
│   ├── ts_print
│   ├── ts_print_mt
│   ├── ts_print_raw
│   ├── ts_test
│   ├── ts_test_mt
│   ├── ts_uinput
│   └── ts_verify
├── etc
│   └── ts.conf
├── include
│   └── tslib.h
├── lib
│   ├── libts.la
│   ├── libts.so -> libts.so.0.10.4
│   ├── libts.so.0 -> libts.so.0.10.4
│   ├── libts.so.0.10.4
│   ├── pkgconfig
│   └── ts
└── share
    └── man

 

$ file output/bin/ts_calibrate

output 중 임의의 생성된 파일의 정보를 읽어 제대로 빌드되었는지 확인한다.

 

4. QT4 설치 및 압축 풀기

$ wget https://download.qt.io/archive/qt/4.8/4.8.7/qt-everywhere-opensource-src-4.8.7.tar.gz
$ tar -xvf qt-everywhere-opensource-src-4.8.7.tar.gz
$ cd qt-everywhere-opensource-src-4.8.7

 

5. qmake.conf 생성

$ cp -rfvp mkspecs/qws/linux-arm-gnueabi-g++ mkspecs/qws/linux-arm-gnueabihf-g++
$ vi mkspecs/qws/linux-arm-gnueabihf-g++/qmake.conf
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC                = ${CROSS_COMPILE}-gcc
QMAKE_CXX               = ${CROSS_COMPILE}-g++
QMAKE_LINK              = ${CROSS_COMPILE}-g++
QMAKE_LINK_SHLIB        = ${CROSS_COMPILE}-g++

# modifications to linux.conf
QMAKE_AR                = ${CROSS_COMPILE}-ar cqs
QMAKE_OBJCOPY           = ${CROSS_COMPILE}-objcopy
QMAKE_STRIP             = ${CROSS_COMPILE}-strip

QMAKE_CXXFLAGS          += $$QMAKE_CFLAGS
QMAKE_INCDIR            += ${TSLIB_OUTPUT}/include
QMAKE_LIBDIR            += ${TSLIB_OUTPUT}/lib
QMAKE_LFLAGS            += -Wl,-rpath-link,${TSLIB_OUTPUT}/lib

load(qt_config)

qmake.conf 작성 시 띄어쓰기에서도 빌드 에러를 유발하기에 유의해서 작성해야 함.

Toolchain에 따라 error가 다르기 때문에 필요한 configure를 qmake.conf에 추가해줘야 한다.

 

6. QT4 build

$ export CROSS_COMPILE=${PWD}/../Toolchain/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf
$ export TSLIB_OUTPUT=${PWD}/../tslib/output
$ ./configure --prefix=${PWD}/output -embedded arm -xplatform qws/linux-arm-gnueabihf-g++ -release -little-endian -host-little-endian -opensource -confirm-license -no-largefile -no-accessibility -no-qt3support -no-multimedia -no-audio-backend -no-phonon -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-pch -no-declarative-debug -qt-zlib -qt-libpng -qt-libjpeg -no-nis -no-cups -nomake demos -qt-gfx-transformed -qt-mouse-tslib
		OR
$ ./configure --prefix=${PWD}/output -embedded arm -xplatform qws/linux-arm-gnueabihf-g++ -little-endian -nomake examples -nomake demos -qt-mouse-tslib

$ make 
$ make install

간단하게 옵션을 정리해 본다.

  • --prefix                                               : 옵션 지정된 타깃 보드에 맞춰 qmake 저장될 위치
  • -xplatform qws/linux-arm-gnueabihf-g++   : 전 단계에서 크로스 컴파일러로 수정해준  qws/linux-arm-gnueabihf-g++ 디렉터리에 qmake.conf 파일을 참조하라는 옵션
  • -embedded arm                                    : arm코어 기반의 옵션
  • -little-endian                                        : 타깃 플랫폼이 little endian (LSB first)
  • -nomake examples                                : 예제 제외하고 컴파일
  • -nomake demos                                    : 데몬 제외하고 컴파일

(-nomake examples demos는 빌드 시간 단축을 위해 사용하기로 한다.)
  그 이외에 따로 필요한 경우 , 각종 이미지나 라이브러리에 관련된 옵션 추가한다..

 

7. output 확인

$ tree -L 1 output/
├── bin
├── examples
├── include
├── lib
├── mkspecs
├── plugins
└── translations

qmake와 QT4 라이브러리들을 확인한다.

 

8. Buildroot Filesystem으로 QT4 lib, tslib Copy

먼저 buildroot가 설치된 microSD card PC에 연결하여 mount 시킨다.

$ sudo cp -rfvp ${HOME}/STM/qt-everywhere-opensource-src-4.8.7/output /media/whatmam/rootfs/lib/QT4.8.7
$ sudo cp -rfvp ${HOME}/STM/tslib/output /media/whatmam/rootfs/lib/tslib_1.22
$ sudo chown -Rh root:root /media/whatmam/*
$ umount /media/whatmam/*

현재는 확인을 위해 output 파일을 통째로 넣었지만 추후에 Filesystem 간소화를 위해 필요 없는 파일을 제거하자.

 

 

9. Target Board에서 QT4 examples 실행하여 확인

$ export QT_QWS_FONTDIR='/lib/QT4.8.7/lib/fonts'
$ export LD_LIBRARY_PATH=':/lib/QT4.8.7/lib:/lib/tslib_1.22/lib'
$ export TSLIB_PLUGINDIR='/lib/tslib_1.22/lib/ts'
$ export TSLIB_TSDEVICE='/dev/input/event1'
$ export QWS_MOUSE_PROTO='tslib:/dev/input/event1'
$ export TSLIB_CALIBFILE='/etc/pointercal'
$ export TSLIB_CONFFILE='/lib/tslib_1.22/etc/ts.conf'
$ /lib/QT4.8.7/examples/dialogs/classwizard/classwizard -qws

다음과 같이 필요한 환경 변수를 설정해 주고 QT4예제를 실행시켜서 확인한다.

 

 

QScreenLinuxFb::connect: No such file or directory
Error opening framebuffer device /dev/fb0

 

yocto의 kernel에서는 프레임 버퍼를 더 이상 사용하지 않는다. 

yocto에서는 DRM/KMS (wayland) (/dev/dri/card0)

yocto kernel에서 프레임 버퍼를 활성화시켜 확인할 수 있다. (/dev/fb0)

 

 

kernel defconfig에 DRM_FBDEV_EMULATION=y 추가

 

yocto Filesystem에서 확인할 때는  weston 종료 후 실행하여 확인한다.

$ weston.sh stop

 

'STM32' 카테고리의 다른 글

7. STM32CubeProgrammer  (0) 2021.07.26
6. STM32mp157 Basic mode  (0) 2021.07.23
5-1. STM32mp buildroot(Filesystem) + QT4 라이브러리 빌드  (0) 2021.07.20
4. STM32mp157 u-boot 분석  (0) 2021.07.20
3. STM32mp157 eMMC Booting  (1) 2021.07.19

<Spec>

  • Ubuntu : ubuntu-18.04.5-desktop-amd64
  • QT version : v4.8.7
  • Cross Compile : gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf
  • TSlib version : v1.22
  • buildroot version : 2021.05.x

buildroot를 이용해 Filesystem을 만들어 QT4를 빌드하여 예제까지 실행해 보겠다.

이번장에서는 buildroot를 빌드해 보겠다.

 

SDK에 있는 yocto Toolchain을 사용하면 빌드가 되지 않는다. 조사 결과 buildroot나 Qt4는 순수 toolchain만 사용하도록 정의되어 있어서 linaro v7.5.0로 시작하도록 하겠다.

 > 좀 더 알아봐야겠다. 

 

 

-Working path

$ pwd
~/STM

 

1. buildroot defconfig 수정(defconfig)

 - builroot, Toolchain 설치 및 압축 풀기

$ git clone git://git.buildroot.net/buildroot
$ mkdir Toolchain
$ cd Toolchain
$ wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
$ tar -xvf gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
$ cd ../buildroot

 

- defconfig 수정

$ cp -rfvp .config configs/stm32mp_whatmam_defconfig
$ make stm32mp_whatmam_defconfig
$ make menuconfig

custom defconfig 생성

make menuconfig시 초기 화면이다.

A. target option

B. Build options

항목에서는 루트 파일 시스템을 만드는데 필요한 소스를 다운로드할 경로 작업 경로 등을 설정한다.

보통 기본 값으로 설정해도 문제없으므로 변경하지 않고 다음으로 넘어가도록 한다.

 

C. Toolchain

  • Toolchain type : External toolchain
  • Toolchain : Custom toolchain
  • Toolchain : Pre-installed toolchain
  • Toolchain path : $(CROSS_COMPILE)
  • Toolchain prefix : $(ARCH)-linux-gnueabihf 
  • gcc version : 7.x
  • kernel headers series : 4.10.x
  • C library : glibc
  • [ * ]Toochain has C++ support

위와 같이 수정해 준다.

 

D. Kernel, Bootloaders

 - n키 눌러서 사용 X

 

나머지 목록들은 그대로 쓰도록 하겠다.

 

많은 기능에 대한 분석과 설명은 추후에 따로 게시하겠다.

 

 

모두 수정을 마치고 Exit -> Save

 

2. buildroot build

$ export ARCH=arm
$ export CROSS_COMPILE=${PWD}/../STM/Toolchain/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf
$ make

 

필요에 따라 make clean & make distclean을 잘 활용하여 빌드해야 합니다.

 

3. file copy

$ cd output/images
$ sudo dd if=rootfs.ext4 of=/dev/sdb6 conv=fdatasync bs=512

SD 카드를 삽입 후 rootfs Partition에 image를 넣는다.

 

uboot까지 올라가면 kernel을 수동으로 로드하여 부팅이 확인되면 kernel image가 정상인 것을 알 수 있기에 

선행 작업하는 것이 편하다. 후에 uboot에서 자동으로 시퀀스에 맞게 코딩하여 설정하면 된다.

 

uboot command

STM32> printenv
STM32> ext4ls mmc 0:4

printenv로 부팅 시퀀스 확인

ext4ls로 file을 볼 수 있다.

 

STM32> setenv bootargs root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
STM32> ext4load mmc 1:2 0xc2000000 uImage
STM32> ext4load mmc 1:2 0xc4000000 stm32mp157f-ev1.dtb
STM32> bootm 0xc2000000 - 0xc4000000
STM32> setenv bootargs root=PARTUUID=e91c4e10-16e6-4c0e-bd0e-77becf4a3582 rootwait rw console=ttySTM0,115200
STM32> ext4load mmc 0:4 0xc2000000 zImage
STM32> ext4load mmc 0:4 0xc4000000 stm32mp157f-ev1.dtb
STM32> bootz 0xc2000000 - 0xc4000000

rootfs가 있는 partition지정, kernel image가 있는 parttion을 찾아 image를 load 시킨다.

kernel image와 dtb image의 size를 잘 고려하여 address를 지정한다.

 

- uImage -> bootm

- zImage -> bootz

 

printenv를 보면 extlinux.conf를 사용한다.

 

options 

 

quite : debug message를 보여주지 않는다.

earlyprink : debug message를 보여준다.

 - kernel make menuconfig

     kernel hacking -> darm debugging -> kernel low-level -> early printk 설정

 

 

추후 추가 !

 

<Spec>

  • Ubuntu version : ubuntu-18.04.5-desktop-amd64
  • stm32mpu Major ecosystem releases version : v3.0.0

현재 부팅 가능한 microSD card까지 만들어 보았다. eMMC로 부팅하도록 하겠다.

 

먼저 보드의 부트 스위치 정보를 알아본다.

https://wiki.st.com/stm32mpu/wiki/STM32MP157x-EV1_-_hardware_description#Boot_related_switches

 



eMMC

microSD card

 

1. eMMC partitions 정보 확인

SD card 부팅을 시작으로 한다. 아래와 같은 명령어로 확인할 수 있다.

$ fdisk -l | grep mmcblk*
$ lsblk
$ cat /proc/partitions

eMMC는 mmcblk1이다.

 

2. Remove Partitions and format

$ partx -d /dev/mmcblk1		# remove partitions
$ sgdisk -o /dev/mmcblk1	# format

 

3. Create and Resize Partitions

$ sgdisk --resize-table=128 -a 1 \
        -n 1:1058:9249 -c 1:fip    \
        -n 2:9250:140321 -c 2:boot  \
        -n 3:140322:173089 -c 3:vendorfs  \
        -n 4:173090:1700897 -c 4:rootfs  \
        -n 5:1700898:3145694 -c 5:userfs  \
        -p /dev/mmcblk1

partition3 name은 'fip'로 해야만 한다. (first boot에서 fip name을 찾음 (v3.0.0으로 되면서 ssbl -> fip로 변경됨)

eMMC Register에 PARTITION_CONFIG가 setting 되어 있어서 first bootloader는 mmcblk1bootX를 사용한다.

 

$	# disable the forced read-only access
$ echo 0 > /sys/class/block/mmcblk1boot0/force_ro
$	# copy
$ dd if=USB/tf-a-stm32mp157f-ev1-emmc.stm32 of=/dev/mmcblk1boot0 conv=fdatasync
$	# mmc bootpart enable <boot0 OR boot1?> <mmcblk1pX partition number> /dev/mmcblk1
$ mmc bootpart enable 1 1 /dev/mmcblk1

microSD card에서 first bootloader가 partition1, 2에 저장하여 select하여 사용하는 것과 같이 mmcblk1boot0, mmcblk1boot1에 copy후 select 하여 사용한다. 그리고 그다음은 partition1(fip)로 넘어가도록 설정한다.

 

4. copy to eMMC

$ dd if=USB/fip-stm32mp157f-ev1-trusted.bin of=/dev/mmcblk1p1
$ dd if=USB/st-image-bootfs-openstlinux-weston-stm32mp1-20210708094827.bootfs.ext4 of=/dev/mmcblk1p2 conv=fdatasync  bs=512
$ dd if=USB/st-image-vendorfs-openstlinux-weston-stm32mp1-20210708094827.vendorfs.ext4 of=/dev/mmcblk1p3 conv=fdatasync  bs=512
$ dd if=USB/st-example-image-qtwayland-openstlinux-weston-stm32mp1-20210708094827.rootfs.ext4 of=/dev/mmcblk1p4 conv=fdatasync  bs=512
$ dd if=USB/st-image-userfs-openstlinux-weston-stm32mp1-20210708094827.userfs.ext4 of=/dev/mmcblk1p5 conv=fdatasync  bs=512

yocto image를 사용하여 eMMC 부팅하도록 해보겠다.

USB에 필요한 image를 넣어 target board에 mount하여 파일을 copy한다.

 

5. eMMC Booting

eMMC 부트 스위치를 변경하고 부팅한다. 

먼저 부팅하면 rootfs나 bootfs partition이 제대로 설정되어있지 않다. 먼저 수동으로 부팅되는지 확인한다.

STM32> setenv bootargs root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
STM32> ext4load mmc 1:2 0xc2000000 uImage
STM32> ext4load mmc 1:2 0xc4000000 stm32mp157f-ev1.dtb
STM32> bootm 0xc2000000 - 0xc4000000

 

6. uboot 수정

kernel image가 있는 partition을 못 찾고 있다. mmc 1:2를 scanning 하도록 수정해준다.

STM32> setenv distro_bootpart 2
STM32> saveenv

 

 

rootfs를 지정해주거나 PARTUUID를 수정해준다.

PC> vi /media/USB/bootfs/mmc1_extlinux/stm32mp157f-ev1_extlinux.conf
-APPEND root=PARTUUID=491f6117-415d-4f53-88c9-6e0de54deac6 rootwait rw console=ttySTM0,115200
+APPEND setenv bootargs root=/dev/mmcblk1p6 rootwait rw console=ttySTM0,115200

$ # OR blkid 명령어로 PARTUUID확인하여 바꿔주면 된다.

 

<Spec>

  • Ubuntu version : ubuntu-18.04.5-desktop-amd64
  • stm32mpu Major ecosystem releases version : v3.0.0(openstlinux-5.10-dunfell-mp1-21-03-31)
  • kernel : Linux® kernel v5.10 (LTS)

 

이번에는 galcore.ko moduel을 넣어 보도록 한다. 

 

-Working path

$ pwd
~/STM/Developer-Package/stm32mp1-openstlinux-5.10-dunfell-mp1-21-03-31/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.10.10-r0/linux-5.10.10

 

1. galcore version 확인

yocto source에서 다음과 같이 version 및 사용한 galcore가 무엇인지 확인할 수 있다.

해당 내용의 galcore를 올려 보도록 하자.

$ vi ~/STM/openstlinux-5.10-dunfell-mp1-21-03-31/layers/meta-st/meta-st-stm32mp/recipes-graphics/gcnano-userland/gcnano-userland-binary.inc

 

먼저 ①kernel 외부에서 빌드하여 수동으로 올리는 방법과 ②kernel modules make시 포함하도록 하는 방법 두 가지를 해보도록 하겠다.

 

-Working path

2. 수동으로 galcore 올리기

 - 압축 풀기 및 패치

$ git clone https://github.com/STMicroelectronics/gcnano-binaries
$ cd gcnano-binaries
$ tar -xvf gcnano-driver-6.4.3.tar.xz
$ cd gcnano-driver-6.4.3

 

 - modules build

$ source ~/STM/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
$ export KERNEL_DIR=$PWD/../../
$ make
$ make install

사용하는 kernel source의 경로를 잡아준다.

 

 - output copy

$ sudo mkdir -p /media/whatmam/rootfs/lib/modules/5.10.10/extra
$ sudo cp -rfvp galcore.ko  /media/whatmam/rootfs/lib/modules/5.10.10/extra
$ sudo vi /media/whatmam/rootfs/lib/modules/5.10.10/modules.dep
 + extra/galcore.ko:

SD 카드를 삽입 후 rootfs Partition에 module을 넣는다.

 

 

 - target board 실행하여 depmod 실행 후 reboot

TARGET> depmod
TARGET> reboot

아래와 같이 디버그에서 확인할 수 있고 lsmod 명령어를 사용하여 확인할 수 있다.

# debug message
# lsmod 명령 실행

 

3. kernel source에 driver 추가

 - Source download

$ git clone https://github.com/STMicroelectronics/gcnano-binaries
$ cd gcnano-binaries
$ tar -xvf gcnano-driver-6.4.3.tar.xz
$ cp -rfvp gcnano-driver-6.4.3 ../drivers/gpu/gcnano
$ cd ../drivers/gpu/gcnano

새로운 driver를 생성한다.

 

 - Source 수정

$ vi Kbuild
+AQROOT := $(srctree)/drivers/gpu/gcnano
-include $(AQROOT)/config

$ vi ../Makefile
+ obj-y                   += drm/ vga/ gcnano/

 

 - Kernel module build

$ make ARCH=arm modules
$ make ARCH=arm INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH="$PWD/../build_kernel_modules"  modules_install

 

 - output copy

$ cd ../build_kernel_modules/lib/modules/5.10.10/
$	# 필요없는 파일 제거
$ rm -rf build source
$ cd ..
$ sudo cp -rfvp 5.10.10 /media/whatmam/rootfs/lib/modules/

SD 카드를 삽입 후 rootfs Partition에 module을 넣는다.

# debug message
# lsmod 명령 실행

 

[   72.795553] galcore: module verification failed: signature and/or required key missing - tainting kernel
위와 같은 에러가 나오면 kernel defconfig 수정해 준다 ->  CONFIG_MODULE_SIG_ALL=n

'STM32' 카테고리의 다른 글

4. STM32mp157 u-boot 분석  (0) 2021.07.20
3. STM32mp157 eMMC Booting  (1) 2021.07.19
2-2. STM32mp157 Distibution Package - Kernel  (0) 2021.07.13
2-1. STM32mp157 Developer Package - uBoot  (0) 2021.07.13
1. STM32mp157 Yocto build  (0) 2021.07.13

<Spec>

  • Ubuntu : ubuntu-18.04.5-desktop-amd64
  • stm32mpu Major ecosystem releases version : v3.0.0
  • kernel : Linux® kernel v5.10 (LTS)

 

 

-Working path

$ pwd
~/STM/Developer-Package

 

1. Kernel build

 - 압축 풀기 및 패치

$ tar -xvf en.SOURCES-kernel-stm32mp1-openstlinux-5.10-dunfell-mp1-21-03-31.tar.xz
$ cd stm32mp1-openstlinux-5.10-dunfell-mp1-21-03-31/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.10.10-r0
$ tar -xvf linux-5.10.10.tar.xz
$ cd linux-5.10.10
$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
$ make ARCH=arm multi_v7_defconfig "fragment*.config"
$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
$ yes '' | make ARCH=arm oldconfig

 

 - <my>_defconfig, <my>.dts 생성

$ cp -rfvp .config arch/arm/configs/stm32_whatmam_defconfig
$ cp -rfvp arch/arm/boot/dts/stm32mp157f-ev1.dts arch/arm/boot/dts/stm32mp157f-whatmam-ev1.dts
$ vi arch/arm/boot/dts/Makefile 
$	# stm32mp157f-whatmam-ev1.dts추가

 

 

 - Build

$ source ~/STM/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
$ make stm32_whatmam_defconfig
$ make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040

 

 - output copy

$ sudo cp -rfvp arch/arm/boot/dts/stm32mp157f-whatmam-ev1.dtb  /media/whatmam/bootfs/
$ sudo cp -rfvp arch/arm/boot/uImage  /media/whatmam/bootfs/

SD 카드를 삽입 후 bootfs Partition에 image를 넣는다.

 

 - extlinux.conf 수정

$ sudo vi /media/whatmam/bootfs/mmc0_extlinux/stm32mp157f-ev1_extlinux.conf
LABEL OpenSTLinux
+FDT /stm32mp157f-whatmam-ev1.dtb

OpenSTLinux 레이블에 FDT를 지정하도록 추가해준다.

 

 - uboot 수동으로 부팅

STM32> setenv bootargs root=/dev/mmcblk0p6 rootwait rw console=ttySTM0,115200
STM32> ext4load mmc 0:4 0xc2000000 uImage
STM32> ext4load mmc 0:4 0xc4000000 stm32mp157f-whatmam-ev1.dtb
STM32> bootm 0xc2000000 - 0xc4000000

extlinux.conf를 수정하거나 uboot로 수동으로 부팅해 주면된다.

 

SD카드를 Target에 삽입하고 부팅시켜주어 디버그 내용을 확인한다.

 

2. kernel modules build

 - 압축 풀기 및 패치

$ make ARCH=arm modules
$ make ARCH=arm INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH="$PWD/../build_kernel_modules"  modules_install

INSTALL_MOD_STRPI=1 

kernel modules Size를 줄이기 위해서 모든 디버깅 기호가 제거되어 약 90%까지 줄일 수 있다.

 

 - output copy

$ cd ../build_kernel_modules/lib/modules/5.10.10/
$ rm -rf build source
$ cd ..
$ sudo cp -rfvp 5.10.10 /media/whatmam/rootfs/lib/modules/

SD 카드를 삽입 후 bootfs Partition에 kerne modules을 넣는다.

 

 

 

부팅을 하면 다음과 같이 GPU Driver가 없다고 나온다. 다음장에서 GPU Driver module을 넣어보자

'STM32' 카테고리의 다른 글

4. STM32mp157 u-boot 분석  (0) 2021.07.20
3. STM32mp157 eMMC Booting  (1) 2021.07.19
2-3. STM32mp157 Distibution Package - galcore  (0) 2021.07.13
2-1. STM32mp157 Developer Package - uBoot  (0) 2021.07.13
1. STM32mp157 Yocto build  (0) 2021.07.13

+ Recent posts