
Terasicは最近 、非常に興味深いDE0-Nano-SoCキットの販売を開始しました。 非常に手頃な価格で、統合されたデュアルコアARM Cortex-A9プロセッサを備えたアルテラCyclone V SoC FPGAチップに基づく非常に強力で機能豊富な開発者キットが提供されるという点で興味深いです。 さらに、ボードを完成させたメーカーは、MicroSDメモリカードに展開されるLinuxを提供しています。
しかし、このボードを自由に使用できるようになったとき、LinuxはYocto Projectのソースからコンパイルされていたため、すぐにいくつかの問題に遭遇しました。 基本的に、すべての問題は、不足しているコンポーネントをシステムに追加できるパブリックリポジトリの不足に関連していました。 たとえば、ネットワーク経由でこのデバイスからWindowsサーバーの共有リソースにアクセスするために、カーネルにはCifsファイルシステムサポートモジュールがありませんでした。
したがって、まず、カーネルを更新し、Yoctoをより使い慣れたDebian Wheezyに置き換え、Windowsサーバーの共有リソースにアクセスするために必要なすべてを再インストールすることにしました。
組み立てプロセスは私によって研究され、 この記事の推奨に従って実行されました。著者のDes333に感謝します。
完全な変更は私の計画に含まれていなかったため、ボードに付属のLinux 3.13イメージから、ブートローダーをカードに残すことにしました。 タイプA2のセクションでは、まったく触れないことにしました。
タスク
- Linuxカーネルを更新する
- RootFSをDebian 7に置き換えます
- インターネットから更新できるように画像を調整します
- Windowsサーバーで共有されているディレクトリをマウントする
カーネルアセンブリ
私の人生の主な作業環境はWindowsであるため、Linuxを構築するためのすべての手順は、仮想マシンにインストールされたLinux Mint 17.2 Cinnamon OSから実行されました。
1.ターミナルを起動してルートモードに入ります-毎回sudoコマンドを入力しないようにします。
sudo -i
この場合、/ rootがホームディレクトリになります-その中のすべてを行います。
2.アルテラSoCエンベデッドデザインスイート(EDS)パッケージに含まれるクロスコンパイラを使用して、カーネルをコンパイルします。 したがって、最新のアルテラSoC EDSパッケージをダウンロードしてインストールしてください。 アルテラSoC EDSは現在バージョン15.0です。 このパッケージは、アルテラのWebサイトから直接ダウンロードできます。
アルテラSoC EDSは、/ root / altera / 15.0ディレクトリにインストールされます。
3. build-essentialをインストールします。
apt-get install build-essential
4. libncursesをインストールします。
apt-get install libncurses5-dev
5.アルテラリポジトリからlinux-socfpgaソースをダウンロードし、ホームディレクトリに展開します。
- アルテラリポジトリのlinux-socfpgaリリースに移動
- 必要なリリースを見つけます。 バージョン4.1を選択しました-現時点では最新の安定バージョンであるためです
- ソース付きのアーカイブをダウンロードする
- ソースをホームディレクトリに解凍します
その結果、Linuxカーネルバージョン4.1のソースコードを含むディレクトリ/root/linux-socfpga-4.1が表示されます。
修正 (2016年2月11日):
マスターではなくタグではなくsocfpga- * brandiesを使用する必要があります 。したがって、ソースについては、 ここにアクセスする必要があります 。 ヒントについてはDes333に感謝します!
たとえば、 socpfga-4.3
これは、必要なSoC機能を備えたパッチが適用される場所です。
6. Alterスクリプトを実行します。これにより、新しいBASHが起動され、その中のいくつかの環境変数(PATHなど)が修正されます。 このBASHを離れることなく、すべてのコンパイルアクションを実行します。
cd /root/altera/15.0/embedded ./embedded_command_shell.sh
7.いくつかの環境変数を作成します。
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000
8. socfpgaのデフォルト構成を作成します。
cd /root/linux-socfpga-4.1 make socfpga_defconfig
これにより、ARMでのコンパイル用にシャープ化された.config構成ファイルが作成されます。
9.不足しているコンポーネントをカーネル構成に追加します(または余分なコンポーネントを削除します)。
make menuconfig
これにより、メニューのある擬似グラフィックウィンドウが開きます。

