SlideShare uma empresa Scribd logo
1 de 17
wata2ki
 名前: wata2ki (watatuki)
◦ 元はハードウェアで画像処理をやっていましたが、現在は組
み込み屋をやっています
◦ 最近はJetson-TK1/TX1向けのアンオフィシャルYocto BSP
を作り、そのうえでディスクトップ環境や別ボード向けのディス
トロを動かして遊んでいます
◦ GitHub
 https://github.com/watatuki
 今日は、Jetson-TK1のOSSベースのBSPを作った時
のやりかたを説明します
 L.F.(Linux Foundation)のプロジェクトで、正式名称は
Yocto Project
◦ https://www.yoctoproject.org/
 Linuxのディストリビューションを作るのに必要なツー
ル・データを提供
◦ 最終的にはpokyという名前のリファレンスディストロとして提
供される
◦ OpenEmbedded(http://www.openembedded.org/)コミュニティ
由来のプロジェクトで、ツールも共同開発している
 GentooLinuxがクロスビルドになったようなもの
 bitbake
◦ Yoctoの根幹となるツールで、クロスビルド環境を提供してくれる
◦ ディストリビューションの構成するソフトのコンフィグやバージョンを
Recipeで管理する
 oe-core
◦ bitbakeで使うレシピのセットで、glibc, x.org, waylandからQtまで、様々
なOSSを標準でビルドできるようにしてくれる
◦ クロスビルド用のgccもoe-coreが提供してくれる
 リファレンスBSP
◦ pokyが標準でサポートしているボード向けのBSP
 Qemu, x86, x86-64, beagleboneなど
 LinuxのカーネルやU-boot, OpenGL(mesa)をそのボード向けの設定でビル
ドできるようにするレシピの形で提供される
 リファレンスBSPに関しては、少なくともビルドが通ることが確認されている
(はず。。。)
 Yoctoでは、自分の作りたいディストロをlayerを組み合
わせて構築する
自分の作りたいディストロ
meta (oe-core layer)
meta-yocto (yocto layer)
meta-jetson (BSP layer)
meta-mydistro (my layer)
標準Layer
meta-windowmng (layer)
BSP Layer
ターゲットボード用のカーネルや、ファーム
ウェア等
さらに追加したいコンポーネントが入っ
たLayerを積み上げる
今回はここの話
 Jetson-TK1でwayland環境を構築したい
◦ コンポーネントを一つ一つビルド・インストールして動かす環
境をNVIDIAが提供しているが、継続的に使えるようYoctoに
組み込みたい
 Kernelは、Upstream Kernel
 L4Tではなくnouveau/mesaベース
 L4TはX.orgのみでwaylandをサポートしていない
 使えるものは極力Yoctoのリリースに含まれるものを使う
 Jetson-TK1(最近はTX1も)向けのwayland環境を
NVIDIAがgithubで公開している
◦ https://github.com/NVIDIA/tegra-nouveau-rootfs
◦ Ubuntu14.04(ARM)のrootfsにパッチをあてたカーネル、nouveauや
mesaをビルド・インストールするスクリプトのセット
◦ westonのディスクトップシェルが動作するrootfsを作ってくれる
 ビルドが通れば…
これをベースにBSPを作成
 Yocto/OEのLayerは決まったファイルを置くだけ
◦ レイヤのスケルトンはyocto-layer create を使って作成
 Layerの設定が書かれたlayer.confを自動作成してくれる
 今回は、サンプルレシピの作成は行わない
◦ Layerディレクトリ名前はmeta-jetson
$ yocto-layer create jetson
Please enter the layer priority you'd like to use for the layer: [default: 6] 6
Would you like to have an example recipe created? (y/n) [default: n] n
Would you like to have an example bbappend file created? (y/n) [default: n] n
New layer created in meta-jetson.
Don't forget to add it to your BBLAYERS (for details see meta-jetsonREADME).
meta-jetson
├── COPYING.MIT
├── README
└── conf
└── layer.conf
 BSPを作る場合はmachine設定を新規に作成
◦ ARM/x86といったアーキテクチャの設定、最適化設定などを記載する
meta-jetson
├── README.md
└── conf
├── layer.conf
└── machine
└── jetson-tk1-upstream.conf
require conf/machine/include/tune-cortexa15.inc
DEFAULTTUNE = "cortexa15hf-neon"
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-upstream"
PREFERRED_PROVIDER_virtual/mesa ?= "mesa"
PREFERRED_PROVIDER_virtual/libgl ?= "mesa"
SERIAL_CONSOLE = "115200 ttyS0"
KERNEL_IMAGETYPE = "zImage"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += " 
bootconfig 
kernel-image 
kernel-devicetree 
linux-firmware-nvidia 
linux-firmware-rtl8168g 
kernel-modules 
libdrm-tegra 
libdrm-kms 
mesa-megadriver 
"
IMAGE_FSTYPES = "tar.bz2"
アーキテクチャ設定と、コンパイラの最適化オプション設定
TegraK1はCortex-A15なので、A15を設定
Kernelレシピを指定
Yoctoで用意されているカーネルは古いので、最新のカーネルを
使えるように独自のレシピを使うように設定
このmachine設定を選択した場合に強制的にインストールする
パッケージを指定
bootconfig : jetson-tk1でu-boot起動する設定ファイル
kernel-image : /boot にカーネル
kernel-devicetree : /boot にdtb
kernel-firmware-* : ファームウェア
kernel-modules : カーネルモジュール(nouveu等)
libdrm-* : libdrmのtegra用パッケージ
mesa-megadriver : mesaのドライバパッケージ(nouveau)
 ベースは別のカーネルレシピを流用
◦ TIのBSPから流用したファイルをベースに作成
 defconfigは、arch/arm/configsの下のファイル名を指定する
 カスタムコンフィグにしたい場合は、別途bbappendレシピを使って上書きすると、ディスト
ロごとにBSPレイヤを作り直さなくて済む
 Patchは必須ではないが、jetsonの場合はDTBでGPUを有効化したいので、そのため
のpatchを追加
◦ ベースのlinux-firmwareにnvidiaのファームウェアのパッケージがなかったので、
新規作成
 中の構成が頻繁にかわるためappendではなくカスタムレシピを作成。
 今回はnvidiaゆえに必要だっただけで、通常は作成しなくてよい
meta-jetson
├── README.md
├── conf
└── recipes-kernel
├── linux
├── linux-upstream
│ │ ├── defconfig
│ │ └── linux4.3_tegrak1_gpu_hdmi.patch
│ ├── linux-dtb.inc
│ ├── linux-upstream_4.7.bb
│ └── setup-defconfig.inc
└── linux-firmware
└── linux-firmware_git.bb
TIのレシピの流用品
パッチファイル(GPU有効化)
GPUとEtherファームのために作成したファームウェアレシピ
 カーネルレシピはほぼ定型文
◦ メンテ時は以下の個所しか変更していません
SECTION = "kernel"
DESCRIPTION = "Upstream Linux Kernel recipe."
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7"
KERNEL_IMAGETYPE = "zImage"
inherit kernel
require recipes-kernel/linux/linux-dtb.inc
require recipes-kernel/linux/setup-defconfig.inc
DEFAULT_PREFERENCE = "-1"
S = "${WORKDIR}/linux-4.5.2"
PR = "r2"
SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz 
file://linux4.3_tegrak1_gpu_hdmi.patch 
file://defconfig"
SRC_URI[md5sum] = "eae8f700463ea73185027caece5f1c5d"
SRC_URI[sha256sum] =
"e32339db8365f0f10b873928095da47dd3e8a40f8ea5edd5501320d4ff30209f"
KERNEL_DEVICETREE = "tegra124-jetson-tk1.dtb"
カーネルのソースを指定
gitにするとcloneがとんでもなく遅いので、tar.xzを使うようにしてい
るが、gitでとってくることも可能
カスタムカーネルを使用したい場合は、自宅のgitを指すようにする
Gitの場合は、
SRC_URI = “git://192.168.1.1/linux-omap.git;protocol=git”
SRCREV = "02a84e66b30a9c9e1c00112892f0226a71098753“
というように、SRC_URIを書いて、md5/shaハッシュではなくリビジョ
ンを指定する
カーネルレシピでは、解凍先のディレクトリを指定しないといけない
必要なdtbを指定。
SUMMARY = "libdrm Tegra K1 append recipe"
EXTRA_OECONF += " --enable-tegra-experimental-api 
"
PACKAGES =+ " ${PN}-tegra "
RRECOMMENDS_${PN}-drivers += " ${PN}-tegra "
FILES_${PN}-tegra = "${libdir}/libdrm_tegra.so.*"
 libdrmが必要だが、デフォルトのレシピではTegra用のビルドがされない
◦ libdrmのメインラインにTegraK1の対応が取り込まれているので、configureの設定を変更
してビルドされるようにする
◦ そのままではrpm(ipk/deb)パッケージが作られないので、その設定も追加する
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
EXTRA_OECONFにtegra用のconfigure
オプションを追加
bbappendレシピを作成
libdrm_tegraのパッケージを作るための記述
SUMMARY = "mesa nouveau append recipe"
PACKAGECONFIG_append = " gallium "
DIR3_FEATURES = "dri3proto presentproto "
DIR3_FEATURES += " ${@bb.utils.contains('DISTRO_FEATURES', 'x11',
'libxshmfence', '', d)} "
PACKAGECONFIG[dri3] = "--enable-dri3, --disable-dri3, ${DIR3_FEATURES} "
GALLIUMDRIVERS = "nouveau"
DRIDRIVERS_append = ",nouveau"
 mesaもlibdrmと同様にnouveauを有効化しないといけない
