Pin Control, Device Tree e GPIOs na Beaglebone Black

- por Sergio Prado

Categorias: Beaglebone Black, Linux Tags: , ,

Nos últimos dias tenho estudado um pouco sobre a relação entre o subsistema pin control e a camada de GPIO do kernel, sua configuração através de device tree e como tudo se encaixa na Beaglebone Black.

Ainda pretendo escrever alguns artigos sobre o tema, mas como tenho investido tempo em outras atividades, pode ser que estes artigos demorem um pouco para sair.

Enquanto isso, gostaria de deixar aqui algumas referências para quem quiser se aventurar pelo controle dos pinos de um SoC no Linux.

PIN CONTROL

Um SoC (system-on-chip) moderno como as linhas i.MX6 da Freescale e AM33XX da TI contêm centenas de pinos, também chamados de balls, pads ou fingers. A maioria destes pinos é configurável, permitindo ao usuário definir sua função (GPIO, I2C, UART, etc) e características (pull up, pull down, tristate, etc) em tempo de execução.

O subsistema pin control do Linux é o responsável pelo gerenciamento destes pinos controláveis por software.

O código-fonte deste subsistema está disponível em drivers/pinctrl/ e sua documentação em Documentation/pinctrl.txt.

Uma introdução simples e didática sobre o tema está disponível no site do LWN.

O mantenedor do subsistema, Linus Walleij, apresentou duas palestras sobre o tema que valem muito à pena assistir: GPIO and Pin Control for Embedded Systems e Pin Control and GPIO Update.

DEVICE TREE

Device tree é uma estrutura de dados para descrever o hardware. Ao invés de descrever as características do hardware (barramentos, dispositivos conectados ao barramentos, endereçamento, etc) no código-fonte, passa-se para o kernel um arquivo de device tree com a descrição do hardware durante o boot.

Escrevi um tempo atrás dois artigos introdutórios sobre o tema. O primeiro artigo fala sobre os problemas antes da existência do device tree, e o segundo artigo descreve seu funcionamento.

A apresentação do Thomas Petazzoni na ELC 2013 é fantástica e vale muito à pena assistir. Os slides desta apresentação também estão disponíveis.

Desde o Linux 3.8, o uso de device trees para descrever o hardware é obrigatório, e por isso seu conhecimento é fundamental para poder configurar os pinos da CPU através do subsistema de pin control do kernel.

BEAGLEBONE BLACK E GPIO

A Beaglebone Black possui dois conectores de expansão de 46 pinos cada, onde a maioria dos pinos estão conectados ao SoC. E para configurar um pino do SoC, é necessário entender seu funcionamento. Estas informações estão na seção “Control Module” do Technical Reference Manual do AM335x.

As alterações na configuração dos pinos devem ser realizadas no device tree da Beaglebone Black (veja neste arquivo como os pinos do HDMI são configurados na definição do nó am33xx_pinmux) . Um entendimento sobre o funcionamento do subsistema pin control e da sintaxe do device tree irá ajudar bastante no processo.

Uma característica interessante da Beaglebone Black é a possibilidade de alterar a definição dos pinos do SoC via device tree em tempo de execução (device tree overlay). Esta funcionalidade é toda implementada no kernel por um subsistema chamado Capemgr. A idéia principal é possibilitar a conexão de módulos adicionais de hardware ao sistema (ex: capes da Beaglebone) sem precisar alterar o device tree original da placa. Um histórico completo desta funcionalidade está disponível no Embedded Linux Wiki.

O Derek Molloy têm um vídeo e um artigo bem didáticos sobre o uso de device tree overlays na Beaglebone Black. A Adafruit possui também um artigo bem interessante sobre o tema.

À princípio, todos os pinos dos barramentos de expansão da Beaglebone Black que estão conectados ao SoC podem ser configurados e tratados como GPIO, com exceção dos pinos da eMMC interna. Segundo a página da Wiki do projeto, não é aconselhável usar estes pinos para outra função a não ser a comunicação com a eMMC.

Um abraço e bons estudos!

Sergio Prado

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.