ブログ

Armadillo-810: ユーザーランド領域を分割してみる

at_takuya.sasaki
2016年8月1日 7時36分

Armadillo-810/840のユーザーランド領域に自社のアプリケーションを組み込んだ場合、自社アプリケーションを修正しただけでも、ユーザーランドイメージを再作成して書換えを行う必要があります。 自社アプリケーションが小さければコンフィグ領域に保存しておくのも手ですが、それなりのサイズがある場合は、保存できません。

ここでは、ユーザーランド領域を2つに分割して、自社アプリケーションを保存するだけの領域をjiffs2でフォーマットして利用する方法を試してみました。
メモリマップの違いさえ気を付ければ同じ方法でArmadillo-840でも実現できると思います。

今回のブログは以下のようにユーザーランド領域を2つに分割してみます。

bootloader    256kByte  0x00000000 -> 0x0003FFFF
config        256kByte    0x00040000 -> 0x0007FFFF
license          256kByte    0x00080000 -> 0x000BFFFF
firmware        4MByte  0x000C0000 -> 0x004BFFFF
kernel            4MByte    0x004C0000 -> 0x008BFFFF
userland      50Mbyte  0x008C0000 -> 0x03ABFFFF    ★サイズ縮小
application  5.25Mbyte  0x03AC0000 -> 0x03FFFFFF   ★新規追加

1. ブートローダのソースコードを修正

1.1 ソースコードのダウンロード
atmark@atde5:~$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-810/source/hermit-at-3.8.0-source.tar.gz
1.2 ソースコードの展開
atmark@atde5:~$  tar zxf hermit-at-3.8.0-source.tar.gz 
1.3 ソースコードの修正
atmark@atde5:~$ cd hermit-at-3.8.0/
atmark@atde5:~/hermit-at-3.8.0$ vi src/target/armadillo8x0/board-armadillo810.c
 
static void armadillo810_setup_flash(struct platform_info *pinfo)
{
        int val;
 
        flash_initialize(FLASH_TYPE_INTEL, FLASH_START);
 
        val = flash_get_size(FLASH_START);
        pinfo->map->flash.size = 1 << val;
        hsprintf(pinfo->default_mtdparts,
                 "physmap-flash.0:"
                 "%p(all)ro,"
                 "0x40000@0(bootloader)ro,"
                 "0x40000(config),"
                 "0x40000(license)ro,"
                 "0x400000(firmware)ro,"
                 "0x400000(kernel),"
                 "0x3200000(userland),"   ★追加
                 "-(application)",                 ★追加
//                 "-(userland)",                   ★削除
                 pinfo->map->flash.size);
}
1.4 ブートローダのビルド
atmark@atde5:~/hermit-at-3.8.0$ make armadillo810_nor_defconfig
atmark@atde5:~/hermit-at-3.8.0$ make
1.5 ブートローダの書き換え

以下のフォルダに生成されたファイルを、Armadillo-810に書きこんでください。

atmark@atde5:~/hermit-at-3.8.0$ ls src/target/armadillo8x0/loader-armadillo810*.bin
src/target/armadillo8x0/loader-armadillo810-nor-v3.8.0.bin

2. カーネル/ユーザーランドのソースコードをダウンロード

2.1 ソースコードのダウンロード
atmark@atde5:~$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-810/source/linux-3.4-at17.tar.gz
atmark@atde5:~$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-810/source/atmark-dist-20160527.tar.gz
2.2 ソースコードの展開
atmark@atde5:~$ tar zxf atmark-dist-20160527.tar.gz
atmark@atde5:~$ tar zxf linux-3.4-at17.tar.gz 
2.3 シンボリックリンクの作成
atmark@atde5:~$ ln -s atmark-dist-20160527 atmark-dist
atmark@atde5:~$ cd atmark-dist
atmark@atde5:~/atmark-dist$ ln -s ../linux-3.4-at17 ./linux-3.x
2.4 ベンダ・プロダクト名の選択
atmark@atde5:~/atmark-dist$ make menuconfig
 
Vender: Atmarck Techno
Product: Armadillo-810

3. カーネルソースの修正

