[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 メーリングリストの案内