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のファイルを更新するだけで大丈夫です。
以上