Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux用MTD /CFIドライバの紹介

Linux用MTD /CFIドライバの紹介

  

一部のIntel FLASHチップ(StrataFlashシリーズなど)は複数のパーティションをサポートしています。つまり、各パーティションは同時に動作できます。これは良い機能ですが、いくつかの問題もあります。

Linux-2.4.21を移植してJFFS2ファイルシステムをハングしたときに、「Magic bitmask not found」などのエラーが報告されることがよくありますが、FLASHが0x80などを読み取っていることがわかりました。データは、FLASHがパーティションの特性を持っていることが判明したデータを表示します。LinuxFLASHドライバは、FLASH全体の状態を示すために状態変数のみを使用し、特定のパーティションの実際の状態とシステムレコードが一致しません。この時点は実際には読み取り状態にはありません。

当時の解決策は、レコードの状態に関係なく、読み取るたびに最初に読み取り状態に入ることができることでしたが、もちろん、これはパフォーマンスの低下を招きます。 。

ロック/ロック解除を除いて、Linux-2.6.x(特に2.6.13)の時代には(Linuxは消去/書き込み時に最初にロック解除しません、解決策はすべてのロック解除を最初に初期化することです)以前の問題に加えて、マルチパーティションエラーでさえも現れなかったので、私はLinuxのMTD /FLASHドライバを研究することにしたことに驚きました。

駆動する前に、まずいくつかのプログラミングポイントをクリアします。

1:バス幅に応じた読み書き、読み書きを行います。FLASHチップ幅はそうではないことに注意してください(例えば、連続)。

2:アドレス指定、プログラムがアクセスするアドレス、およびFLASHチップアドレスピンで得られる値が異なります(16ビットFLASHチップなど)。CPUの場合、0x00と0x01は2つの異なるバイトを示します。しかし、FLASHピンは0になります。つまり、FLASHの最初のWORDを指しています。アドレスバスのbit0がフローティングのままであるか、または変換バスが考慮され、bit1が実際にbit0に出力されると考えることができます。これがポイント1の説明です。

3:チップのマニュアルでは、オフセットはWORDに基づいており、WORDのビット幅はチップのビット幅に依存しているため、次のコマンドでは実際のオフセット= manual offset * buswidth /8 。

4:チップのマニュアルに書かれている変数の長さ(通常はCFI情報)。たとえば、2は変数が16ビットの数値であることを意味しますが、読むときは2つのWORDを読み、その後各WORDを置く必要があります下位8ビットは1つの16ビット数にまとめられます。 WORDを読んで一緒にパッチを当てるのは、特に大きな構造体を読むときには本当に面倒ですが、cfi_util.cのcfi_read_pri関数は簡単です。

5:連続接続。つまり、たとえば2つの16ビットチップが32ビットバスに接続されています。明らかに、最初に32ビットで読み書きし、次に次のコマンドのアドレス、実際のオフセット=手動オフセット* interleave * device_type /8、device_type = buswidth /interleave、そしてbuswidthを入力します。時間は32(バス幅)です。また、背中合わせにすると、コマンドのステータスコードと戻り値は "double"になります。たとえば、2つの16ビットバックツーバック、読み取りコマンドは0x00ff00ffです。

Linuxほど柔軟なコードを作成したくない場合(さまざまな接続/ビット幅/CFI取得情報などを考慮した場合)、作業はもっと簡単になります。ポイント1と消去ブロックのサイズを検討してください。もちろん、バックツーバック接続の場合は、消去ブロックの実際のサイズにインターリーブを掛けます。

Linuxコードの入力

CHIP /MAP /MTDの関係はまだ混乱しているので、以下は文脈とさまざまなプログラミングポイントの簡単な説明です。

1:map_info構造体を構築し、ベースアドレス/ビット幅/サイズなどの情報と "cfi_probe"制限を指定してから、do_map_probe()を呼び出します。

