Hardware BeagleBone Black - Controlando o PMIC

Recentemente fizemos uma análise detalhada sobre as alimentações da nossa plataforma BeagleBone Black. Nos 4 artigos passados, entendemos qual foi a estratégia adotada e quais as tensões são fornecidas para cada um dos dispositivos. Também mencionamos que existe uma comunicação entre o núcleo e o PMIC, mas não entrando em maiores detalhes. Com eles, demos toda a base necessária para começarmos a fazer testes e modificações na nossa plataforma.

 

Neste artigo vamos fazer a comunicação com o nosso PMIC, o TPS65217C [1] da Texas Instruments [2]. Vamos analisar um pouco mais essa interface para entender como se dá a leitura e escrita do registro. Pretendemos também entender como fazer a leitura e escrita de dados nesse componente. Dessa forma, controlaremos tensões e o funcionamento do dispositivo. De maneira diferente aos artigos anteriores, vamos tentar manter este com um enfoque prático, sempre que possível.

 

Vale lembrar que o PMIC controla as tensões do sistema, e qualquer alteração deve ser feita com muito cuidado. Devemos sempre entender exatamente o que estamos alterando e o que isso irá fazer em nosso hardware. Os reguladores do PMIC permitem alterar a tensão para até 3,3V e alguns componentes da BeagleBone Black não suportam essa tensão.

 

Assim, é possível literalmente danificar e até mesmo queimar sua placa apenas com comandos I2C. Logo, vamos apresentar o que pode ser feito. Mas se pretende repetir nossos testes, é por sua conta e risco.

bbb-pmic-perigo

 

 

A comunicação I2C

 

Como apresentado em nosso primeiro artigo [3], a nossa BeagleBone Black possui um canal de comunicação I2C. Não vamos detalhar aqui o funcionamento dessa comunicação, mas precisamos entender como funciona o processo de endereçamento para utilizar corretamente nossa ferramenta.

 

Se verificarmos o datasheet do PMIC (U2), este apresentará o endereço I2C como sendo 24h e presente no barramento 0. Olhando os bits conforme a carta de tempo, vemos que esse endereço é apresentado como 7 bits e o bit menos significativo é dedicado à indicação de leitura ou escrita.

 

Já, no datasheet da memória EEPROM 24LC32A (U7) [4] que está presente no mesmo barramento, o endereço apresentado é A0h. No entanto, esse endereço é apresentado como 8 bits. Isso porque este documento considerou o bit de leitura e escrita como sendo parte do endereço. O mesmo aconteceu com o Transmissor HDMI 1.4 TDA19988 (U11) [5], que responde aos endereços E0h e 68h.

 

No entanto, o padrão do barramento I2C considera 7 bits de endereços e 1 bit (o menos significativo) para indicar leitura ou escrita do dado. Vemos, então, que alguns datasheets apresentam o endereço do dispositivo como sendo de 7 bits, outros apresentam o endereço como sendo de 8 bits.

 

Coloco aqui uma tabela para entender os bits de endereçamento desses três dispositivos. Para os endereços apresentados como 8 bits, é considerado 0 o bit menos significativo, que é utilizado como leitura/escrita.

 

Tabela 1: Como entender os endereços do I2C  

 

Endereço em bits

Endereço em 7 bits

Endereço em 8 bits

 TPS65217C 

010 0100

24h

48h

 24LC32A 

101 0000

50h

A0h

TDA19988 HDMI

111 0000

70h

E0h

TDA19988 CEC

011 0100

34h

68h

 

 

Os comandos I2C

 

A BeagleBone Black vem com a distribuição Angström instalada. Essa distribuição possui nativamente a ferramenta I2C-Tools [6]. Essa ferramenta permite a leitura e escrita de dados nos barramentos I2C Master do nosso núcleo, o que permite não apenas o controle do PMIC, como de qualquer um dos dispositivos presentes (memória e HDMI) como de qualquer "Cape".

 

Essa ferramenta possui quatro principais instruções. São elas:

  • i2cdetect

Essa instrução faz a verificação de quais os barramentos I2C estão disponíveis nesse núcleo.

  • i2cdump

Faz a leitura de 256 bytes do dispositivo endereçado na forma de uma tabela de dados, à partir do endereço 00h.

  • i2cget

