36940db938a8f4a1e919496793ed439850a221c2다. 3.7.0부터의 hardware model v2를 다룬다. 새 SoC·CPU cluster 또는 아키텍처 지원이 필요한 경우를 보드 포팅과 구분한다. 아래 도식은 고정된 공식 소스의 관계를 직접 재구성한 것으로 원본 이미지를 전재하지 않았다.1. family·series·SoC·cluster와 보드 변형은 다른 층이다
hardware model v2의 계층은 family → series → SoC → CPU cluster → CPU core/architecture다. family·series는 선택 사항이며, 보드는 하나 이상의 SoC를 담을 수 있다. ns 같은 variant는 이 계층의 새 칩이나 새 CPU가 아니라 특정 보드 target의 빌드 변형이다. 실제 nRF5340의 soc.yml에는 nordic_nrf family, nrf53 series, nrf5340 SoC와 cpuapp·cpunet cluster가 있다.
↔ 좁은 화면에서 첫 칸부터 CPU cluster까지 가로로 이동할 수 있습니다.
nordic_nrf칩군을 묶는 선택적 메타데이터nrf53같은 계열의 SoC를 묶는다nrf5340정확한 칩 이름cpuapp / cpunet각 cluster를 별도의 이미지 target으로 고를 수 있다Cortex-M33 / Armv8-M새 ISA·ABI는 별도 architecture port 범위nrf5340dk/nrf5340/cpuapp · nrf5340dk/nrf5340/cpunet · nrf5340dk/nrf5340/cpuapp/ns. 마지막 ns는 보드 YAML의 CPUAPP용 variant다.board target의 일반형은 board[@revision][/SoC[/CPU cluster][/variant]]다. 한 SoC·단일 cluster 보드는 qualifiers를 생략할 수 있지만, nRF5340 DK에서는 어떤 cluster와 변형을 빌드하는지 적는다. 보드 target 문자열을 soc.yml의 SoC 이름과 혼동하면 이름은 비슷해도 다른 파일을 찾게 된다.
근거: 3.7.0 hardware 계층, board target 문법, Nordic soc.yml, DK board.yml.
2. 칩 하나를 추가할 때 파일 이름보다 책임을 먼저 본다
3.7.0의 실제 Nordic 예시는 일반 가이드의 최소 디렉터리 예시보다 공통 파일을 더 위에서 공유한다. soc.yml과 공통 Kconfig.soc는 soc/nordic/에 있고, nRF53 고유 Kconfig.soc·Kconfig·CMakeLists.txt·soc.c·soc.h는 soc/nordic/nrf53/에 있다. 따라서 예시의 파일을 전부 soc/nordic/nrf53/에 복제하는 식으로 읽으면 실제 선택 경로를 놓친다.
| 고정 소스 | 맡는 일 | 맡지 않는 일 |
|---|---|---|
soc/nordic/soc.yml | family·series·SoC·cpuclusters 이름과 발견용 메타데이터 | 레지스터·핀·드라이버 설정 |
soc/nordic/Kconfig.soc + nrf53/Kconfig.soc | 재사용 가능한 하드웨어 선택 심볼·SOC 문자열 | Zephyr 전용 ARM·드라이버 선택 |
soc/nordic/nrf53/Kconfig + CMakeLists.txt | 아키텍처·SoC 기능 선택과 조건부 SoC 소스 컴파일 | 보드의 LED·커넥터 배선 |
dts/arm/nordic/nrf5340_cpuapp*.dtsi | CPU·메모리·SoC 내부 주변장치의 hardware description | DK의 실제 외부 연결 전체 |
boards/nordic/nrf5340dk/board.yml·Kconfig.nrf5340dk·*.dts | 보드 target·SoC 선택·보드 DTS 구성 | 새 ISA의 context switch 구현 |
근거: SoC porting 파일 역할, Nordic 공통 Kconfig.soc, nRF53 Kconfig.soc, nRF53 Kconfig.
3. devicetree와 Kconfig는 같은 hardware를 다른 질문으로 읽는다
soc.yml·board.yml은 target을 발견하고 분류하는 메타데이터다. 선택된 target의 DTS 계열은 하드웨어 노드·주소·연결을 표현하고, Kconfig 계열은 그 target에서 컴파일할 소프트웨어 기능을 정한다. soc.h·soc.c는 빌드된 SoC 코드의 별도 경계다. 한 파일의 선언이 다른 계열의 내용을 자동으로 생성한다고 읽지 않는다.
↔ 좁은 화면에서는 두 경로와 맨 아래 확인 산출물까지 이동하세요.
board .dtsDK의 선택한 cluster용 파일이 SoC .dtsi를 includeSoC .dtsi + board 연결 + overlayCPU·메모리·버스, 보드 배선, 앱별 덮어쓰기build/zephyr/zephyr.dts실제 병합 결과를 읽는 지점Kconfig.soc + board KconfigSoC/cluster 선택 심볼이 이어진다soc/nordic/nrf53/Kconfig + defconfig + prj.confZephyr 기능과 사용자 설정을 합친다build/zephyr/.config선택된 기능의 최종 값 확인soc.c / arch / driver선택된 조건으로 소스가 컴파일·링크된다. DTS에 노드가 있다고 해서 드라이버가 반드시 활성화되지는 않는다.경계: Kconfig.soc는 Zephyr 밖의 sysbuild Kconfig에서도 재사용할 수 있는 SoC 선택 트리여야 한다. nRF53의 Zephyr 전용 Kconfig가 ARM·Cortex-M33·기능 심볼을 고르는 실제 예시다. 보드 전용 기본값이나 애플리케이션 prj.conf로 새로운 SoC의 하드웨어 이름을 대신 만들어내지 않는다.
근거: 3.7.0 SoC Kconfig 분리, board DTS와 include, nRF53 CMakeLists, 앱 설정.
4. 같은 nRF5340이라도 cpuapp·cpunet 이미지는 서로 다르다
board.yml은 SoC nrf5340을 선언하고 ns 변형을 cpuapp에 붙인다. Kconfig.nrf5340dk는 생성된 보드 target 심볼에 따라 SOC_NRF5340_CPUAPP_QKAA 또는 SOC_NRF5340_CPUNET_QKAA를 선택한다. soc/nordic/nrf53/Kconfig.soc는 이 package 심볼을 다시 cluster·series 심볼에 연결하고 SOC="nrf5340" 문자열을 제공한다. 실제 보드 DTS는 선택한 cluster에 맞는 nrf5340_*_qkaa.dtsi를 include한다.
| 빌드 target | SoC 선택 | board DTS의 SoC include | 읽어야 할 차이 |
|---|---|---|---|
nrf5340dk/nrf5340/cpuapp | SOC_NRF5340_CPUAPP_QKAA | nrf5340_cpuapp_qkaa.dtsi | application cluster의 flash/RAM·주변장치 |
nrf5340dk/nrf5340/cpunet | SOC_NRF5340_CPUNET_QKAA | nrf5340_cpunet_qkaa.dtsi | network cluster의 다른 flash/RAM·주변장치 |
nrf5340dk/nrf5340/cpuapp/ns | CPUAPP package 심볼 | nrf5340_cpuappns_qkaa.dtsi | 같은 CPUAPP cluster의 non-secure 변형 |
이 세 가지는 build target의 예시이지 지금 이 글에서 실행해 얻은 측정값이 아니다. 개별 이미지의 메모리·주변장치 차이는 source DTS에서 확인했으며, 실제 설정 값은 각 target을 빌드한 뒤 build/zephyr/zephyr.dts와 build/zephyr/.config로 다시 확인해야 한다.
근거: board.yml, board Kconfig, CPUAPP DTS, CPUNET DTS, CPUAPP NS DTS.
5. 새 칩 포팅의 순서는 보드 복사에서 끝나지 않는다
먼저 scripts/list_hardware.py --soc-root=. --socs로 이름 중복을 살피고, 기존 architecture와 CPU core 지원이 있는지 확인한다. 새 ISA·ABI라면 SoC 파일만으로는 초기 부팅·IRQ·context switch를 채울 수 없어 별도 architecture port가 필요하다. 지원되는 아키텍처라면 SoC 메타데이터와 선택 심볼, SoC DTSI, 필요한 SoC 코드·CMake를 만든 다음 보드 쪽 board.yml·Kconfig·DTS가 그 SoC를 가리키게 한다.
| 순서 | 만드는 계약 | 확인 질문 |
|---|---|---|
| ① 이름·arch | 고유 SoC 이름, 기존 CPU/ISA 지원 | 새 아키텍처 port가 필요한가? |
| ② 발견 | soc.yml, reusable Kconfig.soc | SoC·cluster가 도구에 발견되고 선택되는가? |
| ③ 칩 기술 | SoC .dtsi, Kconfig, CMakeLists.txt·필요한 soc.c/soc.h | 메모리·IRQ·주변장치와 소프트웨어 선택이 맞는가? |
| ④ 보드 연결 | board.yml, board Kconfig, board .dts | target의 cluster·variant가 맞는 SoC 파일을 고르는가? |
| ⑤ 빌드·관찰 | zephyr.dts, .config, 이미지·로그 | 선택값과 실제 기동·console·clock이 일치하는가? |
트리 밖 정의는 앱 또는 모듈에서 SOC_ROOT, BOARD_ROOT, 필요한 DTS_ROOT를 사용해 발견시킨다. 예를 들어 공식 문서의 형태는 west build -b <board name> -- -DSOC_ROOT=<root> -DBOARD_ROOT=<root>다. 각 root는 해당 soc/·boards/ 디렉터리를 포함하는 상위 디렉터리다. DTSI가 다른 root에 있으면 DTS_ROOT도 제공한다.
v1을 유지하는 경우는 별도 경로다. 3.7 문서는 v2로 변환하는 방법 외에 v3.6의 SoC 정의 자체를 downstream으로 가져와 module 또는 SOC_ROOT에서 발견시키고 구형 board 정의와 함께 쓰는 방법을 허용한다. v1 파일에 soc.yml·board.yml 이름만 붙이는 자동 호환은 없다. 실제 soc/Kconfig도 HWM_SCHEME별 Kconfig 경로를 구분한다. 이 글의 그림과 nRF5340 파일 지도는 v2만 가리킨다.
근거: 새 SoC 구조와 이름 확인, architecture port 계약, 트리 밖 SOC_ROOT·BOARD_ROOT·DTS_ROOT, 3.7 v2 전환 선택지, 3.7 HWM_SCHEME별 Kconfig.
6. 오류 메시지를 만나면 어느 선언까지 도달했는가?
SoC 포팅 실패를 보드 파일 하나에 몰아넣기보다, target 발견 → Kconfig 선택 → DTS 결합 → SoC 초기화의 순서로 관찰한다. 아래 그림은 원인을 단정하는 표가 아니라 첫 조사 지점을 정하는 지도다.
↔ 좁은 화면에서는 왼쪽의 target 발견부터 오른쪽의 기동까지 이동하세요.
soc.yml·board.yml, root 설정, qualifier 이름발견 단계부터 확인Kconfig.* → SoC Kconfig.soc → .configCPUAPP/CPUNET 심볼 대조.dts의 SoC include와 zephyr.dts주소·status·chosen 대조soc.c·arch·driver 초기화초기 로그와 실제 보드 확인| 증상 | 첫 확인 | 넘어갈 조건 |
|---|---|---|
| SoC 또는 board target을 못 찾음 | SOC_ROOT/BOARD_ROOT, 양쪽 YAML, qualifier | 이름이 도구에 나타난 뒤 Kconfig 확인 |
| 선택한 cluster와 다른 CPU 심볼 | board Kconfig.*, SoC Kconfig.soc, .config | 심볼이 맞으면 DTS 확인 |
| 메모리·UART 주소가 예상과 다름 | board DTS의 SoC DTSI include, overlay, zephyr.dts | 병합 결과가 맞으면 드라이버·기동 확인 |
| 빌드는 되나 초기 기동 실패 | arch port 범위, SoC 초기화 SYS_INIT, clock·console·드라이버 | 실기기 trace로 원인을 확정 |
v3.7.0 nRF53의 soc.c는 예를 들어 SYS_INIT(nordicsemi_nrf53_init, PRE_KERNEL_1, 0)으로 SoC 초기화 함수를 등록한다. 이것이 모든 SoC에서 똑같은 함수나 우선순위를 써야 한다는 뜻은 아니다. 초기화 순서는 구현 소스와 설정을 함께 읽는다. 이 글은 소스·문서 분석이며 새 칩의 빌드·실기기 부팅 성공을 주장하지 않는다.
근거: nRF53 SYS_INIT, SoC 발견 스크립트, board 빌드 확인.
7. 고정 버전 근거와 이어 읽기
문서는 Zephyr 3.7.0 공개판, 코드와 파일 이름은 같은 v3.7.0 태그에 고정했다. 일부 최신 문서의 hardware model 세부 형식을 3.7.0에 소급하지 않았다.
| 고정 근거 | 확인한 경계 |
|---|---|
| SoC Porting Guide · Board Porting Guide | hardware model v2, SoC·보드 책임과 target 형식 |
| soc.yml · Kconfig.soc · Kconfig | nRF5340 두 cluster, SoC 선택 트리와 Zephyr 기능의 분리 |
| board.yml · 보드 Kconfig · 보드 DTS | target의 SoC·cluster·variant가 실제 package 심볼과 DTSI를 선택 |
| 트리 밖 정의 · Architecture Porting Guide | root 설정과 SoC port·architecture port의 범위 |