24 de setembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Porta serial no Linux: Habilitar e permitir

porta serial

Esse artigo é bem breve, apenas para deixar registrado alguns procedimentos. Inclusive, um deles já escrevi a respeito há mais de 10 anos, mas não foi aqui no blog. Por acaso, tendo agora instalado o Linux Mint, me deparei novamente com um problema que pensei inexistir nos dias atuais. Somando ao tradicional problema de permissão na porta serial, achei que valeria um artigo. Se não conhece, visite o site do Mint e dê uma olhada no Cinnamon, que usa o menu mais legal que existe, criado pelo sistema SuSE Linux (antes de se tornar OpenSuSE) há muuuuitos anos.

A placa não é reconhecida pelo sistema – ou, a porta serial não aparece

Exceto surja algo novo e sem suporte no kernel Linux, todas as placas que usamos tem conversores USB-serial conhecidos e suportados. Recém-instalei o sistema e fui produzir um vídeo, então percebi que a placa não estava sendo reconhecida, porque a porta não foi criada. Daí usei o comando dmesg para avaliar o que estava ocorrendo. O dispositivo era identificado, mas a porta serial não era criada. Se for seu caso, siga um simples procedimento:

Habilitar porta serial no Linux sem reiniciar o sistema

Antes de conectar a placa, abra um terminal e digite:

sudo modprobe usbserial

Conecte a placa e aproveite para exagerar:

sudo depmod -a

Use o comando dmesg para ver se a porta foi criada ou, liste as portas que nos importam. A placa que for não importa, o procedimento é o mesmo e existem duas possibilidades, então liste o diretório de dispositivos do sistema dessa maneira:

ls /dev/{ttyUSB,ttyACM}*

Se houver alguma porta criada (sem ser as tty do sistema), elas aparecerão com esse comando.

Carregar módulo no boot do Linux

Agora, para não precisar repetir esse processo toda a vez que for usar uma placa, edite o arquivo /etc/modules e adicione a linha usbserial. Esse arquivo está em um diretório restrito do sistema, então você precisará abri-lo com permissões administrativas. Para isso, faça:

sudo su (vai pedir a senha para torná-lo root)
xdg-open /etc/modules

O arquivo se abrirá em um editor de texto. Modifique-o, salve-o e “saia-o”. Ao reiniciar o sistema, não será mais necessário digitar comandos. Mas ainda temos mais duas coisas importantes a tratar.

Permissão na porta serial no Linux

Essas restrições são características da estrutura do sistema, relacionado à segurança. Enfim, precisamos de acesso à porta, senão de nada adianta o dispositivo existir no sistema, certo? Esse evento é recorrente e todo mundo escreve sobre isso, inclusive eu já escrevi algumas vezes. Simplesmente adicione seu usuário ao grupo dialout. Talvez pareça estranho e sim, é mesmo, mas isso está relacionado ao MODEM etc. É uma longa história, desnecessária de ser contada. O comando é o que mais importa agora:

sudo usermod -a -G dialout $USER

Apenas para ficar claro, a variável $USER contém o username do usuário logado no momento. Se por alguma estranha razão isso não estiver definido e o comando retornar um erro, basta trocar $USER por $(whoami).

sudo usermod -a -G dialout $(whoami)

USBasp não reconhecido no Linux

Esse é um problema novo pra mim. Nunca havia ocorrido. Troquei o Ubuntu por Linux Mint (que tem a mesma base, mas é uma versão recuada), só que não parece ter sido a melhor escolha, considerando o comportamento “medieval” do sistema. Se teve o mesmo problema, o erro deve ser encontrado com o comando dmesg. O dispositivo aparecerá na lista e precisamos pegar o idVendor e idProduct. Outra forma de fazê-lo é usando o comando lsusb, mas aí tem que ficar caçando qual é o dispositivo em uma lista de dispositivos encontrados. No dmesg é explícito.

Tendo os dados, crie um arquivo em /etc/udedv/rules.d com o nome desejado, prefixado com a prioridade. No caso, criei o arquivo 99-usbasp.rules com o seguinte conteúdo:

SUBSYSTEM=="usb", ATTRS{product}=="USBasp", ATTRS{idProduct}=="05dc", ATTRS{idVendor}=="16c0", MODE="0660", GROUP="dialout"

Edite o arquivo assim para facilitar:

sudo su
touch /etc/udev/rules.d/99-usbserial.rules
xdg-open /etc/udev/rules.d/99-usbserial.rules

Poderia colocar o dispositivo diretamente no grupo do meu usuário, mas se houvesse outro usuário no sistema, passaria pelo mesmo problema. Mas acredito que colocá-lo no grupo dialout também não seja exatamente o correto, porém funcionará, desde que seu usuário esteja no grupo dialout como mostrado mais acima.

Salvo o arquivo, proceda com esses comandos:

sudo su
udevadm control --reload-rules
udevadm trigger

Se ainda não obter êxito (não se esqueça de reconectar o dispositivo), reinicie o sistema. Bem, as dicas são essas, mas só servem para quem usa Linux.