Faz a leitura de bytes individuais à partir de um endereço informado.

  • i2cset

Faz a escrita de bytes individuais em um endereço informado.

 

 

Os registradores do TPS65217C

 

O nosso PMIC possui um mapa de registros bem simples e organizado. Os registros possuem funções definidas e endereços claros, de forma que o acesso a eles seja feito de maneira direta. É importante reparar na coluna PROTECTION, que define o nível de proteção de cada registro desse dispositivo. A leitura de todos os registradores é feita de maneira simples, mas a escrita é dependente do nível de proteção de cada um deles. Vamos detalhar melhor o processo de proteção mais adiante.

 

Tabela 2: Mapa de Registros do TPS65217C 

Mapa de Registros do TPS65217C.

 

Para o acesso ao registrador, vamos utilizar o endereço em hexadecimal na linha de comando apresentada. Cada registrador possui um valor de reset, sendo alguns apenas de leitura. Esses registradores de valor padrão serão nosso ponto inicial nessa análise.

 

 

Acessando a Linha de Comando

 

Nossos testes foram feitos no Linux Ubuntu 14 [7]. No entanto, você pode fazer esse teste em qualquer plataforma, desde que tenha acesso ao terminal do Angström dentro de sua BeagleBone Black. No caso de computadores utilizando Windows, esse terminal pode ser acessado pelo putty [8] através do canal serial que o driver da BeagleBone Black vai disponibilizar.

 

No nosso caso, assim que conectamos a nossa plataforma pela USB em um computador utilizando Linux, o sistema automaticamente apresenta um novo terminal serial definido como ttyACM0. É através desse canal serial que vamos fazer esse desenvolvimento. Para tanto, faremos uso do minicom, uma vez que vamos trabalhar em modo texto.

 

Uso do "minicom" como acesso ao terminal. Figura 1: Uso do "minicom" como acesso ao terminal

 

Não há grandes segredos na configuração da comunicação serial. O dispositivo utiliza 115200bps sem controle de fluxo, 8 bits de dados e 1 bit de parada (stop-bit). Para maiores detalhes sobre o uso terminal, pode-se verificar o manual do minicom [9].

 

Configuração da serial dentro do "minicom".Figura 2: Configuração da serial dentro do "minicom"

 

Uma vez tendo o terminal configurado, a primeira conexão já apresenta a tela de login. Nesse momento, já estamos dentro de nossa BeagleBone Black. Com o login "root" e deixando a senha em branco, temos o acesso à linha de comando de dentro de nossa plataforma.

 

Terminal da BeagleBone Black.Figura 3: Terminal da BeagleBone Black

 

Para sair do terminal minicom, basta utilizar CTRL+A e, em seguida X. Esse comando fecha o programa e retorna ao terminal.

 

 

Dump do TPS65217C

 

A primeira instrução que vamos verificar é i2cdump. Só ela já dá toda a informação que precisamos desse dispositivo. Para executá-la basta enviar a seguinte instrução ao terminal.

 

i2cdump -y -f 0 0x24

 

O parâmetro -y desabilita o modo interativo. Por padrão, o i2cdump aguarda uma confirmação do usuário antes de enviar uma mensagem através da I2C. Com esse parâmetro, essa confirmação não é solicitada.

 

O parâmetro -f indica "force". Ele força a comunicação mesmo que o dispositivo esteja retornando ocupado. Há uma indicação importante sobre esse parâmetro, a biblioteca indica que o uso dela pode causar problemas no driver do kernel e causar dados inválidos no dump.

 

Infelizmente não consegui fazer o uso das instruções da I2C-Tools sem o parâmetro "force". A indicação de ocupado sempre ocorre, mesmo nos outros dispositivos do mesmo canal I2C. Por conta disso, vamos fazer uso desse parâmetro, tendo o cuidado de analisar sempre a consistência dos retornos para evitar considerar dados inválidos.

 

O parâmetro seguinte é "0", que indica o canal da I2C que estamos utilizando. Para o nosso núcleo, temos mais de um canal de I2C. No entanto, nosso periférico está ligado ao canal 0, como verificamos no esquemático do primeiro artigo.

 

Comunicação I2C no canal 0 ligada à PMIC.

 Figura 4: Comunicação I2C no canal 0 ligada à PMIC

 