◦ Mesaはnouveauの不具合対応が頻繁に行われるため、bbレシピも追加
 実際は、コピーしてきてバージョンをかえただけ
 バージョンを変えただけだとビルドが通らない場合があるので、その時は内容も修正
◦ Tegra対応は分離したいので、nouveauを有効化する部分のみbbappendに切り出し
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
Mesaのベースレシピとbbappendレシピを追加
bbappendの内容は、nouveauを有効化するための記述のみ
galliumの有効化記述もあるが、nouveauを使うために連鎖的に有
効化が必要になっただけ
FILESEXTRAPATHS_prepend := "${THISDIR}/weston:"
SRC_URI += "file://0001-compositor-drm-Add-new-gbm-struct-to-allow-for-a-sep.patch 
file://0002-compositor-drm-Add-support-for-Tegra-Jetson-TK1.patch 
file://0003-Add-glFinish-to-DRM-backend-to-avoid-tearing.patch 
"
 nvidiaのwestonは、westonにパッチをあてているため、Yoctoのレシピで同じ
ようにパッチをあてる
◦ libdrm-tegraのためのパッチなので、nvidia以外では必要ないことも
◦ このパッチがwestonのバージョン依存で当たらなくなるため、ポーティングが結構
めんどくさい
meta-jetson
├── README.md
├── conf
├── recipes-graphics
│ ├── drm
│ │ └── libdrm_%.bbappend
│ ├── mesa
│ │ ├── mesa.inc
│ │ ├── mesa_11.0.9.bb
│ │ └── mesa_11.0.9.bbappend
│ └── wayland
│ ├── weston
│ └── weston_1.9.0.bbappend
└── recipes-kernel
Mesaのベースレシピとbbappendレシピを追加
bbappendの内容は、パッチディレクトリの指定と、パッチあての指
定のみ
#MACHINE ?= "beaglebone"
#MACHINE ?= "genericx86"
#MACHINE ?= "genericx86-64"
#MACHINE ?= "mpc8315e-rdb"
#MACHINE ?= "edgerouter"
#
# This sets the default machine to be qemux86 if no other
machine is selected:
MACHINE ??= "jetson-tk1-upstream“
 作ったBSPレイヤの使い方は簡単
