u-boot-2012.04.01移植(十一)yaffsファイルシステムの書き込みサポートを提供

3176 ワード

u-bootがjffs 2ファイルシステムの書き込みをテストする
書き込みコマンドは次のとおりです.
tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 $filesize

300000:ファイルシステムのダウンロード先アドレス
0 x 00260000:ファイルシステムが存在するflashアドレス
$filesize:ファイルシステムサイズ
PS:ファイルシステムを書き込む時、適切なファイルサイズを指定しなければならない.パーティション名を使って書くことができない.そうしないと、ファイルシステムのフォーマットが破壊され、ファイルシステムが使用できなくなる.
 
ファイルシステムをマウントしようとする前に、カーネルを書き込み、起動パラメータを設定し、ファイルシステムフォーマットがjffs 2であることを指定します.
パラメータは次のように設定されます.
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

 
テストの結果、u-bootはjffs 2ファイルシステムの書き込みをサポートし、システムはjffs 2ファイルシステムをマウントすることに成功した.
 
u-bootがyaffs 2ファイルシステムの書き込みをテストする
書き込みコマンドは次のとおりです.
tftp 30000000 fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 0x00260000 $filesize

 
書き込みに失敗しました.nandの読み書きコマンドはcommon/cmd_にあります.nand.c
common/cmd_nand.c,検索yaffsは605行にナビゲートでき,ここからyaffsをサポートするにはマクロCONFIG_を定義しなければならないことが分かる.CMD_NAND_YAFFS
include/configs/smdk 2440.hで定義する:
#define CONFIG_CMD_NAND_YAFFS

 
yaffs 2ファイルシステムを再書き込みし、書き込み時にエラーは発生しませんが、ファイルシステムをマウントする際に失敗しました.
u-boot-1.1.6を使用して同じカーネルとyaffs 2ファイルシステムを書き込み、マウントに成功し、yaffs 2ファイルシステムの内容に問題がないことを説明した.問題はu-boot-2012.04.01がファイルシステムをflashに正しく書き込んでいないことだ.
書き込みと元のファイルシステムをバイナリテキストソフトウェアで比較すると、oobの一部の内容が一致していないことがわかりました(Notepad++プラグインHexEditorを追加すると、バイナリでテキストを表示できます).
common/cmd_に戻るnand.c:605下に分析し、焼き書き呼び出しは以下の通りである.
			ret = nand_write_skip_bad(nand, off, &rwsize,
						(u_char *)addr, WITH_YAFFS_OOB);

nand_write_skip_badでは、
1、焼き書きモード設定エラー
//			ops.mode = MTD_OOB_AUTO;
			ops.mode = MTD_OOB_RAW;

2、write_oob戻り値判定文エラー
				rval = nand->write_oob(nand, offset, &ops);
//				if (!rval)
                                if (rval)
					break;

3、上の2つのエラーを修正した後、再試験してもファイルシステムをマウントできない.デバッグした結果、もう1つのエラーが発見された.修正は以下の通りである.
//if (!need_skip && !(flags & WITH_DROP_FFS))   
if (need_skip && !(flags & WITH_DROP_FFS)) 

このように修正した後、yaffs 2ファイルシステムをサポートしたが、テストを経て、jffs 2ファイルシステムをサポートしなかった.同時に2種類のファイルシステムをサポートするために、以下のように修正すべきである.
/*
	if (!need_skip && !(flags & WITH_DROP_FFS)) {
		
		rval = nand_write (nand, offset, length, buffer);
		printf("there is no bad block\r
", __FILE__, __LINE__); if (rval == 0) return 0; *length = 0; printf ("NAND write to offset %llx failed %d
", offset, rval); return rval; } while (left_to_write > 0) { */ if(!(flags & WITH_YAFFS_OOB)){ if(!need_skip && !(flags & WITH_DROP_FFS)) { rval = nand_write (nand, offset, length, buffer); printf("there is no bad block\r
", __FILE__, __LINE__); if (rval == 0) return 0; *length = 0; printf ("NAND write to offset %llx failed %d
", offset, rval); return rval; } } else while (left_to_write > 0) {

 
 
これで、u-bootはjffs 2とyaffs 2ファイルシステムの書き込みをサポートしました.