みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

raspberrypi3 yoctoでfbcp

PiTFTなどSPI接続のLCDではGPUを使用した描画処理は行えない。 そのためOpenGLESなどのアプリケーションはPiTFTでは使用できない。

しかし、fbcpを使用するとこの問題が解決できる。

fbcpは「Framebuffer Copy」のことで、GPUに描画されているデータをSPI側のフレームバッファにコピーするというアプリケーション。

実装を見ると、dispmanxでLCDバイス(HDMIへの出力)を開いて、必要に応じて縮小し/dev/fb1に転送している。 このアプリケーションは、実はすでに有名なようでちょっと筆者としては出遅れた感がある。

以前、PiTFT3.5でQML(Quick2)アプリケーションが実行できない理由の時に「2.2インチや2.8インチのPiTFTではGPUを使用せずにOpenGLを描画することができる」というところでリンクを紹介したがこの内容も実はfbcpを使用することだった。 リンク先で「The 3.5" PiTFT (480x320) is NOT recommended for this project 」とされていたので深追いしなかったが、実は意外と使えるということが今回の実験でわかった。

とりあえず、yoctoprojectで使用できるようにmeta-rpi-fbcpを作成した。

環境の作成

raspberrypi3 yoctoでPiTFT35の環境をベースに作業を行う。

meta-rpi-fbcpのダウンロード

gitでmeta-rpi-fbcpを取得する。

$ cd ~/rpi3/poky
$ git clone https://github.com/mickey-happygolucky/meta-rpi-fbcp.git

ビルド環境の設定

oe-init-build-envを読み込む。

$ cd ~/rpi3
$ source poky/oe-init-build-env build_pitft35

自動的にbuild_fbcpに移動される。

レイヤの設定

ビルド対象にはすでに、meta-raspberrypimeta-pitft35-rpiは追加されているので、次のコマンドでmeta-rpi-fbcpを追加する。

$ bitbake-layers add-layer ../poky/meta-rpi-fbcp

conf/local.conf

local.confからRPI_PITFT35 = "1"の行を削除し、RPI_PITFT35_FBCP = "1"を追加する。

カーネル4.1の場合だと次のようになる。

MACHINE ?= "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

KERNEL_DEVICETREE_append = " overlays/pitft35-resistive-overlay.dtb"
RPI_PITFT35_FBCP = "1"

設定が衝突するため、RPI_PITFT35 = "1"RPI_PITFT35_FBCP = "1"は同時に指定できない。

動作確認

この環境では、PiTFT35のタッチパネルは無効化される。 今回は、X11環境で動作を確認する。

ビルド

$ bitbake core-image-sato

SDカードへ書き込み

$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M

/dev/sdbのSDカードデバイスは環境によって変化することがあるのでfdisk -lなどで確認すること。

このままではただsatoのGUI環境が表示されるだけなので、fbcpなしの環境と比較するとタッチパネルが無効化されただけのように見えるが、

前回の記事で作成したfirst_window.cコンパイル結果を実行すると、PiTFT35が赤く染まるようになっている。

raspberrypiでOpenGLESプログラミング

ラズベリーパイOpenGLのプログラミングをはじめようと思ったが、ラズベリーパイではOpenGLESでプログラムする必要がある。 PCなどではOpenGLプログラミングというとglutやglfwなどが主流のようで、なかなかそのまま動くコードが見つからない。

また、OpenGLESで調べようとするとAndroidiOSの情報ばかりでこれもハードルが高い。 いろいろ調べていくと、OpenGLESの世界では、OpenGL ES 3.0 Programming GuideOpenGL ES 2.0 Programming Guideバイブルとなっているらしく、これらのコードを元にしたサンプルがあちこちで見かけられる。ここが大本か。

ただ、これは純粋にOpenGLESプログラミングの説明に集中するため、Windowsを表示するための最低限の仕組みはesUtil.cというフレームワークの中に隠蔽されており、ラズベリーパイでこれらのコードを動かすにはどうすればよいかがわかりづらい。

中には移植してGitHubにあげている人もいるが、「ラズベリーパイでOpenGLESプログラミングの第一歩」を踏み出すためは最低限何をすればよいかがなかなかわからない。

さらに調べた先にここを見つけた。 ここのrectangle.cがかなり求めていたものに近い。 余談だが、冒頭のコメントの「code stolen from」は面白い表現だと思った。

