Underclock via bin/fex nas Orange Pi

No artigo sobre a Orange Pi One eu já havia comentado sobre um grave problema que precisa ser corrigido para um melhor uso da placa: o superaquecimento do processador. Grande parte da linha OrangePi é vendida com um processador ARM Quad-Core da AllWinner (modelo H3) de 1.6GHz. Apesar de praticável, essa frequência de operação não é estável, ela só é alcançada ao se aumentar da tensão padrão de 1.2V para 1.5V e a frequência configurada para 1.536GHz – processos que são conhecidos como OVERVOLT e OVERCLOCK, respectivamente.

O problema

Inicialmente, com os componentes ainda frios e em um dia não muito quente, o uso não é prejudicado a principio, mas após algumas tarefas que envolvam algum estresse do processador, ou simplesmente deixando a placa ligada por algumas horas, várias coisas começam a acontecer, entre elas está o Thermal Throttling.

Inicialmente se percebe uma lentidão e a placa começa a ficar realmente quente, emanando calor perceptível a certa distância. Neste ponto de 2 a 3 núcleos dos 4 existentes estão desligados automaticamente pelo Kernel do Linux por segurança – o que causa a lentidão – e graças a isso não perdemos a placa por um erro do fabricante.

Verificando a temperatura


Para verificar a temperatura do processador você pode estar consultando através do terminal utilizando estes comandos:
cat /sys/class/thermal/thermal_zone0/temp e
cat /sys/class/thermal/thermal_zone1/temp.
Ambos os comandos retornam um número como saída, este é a temperatura média do processador em graus Celsius.

Corrigindo o problema

A configuração é feita no arquivo script.bin que se comporta de forma similar ao arquivo config.txt presente nas Raspberry Pi, porém ele é ligeiramente mais complicado de se entender. Ele está localizado na partição de BOOT do cartão SD do sistema operacional.

O script.bin é um arquivo de configuração que é gerado a partir de um arquivo .fex. O script fex contém várias tags com parâmetros de configuração que posteriormente são convertidas em arquivo binário e utilizado como script de inicialização da placa de desenvolvimento. Há ferramentas de conversão de FEX para BIN (fex2bin) e de BIN para FEX (bin2fex) presentes em um pacote denominado sunxi-tools. A maioria das distribuições Linux possuem esse pacote no repositório, então você pode instalá-las tranquilamente pelo seu gerenciador de pacotes, há também versões desse pacote para o Windows, não sendo requisito um computador linux para realizar o procedimento.

Editando as configurações

O que deve ser feito é a modificação dos parâmetros do arquivo .fex original do BOOT da Orange Pi para que este fosse inicializado utilizando a frequência de 1008MHz. Você pode converter o aquivo script.bin para script.fex e fazer as alterações, ou fazer o download do arquivo .fex da Orange Pi no fórum oficial. Abaixo você pode ver quais serão as modificações no arquivo:

Na seção [target], altera-se a frequência de boot de 1536MHz para 1008MHz (# significa comentário, bem como o ponto-e-vírgula:

;----------------------------------------------------------------------------------
;[target]  system bootup configuration
;boot_clock    = CPU boot frequency, Unit: MHz
;storage_type    = boot medium, 0-nand, 1-card0, 2-card2, -1(defualt)auto scan
;----------------------------------------------------------------------------------
[target]
boot_clock       = 1008  
#boot_clock       = 1536

Na seção [dvfs_table] altera-se a frequência extrema e máxima, ambas para 1008MHz:

[dvfs_table]
pmuic_type = 2  
pmu_gpio0         = port:PL06<1><1><2><1>  
pmu_level0        = 11300  
pmu_level1        = 01100  
#extremity_freq = 1536000000
extremity_freq = 1008000000  
#max_freq = 1536000000
max_freq=1008000000  
min_freq = 480000000

E logo abaixo altera-se os níveis de frequência e tensão. São oito níveis configurados, mas somente 4 possuem valores válidos, os outros 4 são zerados. Basta alterar os dois primeiros para 1008MHz e 1.2V, e o clonar o quarto nível no terceiro:

#LV1_freq = 1536000000
#LV1_volt = 1500
LV1_freq = 1008000000  
LV1_volt = 1200

#LV2_freq = 1008000000
#LV2_volt = 1200
LV2_freq = 1008000000  
LV2_volt = 1200

#LV3_freq = 1008000000
#LV3_volt = 1200
LV3_freq = 0  
LV3_volt = 1100

Existem mais algumas centenas de parâmetros para configuração, mapeamento de barramento de I/O, política de acesso a memória e uso da GPU, entre outros, mas esses não precisaram ser alterados se não precisar.

Feitas as alterações é só realizar o processo inverso e converter o arquivo .fex de volta para script.bin e então o substituir na partição de BOOT. Consultando as informações sobre o processador utilizando o comando lscpu, podemos ver que todos os núcleos do processador estão online e operando a uma temperatura aceitável.

Este artigo foi baseado no artigo original de Toni Ideguchi, que infelizmente não contamos mais com seu site online.

Como ele dizia,
Keep Hacking! \o

Até o próximo

3

Graduando em Engenharia Elétrica pela Universidade Federal de São João del Rei (UFSJ) também é Técnico em Eletrotécnica pelo Centro Federal de Educação Tecnológica de Minas Gerais (CEFET-MG). Apaixonado por criação e desenvolvimento de projetos relacionados à software e hardware.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *