Chapter 2. Overlay 파일과 Node Override 이해

Hyunjin Lee·2025년 7월 26일

목표

  • .overlay 파일을 통해 DTS 노드를 수정하거나 추가하는 방법을 이해
  • 기존 Device Tree 노드를 override하는 방식 익히기
  • 실제로 blinky 예제를 수정하여 사용자 LED를 새로 등록해보기

1. 추가 사용자 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;
}

2. .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을 켜도록 오버라이드 된것 볼 수 있음.

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

0개의 댓글