raspberrypi4-64 를 이용해 살펴보는 MACHINE_FEATURES, DISTRO_FEATURES, QT

markyang92·2023년 1월 5일
0

yocto

목록 보기
49/53
post-thumbnail
  1. poky
  • branch: kirkstone

meta-raspberrypi

meta-raspberrypi conf

  1. meta-raspberrypi 설정

MACHINE

  • meta-raspberrypi는 BSP 지원 레이어인지, layer/confmachine 디렉토리만 있음
  • 여기서 raspberrypi4-64local.conf에 설정하자.

MACHINEOVERRIDES


MACHINE_FEATURES

  • raspberrypi4-64 특화 MACHINE_FEATURES는 vc4graphics가 있겠다.
MACHINE_FEATURESdescription
acpiHW가 ACPI(x86/x86_64에서만)를 갖고 있다.
alsaHW가 ALSA 오디오 드라이버를 갖고 있다.
apmHW가 APM(또는 APM emulation)을 갖고 있다.
bluetoothHW가 통합된 블루투스를 갖고 있다.
efiEFI로 부팅할 수 있게 지원한다.
ext2HW가 HDD 또는 마이크로 드라이브를 갖고 있다.
IRDAHW가 IrDA를 지원한다.
keyboardHW가 키보드를 갖고 있다.
pcbiosBIOS로 부팅 할 수 있게 지원한다.
pciHW가 PCI 버스를 갖고 있다.
pcmciaHW가 PCMCIA 또는 CompactFlash 소켓을 갖고 있다.
phone모바일 폰(음성)을 지원한다.
qvgaQVGA(320x240) 디스플레이를 지원한다.
rtc리얼타임 클록을 지원한다.
screenHW가 화면을 갖고 있다.
serialHW가 시리얼(일반적으로 RS232)를 지원한다.
touchscreenHW가 터치스크린을 갖고있다.
usbgadgetHW가 USB 가젯 드라이버와 호환된다.
usbhostHW가 USB 호스트와 호환된다.
vfatFAT 파일 시스템을 지원한다.
wifiHW가 통합된 와이파이를 갖고 있다.

이미지배치

  • wic도구는 Target 이미지 레이아웃을 정의하는데 도움을 준다.

    • 템플릿 파일(wks)를 기반으로 파티션된 이미지를 생성할 수 있다.
      IMAGE_FSTYPESwic를 추가하고, WKS_FILE 변수에 .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

  1. u-boot_%.bbappend
  2. files/fw_env.config

meta-raspberrypi/rpi-uboot-scr

  1. rpi-uboot-scr.bb
  1. 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_SPACE0
IMAGE_ROOTFS_SIZE65536
INITRAMFS_MAXSIZE131072
IMAGE_ROOTFS_ALIGNMENT4096
  • 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-satoMACHINE = "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가지 방법이 있다.
  1. gstreamer1.0-plugins-good_1.20.4.bb에서 직접 추가
    PACKAGECONFIG += "libv4l2"
    매우 비추하는 방법

  2. gstreamer1.0-plugins-good_1.20.4.bbappend에서 추가
    PACKAGECONFIG += "libv4l2"
    매우 추천

  3. local.conf에 추가
    PACKAGECONFIG:append:pn-gstreamer1.0-plugins-good = "libv4l2"

  • 맨오른쪽에 보다 싶이, v4l-utils에 의존성이 있다.
    이 컴포넌트는 meta-openembedded/meta-oe에 있다.

