Existe algum substituto para 'lspci'?

3

lspci não está implementado em petalinux. Então, existe alguma alternativa para isso? Qualquer arquivo onde eu possa ler lspci output?

    
por gpuguy 25.03.2014 / 14:39

2 respostas

8

O arquivo /proc/bus/pci/devices pode ajudar:

$ cut -f1,2,18 /proc/bus/pci/devices 
0000    808627a0
0008    808627a1        pcieport
00d8    808627d8        snd_hda_intel
00e0    808627d0        pcieport
00e1    808627d2        pcieport
00e2    808627d4        pcieport
00e3    808627d6        pcieport
00e8    808627c8        uhci_hcd
00e9    808627c9        uhci_hcd
00ea    808627ca        uhci_hcd
00eb    808627cb        uhci_hcd
00ef    808627cc        ehci_hcd
00f0    80862448
00f8    808627b9
00f9    808627df        ata_piix
00fa    808627c5        ahci
00fb    808627da        i801_smbus
0100    10027149        radeon
0200    8086109a        e1000e
0300    80864227        iwl3945
1500    104cac56        yenta_cardbus

A pasta /sys/bus/pci/devices tem ainda mais detalhes, mas se espalha mais ...

    
por 25.03.2014 / 15:53
3

Você pode obter informações semelhantes do sistema de arquivos sysfs sob (por exemplo) /sys/device/pci0000:00 ; existe também um link simbólico em /sys/class/pci_bus . Vou discutir isso primeiro, já que ele fornece algumas pistas sobre as correspondências com lspci output que você pode examinar em um sistema que possui lspci para se familiarizar.

Veja algumas saídas lscpi editadas:

00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller (rev 09)
00:19.0 Ethernet controller: Intel Corporation 82579V Gigabit Network Connection (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.3 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 4 (rev c4)
00:1c.4 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c4)
00:1c.6 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 7 (rev c4)
00:1c.7 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 8 (rev c4)
03:00.0 SATA controller: ASMedia Technology Inc. ASM1062 Serial ATA Controller (rev 01)
04:00.0 PCI bridge: ASMedia Technology Inc. ASM1083/1085 PCIe to PCI Bridge (rev 03)
06:00.0 Network controller: Qualcomm Atheros AR9485 Wireless Network Adapter (rev 01)
07:00.0 USB controller: ASMedia Technology Inc. ASM1042 SuperSpeed USB Host Controller

Observe que 00:1c. tem .3, .4, .6 e .7, e também há 03: 00.0, 04: 00.0, 06: 00.0 e 07: 00.0. Estes correspondem - os mais atrasados são os dispositivos anexados ao anterior. Os links simbólicos em /sys/class/pci_bus apontam para nós em /sys/devices/pci0000:00 da seguinte forma:

0000:03 -> 0000:00:1c.3
0000:04 -> 0000:00:1c.4
0000:06 -> 0000:00:1c.6
0000:07 -> 0000:00:1c.7

Você não precisa pensar muito sobre isso se quiser apenas informações sobre o que está lá, mas menciono isso porque essas correspondências podem ficar confusas em relação à saída lspci .

Dentro desses nós (eles são diretórios), você encontrará um arquivo chamado subsystem_device , que contém um código hexadecimal de 16 bits (4 dígitos) em formato de texto, por exemplo, %código%. Existem códigos hexadecimais semelhantes em 0x84ca e subsystem_vendor , mas o último não serve para nós (não é não um ID de dispositivo fornecido pelo dispositivo, é um rótulo interno ao sistema ) e o primeiro não é específico o suficiente (mas ainda pode ser útil, veja abaixo).

Como a lista desses códigos provavelmente cresce o tempo todo, um bom lugar para consultá-los é um banco de dados on-line . Para obter uma lista de todos os exemplos do exemplo:

> find /sys/devices/pci0000:00 -name subsystem_device -exec cat '{}' \;
0x84ca
0x84ca
0x84ca
0x84ca
0x84ca
0x849c
0x84ca
0x84fb
0x84ca
0x84b7
0x84ca
0x1080
0x84ca
0x850d
0x84ca
0x8488
0x84ca
0x84ca
0x84ca
0x84ca
0x84ca

Eu evitei os diretórios com links simbólicos aqui para usar device . Aviso 0x084ca é repetido muito. Olhando para cima através de "Device Search" no banco de dados revela que este é um "450NX PCIset Memory & I / O Controller" da Intel. A razão pela qual se repete tanto é porque as outras coisas estão ligadas a ele.

Em vez de seguir todas essas etapas, vamos dar um atalho para descobrir qual é o meu controlador de wifi. find lista 3 links simbólicos:

em1
lo
wlp6so

Correspondente aos nomes dos rótulos usados em, por exemplo, /sys/class/net output. ifconfig links para wlp6so , mas isso não nos ajuda a identificar o dispositivo. Há dois pci0000:00/0000:00:1c.6/0000:06:00.0/net/wlp6s0 nós na árvore com raiz em subsystem_device , o primeiro é pci0000:00/0000:00:1c.6 (o controlador novamente) e um no 0x84ca , 0000:06:00.0 .

É aqui que nos deparamos com a realidade de entradas ausentes no banco de dados. Existe um formulário que você pode enviar informações para adicionar a ele, mas é claro que isso não nos ajuda agora.

Uma pesquisa online por "pci 0x850d" mostra uma referência à fonte do kernel do Linux , 1 desde que o kernel use esses códigos para carregar os drivers apropriados. Isso nos diz algo (é um chip wifi, aparentemente da ASUSTEK) que poderíamos ter deduzido de outra forma, ou seja, olhando para o nó 0x850d no mesmo diretório (a Asustek está no banco de dados online quando você faz um "Vendor" search: "para 0x1043) e considerando que isso se refere à interface wifi. 2 Há também uma pista sobre o OEM (fabricante do equipamento original) ser Atheros, já que este é o código-fonte do driver ath9k - - e, de fato, subsystem_vendor listou lscpi como "Controlador de rede: Adaptador de rede sem fio Qualcomm Atheros AR9485 (rev 01)".

Sem olhar a fonte para 06:00 , eu presumo que ela consulta os dispositivos diretamente por uma string. O kernel provavelmente não faz isso, pois usa o ID do dispositivo exclusivo para carregar os drivers e as informações não são úteis para ele.

1. Um lugar melhor para procurar, com base nessa descoberta, seria usar lspci no diretório grep -R da árvore de origem do kernel. Se você não conseguir encontrá-lo, não há driver para isso de qualquer maneira.

2. É claro que isso não seria tão óbvio se nenhum driver fosse carregado e a interface estivesse inativa, mas o ID ainda estaria em drivers/

    
por 25.03.2014 / 16:37

Tags