SD카드 / NVMe / eMMC 멀티부트 메뉴 구현 관련 문의

안녕하세요, TOPST D3-G를 활용해 개인 프로젝트를 진행 중인 사용자입니다.

보드를 사용하면서 한 가지 기능을 구현해보고 싶어 커뮤니티에 도움을 요청드립니다.

구현하고 싶은 것

하드커널의 ODROID-M1의 petitboot처럼, 부팅 시 저장 장치를 선택할 수 있는 메뉴를 TOPST D3-G에서도 사용하고 싶습니다.

선택 대상으로 생각하고 있는 것:

  • eMMC (기본 Ubuntu)
  • SD카드 (Ubuntu 복제본, 레트로 게임 OS 등 다양하게 활용)
  • NVMe SSD

현재 검토 중인 접근 방식

TCC 부트로더가 eMMC 고정 부팅 구조(Single Boot)이고 SD 부팅을 공식 지원하지 않아, petitboot와 동일한 원리인 kexec를 활용하는 방향을 검토하고 있습니다.

[TCC 부트로더] → [eMMC Ubuntu] → [부팅 메뉴 스크립트] → kexec → [선택한 OS]
  1. eMMC로 항상 먼저 부팅 (현재 구조상 불가피)
  2. 부팅 초반 systemd 서비스에서 메뉴 표시
  3. 선택한 장치의 커널+rootfs를 kexec로 로드해 전환

커널은 CONFIG_KEXEC=y로 재빌드가 필요한데, topst-development/kernel-5.10 소스가 공개되어 있어 이 부분은 직접 진행할 수 있을 것 같습니다.

문의 드리는 내용

부트로더 관련해서 GitHub를 살펴보니 아래 두 레포지토리가 있었습니다:

현재 두 레포 모두 README만 있고 소스 코드는 올라와 있지 않은 상태인데, 혹시 아래 사항들을 여쭤봐도 될까요?

  1. 부트로더 소스 공개 계획이 있으신지요?
    U-Boot는 GPL v2 라이선스로, 바이너리 배포 시 소스 제공 의무가 있어 여쭤봅니다. TOPST D3-G 부트로더가 U-Boot 기반이라면 소스를 공개해 주실 수 있는지 궁금합니다.

  2. 소스 공개가 어렵다면, 부트로더 관련 문서라도 제공해 주실 수 있는지요?
    아래 내용만 문서화되어 있어도 커뮤니티 활용도가 크게 높아질 것 같습니다:

    • 부팅 순서 및 파티션 구조
    • 커널 커맨드라인 파라미터 수정 방법
    • SD카드, NVMe 등 대체 부팅 소스 활성화 가능 여부

환경 정보

  • 보드: TOPST D3-G (TCC8050, Cortex-A72 × 4, 6.9 GB RAM)
  • 현재 OS: Ubuntu 22.04.5 LTS (eMMC)
  • 커널: 5.10.205-tcc (CONFIG_KEXEC 현재 비활성화 확인)
  • 부팅 파티션 (mmcblk0p2): Android boot image 포맷

구현에 성공하면 과정과 결과를 커뮤니티에 공유할 예정입니다.
바쁘신 중에 읽어주셔서 감사합니다. 어떤 형태로든 답변 주시면 큰 도움이 될 것 같습니다.

직접 구현해봤습니다. 결과 공유합니다.


구현 방식: kexec 기반 부팅 메뉴

U-Boot 소스가 없으므로 eMMC Ubuntu를 항상 먼저 부팅 → kexec로 SD카드 커널로 점프하는 방식을 사용했습니다.

1단계: 커널 재빌드 (CONFIG_KEXEC 활성화)

기본 배포 커널은 CONFIG_KEXEC=y가 꺼져 있어 직접 빌드해야 합니다.
d3_g_topst_defconfig로 빌드하면 PCIe/NVMe, Ethernet 드라이버가 빠지므로, 현재 동작 중인 커널 config를 추출해서 KEXEC만 추가해야 합니다.

# TOPST에서 config 추출
zcat /proc/config.gz > running_config

# x86 PC에서 크로스컴파일
cp running_config ~/topst-kernel/.config
echo "CONFIG_KEXEC=y" >> .config
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
  LOCALVERSION="" KCFLAGS="-Wno-error=enum-int-mismatch" -j$(nproc) Image

2단계: SD카드 rootfs 구성

eMMC rootfs를 rsync로 복사했습니다.

sudo mkfs.ext4 -L sdroot /dev/mmcblk1p1
sudo rsync -aAX \
  --exclude={/proc,/sys,/dev,/run,/mnt,/tmp,/media,/swap.img} \
  / /media/topst/sdroot/

3단계: 부팅 메뉴 (systemd 서비스)

/usr/local/bin/boot-menu.sh — SD카드에 /boot/Image 있을 때만 메뉴 표시, 30초 타임아웃.

# kexec 핵심 명령
cp /sys/firmware/fdt /tmp/live.dtb   # live DTB 필수 (8GB 메모리 인식)
kexec -l /path/to/SD/boot/Image \
  --dtb=/tmp/live.dtb \
  --command-line="root=UUID=<SD_UUID> rw console=tty1 console=ttyAMA0,115200"
