2024년 7월 22일 월요일

BeaglePlay 보드로 알아보는 Embedded Linux Programming

래간만에 새로운 Board를 하나 입수했다. 이름하여 BeaglePlay~ 앞으로 몇차례에 걸쳐 BeaglePlay 보드를 파헤쳐 보는 시간을 가져 보고자 한다. 😎


The 1st time

목차
1. BeaglePlay 보드 소개#1
2. BeaglePlay 보드 소개#2
3. Yocto Project 기반으로 build 하기
4. Bootloader 올리기
5. Linux kernel 올리기
6. Device Tree & Device Drivers
7. References

세상은 하루가 다르게 발전하고 있다. 요즘 나오는 SoC를 보면, 이것 저것 여러가지 기능을 하나로 묶는 경향이 있다. Linux kernel을 하나 올리기 위해 Cortex-M4F -> Cortex-R5 -> Cortex-M4 -> Cortex A53로 이리저리 옮겨 다닌다. 흡사 Roller coaster를 타고 있는 느낌이 든다. 🎢 

이번 posting은 초심자가 쉽게 따라할 수 있도록 Embedded Linux Programming의 기초 과정을 담고자 하였다. 이번 posting의 내용과 더불어 이전 posting 내용도 함께 참고하면 좋을 듯 싶다.


1. BeaglePlay 보드 소개#1
BeaglePlay 보드는 TI의 AM625x Sitara Processor(Quad-Core Arm Cortex-A53, Cortex-M4F)와 PMIC, 2GB DDR4 RAM, 16GB eMMC, WLAN, BLE/SubG, 2 Ethernets(1G, single pair),  HDMI, USB, microSD, mikroBUS connector, Grove connector, QWIIC connector, CSI(카메라) connector, OLDI(LCD) connector 등으로 무장한 SBC(Single Board Computer)이다.

[그림 1.1] BeaglePlay 보드와 4개의 무선 안테나 [출처 - 참고문헌 2]

상세 스펙은 아래와 같은데, 흥미로운 내용이 아주 많이 보인다. 😍

Feature

Description

Processor

TI AM6254 (multicore A53s with R5, M4s and PRUs)

PMIC

TPS6521901

Memory

2GB DDR4

Storage

16GB eMMC

WiFi

  • PHY: WL1807MOD (roadmap to next-gen TI CC33XX WiFi 6 & BLE)

  • Antennas: 2.4GHz & 5GHz

BLE/SubG

  • CC1352P7 M4+M0 with BeagleConnect firmware

  • BeagleConnect Wireless enabled

  • Antennas: 2.4GHz & SubG IEEE802.15.4 software defined radio (SDR)

Ethernet

  • PHY: Realtek RTL8211F-VD-CG Gigabit Ethernet phy

  • Connector: integrated magnetics RJ-45

Single-pair Ethernet

  • BeagleConnect Wired enabled

  • PHY: DP83TD510E 10Mbit 10BASE-T1L single-pair Ethernet phy

  • Connector: RJ-11 jack

  • Power (PoDL): Input: N/A (protection to 12V), Output: 5V @ 250mA

USB type-C

  • PD/CC: None, HS shorted to both sides

  • Power: Input: 5V @ 3A, Output: N/A (USB-C DRP Not supported)

HDMI

  • Transmitter: IT66121

  • Connector: full-size

Other connectors

  • microSD

  • USB 2.0 type-A (480Mbit)

  • mikroBUS connector (I2C/UART/SPI/MCAN/MCASP/PWM/GPIO)

  • Grove connector (I2C/UART/ADC/PWM/GPIO)

  • QWIIC connector (I2C)

  • CSI connector compatible with BeagleBone AI-64, Raspberry Pi Zero / CM4 (22-pin)

  • OLDI connector (40-pin)

📌 mikroBUS connector는  MikroElecktronika의 1000개나 되는 click board를 연결할 수 있으며, Grove connector는 Seed Studio의 수백개에 달하는 module을 연결할 수 있다. 또한, QWIIC은 SparkFun이나 Adafruit에서 나오는 I2C module을 연결하는 용도로 사용할 수 있다. 
📌 Simplelink™ CC1352P7 wireless MCU(Cortex-M4F)는 BLE는 물론이고 802.15.4,  ZigBee, Thread 통신용으로 사용 가능하다. 얘는 Zephyr로 programming 가능하다.