gstreamer 파이프라인

  • gstreamer 파이프라인.
  1. 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 파일을 생성할 필요가 있다.
      test.sdp:
      v=0
      mvideo 5000 RTP/AVP 96
      c=IN IP4 192.168.1.5
      a=rtpmap:96 H264/90000
      VLC 플레이어를 사용하여 이 파일은 열면, 서버에서 캡처된 웹캠의 결과물을 얻을 수 있어야한다. 앞에서는 서버에서 파이프라인을 실행했다. 이 파이프라인은 192.168.1.5 머신에서 5000번 포트 번호를 옵션으로 사용하여 UDP 패킷을 전송한다. VLC는 포트, IP, 다른 비디오 설정이 있는 이 SDP 파일 정보를 이용하여 비디오를 보여준다.

  • gstreamer
    • 다른 방법은 다음과 같이 gstreamer 파이프라인을 사용하는 것이다.
    $ gst-launch-1.0 udpsrc port=5000 ! rtph264depay ! x264dec ! autovideosink
    서버에서 실행하는 파이프라인에서 udpsink를 명시 했기 때문에 udp 엘리먼트에 IP를 명시할 필요가 없다. 다음 두 파이프라인은 선택된 인코더/디코더와 pay/depay 엘리먼트의 여러 조합을 가질 수 있다. 여기서는 h264와 RTP만 사용한다. 다른 옵션 또한 시도할 수 있다. 특정 하드웨어를 사용하거나 비디오 디스플레이 개발을 위해 일부 수정된 엘리먼트를 사용하지 않는 한 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
alsaALSA를 지원한다(이용 가능하다면 OSS호환 커널 모듈이 설치돼 있다.)
api-documentation레시피를 빌드하는 동안 API 문서를 생성한다.
bluetooth블루투스를 지원한다(통합된 블루투스만 해당).
bluz5핵심 블루투스 레이어와 프로토콜 지원을 제공하는 BlueZ 버전 5를 포함한다.
cramsfsCramFS를 지원한다.
directfbDirectFB를 지원한다.
ext2파일을 저장하게 내장 하드/마이크로 드라이버를 가진 디바이스를 지원하기 위한 도구를 포함한다.(플래시만 지원하는 디바이스 대신).
ipsecIPSec를 지원한다.
ipv6IPv6를 지원한다.
irdaIrDA를 지원한다.
keyboard키보드를 지원한다. 예를들어 keymap이 부팅하는 동안 로딩된다.
ldconfigTarget에서 ldconfigld.so.conf를 지원한다.
nfsNFS 클라이언트를 지원한다.(디바이스에서 NFS를 마운트하기 위해)
opengl2,3차원 그래픽을 렌더링하기 위해 사용되는 크로스언어, 멀티 플랫폼 애플리케이션 프로그래밍 인터페이스를 지원하는 OpenGL을 지원한다.
pcipci 버스를 지원한다.
pcmciaPCMCIA/CompactFlasg를 지원한다.
pppPPP 다이얼업을 지원한다.
ptest개별 레시피에서 지원하는 패키지 테스트를 빌드하게 한다.
smbfsSMB 네트워크 클라이언트를 지원한다.
systemd서비스를 병렬로 시작하는 systemd를 사용
usbgadgetUSB 가젯 디바이스를 지원한다(USB 네트워킹/시리얼/저장장치를 위해).
usbhostUSB 호스트를 지원한다(외부 키보드, 마우스, 저장장치, 네트워크 등을 연결할 수 있게).
waylandWayland 디스플레이 서버 프로토콜과 라이브러리를 지원한다.
wifi와이파이를 지원한다(통합된 와이파이만 해당).
x11X 서버와 라이브러리를 포함한다.
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 = ""

QT

QT5


QPA

  • QPA를 설정해야한다.
  • QPA Backends의 대표적인 예제는 아래와 같다.
QPADescription
DirectFP(FrameBuffer)-
elgfsopengl사용. HW 가속 (컴포지터 X 가능)
LinuxFB(FrameBuffer)완전 SW
VNC
Mir Client

1. qtbase_git.bb

  • 여러 설정이 있으며, qtbase_%.bbappend에서 뭘쓸지 선택하면 됨

2. qtbase_%.bbappend


3. files/qt-qpa.sh

export QT_QPA_PLATFORM=eglfs
  • systemd 가 시작 시, profile.d 내 파일을 실행하여 전역 환경변수가 먹힌다.

QT 예제사용

  • 사용할 예제: meta-qt5/recipes-qt/examples/cinematicexperience_1.0.bb
  • IMAGE_INSTALL += "cinetmaticexperience"
  • 이 예제는 /usr/share/cinetamicexperience-1.0/QT5_CinematicExperience 경로에 파일을 생성한다.

systemd unit으로 추가


b2qt 사용

