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