3.1 カーネルのコンフィギュレーションを実行
atmark@atde5:~/atmark-dist$ make menuconfig
 
 Linux/arm 3.4-at17 Kernel Configuration 
  File systems  ---> 
   [*] Miscellaneous filesystems  --->
    <*>   Journalling Flash File System v2 (JFFS2) support  ★チェックをつける
       (0)     JFFS2 debugging verbosity (0 = quiet, 2 = noisy) (NEW)
        [*]     JFFS2 write-buffering support (NEW)
3.2 ソースコードの修正
atmark@atde5:~/atmark-dist$ vi linux-3.x/arch/arm/mach-shmobile/board-armadillo810.c
 
static struct mtd_partition cs0_partitions[] = {
        MTD_PART("bootloader",  0x00000000,             SZ_256K,
                 .mask_flags = MTD_WRITEABLE),
        MTD_PART("config",      MTDPART_OFS_APPEND,     SZ_256K),
        MTD_PART("license",     MTDPART_OFS_APPEND,     SZ_256K,
                 .mask_flags = MTD_WRITEABLE),
        MTD_PART("firmware",    MTDPART_OFS_APPEND,     SZ_4M,
                 .mask_flags = MTD_WRITEABLE),
        MTD_PART("kernel",      MTDPART_OFS_APPEND,     SZ_4M),
        MTD_PART("userland",    MTDPART_OFS_APPEND,     0x3200000),              ★追加
        MTD_PART("application",   MTDPART_OFS_APPEND,     MTDPART_SIZ_FULL),  ★追加
//        MTD_PART("userland",    MTDPART_OFS_APPEND,     MTDPART_SIZ_FULL),  ★削除
};
3.3 ビルド
atmark@atde5:~/atmark-dist$ make
3.4 カーネルの書き換え

以下のイメージをArmadillo-810で書き換えて、Armadillo-810を起動してください

atmark@atde5:~/atmark-dist$ ls images/linux.bin.gz

4. アプリケーションの書き込み

4.1 新規に追加した領域が認識されていることを確認します。
[root@armadillo810-0 (ttySC2) ~]# cat /proc/mtd
dev:    size   erasesize  named 
mtd0: 00040000 00020000 "bootloader"
mtd1: 00040000 00020000 "config"
mtd2: 00040000 00020000 "license"
mtd3: 00400000 00020000 "firmware"
mtd4: 00400000 00020000 "kernel"
mtd5: 03200000 00020000 "userland"
mtd6: 00540000 00020000 "application" ★新規追加
4.2 mtd6をフォーマットします(最初の1回だけ)
[root@armadillo810-0 (ttySC2) ~]# flash_eraseall -j /dev/mtd6
Erasing 128 Kibyte @ 540000 -- 100 % complete.Cleanmarker written at 520000.
4.3 mtd6をマウントします
[root@armadillo810-0 (ttySC2) ~]# mount -t jffs2 /dev/mtdblock6 /mnt
4.4 任意のアプリケーションを書き込みます。

ここでは自社アプリケーションの代わりに/bin配下のsshのバイナリを使っています。

[root@armadillo810-0 (ttySC2) ~]# cp /bin/ssh /mnt 
4.5 書き込まれていることを確認します。
[root@armadillo810-0 (ttySC2) ~]# ls -l /mnt
total 268
-rwxr-xr-x    1 root     root        274432 Jan  1 10:31 ssh*
4.6 mtd6をアンマウントします
[root@armadillo810-0 (ttySC2) ~]# umount  /mnt

5. Armadilloを再起動してアプリケーションを復元

5.1 Armadillo-810を再起動します
[root@armadillo810-0 (ttySC2) ~]# reboot
5.2 mtd6をマウントします
[root@armadillo810-0 (ttySC2) ~]# mount -t jffs2 /dev/mtdblock6 /mnt
5.3 手順4で書き込んだバイナリが復元できていることを確認します
[root@armadillo810-0 (ttySC2) ~]# ls -l /mnt
total 268
-rwxr-xr-x    1 root     root        274432 Jan  1 10:31 ssh*

これで自社アプリケーションに変更が入った場合は、/mntのファイルを更新するだけで大丈夫です。

以上