- poky
- branch: kirkstone
meta-raspberrypi
meta-raspberrypi conf
- meta-raspberrypi 설정
- git: https://github.com/agherzan/meta-raspberrypi.git
- 받아서 kirkstone으로 checkout

- poky/build/bblayers.conf에 추가

MACHINE
- meta-raspberrypi는 BSP 지원 레이어인지, layer/conf에 machine 디렉토리만 있음


- 여기서 raspberrypi4-64를 local.conf에 설정하자.

MACHINEOVERRIDES
MACHINE_FEATURES
raspberrypi4-64 특화 MACHINE_FEATURES는 vc4graphics가 있겠다.
MACHINE_FEATURESdescription
| acpi | HW가 ACPI(x86/x86_64에서만)를 갖고 있다. |
| alsa | HW가 ALSA 오디오 드라이버를 갖고 있다. |
| apm | HW가 APM(또는 APM emulation)을 갖고 있다. |
| bluetooth | HW가 통합된 블루투스를 갖고 있다. |
| efi | EFI로 부팅할 수 있게 지원한다. |
| ext2 | HW가 HDD 또는 마이크로 드라이브를 갖고 있다. |
| IRDA | HW가 IrDA를 지원한다. |
| keyboard | HW가 키보드를 갖고 있다. |
| pcbios | BIOS로 부팅 할 수 있게 지원한다. |
| pci | HW가 PCI 버스를 갖고 있다. |
| pcmcia | HW가 PCMCIA 또는 CompactFlash 소켓을 갖고 있다. |
| phone | 모바일 폰(음성)을 지원한다. |
| qvga | QVGA(320x240) 디스플레이를 지원한다. |
| rtc | 리얼타임 클록을 지원한다. |
| screen | HW가 화면을 갖고 있다. |
| serial | HW가 시리얼(일반적으로 RS232)를 지원한다. |
| touchscreen | HW가 터치스크린을 갖고있다. |
| usbgadget | HW가 USB 가젯 드라이버와 호환된다. |
| usbhost | HW가 USB 호스트와 호환된다. |
| vfat | FAT 파일 시스템을 지원한다. |
| wifi | HW가 통합된 와이파이를 갖고 있다. |
이미지배치
- wic도구는 Target 이미지 레이아웃을 정의하는데 도움을 준다.
- 템플릿 파일(wks)를 기반으로 파티션된 이미지를 생성할 수 있다.



IMAGE_FSTYPES에 wic를 추가하고, WKS_FILE 변수에 .wks 파일을 명시한다.
- 템플릿 파일(wks)를 기반으로 파티션된 이미지를 생성할 수 있다.
- 머신과 일치하는 레이아웃을 선택해야한다.
- sd-card에 쓰기 편하게 떨어지는 이미지를 만드려면, IMAGE_FSTYPES += "rpi-sdimg"를 사용한다.
use u-boot
- file: meta-raspberrypi/conf/machine/include/rpi-base.inc

- u-boot를 사용하려면, local.conf에
RPI_USE_U_BOOT = "1"
로 set할 것
- u-boot 설정시, UBOOT_MACHINE이 필요한데, meta-raspberrypi/conf/machine/raspberrypi4-64.conf에 명시되어 있다.

meta-raspberrypi/u-boot
- u-boot_%.bbappend

- files/fw_env.config

meta-raspberrypi/rpi-uboot-scr
- rpi-uboot-scr.bb

- boot.cmd.in

use UART
- local.conf에
ENABLE_UART = "1"
로 set할 것
WKS_FILE
- meta-raspberrypi/conf/machine/include/rpi-base.inc



IMAGE
rpi-test-image

core-image-base에서 packagegroup-rpi-test를 추가한 것
packagegroup-rpi-test

core-image-sato

$ bitbake core-image-sato
- 현재 local.conf에
- MACHINE = "raspberrypi4-64"
- DISTRO = "poky"