$ mkdir b2qt
$ cd b2qt
$ repo init -u git://code.qt.io/yocto/boot2qt-manifest -m v6.2.3.xml
$ repo sync

poky 설정

bblayers.conf

BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE')) + '/../..')}"
BBLAYERS ?= " \
  ${BSPDIR}/sources/poky/meta \
  ${BSPDIR}/sources/poky/meta-poky \
  ${BSPDIR}/sources/meta-raspberrypi \
  ${BSPDIR}/sources/meta-openembedded/meta-oe \
  ${BSPDIR}/sources/meta-openembedded/meta-python \
  ${BSPDIR}/sources/meta-openembedded/meta-networking \
  ${BSPDIR}/sources/meta-openembedded/meta-initramfs \
  ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
  ${BSPDIR}/sources/meta-python2 \
  ${BSPDIR}/sources/meta-boot2qt/meta-boot2qt \
  ${BSPDIR}/sources/meta-boot2qt/meta-boot2qt-distro \
  ${BSPDIR}/sources/meta-mingw \
  ${BSPDIR}/sources/meta-qt6 \
  "

local.conf

MACHINE = "raspberrypi4-64"
MACHINE_HOSTNAME = "b2qt-${MACHINE}"
DISTRO = "b2qt"
PACKAGE_CLASSES = "package_ipk"
include conf/distro/include/${MACHINE}.pre.inc
QT_SDK_PATH = ""
LICENSE_FLAGS_WHITELIST = "commercial"
ACCEPT_FSL_EULA = "1"
INHERIT += "rm_work"
INHERIT += "buildstats buildstats-summary"
INHERIT += "internal-build"
USER_CLASSES ?= "buildstats image-mklibs"

추가 설정

  • meta-qt6의 git branch를 qt/6.2.4로 변경하자.

빌드

$ bitbake b2qt-embedded-qt6-image

DISTRO_FEATURES

VARIABLEVALUE
DISTRO_FEATURESacl alsa argp bluetooth ext2 ipv4 ipv6 largefile usbgadget
usbhost wifi xattr nfs vfat largefile opengl ptest multiarch
wayland vulkan gstreamer webengine systemd pam ld-is-gold
systemd pulseaudio gobject-introspection-data ldconfig
DISTRO_FEATURES_BACKFILLpulseaudio sysvinit gobject-introspection-data ldconfig
DISTRO_FEATURES_BACKFILL_CONSIDEREDsysvinit
DISTRO_FEATURES_DEFAULTacl alsa argp bluetooth ext2 ipv4 ipv6 largefile
usbgadget usbhost wifi xattr nfs vfat
DISTRO_FEATURES_FILTER_NATIVEapi-documentation opengl
DISTRO_FEATURES_FILTER_NATIVESDKapi-documentation opengl wayland
DISTRO_FEATURES_NATIVEx11 ipv6 xattr
DISTRO_FEATURES_NATIVESDKx11

IMAGE_FEATURES

VARIABLEVALUE
IMAGE_FEATURESdebug-tweaks hwcodes package-management ssh-server-dropbear
tools-debug tools-profile
IMAGE_FEATURES_REPLACE_ssh-server-opensshssh-server-dropbear

MACHINE_FEATURES

VARIABLEVALUE
MACHINE_FEATURESpci apm usbhost keyboard vfat ext2 screen touchscreen
alsa bluetooth wifi sdio vc4graphics pitft qemu-usermode
MACHINE_FEATURES_BACKFILLrtc qemu-usermode
MACHINE_FEATURES_BACKFILL_CONSIDEREDrtc
MACHINE_EXTRA_INSTALL
MACHINE_EXTRA_RDEPENDS
MACHINE_EXTRA_RRECOMMENDSlinux-firmware-rpidistro-bcm43455
bluez-firmware-rpidistro-bcm4345c0-hcd kernel-modules udev-rules-rpi
MACHINE_ESSENTIAL_EXTRA_RDEPENDS
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS

flatten

distro

./conf
├── bitbake.conf
├── ccache.conf
├── distro
│   ├── b2qt.conf
│   ├── defaultsetup.conf
│   ├── include
│   │   ├── cve-extra-exclusions.inc
│   │   ├── default-distrovars.inc