아래 그림은 TI AM62x SoC의 내부 구조를 보여준다. 4개의 Arm Cortex-A53 core 외에도 Cortex-M4F core,  Cortex-R5 core(Device/Power manager), PRUSS 등이 눈에 띈다(물론, Multimedia나 Security 쪽도 보인다).

[그림 1.2] TI AM62x SoC 내부 구조 [출처 - 참고문헌 3]

BeaglePlay 보드의 Top과 Bottom view 모습을 살펴 보면 보드의 상세 구성을 확인할 수 있다.

[그림 1.3] BeaglePlay 보드 - Top view [출처 - 참고문헌 2]


[그림 1.4] BeaglePlay 보드 - Bottom view [출처 - 참고문헌 2]


또한 BeaglePlay 보드의 block도를 살펴 보는 것도 전체 h/w 구조를 파악하는데 도움이 된다.

[그림 1.5] BeaglePlay 보드 - Block Diagram [출처 - 참고문헌 2]

한편, PMIC TPS6521901를 중심으로 하는 Power Input 구성은 다음 그림을 통해 확인 가능하다.

[그림 1.6] BeaglePlay 보드 - Power Block Diagram [출처 - 참고문헌 2]

이 밖에도 h/w 관련 보다 자세한 사항은 아래 site 내용을 참조하면 된다.

<AM62x Sitara Processor datasheet>




2. BeaglePlay 보드 소개#2
지금까지 beagleplay board의 h/w 관련 내용을 대략적으로 살펴 보았으니, 이번에는 s/w 관련 부분을 검토할 차례이다. 백견이 불여일타~ 일단 부팅부터 시켜 보자.

a) Serial Console 연결 후, 부팅하기
우선 (최초 개봉 상태에서) Serial console cable(115200, 8N1)을 연결하고, 전원(USB-C, 5V/3A)을 넣어 보도록 하자. 


[그림 2.1] UART console 연결 (115200, 8N1, /dev/ttyUSB0) [출처 - 참고문헌 2]


[그림 2.2] BeaglePlay 구동 모습[1] - Serial Console, USB-C 전원, Ethernet cable 연결 모습

OK, eMMC에 f/w가 기본적으로 탑재되어 있어, U-Boot SPL -> TF-A -> U-Boot SPL -> U-Boot -> Linux kernel(Debian rootfs)까지 정상 부팅되는 모습이 보인다.

[그림 2.3] BeaglePlay 구동 모습[2] - u-boot spl -> TF-A -> u-boot spl -> u-boot

[그림 2.4] BeaglePlay 구동 모습[3] - u-boot -> kernel

b) Booting Flow 파악해 보기
BeaglePlay 보드(정확히는 TI AM62x SoC)는 매우 복잡한 형태의 부팅 방식을 따르고 있다. 이를 이해하기 위해서는, 먼저 AM62x SoC이 3개의 h/w domain으로 구성되어 있다는 사실을 이해할 필요가 있다.

<AM62x SoC의 3 h/w domains>
  • Main domain - 4 Cortex-A53(64bit)이 cover하는 영역(대분의 주요 주변 장치 포함, linux kernel 동작)
  • MCU domain - Cortex-M4F(32bit) processor가 cover하는 영역(booting process, power/resource manangement 담당)
  • WKUP(wake-up) domain - Cortex-R5F(32bit) proessor가 cover하는 영역(deep sleep mode시 사용)

<AM62x SoC의 부팅 flow 요약>
  • Cortex-M4F processor의 Boot ROM code가 시작되면서, Cortex-R5를 reset 시킨다. 
  • 이후 R5의 ROM code가 시작되고, tiboot3.bin 파일에 대한 인증(x.509 인증서 기반)을 거친 후, M4F에게 TIFS를 구동하도록 요청한다.
  • AM62x SoC 관련 datasheet를 보면 TIFS(TI Foundational Security)라는 s/w component가 존재하는데, 얘가 하는 역할은 secure boot와 power/resource management이다. TIFS는 Cortex-M4F processor 상에 위치하며, booting process의 master 역할을 하게 된다.
  • 이후 R5는 DDR 및 R5 f/w를 설정(configure)하기 위해 U-Boot SPL을 구동한다. U-Boot SPL은 DDR(RAM)을 초기화하고, tispl.bin을 RAM에 loading 한다. 그리고 끝으로 TIFS에게 A53 CPU를 시작하도록 요청한다.
  • R5로 부터 요청을 받은 TIFS는 A53을 reset 시킨다.
  • A53이 시작되면, 제일 먼저 (secure world 상에서) TF-A를 loading하게 되고, (이어서 OP-TEE를 실행한다.) 이어서 normal world로 전환하면서 U-Boot SPL -> U-Boot -> Linux kernel을 차례로 구동하게 된다.
