« 大量のコントロール・ステータス・レジスタをVivadoで作る方法 | トップページ | VivadoでのSynthesizeを速くしたい »

2016.09.01

ZYNQでQSPI ROMを使う方法

ZYNQ搭載のADCボード「Cosmo-Z」には、128MbitのQSPI ROM(N25Q128A11)が乗っています。

N25q128


これまでのCosmo-Zでは、QSPI ROMはLinuxから認識されないため、活用してこれなかったのですが、ようやくその原因と使いかたがわかりました。

sun

ZYNQのLinuxをビルドすると、QSPI ROMのデバイスドライバ(MTD: Memory Technology Driver)は標準で入っています。なので、カーネルから認識されない原因はデバイスツリーにありました。

Cosmo-Zのデバイスツリーを、dtcを使って逆コンパイルしてみてみると、

ps7-qspi@e000d000 {
    clock-names = "ref_clk", "pclk";
    clocks = <0x2 0xa 0x2 0x2b>;
    compatible = "xlnx,zynq-qspi-1.0";
    interrupt-parent = <0x3>;
    interrupts = <0x0 0x13 0x4>;
    is-dual = <0x0>;
    num-cs = <0x1>;
    reg = <0xe000d000 0x1000>;
    xlnx,fb-clk = <0x1>;
    xlnx,qspi-mode = <0x0>;
    #address-cells = <0x1>;
    #size-cells = <0x0>;
    flash@0 {
        compatible = "n25q128";
        reg = <0x0>;
        spi-tx-bus-width = <0x1>;
        spi-rx-bus-width = <0x4>;
        spi-max-frequency = <0x2faf080>;
        #address-cells = <0x1>;
        #size-cells = <0x1>;
        partition@qspi-fsbl-uboot {
            label = "qspi-fsbl-uboot";
            reg = <0x0 0x100000>;
        };
        partition@qspi-linux {
            label = "qspi-linux";
            reg = <0x100000 0x500000>;
        };
        partition@qspi-device-tree {
            label = "qspi-device-tree";
            reg = <0x600000 0x20000>;
        };
        partition@qspi-rootfs {
            label = "qspi-rootfs";
            reg = <0x620000 0x5e0000>;
        };
        partition@qspi-bitstream {
            label = "qspi-bitstream";
            reg = <0xc00000 0x400000>;
        };
    };
};
ps7-qspi-linear@fc000000 {
    clock-names = "ref_clk", "aper_clk";
    clocks = <0x2 0xa 0x2 0x2b>;
    compatible = "xlnx,ps7-qspi-linear-1.00.a";
    reg = <0xfc000000 0x1000000>;
};

となっています。

問題だったのは、上のn25q128と書かれた部分です。ここをn25q128a11に変えればMTDドライバは問題なく認識され、

m25p80 spi0.0: n25q128a11 (16384 Kbytes)
1 ofpart partitions found on MTD device spi0.0
Creating 1 MTD partitions on "spi0.0":

と、表示されます。MTDドライバは、n25q128でも、n25q128aと書いてもでもだめで、n25q128a11の型番の末尾の11までちゃんと区別しているようです。

さて、QSPIドライバの使い方は、XILINXのWikiにあるのですが、

http://www.wiki.xilinx.com/Zynq+QSPI+Driver

これを試してみましょう。ただ、このWikiの内容はQSPI ROMを5つのパーティションに分けているのですが、Cosmo-ZではQSPIからのブートはしないので、このQSPIを16MBのフラットな領域として扱おうと思います。

したがって、デバイスツリーのflash@0とかいうところで、

partition@qspi-all {
    label = "qspi-all";
    reg = <0x0 0x1000000>;
};

と書いておきます。こうすると、0番地から16MBの領域がqspi-allというパーティションになり、起動時には

Creating 1 MTD partitions on "spi0.0":
0x000000000000-0x000001000000 : "qspi-all"

と表示されます。

cat /proc/mtd

で見てみると、

zynq> cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01000000 00010000 "qspi-all"

と表示されます。

QSPIのFlashROMは、そのまま生で使うか、ファイルシステムを作るかが選べるようです。ファイルシステムを作る場合はまず、

flash_eraseall -j /dev/mtd0

でフラッシュを一度消去します。

そして、

mkdir /qspi

でマウント用のディレクトリを作り、

mount -t jffs2 /dev/mtdblock0 /qspi

でマウントします。jffs2というのは、ウェアレベリングしながら扱ってくれるフラッシュROM用のファイルシステムだそうです。

これでマウントできるので、あとは、普通にファイルを何でも放り込むだけです。ただし、結構遅いです。

私はQSPI ROMに、ボードのシリアル番号や、ADCのキャリブレーションデータ、回路のカスタマイズの有無など、ボード1枚1枚ごとに固有の情報を入れておこうとおもいます。

zynq> ls -al
total 1
drwxr-xr-x    2 root     root             0 Jan  1  1970 .
drwxr-xr-x    4 root     root             0 Jan  1  1970 ..
-r--r--r--    1 root     root           180 Jan  1  1970 adcconf
-rw-r--r--    1 root     root             4 Jan  1  1970 serialnum

|

« 大量のコントロール・ステータス・レジスタをVivadoで作る方法 | トップページ | VivadoでのSynthesizeを速くしたい »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 大量のコントロール・ステータス・レジスタをVivadoで作る方法 | トップページ | VivadoでのSynthesizeを速くしたい »