.overlay 파일을 통해 DTS 노드를 수정하거나 추가하는 방법을 이해blinky 예제를 수정하여 사용자 LED를 새로 등록해보기samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay를 생성 및 user_led 레이블에 user_led_1 노드를 추가함
(빌드시스템은 자동으로 blinky를 빌드할때 blinky/boards에서 사용할 .overlay를 찾음)
// samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay
/ {
user_leds {
compatible = "gpio-leds"; // 이 노드가 gpio-led 를 자식으로 가지는 컨테이너 노드라는 의미.
userled1: user_led_1 {
gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
label = "User LED";
};
};
};
이후 blinky예제를 빌드
west build samples/basic/blinky -b nrf52840dk/nrf52840 -p
build/zephyr.dts를 보면, user_led가 추가된것을 볼 수 있음.
user_leds {
compatible = "gpio-leds"; /* in zephyr/samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay:4 */
/* node '/user_leds/user_led_1' defined in zephyr/samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay:5 */
userled1: user_led_1 {
gpios = < &gpio0 0xe 0x1 >; /* in zephyr/samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay:6 */
label = "User LED"; /* in zephyr/samples/basic/blinky/boards/nrf52840dk_nrf52840.overlay:7 */
};
};
};
blinky/main.c에서 node label을 통해 USER_LED를 제어하는 제어코드를 작성하면, led1이 아닌 led2가 깜빡거림.
// Devicetree에서 alias led0를 통해 해당 노드를 찾음
#define LED0_NODE DT_ALIAS(led0)
// Devicetree에서 node label이 'userled1'인 노드를 찾음
#define USER_LED DT_NODELABEL(userled1)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
// 해당 노드의 'gpios' 속성 값을 기반으로 gpio_dt_spec 구조체 초기화
static const struct gpio_dt_spec user_led = GPIO_DT_SPEC_GET(USER_LED, gpios);
int main(void)
{
// user_led를 통해 led1을 제어
int ret;
bool led_state = true;
if (!gpio_is_ready_dt(&user_led)) {
return 0;
}
ret = gpio_pin_configure_dt(&user_led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return 0;
}
while (1) {
ret = gpio_pin_toggle_dt(&user_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;
}

.overlay로 기존 노드 override&led0노드를 override하고, gpios는 보드상의 LED3번인 < &gpio0 0xf 0x1 >로 설정.
/ {
user_leds {
compatible = "gpio-leds"; // this node is container node of gpio-led
userled1: user_led_1 { // gpio led node for
gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
label = "User LED";
};
};
};
&led0 {
gpios = < &gpio0 0xf 0x1>;
label = "overridden led";
};
blinky/src/main.c를 원복시키면 led0가 LED3을 켜도록 오버라이드 된것 볼 수 있음.
