[ BBB - yocto (10) ] 오버레이
0) 참고하면 좋은 자료
https://www.digi.com/resources/examples-guides/use-device-tree-overlays-to-patch-your-device-tree
참고로 오버레이 지원여부는 확인해봐야 한다. 본인의 보드가 오버레이를 지원하지 않을 수도 있다.
imx6 emmc가 있는 계열은 오버레이를 사용할 수 없는 것으로 알고 있다.
챕터 9에서 설정한 uart1의 멀티플랙싱 설정, uart1 노드 속성 설정 부분을 지워두길 바란다.
1) 디바이스 트리 오버레이란?
디바이스 트리를 수정하지 않고, 오버레이를 작성하여 사용할 핀 속성을 수정해 사용할 수 있다.
오버레이 전용 문법이 따로 존재한다.
2) 디바이스 트리 오버레이 문법
오버레이 문법은 다음과 같다
1. 상위 부분 /dts-v1/;
마찬가지로 디바이스 트리 버전을 지정한다.
2. /plugin/;
컴파일 할 때 오버레이라는 것을 컴파일러가 알아챌 수 있게 하기 위해 사용한다.
3. 노드 선언
-[fragment 고정]@[fragment 번호]
4. fragment 속성
-target : 상대 참조할 타겟 라벨 지정
-target-path : 절대 참조할 타겟 경로 지정
5. fragment 자식 노드 __overlay__
-ovelay 노드에는 타겟 라벨로 상대 참조한 노드의 속성이 들어간다.
예를들어
/dts-v1/; /plugin/;
/{
	fragment@0 {
		target = <&node_label>;
		__overlay__{
			node-attr-1;
			child_node@0 {
                            child_node_attr;
                        };
		};
	};
};node_label을 타겟으로 지정하여 상대 참조한다.
그러면 타겟으로 지정한 노드의 속성을 수정해 줄 수 있는데 노드 속성을 지정하거나(node-attr-1) 자식 노드(child_node)를 설정할 수 있다.
노드 속성을 추가로 설정하고 싶다면,
/dts-v1/; /plugin/;
/{
	fragment@0 {
		target = <&node1_label>;
		__overlay__{
			node-attr-1;
			sub_node@0 {
                            sub_node_attr;
                        };
		};
	};
	fragment@1 {
		target = <&node2_label>;
		__overlay__{
			node-attr-2;
		};
	};
};
fragment를 그대로 적고 fragment 번호를 1 늘려서 적어주면 된다.
참고로 /{ 부분은 루트 노드를 뜻하며, 오버레이를 컴파일하려면 루트 노드를 선언해주어야 한다.
루트 노드가 존재하지 않으면 오버레이를 컴파일 할 수 없어 오류가 발생한다.
3) uart1을 활성화하는 오버레이 작성하기
오버레이 작성을 위해 dts 폴더로 이동하자
$ cd poky경로/ $ source oe-init-build-env $ cd ./tmp/work-shared/beaglebone/kernel-source/arch/arm/boot/dts $ code .
이동 후 아래 파일을 작성하고 BB-USER_DEVICE_TREE.dtso로 저장하자
참고로 마지막에 dtso 확장자는 디바이스 트리 오버레이 확장자이다.
/dts-v1/; /plugin/;//BB-USER_DEVICE_TREE.dtso#include <dt-bindings/pinctrl/am33xx.h> /{ fragment@0 { target = <&am33xx_pinmux>; __overlay__{ uart1_pins: uart1-pins { pinctrl-single,pins = < AM33XX_PADCONF(AM335X_PIN_UART1_RXD, PIN_INPUT, MUX_MODE0) AM33XX_PADCONF(AM335X_PIN_UART1_TXD, PIN_OUTPUT, MUX_MODE0) >; }; }; }; fragment@1{ target = <&uart1>; __overlay__{ pinctrl-names = "default"; pinctrl-0 = <&uart1_pins>; status = "okay"; }; }; };
인클루드 한 이유는 omap.h의 매크로 AM33XX_PADCONF와 AM335X_PIN_이하 상수들을 사용하기 위함이다.
dts에서와 마찬가지로 속성을 지정하여 주면 된다.
4) 디바이스 트리 오버레이 빌드하기
dts 폴더에서 다음을 실행한다.
$ code Makefile
dtb-$(CONFIG_SOC_이름) 이 있는데 여기서 비글본의 코어 AM33XX를 검색하자.
우리가 만든 오버레이가 빌드되게 하려면 저기에 오버레이를 추가해주어야 한다.
#Makefile 맨 아래에 추가하기, 추가로 dtbo가 확장자임 dtb-$(CONFIG_SOC_AM33XX) += BB-USER_DEVICE_TREE.dtbo
local.conf에 추가로 설정해 주어야 한다.
$ cd poky디렉토리/build/conf/ $ code .
이후 local.conf를 열자
KERNEL_DEVICETREE:append = " BB-USER_DEVICE_TREE.dtbo"마찬가지로 확장자를 dtbo로 지정하여 커널 디바이스 트리에 오버레이 파일을 추가한다
이후 다음 명령을 실행한다.
$ bitbake -c compile -f virtual/kernel $ bitbake -c deploy -f virtual/kernel
이러면 deploy-ti 폴더에 BB-USER_DEVICE_TREE.dtbo 파일이 보일 것이다.
5) 디바이스 트리 오버레이 uboot 적용
uboot에서 이제 디바이스 트리를 로드하여 사용하도록 설정해주어야 한다.
로드 하는 방법은 fatload를 쓰면 된다.
디바이스 트리를 적용하는데는 3개의 명령어를 사용한다.
1. fdt addr
디바이스 트리의 주소를 uboot에 설정한다.
2. fdt resize
디바이스 트리의 남은 메모리 공간을 추가로 할당하여, 오버레이가 들어갈 공간을 마련한다.
3. fdt apply
디바이스 트리 오버레이 주소를 uboot에 설정한다. 이러면 오버레이와 디바이스 트리가 병합된다.
실제로 로드 부팅해보자.
=> bootcmd=fatload mmc 0:1 0x80000000 zImage => fatload mmc 0:1 0x82000000 am335x-boneblack.dtb => fatload mmc 0:1 0x83000000 BB-USER_DEVICE_TREE.dtbo => fdt addr 0x82000000 => fdt resize 8196 => fdt apply 0x83000000
=> bootz 0x80000000 - 0x82000000
이를 bootcmd에 지정해 주면 된다(setenv bootcmd 사용)
사실 uboot에서는 uboot.env파일을 복사하지 않고도 bootcmd와 bootargs를 설정할 수 있다.
$ bitbake -c menuconfig virtual/bootloader
나오는 메뉴화면에서 bootcmd와 bootargs를 설정하면 된다.
boot options를 선택하자
boot 인자를 활성화하고 우리가 bootargs에 적었던 인자를 적어주면 된다.
Enable boot arguments 바로 아래의 빈 공간을 엔터를 쳐서 들어간다음
이렇게 기존과 똑같이 부팅 인자를 설정해주길 바란다.
그리고 밑의 옵션을 보면 Enable a default value for bootcmd가 있는데 마찬가지로 바로 아래의 기본 명령어가 적힌 공간에서 엔터를 누른다.
bootcmd를 우리가 원하는대로 지정하자.
bootcmd=fatload mmc 0:1 0x80000000 zImage; fatload mmc 0:1 0x82000000 am335x-boneblack.dtb; fatload mmc 0:1 0x83000000 BB-USER_DEVICE_TREE.dtbo;fdt addr 0x82000000;fdt resize 8196; fdt apply 0x83000000;bootz 0x80000000 - 0x82000000
이러고 부팅해서 uboot에서 printenv로 bootcmd와 bootargs를 찍어보면 uboot.env 파일이 없는데도 설정한 대로 되어있다.
6) 플래싱 하여 확인하기
deploy-ti로 이동한뒤 share폴더에 빌드 산출물들을 복사하자.
$ cd poky디렉토리/build/deploy-ti/images/beaglebone
$ cp zImage u-boot.img MLO core-image-fullcmdline-beaglebone.tar.xz am335x-boneblack.dtb BB-USER_DEVICE_TREE.dtbo ~/share
https://leejunggyun.blogspot.com/2025/02/sd.html
여기서 사용했던 sd_flashing.sh을 약간 수정할 것이다.
if [ $# -ne 1 ]; then echo $# arg number error echo arg1 can be disk character like a, b, c, d. exit -1 fi sudo umount /dev/sd$11 sudo umount /dev/sd$12 sudo ./partitioning.sh $1 sudo mkfs.vfat -F 32 /dev/sd$11 sudo mkfs.ext4 /dev/sd$12 sudo mount /dev/sd$11 /mnt rm -rf /mnt/* sudo cp ./MLO /mnt sudo cp ./u-boot.img /mnt sudo cp ./BB-USER_DEVICE_TREE.dtbo ./zImage ./am335x-boneblack.dtb /mnt sudo sync sudo umount /mnt sleep 2 sudo mount /dev/sd$12 /mnt rm -rf /mnt/* sudo tar -xvf core-* -C /mnt sudo sync sudo umount /mnt
uboot.env파일을 없애주길 바란다.
플래싱 된 비글본을 부팅하여 /proc/tty/driver/serial을 cat으로 찍어보면
uart1번이 활성화 되어있다.
댓글
댓글 쓰기