首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只能从ioremap()内存读取0

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

Stack Overflow用户
提问于 2013-07-15 11:18:31
回答 1查看 2.5K关注 0票数 0

我正在为linux开发一个简单的驱动程序,它可以通过SPI与设备对话。在我使用request_mem_region和ioremap之后,我可以从返回的地址读取的所有数据都是0,即使我向它写入了一个值。偏移量0处的地址应该是SPI控制器的控制寄存器(它是一个Xilinx )。在引导过程中,使用初始值设置控制寄存器。

代码:

代码语言:javascript
复制
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

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2013-07-16 07:33:31

我想这可能就是它,所以我把它放在一个答案中。我对Xilinx很熟悉,但对SPI核心不太熟悉。我刚看了一下Xilinx SPI核心数据表。第8页的表4载有登记册的摘要。基址上没有寄存器。我不知道核心为什么会响应基本地址,但可能是硬编码为0。

无论如何,在ioremap()尝试之后,可以这样做:

代码语言:javascript
复制
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,所以这不是问题的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17653016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档