Conheça os recursos do vcgencmd no Raspberry Pi

A maioria dos que conhecem o comando vcgencmd o utilizam para pegar a temperatura do Raspberry, mas ele tem diversos outros recursos importantes para obter informações da placa. No post anterior mostrei como detectar subtensão e subcorrente, agora vamos ver outros recursos interessantes.

vcgencmd

O vcgencmd é um utilitário de linha de comando que pode obter informação de diversos componentes de hardware, como vídeo, memória, núcleo e alimentação. O código está disponível no github e pode ser acessado através desse link. No código podemos encontrar referências que sequer estão na documentação, como o help do próprio programa e comandos usados exclusivamente pelos engenheiros. Vejamos alguns dos recursos:

show_usage

Essa função deveria ser chamada quando usamos a flag -h, mas não a vi funcionar.

vcgencmd -- help

Pelo código atual disponível no github, deveríamos ter acesso ao help também ao chamar o comando sem parâmetros:

if ( argc == 1 )
  {
     // no arguments passed, so show basic usage
     show_usage();
     return 0;
  }

O código contido no git é sucinto, não contendo tudo o que o binário faz. Mas já escrevi algo sobre ele e nem me lembrava, achei o artigo por acaso. Mas no artigo não citei muita coisa, por isso resolvi incrementar; a começar pela consulta dos comandos.

vcgencmd commands

Isso mostrará todos os comandos, e é coisa pra caramba!

vcgencmd commands

É um ótimo ponto de partida para quem gosta de experimentações. A documentação mostra alguns, os quais também citarei.

vcgencmd vcos <version | log status>

É um comando aplicável para desenvolvedores. Devolve a versão de firmware do núcleo de vídeo ou logs de status de erros de diversas áreas de software que acessam o núcleo de vídeo.

vcgencmd version

Mostra o hash da versão do programa.

vcgencmd get_camera

Mostra se tem suporte (precisa ser habilitado através do menu do programa raspi-config ou no /boot/config.txt) e se foi detectado. É bom para diagnóstico durante a instalação da câmera, caso algum problema ocorra.

vcgencmd get_camera

vcgencmd get_throttled

Esse comando mostra eventos de energia como subtensão, subcorrente, aquecimento, degradação de frequência e também se em algum momento do boot ocorreu um desses eventos. É fundamental para saber se a fonte utilizada no Raspberry é adequada, se está suprindo as necessidades e se tem qualidade. Detalhei o uso e forneci um código shell para interpretar a saída, disponível nesse outro artigo.

vcgencmd measure_temp

Quer saber como está a temperatura do SoC de seu Raspberry? Vale lembrar que o limite é de 80 graus, para ter uma referência. No Brasil é comum que ela trabalhe em seus 50 graus. Temperatura alta reduz a vida útil de qualquer aparelho e um dissipador simples já é bastante válido.

Fiz alguns testes de temperatura com um case especial de alumínio para Raspberry Pi 3 (sem fan) e para Raspberry Pi 4 (com fan), que pode ser visto nesse artigo. Inclusive fiz o app de medição, com código disponível no github Do bit Ao Byte. Dê uma lida.

vcgencmd measure_temp

No momento desse artigo a temperatura estava 12 graus; o Raspberry com o case de alumínio sem fan marcava 36,5 graus. Não tão bom, nem tão mal, mas esse RPi é meu servidor DNS e fica ligado 24×7.

vcgencmd measure_clock [clock]

Tem uma série de clocks que podem ser medidos:

  • arm
  • core
  • h264
  • isp
  • v3d
  • uart
  • pwm
  • emmc
  • pixel
  • vec
  • hdmi
  • dpi

Não tenho monitor ligado a esse RPi e o PWM está desabilitado.

vcgencmd measure_clock

vcgencmd measure_volts [block]

Esse comando mostra as tensões usadas pelo bloco específico. É um dos comandos que utilizei para gerar gráficos no dashboard do Grafana com MQTT.

Os blocos são:

  • core – para VC4
  • sdram_c – para core da SDRAM
  • sdram_i – para tensão de I/O da SDRAM
  • sdram_p – para tensão Phy da SDRAM

vcgencmd measure_volts

vcgencmd otp_dump

Já escrevi sobre o OTP, particularmente para modificação permanente para boot pela USB ou SD selecionado por GPIO e também para habilitar o boot permanente pela USB.

Para saber como está sua OTP (principalmente se comprou a RPi usada), esse comando pode ser bastante útil. Mas ele retorna uma lista enorme de bits e as referências precisam ser lidas na documentação (em inglês). Desculpe, mas não vou ter paciência para reescrever.

Uma coisa legal é o serial, que está no setor 28 e 29. Ele pode ser utilizado para identificar se uma aplicação proprietária está rodando no hardware de origem, inibindo (dentro do possível) a utilização indevida de um programa licenciado.

Também tem o código de revisão, que é único por Raspberry. Essas informações podem ser pegas também em /proc/cpuinfo:

cat /proc/cpuinfo

/proc/cpuinfo

Aproveitando, repare que no arquivo cpuinfo temos também o modelo exato da Raspberry, servindo para tirar dúvidas quanto à versão correta da sua.

O modo de boot está no registro 17, com a lista de bits tendo os seguintes valores:

Bit 1: sets the oscillator frequency to 19.2MHz
Bit 3: enables pull ups on the SDIO pins
Bit 19: enables GPIO bootmode
Bit 20: sets the bank to check for GPIO bootmode
Bit 21: enables booting from SD card
Bit 22: sets the bank to boot from
Bit 28: enables USB device booting
Bit 29: enables USB host booting (ethernet and mass storage)

Tem outras coisas interessantes, mas que oferecem risco ao serem realmente manipuladas, então paremos por aqui nesse comando.

vcgencmd get_mem type

Esse comando informa a quantidade de memória alocada para os núcleos ARM e GPU:

vcgencmd get_mem

Uma nota da documentação é que no Raspberry Pi 4 com mais de 1GB de RAM a opção arm é imprecisa (pasmem). Conforme explicado, a razão é que o firmware da GPU que implementa esse comando só vai até o primeiro GB, então o retorno será sempre 1GB menos a memória de GPU disponível. Daí a recomendação é usar os recursos padrão do sistema free ou cat /proc/meminfo, ou seja, por enquanto é um comando inútil na RPi 4.

vcgencmd codec_enabled [type]

Informa se um determinado coded está ativo. As opções são AGIF, FLAC, H263, H264, MJPA, MJPB, MJPG, MPG2, MPG4, MVC0, PCM, THRA, VORB, VP6, VP8, WMV9, WVC1, sendo que em negrito requerem licença paga.

vcgencmd codec_enabled

vcgencmd get_config type | name

Esse comando retorna toda a configuração de itens especificados em /boot/config.txt. Os valores de parâmetros possíveis são int ou str, ou simplesmente use o nome do item de configuração.

vcgencmd get_config

Talvez pegar os parâmetros com egrep seja até mais útil, sei lá.

config.txt

vcgencmd get_lcd_info

Mostra a resolução e profundidade de cores de um dispositivo de vídeo conectado. Como não tenho nenhum conectado a ele, não vou exemplificar.

vcgencmd mem_oom

Mostra estatísticas de qualquer evento Out Of Memory ocorrendo na memória VC4.

vcgencmd mem_oom

vcgencmd mem_reloc_stats

Confesso que já estou cheio de escrever sobre o tema; tem comandos demais. Mas esse comando mostra estatísticas da memória realocável pelo alocador na VC4.

vcgencmd read_ring_osc

Esse comando é bacana. Ele retorna clock, tensão e temperatura. Bastante informação de uma só vez.

vcgencmd read_ring_osc

vcgencmd hdmi_timings

Esse é outro caroço que depende de leitura de documentação.

vcgencmd display_power [0|1|-1] [display]

Esse é bacana. Com ele podemos ver o status de energia do display ou configurar o estado de energia. Com vcgencmd display_power 0 desligamos o display corrente. Com 1 o ligamos. Sem parâmetros, vemos o status atual.

O parâmetro final display é opcional e podemos pegá-lo através do comando tvservice -l ou seguindo a tabela abaixo:

DisplayID
Main LCD0
Secondary LCD1
HDMI 02
Composite3
HDMI 17

vcgencmd display_power 0 7 desligará o display de ID 7, que é o HDMI 1 no RPi 4.

Esse artigo foi um teste de paciência, mas é bom ter isso relacionado para facilitar consultas posteriores, afinal, ninguém quer decorar comandos de uso ocasional, certo?

Onde comprar Raspberry Pi?

Se precisa comprar um Raspberry Pi 4, a MASUGUX tem por um ótimo preço. Na Saravati tem a Raspberry Pi 3B+, assim como na CurtoCircuito que tem a Raspberry Pi 3.

Onde comprar fonte para Raspberry Pi?

O artigo anterior é justamente sobre uma excelente fonte confiável para Raspberry. Confira o artigo anterior ou vá direto ao site para conferir a fonte.

Espero que tenha gostado da leitura!

 

Revisão: Ricardo Amaral de Andrade

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.