Howto

フラッシュメモリ領域の分割方法を変更する

Armadillo-200シリーズでは、フラッシュメモリの領域を用途別に4つに分けて利用しています。それぞれ、bootloader、kernel、userland、configという名前を付けています。本Howtoでは、そのフラッシュメモリの領域の割り当てを変更する方法を紹介します。

おおまかな手順は下記のようになります。

  1. hermitを修正し、kernel commandline option(mtdparts)、メモリマップを変更する。
  2. ユーザランドのデバイスノードを変更する。

なお、本 Howto では、以下の環境を想定しています。

ご利用の環境に合わせて適宜読みかえてください。

  • 対象製品:Armadillo-220
  • atmark-dist: v20080617
  • linux-kernel:linux-2.6.12.3-a9-15
  • hermit-at: 1.1.18

1. hermitを修正し、kernel commandline option(mtdparts)、メモリマップを変更する。

Armadillo-220では、フラッシュメモリの領域を表1のように使用しています。

本Howtoでは、userland領域を、userlandとuserland2の二つに分割します。

[表1] Armadillo-220のフラッシュメモリ領域

領域名 開始物理アドレス 終了物理アドレス
bootloader 0x6000 0000 0x6000 ffff
kernel 0x6001 0000 0x6017 ffff
userland 0x6018 0000 0x607e ffff
config 0x607f 0000 0x6080 0000

[表2] 本Howtoでのフラッシュメモリ領域

領域名 開始物理アドレス 終了物理アドレス
bootloader 0x6000 0000 0x6000 ffff
kernel 0x6001 0000 0x6017 ffff
userland 0x6018 0000 0x6077 ffff
userland2 0x6078 0000 0x607e ffff
config 0x607f 0000 0x6080 0000

Armadilloでは、フラッシュメモリ領域をどのような分割で使用するかは、hermitからLinuxのKernel Commandline Optionのmtdpartsで指定しています。

フラッシュメモリの領域の分割方法を変更するだけであれば、mtdpartsを変更するだけですが、それだけだと追加した領域にhermitで書き込めなくなってしまいますので、memmapも修正します。

具体的な修正箇所は、hermit-at/src/target/armadillo2x0/以下の、memregions.hとmemmap.cになります[1]

memregions.hへの変更

diff --git a/src/target/armadillo2x0/memregions.h b/src/target/armadillo2x0/memregions.h
index 2124a26..1b599cb 100644
--- a/src/target/armadillo2x0/memregions.h
+++ b/src/target/armadillo2x0/memregions.h
@@ -27,14 +27,21 @@
 #define FLASH_KERNEL_SIZE      0x170000
 
 #define FLASH_USERLAND_START   (FLASH_KERNEL_START + FLASH_KERNEL_SIZE)
-#define FLASH_USERLAND_SIZE4MB 0x270000
-#define FLASH_USERLAND_SIZE8MB 0x670000
+#define FLASH_USERLAND_SIZE4MB 0x200000
+#define FLASH_USERLAND_SIZE8MB 0x400000
 #define FLASH_USERLAND_SIZE    (board_info.flash == FLASH_8MiB ? \
                                 FLASH_USERLAND_SIZE8MB : \
                                 FLASH_USERLAND_SIZE4MB)
 
-#define FLASH_CONFIG_START     (FLASH_USERLAND_START + FLASH_USERLAND_SIZE)
-#define FLASH_CONFIG_START8MB  (FLASH_USERLAND_START + FLASH_USERLAND_SIZE8MB)
+#define FLASH_USERLAND2_START   (FLASH_USERLAND_START + FLASH_USERLAND_SIZE)
+#define FLASH_USERLAND2_SIZE4MB 0x70000
+#define FLASH_USERLAND2_SIZE8MB 0x70000
+#define FLASH_USERLAND2_SIZE    (board_info.flash == FLASH_8MiB ? \
+                                FLASH_USERLAND2_SIZE8MB : \
+                                FLASH_USERLAND2_SIZE4MB)
+
+#define FLASH_CONFIG_START     (FLASH_USERLAND2_START + FLASH_USERLAND2_SIZE)
+#define FLASH_CONFIG_START8MB  (FLASH_USERLAND2_START + FLASH_USERLAND2_SIZE8MB)
 #define FLASH_CONFIG_SIZE      0x10000
 
 #define FLASH_OPTION_START     (FLASH_BOOTLOADER_START + 0xe000)
@@ -44,6 +51,7 @@
 #define FLASH_BOOTLOADER_NAME   "bootloader"
 #define FLASH_KERNEL_NAME       "kernel"
 #define FLASH_USERLAND_NAME     "userland"
+#define FLASH_USERLAND2_NAME    "userland2"
 #define FLASH_CONFIG_NAME       "config"
 
 #define FLASH_ALL_BLOCK4MB      "8x8K/l,62x64K/l,8x8K/l"
@@ -53,15 +61,20 @@
                                  FLASH_ALL_BLOCK4MB)
 #define FLASH_BOOTLOADER_BLOCK  "8x8K/l"
 #define FLASH_KERNEL_BLOCK      "23x64K"
