Raspberry Pi – Utilizando UART do barramento de pinos


Raspberry com adaptador wi-fi
Raspberry com adaptador wi-fi

Estou em um projeto ultra-secreto que envolve pela primeira vez uma board com sistema embarcado além de comunicação paralela com micro-controladora via UART (serial). Vou falar nesse post sobre os dados não-confidenciais, que se concentram na manipulação do hardware, onde estou usando Emdebian.




Das necessidades

Precisei de coisas bastante específicas, como um login sem senha seguido da execução de um programa para fazer leitura de dados seriais via USB (mais especificamente, HID). A recepção de dados sucede desse modo, enquanto o envio de uma resposta se dá por UART, utilizando-se dos pinos seriais disponíveis no barramento do Raspberry, trocando informações com uma micro-controladora (inicialmente, um Arduino no protótipo). A primeira coisa a considerar é que o Raspberry trabalha em 3.3v e não é tolerante a 5v, de forma que se faz necessário uma conversão de nível lógico. Para tal, utilizei esse conversor de nível lógico, bem baratinho e simples de usar.
Enfatizando: NÃO LIGUE 5v aos pinos do Raspberry, pois ele não tem nenhum tipo de proteção a sobrecarga.

Entretanto, primariamente foi necessário validar uma comunicação serial. Para tal, utilizei o “canivete suiço” BusPirate, citado mais adiante em detalhes. Os tópicos para esse post então são:

  • Login sem senha
  • Execução de programa automaticamente
  • Modificação no sistema para utilização dos pinos seriais
  • Utilização do conversor de nível lógico
  • Sniffing de barramento com o BusPirate
  • Exemplo de comunicação entre o Arduino Leonardo e o RaspBerry
  • Configuração wi-fi no Emdebian utilizando o arquivo

interfaces

Pronto para a diversão? Então, mãos à obra.

Raspbian

Obviamente, a primeira tarefa é ter um sistema inicializável que possa ser manipulado. Baixei o sistema e o instalei no cartão SD. Essa é uma vantagem do Raspberry em relação às boards SoC (System on Chip), porque facilita muito a manipulação do sistema. Por outro lado, a perda fica por conta da lentidão do boot. O que pode ajudar um bocado em relação a isso é utilizar um cartão com a categoria mais alta. Para quem não sabe, a partir dos cartões micro-sd de 4GB é chamado sdhc, onde H é de High e C é Capacity, ou seja, cartões de alta capacidade de armazenamento. Entretanto, não é esse fator que define a categoria e sim a velocidade de gravação de dados. Essa especificação conhecida como “Speed Class”, afere a velocidade de gravação. Por exemplo, a classe 4 grava 4MB/s, enquanto classe 16 (provavelmente o maior até o momento desse post) grava 16MB/s. Um excelente material a respeito pode ser encontrado nesse link, na Wikipedia.

Claro que esse não é o único fator a influenciar no tempo de boot, pois além da leitura do sistema para a memória, ainda há o processamento para inicialização de serviços e seus respectivos delays. Enfim…

Instalando o sistema no SD

Existem diversas distribuições para Raspberry, mas a minha escolhida foi o Debian Wheezy, baixada deste link.

A instalação é basicamente a descompressão do arquivo e um dd para o device de destino. No meu caso, o dispositivo aparece como mmcblk0:

Atualizações podem ser conseguidas com apt-get upgrade e o primeiro boot é mais lento que os subsequentes (saudades da trema).
Tente memorizar a senha de root padrão: raspberry :-)
Todos os procedimentos chatos de configuração de pacotes podem ser feito com o dpkg:

Programas podem ser instalados via apt-get como em uma distribuição Debian qualquer. Para compilar programas para ele, a coisa é um pouco mais embaixo. Recomendo a leitura de meus posts sobre buildroot e embedded, mas a grosso modo, deve-se construir um ambiente de desenvolvimento a partir do buildroot (preferencialmente) ou WRT. A parte triste é que muita coisa sequer compilará e o que compilar provavelmente necessitará de adaptações no código.

Para quem pretende realmente se aventurar em embedded, recomendo alguns livros (em inglês) que comprei na Amazon e me tem sido úteis:

  • Building Embedded Linux Systems
  • Embedded Linux Primer
  • Embedded Linux System – Design and Development

E introdutóriamente ao Raspberry (também adquirido na Amazon):

  • Raspberry Pi User Guide

Seguindo…