ただ、rectangle.cではOpenGLESの初期化コードとラズベリーパイのネイティブウィンドウシステムであるdispmanxの初期化コードがごっちゃに書かれているため、整理したものを作成した。

ラズベリーパイでOpenGLESプログラミングを行うにはまず次のキーワードを理解する必要がある。

  • dispmanx
  • EGL

dispmanxはラズベリーパイGPUを操作するためのAPIでローレベルのウィンドウシステムを提供するAPI

EGLはOpenGL(本来はKhronos rendering APIs)の描画周りの抽象化層で、実際に描画を行うネイティブウィンドウシステムとOpenGLとの橋渡しを行う。

そのため、ラズベリーパイではdispmanxとEGLを関連付ける必要がある。

大まかな手順としては次のようになる。

  1. dispmanxの初期化
  2. EGLの初期化
  3. EGLの描画コンテキストを作成
  4. dispmanxでウィンドウを作成
  5. EGLの描画コンテキストにdispmanxのウィンドウを関連付け

first_window.cではcreate_native_windowでdispmanxのウィンドウを作成、 init_oglでEGLの描画コンテキストの作成create_native_windowの呼び出し、 eglCreateWindowSurface関数により描画コンテキストとウィンドウを関連付けしている。

このプログラムを実行すると、画面が真っ赤に塗りつぶされる。

rectangle.cのサイトを作成したJan Newmarchさんがこのような本を書いているので参考になると思う。 OpenGLESのあたりから急にOpenGLES-bookのコードが手元にあることを前提に話が始まるので、それを頭に入れていないと混乱するかもしれない。

raspberrypi3 yoctoでPiTFT35

以前PiTFT35をyoctoで動作させるためにmeta-pitft35-rpiを作成した^1が、 最近のmeta-raspberrypiでは動作しなくなっていた。

一度、リポジトリの方に問い合わせが来たが、その人がうちのパッチをまとめて(勝手に)meta-raspberrypiにPRを送っていた。 meta-raspberrypiに取り込まれるならもうmeta-pitft35-rpiも用済みかと思ってしばらく放置していたのだが、そのパッチ取り込まれるようすがなく、送ったPRの内容を確認すると結構いい加減な対応だったので、 とりあえずmeta-pitft35-rpiをRPi3(というかカーネル4.1、4.4)に対応させることにした。

ついでにcore-image-satoではキャリブレーションデータが固定だったので、イメージを書き込んで初回など、キャリブレーションデータが存在しない場合、OS起動時にキャリブレーションが実行されるように修正した。

使用方法は変更なし。

環境の作成

作業は~/rpi3で行う。

pokyとmeta-raspberrypiのダウンロード

pokyのブランチはkrogothを使用する。 meta-raspberrypiはkrogothブランチがないので、masterブランチを使用する。

$ mkdir ~/rpi3
$ cd ~/rpi3
$ git clone git://git.yoctoproject.org/poky.git -b krogoth
$ cd ~/rpi3/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi

meta-pitft35-rpiのダウンロード

meta-pitft35-rpiをダウンロードする。

$ git clone https://github.com/mickey-happygolucky/meta-pitft35-rpi.git

ビルド環境の設定

次のコマンドでoe-init-build-envを読み込む。

$ cd ~/rpi3
$ source poky/oe-init-build-env build_pitft35

自動的ににbuild_pitft35に移動される。

レイヤの設定

bitbake-layersコマンドでビルド対象にmeta-raspberrypimeta-pitft35-rpiを追加。

$ bitbake-layers add-layer ../poky/meta-raspberrypi
$ bitbake-layers add-layer ../poky/meta-pitft35-rpi

conf/local.conf

エディタでconf/local.confを修正する。 カーネル4.1と4.4で若干異なる。

カーネル4.1

バージョン4.1のカーネルを使用する場合はlocal.confに次を追加する。

MACHINE ?= "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

KERNEL_DEVICETREE_append = " overlays/pitft35-resistive-overlay.dtb"
RPI_PITFT35 = "1"

PiTFT35のための設定はKERNEL_DEVICETREE_appendRPI_PITFT35MACHINEでRPi3向けのイメージを指定。 DL_DIRはbitbake時にダウンロードされるデータを格納するディレクトリの指定。 デフォルトではビルドディレクトリごとにダウンロードされるが、階層をひとつ上げることで他のビルドディレクトリと共用している。

カーネル4.4

バージョン4.4のカーネルを使用する場合はlocal.confに次を追加する。

MACHINE ?= "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

