faith's blog

気まぐれ日記

Jetson TX1でWestonが動いた(不完全)

おはようございます。

Jetson TX1でWestonを動作させることに成功しました。

ただし、weston-simple-eglは未だ動いていません。

weston-simple-shmは動きましたが、weston-simple-eglを実行すると、以下のエラーで落ちます。

weston-simple-egl: clients/simple-egl.c:159: init_egl: Assertion `display->egl.dpy' failed.
Aborted (core dumped)

使用したソースは以下です。

  • wayland

    • Repository: git://anongit.freedesktop.org/wayland/wayland
    • Branch: master
    • Revision: 60024af597b68974c451c89f960a7c11de11c33a
  • libdrm

    • Repository: git://anongit.freedesktop.org/git/mesa/drm.git
    • Branch: master
    • Revision: ea78c17854ad1b9d155dab66c99777e513943083
  • dri2proto

    • Repository: git://anongit.freedesktop.org/git/xorg/proto/dri2proto
    • Branch: master
    • Revision: b118dfbf91dcec6d82dfddc3f41031e23ea3c039
  • glproto

    • Repository: git://anongit.freedesktop.org/git/xorg/proto/glproto
    • Branch: master
    • Revision: bd3d751e1eb17efb39f65093271bb4ac071aa9e0
  • mesa

    • Repository: git://anongit.freedesktop.org/mesa/mesa
    • Branch: master
    • Revision: 506b561ba7e3df2a7759dded684fae84bf459f65
  • libxkmcommon

    • Repository: git://github.com/xkbcommon/libxkbcommon
    • Branch: master
    • Revision: bea54b1f7db7a171b93cdfb272abc70a694df465
  • pixman

    • Repository: git://anongit.freedesktop.org/pixman
    • Branch: master
    • Revision: 7c6066b700c7cdd4aeb8be426b14b3a5f0de4b6c
  • cairo

    • Repository: git://anongit.freedesktop.org/cairo
    • Branch: master
    • Revision: 747cab741cf63f30aa6bc2b787fc13e7e7a2b859
  • libinput

    • Repository: git://anongit.freedesktop.org/wayland/libinput
    • Branch: master
    • Revision: 7a81ba9cc29fec09458f7870e203b83ae4ffb9de
  • weston

なお、Jetson TX1では、DRM deviceがTK1と若干ことなっているようで、以下のようになっていました。

/dev/dri/card0 -> 不明
/dev/dri/card1 -> tegra(DRM用; Display)
/dev/dri/card2 -> nouveau(GBM用; Render)

Jetson TK1対応のWestonに入っている既存処理がうまく動かなかったので、gbm用のDRM deviceを /dev/dri/card2 に固定する処理を追加して確認しています(とりあえずは)。

なんか2年ぐらい前に、TK1でWestonを立ち上げたときも、最初はsimple-eglが動かなかったなぁ・・・

クリーンビルドしてみた方が良いのかも。

Jetson TK1でEthernet外付けを試してみた

久しぶりの更新になります。

先日、Jetson TK1でEthernet外付けを試してみました。 ついでに、iperfを使って速度計測も実施しました。

計測結果

使用したデバイス

USB-Ethernetアダプタ
Logitec LAN-GTJU3
http://www.amazon.co.jp/gp/product/B00BJRU9IG

Mini PCI-eEthernetカード
スターテック.COM ST1000SMPEX
http://www.amazon.co.jp/gp/product/B006VCPB2S

なお、どちらもLinux for tegra R21.4のデフォルトカーネルでそのまま使用できました。

結果

直付けのPCI-Express
→ 934.2 Mbits/sec

USB-Ethernetアダプタ
→ 173.1 Mbits/sec

Mini PIC-eのEthernetカード
→ 930.4 Mbits/sec

USB-Ethernetアダプタについては、Macに接続して確認してみたところ以下の数値になりました。

897 Mbits/sec

このことから、アダプタ自体の性能は問題無いが、Jetson TK1のUSBコントローラまたはドライバに問題があると言えそうです。

【世界初】Jetson TK1でTizenを動かす【たぶん】

おはようございます、faithです。

先日、記事にしましたが、世界初!(たぶん)Jetson TK1でTizen-IVI 3.0-M3-June2014が動きました。

今日は、u-bootに引き続き、 Jetson TK1でTizen-IVI 3.0-M3-June2014を動かす方法について紹介します。

bootloaderはu-bootを使用します(その為に、先にu-bootの記事を書いたのです)

KernelはThierry Redding さんのを使用します。

TizenはWindowSystemがwayland/westonなので、DRMに対応していないと駄目なので、L4Tのカーネルでは動きません。

u-bootについては、先ほど書いた記事を参照。

Kernelについては、kmscubeの記事を参照。

rootfsはUSBの1stパーティションに置くので、 boot.scrを修正して、root=/dev/sda1に変更してください。

では、Tizenのビルド(パッケージビルド、rootfsの作成)、SDへの書き込みについて説明します。

ちょっと長いですが、ご了承下さい。

基本は、Wikiに書かれているIntel向けのビルド方法と同じです。

Tizenのソースコードとpre-built rpmをダウンロード

作業用ディレクトリの作成

$ mkdir ~/tizen_work
$ export TIZEN_WORK=~/tizen_work
$ mkdir -p ${TIZEN_WORK}/gbs/3.0-devel
$ export GBS_WORK=${TIZEN_WORK}/gbs
$ mkdir -p ${TIZEN_WORK}/mic
$ export MIC_WORK=${TIZEN_WORK}/mic

pre-built rpmをダウンロード

$ mkdir -p ${GBS_WORK}/3.0-devel/pre-built/armv7l
$ cd ${GBS_WORK}/3.0-devel/pre-built/armv7l
$ git clone review.tizen.org:/pre-built/toolchain-arm
$ pushd toolchain-arm
$ git checkout tizen
$ popd
$ lftp -e "mirror arm m3-june2014; bye" http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.2/tizen-3.0.m14.2-ivi_20140724.4/repos/

ソースコードのダウンロード

libdrm, mesa, westonをtegra用に修正する必要があるため、 ソースコードをダウンロードしてリビルドします。

$ mkdir -p ${GBS_WORK}/3.0-devel/platform/upstream

$ git clone review.tizen.org:/platform/upstream/libdrm.git
$ pushd libdrm
$ git checkout 739af7c5b39b2cab52472aa7b8f37a1f18d8e1a5
$ popd

$ git clone review.tizen.org:/platform/upstream/mesa.git
$ pushd mesa
$ git checkout 677942b9df39fd37863920bc426d4f2c22c744e3
$ popd

$ git clone review.tizen.org:/platform/upstream/weston.git
$ pushd weston
$ git checkout ef889d839bd5d21d43c5502ee0dd34f95274a085
$ popd

設定ファイルの作成

build.confをダウンロード

$ wget http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.2/tizen-3.0.m14.2-ivi_20140724.4/repos/arm/packages/repodata/b2c5ee761eb091eadab5da0791409364eca446a04aa0197c6a2ea9023a83ac71-build.conf.gz
$ gunzip b2c5ee761eb091eadab5da0791409364eca446a04aa0197c6a2ea9023a83ac71-build.conf.gz
$ mv b2c5ee761eb091eadab5da0791409364eca446a04aa0197c6a2ea9023a83ac71-build.conf build.conf

build.confを修正

tegra用のマクロを定義します。

修正例

--- build.conf.org  2014-07-31 21:47:51.636850521 +0900
+++ build.conf  2014-07-30 22:09:05.336529098 +0900
@@ -46,6 +46,12 @@
 %_with_wayland 1
 :Macros
 
+### Tegra
+%define _with_tegra 1
+Macros:
+%_with_tegra 1
+:Macros
+
 ############################# emulator repository ############################
 
 %if "%_repository" == "emulator"

.gbs.confを作成

ダウンロードした、pre-built rpmをrepositoryとして指定します。

[general]
tmpdir=/var/tmp/
profile = profile.tizen3.0_ivi
buildroot = ../GBS-ROOT/
work_dir = .

[repo.toolchain_armv7l]
url=${work_dir}/pre-built/armv7l/toolchain-arm

[repo.m3-june2014]
url=${work_dir}/pre-built/armv7l/m3-june2014

[profile.tizen3.0_ivi]
repos=repo.toolchain_armv7l,repo.m3-june2014
buildconf=build.conf

ソースコードの修正

修正内容は、githubに上げてあります。

libdrmの修正

ベースをThiery Reddingさんのgit repositoryからdrm.gitに変更し、specを修正します。

$ cd ${GBS_WORK}/3.0-devel/platform/upstream/libdrm
$ tar cf packaging.tar packaging

$ git remote add thierryreding git://gitorious.org/thierryreding/drm.git
$ git fetch thierryreding
$ git checkout thierryreding/master
$ git tag upstream/2.4.54

$ tar xf packaging.tar

$ wget https://raw.githubusercontent.com/faith0x7dc/patches/master/jetson-tk1/tizen-ivi/libdrm/001-add-tegra-support.patch
$ patch -p0 < 001-add-tegra-support.patch

mesaの修正

ベースをfreedesktopのmesa.gitに変更し、specを修正します。

$ cd ${GBS_WORK}/3.0-devel/platform/upstream/mesa
$ tar cf packaging.tar packaging

$ git remote add freedesktop git://anongit.freedesktop.org/mesa/mesa
$ git fetch freedesktop
$ git checkout freedesktop/master
$ git tag upstream/10.3.0

$ tar xf packaging.tar

$ wget https://raw.githubusercontent.com/faith0x7dc/patches/master/jetson-tk1/tizen-ivi/mesa/001-add-tegra-support.patch
$ patch -p0 < 001-add-tegra-support.patch

westonの修正

tegra対応の修正を加えます。

$ cd ${GBS_WORK}/3.0-devel/platform/upstream/weston
$ https://raw.githubusercontent.com/faith0x7dc/patches/master/jetson-tk1/tizen-ivi/weston/001-add-tegra-support.patch
$ patch -p0 < 001-add-tegra-support.patch

ビルド

gbsコマンドを使用して、ソースコードからrpmを作ります。

$ cd ${GBS_WORK}/3.0-devel
$ gbs -v -d lb -A armv7l -D build.conf --clean --exclude=libtool,libffi48,glibc,gcc,gcc48 platform/upstream/libdrm
$ gbs -v -d lb -A armv7l -D build.conf --clean --exclude=libtool,libffi48,glibc,gcc,gcc48 platform/upstream/mesa
$ gbs -v -d lb -A armv7l -D build.conf --clean --exclude=libtool,libffi48,glibc,gcc,gcc48 platform/upstream/weston

repositoryの作成

シンボリックリンクを張る

$ sudo mkdir /var/www/tizen
$ sudo chmod 777 /var/www/tizen
$ cd /var/www/tizen
$ ln -s ${GBS_WORK}/3.0-devel/pre-built/armv7l/m3-june2014/packages/armv7l
$ ln -s ${GBS_WORK}/3.0-devel/pre-built/armv7l/m3-june2014/debug
$ ln -s ${GBS_WORK}/3.0-devel/pre-built/armv7l/m3-june2014/packages/noarch
$ ln -s ${GBS_WORK}/GBS-ROOT/local/repos/tizen3.0_ivi/armv7l/RPMS

xmlをダウンロード

$ mkdir xmls
$ cd xmls
$ wget http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.2/tizen-3.0.m14.2-ivi_20140724.4/repos/arm/packages/repodata/group.xml
$ wget http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.2/tizen-3.0.m14.2-ivi_20140724.4/repos/arm/packages/repodata/patterns.xml

patterns.xmlの修正

ダウンロードしたものは、intel用(armのディレクトリにあるのに、intel用になっています)なので、 そのままだと、rootfs作成に失敗します。

以下のパッケージをpatterns.xmlから削除します。

  • libva-intel-driver
  • gstreamer-vaapi
  • openavb

repositoryを作成

$ cd /var/www/tizen
$ createrepo -v -g xmls/group.xml .
$ modifyrepo xmls/patterns.xml repodata

rootfsの作成

kickstarterファイルのダウンロード

armのディレクトリにあるのに、中身はintelと同じです。 (故に、milestoneリリースのimageはintel版しかありません)

とりあえず、ローカルにコピーして修正することにします。

$ cd ${MIC_WORK}
$ wget http://download.tizen.org/releases/milestone/tizen/ivi-3.0.m14.2/tizen-3.0.m14.2-ivi_20140724.4/builddata/images/arm/image-configurations/ivi-mbr-i586.ks
$ mv ivi-mbr-i586.ks ivi-armv7l.ks

kickstarterファイルの修正

repository指定箇所のパスを修正します。 (IPアドレスは適宜変更)

また、以下のパッケージはintelでしか使えないようになっているので、コメントアウトします。

  • kernel-x86-ivi
  • setup-extlinux
  • setup-ivi-clone
--- ivi-armv7l.ks.orig  2014-07-24 23:17:03.000000000 +0900
+++ ivi-armv7l.ks   2014-07-30 23:01:16.212540920 +0900
@@ -20,7 +20,7 @@
 
 installerfw_plugins "bootloader,fstab"
 
-repo --name=ivi --baseurl=https://download.tizen.org/snapshots/tizen/ivi-3.0.m14.2/@BUILD_ID@/repos/atom/packages/ 
+repo --name=ivi --baseurl=http://192.168.0.30/tizen.ivi/armv7l-partial --ssl_verify=no
 
 %packages
 
@@ -33,11 +33,13 @@
 @Console Tools
 @IVI Applications
 
-kernel-x86-ivi
+#kernel-x86-ivi
 
 ivi-repos
-setup-extlinux
-setup-ivi-clone
+#setup-extlinux
+#setup-ivi-clone
+
+weston-clients
 %end

rootfsの作成

micコマンドを使用してrootfsを作成します。

$ mkdir cache logs out
$ mic -v -d create fs -k cache -o out --release=test --logfile=logs/test.log ivi-armv7l.ks

rootfsの修正

micで作成したrootfsはそのままでは動きません。

カーネルモジュールのコピーと、一部ファイルの作成が必要です。

カーネルモジュールのコピー

Thierry Redding さんのカーネルをビルドし、カーネルモジュールを/lib/modules以下にコピーします。

/etc/mtabを作成

/etc/mtabは通常、/proc/self/mountsへのシンボリックリンクになっている必要がありますが、 micで作成したrootfsはそうなっていません。

その為、手動でシンボリックリンクを作成します。

$ cd /path/to/rootfs/etc
$ sudo ln -s /proc/self/mounts mtab

ksファイルには、その処理が記述されているんですが、なぜかちゃんと動いていないようです。 (intel版のpre-built imageではちゃんとリンクが張られている)

後は、rootfsをUSBメモリに書き込んで、ボードのUSBポートに指して電源を入れれば、起動します。

Jetson TK1でu-bootを使用する

おはようございます、faithです。

今日はJetson TK1でu-bootを使用する方法についてご紹介します。

L4T R19.3からu-bootが公式でサポートされるようになったようです。

ドキュメント類を見ても、具体的なコマンドとか書いてないんですが(見落としてなければ)、 基本は、fastboot(nVidiaプロプライエタリブートローダ)と同じです。

fastbootを使う場合との差分を中心に説明します。

今回は、SDにkernel, dtb, rootfsを置きます。 (eMMCにrootfsを置くことも可能なんでしょうが、 書き換え制限があるので、eMMCはなるべく書き換えたくないので。SDは壊れたら買い直せばいいし)

SDをパーティション切って、フォーマット

以下の2パーティション構成にします。

# fs 用途
1 vfat kernel, dtbを置く
2 ext3 rootfsを置く

容量は任意です。 私の場合は、vfatに256MB、ext3に残りを割り当てています。

rootfsを作成し、ファイルをSDにコピー

作成方法については、QuickStartGuideを参照。

以降、~/Linux_for_Tegra/rootfsに作成したものとして説明します。

zImageとdtbをコピーします。

$ sudo mount /dev/sdX1 ~/mnt
$ sudo cp ~/Linux_for_Tegra/kernel/zImage ~/mnt
$ sudo cp ~//Linux_for_Tegra/kernel/dtb/tegra124-pm375.dtb ~/mnt/tegra124-jetson-tk1.dtb
$ sudo umount ~/mnt

rootfsをコピーします。

$ sudo mount /dev/sdX2 ~/mnt
$ sudo cp -a ~/Linux_for_Tegra/rootfs/* ~/mnt
$ sudo umount ~/mnt

boot.scrをvfatパーティションに作成

vfatパーティションにboot.scrを置いておくと、 起動時に自動で読み込んで任意のコマンド列を実行させられます。

この仕組みを利用して、 自動的にzImage, dtbをロードし、カーネルをkickするようにします。

boot.txtを作成

以下の内容でtext fileを作成します。

load mmc 1:1 ${kernel_addr_r} zImage
load mmc 1:1 ${fdt_addr_r} tegra124-jetson-tk1.dtb
setenv bootargs console=ttyS0,115200n8 debug_uartport=lsport,3 console=tty1 rw rootwait root=/dev/mmcblk1p2
bootz ${kernel_addr_r} - ${fdt_addr_r}

root=/dev/mmcblk1p2の部分が、SDの2nd partitionにrootfsを置いている、 ということをカーネルに伝える記述になります。

ちなみに、この部分を/dev/sda1に書き換えると、 USBメモリの1stパーティションにrootfsを置くことも可能です。 (SATA HDDでも可な筈だけど、確認はしてません)

boot.scrを作成

mkimageコマンドを使って、boot.txtからboot.scrを作成します。

$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "jetson-tk1" -d boot.txt boot.scr

出来上がった、boot.scrをvfatパーティションにコピーします。

boot.txtはコピーする必要ありません。 (私は面倒なので、SDカード上で作業しています)

u-bootの書き込み

ボードを起動し、Force recoveryボタンを押して、recovery modeに入ります。 (詳細は、QuickStartGuide参照)

その後、host pc上でflash.shを実行しますが、fastbootを書き込む場合とパラメータが異なります。

以下を実行します。

$ cd ~/Linux_for_Tegra
$ sudo ./flash.sh -L ~/Linux_for_Tegra/bootloader/ardbeg/u-boot.bin jetson-tk1 mmcblk1p2

実行後、自動で再起動がかかり、u-bootからUbuntuが起動します。

SDカードを書き換えるだけで、 kernel, rootfsを自由に差し替えることができ、 eMMCを書き換える必要がなくなりました。

Tizen IVI 3.0 M3-June2014が動いた

おはようございます。

Tizen IVI 3.0の新しいMilestone releaseが気づいたら出ていたので、 Intel NUCとnVidia Jetson TK1で試してみました。

NUCでは動きませんでした。 どうやら、カーネル起動途中で死んでいるっぽいです。 カーネルをビルドし直してみるかなぁ・・・。

Jetson TK1では動きました。 とりあえず、simple-eglが動くのは確認しました。 crosswalkは動きませんでした。

後日、Jetson TK1でのTizen(M3-June2014)立ち上げについてまとめようと思います。

仕事してきます。

何だこの無理ゲーは・・・

おはようございます、crosswalkが動きません。 もう死んでんじゃないですかね(棒)

Tizen snapshotのrevisionが変わっていて、7系から8系にあがってました。 とりあえず、試してみたところ、死に場所が変わりました。 まぁ、死ぬんですけどね。

しかも、eglInitializeがこけるという。 そしてgdbは使えないと。

follow-fork-mode childに設定しても、プロセスが次から次へと生成されるので、ブレークポイント引っかからないし、 detach-on-fork offにすると、gdbが落ちるし(たぶんメモリの使い過ぎですね) ブレークをかけたいところに、sleepを仕込んで、attachしてみるも、attachには成功するが、ステップ実行できなかったり。

仕方なく、printfデバッグしてたら、printfを入れると挙動が変わると。 絶望した!デバッグできない巨大なソースに絶望した!

crosswalkはしばらくおいておこうかと思います。 revisionが変化するたびに、試して絶望する感じで。

あと、別件でfirefox on Tizen(intel NUC)に挑戦してましたが、こっちもだめでした。 ビルドはなんとか通りましたが、実行しても何も表示されない。 エラーメッセージもなし。 ・・・firefoxはやめておいた方がいいかと思います(独り言)

とりあえず、仕事してきます。

もう少しな気がするんです

おはようございます。

結局、この週末もcrosswalkと格闘でした。 惨敗ですけどね。

しかも、金曜にボーリング からの 飲み会で、 腕は痛いは、頭は痛いはで、結局土曜日は半日ぐらいぶっ倒れてましたから、 あまり進んでないんですよね・・・。

肉体は、強制的にHybernation(というか、Halt?)させたので、 休息にはなったかも?ということで良しとします。

で、本題ですが、 crosswalk for tegra Ubuntuは、ビルドが通ったんですけど、結局動かず。 Tizen と同じところでこけてる感じです。

Tizen の方は、Abortがかかっている箇所の意図が意味不明だったので、 とりあえず、コメントアウトしたら、先に進んで、セグりました。 (SIGSEGV=セグるって、方言なのかな)

void IMEStateChangeHandler::SetInstance(IMEStateChangeHandler* impl) {
  CHECK(!impl_) << "Replacing set IMEStateChangeHandler implementation.";
  impl_ = impl;
}

↑この、CHECKマクロが意味不明で、引数がfalseだと、Abortします。 しかし、メンバ変数implは初期値NULLなので、最初にSetInstanceした時点で、Abortするんです。 がついているのが間違いかと(引数のチェックをするつもりかと)おもって、修正してみたら、 もっと早いタイミングでAbort。

・・・意味がわかりません!

何なんでしょうか、Intel版ではここでAbortで止まったなんてことはないので、 ここに処理がきた時点でアウトなんでしょうか。 後で何か問題があるかもしれませんが、そんなことは未来の私が何とかするので、良しとします。

ということで、とりあえず外してみたら、以下の箇所でセグりました。

void WaylandWindow::RealizeAcceleratedWidget() {
  if (!shell_surface_) {
    LOG(ERROR) << "Shell type not set. Setting it to TopLevel";
    SetShellAttributes(TOPLEVEL);
  }

  if (!window_)
    window_ = new EGLWindow(shell_surface_->GetWLSurface(),
                            allocation_.width(),
                            allocation_.height());
}

thisポインタがNULLらしいです。 メモリ破壊って訳じゃなく、

window->RealizeAcceleratedWidget();

を実行したときに、windowがNULLだった場合、 thisポインタにアクセスしたときに初めてセグるらしいですね。 初めて知りました。

pythonのselfみたいなものでしょうか。

Wayland周りまで降りてきたので、解析が進むんじゃないだろうかと思い・・・ たいですが、仕事してきます。