faith's blog

気まぐれ日記

weston が動いた

まだ不完全な状態ではありますが、Jetson TK1 で weston が動きました。

Thierry Redding さんの kmscube への修正を weston にマージしてみたら、 デスクトップ画面は出ました。

ただし、weston-simple-egl が動きませんでした (Segmentation fault)

weston-simple-shm は動きました。

とりあえず、解析中です。

kmscubeが動いた (4)

手順メモは、(3)で終わりですが、続きです。

Jetson TK1の環境ではどうやら、Rendering(ligbm) と Display(libdrm) が別のデバイスファイルになっているようです。

調べてみたら、/dev/dri/cardX は card0 と card1 の二つあって、 card0 が tegra drm、card1 が nouveau drm のようです。

tegra drm の方に対して、modeprint を実行してみた場合は、 drm のリソース情報(connector, encoder, crtc, plane)がとれていましたが、 nouveau drm の方に対して実行した場合は、何もとれず、分けがわからないので nouveau drm ドライバをデバッグしてました。

たまたま、kmscube に対する Thierry Redding さんの修正内容を確認したところ、 コマンドライン引数が追加されていることに気づき、 試した見たら、うまくいったというわけで。

こんな仕様になっている意味はよくわかりません。

Tegra K1 には Host CPU(Cortex-A15)以外に、ARM7が載っていて、CPU間通信を行っていると思われますが、 そんなのは、OMAPでもやっているはずですが。

/人◕ ‿‿ ◕人\ < まったく、わけがわからないよ

そういった事情があるので、westonはそのままでは動かないようですが、挑戦してきます。

とりあえず、手順を載せてみましたが、現在日本に何台あるかわからないボードなので需要は・・・。

kmscubeが動いた (3)

kmscubeが動いた(2)の続きです。

kmscubeのビルド

ソースの取得

$ cd /path/to/l4t-root
$ pushd home/ubuntu/src
$ git clone git://gitorious.org/thierryreding/kmscube.git
$ popd

ビルド

$ sudo chroot .
chroot # su ubuntu

chroot $ cd ~/src/libdrm
chroot $ ./autogen.sh --prefix=/usr/local
chroot $ make
chroot $ sudo make install

Storage の準備

SDカードに boot.scr を、USB Flash に zImage, Device Tree, rootfs を置きます。

Kernelのバイナリをrootfsへコピー

$ cd /path/to/l4t-root
$ sudo cp -a $TEGRA_WORK/kernel/linux.tegra.thierry/arch/arm/boot/{zImage,dts/tegra124-jetson-tk1.dtb} boot
$ sudo cp -a $TEGRA_WORK/kernel/test-images/linux.tegra.thierry/lib/modules/3.15.0-rc8-next-20140603-ga7426b0 lib/modules

boot.scr を SD に置く

SD を挿入

$ sudo mount /dev/sdh1 ~/mnt

boot.txt を ~/mnt にコピーし、mkimage コマンドで boot.scr を作成

$ pushd ~/mnt
$ sudo mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Tegra Boot Script" -d boot.txt boot.scr
$ popd
$ sudo umount ~/mnt

boot.txt はこんな感じです。

usb start
load usb 0:1 ${kernel_addr_r} /boot/zImage
load usb 0:1 ${fdt_addr_r} /boot/tegra124-jetson-tk1.dtb
setenv bootargs console=ttyS0,115200n8 console=tty1 rw rootwait root=/dev/sda1
bootz ${kernel_addr_r} - ${fdt_addr_r}

USB Flash を 挿入し、rootfs をコピー

$ sudo mount /dev/sdh1 ~/mnt
$ sudo cp -a * ~/mnt
$ sudo umount ~/mnt

u-boot を起動

Jetson TK1 に先ほど作成した SD と USB Flash を挿入、 micro USB ケーブルで PC と接続し、電源を入れ、Force Recovery モードに入ります。 Force Recovery モードへの入り方は、Quick Start Guide(紙の方)に書かれています。

Force Recovery モードに入ったら、Linux PC 上で以下を実行すると、 u-boot が起動し、boot.scr が読み込まれカーネルが起動します。

$ cd $TEGRA_WORK/bootloader/tegra-uboot-flasher/scripts
$ sudo ./tegra-uboot-flasher exec jetson-tk1

exec の部分を flash に変更することで、bootloader を書き換えることが可能。 私のボードは、既にu-bootに変更済みです。

kmscube の実行

カーネルが起動したら、以下のコマンドで kmscube を実行

$ kmscube /dev/dri/card1 /dev/card/dri0

