Chapter 4. Devicetree의 status 속성

Hyunjin Lee·2025년 7월 28일

1. status속성의 역할

Devicetree의 모든 노드는 status속성을 가질 수 있으며, Zephyr는 이걸 바탕으로 해당 장치의 활성 여부를 판단함.

status 속성은 "okay", "disabled" 을 갖거나, 명시하지 않아도 됨.(명시하지 않을경우 "okay"라고 간주함.)

"reserved", "fail", "fail-sss"는 Zephyr에서는 사용되지 않는 값임(undefined behavior를 초래할 수 있음.)

2. status속성 통한 접근 제한

Zephyr에서는 status상태에 따라 컴파일타임 에러, DT 메크로 NULL처리, 조건부 컴파일 등을 지원함.

2.1 uart1을 비할성화 후, 코드에서 조건 분기

아래처럼 nrf52840dk_nrf52840.overlayuart1status"disabled"로 두면, 조건부 컴파일이 가능해지며, 빌드 시, 경고메시지를 출력할 수 있음.

// nrf52840dk_nrf52840.overlay
&uart1 {
	status = "disabled";
};
// samples/basic/blinky/src/main.c
#if DT_NODE_HAS_STATUS(UART1_NODE, okay)
	#warning "UART1 is enabled"
#else
	#warning "UART1 is disabled"
#endif
❯ nrfbuild samples/basic/blinky -p  
[18/174] Building C object CMakeFiles/app.dir/src/main.c.obj
blinky/src/main.c:21:10: warning: #warning "UART1 is disabled" [-Wcpp]
   21 |         #warning "UART1 is disabled"
      |          ^~~~~~~
[174/174] Linking C executable zephyr/zephyr.elf
Memory region         Used Size  Region Size  %age Used
           FLASH:       46992 B         1 MB      4.48%
             RAM:        8576 B       256 KB      3.27%
        IDT_LIST:          0 GB        32 KB      0.00%

2.2 led0를 비활성화 후, blink동작 보기

// nrf52840dk_nrf52840.overlay
&led0 {
	status = "disabled";
};

led0disabled된것을 확인.

	leds {
		compatible = "gpio-leds"; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:28 */

		/* node '/leds/led_0' defined in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:30 */
		led0: led_0 {
			gpios = < &gpio0 0xd 0x1 >; /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:31 */
			label = "Green LED 0";      /* in zephyr/boards/nordic/nrf52840dk/nrf52840dk_nrf52840.dts:32 */
			status = "disabled";        /* in zephyr/samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay:5 */
		};

하지만, 실제 보드에서는 LED가 여전히 깜빡거리고 있음.

다시, main()을 살펴보면,

#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{
	int ret;
	bool led_state = true;

	if (!gpio_is_ready_dt(&led)) {
		return 0;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return 0;
	}

	while (1) {
		ret = gpio_pin_toggle_dt(&led);
		if (ret < 0) {
			return 0;
		}

		led_state = !led_state;
		printf("LED state: %s\n", led_state ? "ON" : "OFF");
		k_msleep(SLEEP_TIME_MS);
	}
	return 0;
}
  • line 2: ledled0노드의 gpio spec임.
  • line 9: gpio_is_ready_dtled0를 검사하고 있는듯 보이나, ledled0gpio spec일 뿐이라, gpio에 문제가 없다면, 해당 if문에서는 문제를 발견할 수 없음.

led0노드는 LED 자체가 아니라, GPIO를 통해 제어되는 논리 노드이기 때문에, status = "disabled"라도, 내부 GPIO가 okay면 통과함.

따라서 led0가 사용 가능한지 판단하려면, DT_NODE_HAS_STATUS를 통해 해당 노드의 status에 따라서 분기해주는 방법이 가장 확실함.

if(!DT_NODE_HAS_STATUS(LED0_NODE, okay)) {
	while(1){
		printf("led0 is disabled\n");
		k_msleep(1000);
	}
}
  • main()에 위와같이, LED0_NODEokay를 검사하여 loop에 빠지게하면, 아래와 같이, led0의 status를 체크하여, 분기할 수 있음.

결론

status는 각 노드별로 가질 수 있으나, status"disabled"라고 해서 반드시 사용을 못하는건 아님.
개발자가 참고할 수 있는 수준의 속성이라고 생각하는것이 더 적합하며, status를 검사해서 해당 디바이스를 사용하지 않거나, 조건을 분기하는 등으로 활용할 수 있음.

status역시 .overlay파일을 수정해서, 원래 보드의 .dts, .dtsi파일을 건드리지 않고 오버라이드 하여 설정하는것을 권장함.

profile
real-time system과 physical AI에 관심이 많습니다.

0개의 댓글