Configuração da regra do Udev O soquete SocketCAN só funciona corretamente apenas quando executado manualmente

1

Eu quero iniciar o slcand (o daemon do espaço de usuário para o driver de interface CAN da linha serial) quando meu dongle do Lawcel CanUSB estiver conectado. Eu segui o guia passo-a-passo de Pascal Walter e todos parece funcionar ( slcan0 está lá e eu posso bind (2) ), exceto que eu nunca realmente recebo nada (somente mensagens de saída são visíveis em candump e Wireshark).

A regra do udev é a seguinte:

# Lawicel CANUSB module
ACTION=="add", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="tty", RUN+="/usr/bin/logger [udev] Lawicel CANUSB detected - running slcan_add.sh!", RUN+="/usr/local/bin/slcan_add.sh $kernel"
ACTION=="remove", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="usb", RUN+="/usr/bin/logger [udev] Lawicel CANUSB removed - running slcan_remove.sh!", RUN+="/usr/local/bin/slcan_remove.sh"

com /usr/local/bin/slcan_add.sh

#!/bin/sh
# Bind the USBCAN device
slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up 

e /usr/local/bin/slcan_remove.sh

#!/bin/sh
# Remove the USBCAN device
pkill slcand

No entanto, quando executo manualmente sudo /usr/local/bin/slcan_remove.sh && sudo /usr/local/bin/slcan_add.sh ttyUSB0 , tudo funciona como esperado e posso ver todas as mensagens CAN com candump slcan0 ).

A interface parece a mesma do udev. ip link show slcan0 dá:

91: slcan0: <NOARP,UP,LOWER_UP> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10

O NetworkManager tem um problema com slcan0, mas isso também aparece ao criar o slcan0 manualmente como descrito acima. A saída de tail -f /var/log/syslog ao conectar é:

May 26 18:29:18 laurenz-T440p logger: [udev] Lawicel CANUSB detected - running slcan_add.sh
May 26 18:29:18 laurenz-T440p slcand[14924]: starting on TTY device /dev/ttyUSB0
May 26 18:29:18 laurenz-T440p slcand[14925]: attached TTY /dev/ttyUSB0 to netdevice slcan0
May 26 18:29:18 laurenz-T440p slcand[14925]: netdevice slcan0 renamed to slcan0
May 26 18:29:18 laurenz-T440p NetworkManager[866]:    SCPlugin-Ifupdown: devices added (path: /sys/devices/virtual/net/slcan0, iface: slcan0)
May 26 18:29:18 laurenz-T440p NetworkManager[866]:    SCPlugin-Ifupdown: device added (path: /sys/devices/virtual/net/slcan0, iface: slcan0): no ifupdown configuration found.
May 26 18:29:18 laurenz-T440p NetworkManager[866]: <warn> /sys/devices/virtual/net/slcan0: couldn't determine device driver; ignoring...

ps -fauxw | grep can (início manual como acima):

root      1221  0.0  0.0   4336   100 ?        Ss   11:38   0:00          \_ slcand -o -c -f -s8 /dev/ttyUSB0 slcan0

ps -fauxw | grep can (re-plugging acionou o udev start):

root      1362  0.0  0.0   4336    96 ?        Ss   11:45   0:00 slcand -o -c -f -s8 /dev/ttyUSB0 slcan0

Qual poderia ser o problema com o udev? Como posso consertar isso?

Atualização: Ok, então adicionei um Ixxat USB-to-CAN V2 e instalei seu driver SocketCan. Tem o mesmo problema: Tx bem, Rx não funciona.
Curiosamente, posso ligar os dois juntos (120R no meio). Então eu corro candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF em um terminal. Em outro, eu envio quadros CAN com cansend can0 000# (Envie um quadro com CanID 0, comprimento 0 via can0 (o adaptador Ixxat)). O resultado depende se eu iniciei o slcand manualmente ou via udev.

Manual (conforme descrito acima):

$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
(1464614442.246548)  can0  TX - -  000   [0] 
(1464614442.249320)  slcan0  RX - -  000   [0]

Via Udev:

$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
 (1464614643.800545)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.807361)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.814058)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
 (1464614643.820840)  can0  RX - -  20000020   [8]  00 00 00 00 00 00 00 00   ERRORFRAME
    no-acknowledgement-on-tx
[and so on...]

Aqui está meu lsmod | grep can :

vcan                   16384  0 
slcan                  16384  1 
can_dev                24576  2 ixx_pci,ixx_usb
can_raw                20480  0 
can                    45056  1 can_raw

Eu estou em uma máquina Ubuntu 14.04 com um kernel 4.4. uname -rv :

4.4.0-21-generic #37~14.04.1-Ubuntu SMP Wed Apr 20 16:33:38 UTC 2016
    
por Laurenz 27.05.2016 / 11:52

1 resposta

0

Portanto, a solução para fazer o Canusb funcionar no udev foi encontrada por Kurt Van Dijck :

Sometimes one can have race conditions with udev rules since not all attributes are present on the launch of the uevent

Esse /usr/local/bin/slcan_add.sh atualizado faz com que o CanUsb funcione corretamente com o udev quando conectado:

#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/local/bin/slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up

Eu ainda tenho que descobrir como fazer o Ixxat Can-to-Usb V2 funcionar com o SocketCan.

    
por 31.05.2016 / 15:20