A motivação deste artigo foi o fato de anos trabalhando com projetos de diversas áreas e empresas, sempre notei uma carência do técnico/engenheiro/desenvolvedor conhecer as ferramentas certas para depurar/investigar em ambiente Linux.
A utilização do Sistema Operacional Linux em plataformas embarcadas e popularmente em RaspberryPI colabora ainda mais para o caso de não utilizar a ferramenta certa para o trabalho e querer sair desenvolvendo programas e scripts.
Todas as ferramentas descritas neste artigo funcionam em Linux Host(Computador/Notebook) e Linux Target(Placa com Sistema Embarcado).
I2C-Tools
Um conjunto de ferramentas(i2cget, i2cset, i2cdetect, i2cdump e i2ctransfer) que auxilia o profissional a procurar dispositivos no barramento I2C, gerando uma tabela com a lista de dispositivos detectados no especifico barramento.
Listando barramentos disponíveis:
root@colibri-imx7-emmc:~# i2cdetect -l i2c-3 i2c 30a50000.i2c I2C adapter i2c-1 i2c 30a30000.i2c I2C adapter i2c-0 i2c 30a20000.i2c I2C adapter
Listando os dispositivos em um barramento especifico:
root@colibri-imx7-emmc:~# i2cdetect -y -r 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- UU -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
30: -- -- -- UU -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@colibri-imx7-emmc:~# i2cdetect -y -r 3
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2e --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Use a opção -F para consultar as funcionalidades do barramento i2c.
# i2cdetect -F 0 Functionalities implemented by /dev/i2c-0: I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read yes SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes
Utilizando i2c-dump para ler no BUS(3), endereço (0x2e) e imprimir no formato word(w) o range de endereço de 0x0 a 0xf.
root@colibri-imx7-emmc:~# i2cdump -r 0-0xf 3 0x2e w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-3, address 0x2e, mode word
Probe range limited to 0x00-0x0f.
Continue? [Y/n] Y
0,8 1,9 2,a 3,b 4,c 5,d 6,e 7,f
00: 0000 0000 0000 ff00 ff81 ffff ffff ffff
08: 0000 0000 0000 ff00 ffff ffff ffff ffff
Alterando de word(w) para byte(b):
root@colibri-imx7-emmc:~# i2cdump -r 0-0xf 3 0x2e b
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-3, address 0x2e, mode byte
Probe range limited to 0x00-0x0f.
Continue? [Y/n] Y
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 00 00 00 81 ff ff ff 00 00 00 00 ff ff ff ff ....?...........
O campo UU diz que o dispositivo foi registrado pelo kernel, possivelmente há um driver manipulando este dispositivo.
SPItools
Pacote que contem comandos que auxiliam na configuração e uso do SPI em Linux.
Um detalhe importando para uso correto e funcionalidade desta ferramenta é habilitar `CONFIG_SPI_SPIDEV` no kernel do Linux e também confirmar se o node SPI da placa esta com `compatible` spidev no device-tree, como exemplo veja o device-tree do módulo Colibri iMX6 da Toradex – imx6dl-colibri-eval-v3.dts, basta alterar de “disabled” para “okay”.
Obtendo o valor de clock e na sequência alterando:
$ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=0, lsb=0, bits=8, speed=500000 $ spi-config -d /dev/spidev0.0 -s 10000000 $ spi-config -d /dev/spidev0.0 -q /dev/spidev0.0: mode=0, lsb=0, bits=8, speed=10000000
Minicom/Picocom
Outra ferramenta indispensável para qualquer desenvolvimento em Sistemas Embarcados é um comando para manipular porta serial.
No Linux uso ambos Minicom e Picocom tanto no Linux Host como no Linux Target, a seguir um exemplo de como abrir uma porta serial com cada um.
cbueno@b2open-nb1 ~ $ sudo minicom -D /dev/ttyUSB0 -b115200
Para sair pressione Ctrl+A, depois pressione Z para abrir o Menu, em seguida X e confirmar selecionando ‘YES’.
cbueno@b2open-nb1 ~$ sudo picocom /dev/ttyUSB0 --baud 115200
Para sair pressione Ctrl+A e depois X.
CAN-Utils
Uma das ferramentas que utilizo com frequência é a can-utils(candump, canplayer, cansend, cangen e canbusload), seja em projetos do Agronegócio ou na Indústria Automotiva no qual realizamos algum trabalho.
Para o correto utilização desta ferramenta é necessário algumas configurações no Kernel Linux para correto suporte do SocketCAN no qual é requisito para funcionar, uma interface de rede é criada no Linux para a comunicação.
Não tem como demonstrar o uso dos comandos, mas estou anexando o vídeo a seguir que é rápido e mostra o uso do can-utils do canal Open Garages.
https://www.youtube.com/watch?v=oHqDLWN3a_w
USB-Utils
Com a popularização de placas com processadores multi-cores ARM e baixo custo, muitas soluções e projetos foram surgindo e em sua maioria sempre é necessária interagir com algum dispositivo USB, seja um conversor USB-Serial, Dispositivo HID, Oximetro, Adaptador Bluetooth BLE, Adaptador WiFi.
Utilizando as ferramentas do pacote usb-utils(lsusb, usb-devices, usbhid-dump) conseguimos obter precisamente diversas informações do USB Host e dos dispositivos conectados, qual barramento esta sendo utilizado, consumo dos dispositivos e claro Fabricante e Modelo do dispositivo.
A seguir um exemplo executando o comando `lsusb`em meu notebook:
cbueno@b2open-nb1 ~ $ lsusb Bus 002 Device 002: ID 04e8:61b6 Samsung Electronics Co., Ltd M3 Portable Hard Drive 1TB Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Neste momento em uma das portas USB(002) tenho um HD Externo Samsung e em outra porta USB(001) esta o leitor de cartão SD além de outros dispositivos que já conectei e removi hoje, o ID 0bda:0129 respectivamente VENDOR ID e PRODUCT ID.
Utilizando ainda o `lsusb`, podemos habilitar mais detalhes com -v e especificar um device:
cbueno@b2open-nb1 ~ $ lsusb -v -d 0bda:0129
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bMaxPacketSize0 64
idVendor 0x0bda Realtek Semiconductor Corp.
idProduct 0x0129 RTS5129 Card Reader Controller
bcdDevice 39.60
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
...
MaxPower 500mA
...
Considerações Finais
Encerramos este artigo com 6 ferramentas que todo profissional na área de Sistemas Embarcados poderá utilizar para manipular/depurar I2C, SPI, Porta Serial, CAN e USB.
Deixe seu comentário para sabermos de alguma necessidade sua ou da empresa em que trabalha se há alguma duvida ou dificuldade no Linux e que poderia escrever sobre o caso ou uma ferramenta.
Até a próxima!








show..de bola