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
- Repository: https://github.com/Gnurou/weston.git
- Branch: gk20a
- Revision: 9bc5a8cbffb99e337fc1f1cc4ff82d575dd582cb
なお、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-eのEthernetカード スターテック.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に作成したものとして説明します。
- vfatパーティションへのコピー
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を書き換える必要がなくなりました。
何だこの無理ゲーは・・・
おはようございます、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周りまで降りてきたので、解析が進むんじゃないだろうかと思い・・・ たいですが、仕事してきます。