我正在为 linux 开发一个简单的驱动程序,它将通过 SPI 与设备通信。在我使用 request_mem_region 和 ioremap 之后,即使在我向其写入值之后,我可以从返回的地址读取的所有内容都是 0。偏移量 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;
}
插入模块时的输出是:
驱动程序初始化完成。映射到地址 0xE08C2000
0
提前感谢您的帮助。