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