阅读:2425回复:6
pci BaseAddress
我通过ddk提供的函数HalGetBusData()等获得pci的BaseAddress(IO Space), 根据pci定义offset 0-1是vendor ID, 结果这样做结果却读不出vendor ID: USHORT value = READ_PORT_USHORT(BaseAddress).是何原因?
|
|
沙发#
发布于:2001-07-09 19:21
好象PCI配置空间与BaseAddress0没有直接对应关系,除非象9054那样有一个类似PCI配置空间头的寄存器地址空间。
|
|
板凳#
发布于:2001-07-10 10:04
根据我对pci配置空间理解,pci配置空间保存着和某一pci设备有关的各种信息,包括供应商标识(VendorID),设备号(DeviceID),基址(BaseAddress)等.BaseAddress0-5寄存器和VendorID寄存器都是pci配置空间的一部分.BaseAddress0在pci配置空间中的偏移量为0x10,而Vendor ID在pci配置空间中偏移量为0x0,两者之间没有什么直接的关系.况且BaseAddress的值并不能直接使用,应根据它是映射在I/O空间还是Memory空间进行地址转换.具体转换方法还是参照pci spec.,网站上有.
|
|
地板#
发布于:2001-07-10 10:16
感谢两位大虾指点. 但是我说的不是这个意思. 首先这是IO空间, 我通过获得BbaseAddress0-5的值, 产生一个IO指针(PhisalAddress.LowPart), 那么这个指针指向的是那儿? 配置头应该也有一个基地址, 和这个指针有什么关系?
|
|
地下室#
发布于:2001-07-10 10:46
pci的设备寄存器在Memory空间一般情况下被映射到很高的地址空间,必须经过重映射才能访问
[dos 编辑于 2001-07-10 16:00] |
|
5楼#
发布于:2001-07-10 13:24
ULONG addressSpace;
PHYSICAL_ADDRESS address; PULONG portStart; HalTranslateBusAddress( ... &addressSpace, &address ); // // now, addressSpace == 1 // portStart = address.LowPart; // //now, portStart == 0xe000 // portStart指向什么地方? 如果READ_PORT_ULONG(portStart)返回什么值? |
|
6楼#
发布于:2001-07-10 16:00
这当然和pci设备有关,portStart与pci设备的起始寄存器相对应.读出的是该设备第一个寄存器的值.从所给的地址(0xe000)看,这应该是映射到I/O空间的地址,可以直接访问.
|
|