c - 如何读取 PCI 卡中的 VPD 寄存器

标签 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 main(int argc, char *argv[])
{
    int sno, i;

    sno = *(int *)SNO_ADDR;

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

    printf("\n");
    exit(0);
}

此代码适用于特定设备,在公共(public)任务中无法使用。 现在我发现 VPD 可以帮助我。请告诉我如何读取这些数据。

最佳答案

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

对于以太网卡,具体而言,您通常可以读取其“内置”MAC 地址并将其用作序列号的代理,因为它应该是唯一的。 (我说“通常”是因为 PCI要求以太网卡没有内置 MAC。但是,我从未见过没有内置 MAC 的以太网卡。)

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

关于c - 如何读取 PCI 卡中的 VPD 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50159103/

相关文章:

c++ - 使用宏访问 C 中的结构成员名称

c++ - 如何将虚拟 com 端口写入 TCP 驱动程序?

c - C中的结构体和指针

c - 使用成员函数访问结构体内部的成员?

Azure虚拟机: Update Microsoft ODBC Driver via Powershell

c - 无法从 lsm9ds0_acc_mag 设备驱动程序读取输出

linux - 如何强制内核重新读取/重新初始化 PCI 设备 ID?

c - 通过 USB 使用 FPGA 访问 PC 的 PCI 卡

linux - 有没有办法让 Linux 内核重新运行它的 PCI 初始化代码?

c - 如何在 Xcode 4 中链接库?