◦ bblayers.confに作ったbspレイヤを参照する設定を追加
◦ local.confのMACHINE設定をstep2で作ったbspのconfファイルの名
前にする
meta-jetson
├── README.md
└── conf
├── layer.conf
└── machine
└── jetson-tk1-upstream.conf
あとはいつものようにbuildするだけ!!
 Yocto用のbspレイヤを作ってみた
◦ 今回はリファレンスボード用のbspを作成した
◦ 実際にこの実例が生きるのは、カスタムボード用のbspを作る場合
 想定ユースケース
 カスタムボード用に移植したカーネルを組み込みたい
 専用のファームウェアを組み込みたい
◦ 今回の実例はこちら参照
 https://github.com/watatuki/meta-jetson
 今回は省略しましたが、/bootの下にブートローダのコンフィグを組み込む
ようなレシピも実例にはあります
中華パッド用のカスタムbspとかいかがでしょうか?

Mais conteúdo relacionado

Mais procurados

Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Hiro H.
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなすonozaty
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020onozaty
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)Kentaro Ebisawa
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能Kohei Tokunaga
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Masahito Zembutsu
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までMasahito Zembutsu
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
Fontconfigことはじめ
FontconfigことはじめFontconfigことはじめ
FontconfigことはじめTakao Baba
 

