Controlando os LEDs no Linux Alpino usando a linha de comando

Desenvolvemos uma placa portadora Raspberry Pi Compute Module embutida para uso industrial: o PCCB.

pccb-small

Como pode ver, existem três LEDs (directamente) programáveis pelo utilizador no PCCB: USUÁRIO / INFO / ACT.

Estes são definidos na árvore de dispositivos. Por exemplo, podemos definir o seguinte na nossa árvore de dispositivos sobrepostos:

//LEDs
fragmento@11 {
   alvo = ;
   __overlay__ {{
     led_act: led_act {
       etiqueta = "myledact";
       gpios = ;
       linux,acionador por defeito = "mmc0";
     };
     led_info: ledinfo {
       etiqueta = "myledinfo";
       gpios = ;
       linux, gatilho por defeito = "cpu";
     };
     led_user: led_user {
       label = "myleduser";
       gpios = ;
       linux, acionador por defeito = "batimento cardíaco";
     };
   };
};

imagem

O arquivo fonte (.dts) de sobreposição da árvore de dispositivos precisará ser compilado, e renderá um arquivo .dtbo.

imagem

Este ficheiro é incluído como uma sobreposição no config.txt (no nosso caso está incluído num sub ficheiro, usercfg.txt que é incluído a partir do config.txt)

# Sobreposição da placa portadora de controle Pi
dtoverlay=pi-control-carrier-board

Isto irá dizer ao SO VideoCore que é carregado primeiro para passar na árvore de dispositivos para o modelo Pi particular, incluindo a nossa sobreposição ao kernel Linux.

O que é uma árvore de dispositivos?

Os dispositivos ARM têm se tornado cada vez mais personalizados e diversificados em comparação com os dispositivos x86 padrão que tinham componentes padronizados.

A fim de evitar recompilar o kernel e ter que combinar cada hardware modificado, um sistema de descrição do layout do hardware com o kernel do Linux foi concebido.

A árvore de dispositivos.

É um conceito independente do SO, pois é carregado no Kernel do SOes. Qualquer sistema operacional que o deseje, pode suportar.

O kernel Linux receberá a árvore de dispositivos, e assim saberá qual dispositivo está presente, como ele está conectado e como falar com ele (drivers são carregados dependendo das dicas na árvore de dispositivos, por exemplo).

Como um Raspberry Pi não é hardware estático, mas vem em configurações diferentes e pode expor diferentes pinos, por exemplo, e também ter diferentes add-ons (HATs), um add-on adicional foi necessário: sobreposições de árvore de dispositivos.

Estes arquivos permitem modificar a árvore de dispositivos, sem ter que ter uma nova árvore de dispositivos individual para cada possível combinação de hardware que você pode anexar ao Pi / configurar o Pi para.

Como posso controlar os LEDs?

Estes LEDs vão aparecer no sistema, no /sys/class/leds directório:

imagem

Como você pode ver, um total de quatro LEDs é exposto aqui, três dos quais (myledact, myledinfo, myleduser) foram adicionados por nós usando o overlay!

Cada um destes LEDs é um diretório em si mesmo,

imagem

o que lhe dá controlo sobre o LED.

Lembre-se, no Linux tudo é um arquivo / falar com o kernel é abstraído para fazer operações no sistema de arquivos (na verdade é um paradigma UNIX).

Corre

gatilho de gato

para o LED.

Ele mostrará uma lista de quais gatilhos podem ser definidos para ele:

nenhum rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-altlock kbd-shiftrlock kbd-shiftrlock kbd-ctrllock kbd-ctrlrlock temporizador com luz de fundo de batimento cardíaco gpio cpu cpu0 cpu1 cpu2 cpu3 pânico de entrada por defeito [mmc0]

Note que o último gatilho, mmc0 está entre parênteses rectos. Isto é o que o LED está ajustado no momento!

Você pode tentar configurá-lo para qualquer um dos outros gatilhos, escrevendo este gatilho no LED (se você tiver direitos suficientes Sorria):

echo "timer" > gatilho

Vai fazer o LED piscar.

Nota: se você listar o diretório de controle LED novamente, você verá entradas adicionais - nova funcionalidade que é exposta para o modo timer:

imagem

delay_off e delay_on

cat delay_off

rende 500. Estes são 500 milissegundos.

Você pode ajustar esses valores para fazer o LED piscar mais rápido, por exemplo:

echo "150" > delay_off

echo "150" > delay_on

Ou mais devagar...

echo "1500" > delay_on

echo "1500" > delay_off

Um par de gatilhos dignos de nota:

  • nenhuma: não há actividade no LED
  • mmc0: está ativo se o Flash / microSD estiver sendo acessado
  • cpu: está activa com a actividade da CPU (é bom monitorizar o quão ocupada está a CPU, pois será um pouco mais fraca se houver menos actividade da CPU, graças efectivamente a uma espécie de PWM)
  • Heartbeat: dará um padrão de piscada constante para mostrar que o Pi ainda está vivo e o kernel ainda está online e a fazer o seu trabalho.

Controlar o LED GPIO a partir do meu próprio código?

Para controlar os LEDs a partir do seu próprio código, usando as bibliotecas GPIO, defina o gatilho para "nenhum".

echo "nenhum" > gatilho

Você ainda pode ligá-lo e desligá-lo a partir da linha de comando, escrevendo com brilho (1 para ligá-lo, 0 para desligá-lo):

echo "1" > brilho

echo "0" > brilho

Agora você é capaz de controlar um LED a partir da linha de comando Sorria E você aprendeu algo sobre árvores de dispositivos e sobreposições de árvores de dispositivos, parabéns!

Referências: