quinta-feira, 28 de novembro de 2013

Patch para controlar os leds ethernet do Raspberry Pi

Ao ler de usuários a vontade de poder controlar os leds do próprio Raspberry Pi, me vi também interessado, mas no meu caso em poder desligar todos. Infelizmente desligar todos via software não é possível, pois o led PWR é ligado diretamente na energia.

Controle de leds no Raspberry Pi
Controle de leds no Raspberry Pi

De modo normal hoje só é possível controlar o ACT led que é ligado diretamente via gpio no SoC da Broadcom, por meio do sysfs em:
/sys/class/leds/led0

Você pode desativar:

echo none > /sys/class/leds/led0/trigger

Reativar:

echo mmc0 > /sys/class/leds/led0/trigger

Ou controlar o mesmo desativando primeiramente e controlando via brightness:

echo none > /sys/class/leds/led0/trigger
echo 1 > /sys/class/leds/led0/brightness
echo 0 > /sys/class/leds/led0/brightness

Mas por qual motivo você controlaria os leds? Após saber que eu não poderia desligar todos por software uma das possibilidades que pensei é a de usar o led para indicar outras coisas.

O que acontece com os outros leds que não podemos controlar? Eles são ligados diretamente no chip LAN9512, aquele menor que é responsável não só pela ethernet como também pelo usb. Então não poderíamos controlar nada correto? Errado. Ao pesquisar vi alguns usuários dizendo que era impossível, mas eles são sim de certa forma controláveis via driver, algo que já é feito pelo próprio driver do LAN9512 no linux. Mas o que ele faz somente é ativar esses leds, o que queremos aqui é algo mais perto de se controlar os mesmos.

Resolvi então fazer um patch no driver para controlá-los via userland, também no sysfs. Claramente que para usar o patch, será preciso recompilar o kernel( ou driver em questão caso esteja separado ), você pode obter maiores informações aqui.

Após o boot do kernel compilado com o patch, aparecerá o diretório /sys/class/smsc95xx_leds e você poderá controlar via eth_fdx, eth_lnk e eth_spd.

Exemplo:
echo 0 > eth_fdx
echo 1 > eth_fdx

Vídeo:



Apesar do patch permitir o controle dos leds, ele de certa forma não é total, se perceberem no começo do vídeo o led LNK dá uma piscada indicando tráfego na rede, pois as funções dos mesmos ainda estão ligadas à ethernet. Futuramente vou verificar a possibilidade de desvincular essa funções.

Download do patch.






3 comentários:

  1. Thank you for your patch, it works great even on the Raspberry Pi 2 with kernel 3.18.11-v7+. The first two hunks of the patch need to be applied manually (one before "static bool turbo_mode = false;" and one before "/* Init Tx */"), but then it works great.

    ResponderExcluir
    Respostas
    1. Hi, is really good to know that still works on Raspberry Pi 2, thank you for the information!

      Excluir
  2. Great work! I need to switch kernel to version 4.14.79. - Patch won't work anymore. I do not know this ATTR macros. - So did you patched 4.14.x already?

    ResponderExcluir