Como obtenho o tipo de leitor de cartões interno?

3

Eu tenho uma caixa do Linux que roda o Busybox. Existem dois leitores de cartões integrados. Como posso obter o tipo de leitores de cartões?

Eu tentei lshw , hwinfo e lspci , mas esses comandos não estão implementados no Busybox.

Olá, Stéphane Chazelas,

Muito obrigado pela sua resposta detalhada. Eu tentei. No entanto grep não encontra nada.

# l 'find /sys/devices -path '*/usb*/configuration''
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0470300.ehci_v2/usb3/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0470400.ohci_v2/usb7/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0470500.ehci_v2/usb4/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0470600.ohci_v2/usb8/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0471000.xhci_v2/usb1/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0471000.xhci_v2/usb2/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480300.ehci_v2/usb5/5-1/5-1.1/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480300.ehci_v2/usb5/5-1/5-1.2/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480300.ehci_v2/usb5/5-1/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480300.ehci_v2/usb5/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480400.ohci_v2/usb9/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480500.ehci_v2/usb6/configuration
-r--r--r--    1 root     root          4096 Oct  2 19:14 /sys/devices/rdb.3/f0480600.ohci_v2/usb10/configuration
# l 'find /sys/devices -path '*/pci*/driver''
dr-xr-xr-x    2 root     root             0 Oct  2 19:20 .
dr-xr-xr-x    4 root     root             0 Oct  2 19:20 ..
-r--r--r--    1 root     root             0 Oct  2 19:31 devices
# l /proc/bus/pci/devices
-r--r--r--    1 root     root             0 Oct  2 19:31 /proc/bus/pci/devices
    
por musbach 02.10.2017 / 12:50

1 resposta

3

Leitores de cartões são geralmente dispositivos USB. Se assim for, você poderia fazer algo como:

find /sys/devices -path '*/usb*/configuration' -exec \
   grep -lx 'CARD READER'  {} + | awk -F/ -vOFS=/ '{
     NF--
     getline idv < ($0 "/idVendor")
     getline idp < ($0 "/idProduct")
     getline v < ($0 "/manufacturer")
     getline p < ($0 "/product")
     print idv":"idp" "v" "p}'

Para obter IDs e nomes de fornecedores / produtos (conforme relatado pelo kernel). Isso é procurar dispositivos USB cuja configuração esteja definida como CARD READER e extrair o conteúdo dos arquivos vendorID , productID , manufacturer e product no diretório pai daquele que contém o arquivo configuration .

Para dispositivos PCI, isso pegaria pelo menos os dispositivos usando os drivers abaixo. O busybox find não suporta o predicado find do -lname do GNU%, por isso precisaríamos de algo como:

find /sys/devices -path '*/pci*/driver' -type l -exec readlink {} \; -print |
  awk -F/ -v OFS=/ '
    BEGIN{d["cb710"]d["r592"]d["r852"]d["rts5208"]d["rtsx_pci"]}
    $NF in d {
      getline
      NF--
      getline v < ($0 "/vendor")
      getline p < ($0 "/device")
      print substr(v, 3) ":" substr(p, 3)
    }'

Não há nenhum arquivo de configuração que possamos usar esse tempo para determinar a classe de dispositivo (na verdade, há um arquivo class para a classe de dispositivo PCI, mas eu posso ver 0xff00 Diversos) para um dispositivo Realtek aqui, não há nenhuma classe de dispositivo PCI dedicada a "leitores de cartão", por isso não podemos confiar nele. Então, em vez disso, procuramos% sy_links drivers que apontam para qualquer um dos drivers conhecidos por serem drivers para leitores de cartão PCI e obtemos os IDs de fornecedor / produto em caminhos relativos a isso.

Uma abordagem mais simples é usar /proc/bus/pci/devices :

awk '
  BEGIN{d["cb710"]d["r592"]d["r852"]d["rts5208"]d["rtsx_pci"]}
  $NF in d {print substr($2, 1, 4) ":" substr($2, 5)}
' < /proc/bus/pci/devices
    
por 02.10.2017 / 15:12

Tags