📌 tiboot3.bin과 tispl.bin 파일의 구조는 뒤에서 설명한다.
📌 ARM의 최신식 secure boot(based on trusted firmware) 방식과 관련해서는 이전 blog post를 참조하기 바란다.

이상의 과정을 그림(u-boot 공식 문서 및 bootlin 문서 참조)으로 정리해 보면 다음(아래 2개의 그림)과 같다.

[그림 2.5] BeaglePlay boot flow [출처 - 참고문헌 11]
📌 부팅 중에 u-boot spl(secondary program loader)이 2번 나오는데, 한번은 R5에, 다른 한번은 A53 영역에 존재하는 것을 사용한다.


[그림 2.6] BeaglePlay boot flow [출처 - 참고문헌 7]

그렇다면, AM62x SoC는 도대체 왜 이렇게 복잡한 방식으로 부팅을 하는 것일까 ? 
  • Trusted Firmware 기반의 secure boot
  • Power/Resource managemt, Sleep mode용으로 별도의 processor 사용

아직은 정확한 답을 쉽사리 예측할 수가 없는데, 앞으로 blog 내용을 좀더 써 가는 도중에 그 이유를 알 수 있기를 희망해 본다. 😂

마지막으로 아래 그림은 sdcard의 파티션 layout을 표현한 것이다.
[그림 2.7] BeaglePlay sdcard image layout  [출처 - 참고문헌 7]

<sdcard 파티션 내용>
  • tiboot3.bin
  • tispl.bin
  • u-boot.img
먼저, tiboot3.bin 파일은 R5용 u-boot spl(BL2)과 TIFS & board.cfg(BL1) 파일, 그리고 R5 u-boot spl에서 사용하는 device tree blob이 하나로 묶여 있다. 더불어 R5 ROM code에서 인증을 하기 위해 (재밌게도) x.509 인증서(4096bit RSA public key와 서명 값으로 구성)가 함께 포함되어 있다.

[그림 2.8] tiboot3.bin 파일의 구조 [출처 - 참고문헌 11]

한편 tispl.bin 파일은 R5 U-boot SPL에 의해 RAM에 loading하게 되는데, A53용 TF-A code와 OP-TEE(사용 안할 수도 있음), R5용 DM f/w, A53용 U-boot SPL 및 device tree blob 등이 하나로 연결되어 있다. 그리고, 맨 앞에는 FIT header가 붙어 있다.

[그림 2.9] tispl.bin 파일의 구조 [출처 - 참고문헌 11]
📌 FIT(Flattened Image Tree)는 kernel, dtb, ramdisk fs(initrd) 등을 여러 개 묶을 수 있는 device tree 기반의 이미지 생성 방식이다. 이와 관련해서는 이전 blog post의 2.4절을 참고하기 바란다.


c) microSD로 신규 이미지 설치 후 부팅하기
이번에는 Beagleplay 공식 home page 내용을 참조하여, sdcard용 image를 설치하고, 이를 기준으로 부팅을 시도해 보도록 하자.


[그림 2.10] beagleplay debian OS image download 하기

불행하게도, beagleplay 공식 home page에는 debian 계열의 linux image 파일만 있고, Buildroot나 Yocto project 혹은 OpenWrt 기반의 image는 보이질 않는다.

아쉬운대로, 파일을 하나 내려 받아 microSD에 복사하도록 한다.

$ sudo dd if=./beagleplay-emmc-flasher-debian-12.6-minimal-arm64-2024-07-04-8gb.img of=/dev/sdb bs=1M conv=fsync
15728640+0 레코드 들어옴
15728640+0 레코드 나감
8053063680 bytes (8.1 GB, 7.5 GiB) copied, 3295.18 s, 2.4 MB/s