kexec -e

/etc/systemd/system/boot-menu.serviceBefore=basic.target, TTYPath=/dev/tty1으로 DP 모니터에 메뉴 출력.

주의사항

  • --dtb=/sys/firmware/fdt (live DTB) 필수. recovery DTB 사용 시 메모리 1.2GB로 인식됨
  • irqpoll 절대 사용 금지 → USB IRQ 폭주로 soft lockup 발생
  • --kexec-file-syscall 사용 금지

후기

  • 속도: SD카드 특성상 eMMC 대비 부팅이 많이 느립니다.
  • 구조적 한계: 결국 eMMC가 먼저 완전히 부팅된 후 메뉴가 뜨는 구조라, 진정한 멀티부트라기보다는 “eMMC에서 SD로 OS를 교체하는” 느낌입니다. U-Boot 소스가 공개되어 U-Boot 단계에서 부팅 장치를 선택할 수 있다면 훨씬 깔끔할 것 같습니다. TOPST 측의 U-Boot 소스 공개 또는 부트 시퀀스 문서 공개를 기대합니다.
1 Like

안녕하세요, 생글이님.

답변이 늦은 점 죄송합니다 ㅜㅜ
공유해주신 내용 확인하였습니다. 추후 내용 참고하여 진행 해보도록 하겠습니다. 감사합니다!

u-boot source code를 요청하셨는데요, TOPST는 오픈소스 정책을 실시하고 있으므로 u-boot 소스코드 또한 github에 공개되어 있습니다.

위 링크는 현재 배포된 이미지의 u-boot 소스코드입니다.
추가로 필요하신 부분이 있으시면 언제든지 말씀 부탁드립니다.

감사합니다.

@su.nam
브랜치가 있는줄 몰랐네요.
알려주신 코드로 며칠동안 Claude Code와 함께 틈틈히 작업했습니다. 이번엔 kexec 대신에 U-Boot 부트로더 단계에서 바로 저장장치를 고르는 부팅 메뉴를 구현했습니다. 진행 상황 공유드립니다.

이번에는 eMMC를 거치지 않고 U-Boot 단계에서 모니터에 메뉴를 띄우고, USB 키보드로 eMMC / SD카드를 선택해 부팅합니다. 처음에 원했던 "진정한 멀티부트"에 한층 가까워졌습니다.

메뉴 자체는 U-Boot 표준 기능(CONFIG_CMD_BOOTMENU)으로 띄웠고, 정작 손이 많이 간 부분은 부팅 단계에서 무선 키보드를 동작시키는 것이었습니다. USB 호스트 드라이버(EHCI / OHCI / xHCI)를 여러 군데 수정했습니다.

수정 사항 전부 정리한 fork + Pull Request: TOPST D3-G: USB 키보드 + DP 부팅 메뉴 (무선 동글 지원) by Pyohwan · Pull Request #1 · Pyohwan/u-boot · GitHub

테스트에 사용한 장치

  • 무선 키보드 동글 (둘 다 저속, Full-Speed):
    • 한성 콤보 — Areson, USB ID 25a7:fa67
    • 그루브스톤 — Telink, USB ID 320f:5088
  • USB 허브:
    • nexi NX-U3130-4PH — Genesys GL3523 (05e3:0610), 단일 변환기(single-TT)
    • nexi NX-UH304P — Realtek RTS5411 (0bda:5411), 다중 변환기(multi-TT)

되는 것

기능 상태
모니터에 부팅 메뉴 표시 (eMMC / SD카드 / U-Boot 콘솔) :white_check_mark:
유선 키보드 (USB 3.0 포트) :white_check_mark:
무선 동글을 USB 3.0 포트에 직접 연결 :white_check_mark:
무선 동글을 USB 2.0 포트에 직접 연결 (OHCI 활성화) :white_check_mark:
무선 동글 + 허브를 USB 2.0 포트에 연결 (EHCI) :white_check_mark:
USB 2.0 무선 키보드와 USB 3.0 허브를 동시에 연결 :white_check_mark:

안 되는 것 (하나 남았습니다)

기능 상태
무선 동글 + 허브를 USB 3.0 포트에 연결 (xHCI) :cross_mark:

TOPST에 봐주셨으면 하는 부분

USB 2.0 고속(High-Speed) 허브를 USB 3.0 포트에 꽂고, 그 허브 뒤에 저속(Full-Speed, 12Mbps) 무선 키보드 동글을 연결하면, U-Boot의 xHCI 드라이버에서 키 입력 완료 이벤트가 오지 않습니다. (동글을 포트에 직접 꽂거나, 허브를 USB 2.0 포트에 꽂으면 모두 정상입니다. 위 두 허브 모두 USB 3.0에서는 실패합니다.) 같은 보드에서 Linux 5.10.205-tcc는 잘 됩니다.

허브를 거치는 저속 장치는 허브 내부의 변환기(Transaction Translator)를 통해 통신하는데, 그중 주기적인 인터럽트 전송만 완료되지 않습니다. slot / endpoint context, 변환기 설정, USB 2.0 PHY 튜닝 값, 컨트롤러 capability 레지스터, 이벤트 링 동작까지 전부 Linux와 동일하게 맞췄는데도 해당 전송만 시작된 흔적조차 없습니다.

