AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1533358
Accepted
Alexander Amelkin
Alexander Amelkin
Asked: 2024-11-20 01:05:55 +0800 CST2024-11-20 01:05:55 +0800 CST 2024-11-20 01:05:55 +0800 CST

Por que a regra udev funciona apenas uma vez para um nó de dispositivo USB serial aleatório fora da série?

  • 772

Tenho um dispositivo USB-para-UART multiporta baseado no chip CH348 executando um driver fora do kernel obtido de https://github.com/WCHSoftGroup/ch9344ser_linux

O driver cria nós de dispositivo de 8 caracteres ( /dev/ttyCH9344USB0... /dev/ttyCH9344USB7). O dispositivo não fornece um número de série no descritor de dispositivo USB, mas há uma EEPROM que desejo ler do dispositivo, extrair o número de série de lá e usá-lo para criar um link simbólico como /dev/ttyUSB.CH348.<serial_number>.<instance>.

Criei uma udevregra simples e a coloquei em /etc/udev/rules.d/99-usb-serial.rules:

ACTION=="add", KERNEL=="*ttyCH9344USB*", OPTIONS="log_level=debug", PROGRAM="/usr/local/bin/ch34x_serial %E{DEVNAME}", SYMLINK+="ttyUSB.CH348.$result"

A regra funciona como esperado, mas apenas para UM único nó ALEATÓRIO de 8. Na verdade, tentei várias regras de correspondência e, independentemente do método que uso (nome do kernel, atributos usb, etc.), se corresponder, isso acontece apenas para UMA única instância ALEATÓRIA da série. Pode criar um link simbólico para a instância 3, ou 6, ou 7, ou qualquer outra, mas apenas para uma única.

Eu verifiquei journalctle udevadm monitor -p, e descobri que há exatamente 8 addeventos diferentes chegando udevquando eu carrego o módulo do driver. Todos os eventos são idênticos, exceto pelas propriedades KERNEL, DEVPATH, SEQNUM e MINOR, e se parecem com isso:

KERNEL[706136.962119] add      /devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3.2/1-1.1.3.2.1/1-1.1.3.2.1:1.0/tty/ttyCH9344USB0 (tty)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3.2/1-1.1.3.2.1/1-1.1.3.2.1:1.0/tty/ttyCH9344USB0
SUBSYSTEM=tty
DEVNAME=/dev/ttyCH9344USB0
SEQNUM=26571
MAJOR=168
MINOR=0

Não entendo por que apenas um desses eventos reais aciona a regra, enquanto que se eu executar udevadm testpara qualquer um dos 8 nós de dispositivo, a regra funciona perfeitamente para todos eles.

Parece que ele udevestá armazenando a ação em cache de alguma forma e descartando as "duplicatas", embora eu não entenda como ele chega a essa conclusão.

Estou executando o Ubuntu 24.04 Server com udevversão 255.4-1ubuntu8.4.

Qualquer ajuda seria apreciada. Obrigado.

usb
  • 1 1 respostas
  • 39 Views

1 respostas

  • Voted
  1. Best Answer
    Alexander Amelkin
    2024-11-28T04:46:33+08:002024-11-28T04:46:33+08:00

    Como se viu, udevestava executando meu ch34x_serialprograma 8 vezes em paralelo, como apontado por @meuh em seu comentário. Aparentemente, o driver não tolera isso para operações de acesso à EEPROM.

    Para superar isso, adicionei uma sincronização simples baseada em um semáforo compartilhado para serializar a comunicação com a EEPROM subjacente. Suponho que eu poderia, em vez disso, corrigir o driver ch9344_linux, mas modificar o programa do espaço do usuário pareceu mais fácil.

    Qualquer pessoa que precise resolver o mesmo problema de conectar vários dispositivos CH348 a uma máquina pode experimentar a ferramenta modificada disponível em https://codeberg.org/AlexanderAmelkin/ch34x_serial

    A versão modificada, juntamente com uma regra udev simples (também disponível no repositório acima), funciona bem para mim e produz 8 aliases de dispositivo separados.

    • 1

relate perguntas

  • Como você redefine um dispositivo USB a partir da linha de comando?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve