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 );