📌 (부팅하면서 eMMC flashing을 하기 위해서는) image 파일 중에 emmc-flasher가 들어가 있는 파일을 download해야 한다.

microSD card를 target board로 옮겨 부팅을 시도해 보자.

<sdcard 기반의 부팅 절차>
1. Load this image to a microSD card using a tool like Etcher.
  => Etcher 대신 dd를 이용해도 된다.
2. Insert the microSD card into BeaglePlay.
  => microSD를 beagleplay board에 삽입한다.
3. Power BeaglePlay via the USB-C connector.
4. Wait for the LEDs to start blinking, then turn off.
  => console 상에서 진행하는 모습을 살펴 보아도 된다. rootfs 등을 복사하느라 상당히 오랜 시간이 걸린다(3~5분).
5. Remove power from BeaglePlay.
  => console 상에서 보니, eMMC 설치 후, 자동으로 power down한다. 이때 power cable을 제거하면 된다.
6. IMPORTANT Remove microSD card from BeaglePlay.
7. Apply power to BeaglePlay.
(*) This will flash the CC1352 as well as the eMMC flash on BeaglePlay.
  => CC1352(BLE chip)의 f/w가 교체되는지는 console 상에서 일단 확인이 어렵긴하다.


[그림 2.11]  microSD로 부팅하기 - 하단의 녹색 LED가 움직임.

[그림 2.12]  microSD로 부팅 시, eMMC에 자동으로 flashing하는 모습

이상으로 BeaglePlay의 부팅 flow를 간략히 살펴본 후, 새로운 image 파일을 설치하여 부팅을 시도해 보았다. 다음 장에서는 전체 image를 build하는 방법을 소개해 보도록 하자.


3. Yocto Project 기반으로 build 하기
이번 장에서는 BeaglePlay용 f/w image를 만들기 위해 Yocto Project를 활용하는 방법을 소개해 보고자 한다. 공식 home page에는 debian image만 있어, 여기에서는 yocto project를 통해 image를 생성하는 방법을 알아보고자 한다.

Yocto project와 관련해서는 아주 오래 전에 작성한 blog post를  참조해 보는 것도 좋을 듯 싶다(오래되었지만, 그래도 아직은 쓸만하다 😀).

1) 방법#1 - Poky 기반으로 build 하기
먼저 poky reference system을 이용하여 beagleplay를 build해 보도록 하자. 군더더기는 생략하고, 필요한 명령만 나열하기로 한다.

$ git clone -b kirkstone https://git.yoctoproject.org/poky
$ git clone -b kirkstone git://git.yoctoproject.org/meta-arm
$ git clone -b kirkstone https://git.ti.com/cgit/arago-project/meta-ti
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto$ ls -la
합계 20
drwxrwxr-x  5 chyi chyi 4096  7월 20 15:15 .
drwxrwxr-x  8 chyi chyi 4096  7월 20 18:14 ..
drwxrwxr-x 13 chyi chyi 4096  7월 19 17:43 meta-arm
drwxrwxr-x  5 chyi chyi 4096  7월 19 17:44 meta-ti
drwxrwxr-x 13 chyi chyi 4096  7월 19 17:44 poky

$ cd poky/
$ source oe-init-build-env build-beagleplay
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay$
cd conf/
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay/conf$
$ vi bblayers.conf
  => 아래 한줄을 추가한다.
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/meta \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/meta-poky \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/meta-yocto-bsp \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/meta-arm/meta-arm-toolchain \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/meta-arm/meta-arm \
 /mnt/hdd/workspace/bootlin/beagleplay/yocto/meta-ti/meta-ti-bsp \
 "

$ vi local.conf
  => machine 이름은 beagleplay이다.
...
#MACHINE ?= "beaglebone-yocto"
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86-64 if no other machine is selected:
#MACHINE ??= "qemux86-64"
MACHINE ??= "beagleplay"

#
# Where to place downloads
#
# During a first build the system will download many different source code tarballs
# from various upstream projects. This can take a while, particularly if your network
# connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you
# can preserve this directory to speed up this part of subsequent builds. This directory
# is safe to share between multiple builds on the same machine too.
#
# The default is a downloads directory under TOPDIR which is the build directory.
#
#DL_DIR ?= "${TOPDIR}/downloads"
...
~

