MIPSfpga用にImagination Technologiesが提供するドキュメントは非常に優れており、Linuxの展開について詳しく説明しています。 ただし、これで使用されるチップで使用されるシステムは、ザイリンクス固有の周辺モジュールを使用して構築されます。 したがって、元の形式のアルテラFPGAを使用したデバッグボードでの繰り返しは不可能と思われます。 このソリューションは、プラットフォームに依存しない周辺機器を備えたMIPSfpga-plusチップシステムです。 この記事でLinuxを実行する方法について読んでください。
はじめに
すぐに、以下で説明するアクションの結果として得られた構成が理想からはほど遠いことに注意してください。 現時点では、外部メディアからのブートはなく、サポートされているデバイスの中で言及できるのはUARTとGPIOのみです。 したがって、MIPSfpga-plusシステムの開発に関するさらなる研究の前線は非常に広いようです。
さらに、読者は次のことを前提としています。
- ハリスとハリスの教科書の巻の主題領域に精通している[ L1 ];
- ソースコードMIPSfpga [ L2 ]およびmipsfpga-plus [ L3 ]にアクセスできます。
- SDRAM [ L5 ]およびUART [ L6 ]、およびリモートデバッグモード[ L4 ]でMIPSfpga-plusを構成および確認しました。
- Linux OS開発ツールの使用に関するいくつかのスキル、gitの経験、
この場合、次の構成が使用されます。
- ボード上にアルテラMAX10 FPGAおよび64MB SDRAMを搭載したTerasic DE10-Liteデバッグボード。
- デバッガーおよびUARTコンバーターとしてのPinboard IIボード。 MPSSEをサポートするFTDI USBチップを搭載した任意のボードを使用できます。そのような構成の例は[ L4 ]で説明されています。
- FPGA合成およびプログラミング用のWindows 7(x64)コンピューターおよびQuartus Prime 16.1。
- Ubuntu 17.04(x64)を使用して、ファイルシステムのカーネルとRAMイメージを構築する仮想マシン。
- インターネットアクセス
Linuxカーネルの魔法を真剣に深く掘り下げるつもりなら、資料[ L7 ]、特にプレゼンテーション[ L8 ]および[ L9 ]を読むことを強くお勧めします。
上記の要件がすべて満たされたら、始めましょう!
FPGAの構成とプログラミング
MIPSfpga-plus設定(mfp_ahb_lite_matrix_config.vhファイル)で、SDRAMおよびUARTを操作するための周辺モジュールとMPSSEを介したデバッグを有効にする必要があります-[ L4 ]で説明されているデバッグメカニズムを使用する場合:
`define MFP_USE_SDRAM_MEMORY `define MFP_USE_DUPLEX_UART `define MFP_USE_MPSSE_DEBUGGER
- Quartusを使用して、完全なMIPSfpga-plusアセンブリとFPGAプログラミング。
カーネルおよびRAMディスクアセンブリ
Linuxマシンでさらにステップを実行することを想定しています。
システムで利用可能なパッケージのリストを更新します。
sudo apt-get update
構成とアセンブリに必要なユーティリティとライブラリをインストールします。
sudo apt-get install -y build-essential git libncurses5-dev bc unzip
さらに作業が進むディレクトリを作成します:
mkdir ~/mipsfpga cd ~/mipsfpga
Imagination Technologies Webサイトからツールチェーンをダウンロードします。
wget http://codescape-mips-sdk.imgtec.com/components/toolchain/2016.05-06/Codescape.GNU.Tools.Package.2016.05-06.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz
ディレクトリを作成し、その中にダウンロードしたパッケージを展開します。
mkdir ~/mipsfpga/toolchain tar -xvf Codescape.GNU.Tools.Package.2016.05-06.for.MIPS.MTI.Linux.CentOS-5.x86_64.tar.gz -C ~/mipsfpga/toolchain
デプロイされた実行可能ファイルへのパスを$ PATH変数に書き込むことが望ましい(ただし、必須ではありません)。これにより、それらの作業が簡単になります。 たとえば、〜/ .profile
pathadd() { if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then PATH="$1${PATH:+":$PATH"}" fi } pathadd "$HOME/bin" pathadd "$HOME/.local/bin" pathadd "$HOME/mipsfpga/toolchain/mips-mti-linux-gnu/2016.05-06/bin"
Linuxカーネルを取得します。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git kernel
buildrootを取得します。これにより、ファイルシステムのRAMイメージが形成されます。
git clone git://git.buildroot.net/buildroot
MIPSfpga-plusでの展開に必要なbuildrootおよびLinuxパッチのディレクトリを作成します。
mkdir patches
パッチ[ L10 ]をダウンロードし、新しく作成したディレクトリに保存します。
buildrootでディレクトリに移動し、バージョン2017.05.1にロールバックします(f3d8beeb3694をコミットします):
cd buildroot git checkout 2017.05.1
buildrootにパッチを適用します。
git apply ../patches/MIPSfpga_buildroot.patch
buildrootを構成します。
make xilfpga_static_defconfig
必要に応じて、構成を変更します。
make menuconfig
ファイルシステムのRAMイメージのアセンブリを開始し、おいしいコーヒー(お茶、ビール、好きな人)を飲みに行きます。 このプロセスは非常に時間がかかります。
make
Linuxカーネルのあるディレクトリに移動し、ファイルシステムのRAMイメージが予想されるパスにあることを確認します(将来、カーネル構成で指定する必要があります)。
cd ../kernel/ ls -l ../buildroot/output/images/rootfs.cpio
バージョンv4.12.1にロールバック(コミットcb6621858813)、なぜなら パッチが形成されるのは彼女からです。
git checkout v4.12.1
パッチを適用します。
git apply ../patches/MIPSfpga_linux.patch
基本的なMIPSfpgaカーネル構成を適用します。
make ARCH=mips xilfpga_de10lite_defconfig
構成エディターを開始します。
make ARCH=mips menuconfig
- RAMディスクのサポートを有効にして、そのパスを指定します(以前にこのファイルの存在を確認しました)。
- 変更を保存し、グラフィカルコンフィギュレータを終了して、カーネルアセンブリを開始します。
make ARCH=mips CROSS_COMPILE=~/mipsfpga/toolchain/mips-mti-linux-gnu/2016.05-06/bin/mips-mti-linux-gnu-
カーネルをメモリにロードして起動する
- ハードウェアデバッガが接続されているマシンで、たとえば[ L4 ]で説明されているように、OpenOCDを実行します。
- 同じマシン(たとえばPuTTY)でターミナルを実行し、COMポート(速度115200)に接続します。
ビルドしていたLinuxコンピューターで、MIPSツールチェーンからgdbを実行します。 カーネルがアセンブルされたディレクトリにいると仮定します。
mips-mti-linux-gnu-gdb ./vmlinux
さらにアクションがgdbコンソールで実行されます。
ハードウェアデバッガを備えたマシンで実行されているOpenOCDに接続します。
(gdb) target remote 192.168..:3333
MIPSfpgaシステムをリセットします。
(gdb) mo reset halt
デバッガーにリトルエンディアンシステムを通知します。
(gdb) set endian little
カーネルイメージをメモリにロードします。
(gdb) load
カーネルを実行して実行します:
(gdb) continue
- すべてが正しく行われていれば、しばらくしてから以前に起動したターミナルで、次のようなダウンロードログが表示されます。 現在のカーネル構成の特性により、すぐには表示されませんが、少し遅れて表示されます。
Linux version 4.12.1+ (stas@ubuntu) (gcc version 4.9.2 (Codescape GNU Tools 2016.05-06 for MIPS MTI Linux) ) #1 Sat Jul 22 14:35:05 MSK 2017 CPU0 revision is: 00019e60 (MIPS M14KEc) MIPS: machine is terasic,de10lite Determined physical RAM map: memory: 04000000 @ 00000000 (usable) Initrd not found or empty - disabling initrd Primary instruction cache 4kB, VIPT, 2-way, linesize 16 bytes. Primary data cache 4kB, 2-way, VIPT, no aliases, linesize 16 bytes Zone ranges: Normal [mem 0x0000000000000000-0x0000000003ffffff] Movable zone start for each node Early memory node ranges node 0: [mem 0x0000000000000000-0x0000000003ffffff] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: console=ttyS0,115200 PID hash table entries: 256 (order: -2, 1024 bytes) Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 60512K/65536K available (1830K kernel code, 99K rwdata, 320K rodata, 944K init, 185K bss, 5024K reserved, 0K cma-reserved) NR_IRQS:8 clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 38225208935 ns sched_clock: 32 bits at 50MHz, resolution 20ns, wraps every 42949672950ns Console: colour dummy device 80x25 Calibrating delay loop... 10.81 BogoMIPS (lpj=21632) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) devtmpfs: initialized clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns futex hash table entries: 256 (order: -1, 3072 bytes) clocksource: Switched to clocksource MIPS random: fast init done workingset: timestamp_bits=30 max_order=14 bucket_order=0 Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled console [ttyS0] disabled b0400000.serial: ttyS0 at MMIO 0xb0401000 (irq = 0, base_baud = 3125000) is a 16550A console [ttyS0] enabled Freeing unused kernel memory: 944K This architecture does not have kernel memory protection. mount: mounting devpts on /dev/pts failed: No such device mount: mounting tmpfs on /dev/shm failed: Invalid argument mount: mounting tmpfs on /tmp failed: Invalid argument mount: mounting tmpfs on /run failed: Invalid argument Starting logging: OK Initializing random number generator... done. Starting network: ip: socket: Function not implemented ip: socket: Function not implemented FAIL Welcome to MIPSfpga mipsfpga login:
GPIOを使用する
Linuxの機能を使用して、使用可能な周辺機器を管理します(この記事の執筆時点では、これはGPIOですが、完全ではありません)。
GPIOドライバーがロードされ、デバイスが使用可能であることを確認します。
ls /sys/class/gpio/ export gpiochip480 unexport
ピンの利用可能な範囲を決定するために(ボード上のLEDは現在の構成で接続されています)、debugfsをマウントし、必要な情報を取得します。
mount -t debugfs none /sys/kernel/debug cat /sys/kernel/debug/gpio gpiochip0: GPIOs 480-511, parent: platform/bf800000.gpio, bf800000.gpio:
LED0をアクティブにします(現在の場合、gpio480):
echo 480 > /sys/class/gpio/export
出力モードに変換します:
echo out > /sys/class/gpio/gpio480/direction
それを高レベルに翻訳します:
echo 1 > /sys/class/gpio/gpio480/value
- すべてが正しく行われると、LED0が点灯します。
次は何ですか
説明されている構成は、実際には、LinuxをMIPSfpga-plusシステムに移植する最初の段階にすぎません。 システムを実際のタスクに正常に使用できるようにするために必要な作業には、次のものがあります。
- 既存の周辺機器のサポート:割り込みコントローラー、GPIO、アルテラADCのより完全なサポート。
- 現在欠落しているPWM、SPI(制限付き)、I2C、DDR、およびイーサネットを含むMIPSfpgaプラス周辺機器のサポート。
- 外部メディア(mmc / sdram)のサポートとそれらから起動する機能。
このため、現在の構成でエラー(バグ)が発生しても驚かないでください。まだ多くの作業があります。
謝辞
著者は、教科書のデビッド・ハリスとサラ・ハリスの「デジタル回路とコンピューター・アーキテクチャー」[ L1 ]の翻訳者チームに感謝します。
参照資料
[L1]- デジタル回路とコンピューターアーキテクチャ
[L2] -MIPSfpgaの使用を開始する方法 。
[L3] -githubのMIPSfpga-plusプロジェクト 。
[L4] -MIPSfpgaおよびインサーキットデバッグ 。
[L5] -MIPSfpgaおよびSDRAM。 パート1
[L6] -MIPSfpgaおよびUART ;
[L7]- 自由電子。 無料のトレーニング資料と会議プレゼンテーション 。
[L8]- 自由電子。 組み込みLinuxシステム開発コース 。
[L9]- 自由電子。 Linuxカーネルおよびドライバー開発コース 。
[L10] -MIPSfpga-plusでの展開に必要なbuildrootおよびLinux用のパッチ 。