HDMI の画面上で立方体がくるくる回ります。

続きます。

kmscubeが動いた (2)

kmscubeが動いた(1)の続きです。

u-bootのビルド

github から tegra-uboot-flasher を、 gitorious から u-boot を取得し、ビルドしました。

ソースコードの取得

tegra-uboot-flasher は repo で取得します。

その中に、u-boot もありますが、denx のものなので、動きませんでした。

manifestを書き換えて、Thierry Redding さんのものを使います。

パッチは github にあげてあります。

$ mkdir -p ${TEGRA_WORK}/bootloader/tegra-uboot-flasher
$ cd ${TEGRA_WORK}/bootloader/tegra-uboot-flasher
$ repo init -u git://github.com/NVIDIA/tegra-uboot-flasher-manifests.git
$ patch -p0 < 001-tegra-uboot-flassher.patch
$ pushd .repo/manifests
$ wget https://raw.githubusercontent.com/faith0x7dc/patches/master/jetson-tk1/tegra-uboot-flasher/use-thierryredings-uboot.patch
$ patch < use-thierryredings-uboot.patch
$ git commit -a -m "change u-boot repository from denx to gitorious" 
$ popd
$ repo sync -j4

ビルド $ cd scripts $ ./build-tools $ ./build build

libdrmのビルド

ソースコードの取得

$ cd /path/to/l4t-root
$ pushd home/ubuntu/src
$ git clone git://gitorious.org/thierryreding/drm.git libdrm
$ popd

/path/to/l4t-root は Linux4Tegra の rootfs を置いた作業ディレクトリへのパスです。

ここに chroot して、コンパイルを実行し、後で USB Flash に書き込みます。

パッケージのインストール

$ sudo chroot . chroot # apt-get install libpthread-stubs0-dev chroot # su ubuntu

ビルド

chroot $ cd ~/src/libdrm
chroot $ ./autogen.sh --prefix=/usr/local --enable-udev --enable-libkms --enable-nouveau --enable-tegra-experimental-api --disable-intel --disable-radeon --disable-vmwgfx
chroot $ make
chroot $ sudo make install

mesaのビルド

結構時間がかかります。

Core i7 4701 の環境でも 小一時間かかったかと。

読書でもしながら待ちます。

ソースコードの取得

mesa をビルドするには、いろいろとパッケージのインストールが必要となりますが、

glproto と dri2proto だけは、apt-get で見つからないので、ソースコードを取得してインストールします。

$ cd /path/to/l4t-root
$ pushd home/ubuntu/src
$ git clone git://anongit.freedesktop.org/git/xorg/proto/glproto
$ git clone git://anongit.freedesktop.org/xorg/proto/dri2proto
$ git clone git://anongit.freedesktop.org/mesa/mesa
$ popd

パッケージのインストール

$ sudo chroot .
chroot # apt-get install xutils-dev python-libxml2 bison flex libxext-dev libxdamage-dev libxfixes-dev libx11-xcb-dev libxcb-glx0-dev libxcb-dri2-0-dev libxcb-sync0-dev libxcb-xfixes0-dev libudev-dev libexpat-dev
chroot # su ubuntu
chroot $ cd ~/src

glproto

chroot $ pushd glproto
chroot $ ./autogen.sh --prefix=/usr/local
chroot $ sudo make install
chroot $ popd

dri2proto

chroot $ pushd dri2proto
chroot $ ./autogen.sh --prefix=/usr/local
chroot $ sudo make install
chroot $ popd

mesa

chroot $ pushd mesa
chroot $ ./autogen.sh --prefix=/usr/local --enable-gles1 --enable-gles2 --with-egl-platforms=drm --enable-shared-glapi --enable-gbm --enable-gallium-gbm --enable-gallium-egl --with-dri-drivers=nouveau --with-gallium-drivers="nouveau" --disable-dri3
chroot $ make
chroot $ sudo make install
chroot $ popd

続きます。

kmscubeが動いた (1)

こんにちわ、faith です。

朗報です、kmscubeが動きました。

先日、Thierry Redding さんが kmscube を動かしたらしいという記事を書きましたが、 そのソースコードらしきものを知り合いに教えてもらったので、実際に動かしてみました。

動かすのに使った repository は以下です。

以下手順メモです。

Redmine からの適当な転記なので、体裁は気にしないでもらえると幸いです。

環境変数の設定

$ export TEGRA_WORK=/path/to/work
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export PATH=/path/to/cross-toolchain/bin:$PATH
  • /path/to/work
    • 作業ディレクトリへのパス
  • /path/to/cross-toolchain
    • クロスツールチェインへのパス
    • 私は、linaro の 4.8-2014.04 を使っています。