PREFERRED_VERSION_linux-raspberrypi = "4.4.%"

KERNEL_DEVICETREE_append = " overlays/pitft35-resistive-overlay.dtb"
RPI_PITFT35 = "1"

PREFERRED_VERSION_linux-raspberrypiカーネルバージョンを指定している。 それ以外は4.1と同じ。

動作確認

コンソール環境とX11環境を作成

コンソール環境

次でビルド。

$ bitbake rpi-basic-image

次でSDカードに書き込み

$ sudo dd if=./tmp/deploy/images/raspberrypi3/rpi-basic-image-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M

/dev/sdbはSDカードデバイスの指定で環境によっては/dev/sdcとかになるのでfdisk -lなどで確認する必要がある。

X11環境

ビルド。

$ bitbake core-image-sato

SDカードに書き込み

$ sudo dd if=./tmp/deploy/images/raspberrypi3/core-image-sato-raspberrypi3.rpi-sdimg of=/dev/sdb bs=40M

OpenCV3 ArUcoサンプルのビルド

OpenCV3ではopencv_contributeというリポジトリOpenCVを使用して作成されたライブラリがモジュールとして収録されている。 この中にAR向けマーカー認識ライブラリのArUcoがある。

opencv_contrib/modules/arucoにはCMakeLists.txtが存在するが、これはArUcoそのものをビルドするためのものであるため、 サンプルのビルドには使用できない。

次のファイルをopencv_contrib/modules/aruco/samplesに置く。

ここでは、create_board.cppcalibrate_camera.cppをビルドしている。

サンプルの実行例を下記に示す。

$ ./create_board -w=4 -h=3 -d=10 -l=100 -s=30 -m=30 --si test.png
$ ./calibrate_camera  -w=4 -h=3 -d=10 -l=0.03 -s=0.01 --ci=1 ./test.xml

パラメータは適当。

create_boardキャリブレーションに使用するマーカーボードを作成。 calibrate_cameraキャリブレーションを実行する。

create_boardのサイズ指定がピクセル単位なのに対し、calibrate_cameraのサイズ指定はメートル単位となっている。 これはキャリブレーションを印刷したボードで行うことを想定しているためだろう。

DragonBoard 410cでYocto

DragonBoard 410cを借りることができた。 実はかなり前から借りていたのだが、個人的に忙しく触る時間が作れないでいた。

このボードは、RaspberryPi3よりも前に出回っていて、かつ、Cortext-A53をコアに搭載しており、WifiBluetoothオンボード。 借りたボードは技適取得済みという、なんとまぁ、RPi3より前に手元にあったのなら、なぜ、RPi3よりも前に遊び倒していないのかという代物。

しかも!配布されているLinuxOSのイメージはAArch64!なので、現状32bit版OSしか配布されていないRPi3よりも先に64bitの世界が体験できる。

オフィシャルで配布されているOSは、AndroidLinux(Linaro)だが、もちろんここではYoctoのイメージを焼いてみる。

イメージの作成

ここでYoctoのイメージの作成手順が公開されている。

筆者はUbuntu 15.04で作業している。

依存パッケージ

参考にしたサイトでは、以下のパッケージをインストールする様に書いてあるが、 筆者の環境では、明示的にインストールした覚えがないがインストール済みになっていた。

$ sudo apt-get install git
$ sudo apt-get install whiptail
$ sudo apt-get install dialog

それ以外では、Yoctoを使用するための最低限の環境をインストールする必要がある。

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
    build-essential chrpath libsdl1.2-dev xterm

repoのインストール

DragonBoardのYocto環境の構築ではrepoコマンドを使用している。

repoは複数のgitのリポジトリを一括で管理できるコマンドで、主にAndroidの開発で見かける事が多いが、一部他のメーカーのボードでYocto環境を構築する際にも使用されている。

$ mkdir -p ${HOME}/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ${HOME}/bin/repo
$ chmod a+x ${HOME}/bin/repo
$ export PATH=${HOME}/bin:${PATH}

Ubuntu 15.04では、${HOME}/.profileで コード 1 の様に記述されているため、 ${HOME}/binが存在すると、自動的にPATHに含まれる様になっているようだ。

コード 1: .profile(抜粋)
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

作業ディレクト

筆者は${HOME}/work/yoctoで作業している。

$ cd ${HOME}/work/yocto
$ mkdir oe-qcom && cd oe-qcom
$ repo init -u https://github.com/96boards/oe-rpb-manifest.git -b jethro
$ repo sync
$ source setup-environment build