Por último, o endereço do dispositivo é colocado em hexadecimal conforme o padrão de linguagem C. Como verificamos que o endereço informado deverá ser 24h, o parâmetro utilizado é 0x24.

 

Segue, então, o resultado da nossa primeira instrução. O dump apresenta os 256 primeiros registros do dispositivo presente no endereço indicado.

 

Figura 5: Dump do PMIC TPS65217C através da I2C

 

Para validar esse resultado e conhecer um pouco melhor o PMIC, vamos analisar alguns dos bytes apresentados.

 

  • CHIP ID (00h)

 

Este registro está presente do endereço 00h de nossa memória. Como podemos ver no dump, o valor dentro desse registro é E2h. Analisando o datasheet do componente, podemos entender melhor o que isso significa.

Os 4 bits mais significativos (1110) indicam qual o modelo do PMIC utilizado, neste caso TPS65217C. Já os 4 bits menos significativos (0010) indicam a revisão, Rev: 1.2 para esta plataforma.

 

Tabela 3: Registro CHIPID

Registro CHIPID.

 

 

  • POWER PATH CONTROL (01h)

 

O registrador PPATH se encontra no endereço 01h, e configura o caminho da alimentação do circuito para VSYS. Podemos observar no diagrama de blocos que é possível selecionar as entradas como AC, USB ou BAT.

 

 

Diagrama de blocos do Power Path, dentro do PMIC.

Figura 6: Diagrama de blocos do Power Path, dentro do PMIC

 

Os principais chaveamentos são controlados por esse registrador, que possui um valor de configuração de reset diferente do valor verificado no dump. Abaixo temos o mapa de bits desse endereço de memória. Podemos verificar que o valor padrão é 3Dh. No entanto, o valor observado no dump é 3Eh. Vamos entender exatamente quais as configurações originais e o que estamos observando.

 

 Tabela 4: Registro PPATH no PMIC

Registro PPATH no PMIC.

 

 

Os dois primeiros bits mais significativo são ACSINK e USBSINK. Eles definem o controle de corrente para as entradas AC e USB respectivamente. São ativos em 0, o que significa que, para o nosso caso, eles estão ativos. Podemos ver onde eles ativam esse controle no diagrama de blocos apresentado.

 

Os dois bits seguintes, AC_EN e USB_EN, habilitam as entradas AC e USB como fontes de alimentação do VSYS. Também podemos ver esse controle no diagrama de blocos como entrada do "Switch Control". Eles são ativos em 1, e o valor observado aqui é 11, o que significa que ambos estão habilitados como alimentação para o sistema.

 

Em seguida temos o IAC. Esses dois bits indicam a corrente máxima que podemos drenar da alimentação externa. Os valores possíveis são: 

 

 

Tabela 5: Corrente limite para AC

BitsCorrente
00100mA
01500mA
101300mA
112500mA

 

 

Para o nosso caso, podemos verificar que os valores de reset e os verificados no dump definem o maior valor de corrente que o PMIC suporta, 2500mA. Dessa forma, se for necessário, essa será a corrente máxima consumida pelo sistema.

 

De forma similar, a configuração do registrador IUSB define a corrente máxima consumida pela entrada USB. No entanto, os valores limite de corrente são diferentes, conforme apresentamos abaixo:

 

 

Tabela 6: Corrente limite para USB

BitsCorrente
00100mA
01500mA
101300mA
111800mA

 

Os valores de fábrica indicam 01 para esse registrador, o que define um limite de 500mA. Essa configuração faz todo o sentido prático, uma vez que a potência máxima padrão da USB é 2,5W, o que nos fornece apenas os 500mA configurados. Não é possível saber se há uma negociação via software para a USB fornecer mais corrente, mas essa configuração é alterada na inicialização do Linux para 10, limitando a corrente em 1300mA.

 

  • POWER GOOD (0Ch)

 

Aqui vemos a configuração do registrador PGOOD, presente no endereço 0Ch. Esse registrador indica o Power Good, que significa que as tensões estão dentro dos limites previstos e funcionando bem. O valor de reset para esse registrador é 00h, mas é alterado dinamicamente conforme o funcionamento do sistema. O bom funcionamento das tensões é apresentado como bit 1, sendo que o bit mais significativo não é utilizado e sempre será apresentado como 0. Sendo assim, o correto funcionamento é apresentado como 7Fh, que é exatamente o que observamos no dump que fizemos.

 

 Tabela 7: Registrador PGOOD do PMIC