カーネルのビルド

ソースコードの取得

$ cd ${TEGRA_WORK}/kernel
$ git clone git://gitorious.org/thierryreding/linux.git linux.tegra.thierry

ビルド

$ cd linux.tegra.thierry
$ make tegra_defconfig
$ make -j8

$ export INSTALL_MOD_PATH=${TEGRA_WORK}/kernel/test-images/linux.tegra.thierry
$ mkdir -p ${INSTALL_MOD_PATH}
$ make modules_install

続きます。

Jetson TK1でkmscubeが動いたらしい

こんばんわ。

飲み会帰りの飲んだくれfaithです。

しかも私の隣には社長が座ってました。

こんなこと書いたら、完全に知り合いに特定されるけど、まぁいいか。

そもそも、出荷開始直後に、westonを動かす目的でJetson TK1を入手している日本人は1人しかいないだろうけど。

こいつ知り合いか?と思った人、正解です。

 

電車を待っている間に、ggってたら、↓こんなのみつけちゃいました。

http://www.phoronix.com/scan.php?page=news_item&px=MTcxMDk

 

phoronixの記事によると、Thierry Reding(nvidiaの人っぽい)という人がJetson TK1上でkmscubeを動かしたらしいです。

 

ということは、nvidia内部ではすでにDRMが動いているということですかね。

Linux 3.10に対するパッチとかは見つからなかったので(google+で共有したとあるんですが、どうやらmovieだけのようですね)、3.15で動かしたんですかね。

 

先日書いたとおり、私の手元ではlinux 3.15はまともに動かなかったので、nvidiaが内部で持っているものを入れれば動くとかそういうことなんでしょうか。

 

何にせよ、希望の光が見えてきました。

早く最新カーネルがJetson TK1で動かせるようにならないかなー。

 

とりあえず、↓のパッチはちゃんと動くっぽいので、

3.10へのバックポートをがんばってみようかと思います。

http://lists.freedesktop.org/archives/dri-devel/2014-May/058901.html

 

とりあえず、今日は疲れたので寝ます(寝れるかわからないですが)。

おやすみなさい。

zImageとdevice treeをSDカードから読み込みたかった・・・

nvidiaのbootloaderを使うと、zImageとdevice treeがSDから読めないので、カーネル更新毎にeMMCをすり減らす、という現状を改善すべく、hackを試みるも惨敗しました、

おはようございます(AM 2:00から4時間ぐらいtryしててテンションがおかしくなってきました)

 

tryした内容をざっくりと書きます。

 

* flash.shにzImageと偽ってu-bootのバイナリを渡す

昨日知り合いと話していて、出てきたideaです。

flash.shには、zImageのパスを教えてあげると、それをeMMCに書き込んで、bootloaderから参照するような仕組みになっています。

これがzImageだよ〜と言って、u-bootを渡すと、bootloaderは騙されてu-bootを起動する筈、と。

結果は、NG。たぶん、u-bootのバイナリ自体は読み込んでくれたと思うんですが、u-bootは起動せず。単純に特定の領域に展開して、jumpという訳ではないんでしょう。

また、zImage生成時と同様に、u-bootをobjcopyに喰わせた結果を用いても同様にNGでした。

 

* dummyのlinuxカーネルを渡す

linuxカーネルを修正して、start_kernel辺りにu-bootのデータをメモリ上に展開して、そこにjumpするコードを実装すれば、u-bootが起動するんじゃないかと思ったんですが、結果は全く動かず。

 

* eMMCにu-bootを書き込む

u-bootをUSB経由でのonRAM実行しているのがまずいのかと疑って、flash.shを使ってeMMCにu-bootを書いてみたところ、u-bootは起動しますが、USB経由と同様にカーネルが正常に起動しませんでした。

 

やはり、nvidiaのローダで実行している何らかの処理がu-bootに入っていないか、u-bootの実装がバグってて、カーネルの起動を邪魔しているかのどちらかっぽいですね。

 

これ以上、blackboxなbootloaderをhackするのは私程度のスキルでは難しいですね・・・

 

予備ボードがあるので、1台はeMMCを生贄に捧げて、がりがり書き換えることにしようかなぁ。

 

u-bootにせよ、linux kernelのDRM対応にせよ、そのうちgitに上がるだろうから、それを待ちながら、何か策を思いついたら、悪あがきすることにします。

Stephen Warrenさんに期待します。