-#define FLASH_USERLAND_BLOCK4MB "39x64K"
-#define FLASH_USERLAND_BLOCK8MB "103x64K"
+#define FLASH_USERLAND_BLOCK4MB "32x64K"
+#define FLASH_USERLAND_BLOCK8MB "96x64K"
 #define FLASH_USERLAND_BLOCK    (board_info.flash == FLASH_8MiB ? \
                                  FLASH_USERLAND_BLOCK8MB : \
                                  FLASH_USERLAND_BLOCK4MB)
+#define FLASH_USERLAND2_BLOCK4MB "7x64K"
+#define FLASH_USERLAND2_BLOCK8MB "7x64K"
+#define FLASH_USERLAND2_BLOCK    (board_info.flash == FLASH_8MiB ? \
+                                 FLASH_USERLAND2_BLOCK8MB : \
+                                 FLASH_USERLAND2_BLOCK4MB)
 #define FLASH_CONFIG_BLOCK      "8x8K"
 
 #define MTDPARTS210 "mtdparts=armadillo210-nor:0x10000(bootloader)ro,0x170000(kernel),0x270000(userland),-(config)"
-#define MTDPARTS2X0 "mtdparts=armadillo2x0-nor:0x10000(bootloader)ro,0x170000(kernel),0x670000(userland),-(config)"
+#define MTDPARTS2X0 "mtdparts=armadillo2x0-nor:0x10000(bootloader)ro,0x170000(kernel),0x470000(userland),0x200000(userland2),-(config)"
 
 #define SRAM_START             0x80014000
 #define SRAM_SIZE              0x00001100

memmap.cへの変更

diff --git a/src/target/armadillo2x0/memmap.c b/src/target/armadillo2x0/memmap.c
index c38c09f..0171e87 100644
--- a/src/target/armadillo2x0/memmap.c
+++ b/src/target/armadillo2x0/memmap.c
@@ -78,6 +78,7 @@ static int memmap_cmdfunc(int argc, char *argv[])
                "%p:%p FLA %s bf:8K bl:%s\n"
                "%p:%p FLA %s bf:8K bl:%s\n"
                "%p:%p FLA %s bf:8K bl:%s\n"
+               "%p:%p FLA %s bf:8K bl:%s\n"
                "%p:%p RAM onchip-sram\n"
                "%p:%p ROM boot-rom\n",
 
@@ -99,6 +100,14 @@ static int memmap_cmdfunc(int argc, char *argv[])
                (board_info.flash != FLASH_8MiB) ?
                FLASH_USERLAND_BLOCK : FLASH_USERLAND_BLOCK8MB,
 
+               FLASH_USERLAND2_START,
+               (board_info.flash != FLASH_8MiB) ?
+               (FLASH_USERLAND2_START + FLASH_USERLAND2_SIZE - 1) :
+               (FLASH_USERLAND2_START + FLASH_USERLAND2_SIZE8MB - 1),
+               FLASH_USERLAND2_NAME,
+               (board_info.flash != FLASH_8MiB) ?
+               FLASH_USERLAND2_BLOCK : FLASH_USERLAND2_BLOCK8MB,
+
                (board_info.flash != FLASH_8MiB) ?
                FLASH_CONFIG_START : FLASH_CONFIG_START8MB,

hermitをmakeし、作成されたloader-armadillo2x0-*.binを対象のArmadillo-220に書き込んでください。

[PC ~/hermit-at/]$ make TARGET=armadillo2x0

2. ユーザランドのデバイスノードを変更する。

hermitへの変更だけでも、フラッシュメモリ領域の分割はできますが、そのままだとflatfsdやnetflashを使用したときに不都合が生じるため、デバイスファイルを修正します。

Armadillo-220.Baseを使用する場合は、変更対象はatmark-dist/vendors/AtmarkTechno/Armadillo-220.Base/ext2_devtable.txtになります。

ext2_devtable.txtへの変更

diff --git a/vendors/AtmarkTechno/Armadillo-220.Base/ext2_devtable.txt b/vendors/AtmarkTechno/Armadillo-220.Base/ext2_devtable.txt
index e38c121..b844259 100644
--- a/vendors/AtmarkTechno/Armadillo-220.Base/ext2_devtable.txt
+++ b/vendors/AtmarkTechno/Armadillo-220.Base/ext2_devtable.txt
@@ -65,8 +65,9 @@
 /dev/flash/bootloader c   660    0     0     90      0       0       0     -
 /dev/flash/kernel     c   660    0     0     90      2       0       0     -
 /dev/flash/userland   c   660    0     0     90      4       0       0     -
-/dev/flash/config     c   660    0     0     90      6       0       0     -
-/dev/flash/nand       c   660    0     0     90      8       0       0     -
+/dev/flash/userland2  c   660    0     0     90      6       0       0     -
+/dev/flash/config     c   660    0     0     90      8       0       0     -
+/dev/flash/nand       c   660    0     0     90     10       0       0     -
 /dev/flash/nandblock  b   660    0     0     31      4       0       0     -
 #
 # Audio

[1] tftpdlを使用する場合は、tftpdl.cの変更も必要になります。