D 程式設計/RTAI/訪問 PCI 硬體
外觀
在核心 2.6 中,所有關於裝置的資訊都儲存在 /sys 目錄中。您可以在 /sys/bus/pci/devices/ 下找到您的裝置。每個 PCI 裝置目錄都以 "bus:slot.function" 的組合命名。在裝置目錄中,您會找到名為以下內容的檔案
- vendor
- 供應商 ID 是每個供應商的唯一號碼。它由 pci-sig 分配,需要會員資格。
- device
- 裝置 ID 是供應商選擇的唯一號碼。
- irq
- 分配的 IRQ RTAI 中的 IRQ 處理
- resources
- 裝置的記憶體映像及其標誌
- resource0
- 裝置配置空間的虛擬檔案
- resource1-5
- 包含記憶體映像的虛擬檔案。
檔案可能如下所示
0x00000000feafe000 0x00000000feafefff 0x0000000000000200 0x00000000feaf0000 0x00000000feaf7fff 0x0000000000000200 0x00000000feafd000 0x00000000feafdfff 0x0000000000000200 0x00000000feafc000 0x00000000feafcfff 0x0000000000000200 0x00000000feac0000 0x00000000feadffff 0x0000000000000200 0x00000000fea40000 0x00000000fea7ffff 0x0000000000000200 0x0000000000000000 0x0000000000000000 0x0000000000000000
這些行是影像 0..6,0 是配置空間,1-5 是裝置相關的,6 是可選的 ROM。第一列是影像的起始地址,第二列包含結束地址(包含)。第三列包含影像的標誌。標誌的常量可以在以下位置找到/usr/src/linux/include/linux/ioport.h.
- IORESOURCE_IO
- 影像只能透過 IO 埠訪問(outb、inb 等宏)
- IORESOURCE_MEM
- 可以透過正常的記憶體訪問訪問影像
- IORESOURCE_IRQ
- ???
- IORESOURCE_DMA
- ???
- IORESOURCE_PREFETCH
- 可以快取對影像的訪問(無副作用)
- IORESOURCE_READONLY
- 記憶體是隻讀的
- IORESOURCE_CACHEABLE
- 記憶體寫入可以被快取
- IORESOURCE_RANGELENGTH
- ???
- IORESOURCE_SHADOWABLE
- ???
- IORESOURCE_BUS_HAS_VGA
- ???
- IORESOURCE_DISABLED
- ???
- IORESOURCE_UNSET
- ???
- IORESOURCE_AUTO
- ???
- IORESOURCE_BUSY
- 驅動程式已將此資源標記為繁忙
影像檔案 .../resource1-5 已準備好使用。所以你只需要執行兩個步驟,開啟和對映
uint aLength = 4096
uint mFileDescriptor = open( "/sys/bus/pci/devices/0000:02:09.0/resource2", O_RDWR );
uint* ptr = cast(uint*) mmap(
null,
aLength,
PROT_READ|PROT_WRITE,
MAP_SHARED,
mFileDescriptor,
0);
// If ptr == -1, than the user was probably not root
assert( cast(uint)ptr != uint.max );
uint[] mMemory = ptr[0 .. aLength/4];
如果完成,不要忘記關閉資源
munmap( mMemory.ptr, mMemory.length ); close( mFileDescriptor );