bitbake

基本的に、oe-qcomの場合は、local.confやbblayers.confの設定は、 setup-environmentがやってくれているため、そのままbitbakeを実行することができる。

$ bitbake rpb-console-image

イメージの書き込み

tmp-rpb-glibc/deploy/images/dragonboard-410cに作られた次の2つのファイルを書き込む。

  1. rpb-console-image-dragonboard-410c.ext4.gz
  2. boot-dragonboard-410c.img

fastbootのインストール

イメージの書き込みにはfastbootを使用する。Ubuntu 15.04では次のコマンドを実行してインストールする。

$ sudo apt-get install -y android-tools-fastboot

ボードの電源を切った状態で、J4コネクタ(図 1)にUSBケーブルを接続し、PCのUSBポートと接続します。次に S4ボタン(図 2)を押しながら電源を入れ、数秒後に離す。

f:id:mickey_happygolucky:20160605173942j:plain

図 1:J4コネクタ

f:id:mickey_happygolucky:20160605173952j:plain

図 2:S4ボタン

以下のコマンドを実行して、fastbootからデバイスが見えているか確認する。

$ sudo fastboot devices

バイスが見えている場合は、以下のように8桁の16進数が表示される。

$ sudo fastboot devices
11e02318    fastboot

ブートローダのダウンロードとパーティション設定

eMMCのパーティション設定を行うためにここからブートローダのファイルをダウンロードする必要がある。

wgetで取得する場合は、以下のコマンドを実行する。

$ wget http://builds.96boards.org/releases/dragonboard410c/linaro/rescue/latest/dragonboard410c_bootloader_emmc_linux-46.zip

zip形式で圧縮されているので、次のコマンドで解凍する。

$ unzip -d bootloader dragonboard410c_bootloader_emmc_linux-46.zip

PCとボードが接続された状態で、解凍したファイルの中にあるflashallを実行する。

$ cd bootloader
$ sudo ./flashall

イメージの書き込み

次のコマンドを実行し、ルートファイルシステムカーネルイメージを書き込む。

$ cd ${HOME}/work/yocto/oe-qcom/build/tmp-rpb-glibc/deploy/images/dragonboard-410c
$ gzip -d < rpb-console-image-dragonboard-410c.ext4.gz > rpb-console-image-dragonboard-410c.ext4
$ sudo fastboot flash rootfs rpb-console-image-dragonboard-410c.ext4
$ sudo fastboot flash boot boot-dragonboard-410c.img

起動

電源を切り、J4コネクタからUSBのケーブルを抜いて、電源を再度投入するとOSが起動する。(図 3)

f:id:mickey_happygolucky:20160605173937j:plain

図 3:ブート画面

recipetoolの使い方(yoctoでmjpg-streamer)

raspberrypiにUVCカメラをつけて、HTTPでストリーミングを行いたいと考えた。 mjpg-streamerを使用することにしたが、 mjpg-streamerはレシピ化されていないため、レシピを自作する必要があった。^1

recipetoolの使用

レシピを作成する場合、ゼロから作成することもできるが、recipetoolを使用して雛形を作成することができる。

recipetoolを実行するにはbitbakeと同様にoe-init-build-envをsourceコマンド等で読み込んでおく必要がある。 作業ディレクトリは%HOME/work/yocto/rpiとする。

$ cd %HOME/work/yocto/rpi
$ source poky/oe-init-build-env build_webcam

mjpg-streamerのレシピを作成するには以下のコマンドを実行する。

$ recipetool create -o mjpg-streamer_git.bb --src-subdir=mjpg-streamer-experimental https://github.com/jacksonliam/mjpg-streamer.git

recipatoolはプロジェクトの中身を解析して、そのプロジェクトで使用しているautomakeやcmakeなどのビルドシステムに対応したレシピの雛形を生成する。 デフォルトではビルドシステムのソースディレクトリ=プロジェクトのルートディレクトリとして解析を行うが、mjpg-streamerではmjpg-streamer-experimentalがソースディレクトリとなっている。 その場合は--src-subdir=mjpg-streamer-experimentalオプションでソースディレクトリを指定することができる。

生成されたレシピは コード 1 のようになる。

