如何在PCI卡中读取VPD reg

如何在PCI卡中读取VPD reg,c,driver,pci,C,Driver,Pci,我有一个PCI卡,我想用C写驱动程序 我的问题是在硬件中找不到我真正需要的序列号 我认为每个PCI卡都必须有唯一的制造ID,可能类似于盒子上的条形码 我访问总线和插槽并添加所需的数据,但找不到解决问题的方法 解决方案的代码不可用 #include <stdio.h> #include <stdlib.h> #define FLASH_BASE_ADDR 0x80000000 #define SNO_ADDR (FLASH_BASE_ADDR + 0x4C) int m

我有一个PCI卡,我想用C写驱动程序

我的问题是在硬件中找不到我真正需要的序列号

我认为每个PCI卡都必须有唯一的制造ID,可能类似于盒子上的条形码

我访问总线和插槽并添加所需的数据,但找不到解决问题的方法

解决方案的代码不可用

#include <stdio.h>
#include <stdlib.h>
#define FLASH_BASE_ADDR 0x80000000
#define SNO_ADDR (FLASH_BASE_ADDR + 0x4C)


int main(int argc, char *argv[])
{
    int sno, i;

    sno = *(int *)SNO_ADDR;

    printf("The serial number is %d.\n", sno);

    printf("\n");
    exit(0);
}
#包括
#包括
#定义FLASH\u BASE\u ADDR 0x8000000
#定义SNO地址(闪存基本地址+0x4C)
int main(int argc,char*argv[])
{
int sno,i;
sno=*(int*)sno_ADDR;
printf(“序列号为%d.\n”,sno);
printf(“\n”);
出口(0);
}
此代码用于特定设备,在公共任务中不可用。
现在我知道VPD可以帮我了。请告诉我如何读取这些数据。

PCI卡完全不需要软件可访问的序列号。我曾使用过许多没有序列号的卡片(或者至少数据表中没有记录这种情况)。因此,此序列号(如果存在)的位置和访问方法将完全特定于设备

具体来说,对于以太网卡,您通常可以读取其“烧入”MAC地址,并将其用作序列号的代理,因为它应该是唯一的。(我之所以说“典型”,是因为PCI不要求以太网卡有烧坏的MAC。然而,我从未见过没有烧坏的


通常,MAC地址将存储在卡上的EEPROM或类似设备中,并且有一种通过位于卡的PCI条区域之一的设备寄存器从EEPROM读取数据的机制。然而,MAC地址的确切位置和访问它的方法(同样假设它有一个)也是特定于设备的

为什么您的代码不可用?您不能天真地从用户程序访问harware寄存器。你需要一个司机来做那件事。但这可能超出了您目前的范围。确切地说,我不知道,但我认为此地址不通用,不能用于所有pci设备Hanks Michael我使用此驱动程序用于实时操作系统并加载它我的驱动程序工作正常,但其中一个重要部分是我的硬件制造id@Hessan好,从头开始编写驱动程序是一项非常艰巨的任务,即使只是获取序列号也是一项非常艰巨的任务,无法回答有关stackoverflow的问题。另一方面,如果您使用的是特定的操作系统(是吗?),那么操作系统可能已经有了编写PCI驱动程序的框架,从而使您从几个月的工作中解脱出来。谢谢gil。是的,通常工作中的驾驶员不需要序列号,但出于我的目的,我必须找到它。我的pci卡不是使用mac的以太网。最近我发现关键词“VPD”,我想这是我的解决方案。我试着找到一种方法来访问它。有人用过吗?使用你发布的代码元素进行的网络搜索表明你从中获得了代码。然而,该页适用于该制造商制造的一组特定设备:UC-7110和UC-7112。这些是小型嵌入式计算机,不是PCI卡。VPD是包含在某些硬件中的数据存储,但也是非常特定于设备的。如果不确定您感兴趣的特定设备,没有人能够帮助您。即使你这样做了,任何答案都只适用于单一的设备类型。就是这样。我现在在“cp-132 ul”上工作,并尽快在与之不同的其他板上工作。我想他们中的大多数人都必须有一个通用的解决方案