目次: GCC
目次: Linux
以前AArch64向けに開発環境を構築しました(その1、その2)。今回は流行りのRISC-Vに対して作成してみます。
全く違うアーキテクチャですが、AArch64向けと同じツール、ほぼ同じ手順が使えます。ツールを整備してくれた開発者の皆様には感謝の極みです。
さっと動かしてみたかったので、前回との変化点としてはbuildrootを使わず、busyboxのみの最小環境を作成しています。buildrootは後日チャレンジしたいと思います。
Crosstool-NGのct-ngのビルド方法は前回と全く同じ(2018年7月15日の日記を参照)なので、割愛します。
$ ./ct-ng menuconfig - Paths and misc options ---> [ ] Try features marked as EXPERIMENTAL 選択する - Target options ---> Target Architecture (alpha) ---> riscvに変更する [ ] Use the MMU 選択する Bitness: (32-bit) ---> 64-bitに変更する - Operating System ---> Target OS (bare-metal) ---> linuxに変更する - C-library ---> C library (musl) ---> glibcに変更する $ ./ct-ng build [00:34] /
設定もAArch64のときと大体同じですが、大きな違いはEXPERIMENTALを有効にする点です。通常はTarget Architectureの選択肢にRISC-Vが存在しません。
また、現時点だと32bit版はビルドエラーになるようなので、64bit版を選択しています。
AArch64のビルドとほぼ同じです。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git $ cd linux-next $ export ARCH=riscv $ export CROSS_COMPILE=riscv64-unknown-linux-gnu- $ make defconfig $ make all
ビルドが成功するとソースコードのトップディレクトリにvmlinuxが生成されるはずです。
AArch64ではqemuの -kernelオプションにImageファイルを渡せば起動しましたが、RISC-VではImageファイルを渡してもエラーになり起動しません。
調べてみると、qemuでRISC-V向けのLinuxを動作させるには、Imageではなくブートローダ付きのvmlinuxを渡してあげる必要があるみたいです。
$ git clone https://github.com/riscv/riscv-pk $ cd riscv-pk $ mkdir build $ cd build $ ../configure \ --enable-logo \ --host=riscv64-unknown-linux-gnu \ --with-payload=../linux-next-riscv/vmlinux $ make
成功するとbuildディレクトリの下にbblという名前のファイルができます。これがブートローダ+カーネルのバイナリです。bblはBerkeley Boot Loaderの略です。
このリポジトリの名前pkはProxy Kernelの略で、RISC-Vのプロセッサ開発を行う際に、周辺のハードウェアを作り込む代わりに、ホストのシステムコールを呼び便利な実行環境を提供するためのソフトウェアのようです。
プロキシカーネルに用事はないんですけど、付属品のブートローダに用事があります。
このriscv-pkはビルドシステムがちょっとイマイチで、buildディレクトリを作らずにconfigureやmakeをすると、ソースコードの入っているpkディレクトリが吹っ飛びます。ご注意ください……。
以前はbuildrootを使って全自動でinitramfsを生成してもらいましたが、今回は趣向を変えまして、手動でinitramfsを作ります。
$ git clone https://git.busybox.net/busybox $ cd busybox $ export CROSS_COMPILE=riscv64-unknown-linux-gnu- $ make menuconfig - Settings ---> [ ] Build static binary (no shared libs) (NEW) $ make
ビルドに成功するとbusyboxという実行ファイルが生成されるはずです。
次にinitramfsを作成します。基本的な流れはディレクトリに必要なファイルを配置し、cpioで固めるだけです。
$ mkdir initramfs-work-riscv $ mkdir initramfs-work-riscv/root $ cd initramfs-work-riscv/root $ mkdir bin $ cp ../../busybox/busybox bin/ $ ln -s busybox bin/sh $ ln -s bin/busybox init $ mkdir dev $ sudo cp -a /dev/tty* dev/ $ find . | cpio --format=newc -o > ../initramfs.cpio
本来はinit, sh以外のシンボリックリンクも作った方が良いです。このあと、qemuで動かしてみたらわかりますが、すごく不便です。/dev/ttyも横着してホストマシンのデバイスファイルをコピーするのではなく、mkdevで作るべきです。
が、しかし、美しいinitramfsは次回トライするbuildrootにお任せしましょう。今回は適当なまま行きます。
実行する設定はAArch64とは違います。qemuの引数は多すぎるし難しすぎるので、全く覚えられません。私の場合は、動かすたびにわからなくなるので、調べることが多いです。
$ qemu-system-riscv64 \ -machine virt \ -kernel riscv-pk/build/bbl \ -initrd initramfs-work-riscv/initramfs.cpio \ -serial stdio bbl loader vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvvvv rr rrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrr rrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrr rrrrrrrr vvvvvvvvvvvvvvvvvv rrrrrrrr rrrrrrrrrr vvvvvvvvvvvvvv rrrrrrrrrr rrrrrrrrrrrr vvvvvvvvvv rrrrrrrrrrrr rrrrrrrrrrrrrr vvvvvv rrrrrrrrrrrrrr rrrrrrrrrrrrrrrr vv rrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr INSTRUCTION SETS WANT TO BE FREE [ 0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000 [ 0.000000] No DTB passed to the kernel [ 0.000000] Linux version 5.0.0-rc7-next-20190225 (katsuhiro@blackbird) (gcc version 8.2.0 (crosstool-NG 1.23.0.610-db4fdf0)) #2 SMP Tue Feb 26 19:07:38 JST 2019 [ 0.000000] Initial ramdisk at: 0x(____ptrval____) (1691648 bytes) [ 0.000000] Zone ranges: [ 0.000000] DMA32 [mem 0x0000000080200000-0x0000000087ffffff] [ 0.000000] Normal empty [ 0.000000] Movable zone start for each node ... [ 0.346331] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver [ 0.348500] NET: Registered protocol family 17 [ 0.349051] Key type dns_resolver registered [ 0.370752] Freeing unused kernel memory: 192K [ 0.370952] This architecture does not have kernel memory protection. [ 0.371164] Run /init as init process can't run '/etc/init.d/rcS': No such file or directory Please press Enter to activate this console. / # ls -/bin/sh: ls: not found / # busybox uname -a Linux (none) 5.0.0-rc7-next-20190225 #2 SMP Tue Feb 26 19:07:38 JST 2019 riscv64 GNU/Linux
無事Linuxの起動画面を拝めました。良かった良かった。
現在住んでいる家には私の作業部屋がないので、リビングの食事するテーブルで、ROCKPro64などのボードとオシロスコープとノートPCを置いて波形を見ています。
リビングのテーブルは広くて色々置けるものの、食事するときは邪魔なので撤去する必要があります。場合によって機材や配線の再セットアップが発生するのが難点です。あと、水が掛かる可能性があり、精密機械(オシロスコープとか)を置くには適していない気がしますが、他に置く場所もありません。
最近は、作業の中断から再開までの時間を短縮するため、リモートで作業するようにしています。ノートPCはリモートアクセス端末として使い、メインPCにリモートアクセスして作業しています。ノートPCのネットワークを切ったり、シャットダウンしたりしても、メインPCの開発、解析の環境はそのまま保持されますから、すぐに作業に復帰できるという寸法です。
ソフトウェアの開発をするなら十分な環境ですが、ROCKPro64のUART出力を解析したときのようにオシロスコープが必要になってくると、リモートアクセスだけではうまくいきません。今のところ、オシロスコープを常用することはないので問題はありませんが、今後必要になったときはもう一工夫いりますね……。
目次: ROCK64/ROCKPro64
(主に俺のために)ROCKPro64のシリアル文字化けを直すべく、Rockchip RK3399のシリアルUART2のdrive strengthを3mAから12mAにするパッチをLKML(Linux Kernel Mailing List)に送ってみました。ま、ダメ元です。
ROCKPro64だけ何でこんなにRising timeが長くなるのでしょう?
Rockchip RK3328搭載のROCK64は、特に問題がないように見えます。ROCKPro64同様にROCK64もRK3328からPi-2コネクタに直で信号を出しているはずなのに。
RK3399の方がプロセス進んでるから、I/Oドライブ性能が低いのでしょうか。結局、問題の原因は良くわからないままです。
パッチを送ってから気づいたのですが、タイトルにRK3399向けのパッチと説明を忘れていたり、ROCKPro64しか確認できていない症状なのに、共通ファイルrk3399.dtsiに変更入れていたり、色々マズいです。そんなもんROCKPro64のデバイスツリーに入れてよ……、ってリジェクトされる気がします。
おそらく他のRK3399のボードもRK3399とUARTのピンを直結していれば、同じ症状が起きると思うんですが、私は他のボード持っていないからわかりません。
メモ: 技術系の話はFacebookから転記しておくことにした。加筆した。
目次: ROCK64/ROCKPro64
メンテナーのHeikoさんからは「共通部分を変えようとしているから、他のボードの関係者にも聞いてくれ」とのことでした。そりゃそうだなと、RK3399のボードのデバイスツリーを変えていそうな人達にCCでメールしてみたところ、お返事がきました。
Tonyさんは、ROC RK3399 PCとROCKPro64の2つのバージョン(V2.0とV2.1、私が持っているのはV2.1)など、色々なボードでの立ち上がり、立ち下がり時間の測定値を教えてくれました。いずれも私が観測しているような症状はないとのことです。
Robinさんは、アイパターンを見てくれて、やっぱり異常はないと教えてくれました。
念のため、ピンに何か繋いでいる(インピーダンスが低い、立ち上がり時間が遅く計測される)のか、何も繋いでいない(インピーダンスが高い、立ち上がり時間が速く計測される)のかも確認しましたが、UART-USB変換ボードをジャンパケーブルで繋いでいるとのことでした。
うーん。話を総合すると、どうも私のボードの個体不良っぽいです。パッチは取り下げておきました。やりとりは面白かったですが、結果的には皆さんを混乱させてしまっただけでしたね。
目次: ROCK64/ROCKPro64
ROCKPro64のシリアルUART2が文字化けする問題に決着がつきました。
LKML(Linux Kernel Mailing List)に生息するナイスガイ達のおかげで、自分が持っているROCKPro64だけが異常値を示していることがわかりました。皆、普通にオシロスコープ持っているみたいですし、アイパターンまで見ていた人もいて、LKMLすげーな……と感心しました。
私のボードは、おそらくどこかにハンダ不良があり、RK3399からUART2ピンまでの抵抗値が異常に高くなっていると推測されます。
テスターで抵抗値を見ればわかるはずですが、ROCKPro64はボードのシルクに部品番号が全く書いておらず、どこにプローブを当てたら良いかさっぱりわかりませんでした。残念。
メモ: 技術系の話はFacebookから転記しておくことにした。
せっかくHDMIディスプレイを買った(2019年2月2日の日記参照)ので、以前指摘されたRK3288のI2SとDMAがデグレしていないかどうか(2018年12月14日の日記参照)見るべく、linux-next + TinkerBoardのHDMI出力を確認しました。
映像は映り、音声も鳴りますが、48kHz ←→ 44kHzのLPCMを交互に再生すると、音声にバリバリとノイズが載ります。なぜかノイズが載らないときもあります。
ROCK64のアナログ出力でもこんな問題が起きていたので、同類だろうか?と不安になって、色々いじっていたのですが、どうも違う問題らしく、ディスプレイ側をON/OFFすると問題が発生するように見えます。
他のディスプレイで確認していないため、TinkerBoardが無罪とまでは言い切れませんが、おそらくディスプレイ側の問題でしょう。
< | 2019 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 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 | - | - |
合計:
本日: