[Suzaku:02148] Re: flatfsdを使ったFLASHメモリへのアクセスに関して

Takenoshita Koyo email@hidden
2012年 4月 20日 (金) 18:16:45 JST


竹之下です。

> ①初期値を読み込む上記現象は避けようがないのでしょうか?
そうですね。
デバイスへの書き込み中に電源断が起きた場合、書き込み内容が
失われる(その結果、ファイルシステムの不整合が発生する)現象は、
ハード的にUPSのような機能を外部に持たせない限り、避けようが
ありません。

> ②バックアップファイルをFLASHメモリの他の領域に書くことはでき
> ますか?
> 現状は、/etc/config/のデータをFLASHに書き込んでいますが、他
> の領域にバックアップファイルを書き込むことはできますか?2つ
> の領域に交互に書くことができれば、片方が消えても、もうひとつ
> 残っておけばいいと思っています。
flatfsdの新しいバージョンでは、まさにこの機能が入っています。

フラッシュメモリのconfigリージョン(/dev/flash/config)のサイズが
イレースブロックサイズの2倍以上ある場合、configリージョンを二分割
して、交互にデータを書き込みます。

読み出す場合には、二分割したリージョンのうち、新しいデータが
書き込まれている方を使用します。その際、マジックナンバーが不正な
値になっている(書き込みに失敗したと思われる)方のリージョンは使われ
ませんので、書き込み領域の二重化になります。

具体的には、以下の手順を行って下さい。
1. カーネルを修正し、configリージョンのサイズを増やす

linux-2.6.18-at/drivers/mtd/maps/suzaku.c を以下のように修正して、
configリージョンのサイズを0x10000(64kB)から0x20000(128kB)に変更してください。
(この変更に伴い、userlanリージョンが128kB分少なくなります。)

--- a/drivers/mtd/maps/suzaku.c
+++ b/drivers/mtd/maps/suzaku.c
@@ -113,10 +113,10 @@ struct mtd_partition suzaku_partitions_spi[] = {
          { .name = "Flash/All",        .size = 0x00800000, .offset = 0, },
          { .name = "Flash/FPGA",       .size = 0x00100000, .offset = 0x00000000, },
          { .name = "Flash/Bootloader", .size = 0x00020000, .offset = 0x00100000, },
-        { .name = "Flash/Config",     .size = 0x00010000, .offset = 0x007F0000, },
+        { .name = "Flash/Config",     .size = 0x00020000, .offset = 0x007E0000, },
          { .name = "Flash/Image",      .size = 0x006D0000, .offset = 0x00120000, },
          { .name = "Flash/Kernel",     .size = 0x00300000, .offset = 0x00120000, },
-        { .name = "Flash/User",       .size = 0x003D0000, .offset = 0x00420000, },
+        { .name = "Flash/User",       .size = 0x003C0000, .offset = 0x00420000, },
  };
  #endif


2. AtmarkDistのユーザーランドコンフィギュレーションで、
    新しいflatfsdを使うように変更する

AtmarkDistのmake menuconfigで、Userland Configurationを下記のように変更してください。

Filesystem Applications  --->
   [*] flatfsd
   (Auto)   flatfsd storage type
   [*]   Compress /etc/config to flash as required  #チェックを入れる
   [*]   Device has Real Time Clock                 #チェックを入れる
   [ ]   old version                                #チェックを外す

以上のように変更して、image.binを作成しなおし、SUZAKUに書き込んでください。

変更が正常にできた場合、configリージョンへの書き込みを行ったときに
下記のようなログが出てくるはずです。

# killall -USR1 flatfsd
# flatfsd: saving fs to partition 0, tstamp=10
flatfsd: Wrote 1630 bytes to flash in 1 seconds
# killall -USR1 flatfsd
# flatfsd: saving fs to partition 1, tstamp=11
flatfsd: Wrote 1631 bytes to flash in 0 seconds
# killall -USR1 flatfsd
# flatfsd: saving fs to partition 0, tstamp=12
flatfsd: Wrote 1631 bytes to flash in 1 seconds

partitionが0と1を交互に繰り替えし、tstampが一ずつ
増えていきます。

お試しください。

(2012年04月18日 16:51), Keisuke Inoue wrote:
> suzakuメーリングリスト様
>
> SZ410を使って開発をしております。井上と申します。
>
> flatfsdを使ったFLASHメモリへのアクセスに関して教えて下さい。
> flatfsdを使ってFLASH書き込み中にSUZAKUの電源を落とすとデータ
> がなくなってしまうのを避けたいと思っております。
>
> 現在、データファイルと設定ファイルをflatfsdコマンドにて、定
> 期的にFLASHメモリに書き込んでいます。ところが、書き込み中に
> SUZAKUの電源を切ってしまうと、/etc/config/を通して書いたデー
> タが全て初期化され、データファイルが消えてしまいます。
> この現象は、チェックサムが正常に書き込まれないので、次起動時
> は、/etc/default/の初期ファイルが読み込まれるためだと思います。
>
> そこで、
> ①初期値を読み込む上記現象は避けようがないのでしょうか?
> 組込み機器としてしようしているため、いつ電源が落ちるか分から
> ないので、この現象が起こってしまっています。
>
> ②バックアップファイルをFLASHメモリの他の領域に書くことはでき
> ますか?
> 現状は、/etc/config/のデータをFLASHに書き込んでいますが、他
> の領域にバックアップファイルを書き込むことはできますか?2つ
> の領域に交互に書くことができれば、片方が消えても、もうひとつ
> 残っておけばいいと思っています。
> その場合、直接、FLASHメモリのアドレス番号にアクセスして、固
> 定箇所にデータを書き込むことが出来ますか?
>
>
> 現在、flatfsdを使っていますので、あまりプログラム変更せず
> に、この現象を避けたいと思っております。対策をとっていらっ
> しゃる方や、お分かりの方がいましたら、教えて下さい。どうぞ宜
> しくお願い致します。
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/suzaku


-- 
Koyo Takenoshita



suzaku メーリングリストの案内