Encontrando um dispositivo char em / sys usando um script Bash?

3

Eu tenho um destes e estou tentando escrever um script Bash para encontrar o caminho do dispositivo em /sys .

Minha abordagem é mais ou menos assim:

  • inicie em /sys/modules/usbled , pois esse é o nome do módulo do kernel carregado quando o dispositivo está conectado
  • cd to drivers/usb:usbled , que parece ser o barramento e o nome do driver do dispositivo (de acordo com usbled.c: 229 )
  • ???

Eu fico preso no último passo desde que o diretório contém:

$ ls
1-1.2:1.0  bind  module  new_id  remove_id  uevent  unbind

Agora, por acaso sei neste caso que o diretório 1-1.2:1.0 contém os dispositivos char necessários para controlar os LEDs. No entanto, como meu script sabe disso? Existe alguma convenção de nomenclatura específica por trás do diretório? E se houver vários dispositivos do mesmo tipo conectados?

    
por Nathan Osman 26.10.2013 / 03:19

1 resposta

2

OK, acho que o título da pergunta é um pouco involuntariamente enganoso, já que no texto você está dizendo que já encontrou o dispositivo e está perguntando como fazer isso programaticamente. Uma pergunta que vem à mente é como você encontrou manualmente e porque você não poderia simplesmente escrever um roteiro. Responderei a pergunta da melhor maneira possível na sua forma atual, desculpas antecipadamente se eu perder a marca.

Coisas como essa são incrivelmente variáveis e específicas de dispositivos. São considerações como essa que exigem adaptadores de drivers / software, mesmo em softwares de nível superior. Então você provavelmente deve se acostumar com a ideia de que este script fará essa coisa em particular, em vez de abstrair para algum processo genérico (que é o que eu estou supondo que você está tentando fazer).

Como pano de fundo: Cada sistema tipo barramento (USB, SCSI, PCI, etc) precisa de algum tipo de dispositivo de endereçamento. Com lspci , esses são os valores que você vê à esquerda de cada linha na saída padrão.

Exemplo abreviado:

[root@hypervisor pyadmin]# lspci
00:00.0 Host bridge: Intel Corporation 5400 Chipset Memory Controller Hub (rev 20)
00:1d.1 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (rev 09)
00:1d.2 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (rev 09)
04:00.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E1 (rev 01)
04:01.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E2 (rev 01)
07:05.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
07:06.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
08:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5754 Gigabit Ethernet PCI Express (rev 02)

Os endereços PCI são 08: 00.0, 07: 06.0, etc.

Como você disse, o diretório sysfs que você está vendo é para um dos módulos ( usbled ), então você está vendo as informações que o sysfs tem nesse módulo, que inclui dispositivos que usam o módulo (ou vice-versa). versa, se você quiser). O 1-1.2:1.0 que você está vendo representa o dispositivo e está sendo referenciado pelo seu Endereço USB (na terminologia do USB, o "ponto final").

Então, se você já conhece o módulo, eu basicamente filtraria os valores conhecidos e só procuraria por denters que contenham ambos dois pontos e pontos, pois há pouquíssima chance de outro dentry nesse% específico O diretóriosysfs já foi criado com um nome como esse, se não for um dispositivo conectado.

Eu sei que é um pouco em todo o lugar, mas tenho certeza que sua resposta está em algum lugar.

    
por 26.10.2013 / 07:46