【FatFs】車載外部ストレージ その106【ファイル上シミュレーション⑬】

【FatFs】車載外部ストレージ その106【ファイル上シミュレーション⑬】 車載外部ストレージ

バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/

はじめに

FatFsのファイル上シミュレーションの話。
前回、ロングファイルネームなフォルダやファイルをFatFsで作ったので、
ディスクイメージを確認してみる。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

ロングファイルネームなフォルダやファイルのディスクイメージ上で確認

太郎くん
太郎くん

前回、ロングファイルネームなフォルダやファイルを作ったから
それをディスクイメージで確認だね。

フクさん
フクさん

そうだね。
前回やったのは以下。

  • 「long_file_name_folder」というフォルダを作った。
  • そのフォルダ中に「long_file_name_file.txt」を作った。

フォルダもファイルも共に「8.3形式」では無いのでロングファイルネームってことになる。

ルートディレクトリエントリ確認

太郎くん
太郎くん

ルートディレクトリエントリの場所は変わってないはずだから
ディスクイメージの0x90000[byte]目を見ればOKだね。

フクさん
フクさん

ルートディレクトリエントリはこんな感じだ。
ディレクトリエントリとしては合計で5つ埋まってるんで、連続でバイナリエディタの画像を貼るよ。

ディレクトリエントリtestファイル、struct DIR_ENTRY_t {  BYTE DIR_Name[11];  BYTE DIR_Attr;  BYTE DIR_NTRes;  BYTE DIR_CrtTimeTenth;  WORD DIR_CrtTime;  WORD DIR_CrtDate;  WORD DIR_LstAccDate;  WORD DIR_FstClusHI;  WORD DIR_WrtTime;  WORD DIR_WrtDate;  WORD DIR_FstClusLO;  DWORD DIR_FileSize; };
ディレクトリエントリtest2ファイル、struct DIR_ENTRY_t {  BYTE DIR_Name[11];  BYTE DIR_Attr;  BYTE DIR_NTRes;  BYTE DIR_CrtTimeTenth;  WORD DIR_CrtTime;  WORD DIR_CrtDate;  WORD DIR_LstAccDate;  WORD DIR_FstClusHI;  WORD DIR_WrtTime;  WORD DIR_WrtDate;  WORD DIR_FstClusLO;  DWORD DIR_FileSize; };
ディレクトリエントリLFN2ファイル、struct DIR_ENTRY_t {  BYTE DIR_Name[11];  BYTE DIR_Attr;  BYTE DIR_NTRes;  BYTE DIR_CrtTimeTenth;  WORD DIR_CrtTime;  WORD DIR_CrtDate;  WORD DIR_LstAccDate;  WORD DIR_FstClusHI;  WORD DIR_WrtTime;  WORD DIR_WrtDate;  WORD DIR_FstClusLO;  DWORD DIR_FileSize; };
ディレクトリエントリLFN1ファイル、struct DIR_ENTRY_t {  BYTE DIR_Name[11];  BYTE DIR_Attr;  BYTE DIR_NTRes;  BYTE DIR_CrtTimeTenth;  WORD DIR_CrtTime;  WORD DIR_CrtDate;  WORD DIR_LstAccDate;  WORD DIR_FstClusHI;  WORD DIR_WrtTime;  WORD DIR_WrtDate;  WORD DIR_FstClusLO;  DWORD DIR_FileSize; };
ディレクトリエントリSFN1ファイル、struct DIR_ENTRY_t {  BYTE DIR_Name[11];  BYTE DIR_Attr;  BYTE DIR_NTRes;  BYTE DIR_CrtTimeTenth;  WORD DIR_CrtTime;  WORD DIR_CrtDate;  WORD DIR_LstAccDate;  WORD DIR_FstClusHI;  WORD DIR_WrtTime;  WORD DIR_WrtDate;  WORD DIR_FstClusLO;  DWORD DIR_FileSize; };
太郎くん
太郎くん

5つ?!
あれ?
おかしくない?!
確かルートディレクトリには「long_file_name_folder」ってフォルダを追加しただけだよね?
とすると、元々あったtest.txtとtest2.txtを加えて3つになるんじゃないの?

フクさん
フクさん

これがVFAT仕様に組み込まれたLFN(Long File Name)仕様の影響だね。

太郎くん
太郎くん

ということは、
ディレクトリエントリで追加された3つで「long_file_name_folder」フォルダを表現してるってこと?

フクさん
フクさん

その通り。

ディレクトリエントリ確認

フクさん
フクさん

まずは3つ目のディレクトリエントリを再度見てみよう。

ディレクトリエントリLFN2ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };
フクさん
フクさん

この中のDIR_Attrというパラメータに着目してみよう。

太郎くん
太郎くん

0x0Fってのがあるね。
そもそもDIR_Attrの内訳ってどうなってるの?

フクさん
フクさん

こうなってるね。

0x01: ATTR_READ_ONLY (書き込み禁止)
0x02: ATTR_HIDDEN (隠し)
0x04: ATTR_SYSTEM (システム)
0x08: ATTR_VOLUME_ID (ボリュームラベル)
0x10: ATTR_DIRECTORY (ディレクトリ)
0x20: ATTR_ARCHIVE (アーカイブ)
0x0F: ATTR_LONG_FILE_NAME (LFNエントリ)

太郎くん
太郎くん

0x0FだからATTR_LONG_FILE_NAME (LFNエントリ)ってことになるのか。

フクさん
フクさん

ここで特殊仕様が発動!
DIR_AttrがATTR_LONG_FILE_NAME (LFNエントリ)の場合、
LFN用の構造体で該当ディレクトリエントリを解釈し直す!

太郎くん
太郎くん

は?

ロングファイルネームのディレクトリエントリ確認

フクさん
フクさん

ロングファイルネーム用のディレクトリエントリ構造体があるんだよ。
切り替える条件がさっきも言った通り、DIR_AttrがATTR_LONG_FILE_NAME (LFNエントリ)の場合。
とりあえず、ロングファイルネーム用のディレクトリエントリ構造体で参照し直すと以下になる。

ロングファイルネームのディレクトリエントリ確認、struct LFN_DIR_ENTRY_t {  BYTE LDIR_Ord;  BYTE LDIR_NAME1[10];  BYTE LDIR_Attr;  BYTE LDIR_Type;  BYTE LDIR_Chksum;  BYTE LDIR_Name2[12];  WORD LDIR_FstClusLO;  BYTE LDIR_Name3[4]; };
太郎くん
太郎くん

全然構造が違う!!

フクさん
フクさん

しかも、ファイル名が埋まってるLDIR_NAME1、LDIR_NAME2、LDIR_NAME3ってのがあるのだが、
ロングファイルネームの時はUnicodeになる。
今までのFAT32ではasciiだったんだけどね。

太郎くん
太郎くん

結構違う?!

フクさん
フクさん

ここら辺のファイル名の埋まり方も癖があるんで、次回はそこの話からだねー。

太郎くん
太郎くん

(意外と魔境な予感・・・。)

まとめ

フクさん
フクさん

まとめだよ。

  • ロングファイルネームなフォルダやファイルのディスクイメージ上で確認を試みる。
    • まずはルートディレクトリエントリから。
  • 存在するファイルとフォルダが3つのはずだが、ディレクトリエントリとしては5つ存在。
    • 5つのうち3つがロングファイルネーム仕様を満たす仕掛け。
    • ファイル名もasciiからUnicodeになってる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました