build/zephyr/zephyr.dts 의 구조를 보며, devicetree가 어떻게 HW를 추상화 하는지 따라가봄.west build -b nrf52840dk/nrf52840 samples/basic/blinky
빌드 성공시, build/zephyr/zephyr.dts가 생성됨.
# build
west build -b nrf52840dk/nrf52840 samples/basic/blinky
# flash 위한 환경구축은 아래 링크를 참고
# https://docs.zephyrproject.org/latest/boards/nordic/nrf52840dk/doc/index.html#flashing
nrfjprog --eraseall -f nrf52
nrfjprog --program build/zephyr/zephyr.hex -f nrf52
nrfjprog --reset -f nrf52
zephyr.dtsskeleton.dtsi
↓
armv7-m.dtsi
↓
nrf52840.dtsi
↓
nrf52840_qiaa.dtsi
↓
nrf_common.dtsi + pinctrl.dtsi
↓
nrf52840dk_nrf52840.dts
↓
→ zephyr.dts (병합 결과)
#include로 병합된 상위 dts 파일 목록 (주석에 나와 있음)zephyr/dts/common/skeleton.dtsi: dts의 가장 기본 요소(root node, chosen node, aliases node가 포함됨.)zephyr/dts/common/skeleton.dtsi:9 '/'
zephyr/dts/common/skeleton.dtsi:12 '/chosen'
zephyr/dts/common/skeleton.dtsi:13 '/aliases'
zephyr/dts/arm/armv7-m.dtsi: armv7-m의 공통 노드를 정의. timer와 nvic의 주소는 armv7-m 공통인듯.zephyr/dts/arm/armv7-m.dtsi:6 '/soc'
zephyr/dts/arm/armv7-m.dtsi:13 '/soc/interrupt-controller@e000e100'
zephyr/dts/arm/armv7-m.dtsi:21 '/soc/timer@e000e010'
zephyr/dts/arm/nordic/nrf52840_qiaa.dtsi: nRF52840칩의 QIAA버전에만 적용되는 DT 요소를 정의
| 코드 | 의미 |
|---|---|
| Q | QFN 패키지 (7×7mm, 73핀) |
| I | Industrial temperature range (-40°C ~ +85°C) |
| A | Revision (칩 내부 개선 버전) |
| A | Minor revision (보통 작은 버그 수정) |
zephyr/dts/arm/nordic/nrf52840_qiaa.dtsi
zephyr/dts/arm/nordic/nrf52840.dtsi: nrf52840의 노드 정의zephyr/dts/arm/nordic/nrf52840.dtsi:15 '/cpus'
zephyr/dts/arm/nordic/nrf52840.dtsi:19 '/cpus/cpu@0'
zephyr/dts/arm/nordic/nrf52840.dtsi:26 '/cpus/cpu@0/itm@e0000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:34 '/clocks'
zephyr/dts/arm/nordic/nrf52840.dtsi:35 '/clocks/hfxo'
zephyr/dts/arm/nordic/nrf52840.dtsi:44 '/soc/ficr@10000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:51 '/soc/uicr@10001000'
zephyr/dts/arm/nordic/nrf52840.dtsi:57 '/soc/memory@20000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:61 '/soc/clock@40000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:68 '/soc/power@40000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:76 '/soc/power@40000000/gpregret1@4000051c'
zephyr/dts/arm/nordic/nrf52840.dtsi:84 '/soc/power@40000000/gpregret2@40000520'
zephyr/dts/arm/nordic/nrf52840.dtsi:92 '/soc/power@40000000/regulator@40000578'
zephyr/dts/arm/nordic/nrf52840.dtsi:100 '/soc/radio@40001000'
zephyr/dts/arm/nordic/nrf52840.dtsi:110 '/soc/radio@40001000/ieee802154'
zephyr/dts/arm/nordic/nrf52840.dtsi:118 '/soc/radio@40001000/bt_hci_controller'
zephyr/dts/arm/nordic/nrf52840.dtsi:124 '/soc/uart@40002000'
zephyr/dts/arm/nordic/nrf52840.dtsi:133 '/soc/i2c@40003000'
zephyr/dts/arm/nordic/nrf52840.dtsi:151 '/soc/spi@40003000'
zephyr/dts/arm/nordic/nrf52840.dtsi:169 '/soc/i2c@40004000'
zephyr/dts/arm/nordic/nrf52840.dtsi:187 '/soc/spi@40004000'
zephyr/dts/arm/nordic/nrf52840.dtsi:205 '/soc/nfct@40005000'
zephyr/dts/arm/nordic/nrf52840.dtsi:212 '/soc/gpiote@40006000'
zephyr/dts/arm/nordic/nrf52840.dtsi:220 '/soc/adc@40007000'
zephyr/dts/arm/nordic/nrf52840.dtsi:229 '/soc/timer@40008000'
zephyr/dts/arm/nordic/nrf52840.dtsi:239 '/soc/timer@40009000'
zephyr/dts/arm/nordic/nrf52840.dtsi:249 '/soc/timer@4000a000'
zephyr/dts/arm/nordic/nrf52840.dtsi:259 '/soc/rtc@4000b000'
zephyr/dts/arm/nordic/nrf52840.dtsi:269 '/soc/temp@4000c000'
zephyr/dts/arm/nordic/nrf52840.dtsi:276 '/soc/random@4000d000'
zephyr/dts/arm/nordic/nrf52840.dtsi:283 '/soc/ecb@4000e000'
zephyr/dts/arm/nordic/nrf52840.dtsi:290 '/soc/ccm@4000f000'
zephyr/dts/arm/nordic/nrf52840.dtsi:298 '/soc/watchdog@40010000'
zephyr/dts/arm/nordic/nrf52840.dtsi:305 '/soc/rtc@40011000'
zephyr/dts/arm/nordic/nrf52840.dtsi:315 '/soc/qdec@40012000'
zephyr/dts/arm/nordic/nrf52840.dtsi:322 '/soc/comparator@40013000'
zephyr/dts/arm/nordic/nrf52840.dtsi:333 '/soc/egu@40014000'
zephyr/dts/arm/nordic/nrf52840.dtsi:340 '/soc/egu@40015000'
zephyr/dts/arm/nordic/nrf52840.dtsi:347 '/soc/egu@40016000'
zephyr/dts/arm/nordic/nrf52840.dtsi:354 '/soc/egu@40017000'
zephyr/dts/arm/nordic/nrf52840.dtsi:361 '/soc/egu@40018000'
zephyr/dts/arm/nordic/nrf52840.dtsi:368 '/soc/egu@40019000'
zephyr/dts/arm/nordic/nrf52840.dtsi:375 '/soc/timer@4001a000'
zephyr/dts/arm/nordic/nrf52840.dtsi:385 '/soc/timer@4001b000'
zephyr/dts/arm/nordic/nrf52840.dtsi:395 '/soc/pwm@4001c000'
zephyr/dts/arm/nordic/nrf52840.dtsi:403 '/soc/pdm@4001d000'
zephyr/dts/arm/nordic/nrf52840.dtsi:410 '/soc/acl@4001e000'
zephyr/dts/arm/nordic/nrf52840.dtsi:416 '/soc/flash-controller@4001e000'
zephyr/dts/arm/nordic/nrf52840.dtsi:425 '/soc/flash-controller@4001e000/flash@0'
zephyr/dts/arm/nordic/nrf52840.dtsi:432 '/soc/ppi@4001f000'
zephyr/dts/arm/nordic/nrf52840.dtsi:438 '/soc/mwu@40020000'
zephyr/dts/arm/nordic/nrf52840.dtsi:444 '/soc/pwm@40021000'
zephyr/dts/arm/nordic/nrf52840.dtsi:452 '/soc/pwm@40022000'
zephyr/dts/arm/nordic/nrf52840.dtsi:460 '/soc/spi@40023000'
zephyr/dts/arm/nordic/nrf52840.dtsi:478 '/soc/rtc@40024000'
zephyr/dts/arm/nordic/nrf52840.dtsi:488 '/soc/i2s@40025000'
zephyr/dts/arm/nordic/nrf52840.dtsi:497 '/soc/usbd@40027000'
zephyr/dts/arm/nordic/nrf52840.dtsi:509 '/soc/uart@40028000'
zephyr/dts/arm/nordic/nrf52840.dtsi:516 '/soc/qspi@40029000'
zephyr/dts/arm/nordic/nrf52840.dtsi:526 '/soc/pwm@4002d000'
zephyr/dts/arm/nordic/nrf52840.dtsi:534 '/soc/spi@4002f000'
zephyr/dts/arm/nordic/nrf52840.dtsi:547 '/soc/gpio@50000000'
zephyr/dts/arm/nordic/nrf52840.dtsi:558 '/soc/gpio@50000300'
zephyr/dts/arm/nordic/nrf52840.dtsi:570 '/soc/crypto@5002a000'
zephyr/dts/vendor/nordic/nrf_common.dtsi: /pin-controller노드를 불러오는것으로 보아, nrf계열의 soc의 핀 노드는 모두 /pin-controller로 네이밍 통일되어있는듯zephyr/dts/vendor/nordic/nrf_common.dtsi:26 '/pin-controller'
zephyr/dts/vendor/nordic/nrf_common.dtsi:34 '/entropy_bt_hci'
zephyr/dts/vendor/nordic/nrf_common.dtsi:39 '/sw-pwm'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi: nrf52840dk보드의 pin 세팅 관련 노드 정보 불러옴.zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:7 '/pin-controller/uart0_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:8 '/pin-controller/uart0_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:13 '/pin-controller/uart0_default/group2'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:20 '/pin-controller/uart0_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:21 '/pin-controller/uart0_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:30 '/pin-controller/uart1_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:31 '/pin-controller/uart1_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:36 '/pin-controller/uart1_default/group2'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:41 '/pin-controller/uart1_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:42 '/pin-controller/uart1_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:49 '/pin-controller/i2c0_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:50 '/pin-controller/i2c0_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:56 '/pin-controller/i2c0_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:57 '/pin-controller/i2c0_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:64 '/pin-controller/i2c1_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:65 '/pin-controller/i2c1_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:71 '/pin-controller/i2c1_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:72 '/pin-controller/i2c1_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:79 '/pin-controller/pwm0_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:80 '/pin-controller/pwm0_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:86 '/pin-controller/pwm0_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:87 '/pin-controller/pwm0_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:93 '/pin-controller/spi0_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:94 '/pin-controller/spi0_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:101 '/pin-controller/spi0_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:102 '/pin-controller/spi0_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:110 '/pin-controller/spi1_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:111 '/pin-controller/spi1_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:118 '/pin-controller/spi1_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:119 '/pin-controller/spi1_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:127 '/pin-controller/spi2_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:128 '/pin-controller/spi2_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:135 '/pin-controller/spi2_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:136 '/pin-controller/spi2_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:144 '/pin-controller/qspi_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:145 '/pin-controller/qspi_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:156 '/pin-controller/qspi_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:157 '/pin-controller/qspi_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:166 '/pin-controller/qspi_sleep/group2'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:173 '/pin-controller/spi3_default'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:174 '/pin-controller/spi3_default/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:181 '/pin-controller/spi3_sleep'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840-pinctrl.dtsi:182 '/pin-controller/spi3_sleep/group1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts: nrf52840dk의 보드에 존재하는 요소 추상화 위한(LED, 버튼 등)노드 불러옴zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:27 '/leds'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:30 '/leds/led_0'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:35 '/leds/led_1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:40 '/leds/led_2'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:45 '/leds/led_3'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:51 '/pwmleds'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:54 '/pwmleds/pwm_led_0'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:59 '/buttons'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:62 '/buttons/button_0'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:68 '/buttons/button_1'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:74 '/buttons/button_2'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:80 '/buttons/button_3'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:87 '/connector'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:116 '/analog-connector'
zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:255 '/soc/qspi@40029000/mx25r6435f@0'
chosen 섹션chosen: Zephyr의 커널이나 드라이버가 필수로 참조해야 하는 하드웨어 리소스나 설정 값을 Device Tree(DTS) 상에서 명시적으로 지정해주는 영역.chosen {
zephyr,bt-hci = &bt_hci_controller; /* in zephyr/dts/arm/nordic/nrf52840.dtsi:10 */
zephyr,entropy = &rng; /* in zephyr/dts/arm/nordic/nrf52840.dtsi:11 */
zephyr,flash-controller = &flash_controller; /* in zephyr/dts/arm/nordic/nrf52840.dtsi:12 */
zephyr,sram = &sram0; /* in zephyr/dts/vendor/nordic/nrf52840_partition.dtsi:9 */
zephyr,flash = &flash0; /* in zephyr/dts/vendor/nordic/nrf52840_partition.dtsi:10 */
zephyr,code-partition = &slot0_partition; /* in zephyr/dts/vendor/nordic/nrf52840_partition.dtsi:11 */
zephyr,console = &uart0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:18 */
zephyr,shell-uart = &uart0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:19 */
zephyr,uart-mcumgr = &uart0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:20 */
zephyr,bt-mon-uart = &uart0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:21 */
zephyr,bt-c2h-uart = &uart0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:22 */
zephyr,ieee802154 = &ieee802154; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:23 */
zephyr,boot-mode = &boot_mode0; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:24 */
};
zephyr,bt-hci: &bt_hci_controller를 사용(from. nrf52840.dtsi)zephyr,entropy: &rng를 사용(fromnrf52840.dtsi)entropy는 보안용 키, UUID, BLE 주소 등 난수(random number)가 필요한 곳에서 하드웨어 RNG를 통해 무작위 값을 얻기 위해 사용됨.zephyr,flash, zephyr,flash-controller: from nrf52840.dtsizephyr,sram: sram0 from nrf52840_partition.dtsizephyr,console: uart0 from nrf52840dk_nrf52840.dts.dts에서 정해짐zephyr,shell-uart: uart0 from nrf52840dk_nrf52840.dtsCONFIG_SHELL=y 필요.
zephyr,uart-mcumgr: uart0 from nrf52840dk_nrf52840.dtsCONFIG_MCUMGR_SMP_UART=y 필요.zephyr,bt-mon-uart: uart0 from nrf52840dk_nrf52840.dtsibtmon 같은 툴로 BLE 통신 내용 분석할 때 사용zephyr,ieee802154: &ieee802154 from nrf52840dk_nrf52840.dtsieee802154는 해당 무선 기능을 수행하는 SoC 내부 또는 외부 무선 소자를 정의하고, Zephyr가 이를 무선 스택에 바인딩할 수 있도록 설정하는 장치 노드임.compatible), 어떤 방식으로 연결됐는지 (reg, spi, irq) 등을 정의함.zephyr,boot-mode: &boot_mode0 from nrf52840dk_nrf52840.dtsboot_mode0가 무슨 장치를 의미한다기 보단, 실행 정책에 가까움./soc/아래의 구조nrf52840dk/nrf52840 의 on-chip supported feature가 존재함
/ 루트노드 아래의 구조/chosen: Zephyr의 커널이나 드라이버가 필수로 참조해야 하는 하드웨어 리소스나 설정 값을 Device Tree(DTS) 상에서 명시적으로 지정해주는 영역./aliases: 보드간 코드 재사용성을 높이기위해, 많은 타겟 보드가 공통으로 사용하는 구성요소들을 aliase로 접근할 수 있게 함.(디버깅용 LED / 스위치, mcuboot 등)/aliases {
led0 = &led_0;
sw0 = &button_0;
};
/soc: 타겟 보드의 on-chip feature에 해당하는 노드를 포함/pinctrl: 타겟 보드의 각 핀의 역할을 정의하기 위한 노드를 포함(spi0 miso/mosi pin은 PTB1/PTB2.. 등)/cpus: 해당 SoC의 core정보를 정의./clocks: 해당 SoC의 clock정보를 정의./leds, /pwmleds, /buttons: 생략arduino_header: 아두이노 보드처럼 생긴 핀 배열(헤더)를 제공한다는 의미. 하드웨어 핀 배열이 Arduino Uno와 호환된다는 뜻.model = "Nordic nRF52840 DK NRF52840": 사람(개발자)가 읽기 위한 보드의 설명.compatible = "nordic,nrf52840-dk-nrf52840": Zephyr가 내부적으로 드라이버 매칭 및 조건분기를 위해 기계가 읽는 식별자.