Linux/yocto

고급 개발 기법: 커널 커스터마이징 및 Device Tree 수정

임베디드 친구 2025. 5. 22. 20:55
728x90
반응형

고급 개발 기법: 커널 커스터마이징 및 Device Tree 수정

1. 개요

이 포스팅에서는 Yocto 기반의 RK3399 보드에서 커널을 커스터마이징하고 Device Tree를 수정하는 방법을 설명합니다. 커널 커스터마이징은 특정 하드웨어 기능을 활성화하거나 불필요한 기능을 제거하는 과정이며, Device Tree 수정은 보드에 연결된 하드웨어 정보를 커널에 전달하는 역할을 합니다.

RK3399 보드를 기준으로 Yocto 환경에서 직접 커널 설정을 변경하고, Device Tree를 수정하는 과정까지 상세히 설명하겠습니다.


2. Yocto에서 커널 커스터마이징

Yocto 환경에서 커널을 커스터마이징하는 과정은 다음과 같이 진행됩니다.

2.1 커널 레시피 위치 확인

먼저, RK3399 보드용 커널 레시피가 위치한 경로를 확인해야 합니다. 보통 Yocto의 meta 레이어에 커널 레시피가 존재합니다.

$ cd ~/yocto/poky
$ find ./ -name "linux-rockchip.bb"

위 명령어를 통해 linux-rockchip.bb 파일을 찾을 수 있습니다. 이 파일은 RK3399 보드에 적합한 커널 빌드를 정의하는 레시피입니다.

2.2 커널 설정 수정

Yocto에서 커널 설정을 수정하려면, 다음과 같이 bitbake -c menuconfig 명령어를 사용하면 됩니다.

$ bitbake -c menuconfig virtual/kernel

이 명령어를 실행하면 다음과 같이 커널 설정 메뉴가 나타납니다.

2.2.1 주요 커널 설정 항목

  • Device Drivers: 하드웨어 드라이버를 선택하는 항목입니다. 특정 하드웨어를 사용하려면 해당 드라이버를 활성화해야 합니다.
  • Networking support: 네트워크 기능을 설정하는 항목입니다.
  • File systems: 파일 시스템을 설정하는 항목입니다.

예를 들어, SPI 드라이버를 활성화하려면 다음과 같이 설정합니다.

  1. Device DriversSPI support로 이동합니다.
  2. Rockchip SPI Controller 항목을 선택하고, M 또는 Y를 설정합니다.

설정을 완료한 후, 저장하고 종료합니다.

2.3 커널 설정 저장 및 적용

menuconfig에서 변경한 설정은 .config 파일로 저장됩니다. 이를 Yocto 빌드에 반영하려면 다음과 같이 defconfig를 생성해야 합니다.

$ bitbake -c savedefconfig virtual/kernel

이 과정에서 생성된 defconfig 파일은 커널 레시피의 files 디렉터리에 복사하여 유지 관리하는 것이 좋습니다.


3. Device Tree 수정과 하드웨어 지원

Device Tree는 하드웨어를 추상화하여 커널에 전달하는 역할을 합니다. RK3399 보드의 Device Tree 파일은 보통 다음 경로에 위치합니다.

~/yocto/build/tmp/work-shared/rk3399/kernel-source/arch/arm64/boot/dts/rockchip/

3.1 Device Tree 파일 수정

예를 들어, UART1을 활성화하려면 rk3399.dtsi 파일을 다음과 같이 수정하면 됩니다.

&uart1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart1m0_xfer>;
};

여기서 status = "okay";는 해당 하드웨어를 활성화하는 의미입니다.

3.2 새로운 하드웨어 추가 예제

GPIO 핀을 이용한 LED를 제어하는 예제를 작성해보겠습니다. rk3399.dtsi 파일에 다음과 같이 추가합니다.

leds {
    compatible = "gpio-leds";
    led0 {
        label = "green_led";
        gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
        default-state = "off";
    };
};
  • gpios 항목에서 &gpio0은 GPIO 컨트롤러를 의미하고, 10은 GPIO 핀 번호를 의미합니다.
  • GPIO_ACTIVE_HIGH는 신호가 High일 때 LED가 켜지는 것을 의미합니다.

3.3 Device Tree 컴파일

수정된 Device Tree를 반영하려면 다음과 같이 컴파일해야 합니다.

$ bitbake -c devshell virtual/kernel
$ make dtbs

생성된 DTB 파일은 다음 경로에서 확인할 수 있습니다.

~/yocto/build/tmp/work-shared/rk3399/kernel-source/arch/arm64/boot/dts/rockchip/rk3399.dtb

생성된 rk3399.dtb 파일을 부팅 이미지에 포함하도록 설정합니다.


4. 커널과 Device Tree 빌드 및 배포

변경 사항을 Yocto 빌드에 반영하려면 전체 이미지를 다시 빌드해야 합니다.

$ bitbake core-image-minimal

빌드가 완료된 후, 이미지를 RK3399 보드에 플래시하면 변경된 커널과 Device Tree가 반영됩니다.


5. 동작 확인

보드에서 부팅한 후, 커널 로그와 하드웨어 상태를 확인합니다.

$ dmesg | grep uart
$ dmesg | grep gpio

또한, 활성화된 장치를 확인하려면 다음과 같이 명령어를 실행합니다.

$ ls /dev/ttyS*

만약 UART1이 활성화되었다면 /dev/ttyS1 디바이스가 생성됩니다.


6. 마무리

이번 포스팅에서는 Yocto 환경에서 RK3399 보드를 대상으로 커널을 커스터마이징하고 Device Tree를 수정하는 방법을 살펴보았습니다. 이러한 과정은 보드에 새로운 하드웨어를 연결하거나 불필요한 기능을 제거할 때 필수적입니다.

반응형