2:do_map_probe()は、名前 "cfi_probe"に従ってチップドライバ "cfi_probe.c"を見つけ、直接cfi_probe()を呼び出します。

3:cfi_probe()は、cfi_probe_chip()関数ポインタを渡して、mtd_do_chip_probe()を直接呼び出します。

4:mtd_do_chip_probe()を2つのステップに分け、まずgenprobe_ident_chips()を呼び出してチップ情報を検出し、次にcheck_cmd_set()を呼び出してチップコマンドセットを取得して初期化します(マルチパーティション初期化が含まれています)。

5:genprobe_ident_chips()関数マルチチップ連結を考えていないのであれば、完了後に前回のgenprobe_new_chip()呼び出しを見てください。cfi.chipshift = cfi.cfiq-> DevSize、2 ^ chipshift = FLASHサイズ。

6:genprobe_new_chip()はさまざまなチップビット幅と連続した数を列挙しています設定と組み合わせてcfi> device_type = bankwidth /nr_chips、bankwidth isに注意しながらステップ3でcfi_probe_chip()を呼び出します。バス幅、device_typeはチップ幅です。ここでは、有限の複雑さに注意を払うだけでよく、いわゆる有限の複雑さはコンパイル時に決定された複雑な接続を指します。したがって、cfi_probe_chip()は最初の呼び出しに対してのみ成功し、32ビット幅のFLASHが16ビットバスに挿入された場合、2番目の呼び出しは成功します。

7:cfi_probe_chip()、手順6のため、関数はcfi_chip_setup()で直接返されるため、次のコードは考慮されません。

8:cfi_chip_setup()でCFI情報を読んでください。Linuxがどのようにポイント4を達成しているかに注意を払うことができます。

9:手順4のcheck_cmd_set()ステージに戻り、cfi_cmdset_0001()関数を入力し、最初にread_pri_intelext()を呼び出してIntelの拡張情報を読み、次にcfi_intelext_setup()を呼び出してその構造を初期化します。

10:read_pri_intelext()関数では、可変長構造体の読み方に注意を払うことができます。これは、 "need_more"の使い方です。例えば、StrataFlash 128Mb BottomタイプのFLASHチップの場合、ブロック構造は4 * 32 KB + 127 * 128 KB = 16 MB、合計16パーティション、1パーティションあたり1 MBです。 Nb_parts = 2

◆パート1

NumIdentPartitions = 1 //重複するパーティションが1つあります。

NumBlockTypes = 2 //サブエリアには2種類のブロックタイプがあります。

タイプ1

NumIdentBlocks = 3 //4ブロック(3 + 1)あります。

BlockSize = 0x80 /​​/32KB(0x80 * 256)

2種類

NumIdentBlocks = 6 //7ブロック(6 + 1)あります。

BlockSize = 0x200 //128KB(0x200 * 256)

◆その2 < Br>

NumIdentPartitions = 15 //重複するパーティションが15個あります。

NumBlockTypes = 1 //パーティション内に1種類のブロックがあります。

Type 1

NumIdentBlocks = 7 //8ブロック(7 + 1)があります。

BlockSize = 0x200 //128KB(0x200 * 256)

11:cfi_intelext_setup()関数は、最初にCFIに従ってmtd_erase_region_info情報を作成します。パーティショニングをサポートするためにcfi_intelext_partition_fixup()を呼び出します。

12:cfi_intelext_partition_fixup()は仮想チッ​​プを作成するために使用され、各パーティションは1つのチップに対応しますが、CFI拡張情報に従って完全に確立されるのではなく、各パーティションは同じサイズを持ちます。チップシフトはパートシフトに調整され、各仮想チップ→スタートは各パーティションのベースアドレスに調整される。将来的には、FLASHにアクセスするためのエントリー関数cfi_varsize_frob()はofsに従ってchipnum(chipnum = ofs>> cfi-> chipshift)を得ることになり、それがパーティションが一貫していると仮定される理由である。

Copyright © Windowsの知識 All Rights Reserved