gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:08 26 4
gpt4 key购买 nike

我正在为 Linux 开发一个简单的驱动程序,它将通过 SPI 与设备通信。在我使用 request_mem_region 和 ioremap 之后,我可以从返回的地址读取的所有内容都是 0即使我给它写了一个值。偏移量 0 处的地址应该是 SPI Controller 的控制寄存器(它是 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

预先感谢您的帮助。

最佳答案

我认为可能是这样,所以我将其放入答案中。我总体上熟悉 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));

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

<小时/>

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

关于linux - 只能从 ioremap() 内存中读取 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17653016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com