コード 1: recipetoolで生成されたレシピ
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)
#
# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
#
# NOTE: multiple licenses have been detected; if that is correct you should separate
# these in the LICENSE value using & if the multiple licenses all apply, or | if there
# is a choice between the multiple licenses. If in doubt, check the accompanying
# documentation to determine which situation is applicable.
LICENSE = "GPLv2 Unknown"
LIC_FILES_CHKSUM = "file://LICENSE;md5=751419260aa954499f7abaabaa882bbe \
                    file://www/LICENSE.txt;md5=713496289346a6c1c265f0e1f615ecd0"

SRC_URI = "git://github.com/jacksonliam/mjpg-streamer.git;protocol=https"

# Modify these as desired
PV = "1.0+git${SRCPV}"
SRCREV = "${AUTOREV}"

S = "${WORKDIR}/git/${BPN}-experimental"

# NOTE: unable to map the following CMake package dependencies: OpenCV Numpy Gphoto2
# NOTE: the following library dependencies are unknown, ignoring: v4l2
#       (this is based on recipes that have previously been built and packaged)
DEPENDS = "libjpeg-turbo libsdl"

inherit cmake python-dir

# Specify any options you want to pass to cmake using EXTRA_OECMAKE:
EXTRA_OECMAKE = ""

mjpg-streamerはcmakeでビルドしているためinherit cmakeとなっている。 その他、依存関係なども自動的に解決されている。

レシピのビルド

生成されたレシピがビルドできるかどうかbitbakeを実行してみる。

meta-webcamの作成

recipetoolで生成したmjpg-streamer_git.bbはビルドディレクトリである%HOME/work/yocto/rpi/build_webcamに格納されている。 これはどのレイヤにも属していない状態であるため、bitbakeの対象にならない。 そこで、作業用のレイヤmeta-webcamを作成し、mjpg-streamer_git.bbを含めるようにする。

下記の手順で作成する。

$ cd $HOME/work/yocto/rpi/build_webcam
$ mkdir -p $HOME/work/yocto/rpi/poky/meta-webcam/conf
$ mkdir -p $HOME/work/yocto/rpi/poky/meta-webcam/recipes-multimedia/mjpg-streamer
$ mv ./mjpg-streamer_git.bb $HOME/work/yocto/rpi/poky/meta-webcam/recipes-multimedia/mjpg-streamer
$ cat << 'EOF' > $HOME/work/yocto/rpi/poky/meta-webcam/conf/layer.conf
# We have a conf and classes directory, append to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have a recipes directory containing .bb and .bbappend files, add to BBFILES
BBFILES += "${LAYERDIR}/recipes*/*/*.bb \
            ${LAYERDIR}/recipes*/*/*.bbappend"

BBFILE_COLLECTIONS += "webcam"
BBFILE_PATTERN_webcam := "^${LAYERDIR}/"
BBFILE_PRIORITY_webcam = "10"

LAYERDEPENDS_webcam = "core"
EOF

レイヤの構成は下記のツリーの様になる。

meta-webcam
├── conf
│   └── layer.conf
└── recipes-multimedia
    └── mjpg-streamer
        └── mjpg-streamer_git.bb

bblayers.conf

bblayers.confはbitbakeがビルド対象とするレイヤを定義する。

以下の手順で、bblayers.confの内容を置き換える。

$ cd $HOME/work/yocto/rpi/build_webcam
$ mv ./conf/bblayers.conf ./conf/bblayers.conf.bak
$ cat << 'EOF' > ./conf/bblayers.conf
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

LAYERSTOP = "${TOPDIR}/.."

BBLAYERS ?= " \
  ${LAYERSTOP}/poky/meta \
  ${LAYERSTOP}/poky/meta-poky \
  ${LAYERSTOP}/poky/meta-yocto-bsp \
  ${LAYERSTOP}/poky/meta-raspberrypi \
  ${LAYERSTOP}/poky/meta-webcam \
  "
EOF

local.conf

local.confは生成されたそのままの状態では、qemux86向けのイメージを作成するようになっているため、 raspberrypi向けのイメージが作成されるようにする。

コード 2 の内容をlocal.confの先頭の方に追加する。

コード 2: local.conf(抜粋)
MACHINE ?= "raspberrypi"
BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
GPU_MEM = "128"
DL_DIR ?= "${HOME}/work/yocto/downloads"

IMAGE_INSTALL_append = " mjpg-streamer"

bitbake実行

$ cd $HOME/work/yocto/rpi/build_webcam
$ bitbake mjpg-streamer

この時点でエラーが発生しなければ、ビルドまでは成功している。

