Linux C获取PCI设备名和厂商名

时间:2022-10-16 17:37:31

一、接口

char *pci_lookup_name(struct pci_access *a, char *buf, intsize, int flags, ...) PCI_ABI;

(/usr/include/pci/pci.h)                   

二、描述

Linux C获取PCI设备名和厂商名

在/sys/bus/pci/devices/<pci address>目录下面可以读取PCI设备的VendorId(从vendor文件获取), DeviceId(从device文件获取),但是关于vendor的文字描述和device的文字描述却没有。

1)  刚开始的时候使用lspci来获取vendor和device的文字描述,但是效率比较低;

Linux C获取PCI设备名和厂商名

2)  现在使用pci_lookup_name()接口来获取vendor和device的文字描述;

             pacc->id_lookup_mode = 0;

             默认安装的pci开发库,必须要在调用pci_lookup_name()之前,初始化为0。否则当/usr/share/hwdata/pci.ids文件不存在,或则在pci.ids文件中找不到vendor id(device id)对应的描述时,pci_lookup_name()会Segment fault。

struct pci_access *pacc;
pacc = pci_alloc();
pacc->id_lookup_mode = 0;
if( !pci_lookup_name( pacc, name, 256,
PCI_LOOKUP_VENDOR,
vendor,device ) )
{
fprintf( stderr, "fail to get pci vendor\n" );
return -1;
}
printf( "vendor: %s\n", name);

if( !pci_lookup_name( pacc, name, 256,
PCI_LOOKUP_DEVICE,
vendor,device ) )
{
fprintf( stderr, "fail to get pci device\n" );
return -1;
}
printf( "device: %s\n", name);

pci_cleanup(pacc );

三、示例输出

Linux C获取PCI设备名和厂商名

四、示例代码

http://download.csdn.net/detail/qq123386926/9426785

五、注

1)编译时,加上-lpci;

2)g++编译时,引入头文件时,

#ifdef __cplusplus

extern "C" {

#endif

#include <pci/pci.h>

#ifdef __cplusplus

}

#endif

不然即使编译通过,在运行时调用pci.h里面的接口时,会报undefine symbol的错误