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

status 속성은 "okay", "disabled" 을 갖거나, 명시하지 않아도 됨.(명시하지 않을경우 "okay"라고 간주함.)
"reserved", "fail", "fail-sss"는 Zephyr에서는 사용되지 않는 값임(undefined behavior를 초래할 수 있음.)
status속성 통한 접근 제한Zephyr에서는 status상태에 따라 컴파일타임 에러, DT 메크로 NULL처리, 조건부 컴파일 등을 지원함.
uart1을 비할성화 후, 코드에서 조건 분기아래처럼 nrf52840dk_nrf52840.overlay에 uart1의 status를 "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%
led0를 비활성화 후, blink동작 보기// nrf52840dk_nrf52840.overlay
&led0 {
status = "disabled";
};
led0가 disabled된것을 확인.
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;
}
led는led0노드의 gpio spec임.gpio_is_ready_dt로 led0를 검사하고 있는듯 보이나, led는 led0의 gpio 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_NODE의 okay를 검사하여 loop에 빠지게하면, 아래와 같이, led0의 status를 체크하여, 분기할 수 있음.
status는 각 노드별로 가질 수 있으나, status가 "disabled"라고 해서 반드시 사용을 못하는건 아님.
개발자가 참고할 수 있는 수준의 속성이라고 생각하는것이 더 적합하며, status를 검사해서 해당 디바이스를 사용하지 않거나, 조건을 분기하는 등으로 활용할 수 있음.
status역시 .overlay파일을 수정해서, 원래 보드의 .dts, .dtsi파일을 건드리지 않고 오버라이드 하여 설정하는것을 권장함.