Mais procurados (20)

ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
SSH力をつけよう
SSH力をつけようSSH力をつけよう
SSH力をつけよう
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなす
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
UnityとROSの連携について
UnityとROSの連携についてUnityとROSの連携について
UnityとROSの連携について
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
Fontconfigことはじめ
FontconfigことはじめFontconfigことはじめ
Fontconfigことはじめ
 

Semelhante a Yocto bspを作ってみた

Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jAkira Yoshiyama
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境Kazuhiro Nishiyama
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西Masahide Yamamoto
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くTetsuyuki Kobayashi
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたKazuhiro Nishiyama
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presenKouhei Maeda
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよnpsg
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on dockerHiroshi Miura
 
Firefox OS + Raspberry Pi
Firefox OS + Raspberry PiFirefox OS + Raspberry Pi
Firefox OS + Raspberry PiEnsekiTT
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1Kotaro Noyama
 

Semelhante a Yocto bspを作ってみた (20)

Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 j
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境GitLab + Dokku で作る CI/CD 環境
GitLab + Dokku で作る CI/CD 環境
 
第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西第一回コンテナ情報交換会@関西
第一回コンテナ情報交換会@関西
 
Linuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書くLinuxのユーザーランドをinitから全てまるごとgolangで書く
Linuxのユーザーランドをinitから全てまるごとgolangで書く
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみた
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
Lxc cf201207-presen
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
 
Capistrano
CapistranoCapistrano
Capistrano
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
ラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよラズパイ2で動く Docker PaaSを作ってみたよ
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
20170124 linux basic_1
20170124 linux basic_120170124 linux basic_1
20170124 linux basic_1
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 
Firefox OS + Raspberry Pi
Firefox OS + Raspberry PiFirefox OS + Raspberry Pi
Firefox OS + Raspberry Pi
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 

Mais de wata2ki

鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道wata2ki
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたwata2ki
 
YoctoLTSについて調べてみた
YoctoLTSについて調べてみたYoctoLTSについて調べてみた
YoctoLTSについて調べてみたwata2ki
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello worldwata2ki
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る wata2ki
 
Fireduck
FireduckFireduck
Fireduckwata2ki
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話wata2ki
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstreamwata2ki
 

Mais de wata2ki (8)

鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道鹿児島らぐハイブリッド開催への道
鹿児島らぐハイブリッド開催への道
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみた
 
YoctoLTSについて調べてみた
YoctoLTSについて調べてみたYoctoLTSについて調べてみた
YoctoLTSについて調べてみた
 
しょしんしゃのためのhello world
しょしんしゃのためのhello worldしょしんしゃのためのhello world
しょしんしゃのためのhello world
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
Fireduck
FireduckFireduck
Fireduck
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstream
 