여기까지 Check
- Check
VariableDescription
| IMAGE_ROOTFS_EXTRA_SPACE | 0 |
| IMAGE_ROOTFS_SIZE | 65536 |
| INITRAMFS_MAXSIZE | 131072 |
| IMAGE_ROOTFS_ALIGNMENT | 4096 |
- raspberrypi4-64.conf

초간단 OTA
- wks 파일 아래처럼 변경

- local.conf
IMAGE_FSTYPES:append = " wic"
IMAGE_FEATURES:append = " debug-tweaks ssh-server-dropbear
IMAGE_INSTALL:append = " hello"
$ bitbake rpi-test-image
- rpi 부팅 시퀀스
- 첫 부팅 시, /boot 파티션에 uboot.env 파일이 없다.
- ${DEPLOY_DIR_IMAGE}/u-boot-initial-env 스크립트가 먼저 돌고, cmdline.txt의 커널 커맨드가 저장된 후, uboot.env를 생성하고, 다시
1)fdt addr ${fdt_addr} && fdt getvalue bootargs /chosen bootargs 로 커널 커맨드를 읽고,
2)fatload mmc 0:1 ${kernel_addr_r} Image로 커널이미지 로드
3)if test ! -e mmc 0:1 uboot.env; then saveenv; fi;
4)booti ${kernel_addr_r} - ${fdt_addr}로 부트 - 즉, 커널 커맨드를 조작(rootfs 지정)하려면 1)uboot.env를 먼저 제거 후, 2)cmdline.txt에서 rootfs관련 커맨드 설정하고, 3)reboot 하면 적용된다.
- scp 로 rootfs 이미지를 전송한다.
$ scp rpi-test-image-raspberrypi4-64.rootfs.ext3 root@<pi_ip>:/tmp
- pi에 접속한다.
root $ cd /tmp
root $ dd if=./rpi-test-image-raspberrypi4-64.rootfs.ext3 of=/dev/mmcblk0p3 && sync
root $ rm /boot/uboot.env
root $ vi /boot/cmdline.txt
# ====== /boot/cmdline.txt ====== #
dwc_otg.lpm_enable=0 console=serial0,115200 root=/dev/mmcblk0p3 rootfstype=ext4 rootwait
# === 저장 후 종료 === #
root $ reboot
--> /dev/mmcblk0p3 로 rootfs로 되어 부팅된다.
IMAGE 관련 변수
dhyang-host at ~/workspace/poky/build/tmp ±(kirkstone) ✗ ❯ bitbake rpi-test-image -e | grep "^IMAGE"
IMAGE_BASENAME="rpi-test-image"
IMAGE_BOOT_FILES="bootfiles/* bcm2711-rpi-4-b.dtb bcm2711-rpi-400.dtb bcm2711-rpi-cm4.dtb overlay_map.dtb;overlays/overlay_map.dtb at86rf233.dtbo;overlays/at86rf233.dtbo disable-bt.dtbo;overlays/disable-bt.dtbo dwc2.dtbo;overlays/dwc2.dtbo gpio-ir.dtbo;overlays/gpio-ir.dtbo gpio-ir-tx.dtbo;overlays/gpio-ir-tx.dtbo gpio-key.dtbo;overlays/gpio-key.dtbo gpio-poweroff.dtbo;overlays/gpio-poweroff.dtbo gpio-shutdown.dtbo;overlays/gpio-shutdown.dtbo hifiberry-amp.dtbo;overlays/hifiberry-amp.dtbo hifiberry-dac.dtbo;overlays/hifiberry-dac.dtbo hifiberry-dacplus.dtbo;overlays/hifiberry-dacplus.dtbo hifiberry-digi.dtbo;overlays/hifiberry-digi.dtbo justboom-both.dtbo;overlays/justboom-both.dtbo justboom-dac.dtbo;overlays/justboom-dac.dtbo justboom-digi.dtbo;overlays/justboom-digi.dtbo i2c-gpio.dtbo;overlays/i2c-gpio.dtbo i2c-rtc.dtbo;overlays/i2c-rtc.dtbo imx219.dtbo;overlays/imx219.dtbo imx477.dtbo;overlays/imx477.dtbo iqaudio-dac.dtbo;overlays/iqaudio-dac.dtbo iqaudio-dacplus.dtbo;overlays/iqaudio-dacplus.dtbo mcp2515-can0.dtbo;overlays/mcp2515-can0.dtbo mcp2515-can1.dtbo;overlays/mcp2515-can1.dtbo mcp3008.dtbo;overlays/mcp3008.dtbo miniuart-bt.dtbo;overlays/miniuart-bt.dtbo pitft22.dtbo;overlays/pitft22.dtbo pitft28-capacitive.dtbo;overlays/pitft28-capacitive.dtbo pitft28-resistive.dtbo;overlays/pitft28-resistive.dtbo pitft35-resistive.dtbo;overlays/pitft35-resistive.dtbo pps-gpio.dtbo;overlays/pps-gpio.dtbo rpi-ft5406.dtbo;overlays/rpi-ft5406.dtbo rpi-poe.dtbo;overlays/rpi-poe.dtbo vc4-fkms-v3d.dtbo;overlays/vc4-fkms-v3d.dtbo vc4-fkms-v3d-pi4.dtbo;overlays/vc4-fkms-v3d-pi4.dtbo vc4-kms-v3d.dtbo;overlays/vc4-kms-v3d.dtbo vc4-kms-v3d-pi4.dtbo;overlays/vc4-kms-v3d-pi4.dtbo vc4-kms-dsi-7inch.dtbo;overlays/vc4-kms-dsi-7inch.dtbo w1-gpio.dtbo;overlays/w1-gpio.dtbo w1-gpio-pullup.dtbo;overlays/w1-gpio-pullup.dtbo wm8960-soundcard.dtbo;overlays/wm8960-soundcard.dtbo Image u-boot.bin;kernel8.img boot.scr "
IMAGE_CLASSES=" sdcard_image-rpi license_image"
IMAGE_CMD:cramfs="mkfs.cramfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.cramfs "
IMAGE_CMD:erofs="mkfs.erofs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.erofs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs"
IMAGE_CMD:erofs-lz4="mkfs.erofs -zlz4 /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.erofs-lz4 /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs"
IMAGE_CMD:erofs-lz4hc="mkfs.erofs -zlz4hc /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.erofs-lz4hc /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs"
IMAGE_CMD:ext2="oe_mkext234fs ext2 "
IMAGE_CMD:ext3="oe_mkext234fs ext3 "
IMAGE_CMD:ext4="oe_mkext234fs ext4 "
IMAGE_CMD:jffs2="mkfs.jffs2 --root=/home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs --faketime --output=/home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.jffs2 "
IMAGE_CMD:squashfs="mksquashfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.squashfs -noappend"
IMAGE_CMD:squashfs-lz4="mksquashfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.squashfs-lz4 -noappend -comp lz4"
IMAGE_CMD:squashfs-lzo="mksquashfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.squashfs-lzo -noappend -comp lzo"
IMAGE_CMD:squashfs-xz="mksquashfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.squashfs-xz -noappend -comp xz"
IMAGE_CMD:squashfs-zst="mksquashfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.squashfs-zst -noappend -comp zstd"
IMAGE_CMD:tar="tar --sort=name --format=posix --numeric-owner -cf /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.tar -C /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs . || [ \$? -eq 1 ]"
IMAGE_CMD:ubifs="mkfs.ubifs -r /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs -o /home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.ubifs \${MKUBIFS_ARGS}"
IMAGE_CMD:wic=" out=\"/home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614\" \
IMAGE_CMD_TAR="tar"
IMAGE_FEATURES="debug-tweaks splash"
IMAGE_FEATURES_CONFLICTS_overlayfs-etc="package-management"
IMAGE_FEATURES_REPLACES_ssh-server-openssh="ssh-server-dropbear"
IMAGE_FSTYPES=" wic"
IMAGE_FSTYPES_DEBUGFS="tar.gz"
IMAGE_GEN_DEBUGFS="0"
IMAGE_INSTALL=" packagegroup-core-boot packagegroup-base-extended packagegroup-rpi-test"
IMAGE_INSTALL_COMPLEMENTARY=""
IMAGE_INSTALL_DEBUGFS=""
IMAGE_LINGUAS="en-us en-gb"
IMAGE_LINK_NAME="rpi-test-image-raspberrypi4-64"
IMAGE_LOCALES_ARCHIVE="1"
IMAGE_MANIFEST="/home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/deploy-rpi-test-image-image-complete/rpi-test-image-raspberrypi4-64-20230116055614.rootfs.manifest"
IMAGE_NAME="rpi-test-image-raspberrypi4-64-20230116055614"
IMAGE_NAME_SUFFIX=".rootfs"
IMAGE_OVERHEAD_FACTOR="1.3"
IMAGE_PKGTYPE="ipk"
IMAGE_POSTPROCESS_COMMAND=""
IMAGE_QA_COMMANDS=" license_qa_dead_symlink"
IMAGE_ROOTFS="/home/dhyang/workspace/poky/build/tmp/work/raspberrypi4_64-poky-linux/rpi-test-image/1.0-r0/rootfs"
IMAGE_ROOTFS_ALIGNMENT="4096"
IMAGE_ROOTFS_EXTRA_SPACE="0"
IMAGE_ROOTFS_SIZE="65536"
IMAGE_TYPEDEP:rpi-sdimg="ext3"
IMAGE_TYPEDEP:ubi="ubifs"
IMAGE_TYPES=" jffs2 jffs2.sum cramfs ext2 ext2.gz ext2.bz2 ext2.lzma ext3 ext3.gz ext4 ext4.gz btrfs squashfs squashfs-xz squashfs-lzo squashfs-lz4 squashfs-zst ubi ubifs multiubi tar tar.gz tar.bz2 tar.xz tar.lz4 tar.zst cpio cpio.gz cpio.xz cpio.lzma cpio.lz4 cpio.zst wic wic.gz wic.bz2 wic.lzma wic.zst container f2fs erofs erofs-lz4 erofs-lz4hc "
IMAGE_TYPES_MASKED=""
IMAGE_VERSION_SUFFIX="-20230116055614"
IMAGE_CMD:btrfs() {
IMAGE_CMD:cpio() {
IMAGE_CMD:f2fs() {
IMAGE_CMD:multiubi() {
IMAGE_CMD:ubi() {
IMAGE_PREPROCESS_COMMAND() {
gstreamer
- openembedded-core/meta에서 제공하는 gstreamer

- gstreamer1.0_1.20.4.bb
- gstreamer1.0-plugins-base_1.20.4.bb : 커뮤니티에서 충분히 지원받는 플러그인의 기본 집합
- gstreamer1.0-plugins-good_1.20.4.bb : 커뮤니티에 지원을 받고 라이선스 문제도 없는 플러그인
- gstreamer1.0-plugins-bad_1.20.4.bb : 테스트가 제대로 되지 않은 플러그인
- gstreamer1.0-plugins-ugly_1.20.4.bb : 잘 지원되지만 대부분 리버스 엔지니어링 된 것. 배포시 신중해야한다.
- ugly 플러그인을 사용하려면, LICENSE_FLAGS_WHITELIST = "commercial"이 추가되어야한다.
- gstreamer1.0-meta-base.bb
- gstreamer1.0-plugins-packaging.inc
- 위에 packagegroup-core-x11-sato.bb를 보면, GSTEXAMPLES = "gst-examples"가 주어져있는데, core-image-sato를 MACHINE = "raspberrypi4-64"로 넣고 빌드해서 이미지를 올려보자.
- gst-examples

$ gtk-play
$ gst-inspect1.0
- gstreamer의 툴로, 인자 없이 사용하면 이 툴은 코덱, 소스 엘리먼트, 싱크 엘리먼트 등 모든 이용가능한 플러그인을 보여준다.
- 예를들어 특정 엘리먼트의 기능과 인자가 무엇인지 알기 원한다면,
$ gst-instpect1.0 udpsrc- 팩토리의 자세한 정보: 엘리먼트의 긴 이름, 클래스, 설명, 저자와 같은 자세한 정보를 보여준다.
- 플러그인의 자세한 정보: 엘리먼트의 전체 경로, 버전, 라이선스와 함께 이름, 설명, 라이브러리 파일 이름을 보여준다.
- 엘리먼트 플래그: 엘리먼트의 플래그를 보여준다.
- 엘리먼트 속성: 이름, 포맷, 버퍼, 디바이스, 플래그 등 엘리먼트의 속성을 보여준다.
Video4Linux2 사용
- gstreamer를 사용한다.
- gstreamer툴인 gst-inspect1.0, gst-launch를 사용한다.
- 요구 사항을 만족하기 위한 엘리먼트를 사용한다.
- 우선, core-image-sato로 빌드한 이미지에, gstreamer와 그 툴들을 사용할 수 있는지 확인하는 것은 쉽지만, 요구사항을 만족하기 위한 엘리먼트가 있는지 확인하기 어렵다.
- 이미지 캡처하기 위해 필요한 v4l2src 엘리먼트를 가지고 있지 않다.
- v4l2src 엘리먼트를 포함했던 패키지 그룹은 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/ 에서 볼 수 있다.
- 여기서 gstreamer1.0-plugins-good_1.20.4.bb 를 보자.

- 이 설정을 활성화 하려면 3가지 방법이 있다.
- gstreamer1.0-plugins-good_1.20.4.bb에서 직접 추가
PACKAGECONFIG += "libv4l2"
매우 비추하는 방법 - gstreamer1.0-plugins-good_1.20.4.bbappend에서 추가
PACKAGECONFIG += "libv4l2"
매우 추천 - local.conf에 추가
PACKAGECONFIG:append:pn-gstreamer1.0-plugins-good = "libv4l2"
- 맨오른쪽에 보다 싶이, v4l-utils에 의존성이 있다.
이 컴포넌트는 meta-openembedded/meta-oe에 있다.
gstreamer 파이프라인
- gstreamer 파이프라인.
- HW 설정
$ gst-lunch-1.0 v4l2src device=/dev/video0 ! 'video/x-rawyuv,width=320,height240' ! x264enc pass=qual quantizer=20 tune=zerolatency ! rtph264pay ! udpsink host=192.168.1.5 port=5000
- gst-launch-1.0 명령을 사용해 카메라 드라이버로 주어진 인자와 함께 요청해서 구매한 센서가 지원하는 최대치를 알아야한다. 카메라가 720p는 지원하지만 1080p는 지원하지 않으면, 가로 1920 세로 1080의 요청은 할 수 없다. 그것은 간단한 에러를 주거나 일부 경우에는 드라이버 내 구현 의존성에 의해 그것 조차 없을 수 있다. 또한 스트리밍 품질을 높이기 위해 카메라가 지원하는 초당 프레임 수도 알아야한다.
gst-launch-1.0 툴은 엘리먼트의 파이프라인을 실행하는데 사용될 수 있다. 앞의 파이프라인에서 본 것처럼, 모든 엘리먼트들은 감탄사 기호(!)로 분리된다. - 자세한 정보표시 모드(Verbosity)는 -v 옵션을 사용한다.
- -vv -vvv
- 엘리먼트를 하나씩 본다.
- v4l2src: 비디오 캡처를 위한 소스 플러그인
- video/x-raw-yuv,width=320,height=240: 입력 비디오 유형과 해상도를 설정한다.
- x264enc: H.264 비디오 인코더이다. 낮은 비트레이트에서 좋은 품질을 얻기 위해 선택한다. h264가 ugly 플러그인 집합이기 때문에 사용하기를 원하지 않는다면 다른 비디오 코덱(Theora, VP8 등)을 선택할 수 있다.
- rtph264pay: RTP payload를 추가하는 플러그인
- udpsink: UDP 싱크 엘리먼트이다. 데이터를 수신하기를 원하는 호스트에 사용할 수 있다. 또한 여러 클라이언트가 있으면, 멀티 캐스트로도 사용할 수 있다.
- USB 비디오 클래스 드라이버는 nodrop=1과 함께 로드된다.
클라이언트 측면
서버 측면에서 gstreamer 파이프라인을 실행 했다. 이 파이프라인은 웹캠 데이터를 캡쳐, 인코딩, RPT 헤더를 적용, 클라이언트에 전송을 한다. udpsink의 호스트 옵션에 IP를 입력했다. 이제 클라이언트에서 비디오를 재생할 수 있는 필요한 두가지 방법에 대해 알아본다.
- VLC
- 플레이러를 사용하기 위해 다음 내용이 포함된 .sdp 파일을 생성할 필요가 있다.
VLC 플레이어를 사용하여 이 파일은 열면, 서버에서 캡처된 웹캠의 결과물을 얻을 수 있어야한다. 앞에서는 서버에서 파이프라인을 실행했다. 이 파이프라인은 192.168.1.5 머신에서 5000번 포트 번호를 옵션으로 사용하여 UDP 패킷을 전송한다. VLC는 포트, IP, 다른 비디오 설정이 있는 이 SDP 파일 정보를 이용하여 비디오를 보여준다.test.sdp: v=0 mvideo 5000 RTP/AVP 96 c=IN IP4 192.168.1.5 a=rtpmap:96 H264/90000
- 플레이러를 사용하기 위해 다음 내용이 포함된 .sdp 파일을 생성할 필요가 있다.
- gstreamer
- 다른 방법은 다음과 같이 gstreamer 파이프라인을 사용하는 것이다.
서버에서 실행하는 파이프라인에서 udpsink를 명시 했기 때문에 udp 엘리먼트에 IP를 명시할 필요가 없다. 다음 두 파이프라인은 선택된 인코더/디코더와 pay/depay 엘리먼트의 여러 조합을 가질 수 있다. 여기서는 h264와 RTP만 사용한다. 다른 옵션 또한 시도할 수 있다. 특정 하드웨어를 사용하거나 비디오 디스플레이 개발을 위해 일부 수정된 엘리먼트를 사용하지 않는 한 autovideosink에는 어떠한 수정도 하지 않는다.$ gst-launch-1.0 udpsrc port=5000 ! rtph264depay ! x264dec ! autovideosink
카메라 발견 문제
- linux-yocto인 욕토 프로젝트 기본 커널을 사용한 경우 멀티미디어 애플리케이션을 위해 필요한 커널 설정이 되어있지 않을 수 있다.
- 카메라를 연결하면 다음과 같은 결과만 보여준다.
usb 2-1: new high-speed USB device number 2 using musb-hdrc- 디버깅 결과 v4l2는 빌드에서 빠진 UVC(USB Video Class) 드라이버를 사용한다. 문제 해결을 위해 다음 커널 설정을 활성화한다. 혹은 tmp/커널/git/.config에 있는 .config파일에서 그 설정을 찾을 수 있다.
CONFIG_MEDIA_CONTROLLER=m
CONFIG_VIDEO_DEV=m
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_VIDEO_V4L2=m
CONFIG_V4L2_MEM2MEM_DEV=m
CONFIG_VIDEOBUF_GEN=m
CONFIG_VIDEOBUF_DMA_CONTIG=m
CONFIG_VIDEOBUF2_CORE=m
CONFIG_VIDEOBUF2_MEMOPS=m
CONFIG_VIDEOBUF2_DMA_CONTIG=m
CONFIG_VIDEOBUF2_VMALLOC=m
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
CONFIG_USB_GSPCA=m
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_V4L_MEM2MEM_DRIVERS=y
CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m
이 설정을 활성화하면 웹캠은 성공적으로 탐지될 것이다. 설정을 활성화하기 위한 방법은 이외에도 여러 가지가 있다.
다음은 설정 방법이다.
다음 명령을 사용하여 menuconfig 태스크를 실행할 수 있다.
$ bitbake -c menuconfig virtual/kernel
그러면 GUI로 이 설정들을 활성화 할 수 있다.
단순히 설정 내용을 .config 파일에 복사한다.
다음은 설정한 부분을 사용하는 방법이다.
layer/recipes-kernel/linux/kernel-name_version.bbappend에 커널을 위한 bbappend 파일을 생성한다.
test.cfg와 같이 <name>.cfg 파일에 모든 설정 내용을 추가하고 layer/recipes-kernel/linux/files/에 cfg 파일을 위치시킨다.
bbappend 파일에 다음 두줄을 추가한다.
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append = " test.cfg"
레퍼런스 목적으로 이 파일에 설정을 추가한다. TI 커널을 사용하면 기본적으로 이것들이 활성화될 것이다.
DISTRO
- meta-raspberrypi 에서 따로 주어지는 DISTRO는 없기 때문에 poky를 수정해서 사용하자.
DISTRO_FEATURES

DISTRO_FEATURESdescription
| alsa | ALSA를 지원한다(이용 가능하다면 OSS호환 커널 모듈이 설치돼 있다.) |
| api-documentation | 레시피를 빌드하는 동안 API 문서를 생성한다. |
| bluetooth | 블루투스를 지원한다(통합된 블루투스만 해당). |
| bluz5 | 핵심 블루투스 레이어와 프로토콜 지원을 제공하는 BlueZ 버전 5를 포함한다. |
| cramsfs | CramFS를 지원한다. |
| directfb | DirectFB를 지원한다. |
| ext2 | 파일을 저장하게 내장 하드/마이크로 드라이버를 가진 디바이스를 지원하기 위한 도구를 포함한다.(플래시만 지원하는 디바이스 대신). |
| ipsec | IPSec를 지원한다. |
| ipv6 | IPv6를 지원한다. |
| irda | IrDA를 지원한다. |
| keyboard | 키보드를 지원한다. 예를들어 keymap이 부팅하는 동안 로딩된다. |
| ldconfig | Target에서 ldconfig와 ld.so.conf를 지원한다. |
| nfs | NFS 클라이언트를 지원한다.(디바이스에서 NFS를 마운트하기 위해) |
| opengl | 2,3차원 그래픽을 렌더링하기 위해 사용되는 크로스언어, 멀티 플랫폼 애플리케이션 프로그래밍 인터페이스를 지원하는 OpenGL을 지원한다. |
| pci | pci 버스를 지원한다. |
| pcmcia | PCMCIA/CompactFlasg를 지원한다. |
| ppp | PPP 다이얼업을 지원한다. |
| ptest | 개별 레시피에서 지원하는 패키지 테스트를 빌드하게 한다. |
| smbfs | SMB 네트워크 클라이언트를 지원한다. |
| systemd | 서비스를 병렬로 시작하는 systemd를 사용 |
| usbgadget | USB 가젯 디바이스를 지원한다(USB 네트워킹/시리얼/저장장치를 위해). |
| usbhost | USB 호스트를 지원한다(외부 키보드, 마우스, 저장장치, 네트워크 등을 연결할 수 있게). |
| wayland | Wayland 디스플레이 서버 프로토콜과 라이브러리를 지원한다. |
| wifi | 와이파이를 지원한다(통합된 와이파이만 해당). |
| x11 | X 서버와 라이브러리를 포함한다. |
| usrmerge | /bin -> /usr/bin /lib -> /usr/lib 로 심볼릭링크 시킨다. |
systemd 사용하기
DISTRO_FEATURES:append = " systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
VIRTUAL-RUNTIME_syslog = ""
VIRTUAL-RUNTIME_base-utils-syslog = ""
'Yocto Project : : Open Source' 카테고리의 다른 글
| jetson-nano-devkit에 boot2qt 사용 (0) | 2024.06.01 |
|---|---|
| wic partition (0) | 2024.06.01 |
| package 3. list, script (0) | 2024.06.01 |
| ADVANCED: do_package (0) | 2024.06.01 |
| meta-rust-bin, fakeroot (0) | 2024.06.01 |