$ cd ..
$ bitbake core-image-minimal
...
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay/deploy-ti/images/beagleplay$ ls -la
합계 148628
drwxr-xr-x 5 chyi chyi    12288  7월 19 19:37 .
drwxr-xr-x 3 chyi chyi     4096  7월 19 18:16 ..
lrwxrwxrwx 2 chyi chyi       62  7월 19 19:35 Image -> Image--6.1.69+git0+bc76b5d278-r0-beagleplay-20240719091250.bin
-rw-r--r-- 2 chyi chyi 33102336  7월 19 19:35 Image--6.1.69+git0+bc76b5d278-r0-beagleplay-20240719091250.bin
lrwxrwxrwx 2 chyi chyi       62  7월 19 19:35 Image-beagleplay.bin -> Image--6.1.69+git0+bc76b5d278-r0-beagleplay-20240719091250.bin
-rw-r--r-- 2 chyi chyi    52976  7월 19 18:16 bl31-k3.bin
-rw-r--r-- 2 chyi chyi   104744  7월 19 18:16 bl31-k3.elf
lrwxrwxrwx 2 chyi chyi       11  7월 19 18:16 bl31.bin -> bl31-k3.bin
lrwxrwxrwx 2 chyi chyi       11  7월 19 18:16 bl31.elf -> bl31-k3.elf
lrwxrwxrwx 2 chyi chyi       14  7월 19 19:30 bl32.bin -> optee/bl32.bin
lrwxrwxrwx 2 chyi chyi       14  7월 19 19:30 bl32.elf -> optee/bl32.elf
-rw-r--r-- 2 chyi chyi     1145  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.manifest
-rw-r--r-- 2 chyi chyi 24469612  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.tar.xz
-rw-r--r-- 2 chyi chyi     3384  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.wic.bmap
-rw-r--r-- 2 chyi chyi 34845844  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.wic.xz
-rw-r--r-- 2 chyi chyi   292340  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.testdata.json
lrwxrwxrwx 2 chyi chyi       60  7월 19 19:37 core-image-minimal-beagleplay.manifest -> core-image-minimal-beagleplay-20240719091250.rootfs.manifest
...

한참을 build한 후, 아주 많은 결과물을 토해(?) 낸다.

chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay/deploy-ti/images/beagleplay$ ls -l *wic*
-rw-r--r-- 2 chyi chyi     3384  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.wic.bmap
-rw-r--r-- 2 chyi chyi 34845844  7월 19 19:37 core-image-minimal-beagleplay-20240719091250.rootfs.wic.xz
lrwxrwxrwx 2 chyi chyi       60  7월 19 19:37 core-image-minimal-beagleplay.wic.bmap -> core-image-minimal-beagleplay-202407190
91250.rootfs.wic.bmap
lrwxrwxrwx 2 chyi chyi       58  7월 19 19:37 core-image-minimal-beagleplay.wic.xz -> core-image-minimal-beagleplay-20240719091
250.rootfs.wic.xz
📌 yocto project에서는 bootable image를 만들기 위해 wic(OpenEmbedded Image Creator: oeic -> wic)이라는 tool을 제공한다.

sdcard용 image 파일을 microSD에 복사하도록 한다.

$ xzcat ./core-image-minimal-be
agleplay-20240719091250.rootfs.wic.xz | sudo dd of=/dev/sdb bs=1M conv=fsync 

0+32279 레코드 들어옴
0+32279 레코드 나감
264774656 bytes (265 MB, 253 MiB) copied, 55.3247 s, 4.8 MB/s

dd 명령 실행 후, microSD card의 내용을 확인해 보면 다음과 같다. /boot 디렉토리를 보면, 2장에서 언급했던 tiboot3.bin 파일과 tispl.bin 파일 등이 보인다. 

