Pular para conteúdo

Habilitando a FAN

imagems

Image by Clker-Free-Vector-Images from Pixabay

Introdução

A Khadas VIM3 possui alguns acessórios, dentre eles a ventoinha. Não tenho certeza se ela já vem habilitada com o sistema que vem por padrão na placa (Android Pie (9)), mas na versão do kernel Linux que eles mantém, a ventoinha já está adicionada.

Infelizmente na versão do kernel Linux Android que estou utilizando nesse momento, a ventoinha ainda não foi adicionada. Dessa forma, nesse post vou descrever os passos que segui para conseguir utilizar a mesma.

Informações Úteis

  • Versão do AOSP: android-12.0.0_r4
  • Versão do Kernel Android: android-amlogic-bmeson-5.4
  • Distro de Compilação: Linux Mint 21
  • Versão do Kernel da distro: 5.15.0-56-generic

A porta da FAN

O conector da FAN está no número 6 da imagem abaixo (Fonte):

imagems

Vista de cima da VIM3

Agora é preciso saber onde estas portas estão conectadas internamente. Para isso, é necessário buscar no esquemático da placa, que pode ser encontrado nesse link. Procurando por FAN, podemos encontrar a porta mencionada anteriormente no esquemático.

imagems

Esquemático do conector da FAN

Com isso, é possível observar que existem os seguintes sinais: VCC, GND e FAN_PWM. Dessa forma, o pino de controle da ventoinha é o FAN_PWM, é preciso saber de onde este sinal está vindo. Para isso, basta buscar no esquemático por FAN_PWM e o componente abaixo será encontrado.

imagems

Fonte do sinal FAN_PWM

O STM8S é um microcontrolador de 8 bits, ele é responsável por fazer o controle da ventoinha (pino 17). Ainda no esquemático, é possível observar que esse microcontrolador é controlado por i2c (pinos 8 e 9) sendo estes do próprio SOC. O esquemático não fornece o endereço, para controlar esse microcontrolador, ou seja, não temos como ter acesso a esse componente.

O Endereço do STM8S

Como a FAN está adicionado ao Kernel Linux mantido pela Khadas, então a informação do endereço do microcontrolador está em algum lugar do código (mas onde ?). Ainda observando as portas do STM8S no esquemático, é possível perceber algumas menções de MCU (sigla para MicroController Unit). A partir disso, é muito provável que qualquer endereço de i2c esteja em algum Device Tree Source (DTS) dentro do Kernel Linux da Khadas. Os DTS da VIM3 estão em arch/arm64/boot/dts/amlogic/ e nesse caminho busquei por MCU e retornaram os seguintes arquivos:

╭─ ~/Doc/b/V/2/linux-vim3/a/arm6/b/d/amlogic on khadas-vim3-p-64bit 
╰─❯ grep -r mcu                                                              ─╯
tm2_t962x3_t312.dts:            /*mcu irq pin*/
tm2_t962x3_t312.dts:            mcu_irq_pin = <&gpio GPIOH_9 GPIO_ACTIVE_HIGH>;
kvim3.dts:       khadas-mcu {
kvim3.dts:               compatible = "khadas-mcu";
axg_s400_v03sbr.dts:    mcu6350: mcu6350@40 {
axg_s400_v03gva_sbr.dts:    mcu6350: mcu6350@40 {
kvim3.dts11:       khadas-mcu {
kvim3.dts11:               compatible = "khadas-mcu";
kvim3.dtsbak:       khadas-mcu {
kvim3.dtsbak:               compatible = "khadas-mcu";
kvim3.dtspdm:       khadas-mcu {
kvim3.dtspdm:               compatible = "khadas-mcu";
kvim3.dts_dai:       khadas-mcu {
kvim3.dts_dai:               compatible = "khadas-mcu";
kvim3l.dts: khadas-mcu {
kvim3l.dts:     compatible = "khadas-mcu";

A branch que eu utilizei foi a khadas-vim3-p-64bit

O arquivo kvim3.dts pareceu promissor, checando a linha retornada anteriormente:

kvim3.dts
&i2c_AO {
  status = "okay";
  pinctrl-names="default";
  pinctrl-0=<&ao_i2c_master_pins1>;
  clock-frequency = <100000>; /* default 100k */

  khadas-mcu {
    compatible = "khadas-mcu";
    reg = <0x18>;
    fan,trig_temp_level0 = <50>;
    fan,trig_temp_level1 = <60>;
    fan,trig_temp_level2 = <65>;
    fan,trig_temp_level3 = <70>;
    hwver = "VIM3.V11";
  };
  ...
};
Um node chamado khadas-mcu dentro do node i2c_AO (o mesmo que controla o STM8S). Ainda é possível observar que o endereço utilizado é o 0x18 (reg = <0x18>;). Agora resta testar.

Testando no Kernel Android

Para testar, adicionei o seguinte conteúdo no final do arquivo:

arch/arm64/boot/dts/amlogic/meson-g12b-a311d-khadas-vim3.dts
...

&i2c_AO {
  khadas-mcu {
    compatible = "khadas-mcu";
    reg = <0x18>;
    fan,trig_temp_level0 = <50>;
    fan,trig_temp_level1 = <60>;
    fan,trig_temp_level2 = <65>;
    fan,trig_temp_level3 = <70>;
    hwver = "VIM3.V11";
  };
};

Dessa forma, é possível ter acesso ao componente que tenha o endereço 0x18 (ainda não é certeza que seja o STM8S). Buildando o Kernel com essas alterações e adicionando ao AOSP, so resta flashar o boot.img e checar se o endereço 0x18 está disponível. Para isso, é possível utilizar o comando i2cdetect, por meio do adb shell. O retorno do comando foi o seguinte:

╰─❯ adb shell
jaoboard:/ # i2cdetect -y 0                                                    
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- 0e --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: UU -- 22 -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --       
Tudo caminhando bem, endereço 0x18 habilitado. Entretanto, existe um problema, mesmo que o endereço seja o do STM8S, ele é apenas uma interface para controlar a FAN. Dessa forma, existe um firmware gravado nele (na qual não temos acesso) que dado uma entrada ele executa uma saída.

Checando a escassa documentação da placa, encontrei o seguinte pdf vim3_mcu_reg_en que não faz nenhuma menção ao STM8S, mas possui a seguinte linha:

Address Register Name Byte R/W Note
0x88 CMD_FAN_STATUS_CTRL 0 W 0:Disable Fan
1:Fan Speed Level 1
2:Fan Speed Level 2
3:Fan Speed Level 3

Fiz o seguinte teste no shell do Android:

jaoboard:/ # i2cset 0 0x18 0x88 1 w                                            
Write register 0x88 from chip 0x18 on bus 0? (Y/n):

e Voilà a ventoinha começou a girar.

imagems

Ventoinha funcionando

Conclusão

Sem dúvidas, a falta de documentação para as placas em geral é um grande problema e isso dificulta o Bring up das mesmas. Se não tiver uma equipe interna para fazer as implementações, é praticamente impossível fazer alguma coisa funcionar. Como foi possível perceber nesse post, se não fosse alguém da própria khadas para gerar o DTS com o endereço, a ventoinha seria inacessível, uma vez que existe uma interface para controla-la. Mas no fim, deu tudo certo e seguimos na luta para aprender sobre embarcados :).

Comentários