= Raspberry Pi 3B 向け TOPPERS/SSP カーネル = == これは何か Raspberry Pi 3B を対象にした TOPPERS/SSPカーネル実装です.実機および QEMU での動作を確認しています.[[BR]] 利用方法については [https://www.docker.com/ Docker] を用いた動作確認手順を示しますので,参考にしてください.[[BR]] == 動作確認に必要なもの * Docker : Docker上のコンテナ(仮想環境)を動かすために使います.Ubuntu cosmic(18.10) 以降のLinuxシステムをお使いの場合は手順2.のスクリプトだけを実行することもできます. * Git : Dockerのスクリプトを取得するのに使います. * コマンドライン環境:コマンドの実行にbashシェルを使います.Mac ならターミナルアプリ,Windowsなら MinGW など. == Dockerを用いた動作確認手順 以下では Linux の bashシェルで作業する際の様子を示します.他のホストOSで使用する場合もほぼ同様と思います. === 1. Dockerコンテナの構築およびシェルの起動 ==== (1-1) Dockerスクリプトの取得(カレントディレクトリに docker-toppers というディレクトリが作成される) {{{ $ git clone https://github.com/nmiri-nagoya-nsaito/docker-toppers.git Cloning into 'docker-toppers'... remote: Enumerating objects: 9, done. remote: Counting objects: 100% (9/9), done. remote: Compressing objects: 100% (9/9), done. remote: Total 122 (delta 0), reused 8 (delta 0), pack-reused 113 Receiving objects: 100% (122/122), 16.83 KiB | 3.37 MiB/s, done. Resolving deltas: 100% (46/46), done. }}} ==== (1-2) スクリプトのディレクトリへ移動し,コンテナのシェルを起動する(詳細はスクリプト参照) {{{ $ cd docker-toppers $ ./start_shell.sh ubuntu-focal specified service: ubuntu-focal Building ubuntu-focal Step 1/17 : FROM ubuntu:focal ---> 2a4d239ad3cc (中略) Step 17/17 : ENTRYPOINT ["sh", "-c", "./scripts/entrypoint.sh"] ---> Running in a889fa84e8da Removing intermediate container a889fa84e8da ---> 2c06a4aefc19 Successfully built 2c06a4aefc19 Successfully tagged ssprpi3b_ubuntu-focal:latest Creating network "ssprpi3b_default" with the default driver Creating ssprpi3b_ubuntu-focal_1 ... Creating ssprpi3b_ubuntu-focal_1 ... done saito@3b8b7cd91353:~$ }}} この時点で Linux コンテナ内のシェルが起動していますので,次はこの環境の中でSSPカーネルのソースコードをセットアップし,ビルドします. === 2. ソースコードのセットアップおよびビルド ==== (2-1) 作業ディレクトリへ移動 (dockerの設定にて ~/workdir ディレクトリをホストと共有している) {{{ saito@3b8b7cd91353:~$ cd workdir/ }}} ==== (2-2) 本パッケージをダウンロード {{{ saito@3b8b7cd91353:~/workdir$ svn co http://dev.toppers.jp/svn_user/contrib/ssp_rpi3/trunk ssp_rpi3 A ssp_rpi3/install.sh A ssp_rpi3/target A ssp_rpi3/target/rpi_arm64_gcc (中略) A ssp_rpi3/arch/arm64_gcc/common/core_timer.h A ssp_rpi3/build_ssp.sh Checked out revision 406. }}} ==== (2-3) SSPカーネルコードのセットアップ及びビルド * このスクリプトは$HOME/workdirが存在することを仮定. * dockerを使わずにスクリプトを実行する場合,カレントディレクトリに toppers_workdirというディレクトリが作成され,作業が継続される. {{{ saito@3b8b7cd91353:~/workdir$ ssp_rpi3/build_ssp.sh --2020-03-10 17:47:37-- https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-elf/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf.tar.xz releases.linaro.org (releases.linaro.org) をDNSに問いあわせています... 13.228.101.204 releases.linaro.org (releases.linaro.org)|13.228.101.204|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 Found (中略) aarch64-elf-gcc -O2 -Wall -g -Werror -ggdb3 -mgeneral-regs-only -fno-pic -fno-builtin -fno-omit-frame-pointer -mtune=cortex-a53 -mcpu=cortex-a53 -march=armv8-a -mlittle-endian -mstrict-align -DTOPPERS_OMIT_TECS -I. -I../include -I../arch -I../target/rpi_arm64_gcc -I../arch/arm64_gcc/bcm283x -I../arch/arm64_gcc/common -I.. -I../sample -I./gen -I../tecs_kernel -nostdlib -mcpu=cortex-a53 -Wl,-Ttext,0x00000000 -T ../target/rpi_arm64_gcc/rpi_arm64.ld -L. -o ssp \ start.o sample1.o log_output.o vasyslog.o chip_serial.o banner.o serial.o syslog.o logtask.o kernel_cfg.o \ -lkernel -lc -lgcc aarch64-elf-nm -n ssp > ssp.syms aarch64-elf-objcopy -O srec -S ssp ssp.srec ruby ../cfg/cfg.rb --pass 3 --kernel ssp -O -I. -I../include -I../arch -I../target/rpi_arm64_gcc -I../arch/arm64_gcc/bcm283x -I../arch/arm64_gcc/common -I.. -I../sample -I./gen -I../tecs_kernel -T ../target/rpi_arm64_gcc/target_check.trb \ --rom-symbol ssp.syms --rom-image ssp.srec configuration check passed }}} 以上が成功すると <カレントディレクトリ>/ssp/build/ に実行プログラムファイル(ssp)が生成されます. === 3. 実行確認 ==== 3.1 実機での実行確認 ===== 実行に必要なもの * Raspberry Pi 3B * マイクロSDカード(FAT32フォーマット済み) * USBシリアル変換ケーブル:シリアル側はTTL接続が可能なものを選びます(例えば TTL-232R-3V3 など) * シリアル端末アプリケーション (minicom など) ===== 確認手順 (3-1-1) 実行ファイル(ssp)を含めた,起動に必要な以下のファイルを,FAT32フォーマットされた マイクロSDカードのルート直下にコピーします. * bootcode.bin, start.elf 以下のURLから [https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin bootcode.bin] と [https://github.com/raspberrypi/firmware/raw/master/boot/start.elf start.elf] をダウンロード.[[BR]]https://github.com/raspberrypi/firmware/tree/master/boot * 実行ファイル 実行ファイルのバイナリイメージを使用. バイナリイメージの生成には {{{ make ssp.bin }}} を実行. {{{ # バイナリイメージの生成. ssp.bin というファイルが生成される. saito@20a9a0a8857c:~$ cd ~/workdir/ssp/build saito@20a9a0a8857c:~/workdir/ssp/build$ make ssp.bin aarch64-elf-objcopy -O binary -S ssp ssp.bin }}} ファイル名を kernel.img または kernel8.img にしてコピーしておくと電源投入時に自動的に読み込まれるようになります. * config.txt 起動設定を指定するためのテキストファイル. さしあたり,以下の3行を含むテキストファイルを作成すれば良い {{{ arm_control=0x200 kernel_old=1 disable_commandline_tags=1 }}} 実行ファイル名を kernel.img, kernel8.img 以外でコピーした場合は ファイルを指定するための行を追加 {{{ kernel=ssp.bin }}} config.txt の内容について詳しくは以下を参照 https://www.raspberrypi.org/documentation/configuration/config-txt/ (3-1-2) シリアルケーブルとPCを接続します. シリアルケーブルとRaspberry Pi との接続は[https://www.raspberrypi.org/documentation/usage/gpio/README.md Raspberry Pi のピン配置]を参考に接続します. 以下のピンを使用します. * Raspberry Pi の GPIO14(TXD1) * Raspberry Pi の GPIO15(RXD1) * GND (3-1-3) PCのシリアル端末エミュレータを起動します. 通信条件: 115200bps, データ8ビット長,パリティなし (3-1-4) マイクロSDカードをRaspberry Pi3のカードスロットに入れて起動します. ==== 3.2 QEMUでの実行確認 ==== (3-1) 実行開始 {{{ saito@3b8b7cd91353:~/workdir$ cd ssp/build/ saito@3b8b7cd91353:~/workdir/ssp/build$ qemu-system-aarch64 -M raspi3 -display none -serial stdio -kernel ssp TOPPERS/SSP Kernel 1.3.0 for RPI_ARM64 (Mar 10 2020 , 17:49:07) Copyright (C) 2010 by Meika Sugimoto Copyright (C) 2010 by Naoki Saito Nagoya Municipal Industrial Research Institute, JAPAN System logging task is started on port 1. Sample program starts. #act_tsk(1) task1 is running (001). | task1 is running (002). | task1 is running (003). | task1 is running (004). | }}} ==== (3-2) 実行終了 QEMUを終了するには,Ctrl-c を押します. {{{ # (Ctrl-c を押す) qemu-system-aarch64: terminating on signal 2 saito@3b8b7cd91353:~/workdir/ssp/build$ }}} コンテナのシェルを抜ける場合は exit を実行します. ==== (3-3) シェルを終了する {{{ saito@3b8b7cd91353:~/workdir/ssp/build$ exit ログアウト $ }}} 再度シェルを起動する場合は ./start_shell.sh を実行します. {{{ # 再度シェルを立ち上げる(引数を忘れない) $ ./start_shell.sh ubuntu-focal specified service: ubuntu-focal ssprpi3b_ubuntu-focal_1 is up-to-date saito@3b8b7cd91353:~$ }}} == 注意事項 * SSP-1.3.0 のパッケージに含まれるファイルの文字コードは EUC-JP でしたが,Ruby版コンフィギュレータを使用するために UTF-8 に変換しています.したがってファイルを追加,編集する場合は UTF-8 を使用してください. * Windows版のgitで core.autocrlf が true に設定されている場合,シェルスクリプトの実行に失敗することがあるようです.その場合は `git config` コマンドで `core.autocrlf` を `false` に設定してみてください. == 謝辞 本実装に関しては以下の実装を参考にさせていただきました.[[BR]] * [https://github.com/YujiToshinaga/RPi64Toppers Raspberry Pi 3の64bitモード向けFMPカーネル] * [https://github.com/takeharukato/asp3-aarch64 AArch64対応 TOPPERS/ASP3 カーネル] * ARMプロセッサ向けTOPPERS/ASPおよびASP3カーネル カーネルコードを提供してくださっているTOPPERSプロジェクトおよびその関係者に感謝します。