我正在为linux开发一个简单的驱动程序,它可以通过SPI与设备对话。在我使用request_mem_region和ioremap之后,我可以从返回的地址读取的所有数据都是0,即使我向它写入了一个值。偏移量0处的地址应该是SPI控制器的控制寄存器(它是一个Xilinx )。在引导过程中,使用初始值设置控制寄存器。
代码:
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
提前感谢您的帮助。
发布于 2013-07-16 07:33:31
我想这可能就是它,所以我把它放在一个答案中。我对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,所以这不是问题的答案。
https://stackoverflow.com/questions/17653016
复制相似问题