0

我正在为 linux 开发一个简单的驱动程序,它将通过 SPI 与设备通信。在我使用 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;
}

插入模块时的输出是:
驱动程序初始化完成。映射到地址 0xE08C2000
0

提前感谢您的帮助。

4

1 回答 1

0

我想这可能是它,所以我把它放在一个答案中。我对 Xilinx 很熟悉,但对 SPI 内核并不特别熟悉。我刚刚查看了Xilinx 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 回答