본문 바로가기

개발일지

Jetson 에서 Yocto Linux 탑재하기 [2]

지난번에 meta-tegra를 이용한 기초 빌드가 완료되었다.

 

이번엔 기초 빌드 이후 kernel 단 수정이나, pinmux 변경 등 커스터마이징에 대해서 작성하겠다.

빌드가 완료되면 /yocto/poky/build/tmp 해당 경로에 빌드가 완료된 패키지나 소스코드를 확인할 수 있다.

 

나같은 경우는 하기의 경로에서 kerner source 를 수정하였다.

/yocto/poky/build/tmp/work-shared/jetson-agx-xavier-industrial/kernel-source/nvidia

해당 경로는 bitbake를 이용하여 쉽게 찾을 수도있다.

$ bitbake -c devshell virtual/kernel

 

Device Tree 수정

agx-xavier-industrial 의 경우 t19x 플랫폼에서 수정하면된다.

최종적으로 /yocto/poky/build/tmp/work-shared/jetson-agx-xavier-industrial/kernel-source/nvidia/platform/t19x/ 의 경로 밑에 dtsi를 수정하면 디바이스 트리를 수정할 수 있다.

 

아래는 tegra194-p2888-0001-p2822-0000-common.dtsi 의 내용중 일부이며, spi 노드를 설정하는 부분이다.

	spi@c260000 {
		status = "disabled";
	};

	spi@3210000 {
		status = "okay";
		spi@0 {
			compatible = "tegra-spidev";
			reg = <0x0>;
			spi-max-frequency = <33000000>;
			controller-data {
				nvidia,enable-hw-based-cs;
				nvidia,rx-clk-tap-delay = <0x11>;
			};
		};
		spi@1 {
			compatible = "tegra-spidev";
			reg = <0x1>;
			spi-max-frequency = <33000000>;
			controller-data {
				nvidia,enable-hw-based-cs;
				nvidia,rx-clk-tap-delay = <0x11>;
			};
		};
	};

tegra194-p2888-0001-p2822-0000-common

 

Driver 수정

/yocto/poky/build/tmp/work-shared/jetson-agx-xavier-industrial/kernel-source/nvidia/driver

드라이버의 경우 해당 경로에서 자신이 수정하고자 하는 드라이버를 수정해야한다.

다만, 타겟 보드에서 어떤 드라이버를 사용하는지 알려면 디바이스 트리를 활용하여 compatible 을 참조하자.

 

Kernel Config

커널에 사전 정의되어 있는 기능이나 드라이버 들이 모두 활성화 되어있지는 않다.

그렇게 된다면 이미지의 용량이 매우 커질테고 HW 자원이 한정된 환경에서는 설치조차 안될 수 있기 때문이다.

따라서 이렇게 활성화 / 비활성화 되어있는 모듈들을 내 입맛에 맞게 포함 시킬 수 있는것이 Kernel Config 이다.

Yocto 에서는 하기 명령어로 Kernel Config 옵션을 열 수 있다.

$ bitbake -c menuconfig virtual/kernel

 

그럼 하기와 같은 창이 나타는데 여기서 내가 원하는 모듈을 커널에 포함시킬 수 있다.

[ * ]  : y 로 설정하며 해당 기능을 커널에 빌트인으로 포함

[m] : m 으로 설정하며 커널 실행 중 동적으로 로드하거나, 언로드할 수 있도록 설정

 

설정이 완료되면 <Save> 를 눌러서 저장하고, Exit 로 설정을 종료한다.

 

Kernel Source Compile and Build

Device Tree, Driver, Kernel Config 등을 수정했다해도 바로 적용되지않는다.

수정한 코드를 적용시키기위하여 커널소스를 컴파일하고 빌드하여 이미지에 추가해야 한다.

$ bitbake -c compile -f virtual/kernel 
$ bitbake virtual/kernel

컴파일 후에 커널을 빌드하는 명령어를 bitbake를 통해 진행하면 커널빌드가 완료되었다.

이 과정도 약 10분의 시간이 소요된다.

 

커널 빌드가 완료되었다면, 이미지에 추가해야한다.

다시한번 전체 이미지 빌드를 수행하자.

