Introdução ao uso de Device Tree e Device Tree Overlay em Sistemas Linux Embarcado

Device Tree
Este post faz parte da série Device Tree. Leia também os outros posts da série:

Em várias situações do nosso dia-a-dia temos que usar documentos ou ferramentas que nos ajudam a descrever certas situações, funcionalidades e até mesmo direções. Manuais de usuário nos auxiliam a entender as funcionalidades de um produto, e um aparelho de GPS (Global Positioning System) nos auxilia descrevendo todo o trajeto que devemos traçar para chegar a um determinado local. Device Tree e Device Tree Overlay em sistemas Linux Embarcado compartilham dessa mesma particularidade, e servem para descrever com precisão como será configurado e utilizado o hardware em um sistema Linux embarcado.

 

Imagine, por exemplo, que você deseje que um determinado pino de sua placa seja habilitado para usar um pull-up interno para detecção de versão de hardware de sua placa auxiliar. Ou ainda necessite descrever como uma UART se comportará com relação ao sistema, quais pinos ela utilizará, qual device que deve ser habilitado e, por fim, que driver deve ser carregado. Essa descrição será possível por meio do uso de Device Tree e ajudará muito nas tarefas diárias de desenvolvimento ou hacking.

 

Hardware utilizado e Pré-Requisitos

 

A fim de tornar a explicação um pouco mais prática, faremos alguns exemplos utilizando a BeagleBone Black (Revisão C). Para isso a placa precisa estar, no mínimo, com a versão de kernel 3.8 (por conta de questões históricas que serão abordadas em seguida). Essa série de artigos visa explicar alguns conceitos e dar exemplos de como podemos e iremos utilizar esse recurso no dia-a-dia.

 

Histórico de Device Tree

 

Por conta dos inúmeros sistemas ARM que surgiram nos últimos anos, existiu muita confusão no desenvolvimento do kernel do Linux, o que forçou Linus Torvalds a recusar a aceitação de novos ARM board files na mainline do kernel e assim as fabricantes de placas ARM passaram a utilizar Device Tree´s (DT).

 

A implementação de Device Tree também foi necessária para a fabricante da BeagleBone Black, e após a correção de um problema (que impedia que as modificações do Device Tree fossem aplicadas em tempo de execução e a partir do user-space), essa ferramenta está disponível para uso de desenvolvedores e makers.

 

Device Tree Overlays

 

Vamos estudar agora um simples e pequeno Device Tree Overlay (DTO), e entender cada uma das seções.

 

Abaixo está o Device Tree Overlay para o pino 16 do header P8 da BeagleBone Black. Ele diz ao Kernel tudo o que ele precisa saber para que esse pino funcione de acordo com a nossa necessidade, que para este exemplo será o de habilitar o pino como GPIO, colocando um pull-up interno para que seja possível detectar versões de placa diferentes por meio desse pino.

 

Lembrete: Use sempre a última versão disponível da documentação de hardware da placa que estiver utilizando pois será necessário para saber o offset dos registradores, bem como os modos de pin-mux.

 

 

Nós podemos separar o arquivo acima em algumas partes para poder entendê-lo melhor.

 

A primeira parte são apenas alguns comentários e são opcionais, mas normalmente ajudam as demais pessoas a entenderem qual o objetivo desse arquivo, caso seja necessária uma alteração futura.

 

 

As próximas duas linhas são símbolos que servem para indicar a versão do dts e que o mesmo é um plug-in.

 

 

A próxima linha indica o início do nó principal do Device Tree:

 

 

A linha “compatible” descreve qual plataforma para a qual o Device Tree foi feito para funcionar. E nela existe uma regra: vai da mais compatível, para a menos compatível. É importante mencionar todas as plataformas para as quais se deseja suporte pois falhas acontecerão nas plataformas que não forem mencionadas.

 

 

Na próxima parte, o part number e version são proteções para assegurar que o Device Tree Overlay apropriado seja carregado. Eles também devem ser usados para nomear o arquivo .dts no formato -.dts. A versão, até a publicação deste artigo, deve ser 00A0 para a BeagleBone Black.

 

 

A propriedade exclusive-use permite que os overlays descrevam quais recursos eles precisam e assim evitam que qualquer outro overlay use os mesmos recursos. No nosso caso estamos usando o pino P8.16 e sua funcionalidade como gpio 1_14.

 

 

A próxima parte são os fragmentos do device tree. Eles irão descrever qual dispositivo será sobreposto, e a partir daí cada fragmento irá customizar os pin-muxes e/ou habilitar devices.

 

O fragmento abaixo parece ser um pouco complicado mas não é tanto. A primeira coisa é que estamos setando qual o target que será sobreposto para esse fragmento. No nosso caso, é o am33xx_pinmux, que é compatível com o driver pinctrl-single.

 

A próxima linha é o próprio nó do __overlay__. A primeira propriedade dentro desse nó será usada no próximo fragmento (bs_pinmode_P8_16_0x17) e contém as definições para realizar o mux dos pinos, que por sua vez são tratados pelo driver pinctrl-single. Você pode encontrar como realizar essa configuração procurando a página de documentação da placa que está utilizando.

 

Dentro do pinctrl-single, temos o bloco onde inserimos os valores dos pinos e as duas colunas de valores estão configurando o pino para funcionar como GPIO. No nosso caso, o pino P8.16 do header P8 configurado no modo 7.

 

 

O último fragmento habilita o pino da forma como configuramos anteriormente. O target para o overlay nesse caso é o ocp. Há também uma referência à propriedade do fragmento anterior (bs_pinmode_P8_16_0x17) para mapear os pinos habilitados pelo driver do pinctrl para o GPIO em questão.

 

A linha compatible faz a configuração para que esse fragmento seja compatível com o bone-pinmux-helper presente na placa utilizada.

 

 

Isto parece ser um pouco obscuro e na verdade é em partes. A maneira mais fácil de criar um novo overlay para se adequar às suas necessidades é criar o seu próprio a partir de um que já esteja pronto e próximo daquilo que se deseja. O melhor lugar para procurar por isso é no diretório /lib/firmware (on Debian), e examinar os overlays já criados para ver como funcionam.

 

No próximo artigo iremos aprender a "exportar" e "des-exportar" um Device Tree Overlay. Até lá!

 

Saiba mais

 

Apresentação do Fábio Estevam no Seminário Linux Embarcado 2015

Outros artigos da série

Processo de Exportação de Device Tree Overlay >>
Este post faz da série Device Tree. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Mateus Gagliardi
Formado em Matemática pela UNICAMP com experiência no desenvolvimento de firmware para sistemas embarcados. Apaixonado por tecnologia e atuante em soluções que envolvem sistemas bare metal e Linux Embarcado.

Deixe um comentário

avatar
 
  Notificações  
Notificar