link 未来から過去へ表示(*)
link 過去から未来へ表示

link もっと前
   2019年 2月 26日 ---> 2019年 2月 17日
link もっと後

2019年 2月 26日

RISC-V 64 向け Linux 開発環境の構築

以前 AArch64 向けに開発環境を構築しました(その 1その 2)。今回は流行りの RISC-V に対して作成してみます。

全く違うアーキテクチャですが、AArch64 向けと同じツール、ほぼ同じ手順が使えます。ツールを整備してくれた開発者の皆様には感謝の極みです。

  • クロスコンパイラ: crosstool-NG
  • ブートローダ: riscv-pk
  • カーネル: linux-next
  • ルートファイルシステム: busybox + 手作業
  • エミュレータ: qemu

さっと動かしてみたかったので、前回との変化点としては buildroot を使わず、busybox のみの最小環境を作成しています。buildroot は後日チャレンジしたいと思います。

クロスコンパイラ

Crosstool-NG の ct-ng のビルド方法は前回と全く同じ(2018年 7月 15日の日記を参照)なので、割愛します。

crosstool-NG ビルド
$ ./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 のビルドとほぼ同じです。

linux-next コード取得、セットアップ、ビルド
$ 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 を渡してあげる必要があるみたいです。

ブートローダ riscv-pk コード取得、セットアップ、ビルド
$ 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 を作ります。

busybox コード取得、セットアップ、ビルド
$ 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 で固めるだけです。

initramfs 作成
$ 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 実行
$ 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 の起動画面を拝めました。良かった良かった。

編集者: すずき(更新: 2019年 2月 27日 01:32)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年 2月 20日

ROCKPro64 の HDMI Audio を有効にする

目次: ROCK64/ROCKPro64 - まとめリンク

RK3399 の Drive Strength 設定を Max にしたことで、文字化けだらけでポンコツ状態だった ROCKPro64 のシリアルが割とまともになったので、最近は ROCKPro64 を触っています。

どうも linux-next の ROCKPro64 のデバイスツリーは HDMI Audio を有効にするのを忘れている?ようで、HDMI から音が出ません。有効にするパッチを LMKL に投げつけておきました……といっても、たった 3行のパッチです。

動かしたら一瞬で気づくはずですが、誰も直さなかったのかなあ?

ROCK64 も ROCKPro64 も割と有名な部類のボードですが、Rockchip Linux じゃなくて、わざわざ linux-next で動かす人は少ないかもしれませんね。

メモ: 技術系の話は Facebook から転記しておくことにした。

編集者: すずき(更新: 2020年 10月 30日 01:03)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年 2月 19日

RISC-V のコンパイラ

Crosstool-NG は RISC-V に対応していないのかと思っていたら、Experimental オプション(CT_EXPERIMENTAL)を Y に設定したら RISC-V が選べるみたいです。

GCC のビルドは ARM 向けに昔チャレンジしましたが、結構面倒くさいので、コンパイラを含むツールチェーンを簡単にビルドできる Crosstool-NG の存在は非常にありがたいです。あとは LLVM にも対応してくれたら最高なんですけどね。

Experimental というだけあって RISC-V 32bit 用のコンパイラはビルドエラーになってしまって作成できません。RISC-V 64bit 用のコンパイラは作成できます。

作成したコンパイラで適当なコードをビルドして逆アセンブルを見ると、命令長が 32bit のものと、16bit のものが混在していました。そういえば ARM も ARM 命令と Thumb 命令の 2種類の命令長があります。最近は RISC でも命令長可変の仕様が流行りなんでしょうか?

メモ: 技術系の話は Facebook から転記しておくことにした。少し加筆。

編集者: すずき(更新: 2019年 2月 21日 00:46)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年 2月 18日

ROCKPro64 のシリアル文字化け - 回路図を見る

目次: ROCK64/ROCKPro64 - まとめリンク