Registrador PGOOD do PMIC.

 

 

Os Níveis de Segurança

 

O nosso PMIC possui dois níveis de segurança, o Level1 e Level2. Eles garantem que nenhuma escrita será feita de maneira equivocada nos registradores críticos do dispositivo. Apesar disso, seu funcionamento é bastante simples.

 

A leitura de todos os registros de memória é permitido sem nenhuma restrição, apenas a escrita é controlada. O PMIC utiliza um byte como "senha" e executa um XOR com o endereço onde se deseja escrever um determinado dado. O resultado é encaminhado a o registrador PASSWORD, que será utilizado para verificar a instrução de escrita.

A senha utilizada para esse sistema de proteção é 7Dh e o registrador PASSWORD (endereço 0Bh) é apresentado abaixo.

 

 

 Tabela 8: Registrador PASSWORD, para o controle da proteção do sistema

Registrador PASSWORD, para o controle da proteção do sistema.

 

 

  • Proteção Level1

 

A escrita de registradores que exigem proteção Level1 segue uma regra simples, conforme segue abaixo:

 

1 - É feito um XOR entre o endereço do registrador de destino e a senha (7Dh). Esse resultado é escrito no registrador PASSWORD (0Bh).

2 - Escrever o dado desejado no registrador, de maneira direta.

 

  • Proteção Level2

 

Este nível de proteção é idêntico ao Level1, com exceção que é necessário executar a instrução duas vezes para que ela tenha efeito.

 

1 - É feito um XOR entre o endereço do registrador de destino e a senha (7Dh). Esse resultado é escrito no registrador PASSWORD (0Bh).

2 - Escrever o dado desejado no registrador, de maneira direta.

3 - O resultado do XOR do passo 1 é escrito novamente no registrador PASSWORD (0Bh).

4 - Escrever o dado desejado no registrador novamente, conforme o passo 2.

 

É importante saber que, uma vez escrito o valor no registrador PASSWORD, a instrução seguinte deverá ser a alteração do registro endereçado e devidamente calculado. Após essa alteração, ou na execução de qualquer outra instrução, esse valor é resetado e o procedimento deverá começar novamente.

 

 

Alterando o Power Good Delay

 

Como teste inicial, vamos fazer a alteração de um dado que exige segurança Level1. Para isso, selecionamos o DEFPG, presente no endereço 0Dh. O valor inicial desse registro é 0Ch, como podemos ver no dump.

 

 

 Tabela 9: Power good delay.

bbb-pmic-11

 

Neste registrador nos interessa apenas PGDLY. Trata-se de dois bits que definem o tempo de delay da informação de power-good. Inicialmente esse valor vale 00, o que nos dá um tempo de 20ms. Vamos fazer a alteração para 11, o que altera o delay para 400ms. Apenas como referência, os valores possíveis para este campo desse registrador são:

 

 

Tabela 10 : Tempo de delay para Power Good.

PGDLYTempo
 0020ms
 01100ms
 10200ms
 11400ms

 

Seguindo o padrão de segurança, é necessário calcular o XOR do valor do endereço com o valor 7Dh. Como o endereço é 0Dh, o cálculo segue como abaixo:

 

 

bbb-pmic-24

Figura 7: Cálculo de 0Dh XOR 7Dh, resultando em 70h.

 

 

Esse valor calculado precisa ser escrito no registrador PASSWORD através de i2cset. A sequência é a seguinte:

 

 

// I2C-0, endereço 24h, registrador 0Bh, escreve 70h

i2cset -y -f 0 0x24 0x0B 0x70

// I2C-0, endereço 24h, registrador 0Dh, escreve 0Fh

i2cset -y -f 0 0x24 0x0D 0x0F

 

Podemos verificar esse procedimento e o resultado conforme abaixo:

 

Alteração do rempo de delay no registrador DEFPG, fazendo a configuração do endereço de escrita no registrador PASSWORD.Figura 8:  Alteração do tempo de delay no registrador DEFPG, fazendo a configuração do endereço de escrita no registrador PASSWORD.

 

 

