* 문제 현상

ubuntu Booting시 ethernet이 잡혀있지 않고, gateway default가 없어서 내부,외부망 모두 ping test 안됨.

$ ifconfig enp3s0 192.168.10.201 

  내부망 가능, 외부망 불가

$ route add default gw 192.168.10.1

  내부망, 외부망 가능  

 

* 부팅시 적용 시키기 위한 작업

 

 

1. New Netplan setup - netplan: fatal error: cannot bind to port 2983, is another daemon 문제

 

기존에는 systemd에 의해 netplan 사용하여 ethernet이 적용됨

 

$ vi /etc/netplan/50-cloud-init.yaml

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
        version: 2
        ethernets:
                enp0s3:
                  addresses: [192.168.10.201/24]
                  dhcp4: no
                  dhcp6: no
                  gateway4: 192.168.10.1
                  nameservers:
                    addresses: [8.8.8.8, 8.8.4.4]

$ netplan apply정상일 경우 적용됨.

 

 * New Netplan setup - netplan: fatal error: cannot bind to port 2983, is another daemon 문재 나왔을 경우

 

$ sudo apt install netplan.io netplan-

error는 없어 졌지만, netplan이 적용되지 않음.

 

 * system를 등록하여 스크립트 적용하여 해결하였음.

$ vi /etc/systemd/system/startup.service

[Unit]
Description= Apply Static IP 192.168.10.201

[Service]
Type=simple
ExecStart=/etc/startup_ip.sh

[Install]
WantedBy=multi-user.target

 

$ vi /etc/startup_ip.sh

#!/bin/sh

ifconfig enp3s0 192.168.10.201
route add default gw 192.168.10.1

$ chmod +x /etc/startup_ip.sh

$ sudo systemctl enable startup

 

<참고>

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sslife301&logNo=221359095960

'Linux' 카테고리의 다른 글

DNS Server 추가  (0) 2021.12.20
[Pakage Error] Could not get lock /var/lib/dpkg/lock-frontend  (0) 2021.12.05
커널 메세지 출력(printk log level) 분석  (0) 2021.11.02
ubuntu Samba 설정  (0) 2021.07.30
ext4 mount하여 파일 확인 방법  (0) 2021.07.26
$ sudo apt-get install samba
$ sudo smbpasswd -a whatmam

$ sudo vi /etc/samba/smb.conf
[whatmam]
   comment = whatmam directory
   path = /home/whatmam
   writable = yes
   read only = no
   guest ok = no
   browseable = yes
   create mask = 0755
   directory mask = 0755

$ sudo /etc/init.d/smbd restart

<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하니 문제없이 한번에 성공된다.

 

$ sudo mount -t ext4 -o loop test.ext4 /Test_dir

 * mount한 곳에서 압축하거나 하면 용량이 충분하지 않기 때문에, Copy해서 쓰도록 하자.

<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 설정

 

 

추후 추가 !

 

+ Recent posts