Yocto bspを作ってみた

  • 2.  名前: wata2ki (watatuki) ◦ 元はハードウェアで画像処理をやっていましたが、現在は組 み込み屋をやっています ◦ 最近はJetson-TK1/TX1向けのアンオフィシャルYocto BSP を作り、そのうえでディスクトップ環境や別ボード向けのディス トロを動かして遊んでいます ◦ GitHub  https://github.com/watatuki
  • 4.  L.F.(Linux Foundation)のプロジェクトで、正式名称は Yocto Project ◦ https://www.yoctoproject.org/  Linuxのディストリビューションを作るのに必要なツー ル・データを提供 ◦ 最終的にはpokyという名前のリファレンスディストロとして提 供される ◦ OpenEmbedded(http://www.openembedded.org/)コミュニティ 由来のプロジェクトで、ツールも共同開発している  GentooLinuxがクロスビルドになったようなもの
  • 5.  bitbake ◦ Yoctoの根幹となるツールで、クロスビルド環境を提供してくれる ◦ ディストリビューションの構成するソフトのコンフィグやバージョンを Recipeで管理する  oe-core ◦ bitbakeで使うレシピのセットで、glibc, x.org, waylandからQtまで、様々 なOSSを標準でビルドできるようにしてくれる ◦ クロスビルド用のgccもoe-coreが提供してくれる  リファレンスBSP ◦ pokyが標準でサポートしているボード向けのBSP  Qemu, x86, x86-64, beagleboneなど  LinuxのカーネルやU-boot, OpenGL(mesa)をそのボード向けの設定でビル ドできるようにするレシピの形で提供される  リファレンスBSPに関しては、少なくともビルドが通ることが確認されている (はず。。。)
  • 6.  Yoctoでは、自分の作りたいディストロをlayerを組み合 わせて構築する 自分の作りたいディストロ meta (oe-core layer) meta-yocto (yocto layer) meta-jetson (BSP layer) meta-mydistro (my layer) 標準Layer meta-windowmng (layer) BSP Layer ターゲットボード用のカーネルや、ファーム ウェア等 さらに追加したいコンポーネントが入っ たLayerを積み上げる 今回はここの話
  • 7.  Jetson-TK1でwayland環境を構築したい ◦ コンポーネントを一つ一つビルド・インストールして動かす環 境をNVIDIAが提供しているが、継続的に使えるようYoctoに 組み込みたい  Kernelは、Upstream Kernel  L4Tではなくnouveau/mesaベース  L4TはX.orgのみでwaylandをサポートしていない  使えるものは極力Yoctoのリリースに含まれるものを使う
  • 8.  Jetson-TK1(最近はTX1も)向けのwayland環境を NVIDIAがgithubで公開している ◦ https://github.com/NVIDIA/tegra-nouveau-rootfs ◦ Ubuntu14.04(ARM)のrootfsにパッチをあてたカーネル、nouveauや mesaをビルド・インストールするスクリプトのセット ◦ westonのディスクトップシェルが動作するrootfsを作ってくれる  ビルドが通れば… これをベースにBSPを作成
  • 9.  Yocto/OEのLayerは決まったファイルを置くだけ ◦ レイヤのスケルトンはyocto-layer create を使って作成  Layerの設定が書かれたlayer.confを自動作成してくれる  今回は、サンプルレシピの作成は行わない ◦ Layerディレクトリ名前はmeta-jetson $ yocto-layer create jetson Please enter the layer priority you'd like to use for the layer: [default: 6] 6 Would you like to have an example recipe created? (y/n) [default: n] n Would you like to have an example bbappend file created? (y/n) [default: n] n New layer created in meta-jetson. Don't forget to add it to your BBLAYERS (for details see meta-jetsonREADME). meta-jetson ├── COPYING.MIT ├── README └── conf └── layer.conf
  • 10.  BSPを作る場合はmachine設定を新規に作成 ◦ ARM/x86といったアーキテクチャの設定、最適化設定などを記載する meta-jetson ├── README.md └── conf ├── layer.conf └── machine └── jetson-tk1-upstream.conf require conf/machine/include/tune-cortexa15.inc DEFAULTTUNE = "cortexa15hf-neon" PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg" PREFERRED_PROVIDER_virtual/kernel ?= "linux-upstream" PREFERRED_PROVIDER_virtual/mesa ?= "mesa" PREFERRED_PROVIDER_virtual/libgl ?= "mesa" SERIAL_CONSOLE = "115200 ttyS0" KERNEL_IMAGETYPE = "zImage" MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += " bootconfig kernel-image kernel-devicetree linux-firmware-nvidia linux-firmware-rtl8168g kernel-modules libdrm-tegra libdrm-kms mesa-megadriver " IMAGE_FSTYPES = "tar.bz2" アーキテクチャ設定と、コンパイラの最適化オプション設定 TegraK1はCortex-A15なので、A15を設定 Kernelレシピを指定 Yoctoで用意されているカーネルは古いので、最新のカーネルを 使えるように独自のレシピを使うように設定 このmachine設定を選択した場合に強制的にインストールする パッケージを指定 bootconfig : jetson-tk1でu-boot起動する設定ファイル kernel-image : /boot にカーネル kernel-devicetree : /boot にdtb kernel-firmware-* : ファームウェア kernel-modules : カーネルモジュール(nouveu等) libdrm-* : libdrmのtegra用パッケージ mesa-megadriver : mesaのドライバパッケージ(nouveau)
  • 11.  ベースは別のカーネルレシピを流用 ◦ TIのBSPから流用したファイルをベースに作成  defconfigは、arch/arm/configsの下のファイル名を指定する  カスタムコンフィグにしたい場合は、別途bbappendレシピを使って上書きすると、ディスト ロごとにBSPレイヤを作り直さなくて済む  Patchは必須ではないが、jetsonの場合はDTBでGPUを有効化したいので、そのため のpatchを追加 ◦ ベースのlinux-firmwareにnvidiaのファームウェアのパッケージがなかったので、 新規作成  中の構成が頻繁にかわるためappendではなくカスタムレシピを作成。  今回はnvidiaゆえに必要だっただけで、通常は作成しなくてよい meta-jetson ├── README.md ├── conf └── recipes-kernel ├── linux ├── linux-upstream │ │ ├── defconfig │ │ └── linux4.3_tegrak1_gpu_hdmi.patch │ ├── linux-dtb.inc │ ├── linux-upstream_4.7.bb │ └── setup-defconfig.inc └── linux-firmware └── linux-firmware_git.bb TIのレシピの流用品 パッチファイル(GPU有効化) GPUとEtherファームのために作成したファームウェアレシピ
  • 12.  カーネルレシピはほぼ定型文 ◦ メンテ時は以下の個所しか変更していません SECTION = "kernel" DESCRIPTION = "Upstream Linux Kernel recipe." LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" KERNEL_IMAGETYPE = "zImage" inherit kernel require recipes-kernel/linux/linux-dtb.inc require recipes-kernel/linux/setup-defconfig.inc DEFAULT_PREFERENCE = "-1" S = "${WORKDIR}/linux-4.5.2" PR = "r2" SRC_URI = "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz file://linux4.3_tegrak1_gpu_hdmi.patch file://defconfig" SRC_URI[md5sum] = "eae8f700463ea73185027caece5f1c5d" SRC_URI[sha256sum] = "e32339db8365f0f10b873928095da47dd3e8a40f8ea5edd5501320d4ff30209f" KERNEL_DEVICETREE = "tegra124-jetson-tk1.dtb" カーネルのソースを指定 gitにするとcloneがとんでもなく遅いので、tar.xzを使うようにしてい るが、gitでとってくることも可能 カスタムカーネルを使用したい場合は、自宅のgitを指すようにする Gitの場合は、 SRC_URI = “git://192.168.1.1/linux-omap.git;protocol=git” SRCREV = "02a84e66b30a9c9e1c00112892f0226a71098753“ というように、SRC_URIを書いて、md5/shaハッシュではなくリビジョ ンを指定する カーネルレシピでは、解凍先のディレクトリを指定しないといけない 必要なdtbを指定。
  • 13. SUMMARY = "libdrm Tegra K1 append recipe" EXTRA_OECONF += " --enable-tegra-experimental-api " PACKAGES =+ " ${PN}-tegra " RRECOMMENDS_${PN}-drivers += " ${PN}-tegra " FILES_${PN}-tegra = "${libdir}/libdrm_tegra.so.*"  libdrmが必要だが、デフォルトのレシピではTegra用のビルドがされない ◦ libdrmのメインラインにTegraK1の対応が取り込まれているので、configureの設定を変更 してビルドされるようにする ◦ そのままではrpm(ipk/deb)パッケージが作られないので、その設定も追加する meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel EXTRA_OECONFにtegra用のconfigure オプションを追加 bbappendレシピを作成 libdrm_tegraのパッケージを作るための記述
  • 14. SUMMARY = "mesa nouveau append recipe" PACKAGECONFIG_append = " gallium " DIR3_FEATURES = "dri3proto presentproto " DIR3_FEATURES += " ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libxshmfence', '', d)} " PACKAGECONFIG[dri3] = "--enable-dri3, --disable-dri3, ${DIR3_FEATURES} " GALLIUMDRIVERS = "nouveau" DRIDRIVERS_append = ",nouveau"  mesaもlibdrmと同様にnouveauを有効化しないといけない ◦ Mesaはnouveauの不具合対応が頻繁に行われるため、bbレシピも追加  実際は、コピーしてきてバージョンをかえただけ  バージョンを変えただけだとビルドが通らない場合があるので、その時は内容も修正 ◦ Tegra対応は分離したいので、nouveauを有効化する部分のみbbappendに切り出し meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel Mesaのベースレシピとbbappendレシピを追加 bbappendの内容は、nouveauを有効化するための記述のみ galliumの有効化記述もあるが、nouveauを使うために連鎖的に有 効化が必要になっただけ
  • 15. FILESEXTRAPATHS_prepend := "${THISDIR}/weston:" SRC_URI += "file://0001-compositor-drm-Add-new-gbm-struct-to-allow-for-a-sep.patch file://0002-compositor-drm-Add-support-for-Tegra-Jetson-TK1.patch file://0003-Add-glFinish-to-DRM-backend-to-avoid-tearing.patch "  nvidiaのwestonは、westonにパッチをあてているため、Yoctoのレシピで同じ ようにパッチをあてる ◦ libdrm-tegraのためのパッチなので、nvidia以外では必要ないことも ◦ このパッチがwestonのバージョン依存で当たらなくなるため、ポーティングが結構 めんどくさい meta-jetson ├── README.md ├── conf ├── recipes-graphics │ ├── drm │ │ └── libdrm_%.bbappend │ ├── mesa │ │ ├── mesa.inc │ │ ├── mesa_11.0.9.bb │ │ └── mesa_11.0.9.bbappend │ └── wayland │ ├── weston │ └── weston_1.9.0.bbappend └── recipes-kernel Mesaのベースレシピとbbappendレシピを追加 bbappendの内容は、パッチディレクトリの指定と、パッチあての指 定のみ
  • 16. #MACHINE ?= "beaglebone" #MACHINE ?= "genericx86" #MACHINE ?= "genericx86-64" #MACHINE ?= "mpc8315e-rdb" #MACHINE ?= "edgerouter" # # This sets the default machine to be qemux86 if no other machine is selected: MACHINE ??= "jetson-tk1-upstream“  作ったBSPレイヤの使い方は簡単 ◦ bblayers.confに作ったbspレイヤを参照する設定を追加 ◦ local.confのMACHINE設定をstep2で作ったbspのconfファイルの名 前にする meta-jetson ├── README.md └── conf ├── layer.conf └── machine └── jetson-tk1-upstream.conf あとはいつものようにbuildするだけ!!
  • 17.  Yocto用のbspレイヤを作ってみた ◦ 今回はリファレンスボード用のbspを作成した ◦ 実際にこの実例が生きるのは、カスタムボード用のbspを作る場合  想定ユースケース  カスタムボード用に移植したカーネルを組み込みたい  専用のファームウェアを組み込みたい ◦ 今回の実例はこちら参照  https://github.com/watatuki/meta-jetson  今回は省略しましたが、/bootの下にブートローダのコンフィグを組み込む ようなレシピも実例にはあります 中華パッド用のカスタムbspとかいかがでしょうか?