タグ: KSEG1ADDR

KSEG1ADDR() メモ

Adding new device support[OpenWrt Wiki]の “KSEG1ADDR() and accessing NOR flash” をざっくり訳したメモ。
自分のわかりやすさ優先で、ところどころ言い回しを置き換えた。上手く訳せなかった個所もあるけれども、大体言おうとしていることはわかるからいいやということで。

  • KSEG1ADDR() と NOR フラッシュのアクセス

    ボードのMACアドレスやEEPROM、その他のキャリブレーションデータを得るには、カーネル上でフラッシュから読み込む必要があるかもしれません。NOR フラッシュを使用しているほとんどのAtheros チップの場合、init 関数内で実行されるプロセスコンテキストのために、フラッシュのハードウェアアドレスを仮想アドレスに変換する KSEG1ADDR() マクロを使用して行われます。
    もしあなたがボード初期化のコードを調査している時に、例えばこの “KSEG1ADDR(0x1fff0000)” を見た際に、この数字は最初魔法のように現れます。しかし、これは2つの点を理解すれば論理的なものです。

    まず最初に、NOR フラッシュを使用しているAtheros SoCのフラッシュは物理アドレス 0x1f000000 へ結線されます(フラッシュがボード上でどこに接続されるかの保証はありません。しかし、これは一般的な場所です)。このアドレスはブートローダへ与えるアドレスとして当てにすることはできず、 0xbf000000 を見る必要がありますが、これは恐らくは仮想アドレスです。
    もしボード上でフラッシュがこれらのメモリーの場所に結線されている場合、 KSEG1ADDR(0x1f000000 + OFFSET_FROM_BEGIN) を使用して確実にフラッシュへアクセスできるでしょう。しかし、フラッシュの終端に非常に近いと想定されるデータにアクセスする必要がある機会には、複数サイズのフラッシュメモリと互換性のあるコードを作るトリックを利用することができます。
    フラッシュは、しばしばそれが 4MB や 8MB 、16MB という実際の容量に関わらず 16MB 一杯のアドレス空間としてマッピングされます。そのため、この場合では KSEG1ADDR(0x20000000 – OFFSET_FROM_END) がフラッシュメモリの終端から特定の距離離れたものへのアクセスとして機能します。
    KSEG1ADDR(0x1fff0000) を見た時、デバイスは 4MB または 8MB のフラッシュを持っており、それはフラッシュ終端から 64KB 戻った地点のフラッシュ(ここには “Atheros Radio Test (ART) データが格納されています)を参照するのにこのトリックを使用しているということを推測するのに理にかなっています。