chyi@earth:/media/chyi/boot$ ls -la
합계 34726
drwxr-xr-x  3 chyi chyi    16384  1월  1  1970 .
drwxr-x---+ 4 root root     4096  7월 22 13:44 ..
drwxr-xr-x  3 chyi chyi     2048  4월  6  2011 EFI
-rw-r--r--  1 chyi chyi 33102336  4월  6  2011 Image
-rw-r--r--  1 chyi chyi   291717  4월  6  2011 tiboot3.bin
-rw-r--r--  1 chyi chyi  1181243  4월  6  2011 tispl.bin
-rw-r--r--  1 chyi chyi   956451  4월  6  2011 u-boot.img

chyi@earth:/media/chyi/root$ ls -la
합계 34
drwxr-xr-x  18 root root  1024  7월 19 19:37 .
drwxr-x---+  4 root root  4096  7월 22 13:44 ..
drwxr-xr-x   2 root root  3072  3월  9  2018 bin
drwxr-xr-x   4 root root  1024  3월  9  2018 boot
drwxr-xr-x   2 root root  1024  3월  9  2018 dev
drwxr-xr-x  20 root root  1024  3월  9  2018 etc
drwxr-xr-x   3 root root  1024  3월  9  2018 home
drwxr-xr-x   5 root root  1024  3월  9  2018 lib
drwx------   2 root root 12288  7월 19 19:37 lost+found
drwxr-xr-x   2 root root  1024  3월  9  2018 media
drwxr-xr-x   2 root root  1024  3월  9  2018 mnt
dr-xr-xr-x   2 root root  1024  3월  9  2018 proc
drwxr-xr-x   2 root root  1024  3월  9  2018 run
drwxr-xr-x   2 root root  1024  3월  9  2018 sbin
dr-xr-xr-x   2 root root  1024  3월  9  2018 sys
drwxrwxrwt   2 root root  1024  3월  9  2018 tmp
drwxr-xr-x   9 root root  1024  3월  9  2018 usr
drwxr-xr-x   8 root root  1024  3월  9  2018 var


이걸로 부팅을 시도해 보니, 정상 부팅이 된다. 근데, 아주 험난한 과정을 거친다. 배보다 배꼽이 더 큰 느낌~ 😓

<booting flow>
u-boot spl -> TF-A(ATF) -> OP-TEE -> uboot-spl -> uboot -> grub bootloader -> linux kernel

[그림 3.1] Yocto image로 sdcard 부팅하기(1) - bootloader

[그림 3.2] Yocto image로 sdcard 부팅하기(2) - GRUB bootloader

[그림 3.3] Yocto image로 sdcard 부팅하기(3) - kernel loading

<sdk 생성하기>
다음 장에서 cross-compile을 할 때 사용하기 위하여, sdk를 생성하도록 하자.

chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay$ bitbake -c populate_sdk core-image-minimal

chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay/deploy-ti/sdk$ ls -la
합계 222920
drwxr-xr-x 2 chyi chyi      4096  7월 23 13:05 .
drwxr-xr-x 4 chyi chyi      4096  7월 23 13:05 ..
-rw-r--r-- 2 chyi chyi     12162  7월 23 13:04 poky-glibc-x86_64-core-image-minimal-aarch64-beagleplay-toolchain-4.0.20.host.m
anifest
-rwxr-xr-x 2 chyi chyi 227904899  7월 23 13:05 poky-glibc-x86_64-core-image-minimal-aarch64-beagleplay-toolchain-4.0.20.sh
-rw-r--r-- 2 chyi chyi     21028  7월 23 13:03 poky-glibc-x86_64-core-image-minimal-aarch64-beagleplay-toolchain-4.0.20.target
.manifest
-rw-r--r-- 2 chyi chyi    317433  7월 23 13:03 poky-glibc-x86_64-core-image-minimal-aarch64-beagleplay-toolchain-4.0.20.testda
ta.json
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/yocto/poky/build-beagleplay/deploy-ti/sdk$ sudo ./poky-glibc-x86_64-core-image-minima
l-aarch64-beagleplay-toolchain-4.0.20.sh
 
Poky (Yocto Project Reference Distro) SDK installer version 4.0.20
==================================================================
Enter target directory for SDK (default: /opt/poky/4.0.20): /opt/beagleplay        
You are about to install the SDK to "/opt/beagleplay". Proceed [Y/n]? y
Extracting SDK.............................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
$ . /opt/beagleplay/environment-setup-aarch64-poky-linux



