今更ですが、メモしていなかった気がするので、Tinker Board(Rockchip RK3288 搭載)で HDMI Audio を有効にする方法です。
方法は簡単で Linux の CONFIG_DRM_DW_HDMI_I2S_AUDIO を有効にすれば良いです。5/3 時点の linux-next のツリーでは、make defconfig するとこのコンフィグは n で、ビルド対象外になっています。手動で下記の設定を有効にする必要があります。
$ make menuconfig Device Drivers ---> Graphics support ---> Display Interface Bridges ---> [*] Synopsys Designware I2S Audio interface
設定とビルドがうまく行くと、下記のように i2s-i2s-hifi というちょっと変わった名前のオーディオデバイスが見えるようになるはずです。
# cat /proc/asound/pcm 00-00: USB Audio : USB Audio : playback 1 : capture 1 00-01: USB Audio : USB Audio #1 : playback 1 : capture 1 00-02: USB Audio : USB Audio #2 : playback 1 01-00: ff890000.i2s-i2s-hifi i2s-hifi-0 : : playback 1
HDMI は画像と音声が一緒に転送されますから、本来は画像側のドライバも合わせて有効にする必要があるはずです。が、画像側のドライバは defconfig で y ないし m になるようで、特殊なカーネルコンフィグを使っている人以外は気にしなくて良いでしょう。
どうして音声系のドライバだけ defconfig からハブられているのか?については謎です。私は画像側のドライバと音声側のドライバ両方とも defconfig で有効にした方が良いのでは……と思いますが、何か理由があるのでしょう。
CONFIG_DRM_DW_HDMI_I2S_AUDIO は CODEC 側なので、CPU 側のコンフィグ CONFIG_SND_SOC_ROCKCHIP_I2S も紹介しておきます。とはいえ defconfig で有効になるようなので、これも通常は気にしなくて良いでしょう。
引き続き、超基本的な binutils + GCC + glibc の組み合わせのクロスビルド環境を作っています。やや苦戦したものの、ARM, AArch64, RISC-V 64 でビルドが通りました。良かった良かった。
残念ながら RISC-V 32 は glibc が対応しておらず、libc なしのベアメタル向けコンパイラしか作れませんでした。glibc does not yet support 32-bit systems と怒られます。glibc の代わりに newlib などを使えば、libc ありの Linux 向けコンパイラが作れるかもしれませんが、試していないのでわかりません。
昔作ったクロスコンパイラをビルドする Makefile(GitHub へのリンク)を改造して、作りました。
前回(その 1)検討した通り、本格的に運用するなら独自のビルドツールより crosstool-NG か buildroot に切り替えた方が良いと思います。
詳細は GitHub を見た方が良いですが、configure に指定しているオプションだけ、ざっと列挙しておきます。
CROSS_ARCH = riscv64-unknown-linux-gnu
TOP_DIR = `pwd`
CROSS_ROOT = $TOP_DIR/buildroot
PREFIX ?= $(CROSS_ROOT)
SYSROOT ?= $(CROSS_ROOT)/$(CROSS_ARCH)/sysroot
まず binutils は、
./configure \
--target=$(CROSS_ARCH) \
--prefix=$(CROSS_ROOT) \
--disable-nls \
--disable-static \
--disable-werror \
--with-lib-path=$(CROSS_ROOT)/lib \
--with-sysroot=$(CROSS_ROOT)
次に gcc は、
./configure \
--target=$(CROSS_ARCH) \
--prefix=$(PREFIX) \
--enable-languages=c \
--disable-libatomic \
--disable-libitm \
--disable-libgomp \
--disable-libmudflap \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libstdcxx-pch \
--enable-long-long \
--enable-lto \
--disable-multiarch \
--disable-multilib \
--disable-nls \
--disable-plugin \
--disable-shared \
--disable-threads \
--disable-__cxa_atexit \
--without-headers \
--with-local-prefix=$(SYSROOT) \
--with-sysroot=$(SYSROOT) \
--with-newlib
難関の glibc はこんな感じ、
./configure \
--host=$(CROSS_ARCH) \
--prefix=$(SYSROOT)/usr \
--disable-profile \
--disable-multilib \
--enable-add-ons \
--enable-kernel=3.0.0 \
--disable-multi-arch \
--enable-obsolete-rpc \
--with-binutils=$(PREFIX)/bin \
--with-headers=$(SYSROOT)/usr/include \
--with-sysroot=$(SYSROOT)
最後に glibc を動的リンク可能な gcc は、
./configure \
--target=$(CROSS_ARCH) \
--prefix=$(PREFIX) \
--enable-languages=c,c++,fortran \
--enable-libatomic \
--disable-libitm \
--enable-libgomp \
--enable-libmudflap \
--enable-libquadmath \
--disable-libsanitizer \
--enable-libssp \
--enable-libstdcxx-pch \
--enable-long-long \
--enable-lto \
--disable-multiarch \
--disable-multilib \
--enable-nls \
--enable-plugin \
--enable-shared \
--enable-threads=posix \
--enable-__cxa_atexit \
--with-local-prefix=$(SYSROOT)/usr \
--with-build-sysroot=$(SYSROOT) \
--with-sysroot=$(SYSROOT) \
--with-native-system-header-dir=/usr/include
この設定が正しいかどうか確証は持てませんが、printf を呼び出す C ソースコードをエラーなくビルド可能なコンパイラが作成できるので、良しとします。
色々引っかかったのですが、覚えている限りのエラーと自分が取った対策を列挙しておきます。
エラーメッセージだけ読むとさっぱりですが、config.log に記録されたテストプログラムとテスト結果によれば、pthread.h が見当たらないと言っているようです。
もちろん GCC の前に glibc のクロスビルドに成功しているので、pthread.h は存在しているものの、
これらの原因によって、pthread.h が見えなくなっていたようです。
ツールチェーン構築って大変です。実際に体験すると、crosstool-NG や buildroot のありがたさが身に沁みます。
先日(2019年 3月 27日の日記参照)クロスビルド向け LLVM のビルド方法がわかったので、今度はクロスビルド向け GCC のツールチェーン(超基本的な binutils + GCC + glibc の組み合わせ)を作ろうとしていますが、さっぱりうまくいかないです。
そもそもどのバージョンの組み合わせならビルドが通るのか全くわかりません……。対象となるクロス環境(ARM 向けなのか、RISC-V 向けなのか)と、ホスト側のコンパイラバージョンが影響するようで、昔ビルドが通っていた組み合わせを引っ張り出してきても、今の環境だとビルドが通らないなんてことがおきます。
ビルドできる組み合わせは頑張れば見つけられるとは思いますが、本来やりたいことはクロスビルド用のコンパイラのソースコードリポジトリをダウンロードし、自分でソースコードに何か変更を入れ、変更した内容も含めてビルドすることです(ダウンロードは最悪手動でも良いですけど)。
世の中にはクロスビルド用のツールチェーンを作成できるツールはいくつかありますが、いずれも tarball からのビルドを想定していて、改変を入れて再ビルドする方法が良くわかりません。
ツールが想定しているリリース用のビルドは、
開発用は、リリース用に加え、
が必要ですが、意外とできないです……。
いくつかツールを調べてみました。
ツールチェーン単体だと crosstool-NG ですし、将来的に追加するものを考えると buildroot が良さそうですけど。変更を反映して差分ビルドする方法ないのかな……??
合計:
本日:
< | 2019 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 | - |
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2016.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)