Howto

フラッシュメモリのパーティションを変更する

カーネルが設定するフラッシュメモリーのパーティションは、カーネルコマンドラインでmtdpartsオプションを指定するか、mtdドライバのデフォルトパーティションを修正することにより変更することが可能です。mtdpartsオプションは、ブートローダ(hermit-at)の環境変数を設定するかソースコードを修正することにより変更できます。

1. mtdpartsオプションを指定してフラッシュメモリーパーティションを変更する

1.1. カーネルコマンドラインでmtdpartsオプションを指定する

Armadillo-300、Armadillo-500、Armadillo-500 FX用のhermit-atでは、カーネルコマンドラインにmtdpartsオプションを渡すことにより、パーティションを指定することができます。この方法では、ソースコードの変更を伴わずにパーティションの変更をおこなうことができます。

mtdパーティションを指定するには、Armadilloを保守モードで起動しhermit-atコンソールのsetenvコマンドを使用します。

hermit> setenv console=ttyAM0 mtdparts=armadillo3x0-nor:0x2000(ipl)ro,0xe000(bootloader)ro,0x200000(kernel),0x5d0000(userland),0x10000(userland2),-(config)

図1. userland領域を二つに分ける場合(Armadillo-300の例)

mtdpartsオプションについては、使用するカーネルソースの「linux-2.6.x/Documentation/kernel-mtdparts.txt」を参照してください。

1.2. hermit-atのソースコードを修正してmtdpartsオプションを指定する

linux-2.6.12.3-a9を使用している製品(Armadillo-9/210/220/230/240)は、hermit-atのソースコードを修正することによりmtdpartsオプションを変更することができます。

製品毎の修正対象のソースコードは以下の通りです。

製品名 ファイル名
Armadillo-9 hermit-at/src/target/armadillo9/memregions.h
Armadillo-210/220/230/240 hermit-at/src/target/armadillo2x0/memregions.h

以下に、Armadillo-9の場合の修正内容を記載します。(hermit-atのソースコードバージョンはv1.1.4です。)

howto-flash-memory-partition

図2. 変更前後のArmadillo-9 フラッシュメモリーパーティション

diff --git a/src/target/armadillo9/memregions.h b/src/target/armadillo9/memregions.h
index c7c3f0d..cf090fd 100644
--- a/src/target/armadillo9/memregions.h
+++ b/src/target/armadillo9/memregions.h
@@ -11,9 +11,9 @@ #define FLASH_SIZE    0x00800000
 #define FLASH_BOOTLOADER_START  FLASH_START
 #define FLASH_BOOTLOADER_SIZE   0x10000
 #define FLASH_KERNEL_START      (FLASH_BOOTLOADER_START + FLASH_BOOTLOADER_SIZE)
<span class="rem">-#define FLASH_KERNEL_SIZE       0x170000</span>
<span class="add">+#define FLASH_KERNEL_SIZE       0x200000</span>
 #define FLASH_USERLAND_START    (FLASH_KERNEL_START + FLASH_KERNEL_SIZE)
<span class="rem">-#define FLASH_USERLAND_SIZE     0x670000</span>
<span class="add">+#define FLASH_USERLAND_SIZE     0x5e0000</span>
 #define FLASH_CONFIG_START      (FLASH_USERLAND_START + FLASH_USERLAND_SIZE)
 #define FLASH_CONFIG_SIZE       (FLASH_START + FLASH_SIZE - FLASH_CONFIG_START)
 
@@ -26,11 +26,11 @@ #define FLASH_USERLAND_NAME     "userlan
 #define FLASH_CONFIG_NAME       "config"
 
 #define FLASH_BOOTLOADER_BLOCK  "8x8K/l"
<span class="rem">-#define FLASH_KERNEL_BLOCK      "23x64K"</span>
<span class="rem">-#define FLASH_USERLAND_BLOCK    "103x64K"</span>
 
<span class="add">+#define FLASH_KERNEL_BLOCK      "32x64K"</span>
<span class="add">+#define FLASH_USERLAND_BLOCK    "94x64K"</span>
 #define FLASH_CONFIG_BLOCK      "8x8K"
 
<span class="rem">-#define MTDPARTS "mtdparts=armadillo9-nor:0x10000(bootloader)ro,0x170000(kernel),0x670000(userland),-(config)"</span>
<span class="add">+#define MTDPARTS "mtdparts=armadillo9-nor:0x10000(bootloader)ro,0x200000(kernel),0x5e0000(userland),-(config)"</span>
 
 #define SRAM_START        0x80014000
 #define SRAM_SIZE        0x00001100
@@ -45,7 +45,7 @@ #define DRAM2_SIZE        0x02000000
 
 #define SECTOR_IDX_BOOTLOADER    0
 #define SECTOR_IDX_KERNEL    8
<span class="rem">-#define SECTOR_IDX_USERLAND    31</span>
 
<span class="add">+#define SECTOR_IDX_USERLAND    40</span>
 #define SECTOR_IDX_CONFIG    134 
 
 #define LINUX_PARAM_SIZE    (0x00000f00)