Login sem senha

Como em qualquer sistema GNU/Linux, muitas configurações do boot podem ser feitas no arquivo /etc/inittab, como o login sem senha, comportamento do ctrl+alt+del, runlevel e consoles seriais. Para o login sem senha comente a linha como a seguir, adicionando a linha posterior em substituição:




Claro, para que surtam os efeitos, um reboot é necessário – ou ainda, essas modificações podem ser feitas em qualquer sistema (preferencialmente Linux para evitar o final de linha M$, o que pode ocasionar algum erro).

Execução automática de programas

Então, tendo um login automático como no exemplo, um programa pode ser rodado de um arquivo qualquer relacionado ao shell em questão; no caso do bash, pode ser tanto o .bash_login, .bash_profile ou .bashrc do usuário root. Para evitar que o script ou programa seja interrompido e o usuário tenha acesso ao console, existem várias opções. Uma delas é NÃO executar o processo em segundo plano (seguindo o comando de um &) e na linha posterior adicionar um reboot. A outra opção ao reboot, é adicionar um echo ‘b’ >sysrq-trigger, o que fará um boot imediato do sistema, sem o processo de interrupção dos serviços (pode ser bastante prejudicial ao sistema de arquivos, mas é efetivo em relação ao bloqueio de acesso ao console).

Como utilizar os pinos seriais para a comunicação UART

Mais uma vez recorremos ao /etc/inittab. Aqui tive algumas dúvidas pela questão de que os consoles seriais são atrelados à saída gráfica do sistema operacional, que são as tty. Logo, pensei em acesso via arquivo descritor, tal como o dispositivo serial ACM0 ou USB0, criado na comunicação USBSerial apenas na interrupção do pino. A única certeza que eu tinha é de que esses pinos do barramento do Raspberry não podem ser acessados diretamente no hardware tal como é feito em micro-controladoras, considerando que o hardware trabalha em modo protegido e é gerenciado pelo kernel space. Mas em uma pesquisa básica, tudo ficou muito claro. Além do inittab, há uma outra modificação necessária no arquivo da partição de boot chamado cmdline. Esse arquivo contém strings sem poder de execução, e é utilizado para passar ao kernel parâmetros que devem ser reconhecidos durante o processo de boot para executar tarefas especificas. Por exemplo no Phantom, o cmdline tem aproximadamente 30 parâmetros possíveis para automatizar backup. No nosso caso, a modificação será feita para remover a referência ao dispositivo ttyAMA0. Faça um backup do arquivo cmdline.txt e seguidamente remove as referências “console=ttyAMA0,115200” e “kgdboc=ttyAMA0,115200”. Existem diversos sites dando essas dicas, mas ainda é necessário fazer uma busca requintada no google para chegar aos devidos resultados.
Para finalizar, edite o inittab e comente a linha que aponta o dispositivo para o console serial:

A comunicação será feita a 115200; o dispositivo já está configurado e pronto para uso. Agora um script básico em python para ficar em loop enviando um byte na rede para que possa ser lido pelo BusPirate:

No video o script já está em execução no Raspberry.

Sniffing UART com BusPirate

 

BusPirate
Com cabo e case

O BusPirate é um projeto da Dangerous Prototypes. Não se encontra no Brasil, não tem jeito, tem que importar e correr o risco de pagar 100% de impostos, assim como eu. Eu fiz a compra no SeeedStudio (com 3 letras ‘e’ mesmo). Lá também comprei o cabo (fundamental) e o case.

Detalhes sobre a configuração UART podem ser vistas nesse link do manual do BusPirate, mas no video a seguir mostro o suficiente para a comunicação serial em modo de ponte transparente:

Acessei o Raspberry por ssh, utilizando um adaptador wi-fi que funcionou muito bem. A configuração foi feita utilizando o arquivo /etc/network/interfaces, simplesmente adicionando esses parâmetros:

Fiz troca de chaves para não precisar digitar senha e no video a seguir exibo a comunicação serial sendo monitorada pelo BusPirate utilizando o programa GtkTerm para a conexão. Repare que falei no video que a porta utilizada foi a ttyACMO, mas na verdade a porta utilizada está no código mais acima, e é a ttyAMA0:






E esse é o meu primeiro post com Raspberry. Em outros vamos nos aprofundar mais.

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Prefere seguir-nos pelo facebook? Basta curtir aqui.

Prefere twitter? @DobitAoByte.

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta