如何从 CLI 读取 Linux 中的特定 PCI 设备寄存器?

Pau*_*gar 5 linux pci

为了控制我的背光,我需要执行以下操作:

sudo setpci -s 00:02.1 F4.B=x
Run Code Online (Sandbox Code Playgroud)

这可以读作:

对于 ID 为 00:02.1 的 PCI 设备,将寄存器 F4(仅限字节)设置为 x。

为了找出我想要的 x 值,我想读取它的当前值(在我正在编写的脚本中)。我该怎么做呢?

早期工作

这似乎是lspci. 我试过

sudo lspci -x -s 00:02.1
Run Code Online (Sandbox Code Playgroud)

但这并没有提供足够的范围(没有到达寄存器/地址 F4)。但是,我可以使用-xxx命令行来完成。这给了我一个转储,我可以在其中看到 F4 处的字节,我验证了我可以使用setpci命令进行操作。但是,手册上说:

  -xxx   Show hexadecimal dump of the whole PCI configuration space. It is  available  only  to  root  as  several  PCI
         devices  crash when you try to read some parts of the config space (this behavior probably doesn't violate the
         PCI standard, but it's at least very stupid). However, such devices are rare, so you needn't worry much.
Run Code Online (Sandbox Code Playgroud)

所以我宁愿不把它放在一个以 root 身份自动运行的程序中。有什么方法可以读取寄存器 F4 的值?一个getpci程序?一个setpci标志?lspci我错过了一些特殊的标志?

(环境是三星 N140 上网本上的 Ubuntu Netbook Remix 9.04(karmic)(32 位))

qua*_*ote 9

你想要的程序setpci。看起来这种格式可以满足您的需求:

setpci -s 00:02.1 F4.B
Run Code Online (Sandbox Code Playgroud)

请参阅man setpci:与您的版本的唯一区别是您正在尝试设置寄存器,因此您对其进行命名并分配一个值(“ F4.B=x”)。在这里,只需命名它;不要赋值。

从联机帮助页:

操作

要查询配置寄存器的值,只需为其命名(通过键入其名称或键入带有可选的 .B、.W 或 .L 后缀的寄存器地址,将寄存器宽度指定为字节、字或长字)。

要设置寄存器,请写入 reg=values,其中 reg 与您用于查询寄存器的相同,values 是您要从给定地址开始写入的逗号分隔值列表。要写入的每个值都可以指定为十六进制数或位:掩码对,这会导致掩码中对应于二进制位的位更改为位中相应位的值

  • 使用“setpci --dumpregs”列出所有注册表名称。也可以直接通过 `-d 1234:5678` 使用设备 ID。 (2认同)