Tina-Linux 부트로더 아키텍처 및 디렉터리 구조
Tina-Linux SDK에서 부트로더(Bootloader) 관련 소스 코드는 주로 lichee/brandy-2.0 경로에 위치합니다. 해당 디렉터리의 최상위 구조는 다음과 같이 구성되어 있습니다.
user@dev-machine:~/tina-sdk/lichee/brandy-2.0$ tree -L 1
.
├── build.sh # 통합 빌드 스크립트
├── opensbi # RISC-V 오픈소스 SBI
├── spl # 1차 부트로더 (boot0)
├── spl-pub # 공개용 boot0 바이너리
├── tools # 호스트 빌드 도구
└── u-boot-2018 # 2차 부트로더 (U-Boot)
전체 부팅 시퀀스는 ROM 코드에서 시작되어 SPL(boot0)을 거쳐 U-Boot로 이어지며, 최종적으로 Linux 커널을 메모리에 적재하고 제어권을 넘겨주는 흐름을 따릅니다.
부트로더 독립 컴파일 절차
1. 크로스 컴파일 툴체인 환경 설정
빌드를 진행하기 전에 타겟 아키텍처에 맞는 툴체인을 다운로드하고 환경 변수를 설정해야 합니다. 다음 명령어를 통해 자동 구성할 수 있습니다.
cd lichee/brandy-2.0/
./build.sh -t # 툴체인 다운로드 및 환경 변수 export
2. SPL 및 U-Boot 일괄 빌드
전체 부트로더 스택을 한 번에 컴파일하려면 build.sh 스크립트에 타겟 칩셋 식별자(LICHEE_CHIP)를 인자로 전달합니다.
# 타겟 플랫폼에 맞는 SPL 및 U-Boot 동시 컴파일
./build.sh -p ${TARGET_CHIP_ID}
3. U-Boot 단일 모듈 컴파일
U-Boot 소스 디렉터리로 이동하여 특정 보드 설정(defconfig)을 기반으로 빌드할 수 있습니다. 아래 예시는 시리얼 디버그 포트를 변경한 커스텀 설정을 사용하는 경우입니다.
cd lichee/brandy-2.0/u-boot-2018
# 보드별 기본 설정 로드
make custom_board_uart3_defconfig
# 멀티코어를 활용한 병렬 빌드
make -j$(nproc)
4. SPL(boot0), FES, Sboot 모듈별 빌드
SPL 디렉터리에서는 저장매체(NAND/eMMC) 또는 특정 기능(FES/Sboot)에 따라 빌드 타겟을 세분화할 수 있습니다. p는 플랫폼, m은 모듈을 지정하는 파라미터입니다.
boot0 (저장매체별 컴파일)
cd lichee/brandy-2.0/spl
# NAND 플래시용 boot0 빌드
make distclean && make p=${TARGET_CHIP_ID} m=nand && make boot0
# eMMC 스토리지용 boot0 빌드
make distclean && make p=${TARGET_CHIP_ID} m=emmc && make boot0
FES (Firmware Upgrade Service) 및 Sboot
# 펌웨어 업데이트용 FES 모듈
make distclean && make p=${TARGET_CHIP_ID} m=fes && make fes
# 보안 부팅을 위한 Sboot 모듈
make distclean && make p=${TARGET_CHIP_ID} m=sboot && make sboot
U-Boot 커스텀 설정 및 소스 관리
1. 디바이스 트리 및 환경 변수 파일
하드웨어 핀mux, 클럭 설정 및 U-Boot 환경 변수는 장치 설정 디렉터리에서 관리됩니다. 특정 보드의 설정 파일 구조는 다음과 같습니다.
user@dev-machine:~/tina-sdk/device/config/chips/t113/configs/custom_board$ ls -la
-rw-rw-r-- 1 user user 2106 Oct 12 09:15 env.cfg # U-Boot 기본 환경 변수
-rwxrwxr-x 1 user user 8123 Oct 12 09:15 sys_config.fex # 하드웨어 핀 및 클럭 설정
-rwxrwxr-x 1 user user 12929 Oct 12 09:15 uboot-board.dts # U-Boot 전용 디바이스 트리
2. U-Boot 소스 코드 트리
U-Boot의 핵심 소스 코드는 u-boot-2018 디렉터리에 분포되어 있으며, 주요 서브 디렉터리의 역할은 다음과 같습니다.
arch/: ARM, RISC-V 등 CPU 아키텍처 종속 코드board/: 제조사 및 보드별 초기화 루틴drivers/: MMC, NAND, 네트워크 등 주변기기 드라이버include/: 전역 헤더 파일 및 설정 매크로configs/: 보드별 기본 빌드 설정(defconfig) 파일
3. 보드별 Defconfig 파일 관리
configs 디렉터리에는 지원되는 다양한 보드와 부팅 매체(NOR, NAND 등)에 대한 설정 파일이 저장되어 있습니다.
user@dev-machine:~/tina-sdk/lichee/brandy-2.0/u-boot-2018/configs$ ls -lh
-rw-rw-r-- 1 user user 5.1K May 25 2022 sun20iw1p1_defconfig
-rw-rw-r-- 1 user user 2.2K May 25 2022 sun20iw1p1_nor_defconfig
-rw-rw-r-- 1 user user 4.9K Oct 12 09:15 custom_board_defconfig
-rw-rw-r-- 1 user user 3.0K Oct 12 09:15 custom_board_nor_defconfig
-rw-rw-r-- 1 user user 2.4K Oct 12 09:15 custom_board_uart3_defconfig
4. Tina SDK 통합 빌드 설정 (BoardConfig.mk)
SDK 루트에서 make 또는 pack 명령어를 실행할 때 참조되는 전역 보드 설정 파일입니다. 여기서 칩셋, 아키텍처, 커널 버전 등을 정의합니다.
user@dev-machine:~/tina-sdk/device/config/chips/t113/configs/custom_board$ cat BoardConfig.mk
# 타겟 칩셋 및 아키텍처 정의
LICHEE_CHIP:=sun8iw20p1
LICHEE_ARCH:=arm
# Brandy(U-Boot/SPL) 및 Kernel 설정
LICHEE_BRANDY_VER:=2.0
LICHEE_BRANDY_DEFCONF:=custom_board_uart3_defconfig
LICHEE_KERN_VER:=5.4
LICHEE_KERN_DEFCONF:=sun8iw20p1smp_defconfig
# U-Boot 환경 변수 중복 저장소 크기
LICHEE_REDUNDANT_ENV_SIZE:=0x20000
5. 이미지 패키징 및 펌웨어 업데이트
부트로더 수정 사항을 반영하여 이미지를 다시 빌드하고 패키징하는 과정입니다. mboot 명령어는 부트로더만 선택적으로 재컴파일할 때 유용합니다.
# 부트로더 모듈 선택적 클린 및 재빌드
user@dev-machine:~/tina-sdk$ mboot
build_boot platform:custom_board_uart3 o_option:uboot
... (빌드 로그 생략) ...
# 전체 커널 및 루트파일시스템 포함 병렬 빌드
user@dev-machine:~/tina-sdk$ make -j$(nproc)
# 최종 펌웨어 이미지(.img) 패키징
user@dev-machine:~/tina-sdk$ pack
생성된 최종 펌웨어 이미지는 PhoenixSuit 또는 LiveSuit와 같은 전용 플래싱 도구를 사용하여 타겟 보드의 eMMC 또는 NAND 플래시에 직접 기록할 수 있습니다.