只能从ioremap()内存中读取0

时间:2013-07-15 11:18:32

标签: linux linux-device-driver xilinx spi ioremap

我正在开发一个简单的linux驱动程序,它将通过SPI与设备通信。 在我使用request_mem_region和ioremap之后我可以从返回的地址读取所有内容 即使我写了一个值。偏移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;
}

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为这可能就是这样,所以我把它放在一个答案中。我对Xilinx很熟悉,但不熟悉SPI内核。我刚看了Xilinx SPI core data sheet。第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));

当然,这当然是假设由于某种设置而没有从IP核中删除IPIER寄存器。


编辑: 根据Op的评论,Op不使用SPI IP Core,因此这不是问题的答案。