질문 두 가지입니다:

  1. TCC8050 dwc3 호스트에서 허브를 거치는 저속 장치의 주기적 인터럽트 전송에 알려진 문제(errata)나, 소프트웨어가 추가로 해줘야 하는 설정이 있을까요?
  2. Linux의 xHCI 드라이버에는 있고 U-Boot 쪽에는 빠진 관련 처리가 있을까요?

재현 환경과 진단 로그를 가지고 있어, 필요하시면 더 공유드리겠습니다.

안녕하세요, @saenggeuri 님.
증상 재현을 위해 작성해주신 내용을 보고 생글이 님의 git repository 주소로 u-boot-topst.bb파일의 src_uri를 변경하여 테스트해보려고 합니다.
CONFIG_CMD_BOOTMENU를 활성화하여 부팅을 하였으나 UART 콘솔창에만 아래와 같은 화면이 뜨고 DP를 연결한 모니터에는 BootLogo가 떠있습니다.

혹시 추가해야할 config가 있을까요?
세팅하신 환경설정 내용 공유 부탁 드립니다.

감사합니다.

@su.nam 님.

말씀하신 증상은 제 쪽 defconfig 문제였습니다. 부팅 메뉴 · 디스플레이 · USB 키보드에 필요한 config들을 그동안 빌드할 때 .config에 직접 넣고 빌드만 해서, 정작 d3_g_topst_defconfig에는 커밋이 안 돼 있었습니다. 그래서 clean하게 받아 빌드하면 그 옵션들이 빠졌던 겁니다.

방금 savedefconfig로 누락 config들을 defconfig에 반영해 push했습니다:

다시 받으셔서 아래로 빌드하시면 별도 config 추가 없이 DP에 메뉴가 뜹니다:

make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- d3_g_topst_defconfig
make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- \
  KCFLAGS="-Wno-error=enum-int-mismatch -Wno-error=unused-function" -j$(nproc)

DP 출력 관련 핵심은 이 부분입니다:

  • CONFIG_CONSOLE_MUX + CONFIG_SYS_CONSOLE_IS_IN_ENVstdout=vidconsole,serial 환경변수가 적용되려면 필수입니다. 이게 빠지면 메뉴가 serial(UART)로만 나갑니다.
  • CONFIG_DM_VIDEO / CONFIG_DISPLAY / CONFIG_DISPLAY_PORT_V14 — DP vidconsole 출력.

BootLogo는 떠 있다고 하셨으니 DP 패널 자체는 이미 켜진 상태이고, 메뉴 텍스트만 안 나온 것은 위 CONSOLE_MUX 계열 누락 때문으로 보입니다.

감사합니다.

@saenggeuri 님, 안녕하세요. 친절히 답변주셔서 감사합니다.
다만, push해주신 내용에 CONFIG_CONSOLE_MUX + CONFIG_SYS_CONSOLE_IS_IN_ENV 내용이 없어 새로이 빌드하여도 적용이 되지 않았었습니다.
제가 해당 config 활성화 후 DP 모니터에서 정상 동작함을 확인했습니다. 다시 한 번 확인 부탁드립니다!
추가로 USB 3.0 포트에 직결하여도 동작이 되지 않는데, 이 부분도 확인 한 번 부탁드립니다.

감사합니다!!

@su.nam
죄송합니다. 이것 저것 옵션 바꿔가면서 했던거라 빠트린게 많네요.
이번엔 제가 빌드하고 flash 까지 하고 테스트해본거라 잘 될것이라 기대합니다. 저는 make defconfig && make 한거라 su.nam님 yocto 빌드와 방법은 다릅니다. usb 3.0 키보드 동글 직결도 잘 되는걸 확인했습니다. yocto에서도 잘 되는지 확인해주시면 감사하겠습니다.

  • 부팅·저장장치: CONFIG_SD_BOOT, CONFIG_CMD_MMC, CONFIG_MMC_TCC_SC, CONFIG_CMD_BOOTMENU
  • 디스플레이(DP 출력): CONFIG_DM_VIDEO, CONFIG_DISPLAY, CONFIG_DISPLAY_PORT_V14, CONFIG_TELECHIPS_FB_DM, CONFIG_TELECHIPS_DPV14_DM, CONFIG_TELECHIPS_LVDS_DM, CONFIG_TELECHIPS_LVDS_CTRL, CONFIG_VIDEO_ANSI, CONFIG_VIDEO_BMP_GZIP, CONFIG_CMD_BMP
  • 콘솔(메뉴를 DP로 출력): CONFIG_CONSOLE_MUX, CONFIG_SYS_CONSOLE_IS_IN_ENV
  • USB 키보드: CONFIG_USB_KEYBOARD, CONFIG_SYS_USB_EVENT_POLL, CONFIG_USB_HOST
  • USB 2.0 직결(OHCI): CONFIG_USB_OHCI_HCD, CONFIG_USB_OHCI_GENERIC