跳转到内容

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 );
华夏公益教科书