4

PCIeカード上のFPGAのメモリにアクセスするためのデバイスドライバを作成しています。
カードが起動し、プローブ/検出されます:-

/ proc / iomem

80000000-840fffff : PCI Bus #03
  80000000-83ffffff : 0000:03:00.0
  84000000-840fffff : 0000:03:00.0

request_mem_regionそこで、ldd / etcを読んで、での呼び出しをコーディングし、80000000を介してそれへのポインタを要求しました。ioremap_nocache

1)必要がありますか、後者だけを使用することはできませんかrequest_mem_regionioremap_nocache

/ proc / iomeminsmodデバイスドライバーの後:-

80000000-840fffff : PCI Bus #03
  80000000-83ffffff : 0000:03:00.0
    80000000-8003ffff : fp2
  84000000-840fffff : 0000:03:00.0

2)私にはまったく正しく見えません...?

とにかく、読み取りは機能しません(以下のようにコーディングされていない、チェックなどがあります):-

#define BAR_ADDR 0x80000000
void *base = ioremap_nocache(BAR_ADDR, 0x40000);
void *address = base + KNOWN_REG_LOCATION;
int data = ioread32(address);
printk("fp2: address:0x%08x, data:0x%08x\n", address, data);

出力:-

address:0xfd500000, data:0xffffffff

x80000000+KNOWN_REG_LOCATIONmmapユーザースペースから読み取ることができます。

3)私も試しました__raw_readl/readl運がありません。

4)現在マップされているアドレスで読み取ることはできますx80000000か?

4

1 に答える 1

6

イアン、

デバイス用の PCI ドライバーを作成しました (完全なソース)。ただし、レジスタ空間のマッピングは同じである必要があります。これが私のやり方です。

dm7820_device->pci[region].virt_addr = ioremap_nocache(address, length);
if (dm7820_device->pci[region].virt_addr == NULL) {
    printk(KERN_ERR "%s: ERROR: BAR%u remapping FAILED\n",
        &((dm7820_device->device_name)[0]), region);
    dm7820_release_resources();
    return -ENOMEM;
}

if (request_mem_region(address, length, &((dm7820_device->device_name)[0])) == NULL) {
    printk(KERN_ERR "%s: ERROR: I/O memory range %#lx-%#lx allocation FAILED\n",
        &((dm7820_device->device_name)[0]), address, (address + length - 1));
    dm7820_release_resources();
    return -EBUSY;
}

アドレスと長さの値は、pci_resource_start()と のpci_resource_length()呼び出しから返されます。

ioread32()次に、を使用してアクセスできますdm7820_device->pci[region].virt_addr + <register offset>

ご不明な点がございましたら、お知らせください。

于 2011-03-04T14:32:05.890 に答える