Skip to content

Sobre Múltiplos Equipamentos

Daniel Gonçalves edited this page Oct 26, 2015 · 3 revisions

Há um branch endpoints cujo objetivo é permitir a exposição de mais de um equipamento SAT por host SATHub, tornando possível o balanceamento manual de carga (por configuração) entre dois ou mais equipamentos SAT usando apenas um host SATHub. Dessa maneira, cada equipamento SAT é um endpoint identificado por um alias.

Função "Consultar SAT" em um cenário com dois endpoints configurados

Desafortunadamente, os fabricantes dos equipamentos SAT não projetaram as bibliotecas para que fossem capazes de lidar com mais de um equipamento SAT. Embora tenha obtido resposta formal de apenas um fabricante, os fabricantes de outros equipamentos não consideraram, em princípio, esta possibilidade, o que se deduz pela leitura dos seus manuais.

Ressalvas

O conceito de adicionar e gerenciar múltiplos equipamentos SAT em um único host, leva ao problema da identificação do hardware, pois é necessário distinguir um hardware do outro de alguma maneira. Aqui, vou deixar anotado a solução que encontrei enquanto lidava com este problema, para que se tenha um ponto de partida, caso seja possível implementar esta funcionalidade no futuro.

Ao conectar dois equipamentos em um mesmo host, eles possuem a mesma identificação:

Bus 002 Device 003: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 002 Device 008: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
...

Isso seria esperado se os equipamentos fossem do mesmo fabricante. Mas no exemplo acima, são equipamentos de fabricantes diferentes. Usando udevadm pode-se obter toda a hierarquia de um dos dispositivos (no caso, o dispositivo associado à ttyACM0:

$ udevadm info --attribute-walk /dev/ttyACM0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:2.0/tty/ttyACM0':
    KERNEL=="ttyACM0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:2.0':
    KERNELS=="2-1.2:2.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cdc_acm"
    ATTRS{bInterfaceClass}=="02"
    ATTRS{iad_bFunctionClass}=="02"
    ATTRS{bmCapabilities}=="2"
    ATTRS{iad_bFirstInterface}=="00"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{iad_bFunctionSubClass}=="02"
    ATTRS{iad_bFunctionProtocol}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{iad_bInterfaceCount}=="02"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{interface}=="CDC Abstract Control Model (ACM)"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
    KERNELS=="2-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.2"
    ATTRS{idVendor}=="0525"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="2"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="23"
    ATTRS{configuration}=="CDC ACM config"
    ATTRS{bMaxPower}=="2mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="2499"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="32"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 2.6.36.4-tanca-b4prod-maxim-jibe-b2+ with m"
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="a4a7"
    ATTRS{bDeviceClass}=="02"
    ATTRS{product}=="Gadget Serial v2.4"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
    KERNELS=="2-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{devpath}=="1"
    ATTRS{idVendor}=="8087"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="2"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="8"
    ATTRS{bcdDevice}=="0000"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="478"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="fixed"
    ATTRS{idProduct}=="0024"
    ATTRS{bDeviceClass}=="09"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="2"
    ATTRS{bcdDevice}=="0313"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="24"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 3.13.0-65-generic ehci_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="EHCI Host Controller"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci-pci"
    ATTRS{irq}=="23"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="00000000,00000000,00000000,00000000,00000000,00000000,00000000,000000ff"
    ATTRS{device}=="0x1c26"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-7"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x844d"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Assim, usando regras UDEV é possível distinguir os equipamentos associando-os a nomes ou a links simbólicos. Neste exemplo, optei por distinguir os equipamentos pela porta USB exata em que o equipamento está conectado (veja os links de referência no final desta nota):

# Equipamento SAT #1 (neste sistema, conectado à USB 2-1.2:2.0)
# 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
SUBSYSTEM=="tty", ACTION=="add", KERNELS=="2-1.2:2.0", ATTRS{idVendor}=="0525", ATTR{idProduct}=="a4a7", SYMLINK+="ttyTS0"
SUBSYSTEM=="tty", ACTION=="remove", KERNELS=="2-1.2:2.0", ATTRS{idVendor}=="0525", ATTRS{idProduct}=="a4a7", SYMLINK-="ttyTS0"

# Equipamento SAT #2 (neste sistema, conectado à USB 2-1.6:2.0)
SUBSYSTEM=="tty", ACTION=="add", KERNELS=="2-1.6:2.0", ATTRS{idVendor}=="0525", ATTR{idProduct}=="a4a7", SYMLINK+="ttyTS1"
SUBSYSTEM=="tty", ACTION=="remove", KERNELS=="2-1.6:2.0", ATTRS{idVendor}=="0525", ATTRS{idProduct}=="a4a7", SYMLINK-="ttyTS1"

Até o momento não soube de um fabricante que tenha uma solução para configurar a bibioteca SAT para acessar o equipamento SAT em uma porta serial específica, possibilitando a implementação da funcionalidade.

Referências

Clone this wiki locally