Como ler um registro de dispositivo PCI específico no Linux da CLI?

4

Para controlar minha luz de fundo, preciso fazer o seguinte:

sudo setpci -s 00:02.1 F4.B=x

Isso pode ser lido como:

Para o dispositivo PCI com o ID 00: 02.1, defina o registro F4 (somente byte) como x.

Para descobrir um valor que eu quero para x, gostaria de ler seu valor atual (em um script que estou escrevendo). Como faço isso?

Trabalho adiantado :

Este parece ser o domínio de lspci . Eu tentei

sudo lspci -x -s 00:02.1

mas isso não dá alcance suficiente (não atinge registro / endereço F4). Eu posso fazer isso com a linha de comando -xxx , no entanto. Isso me dá um dump no qual posso ver o byte em F4, que verifiquei que posso manipular com o comando setpci . No entanto, o manual diz:

  -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.

Então eu prefiro não colocar isso em um programa que é executado automaticamente como root. Qualquer maneira de apenas ler o valor para o registrador F4? Um programa getpci ? Um sinalizador setpci ? Alguma bandeira lspci especial que perdi?

(O ambiente é Ubuntu Netbook Remix 9.04 (kármico) (32 bits) em um netbook Samsung N140)

    
por Paul Biggar 26.12.2009 / 01:22

2 respostas

8

Você quer o programa setpci . Parece que esse formato faria o que você deseja:

setpci -s 00:02.1 F4.B

Veja man setpci : a única diferença com a sua versão é que você está tentando definir o registro, então você nomeia e atribui um valor (" F4.B=x "). Aqui, apenas nomeie; não atribua um valor.

Na página de manual:

Operations

To query value of a configuration register, just name it (either by typing its name or by typing register address with optional .B, .W or .L suffix specifying register width as byte, word or longword).

To set a register, write reg=values where reg is the same as you would use to query the register and values is a comma-separated list of values you want to write starting with the given address. Each value to be written can be specified either as a hexadecimal number or as a bits:mask pair which causes the bits corresponding to binary ones in the mask to be changed to values of the corresponding bits in the bits

    
por 26.12.2009 / 01:51
1

Considere que isso não funcionará se o seu monitor usar a nova interface intel_backlight (até esta data, somente o gerenciador de energia do GNOME pode gerenciá-lo).

Por favor, leia isto: link e os links listados Especialmente meu post (sob o nome de Álvaro)

    
por 22.11.2011 / 11:19

Tags