跳轉到內容

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
包含記憶體映像的虛擬檔案。

.../resource 的格式

[編輯 | 編輯原始碼]

檔案可能如下所示

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 );
華夏公益教科書