BeagleBone Black 起動SDカードの作成

BeagleBoen Blackとは?

BeagleBone Black(以下BBBとします)は、TIとDigi-Keyの協力で開発されたBeagleシリーズの1つで、TIで開発しているARMプロセッサのAM3xxx系のCPUを搭載しています。

また、この記事もDigi-Keyの記事をベースに記述しています。
https://www.digikey.com/eewiki/display/linuxonarm/BeagleBone+Black

Wikipedia Beagle Board より

BeagleBoneは、オープンソースの理念に基づき設計されているため回路図が公開されています。よくBeagleBoneと比較されるRaspberryPiですが、こちらは最近ではI/Oなどの周辺部分を除き公式には公開されていません。また、Video周りなどのドライバに関してもバイナリ提供でソースコードは公開されていません。

 BeagleBone の回路図は、GitHub にアップされています。
 https://github.com/beagleboard/beaglebone-black/blob/master/BBB_SCH.pdf


BeagleBone Black はボード上に512MBのRAM、4MBのMMC、SD-Cardスロット、USB、LAN、HDMIなどが搭載されていて、購入状態で MMC 上の Linux が起動できます。

今回の企画では、SDカード上にLinuxを構成して、BBB を起動するまでについて解説します。なお、起動時の RootFS は、Debian を使用します。

また、下記の説明では "sudo" の表記を省略していますので、適宜 "sudo" を使ってコマンドを実行するようにしてください。


追記:
 ↓ネットワーク・ブートしたい場合
 Beaglebone Black ネットワーク・ブート環境の構築



用意するもの:

・BeagleBone Black
 ・開発用Linux PC(仮想PCでもOK)
 ・3.3vUSBシリアル変換ケーブル
  http://akizukidenshi.com/catalog/g/gM-05840/
 ・マイクロUSBケーブル
 ・マイクロSDカード、4G以上を推奨

開発環境(Linux PC):
開発環境として、Ubuntu16.04 LTS を使用します。
開発に必要なツールなどインストールされていない場合、適宜apt installしてください。

なお、本記事のビルド作業等で必要になるパッケージは以下の通りです。
 ・git
 ・bison
 ・flex
 ・lzma
 ・lzop
 ・libssl-dev



開発環境構築:

まずは、クロスコンパイラの取得
wget -c https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz

取得したクロスコンパイラを展開
tar xvf gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz


シェルの変数”ARMCC”を設定
クロスコンパイラを展開した場所で、クロスコンパイラの場所とプレフィクスまでを変数に設定します。
export ARMCC=`pwd`/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

ARMCCを確認
${ARMCC}gcc --version

以下のような表示が確認できればOKです。

arm-linux-gnueabihf-gcc (Linaro GCC 7.4-2019.02) 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

※毎回設定するのもめんどいので起動スクリプトにでも設定するがよい。


ブートのビルド:

u-bootソースの取得
Linuxの前にブートを構成します。
下記のコマンドを実行した場所に "u-boot" というディレクトリが作成され、その下にu-bootソース一式が展開されます。

git clone https://github.com/u-boot/u-boot.git -b v2019.04


u-bootソースにパッチをあてる 先程 git clone して作成した u-boot に移動します。
cd u-boot/
2つのパッチファイルを取得します。
wget -c https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2019.04/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2019.04/0002-U-Boot-BeagleBone-Cape-Manager.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch


u-boot のビルド
make ARCH=arm CROSS_COMPILE=${ARMCC} distclean
make ARCH=arm CROSS_COMPILE=${ARMCC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${ARMCC}

u-boot/ 以下に "MLO" と "u-boot.img" ができていればOKです。


ツールビルド
ホスト側でこの後Linuxカーネルのイメージファイルを作成するときに必要な u-boot のツールをビルドし、インストールします。

make sandbox_defconfig tools-only
install tools/mkimage /usr/local/bin



カーネルのビルド:

Linuxカーネル・ソースの取得
まずソースの取得。
下記のコマンドを実行した場所に "linux" というディレクトリが作成され、その下にLinuxカーネル一式が展開されます。

git clone http://github.com/beagleboard/linux

執筆時点(2019/08/04)では、Kernel Version = 4.14.108 です。


Linuxカーネルのビルド
まずは、BeagleBoard のコンフィグを読み込みます。
make ARCH=arm CROSS_COMPILE=${ARMCC} bb.org_defconfig

ちなみに、デフォルトでは使わないようなドライバやモジュールもわんさか入っています。

カーネルをビルドします。
make ARCH=arm CROSS_COMPILE=${ARMCC} -j4
オプションの-j4はコンパイル時のコア数指定で、この場合4コアでコンパイルしています。

カネールイメージを生成します。
make ARCH=arm CROSS_COMPILE=${ARMCC} uImage dtbs LOADADDR=0x80008000

カーネルモジュールを生成します。
make ARCH=arm CROSS_COMPILE=${ARMCC} modules



起動SDカードの作成:

SDカードの準備
BBBを起動するためのSDカードは、先頭の1~8191ブロックまでをブート領域としてパーティション管理外とし、8192ブロックから第1パーティションとなるように構成します。

SDカードを開発マシンのSDカードスロットに挿入して、割り当てを確認して下記の作業を進めてください。なお、下記の説明では SDカードは /dev/sda として割り当てられたことを前提として記述しています。自身の環境でのデバイスファイル名を確認してから実施してください。

仮想マシンの場合、VMware や VietualBox などそれぞれで SDカードを認識する方法を確認して作業を進めてください。

念のため、先頭ブロックを0クリアします。
dd if=/dev/zero of=/dev/sda bs=512 count=8192

次に、fdisk コマンドでパーティションを作成します。
fdisk /dev/sda
  "n" コマンドで新規のパーティション作成。
  設定は下記の通り
   Primary partition
   First sector = 8192
   Last sector = ご自由に!

パーティションをext4でフォーマットします。
mkfs.ext4 /dev/sda1

sdカードのマウントポイントを作成、sdカードをマウントします。
以降、マウントポイントを"/mnt/sdcard"として説明します。
mkdir /mnt/sdcard
mount /dev/sda1 /mnt/sdcard



ブートローダーを書き込む:

u-boot イメージを SDカードの先頭に書き込む
u-bootをビルドしたディレクトリに移動
cd u-boot

MLO を書き込む
dd if=MLO of=/dev/sda count=1 seek=1 bs=128k

u-boot 本体を書き込む
dd if=u-boot.img of=/dev/sda count=2 seek=1 bs=384k



RootFS(Debian)を書き込む:

RootFS(Debian)取得
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-10.0-minimal-armhf-2019-08-05.tar.xz


取得したDebianを展開
先程取得したDebianのイメージを展開します。
tar xvf debian-10.0-minimal-armhf-2019-08-05.tar.xz

展開してできた tar ファイルを、RootFSとして、SDカードに展開します。
tar xvf armhf-rootfs-debian-buster.tar -C /mnt/sdcard/


u-bootパラメータを設定する
コピーしたRootFSのbootにuEnv.txtファイルを作成します
これは、u-bootコンフィギュレーションファイルで、ココでは、単純に起動するカーネルファイルをuname_rで指定します

この記事で、ビルドしたカーネルのバージョンは、4.14.108なので下記のような設定とします
vi /mnt/sdcard/boot/uEnv.txt

uname_r=4.14.108    ← テキストエディタ等で作成する



カーネルを書き込む:

カーネル、モジュール、dtbファイルのコピー カーネルビルドしてできた、zImage を先程の uEnv.txt で指定した名前でコピーします
cd linux
cp arch/arm/boot/zImage /mnt/sdcard/boot/vmlinuz-4.14.108

カーネルモジュールを、RootFSにインストールします
make ARCH=arm CROSS_COMPILE=${ARMCC} INSTALL_MOD_PATH=/mnt/sdcard modules_install

dtbファイルを、RootFS にコピーします
mkdir -p /mnt/sdcard/boot/dtbs/4.14.108/
cp arch/arm/boot/dts/*.dtb /mnt/sdcard/boot/dtbs/4.14.108


fstabを設定する
RootFSを"/"としてマウントするため、sdカードのデバイスファイルのマウントを指定する。
vi /mnt/sdcard/etc/fstab

/dev/mmcblk0p1 / ext4 noatime,errors=remount-ro 0 1

以上で、起動できるハズ、健闘を祈る。



BBBの起動をSDカードのみとする:

SDカードから BBB を起動するには?
この情報についてはご存知と思いますが、基板上の"USER"ボタンを押下しながら電源投入(USBケーブル接続時)します。

もし、内臓の mmc を使わない場合、mmc からブートできないようにすれば必ず SDカードから起動します。

多少?乱暴ですが、mmc の構造もSDカードと同じなので、2プロック目から8191ブロックまでをゼロ・クリアしてしまえばOKです。

※通常、mmcblk0 が SDカード、mmcblk1 がmmcですが、確認してから実施してください。

手順:
念のため、ブート部分を丸ごとセーブ
dd if=/dev/mmcblk1 of=mmc_u-boot_save skip=1 bs=512 count=8191
 skip=1としているのは、パーティション・テーブルを飛ばすためです。

mmc ブート部分をゼロ・クリア
dd if=/dev/zero of=/dev/mmcblk1 seek=1 bs=512 count=8191

mmc ブートを復活させるにはセーブしたブートイメージを書き戻します
dd if=mmc_u-boot_save of=/dev/mmcblk1 seek=1 bs=512 count=8191

もし、mmc の内容を破壊してしまっても、本家 BBB のDebiannを持ってきて、復活できます。
https://beagleboard.org/debian
-> Debian Images select
この場合、別のSDカードを準備して、Flasher イメージを使うをオススメします。



起動できているか確認するには:

カーネルを確認する
 uname -a
uEnv.txt の内容と、カーネルビルド時刻で確認してください。

debianを確認する
cat /etc/issue
"Debian GNU/Linux 10" の表示を確認してください。



最後に:

今回使用した Debian は最小構成なので、もともと BBB に入っていたモノからすると機能的には貧弱です。

このため、もともと BBB に入っていた Debian を使いたい、というような場合は、本家 BBB のDebiannを持ってきて、利用してください。
https://debian.beagleboard.org/debian
-> Debian Images select

最新は下記の通り。
bone-debian-10.0-iot-armhf-2019-07-07-4gb.img.xz

ただし、このイメージは、ボード上の4GBの mmc イメージです。
ですので、dd で mmc や SDカードに展開してから tar でまとめてホストで修正、SDカードに展開するなど必要です。


Lightning Brains


























もう少し、コアな情報を!

SDカードの構成
SDカード、mmc とも同様の構成となっています。
先頭の1ブロック目は、パーティションテーブルで、fdisk コマンドで設定します。
第1パーティションは、8192ブロック目から始まります。
では、1ブロック目と8192ブロック目との間は何かというと、ソコに u-boot を書き込んでいます。



dd コマンドで、書き込んだMLOと、u-boot.img が u-boot です。


なぜ、u-boot は MLO と 本体部分に別れているのか?
AM3359(AM335X)は、ARM MPU のコア部分に176KBのROMと64KBのRAMを持っています。また、共用RAMとして64KBを持っており、ダイ上には合計128KBのRAMが存在します。

電源ONされたときはプロセッサが持っているROMに書き込まれているプログラムから開始されます。このROMプログラムはハードコードされており、ユーザーが書き換えることはできません。

ROMプログラムは、まず下記の設定を行います。
 ・スタック設定
 ・ウオッチドッグタイマー1を3分に設定
 ・PLLとシステムクロックを設定

そして、ROMプログラムは、ブートデバイスを確認し、ブートプログラムを内臓のRAMにロードします。

しかし、内臓のRAMは限られた大きさしかありません。
このため、u-bootの第1段のステージだけをMLO(またはSPLと呼ばれる)として、内蔵RAMに読み込み、外部RAMへのクロック供給等を行い、外部RAM上にu-boot本体をローディングします。

外部RAM上に展開されたu-bootが本来のブートローダの機能となります。
u-bootはご承知の通り、多くの機能を持ったブートローダーで、起動するカーネルの選択や、環境変数の引き渡しなど、カーネルを起動する前の多くの仕事をすることができます。

BBBのu-bootは、ブートローダーを読み込んだデバイスのパーティション1、今回ext4でしてフォーマットされている /boot/uEnv.txt を読み込み、適切なカーネルイメージをメモリ上にローディングします。

そして、カーネルパラメータとプログラムカウンタをローディングしたカーネルに引き渡し、Linux の起動が始まります。

ブートメディアを切り替えるには?
mmc、SDカード、UART、USBの順でブートが可能なようです。
SYSBOOT[4:0]で設定可能と、テクニカル・リファレンスにはあります。



詳しくは、TIの下記のページに記述されていますのでそちらを確認してください。
http://processors.wiki.ti.com/index.php/The_Boot_Process



Lightning Brains



秋月電子に気軽に行けない人はamazonでも購入可能!


コメント

このブログの人気の投稿

Linuxシステムコール、共有メモリの使い方

Linuxシステムコール、メッセージキューの使い方

Linuxシステムコール、セマフォの使い方