default-distrovars.inc

│   │   ├── default-providers.inc

default-providers.inc

│   │   ├── default-versions.inc

default-versions.inc

│   │   ├── distro_alias.inc
│   │   ├── fsl.inc
│   │   ├── gcsections.inc
│   │   ├── init-manager-mdev-busybox.inc
│   │   ├── init-manager-none.inc
│   │   ├── init-manager-systemd.inc

init-manager-systemd.inc

│   │   ├── init-manager-sysvinit.inc
│   │   ├── intel.inc
│   │   ├── jetson.inc
│   │   ├── lto.inc
│   │   ├── machine-settings.inc
│   │   ├── maintainers.inc
│   │   ├── no-gpl3.inc
│   │   ├── no-static-libs.inc
│   │   ├── poky-distro-alt-test-config.inc
│   │   ├── poky-floating-revisions.inc
│   │   ├── poky-world-exclude.inc
│   │   ├── preferred-providers-mingw32.inc
│   │   ├── ptest-packagelists.inc
│   │   ├── python2-target-recipes-blacklist.inc
│   │   ├── qemu.inc
│   │   ├── raspberrypi.inc

raspberrypi.inc

│   │   ├── security_flags.inc
│   │   ├── tclibc-baremetal.inc
│   │   ├── tclibc-glibc.inc
│   │   ├── tclibc-musl.inc
│   │   ├── tclibc-newlib.inc
│   │   ├── tcmode-default.inc
│   │   ├── toradex.inc
│   │   ├── uninative-flags.inc
│   │   └── yocto-uninative.inc
│   ├── poky-altcfg.conf
│   ├── poky-bleeding.conf
│   ├── poky-tiny.conf
│   └── poky.conf
├── documentation.conf
├── image-uefi.conf
├── layer.conf
├── licenses.conf
├── local.conf.sample
├── local.conf.sample.extended

machine

├── machine
│   ├── include
│   │   ├── README
│   │   ├── arm
│   │   │   ├── README
│   │   │   ├── arch-arm.inc
...
│   │   ├── riscv
│   │   │   ├── arch-riscv.inc
│   │   │   ├── qemuriscv.inc
│   │   │   └── tune-riscv.inc
│   │   ├── rpi-base.inc   ←─────────────┬──────────────┐

rpi-base.inc

  • MACHINE_FEATURES 설정vc4graphics 분기
│   │   ├── rpi-default-providers.inc ←──┤              │ 
  • virtual/egl= mesa
  • virgual/libgles2= mesa
  • virgual/libgl= mesa
  • virgual/mesa= mesa
  • virgual/libgbm= mesa
    vc4graphics 사용 시, mesa, userland
│   │   ├── rpi-default-settings.inc  ←──┤              │
│   │   ├── rpi-default-versions.inc  ←──┘              │
│   │   ├── sh                                          │
│   │   │   ├── README                                  │
│   │   │   └── arch-sh.inc                             │
│   │   ├── soc-family.inc                              │
│   │   ├── tune-arm1136jf-s.inc                        │
...                                                     │
│   │   ├── tune-cortexa7.inc                           │
│   │   ├── tune-cortexa72.inc  ←───────────────────────┤
│   │   ├── tune-cortexa73-cortexa53.inc                │
│   │   ├── tune-cortexa8.inc                           │
│   │   ├── tune-cortexa9.inc                           │
...                                                     │
│   ├── raspberrypi0-wifi.conf                          │
│   ├── raspberrypi0.conf                               │
│   ├── raspberrypi2.conf                               │
│   ├── raspberrypi3-64.conf                            │
│   ├── raspberrypi3.conf                               │
│   ├── raspberrypi4-64.conf   ─────────────────────────┘

raspberrypi4-64.conf

│   └── raspberrypi4.conf
├── machine-sdk


qt

qtbase.bbappend

  • meta-boot2qt-distro/recipes-qt/qt6/qtbase_git.bbappend
  • meta-boot2qt-distro/dynamic-layers/raspberrypi/recipes-qt/qt6/qtbase_git.bbappend

    vc4graphics 일 때, kms!

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글