ROCKPro64 のシリアル文字化けの原因は、RK3399 の端子ドライブ能力不足が原因である可能性は高そうですが、最大値の 12mA に設定しても立ち上がりが遅い(立ち下がり 50ns 以下に対し、立ち上がり 300ns 以上かかる)点が気になります。

SoC 以外に原因があるとすれば、ボードの回路くらいですが、回路となると門外漢も良いところで、確かめ方がわかりません。

ROCKPro64 の Schematics を素直に信じると、SoC の出力ピンが直接コネクタに接続されていて、抵抗も何もないように読めます。RK3399 は SoC 裏面がハンダ付けされている(BGA)ため、コネクタ〜SoC 端子間に、本当に抵抗や断線がないかどうかは確かめようがありません。

文字化けの頻度はかなり減ったので、今のままでもそれなりに使えますが、なぜ立ち上がりだけが異常に遅いのか、釈然としません。うーん……。

ドライバ観点からの ROCK64 や ROCKPro64 の使いやすさ

ROCK64 というか Rockchip RK3328 の HDMI ドライバは drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c です。このドライバは多くの処理を drivers/gpu/drm/bridge/synopsys/dw-hdmi.c つまり Synopsys DesignWare の HDMI IP 用のドライバに頼っています。

Synopsys の HDMI ドライバは映像出力と、音声出力の機能を持っています。映像側の作りは知りませんが、音声側は ASoC フレームワークに合わせて作られています。そのお陰で ROCK64 に HDMI 音声出力対応を追加するときは、デバイスツリーに記述を足すだけで良く、非常に楽でした。

Synopsys のドライバは linux-next に Upstream されていますが、コミットログを見る限り Synopsys のメールアドレスの人はあまり出現しません

社外の人や、会社と関係のない所属の人がわざわざドライバに修正をコミットしてくれるなんて、凄いことだと思います。人気のある IP のドライバを OSS にすると、色々な人が直してくれて、正のスパイラルが構築される、良い例と言えるでしょう。

この辺の根回しの良さは、さすが IP 屋さんの Synopsys って感じがしました。

メモ: 技術系の話は Facebook から転記しておくことにした。追記した。

