Rebuild Linux and Buildroot for the DCP

資料 2
Rebuild Linux and Buildroot
for the DCP-SH7785 board
Contents
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.1
はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
再構築用ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Buildroot 再構築
Linux 再構築 . .
U-Boot 再構築 .
busybox 差分 . .
使用上のご注意 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
4
6
7
8
はじめに
DCP-SH7785 上で動作する Buildroot1 ベース Linux2 パッケージを再構築する場合の手順について説明し
ます。
PC-Linux 上に sh4 用クロス開発環境が予め用意されているとします。
再構築に必要なパッチファイル等が CF で提供されるファイルシステム内/home/default/Package に格納
されています。
buildroot/
linux/
u-boot/
2.2
Buildboot 再構築用ファイル
Linux 再構築用ファイル
U-Boot 再構築用ファイル
再構築用ファイル
再構築用ディレクトリ内には、以下のファイルが格納されています。
buildroot 内再構築用ファイル
config-buildroot-2012.05.txt
config-buildroot-2012.05-gcc.txt
config-busybox-1.20.1.txt
メモリディスク起動用コンフィグファイル
CF ディスク起動用コンフィグファイル
busybox 用コンフィグファイル
1 buildroot-2012.05
2 Linux-3.2.28
または RT プロジェクトの RT パッチを適用した Linux-3.2.28-rt42
1/
8
buildroot-2012.05.tgz
buildroot-2012.05-gcc.tgz
メモリディスク起動用ファイルシステムに追加するファイル
CF ディスク起動用ファイルシステムに追加するファイル
rootfs-2012.05.sh4.cpio.gz
メモリディスク起動用ファイルシステム
(フラッシュメモリ書き込み用)
CF ディスク起動用ファイルシステム (CF 書き込み用)
rootfs-2012.05.sh4.tgz
linux 内再構築用ファイル
config-3.2.28.txt
config-3.2.28-nfs.txt
config-3.2.28-rt42.txt
config-3.2.28-nfs-rt42.txt
Linux カーネルコンフィグファイル (メモリディスク起動用)
Linux カーネルコンフィグファイル (CF ディスク起動用)
Linux カーネルコンフィグファイル
(メモリディスク起動用)(RT パッチ適用)
Linux カーネルコンフィグファイル
(CF ディスク起動用)(RT パッチ適用)
diff-3.2.28.txt
diff-3.2.28+.txt
diff-3.2.28+2.txt
diff-3.2.28-rt42.txt
Linux カーネル差分パッチ
Linux カーネル差分パッチ (ハイバネーション関連追加分)
Linux カーネル差分パッチ (RTC ドライバ関連追加分)
Linux カーネル差分パッチ (RT パッチ適用)
uImage-3.2.28
uImage-3.2.28-vfs
uImage-3.2.28-rt42
Linux カーネルイメージ (メモリディスク起動用)
Linux カーネルイメージ (CF ディスク起動用)
Linux カーネルイメージ
(メモリディスク起動用)(RT パッチ適用)
Linux カーネルイメージ
(CF ディスク起動用)(RT パッチ適用)
uImage-3.2.28-vfs-rt42
modules-3.2.28.tgz
modules-3.2.28-rt42.tgz
モジュールバイナリ
モジュールバイナリ (RT パッチ適用)
drivers/pci6466/
drivers/rtrtc/
仮想イサーネットドライバ
リアルタイム応答性能計測ドライバ
u-boot 内再構築用ファイル
diff-2011.09-sh7785.txt
diff-monitor.txt
u-boot.bin
U-Boot 差分パッチ
U-Boot 差分パッチ (追加)
U-Boot バイナリ
2.3 Buildroot 再構築
任意のディレクトリにソースコード buildroot-2012.05.tar.bz2 を展開し、ディレクトリを移動して下さい。
以降のコマンド実行例では、’=> ’ は U-Boot のコマンド実行を、’# ’ はボード上 Linux スーパユーザ
でのコマンドの実行を、’$ ’ はボード上 Linux 一般ユーザでのコマンドの実行を示します。’bash# ’
は PC 上 Linux スーパユーザでのコマンドの実行を、’% ’ は PC 上 Linux 一般ユーザでのコマンドの実
行を示します。
% tar xjvf buildroot-2012.05.tar.bz2 ↓
% cd buildroot-2012.05 ↓
環境によっては、予め下記のコマンドが必要になります。
% setenv LANG en_US.UTF-8 ↓
csh 使用の場合の設定
2/
8
以下のコンフィグファイルのいずれかをコピーして下さい。
config-buildroot-2012.05.txt
config-buildroot-2012.05-gcc.txt
メモリディスクベース起動用
CF ディスクベース起動用
% cp config-buildroot-2012.05.txt .config ↓
さらに、busybox 用コンフィグファイルをコピーし、make して下さい。
% cp config-busybox-1.20.1.txt package/busybox/busybox-1.20.1.config ↓
% make oldconfig; make ↓
make 終了後 busybox 用コンフィグファイルの変更を行なった場合は、以下のコマンド実行後再度 make
を実行して下さい。
%
%
%
%
%
%
cp config-busybox-1.20.1.txt package/busybox/busybox-1.20.1.config ↓
rm ./output/build/busybox-1.20.1/.stamp_target_installed ↓
rm ./output/build/busybox-1.20.1/.stamp_built ↓
rm ./output/build/busybox-1.20.1/.stamp_configured ↓
rm ./output/build/busybox-1.20.1/.stamp_extracted ↓
make ↓
make 終了後下記のようにパッチを適用し、再度 make を実行して下さい。
%
%
%
%
patch -p0 < Readme ↓
rm ./output/build/nfs-utils-1.2.3/.stamp_target_installed ↓
rm ./output/build/nfs-utils-1.2.3/.stamp_built ↓
make ↓
スーパユーザに移行し、下記のコマンドを実行して下さい。
bash# mount -o loop output/images/rootfs.ext2 /mnt; cd /mnt ↓
bash# tar xzvf buildroot-2012.05.tgz ↓
メモリディスク起動用に buildroot を make した場合、linux カーネルに組み込む cpio 形式の initramfs を
書き出します。予め/tftpboot ディレクトリを作成して下さい。
bash# mkdir /tftpboot ↓
bash# find . | cpio -o -H newc | gzip > /tftpboot/rootfs-2012.05.sh4.cpio.gz ↓
bash# cd; umount /mnt; exit ↓
cpio 形式 initramfs の書き出し先名称やディレクトリを変更する場合、linux カーネルを構築するコンフィ
グファイル内の下記マクロも変更する必要があります。
CONFIG INITRAMFS SOURCE="/tftpboot/rootfs.sh4.cpio.gz"
CF ディスク起動用に buildroot を make した場合は、さらに以下のコマンドを実行して下さい。
bash#
bash#
bash#
bash#
mount -o loop output/images/rootfs.ext2 /mnt; cd /mnt ↓
tar xzvf buildroot-2012.05-gcc.tgz ↓
tar czvf /tmp/rootfs-2012.05.sh4.tgz ./ ↓
cd; umount /mnt; exit ↓
3/
8
CF 用ファイルシステムを/tmp/rootfs-2012.05.sh4.tgz に tar 形式で書き出しますので、CF に書き込むコマ
ンド例を以下に示します。
#
#
#
#
mkfs /dev/hda1 ↓
mount /dev/hda1 /mnt ↓
cd /mnt ↓
zcat /tmp/rootfs-2012.05.sh4.tgz | tar xvf - ↓
CF ディスクのパーティション設定は fdisk コマンドで行ないます。
# fdisk /dev/hda ↓
ボード上で動作するアプリケーションプログラムを開発するためのクロス開発環境用設定を以下に示し
ます。下記環境変数設定は csh の場合です。
% set path = ( /tmp/buildroot-2012.05-gcc/output/host/usr/bin $path ) ↓
% rehash ↓
% sh4-unknown-linux-uclibc-gcc --version ↓
sh4-unknown-linux-uclibc-gcc (Buildroot 2012.05) 4.5.3
2.4 Linux 再構築
任意のディレクトリにソースコード linux-3.2.tar.xz を展開し、ディレクトリを移動して下さい。さらに
パッチ patch-3.2.28.xz を適用して下さい。
%
%
%
%
xzcat linux-3.2.tar.xz | tar xvf - ↓
mv linux-3.2 linux-3.2.28 ↓
cd linux-3.2.28 ↓
xzcat patch-3.2.28.xz | patch -p1 ↓
パッチを適用して下さい。
% less diff-3.2.28.txt | patch -p1 ↓
% less diff-3.2.28+.txt | patch -p1 ↓
% less diff-3.2.28+2.txt | patch -p1 ↓
RT パッチを適用する場合は、更に以下のパッチを適用して下さい。
% xzcat patch-3.2.28-rt42.patch.xz | patch -p1 ↓
% less diff-3.2.28-rt42.txt | patch -p1 ↓
コンフィグファイルは以下の4種類あり、いずれかをコピーして下さい。
config-3.2.28.txt
config-3.2.28-nfs.txt
config-3.2.28-rt42.txt
config-3.2.28-nfs-rt42.txt
メモリディスク起動用
CF ディスク起動用
RT パッチ適用のメモリディスク起動用
RT パッチ適用の CF ディスク起動用
% cp config-3.2.28.txt .config ↓
メモリディスク起動用に linux カーネルを make する場合、予め initramfs ファイルを/tftpboot にコピーし
て下さい。
4/
8
bash# mkdir /tftpboot ↓
bash# cp buildroot/rootfs-2012.05.sh4.cpio.gz /tftpboot ↓
make を実行する場合のコマンド例を以下に示します。下記コマンド例は csh 使用の場合です。
% setenv LANG C ↓
% setenv ENV "ARCH=sh CROSS_COMPILE=sh4-linux-gnu-" ↓
% make $ENV clean ↓
% make $ENV oldconfig ↓
% make $ENV V=1 uImage ↓
モジュールおよびヘッダファイルを生成する場合のコマンド例を以下に示します。
% make $ENV V=1 modules ↓
% make $ENV V=1 INSTALL_MOD_PATH=/tmp/modules modules_install ↓
% make $ENV V=1 INSTALL_HDR_PATH=/tmp/headers headers_install ↓
モジュールの追加変更を行なった場合、生成したモジュールは、Buildroot で構築したファイルシステ
ム内の所定の場所にコピーする必要があります。メモリディスク起動用ファイルシステム変更の場合、
/tftpboot/rootfs-2012.05.sh4.cpio.gz を更新し、再度 Linux カーネルを make する必要があります。また、
Linux カーネル更新とともに下記に示す CF 内の所定の場所にコピーする必要があります。
/lib/modules/
/boot/
モジュール用ディレクトリ
Linux カーネルイメージ用ディレクトリ
生成した linux カーネル arch/sh/boot/uImage の更新方法を以下に示します。
メモリディスクベースで起動する場合、フラッシュメモリの所定の場所に書き込んで下さい。u-boot の
環境変数 tftpflash を利用して書き込みを行なう場合のコマンド例を以下に示します。カーネルファイル
uImage を boot/uImage.opt にコピーしています。
=> setenv uboot boot/uImage.opt ↓
=> setenv fladdr a0080000 ↓
=> run tftpflash ↓
RT パッチ適用カーネルでメモリディスクベースで起動する場合、フラッシュメモリの所定の場所に書き
込んで下さい。u-boot の環境変数 tftpflash を利用して書き込みを行なう場合のコマンド例を以下に示し
ます。カーネルファイル uImage を boot/uImage.rt にコピーしています。
=> setenv uboot boot/uImage.rt ↓
=> setenv fladdr a0880000 ↓
=> run tftpflash ↓
CF ディスクベースで起動するカーネルを更新する場合のコマンド例を以下に示します。例では、メモリ
ディスクベースで起動しているものとします。
#
#
#
#
mount /dev/hda1 /mnt ↓
cp /tmp/uImage /mnt/boot/uImage.sh4 ↓
cp /tmp/uImage /mnt/boot/uImage.rt ↓
umount /mnt ↓
RT パッチなしカーネルの場合
RT パッチ適用カーネルの場合
なお、linux カーネルの更新に失敗し起動しなくなった場合、以下のようにパッケージに含まれるオリジ
ナルのカーネルを書き込んで下さい。
5/
8
メモリディスクベースカーネルの場合
uImage-3.2.28 をフラッシュメモリの所定の場所に書き込んで下さい。
RT パッチ適用メモリディスクベースカーネルの場合
uImage-3.2.28-rt42 をフラッシュメモリの所定の場所に書き込んで下さい。
CF ディスクベースカーネルの場合
uImage-3.2.28-vfs を CF 内/boot/uImage.sh4 にコピーして下さい。
RT パッチ適用 CF ディスクベースカーネルの場合
uImage-3.2.28-vfs-rt42 を CF 内/boot/uImage.rt にコピーして下さい。
仮想イーサネットドライバおよびリアルタイム応答性能計測ドライバを再構築する場合、各ドライバの
ソースコード格納ディレクトリ内、Makefile 先頭で定義している Linux カーネルを再構築するディレク
トリを参照するマクロを変更して下さい。
KERNEL SRC = /usr/src/Linux/SuperH/linux-3.2.28
各ドライバを再構築する場合のコマンド例を以下に示します。予め各ドライバのソースコード格納ディ
レクトリに移動して下さい。
% setenv ENV "ARCH=sh CROSS_COMPILE=sh4-linux-gnu-" ↓
% make $ENV ↓
RT パッチなしカーネルの場合
% make $ENV RT=1 ↓
RT パッチ適用カーネルの場合
make により生成した各ドライバは、単体でテストし正常動作が確認できた場合、メモリディスク起動用
カーネルの場合は、Buildroot 再構築により生成する cpio 形式 initramfs のファイルシステムにコピーす
る必要があります。CF ディスク起動用カーネルの場合は、CF 上ドライバモジュールを上書きすること
で更新して下さい。単体テストを行なう場合のコマンド例を以下に示します。予め/tmp に nfs または ftp
によりドライバモジュールをコピーしてあるとします。
# rmmod pci6466 ↓
# insmod /tmp/pci6466.ko ↓
各ドライバモジュールの格納場所を以下に示します。
lib/modules/3.2.28/kernel/drivers/pci/pci6466.ko
lib/modules/3.2.28/kernel/drivers/misc/rtrtc.ko
lib/modules/3.2.28-rt42/kernel/drivers/pci/pci6466.ko
lib/modules/3.2.28-rt42/kernel/drivers/misc/rtrtc.ko
2.5 U-Boot 再構築
任意のディレクトリにソースコード u-boot-2011.09.tar.bz2 を展開し、ディレクトリを移動して下さい。
% tar xjvf u-boot-2011.09.tar.bz2 ↓
% cd u-boot-2011.09 ↓
パッチを適用して下さい。
% less diff-2011.09-sh7785.txt | patch -p1 ↓
% less diff-monitor.txt | patch -p0 ↓
6/
8
make を実行する場合のコマンド例を以下に示します。
% make clean ↓
% make distclean ↓
% make CROSS_COMPILE=sh4-linux- dcpsh7785_config ↓
% make CROSS_COMPILE=sh4-linux- tools ↓
% make CROSS_COMPILE=sh4-linux- ↓
生成したバイナリファイル u-boot.bin をイーサネットを介して tftp で現在動作しているボード上 u-boot
に転送し、書き込みを行ないます。
ボード上 u-boot コマンドで tftp を行なう通信先システムとの接続を確認して下さい。
=> ping 192.168.2.124 ↓
Using e1000#0 device
host 192.168.2.124 is alive
=>
tftp コマンドにより、u-boot.bin が転送できることを確認して下さい。
=> tftp 192.168.2.124 boot/u-boot.bin ↓
Using e1000#0 device
TFTP from server 192.168.2.126; our IP address is 192.168.2.123
Filename ’boot/u-boot.bin’.
Load address: 0x192
Loading: #################################################################
######################################
done
Bytes transferred = 524288 (80000 hex)
=>
ボード上フラッシュメモリに u-boot を書き込むサンプルコマンドが環境変数 tftpflash にあります。
tftpflash=tftpboot $(loadaddr) $(uboot);
protect off $(fladdr) +$(filesize);
erase $(fladdr) +$(filesize);
cp.b $(loadaddr) $(fladdr) $(filesize);
protect on $(fladdr) +$(filesize);
cmp.b $(loadaddr) $(fladdr) $(filesize)
tftp で u-boot.bin を転送
フラッシュメモリのプロテクション解除
フラッシュメモリの消去
データの書き込み
フラッシュメモリのプロテクション設定
データの確認
環境変数 tftpflash を実行する場合のコマンド例を以下に示します。
=>
run tftpflash ↓
なお、u-boot の更新に失敗し起動しなくなった場合、ICE 等をボードに接続し、パッケージに含まれる
オリジナルの u-boot.bin を書き込んで下さい。
2.6 busybox 差分
オリジナル busybox に若干の変更を加えています。
/bin/sh bash-4.1 を使用
7/
8
/root/bin/halt シェルスクリプトで、仮想イーサネットドライバ対応 halt コマンド
/root/bin/reboot シェルスクリプトで、仮想イーサネットドライバ対応 reboot コマンド
/root/bin/notify 仮想イーサネットドライバ対応の通信可能状況を示すサンプルプログラム
/root/bin/su シェルスクリプトで、カレントディレクトリを移動しない su コマンド
/root/bin/netstat netstat-1.42 ベース改造版(下記参照)
/root/bin/rttest リアルタイム応答性能測定ドライバ用ツール
改造版 netstat コマンドの実行例を以下に示します。送受信パケット数の変化量を一秒毎に表示します。
# netstat -i -c ↓
Kernel Interface table
iface
mtu met
rx-ok rx-err rx-drp rx-ovr
eth0
1500 0
10894
0
780
0
lo
16436 0
81
0
0
0
eth0
1500 0
16
0
1
0
eth0
1500 0
11
0
1
0
eth0
1500 0
7
0
0
0
eth0
1500 0
9
0
1
0
eth0
1500 0
5
0
0
0
2.7
tx-ok tx-err tx-drp tx-ovr flg
0
0
0
0 BMRU
81
0
0
0 LRU
0
0
0
0 BMRU
0
0
0
0 BMRU
0
0
0
0 BMRU
0
0
0
0 BMRU
0
0
0
0 BMRU
使用上のご注意
出荷用ボードで動作する U-Boot および Linux カーネルには、各プログラムのデバッグおよび動作検証
を目的として弊社オリジナルのデバッグ用モニタプログラム3 を含んでいます。しかし、デバッグ用モニ
タのソースコードはオープンソースとはしていないため、パッケージに含まれるパッチファイルに含ま
れません。従いまして、U-Boot および Linux カーネルの再構築を行なった場合、デバッグ用モニタ機能
は削除されます4 。
ただし、デバッグモニタ機能がある場合、それぞれの動作において以下に示す若干の違いがあります。
u-boot 上で、以下のコマンドによりデバッグモニタに移行します。’#’ はデバッグモニタのプロンプト
マークです。
=> mon ↓
Type ’quit’, if return to u-boot.
#quit ↓
u-boot に復帰します
=>
Linux カーネルの場合、特定のアドレスでブレークポイントの設定が可能で、カーネルを中断すること
が可能です。また、halt および reboot コマンド実行時、制御をモニタに移行します。これらによりボー
ド上各 I/O やメモリの状態を調査することが可能です。
Sep-20-2012
3 プログラムの実行制御や CPU レジスタの表示、メモリダンプ機能等の他に PC 側 Linux 上通信ユーティリティと共同で C ソース
レベルのシンボリックなデバッグ環境を提供します
4 デバッグ用モニタ機能はプログラムのデバッグ時のみに必要であり、U-Boot および Linux カーネルの通常動作時においては不要
なため、それらプログラムの動作に影響しません
8/
8