Alterando a tensão do LDO2

 

A alteração de tensão do LDO2, responsável pela tensão VDD_3V3AUX, exige um estudo com um pouco mais de calma nas possíveis versões de hardware que você tenha. Nas revisões mais atuais, esse dispositivo apenas alimenta um LED e nada mais. No entanto, em versões mais antigas, esse regulador servia de ENABLE para um LDO externo TL5209 [10]. Logo, vamos fazer uma análise.

 

Nas revisão A4A, A5A e A5B, a VDD_3V3AUX alimenta o LED azul D1 através do resistor R12 de 820Ω, e o ENABLE de U4 (LDO externo TL5209 [10]).

 

VDD_3V3AUX habilitando o TL5209.

Figura 9: VDD_3V3AUX habilitando o TL5209. Revisões A4A, A5A e A5B 

 

 

Já na revisão A5C, o resistor R12 foi alterado para 4,75KΩ. Como já dissemos em um artigo anterior [11], isso foi feito para diminuir a intensidade do LED. No entanto, o ENABLE para U4 permanece lá.

 

Alkim

 Figura 10: Alteração em R12 na revisão A5C

 

 

Nas revisões seguintes, A6, A6A, B e C, o ENABLE de U4 foi alterado para VDD_3V3A. Isso significa que VDD_3V3AUX apenas alimenta o LED, que permanece com o resistor R12 de 4,75KΩ.

 

asdasdasdasd

Figura 11: Tensão VDD_3V3B sincronizado com VDD_3V3A

 

 

Caso a placa seja uma versão anterior, que habilita o ENABLE de U4, precisamos saber quais as tensões que podemos aplicar nesse pino para manter o funcionamento. Analisando o datasheet, verificamos que esse pino aceita o nível alto à partir de 2,0V. Caso a tensão seja menor do que isso, ele pode desabilitar, desligando todos os circuitos que são alimentados por VDD_3V3B, o que seria catastrófico para o funcionamento do sistema.

 

 Tabela 11: Tensão mínima de ENABLE para TL5209.

Tensão mínima de ENABLE para TL5209.

 

 

Agora falta analisar o que pode ser feito no PMIC. O registrador responsável por alterar a tensão do LDO2 (VDD_3V3AUX no circuito) é o DEFLDO2, presente no endereço 13h. Esse registrador respeita a segurança Level2, conforme verificamos anteriormente.

 

Tabela 12: Registrador DEFLDO2 do PMIC

Registrador DEFLDO2 do PMIC.

 

 

Segundo o dump que executamos, esse registrador está com o valor de 38h. O campo TRACK se apresenta com o valor 0, o que significa que a tensão é definida pelos 6 bits do campo LDO2 desse registrador. O resto do valor é apresentado como 11 1000, o que significa 3,300V conforme a tabela abaixo.

 

Tabela 13: Tabela de valores de tensão para o DEFLDO2 do PMIC

Tabela de valores de tensão para o DEFLDO2 do PMIC.

 

Sabemos, então, que nas revisões anteriores a A6, o regulador LDO U4 é habilitado pela tensão de LDO2 VDD_3V3AUX e exige uma tensão superior a 2,00V. Além disso, em todas as versões o sistema alimenta o LED D1. Esse LED é um LTST-C191TBKT [12], e o datasheet indica que a tensão VF pode variar de 2,80V a 3,80V.

 

Isso significa que, se alterarmos a tensão de LDO2 para algo acima de 2,00V para manter U4 funcionando, e abaixo de 2,80V, vamos observar o LED D1 apagar, pois é abaixo da tensão mínima conforme o datasheet. Isso para todas as versões da BeagleBone Black até a revisão C.

 

À partir do que sabemos, vamos alterar o valor de tensão de LDO2 para, por exemplo, 2,20V. Isso garante nossa estratégia, vamos apagar o LED D1, e manter o circuito funcionando sem maiores problemas. Essa tensão é definida como 10.0110 segundo o datasheet. Logo, vamos alterar o valor 38h do registrador DEFLDO2 (13h) para o valor 26h.

 

