ブログ

Armadillo-440:PC上で、microSDカードにカーネル、ユーザーランドを構築する(Linux-2.6.26版)

at_kazutaka.bito
2024年2月5日 14時41分

Armadillo-440:PC上で、microSDカードにカーネル、ユーザーランドを構築する方法です。(Linux-2.6.26版)

参考)Armadillo上で、カーネル、ユーザーランドを構築する場合
Armadillo-440:microSDカード上のカーネル、ユーザーランドで起動する(Linux-2.6.26版)

Armadillo-440は、2つのカーネルバージョン(Linux-2.6.26、Linux-3.14)があります。
Armadillo-440のカーネルバージョンは、起動直後のコンソールのログで確認できます。
Linux-2.6.26の例)起動直後のログが「Hermit-At v2」で始まる

Hermit-At v2.5.0 (armadillo4x0) compiled at 06:49:08, Jul 10 2018

Linux-3.14の例)起動直後のログが「Hermit-At v3」で始まる

Hermit-At v3.11.0 (armadillo4x0) compiled at 08:31:07, Mar 30 2018

ここでは、Linux-2.6.26版で説明します。
Linux-3.14版は、 Armadillo-440:PC上で、microSDカードにカーネル、ユーザーランドを構築する(Linux-3.14版)を 参照ください。

1.PC上にATDEを構築する

(既に構築済みの場合は不要です。)
下記を参考に、PC上にATDEを構築します。
Armadillo実践開発ガイド~組み込みLinuxの導入から製品化まで~第1部
6.1. Windows PC上にATDEを構築する

2.ATDEにカーネル、ユーザーランドのイメージファイルを準備

ATDE上にカーネル、ユーザーランドのイメージファイルを準備します。
ここでは、標準のカーネル、ユーザーランドのイメージをダウンロードします。

atmark@atde5:~$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-440/image/linux-a400-1.20.bin.gz
atmark@atde5:~$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-440/image/romfs-a440-1.13.img.gz

上記の場合、イメージファイル名は下記になります。
カーネル:linux-a400-1.20.bin.gz
ユーザーランド:romfs-a440-1.13.img.gz
以下の手順では、このファイル名で記述します。異なるイメージを使用する場合は、ファイル名を読み替えください。

3. microSDカードのフォーマット

PCにmicroSDカードを接続し、ATDEで認識させます。
参考) TIPS:ATDEでUSBメモリ/SDカードをマウントする方法
mountコマンドでmicroSDカードのデバイスファイルを確認しておきます。
例)

atmark@atde5:~$  mount | grep "/dev/sd*"
/dev/sda1 on /boot type ext2 (rw,relatime,errors=continue)
/dev/sdb1 on /media/E414-2F9B type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=cp437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks)
/dev/sdb2 on /media/00fbc669-a0e7-4aa5-936c-f717a7f9fc78 type ext3 (rw,nosuid,nodev,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered,uhelper=udisks)

上記の下2行が、microSDカードが/dev/sdbで認識された状態です。
この例では、2つのパーティションを持つmicroSDカードを使用したため、/dev/sdb1、/dev/sdb2で認識されています。
以下の手順のmicroSDカードのデバイスファイルは、上記例でのファイル名で示します。
異なるデバイスファイル名で認識されている場合は、読み替えてください。

3-1. microSDカードのパーティションの設定

microSDカードをアンマウントします。
上記例の場合、/dev/sdb1、/dev/sdb2

atmark@atde5:~$ sudo umount /dev/sdb1
atmark@atde5:~$ sudo umount /dev/sdb2

補足)上記および以下、sudoで始まるコマンド実行時、パスワードを要求された場合は、atmark と入力。

// fdiskコマンドをmicroSDカード(/dev/sdb)に対して実行します。

aatmark@atde5:~$ sudo fdisk /dev/sdb

Command (m for help): d   // dを入力(パーティションの削除。複数ある場合はすべて削除。)
Partition number (1-4): 1

Command (m for help): d   // dを入力(パーティションの削除。複数ある場合はすべて削除。)
Selected partition 2

Command (m for help): n    // nを入力
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p    // pを入力
Partition number (1-4, default 1): 1   // 1を入力
First sector (2048-31116287, default 2048):    // そのまま
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-31116287, default 31116287):    // そのまま
Using default value 31116287

Command (m for help): w    // wを入力
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

// 以上で、fdisk内での設定が完了し、プロンプトに戻ります。
atmark@atde5:~$ 

