SPI 経由でデバイスと通信する Linux 用の単純なドライバーを開発しています。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;
}
モジュールを挿入したときの出力は次のとおりです
。Driver init complete. アドレス 0xE08C2000 にマッピング
0
助けてくれてありがとう。