共有ネットワークリソースにアクセスできるようにするために、 CIFSファイルシステムドライバーを追加する必要があります。 システムにドライバーを追加するには、カーネルに直接追加する方法と外部プラグインとして追加する方法の2つがあります。
パスファイルシステム->ネットワークファイルシステムに沿って進み、 CIFSサポートに立ち、スペースバーを押します-文字MはCIFSサポートポートの反対側に表示されます-つまり、プラグイン外部モジュールが使用されます。 後で個別にコンパイルし、外部モジュールのディレクトリに配置する必要があります。 もう一度スペースバーを押すと、文字Mがアスタリスク記号に変わります。これは、ドライバーがカーネルに直接組み込まれることを意味します。
注 :後で、システムの操作性を確認すると、共有Windowsサーバーディスクからファイルをコピーしようとすると、外部cifsモジュールがクラッシュすることが判明しました。 カーネルに組み込まれたcifsドライバーは完璧に機能しました。 他のバージョンのカーネル(3.19など)で外部モジュールを使用する場合、このような問題は発生しませんでした。 私は何が起こったのか理由を見つけることができませんでした。
また、 HighMemサポートを有効にする必要があります。有効にしないと、システムは256 MBのRAMを使用できません。 これを行うには、 Kernel Features-> High Memory Supportのパスに沿って移動し、スペースバーを押します。
メニューを終了します-終了するまでEXITを押します。 質問に対して-設定を保存する必要がありますか- はいと答えます。
10.カーネルをコンパイルします。
make uImage
私の場合、仮想マシンに与えられたコアは1つだけでした。 コンパイルプロセスには約20分かかりました。 複数のコアを備えたマシンでコンパイルを実行する場合、速度を上げるために、コンパイルプロセスを複数のコアに並列化することができます。 これを行うには、 -jオプションを使用してコアの数を明示的に設定する必要があります。 たとえば、3つのコアの力によるコンパイルの場合:
make -j 3 uImage
11.デバイスに対応するdtbファイルをコンパイルします。 古いdtbファイルを使用すると、起動時にデバイスがハングするか、作業中にひどいグリッチが発生します。
- cyclone5という名前で、末尾がdtsのすべてのファイルを探しています。
find ~/linux-socfpga-4.1 -name "*cyclone5*dts"
- 最も適切なファイルを選択します。 私は彼らの内容をただ見ただけで、そのうちの1つでテラシックという言葉を見ました。 これがこのデバイスに最も適したファイルだと思いました-それが私がそれを使用した理由です。 ファイルはsocfpga_cyclone5_sockit.dtsと呼ばれていました 。
- socfpga_cyclone5_sockit.dtbのコンパイルを開始します。
make socfpga_cyclone5_sockit.dtb
コンパイルの結果、次の2つのファイルが作成されました。
/root/linux-socfpga-4.1/arch/arm/boot/zImage /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb
12.構成段階で外部モジュールを使用するオプションを選択した場合は、それらをコンパイルする必要があります。
CIFSモジュールのコンパイル:
make M=fs/cifs
暗号化モジュールのコンパイル-共有Windowsリソースをマウントするときに必要になります。
make M=crypto
13.カーネルとdtbファイルをカードにコピーします。 最初に、カーネルとDTBファイルが別のFAT32パーティションに置かれるように、カードがカットされました。 これらのファイルを書き込みます。 唯一の注意:DTBファイルの名前を変更する必要があります-そのため、カードのFAT32セクションに既にあるものと同じ名前が付けられます。
- カードを仮想マシンに接続します。 コンピューターのUSB2ポートに直接接続された外部カードリーダーを使用する必要がありました。 何らかの理由で、コンピューターに組み込まれたカードリーダーを使用して同じことを行うことはできませんでした。 また、外部のカードリーダーをUSB3ポート経由で接続した場合、仮想マシンに接続することはできませんでした。
- カードセクションは自動的にマウントされます。この場合、カードリーダーは仮想マシンから完全に切断されているため、GUIからセクションをアンマウントすることはできません。
- マウントされたパーティションの名前を確認します。
mount
次のようなものが表示されます。
/dev/sdb1 on /media/user/F725-1429 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) /dev/sdb2 on /media/user/41cad05c-898e-49a3-9d00-02b92fa817ba type ext3 (rw,nosuid,nodev,uhelper=udisks2)
vfat(最初の行)のようなセクションは、現時点で関心のあるものです。
- vfatセクションの内容を確認します。
ll /media/user/F725-1429
次のようなものが表示されます。
-rw-r--r-- 1 user user 1164128 Apr 20 20:23 de0_nano_soc.rbf -rw-r--r-- 1 user user 15274 Jul 26 17:08 socfpga.dtb -rw-r--r-- 1 user user 176 Apr 20 19:59 u-boot.scr -rw-r--r-- 1 user user 3371472 Jul 29 16:50 zImage
したがって、dtbファイルはsocfpga.dtbと呼ばれます。
- ファイルをカードにコピーします。
cp /root/linux-socfpga-4.1/arch/arm/boot/zImage /media/user/F725-1429/ cp /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb /media/user/F725-1429/socfpga.dtb
ファイルシステムアセンブリ
このサブセクションでは、 この記事に書かれていることをほぼ繰り返しますが、将来的にはこのマニュアルを使いやすくするため、完全に説明します。
Debian 7 Wheezyを収集します:
1.ファイルシステムの構築に必要なパッケージをインストールします。
apt-get install debootstrap qemu-user-static binfmt-support
2.ディレクトリを作成し、必要なファイルをすべてそこにロードします。
cd /root mkdir debian7 debootstrap --arch armel --foreign wheezy debian7 http://ftp.debian.org/debian
3. ARMアーキテクチャ用に構築されたアプリケーションを実行するには、 qemu staticを使用します 。 これを行うには、ファイルをdebian7ディレクトリにコピーします。
cp /usr/bin/qemu-arm-static debian7/usr/bin/
4.新しいファイルシステムに移動します。
chroot debian7 /bin/bash
5.インタプリタのプロンプトが「名前がありません!@Hostname:/#」に変更された場合、すべてがうまくいきました。
組み立てプロセスを完了します。
/debootstrap/debootstrap --second-stage
6. / etc / inittabに次の行を残します。
/etc/inittab id:5:initdefault: si::sysinit:/etc/init.d/rcS ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin S:2345:respawn:/sbin/getty 115200 console
7.ルートアカウントのパスワードを設定します。
passwd
8.新しいファイルシステムをアーカイブにパックします。
tar -cpzf debian7.tar.gz --exclude=debian7.tar.gz /
9. chrootを終了します。
exit
10.カードのext3パーティションをアンマウントしてからフォーマットします(カーネルアセンブリの条項13のパーティションの名前を参照)。
umount /dev/sdb2 mkfs.ext3 /dev/sdb2
11. ext3パーティションをマウントします。
mount /dev/sdb2 /mnt/
12. ext3セクションのカードのファイルシステムでアーカイブを解凍します。
tar -xzf /root/debian7/debian7.tar.gz -C /mnt/
13.カーネルアセンブリ中に外部モジュールを使用するオプションを選択した場合、カーネルアセンブリプロセスのステップ12でコンパイルした外部モジュールをカードに書き込む必要があります。
cd /mnt/lib mkdir modules mkdir modules/4.1.0 mkdir modules/4.1.0/extra mkdir modules/4.1.0/kernel mkdir modules/4.1.0/kernel/crypto cp /root/linux-socfpga-4.1/fs/cifs/cifs.ko ./modules/4.1.0/extra/ cp /root/linux-socfpga-4.1/crypto/*.ko ./modules/4.1.0/kernel/crypto/
14.セクションをアンマウントします。
umount /dev/sdb1 umount /dev/sdb2
それだけです-カードの準備ができたら、デバイスにインストールして起動できます。
最終的な改良
デバイスをロードした後、所定の場所で画像をシャープにします。
1.組み込みのシリアルポート経由でデバイスに接続して、デバイスのDebianにログインします。
2.カーネルのアセンブリ中に外部モジュールを使用するオプションが選択された場合、カーネルの外部モジュールに関する情報を含むファイルを生成する必要があります。
depmod -a
3. Debian 7リポジトリをリポジトリのリストに追加します(ドイツ語のサーバーを追加しました):
echo "deb http://ftp.de.debian.org/debian wheezy main" > /etc/apt/sources.list
4.デバイスをイーサネットネットワークに接続します。 DHCP経由でアドレスを取得します。
dhclient -4 eth0
5.間違った時間では共有リソースをマウントできないため、NTPを上げます。
apt-get update apt-get install ntp
6.タイムゾーンを設定します。
dpkg-reconfigure tzdata
7.すべてがうまくいったことを確認するには、サーバーボールをマウントします。 たとえば、私の場合、次のようにしました。
mount //192.168.48.4/distrib /mnt -o username=jok40
8. SSHサーバーをインストールします。 シリアルポートを使用するのは不便です。シリアルポートを使用すると、入力したコマンドが列80に達した後、行の先頭まで表示されるためです。
apt-get install openssh
9. eth0インターフェースに静的アドレスを割り当てます-将来的にはSSH経由でデバイスに接続しやすくなります。 これを行うには、interfacesファイルを編集します。
nano /etc/network/interfaces
私の場合、次のようになり始めました。
# interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.48.27 netmask 255.255.255.0 gateway 192.168.48.1 network 192.168.48.0 broadcast 192.168.48.255 auto eth0
10. resolv.confファイルを編集して、DNSクライアントが正常に機能するようにします。
nano /etc/resolv.conf
次の行を追加します。
nameserver 192.168.48.1 nameserver 8.8.8.8
11.デバイスを再起動します。
12.すべてが正しく行われたことを確認するには
イーサネット経由でSSH経由でデバイスに接続します。

ご清聴ありがとうございました!