上記により、microSDカードが1つのパーティション(/dev/sdb1)が作成されています。

atmark@atde5:~$ sudo fdisk -l /dev/sdb

Disk /dev/sdb: 15.9 GB, 15931539456 bytes
32 heads, 32 sectors/track, 30387 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x38b2051b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    31116287    15557120   83  Linux
3-2. microSDカードのフォーマット
atmark@atde5:~$ sudo mke2fs -j /dev/sdb1
atmark@atde5:~$ sudo tune2fs -i 0 /dev/sdb1

上記3-1,3-2の手順の詳細は Armadillo実践開発ガイド第2部「4.1.1. パーティションの作成とフォーマット」を参考。

4. カーネル、ユーザーランドをmicroSDカードに書き込む

手順2で用意したイメージファイルを使って、microSDカード(/dev/sdb1)に カーネル、ユーザーランドを書き込みます。

4-1. カーネルの書き込み

カーネルイメージ(本例では:linux-a400-1.20.bin.gz)をmicroSDカード(/dev/sdb1)に書き込みます。

atmark@atde5:~$ mkdir sd
atmark@atde5:~$ sudo mount -t ext3 /dev/sdb1 sd
atmark@atde5:~$ sudo mkdir -p sd/boot
atmark@atde5:~$ sudo cp linux-a400-1.20.bin.gz sd/boot/linux.bin.gz
4-2. ユーザーランドの書き込み

手順2で用意したカーネルイメージ(本例では:romfs-a440-1.13.img.gz)をmicroSDカード(/dev/sdb1)に書き込みます。

atmark@atde5:~$ mkdir romfs
atmark@atde5:~$ gzip -c -d romfs-a440-1.13.img.gz > romfs.img
atmark@atde5:~$ sudo mount -o loop romfs.img romfs
atmark@atde5:~$ sudo cp -a romfs/* sd
atmark@atde5:~$ sudo umount romfs
atmark@atde5:~$ rmdir romfs
4-3. ユーザーランドのfstabファイルの変更

ユーザーランドのfstabファイルの内容を変更します。
変更前のfstabファイルは、下記のようになっています。

atmark@atde5:~$ cat sd/etc/fstab
/dev/ram0               /               ext2    defaults                0 1
proc                    /proc           proc    defaults                0 0
usbfs                   /proc/bus/usb   usbfs   defaults                0 0
sysfs                   /sys            sysfs   defaults                0 0

上記(変更前)の1行目のram0をmmcblk0p1に、ext2をext3にします。
エディタ(vi、gedit)でfstabファイルを編集、もしくは、下記コマンドで変更します。

atmark@atde5:~$ sudo sed -i -e 's/ram0/mmcblk0p1/' sd/etc/fstab
atmark@atde5:~$ sudo sed -i -e 's/ext2/ext3/' sd/etc/fstab

変更後のfstabファイルは、下記のようになります。

atmark@atde5:~$ cat sd/etc/fstab
/dev/mmcblk0p1          /               ext3    defaults                0 1
proc                    /proc           proc    defaults                0 0
usbfs                   /proc/bus/usb   usbfs   defaults                0 0
sysfs                   /sys            sysfs   defaults                0 0

microSDカードをアンマウントします。

atmark@atde5:~$ sudo umount sd
atmark@atde5:~$ rmdir sd

以上で、カーネル、ユーザーランドが起動するmicroSDカードの作成は終了です。

Armadillo-440をmicroSDカードのカーネル、ユーザーランドで起動するには、
保守モード(※)で起動して、ブートローダーを設定します。
※)保守モードでの起動方法(SW1を押下したまま起動。または、JP1:オープン、JP2:ショートで起動。)
Armadillo-400 シリーズ ソフトウェアマニュアル「3.8. ブートモード」

ブートローダーで、下記のように設定します。

hermit> setenv console=ttymxc1 root=/dev/mmcblk0p1 noinitrd rootwait
hermit> setbootdevice mmcblk0p1

以降、Armadill-440は、microSDカードのカーネル、ユーザーランドで起動します。

補足1)microSDカードのカーネル、ユーザーランドで起動した場合、終了の際はpoweroffコマンドを実行します。
(microSDカード上のファイルシステムを正常に終了するためにシャットダウンします。)

[root@armadillo440-0 (ttymxc1) ~]# poweroff

補足2)ROMのカーネル、ユーザーランドでの起動に戻すには、保守モードで起動して下記のように設定します。

hermit> clearenv
hermit> setbootdevice flash