VPD是什么?

Vital Product Data(VPD),重要产品数据,是与一组特定硬件或软件相关的配置和信息数据的集合。VPD存储该设备的一些重要信息,例如部件号(part number),序列号(serial number),以及设备指定的一些数据。并非系统连接的所有设备都提供VPD,但通常可从PCI和SCSI设备获得。并行ATA和USB设备也提供类似的数据,但不叫VPD。==>大致翻译自wiki.

本文只考虑PCIe设备的VPD。

VPD在哪里?

VPD是可选的。PCI spec没有规定PCI设备必须要实现VPD,所以其实很多PCI设备都没有提供VPD。

VPD数据一般居住在eeproms中,且系统一般提供I²C,用来访问该eeproms,这种情况下可直接根据设备spec,使用I²C即可取得VPD数据。如果没有I²C的话,还能拿到VPD数据吗?答案当然是可以的。PCI 3.0 spec 中附录I讲的都是VPD,提供了VPD的设备一般都可以在PCI配置空间找到VPD的 Capability结构。如下图(请忽略马赛克),是一个PCIe设备的VPD数据,是在linux系统下使用lspci -s xx:xx.xx -vvv解析出来的,

lspci解析出来的vpd数据

其中[48]表示的vpd capability结构的起始地址是在该设备的PCIe配置空间的offset 0x48处,如下图,

某网卡的PCIe配置空间

offset 0x48 处的值是03,查找PCI spec,

VPD Capability 结构

ID:03H代表的是VPD的CapabilityID,关于Capability List,PCI spec也有详细描述,可自行理解。

Pointer to Next ID:下一个Capability结构的位置,在这个例子是0x9C,是ID为0x11的Capability结构(MSI)。

VPD Address:DWORD双字对齐的字节地址(啥意思?我理解的是往这个VPD Address寄存器写0,1,2,3,VPD Data的结果都是一样的,即写0之后,下一次应该写4,跳过写1,写2,写3),用来访问VPD数据就靠这个和VPD Data了。

F:flag,当向VPD Address写数据的时候,应该一次性写一个word的的数据,此时flag是0,当flag变成1时,便可以从VPD Data读出本次写VPD Address的数据了。

VPD Data:从VPD Data寄存器可以读出VPD的数据,可以看到VPD Data只有4个字节,所以一次性只能读出4个字节的数据。

所以整个读VPD数据的过程就是:

  1. VPD Address寄存器写0,从VPD Data读4个字节数据,
  2. VPD Address寄存器写4,又读4个字节数据。
  3. VPD Address寄存器写8,又读4个字节数据。
  4. …………

直到遇到 End Tag (VPD Data读出了0x78),结束。 所以从VPD Data读出来的4字节数据组合起来就是整个VPD的数据结构。

SN在VPD的什么位置?

OK,到这里,整个VPD的数据就读出来了,但是前面说到,VPD有PN(部件号),SN(序列号),MN(厂商ID)等等,怎么从整个VPD的数据知道哪些是SN,哪些是PN呢?这些SN,PN是在VPD的固定的位置吗?并不是,这里以查找SN为例来说明,

首先,VPD是按tag来分的,VPD的第一个字节一定是Large resource type Identifier String Tag ,实际值是82h,(注意不是下图中的02h,为什么?这部分需要看一下Plug and Play ISA Specification, Version 1.0a.这份spec,总之是需要转换的)。紧接着的是该tag的长度,tag的长度用2个字节表示,长度之后是该tag的实际数据,这个tag(0x82)表示的数据一般是product name。SN属于read only数据,所以我们需要找到Large Resource Type VPD-R Tag (10h),实际值为90h,挨着90h的两个字节是read only tag的长度,长度之后就是关键字Keyword了,前面提到的PN,SN,MN就是关键字,在VPD结构中以ASCII码值呈现,找到需要的"SN",SN后面的一个字节就是SN的长度(lenth)。再之后就是长度为lenth的SN的ASCII码值了,

VPD tag的种类

所以从VPD数据提取SN的流程也很简单:

  1. 先找到read only tag,0x90
  2. 找到keyword为SN,
  3. 找到SN的字符序列。

PCI spec提供了一个VPD结构的example,

VPD example

读取VPD示例代码可参考这里,我自己写的不严谨的就不贴出来献丑了。就写这些,结束。

参考

1.PCI 3.0 spec

2.Vital Product Data

3.https://github.com/zengfushan/qemu-3.0.0-rc1/blob/ead86ec241444361829c2ef15eccd708df5832e8/roms/ipxe/src/drivers/bus/pcivpd.c

pcie 设备号多少位_怎么读取PCIe设备的VPD信息?相关推荐

  1. linux静态分配设备号,Linux驱动开发之静态申请设备号

    一. 1.头文件 include/linux/fs.h 2.API 静态申请设备号 int register_chrdev_region(dev_t, unsigned, const char *); ...

  2. (二)小记——linux 查看主次设备号、以及misc_register生成的次设备号

    本文转载于:http://blog.csdn.net/supenman_mwg/article/details/8023861 http://www.eefocus.com/spencer/blog/ ...

  3. Android Studio 实现点击按钮 调出设备自带的文件管理器 读取手机设备文件

    因为任务需要,想在自己的app里实现一个可以 调出设备自带的文件管理器 的功能. 差了一整天网上的资料,对于读取External Storage的功能的实现,普遍都是要么在app内部已经写了一个固定地 ...

  4. linux驱动主从设备号,在 Linux 设备管理中,除了设备类型外,内核还需要一对被称为主从设备号的参数,才能唯一标识一个设备。( )相同的设备使用相同的驱动程序...

    [单选题]"江山易改,秉性难移"指的是人格的 [单选题]欲设计一个8位的数值比较器,需要用( )片74LS85级联. [多选题]Tricore IO的访问特权级别分为哪些级? [多 ...

  5. Linux嵌入式开发_主设备号与次设备号详解

    前言 在Linux内核中设备号的作用是用来区分不同的设备类型. 比如: 设备号23,对应的是LED 设备号17,对应的是某个存储设备 等等... 主次设备号 主设备号:对应设备的主号码 次设备号:对应 ...

  6. usb接口驱动_乾坤合一~Linux设备驱动之USB主机和设备驱动

    这一章从主机侧角度看到的USB 主机控制器驱动和设备驱动从主机侧的角度而言,需要编写的USB 驱动程序包括主机控制器驱动和设备驱动两类,USB 主机控制器驱动程序控制插入其中的USB 设备,而USB ...

  7. 主设备号与次设备号以及申请

    一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为设 备号.主设备号用来表示一个特定的驱动程序.次设备号用来表示使用该驱动程序的各 设备.例如一个嵌入式系统,有两个LED指示灯 ...

  8. linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 - jinzi - 博客园+ 剽窃 过来的.  记录下,以备查. 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为 ...

  9. linux中的 主设备号与次设备号

    linux主设备号和次设备号 Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件.应用程序可以打开.关闭和读写这些设备文件, 完成对设备的操作,就像操 ...

最新文章

  1. mysql 命令源码_MySQL常用命令
  2. 用python客户画像代码_客户画像与标签体系-Python数据科学技术详解与商业项目实战精讲 - Python学习网...
  3. 【oracle】TNS-03505: 无法解析名称
  4. python中单双三引号区别_python基础题
  5. linux socket bind 内核详解,Socket与系统调用深度分析(示例代码)
  6. ICCV 2021 第二届无人车视觉(AVVision)研讨会征稿
  7. aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用
  8. 光线如何从宇宙黑暗时代逃逸:黑洞让宇宙变光明
  9. linux 输入--输出--重定向 stdin/stdout/stderr
  10. 2010-11-25
  11. crc java_求这个CRC16算法的java版实现!!!
  12. nero8 刻录 avi文件
  13. 官方win10安装教程,win10系统一键安装方法
  14. 天眼查 乱码 java_反爬虫解析-字体替换(天眼查/猫眼电影)
  15. Mininet系列实验(三):Mininet命令延伸实验扩展
  16. c语言自动输入一位数字,c语言:要求输入一个四位整数,然后将各位数字按英文输出...
  17. 全景拍摄中相机的对焦方式有哪些?
  18. 第四周实验报告 任务1
  19. 工信部网站备案系统升级完成 新增备案用户激增
  20. MySQL--查询操作

热门文章

  1. 关于产品版本英语缩写
  2. android NDK JNI设置自己的log输出函数
  3. Linux挂载NTFS分区方法
  4. 遇java.lang.OutOfMemoryError: PermGen space之解决方案
  5. OpenLayer + Ags 综合应用(一)--OpenLayer 地图展现
  6. jdk1.8api中文版下载(帮助文档)
  7. SparkStreaming官方示例程序运行方式
  8. Python-random模块-59
  9. element,点击查看,实现tab切换:
  10. jenkins关闭,重启几种方式