@@ -56,7 +56,7 @@ #define LINUX_SRC_ADDRESS    (FLASH_START +
 #define LINUX_LOAD_ADDRESS    (DRAM1_START + 0x00018000)
 
 #define INITRD_SRC_SIZE        (FLASH_USERLAND_SIZE)
<span class="rem">-#define INITRD_SRC_ADDRESS    (FLASH_START + 0x00180000)</span>
<span class="add">+#define INITRD_SRC_ADDRESS    (FLASH_START + 0x00210000)</span>
 #define INITRD_LOAD_ADDRESS    (DRAM1_START + 0x00800000)
 
 #define GUNZIP_MEM_SIZE 0x20000

図3. hermit-at/src/target/armadillo9/memregions.hの修正内容

2. mtdドライバのソースコードを修正してデフォルトフラッシュメモリーパーティションを変更する

linux-2.6.12.5-atを使用している製品(Armadillo-300)、linux-2.6.18-atを使用している製品(Armadillo-500 開発ボード)、linux-2.6.26-atを使用している製品(Armadillo-500 FX)では、Linuxカーネルのmtdドライバを修正することによりデフォルトのフラッシュメモリーパーティションを変更することができます。

製品名 ファイル名
Armadillo-300 linux-2.6.12.5-at/drivers/mtd/maps/armadillo3x0.c
Armadillo-500 開発ボード linux-2.6.18-at/arch/arm/mach-mx3/armadillo5x0.c
Armadillo-500 FX linux-2.6.26-at/arch/arm/mach-mx3/armadillo500fx.c

以下に、Armadillo-500 開発ボード(a5527)の場合の修正内容を記載します。(linux-2.6.18-atのソースコードバージョンは、linux-2.6.18-at10です。)

図4. 変更前後のArmadillo-500 開発ボード フラッシュメモリーパーティション

diff --git a/arch/arm/mach-mx3/armadillo5x0.c b/arch/arm/mach-mx3/armadillo5x0.c
index c824515..333c4bf 100644
--- a/arch/arm/mach-mx3/armadillo5x0.c
+++ b/arch/arm/mach-mx3/armadillo5x0.c
@@ -114,7 +114,8 @@ static struct mtd_partition mtd_nor_partitions_32MB[] = {
     MTD_PART("nor.bootloader",   4* 32*1024, 0,
          MTD_WRITEABLE /* force read-only */ ),
     MTD_PART("nor.kernel",      16*128*1024, MTDPART_OFS_APPEND, 0),
<span class="rem">-    MTD_PART("nor.userland",   238*128*1024, MTDPART_OFS_APPEND, 0),</span>
<span class="add">+    MTD_PART("nor.userland",   233*128*1024, MTDPART_OFS_APPEND, 0),</span>
<span class="add">+    MTD_PART("nor.userland2",    5*128*1024, MTDPART_OFS_APPEND, 0),</span>
     MTD_PART("nor.config",       1*128*1024, MTDPART_OFS_APPEND, 0),
 };
 static struct mtd_partition mtd_nor_partitions_64MB[] = {

図5. linux-2.6.18-at/arch/arm/mach-mx3/armadillo5x0.cの修正内容

3. 注意点

  1. イメージの再書き込み

    カーネルもしくはユーザランドのパーティションを変更した場合は、再度カーネルとユーザーランドイメージの両方をフラッシュメモリーへ書き込む必要があります。

  2. パーティションのアライメント

    パーティションの開始アドレス及びサイズは、フラッシュメモリーのイレースブロックと同じ境界にする必要があります。

  3. デバイスノード

    パーティションを変更した場合、ブートローダ領域(/dev/flash/bootloader)、カーネル領域(/dev/flash/kernel)、ユーザーランド領域(/dev/flash/userland)、コンフィグ領域(/dev/flash/config)領域のデバイスファイルのメジャー番号とマイナー番号が適切な領域を指し示すように、「atmark-dist/vendor/Atmark-Techno/(Product)/ext2_devtable.txt」を編集する必要があります。

  4. jffs2を使用する場合

    新しく作成したフラッシュメモリー領域をjffs2で使用する場合、5ブロック以上の領域が必要となります。

  5. コンフィグ領域を変更する場合

    flatfsdは、コンフィグ領域(/dev/flash/config)が2ブロック以上ある場合、2重化してファイルを保存します。そのため、コンフィグ領域に割り当てるブロック数により、動作の違いが生じるので注意が必要です。 また、コンフィグ領域を拡張した場合、コンフィグ領域のリストアの際にルートファイルシステムのramdiskが不足する恐れがあります。その場合は、事前に/etc/configディレクトリをramfsでマウントするなどしてください。コンフィグ領域のリストアは起動スクリプト(rcスクリプト)の中で「flatfsd -r」コマンドによりおこなわれます。詳細な処理内容は、各Productの起動スクリプトを参照してください。

4. 関連リンク