Como esse registrador respeita o Level2 de segurança, precisamos fazer isso respeitando a regra que estudamos. O endereço 13h precisa passar por um XOR com o valor 7Dh. Esse resultado é 6Eh.

 

 

bbb-pmic-22Figura 12: Cálculo de 13h XOR 7Dh, resultando em 6Eh.

 

 

À partir desse valor, sabemos que precisamos escrever o resultado no registrador PASSWORD (0Bh), escrever  no registrador DEFLDO2 (13h) o valor para 2,200V (26h), e repetir essas duas instruções devido à proteção Level2. A sequencia é:

 

i2cset -y -f 0 0x24 0x0B 0x6E

i2cset -y -f 0 0x24 0x13 0x26

i2cset -y -f 0 0x24 0x0B 0x6E

i2cset -y -f 0 0x24 0x13 0x26

 

Podemos verificar isso no terminal conforme abaixo.

 

Alteração da tensão VDD_3V3AUX em LDO2.Figura 13: Alteração da tensão VDD_3V3AUX em LDO2

 

 

Esse teste foi feito em uma BeagleBone Black na revisão A5B, por isso é necessário tomar cuidado para não desabilitar U4. Logo que o último comando i2cset é executado, verificamos que o LED D1 imediatamente. Mais do que isso, todo o sistema continua funcionando corretamente, o que indica que a estratégia funcionou.

 

Observamos, então, a tensão antes e depois dessa sequencia, e o resultado é exatamente o esperado.

 

Tensão sobre o ânodo do LED D1 antes e depois das instruções I2C.Figura 14: Tensão sobre o ânodo do LED D1 antes e depois das instruções I2C.

 

 

Conclusão

 

Apagar um LED em uma plataforma como essa pode não ser exatamente a coisa mais emocionante do mundo, mas o tipo de entendimento necessário para isso certamente é o que traz a alegria de ter conseguido fazê-lo.

 

Com o que foi aprendido, é possível colocar o equipamento em baixo consumo, alterando as tensões e as correntes para trabalhar com baterias, por exemplo. Também é possível fazer alterações de tensão para as "Capes" que forem adaptadas, e até mesmo utilizar o PMIC como carregador de bateria, coisa que vimos ser possível já no primeiro artigo.

 

 

Agradecimentos

 

Fica aqui meu agradecimento para Victor Furtado Leite, que me auxiliou nos testes práticos desse artigo.

 

 

Referências

 

24LC32A -http://ww1.microchip.com/downloads/en/DeviceDoc/21713M.pdf
I2C-Tools -http://lm-sensors.org/wiki/I2CTools
BeagleBone Black SCH Rev A4A -https://github.com/CircuitCo/-BeagleBone-Black-RevA4/blob/master/BeagleBone_Black_Schem_A4.pdf?raw=true
BeagleBone Black SCH Rev A5A -https://github.com/CircuitCo/BeagleBone-Black/blob/rev_a5a/BBB_SCH.pdf?raw=true
BeagleBone Black SCH Rev A5B -https://github.com/CircuitCo/BeagleBone-Black/blob/rev_a5b/BBB_SCH.pdf?raw=true
BeagleBone Black SCH Rev A5C -https://github.com/CircuitCo/BeagleBone-Black/blob/rev_a5c/BBB_SCH.pdf?raw=true
BeagleBone Black SCH Rev A6 -https://github.com/CircuitCo/BeagleBone-Black/blob/rev_a6/BBB_SCH.pdf?raw=true
LTST-C191TBKT -http://download.siliconexpert.com/pdfs/2011/8/28/0/24/13/382/lot_/manual/dwonloadfilehandler.ashxtxtspecnods22-2000-230txtpartnoltst-c191tbkt.pdf
Minicom man page -http://linux.die.net/man/1/minicom

[1] TPS65217C

[2] Texas Instruments

[3] Hardware BeagleBone Black – Alimentação – Parte 1

[4] 24LC32A

[5] TDA19988

[6] I2C-Tools

[7] Linux Ubuntu 14

[8] Putty

[9] Minicom

[10] TI TL5209

[11] https://www.embarcados.com.br/hardware-bbb-alimentacao-parte-4/

[12] LTST-C191TBKT

Figura 1: Fonte: http://www.celeritystaffing.com/caution-ridiculous-and-real-product-warnings-ahead/