$ bitbake core-image-weston

 

Yocto Patch

디바이스트리 및 드라이버를 /build 경로 내에서 수정하고 커널 컴파일 및 빌드를 통해 변경된 이미지를 플래시하여 확인해본다면 변경사항이 적용되었을 것이다.

Yocto 빌드 도구의 경우 빌드 최적화를 위해 빌드 캐시를 활용하게되는데 이전에 빌드했던 소스나 패키지에 대해서 다시한번 빌드하지 않고 기존 결과물을 재사용한다.

이 캐시파일은 build/sstate-cache 경로에 존재하며 bitbake는 사용자가 수정한 소스가 적용된 커널을 적용하여 이미지를 구성하게 된다.

 

따라서 이렇게 이미지를 구성해서 사용해도 무방하지만 행여 캐시경로가 지워졌다거나 전체 소스에대해서 다시 재빌드할경우 수정사항이 다시 초기화 될 수 있다.

 

캐시가 전부 지워진 상태에서 다시 재 빌드 하더라도 변경사항을 적용할 수 있게 Yocto 레시피에 패치파일을 적용해주면 수정사항이 패치된 소스파일로 빌드될 것이다.

 

Example)

위에 "Device Tree 수정" 에서 예로 들었던 tegra194-p2888-0001-p2822-0000-common.dtsi 파일에서 spi-max-frequency 를 40Mhz 로 수정한다고 예를 들어보겠다.

커널 소스 디렉토리는 Yocto 가 git 으로 관리하고 있는관계로 해당 파일에서 값을 수정하면 git으로 확인할 수 있다.

 

디바이스 트리 수정 후 $git satus 수행

 

git diff 명령어로 세부 변경사항도 확인할 수 있다.

이제 이 변경사항을 패치파일로 만들어보자.

$ git diff > spi_max_frequency_patch.patch

 

다음과 같이 패치파일이 만들어졌다.

diff --git a/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-p2888-0001-p2822-0000-common.dtsi b/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-p2888-0001-p2822-0000-common.dtsi
index 5d2d33ae1463..a34281f06f19 100644
--- a/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-p2888-0001-p2822-0000-common.dtsi
+++ b/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-p2888-0001-p2822-0000-common.dtsi
@@ -89,7 +89,7 @@ spi@3210000 {
 		spi@0 {
 			compatible = "tegra-spidev";
 			reg = <0x0>;
-			spi-max-frequency = <33000000>;
+			spi-max-frequency = <40000000>;
 			controller-data {
 				nvidia,enable-hw-based-cs;
 				nvidia,rx-clk-tap-delay = <0x11>;

 

해당 패치파일을 /meta-tegra/recipes-kernel/linux/linux-tegra-5.10 으로 옮기고 레시피 파일(linux-tegra_5.10.bb)을 수정해 준다.

SRC_URI = "git://${KERNEL_REPO};name=machine;branch=${KBRANCH} \
           ${@'file://localversion_auto.cfg' if d.getVar('SCMVERSION') == 'y' else ''} \
           ${@'file://disable-fw-user-helper.cfg' if d.getVar('KERNEL_DISABLE_FW_USER_HELPER') == 'y' else ''} \
           ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'file://systemd.cfg', '', d)} \
	   file://spiflash.cfg \
	   file://disable-module-signing.cfg \
	   file://files/spi_max_frequency_patch.patch \

 

이렇게 패치파일을 레시피에 적용해두면 bitbake는 레시피에 작성된 것처럼 해당 소스를 git에서 다운받아 컴파일하고 이후 do_patch 단계에서 패치파일을 적용한다.

따라서, 전체 코드를 재빌드 하더라도 패치가 적용되어있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

'개발일지' 카테고리의 다른 글

Jetson 에서 Yocto Linux 탑재하기  (0) 2024.10.24
Jetson 에서 I2C 통신 하기  (0) 2024.10.08
Jetson과 NVRAM 간의 SPI 통신 [2]  (0) 2024.10.07
Jetson과 NVRAM 간의 SPI 통신 [1]  (1) 2024.10.07
YOCTO Project 란 ?  (4) 2024.09.26