2) 방법#2 - Simplest Yocto Setup Project 기반으로 build 하기
이번에는 bootlin에서 만든 아래 project를 기준으로 beagleplay를 build해 보도록 하자. simplest-yoco-setup 프로젝트의 개발 취지 등은 아래 site에 잘 설명이 되어 있다.


이번에도 역시, 군더더기는 생략하고, 필요한 명령만 나열하기로 한다.

$ git clone https://github.com/bootlin/simplest-yocto-setup
$ cd simplest-yocto-setup
$ git clone -b kirkstone https://git.ti.com/cgit/arago-project/meta-ti
  => 이 부분을 새로 추가한다.
$ vi .config.yaml 
  => 아래와 같이 편집을 한다.
...
  meta-arm:
   url: "git://git.yoctoproject.org/meta-arm"
   refspec: kirkstone
   layers:
     meta-arm-toolchain:
     meta-arm:

 meta-ti:
   url: "https://git.ti.com/cgit/arago-project/meta-ti"
   refspec: kirkstone
   layers:
     meta-ti-bsp:


#  meta-kiss:
#    layers:
#      meta-kiss:


local_conf_header:
#  meta-kiss: |
 meta-ti-bsp: |
   # Some useful lines you may want to copy to your site.conf for development
   # INHERIT += "rm_work"
   # EXTRA_IMAGE_FEATURES = "debug-tweaks"

$ pip install kas
$ kas checkout

$ . openembedded-core/oe-init-build-env
chyi@earth:/mnt/hdd/workspace/bootlin/beagleplay/simplest-yocto-setup/build$ cd conf
$ vi local.conf
  => 아래 내용을 추가(수정)한다.
MACHINE ??= "beagleplay"
DISTRO ??= "kiss"    # 이건 일단 그대로 유지한다.
BBMULTICONFIG ?= ""
~

$ vi build/conf/local.conf
  => meta-kiss line을 제거하고, 아래 내용을 추가한다.
BBLAYERS ?= " \
    ${TOPDIR}/../meta-arm/meta-arm \
    ${TOPDIR}/../meta-arm/meta-arm-toolchain \
    ${TOPDIR}/../meta-ti/meta-ti-bsp \
    ${TOPDIR}/../openembedded-core/meta"
BBPATH ?= "${TOPDIR}"
BBFILES ??= ""
~

$ mkdir -p meta-ti/meta-ti-bsp/conf/distro/
$ cp <ORIG>kiss.conf meta-ti/meta-ti-bsp/conf/distro/
  => kiss.conf 파일을 meta-ti-bsp/conf/distro에 복사한다.
$ . openembedded-core/oe-init-build-env
$ bitbake core-image-minimal
  => image 생성을 시작한다.

$ cd deploy-ti/images/beagleplay
  => build 결과물을 확인한다.

[그림 3.4] Yocto build 결과물 확인

이후의 과정은 앞서의 내용과 동일하여 생략한다.
__________________________________________________________

이상으로 2가지 방법을 이용하여 yocto project 기반으로 booting image를  생성후, 부팅하는 과정을 살펴 보았다. 다음 장 부터는 Bootloader, Linux kernel, rootfs, device drivers(w/ device tree) 순으로 하나씩 세부 내용을 들여다 보도록 하자.

내용이 길어지는 관계로 1부는 여기까지만 하기로 하자. 😎



4. Bootloader 올리기
이번 장에서는 BeaglePlay 보드의 bootloader를 개별적으로 build하여 올려 보는 과정을 소개하고자 한다.

5. Linux Kernel 올리기
이번 장에서는 BeaglePlay 보드에 Linux kernel을 올리는 과정을 소개하고자 한다.


6. Device Tree & Device Drivers
이번 장에서는 BeaglePlay를 위한 Device Tree와 Device Driver에 관한 얘기를 좀 더 해 보고자 한다.


To be continued...



7. References
[2] beagleplay.pdf, https://docs.beagleboard.org/
  => beagleplay & TI documents
[5] embedded-linux-labs.pdf, bootlin
[6] linux-kernel-beagleplay-labs.pdf, bootlin
[7] embedded-linux-slides.pdf, bootlin
  => bootlin documents, 요즘은 이분들이 대세다~
[12] And, Google~


Slowboot




댓글 없음:

댓글 쓰기