以下の手順で結果を確認する。

$ cd tmp/work/arm1176jzfshf-vfp-poky-linux-gnueabi/mjpg-streamer/1.0+gitAUTOINC+2bd6f2c28d-r0/
$ tree ./image

treeの結果を以下に示す。

./image
└── usr
    ├── bin
    │   └── mjpg_streamer
    ├── lib
    │   └── mjpg-streamer
    │       ├── input_file.so
    │       ├── input_http.so
    │       ├── input_uvc.so
    │       ├── output_file.so
    │       ├── output_http.so
    │       ├── output_rtsp.so
    │       ├── output_udp.so
    │       └── output_viewer.so
    └── share
        └── mjpg-streamer
            └── www
                ├── JQuerySpinBtn.css
                ├── JQuerySpinBtn.js
                ├── LICENSE.txt
                ├── bodybg.gif
                ├── cambozola.jar
                ├── control.htm
                ├── example.jpg
                ├── favicon.ico
                ├── favicon.png
                ├── fix.css
                ├── functions.js
                ├── index.html
                ├── java.html
                ├── java_control.html
                ├── java_simple.html
                ├── javascript.html
                ├── javascript_motiondetection.html
                ├── javascript_simple.html
                ├── jquery.js
                ├── jquery.rotate.js
                ├── jquery.ui.core.min.js
                ├── jquery.ui.custom.css
                ├── jquery.ui.tabs.min.js
                ├── jquery.ui.widget.min.js
                ├── rotateicons.png
                ├── sidebarbg.gif
                ├── spinbtn_updn.gif
                ├── static.html
                ├── static_simple.html
                ├── stream.html
                ├── stream_simple.html
                ├── style.css
                └── videolan.html

無事にビルドおよび、ローカルへのインストールは成功している。 しかし、このままではOSイメージのRootFSへ反映されない。

インストールされたファイルをRootFSへ反映されるようにするためには、 レシピでFILES_${PN}を定義する。

また、bitbakeした時にLicense関連でエラーが発生しているので、GPLv2 UnknownからGPLv2に変更する。

それらの修正を行った、一応の完成版のmjpg-streamer_git.bbを lst:mjpg_streamer_git_bb に示す。

コード 3: mjpg-streamer\_git.bb(完成版)
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)
#
# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
#
# NOTE: multiple licenses have been detected; if that is correct you should separate
# these in the LICENSE value using & if the multiple licenses all apply, or | if there
# is a choice between the multiple licenses. If in doubt, check the accompanying
# documentation to determine which situation is applicable.
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://LICENSE;md5=751419260aa954499f7abaabaa882bbe \
                    file://www/LICENSE.txt;md5=713496289346a6c1c265f0e1f615ecd0"

SRC_URI = "git://github.com/jacksonliam/mjpg-streamer.git;protocol=https"

# Modify these as desired
PV = "1.0+git${SRCPV}"
SRCREV = "${AUTOREV}"

S = "${WORKDIR}/git/${BPN}-experimental"

# NOTE: unable to map the following CMake package dependencies: OpenCV Numpy Gphoto2
# NOTE: the following library dependencies are unknown, ignoring: v4l2
#       (this is based on recipes that have previously been built and packaged)
DEPENDS = "libjpeg-turbo libsdl"

inherit cmake python-dir

# Specify any options you want to pass to cmake using EXTRA_OECMAKE:
EXTRA_OECMAKE = ""

FILES_${PN} = "${bindir}/* \
           ${libdir}/* \
           ${datadir}/* \
           ${sysconfdir}* \
        "

イメージの作成

以下のコマンドを実行してOSイメージを作成する。

$ bitbake rpi-basic-image

イメージの書き込み

ddコマンドでrpi-basic-image-raspberrypi.rpi-sdimgをSDカードに書き込む。

sudo dd if=tmp/deploy/images/raspberrypi/rpi-basic-image-raspberrypi.rpi-sdimg of=/dev/sdb bs=40M

実行

UVCカメラを接続したraspberrypiをSDカードのイメージで起動する。

ログインしたあと、以下のコマンドでmjpg-streamerを実行する。

mjpg_streamer -i "input_uvc.so -y" -o "output_http.so -w /usr/share/mjpg-streamer/www"

ブラウザでhttp://XXX.XXX.XXX.XXX:8080/?action=streamにアクセスして、カメラの映像が表示されれば成功。

XXX.XXX.XXX.XXXはraspberrypiのIPアドレス