0

SPI 経由でデバイスと通信する Linux 用の単純なドライバーを開発しています。request_mem_region と ioremap を使用した後、値を書き込んだ後でも、返されたアドレスから読み取ることができるのはすべて 0 です。オフセット 0 のアドレスは、SPI コントローラー (Xilinx Zynq SoC) の制御レジスターである必要があります。コントロール レジスタは、ブート プロセス中に初期値が設定されます。

コード:

int device_init() {
    int ret;
    ret = register_chrdev(device_major, DEVICE_NAME, &fops);
    if(ret < 0) {
        printk(KERN_ALERT "spi: cannot obtain major number %d.\n", device_major);
        return ret;
    }

    if(request_mem_region (SPI_ADDR, SPI_SIZE, "SPI Driver") == NULL)
    {
        printk("Failed to request memory region!\n");
        device_exit();
        return 1;
    }
    spi = ioremap(SPI_ADDR, SPI_SIZE);
    if(spi == NULL)
    {
        printk("I/O remap failed\n");
        device_exit();
        return 1;
    }

    printk("Driver init complete. Mapped to address 0x%X\n", spi);
    iowrite32be(0x20000, spi);
    printk("%X\n", ioread32be(spi));
    return 0;
}

モジュールを挿入したときの出力は次のとおりです
。Driver init complete. アドレス 0xE08C2000 にマッピング
0

助けてくれてありがとう。

4

1 に答える 1

0

多分これだと思うので回答させていただきます。私は一般的にザイリンクスに精通していますが、特に SPI コアには精通していません。ザイリンクス SPI コアのデータシートを見てみました。8 ページの表 4 にレジスタの概要を示します。ベースアドレスにはレジスタがありません。コアがベース アドレスに応答する理由はまったくわかりませんが、0 にハード コードされている可能性があります。

とにかく、ioremap()これを試した後:

void *ipier;

ipier = spi + 0x28;
printk("Driver init complete. Mapped to address 0x%X\n", spi);
iowrite32be(0x20000, ipier);
printk("%X\n", ioread32be(ipier));

もちろん、これは、何らかの設定のために IPIER レジスタが IP コアから削除されていないことを前提としています。


編集: 以下の Op のコメントによると、Op は SPI IP コアを使用していないため、これは質問に対する回答ではありません。

于 2013-07-16T07:33:31.543 に答える