我正在开发一个简单的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
提前感谢您的帮助。
答案 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,因此这不是问题的答案。