編集者: すずき(更新: 2020年 10月 30日 00:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年 2月 17日

ROCKPro64 のシリアル文字化け - オシロスコープで解析

目次: ROCK64/ROCKPro64 - まとめリンク

以前(2018年 12月)に ROCKPro64 を購入したのですが、シリアルが文字化けして使い物にならず、ずっとお蔵入りになっていました。

最初はケーブルの接続や、接地がおかしいのかと思いましたが、GND 側はきっちり 0V でした。どうも単純な原因ではなさそうだったので、オシロスコープで信号を見ることにしました。テストパターンとして 0 と 1 が交互に出現し、一番転送が難しいパターンと思われる 0x55 'U' の文字を出力しています。

正常に出力できている ROCK64 と比較すると、ROCK64 は出力が 0 → 1 → 0 と変化する際に 0V → 3V → 0V のように電圧が振れますが、ROCKPro64 は、0V → 2.48V → 0V のように立ち上がり側が遅く、中途半端な電圧になっています。

下記の画像の青色の線が ROCK64 のシリアル出力で、オレンジ色の線が ROCKPro64 のシリアル出力です。どちらも 1秒ごとに 'U' を出力して、最初の立ち下がり(Start Bit、必ず 0)にトリガを掛けています。


ROCK64 のシリアル出力の波形


ROCKPro64 のシリアル出力の波形

ROCK64 は綺麗な波形ですが、ROCKPro64 は 0V → 3V への立ち上がりが間に合っていないことが分かるかと思います。

文字化けの原因ですけども、シリアルの転送速度(1.5Mbps、1ビット 666ns)に対し、0 → 1 の立ち上がりが遅すぎる(650ns くらい)からでしょう。出力側は 1 を送出しているつもりでも、信号が立ち上がるのが遅いため、受信側は 0 だと解釈してしまう場合があります。

転送速度を落とせば改善するかもしれません。しかし Rockchip の U-Boot はなぜか 1.5Mbps 固定で転送してくる困った奴で、下手にシリアルの転送速度を変えると U-Boot が操作できなくなり、非常に使いづらいのです。イマイチですね……。

ROCKPro64 のシリアル出力の文字化けを改善する

ROCKPro64 には Rockchip の RK3399 と言う SoC が搭載されていて、RK3399 は一部のピンの Drive Strength、つまりピンに流せる電流量を調整できます。決して特殊な機能ではなく、大抵の SoC が持つ普通の機能です。

ROCKPro64 がコネクタに引き出しているシリアルは UART2 です。UART2 は GPIO4_C4(TX)と GPIO4_C3(RX)というピンに割り当てられています。幸運なことに RK3399 ではこれらのピンの Drive Strength が変更できるので、設定値を振って(※)オシロで波形を見てみました。

下記の画像が測定結果です。1枚目はデフォルトかつ最小の 3mA、2枚目は最大の 12mA 設定です。出力している文字は前回同様 0x55 'U' で、トリガも前回同様 Start Bit の立ち下がりに仕掛けています。オシロの Rising, Falling Time 解析を ON にしたので、立ち上がり、立ち下がりに掛かった時間も一緒に表示されています。


Drive Strength = 3mA のときのシリアル出力波形


Drive Strength = 12mA のときのシリアル出力波形

字が若干見づらいので、一応書いておくと、立ち上がりの時間は 650ns → 300ns くらいに改善しました。良い感じですね。

ちなみにスクリーンショットの色が変で、文字が読みづらいのは仕様です。Tektronix さん、スクリーンショット背景の白黒反転処理、バグってますよ……??

それはさておき Drive Strength の変更で、ROCKPro64 のシリアル文字化けはかなり改善されました。しかし完全ではなく大量に出力した際に若干文字化けします。

さらなる改善のためには、シリアルの転送速度を落とすくらいしか思いつきません。が、U-Boot の書き換えをするのが面倒くさいので、また今度にします……。

(※)レジスタ名は GRF_GPIO4C_E で、アドレスは 0xff77e138 です。書き込む値は 0x03c00xx0 をお勧めします。xx の部分はドライブ能力を最小にするなら 00 で、最大にするなら 3c です。

メモ: 技術系の話は Facebook から転記しておくことにした。追記、文章の組み換えをした。

編集者: すずき(更新: 2020年 10月 30日 00:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2019年 2月 26日 ---> 2019年 2月 17日
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 1/18 20:33

カレンダー

<2019>
<<<02>>>
-----12
3456789
10111213141516
17181920212223
2425262728--

最近のコメント 5件

  • link 20年12月20日
    すずき 「パック旅行や旅行代理店に割り当てられた専...」
    (更新:12/21 19:00)
  • link 20年12月20日
    hdk 「羽田鹿児島便、ANA直接予約はほとんどし...」
    (更新:12/21 08:17)
  • link 20年09月10日
    すずき 「追加情報。最新の Debian Test...」
    (更新:10/07 16:48)
  • link 20年09月20日
    hdk 「最近は音楽聞く時やビデオ視聴時はミニコン...」
    (更新:09/24 21:43)
  • link 20年09月20日
    すずき 「ありゃー、同じ壊れ方ですね。\n新たなヘ...」
    (更新:09/24 00:23)

最近の記事 3件

link もっとみる
  • link 20年02月22日
    すずき 「[Zephyr を調べる - まとめリンク] 日記が増えすぎて、一...」
    (更新:01/18 20:33)
  • link 21年01月18日
    すずき 「[Debian Testing と Zephyr SDK その] ...」
    (更新:01/18 16:21)
  • link 21年01月17日
    すずき 「[Debian Testing と Zephyr SDK その] ...」
    (更新:01/18 16:21)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報