지난번에 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 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 |