Desligar/Ligar alimentação USB Host BeagleBone Black

605 views
Skip to first unread message

Cleiton Bueno

unread,
Jun 3, 2014, 6:38:19 AM6/3/14
to sis_emb...@googlegroups.com
Um amigo me chamou domingo (01/06/2014) que precisaria "cortar" a alimentação VCC da USB da BBB e depois ligar novamente, com essas informações comecei a brincar com a board tentei enviar o usb1 para /sys/bus/.../unbind porém a alimentação não é interrompida.

Na versão do Angstrom com o kernel 3.8.13 não encontrei o diretamente o /sys/kernel/debug/omap_mux/ porém vi o /sys/kernel/debug/pinctrl que tem praticamente quase as mesmas informações imagino eu, como o GPIO3_13 (USB1_DRVVBUS) não faz parte do GPIO (Headers P8 e P9) e esta associado ao TPS2051, cortei uma parte do manual da BBB e anexei com a ligação que estou estudando.

Ae surgiu uma duvida, se eu criar um .dts com referencia deste GPIO usando o address dele e o offset correto eu conseguiria realizar isso? Alguém já fez isso ou imagina como poderia ser feito?


Abraço.
GPIO3_13BBB.png

Diego Sueiro

unread,
Jun 3, 2014, 6:49:37 AM6/3/14
to sis_emb...@googlegroups.com
Cleiton,

Já realizei essas operações de Liga/Desliga em devices USB na BBB sem problemas.
Segue um breve tutorial:

Com o lsusb identificar a porta em questão. No meu exemplo eu conectei um pendrive em um hub usb na BBB.
root@beaglebone:~# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M

Neste caso temos o bus 1, e o hub conectado na porta 1 desse bus e o pendrivre na porta 1 do hub.

Para desligar basta realizar o comando:
root@beaglebone:~# echo '1-1.1' > /sys/bus/usb/drivers/usb/unbind
ou
root@beaglebone:~# echo 0 > /sys/bus/usb/devices/1-1.1/authorized

Para ligar basta realizar o comando:
root@beaglebone:~# echo '1-1.1' > /sys/bus/usb/drivers/usb/bind
ou
root@beaglebone:~# echo 1 > /sys/bus/usb/devices/1-1.1/authorized


Note que é possível controlar cada porta independente.


Abraços,

--
*dS
Diego Sueiro

Administrador do Embarcados
www.embarcados.com.br

/*long live rock 'n roll*/


--
Você recebeu essa mensagem porque está inscrito no grupo quot;sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

Francesco

unread,
Jun 3, 2014, 6:51:22 AM6/3/14
to sis_emb...@googlegroups.com
Olá Cleiton,

Seu pensamento está correto, é por esse caminho mesmo.
Quem faz o controle da alimentação da USB é o TPS2051, e você pode controlar o liga/desliga através dele. Apenas acredito que poderia ser interessante colocar um transistor para fazer esse chaveamento, e não o GPIO da BBB diretamente no Enable do TPS.
Espero ter ajudado. Um abraço.

Francesco

Francesco

unread,
Jun 3, 2014, 6:56:21 AM6/3/14
to sis_emb...@googlegroups.com
Olá Diego,

Neste caso, você estaria ligando e desligando o módulo do dispositivo, correto?

Cleiton,

Você prefere fazer o controle da alimentação? Ou só o controle dos módulos de software resolve seu problema?

Diego Sueiro

unread,
Jun 3, 2014, 7:09:04 AM6/3/14
to sis_emb...@googlegroups.com
Francesco,

2014-06-03 7:56 GMT-03:00 Francesco <francesco...@gmail.com>:
Olá Diego,

Neste caso, você estaria ligando e desligando o módulo do dispositivo, correto?

Isso mesmo. O controle de alimentação é feito por porta conectada ao hub USB. Se no caso do nosso amigo não haja um hub externo, ele ainda consiga fazer o controle da porta. Basta saber corretamente qual é a sua identificação através do comando "lsusb -t". Exemplo:
root@beaglebone:~# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M

#desligar:
root@beaglebone:~# echo 0 > /sys/bus/usb/devices/1-1/authorized
ou
root@beaglebone:~# echo '1-1' > /sys/bus/usb/drivers/usb/unbind

#ligar:
root@beaglebone:~# echo 1 > /sys/bus/usb/devices/1-1/authorized
ou
root@beaglebone:~# echo '1-1' > /sys/bus/usb/drivers/usb/bind

Cleiton Bueno

unread,
Jun 3, 2014, 7:29:33 AM6/3/14
to sis_emb...@googlegroups.com
Bom dia e obrigado pelas respostas Diego e Francesco, muito boa essa discussão.

Então o que eu preciso é cortar a alimentação VCC da USB "temporariamente", engraçado que eu fiz dessa maneira como o Diego informou com o unbind em cima da relação bus/porta e tentei até com usb1 o device "perde" relação com o kernel não há comunicação porém eu coloquei uma pendrive e também um mouse USB e um multímetro no VCC e GND e não consegui dar esse power off na USB.

Tenho uma solução que resolve meus problemas um rele SMD mesmo, controlado por um pino do GPIO e quando precisar altero o valor desse pino e ele irá cortar e depois liberar a energia novamente, mas queria resolver via software.


Diego Sueiro

unread,
Jun 3, 2014, 7:32:52 AM6/3/14
to sis_emb...@googlegroups.com
Cleiton,

2014-06-03 8:29 GMT-03:00 Cleiton Bueno <cleiton...@gmail.com>:
Então o que eu preciso é cortar a alimentação VCC da USB "temporariamente", engraçado que eu fiz dessa maneira como o Diego informou com o unbind em cima da relação bus/porta e tentei até com usb1 o device "perde" relação com o kernel não há comunicação porém eu coloquei uma pendrive e também um mouse USB e um multímetro no VCC e GND e não consegui dar esse power off na USB.

Não tenho como afirmar categoricamente que a tensão no pino foi removida, pois não medi com um multímetro. Mas no meu caso, o pendrive que tem um led, é ligado e desligado (o led) quando realizo os comando que citei.

Cleiton Bueno

unread,
Jun 3, 2014, 7:44:01 AM6/3/14
to sis_emb...@googlegroups.com
Opa Diego, exato ocorre isso mesmo.

Eu testei com um mouse optico e um pendrive, o mouse até desliga mas vou com o multímetro e vou medir e o VCC esta la 5V, e por exemplo escrevo no bind ele volta a ligar, mas em nenhum momento o VCC desliga. Por isso fui desmontando e medir para comprovar, e até ampliar esse pedaço do documento da BBB em anexo, e ae que pensei em mudar o valor do pino GPIO3_13.

Francesco

unread,
Jun 3, 2014, 7:47:54 AM6/3/14
to sis_emb...@googlegroups.com
Pessoal, o controle da alimentação do host é feito pelo TPS2051. Ele não corta a alimentação enquanto estiver ativo, e está sempre ativo por conta de um resistor pull-down.
Não há a necessidade de um relê, basta colocar um transistor para chavear o pino 4 do U8, removendo o resistor R53.
Segue o esquema de como era e como ficará...

Cleiton Bueno

unread,
Jun 3, 2014, 7:55:29 AM6/3/14
to sis_emb...@googlegroups.com
Hum, legal Francesco. Vi pelo datasheet que no nível 0 ele ficara sempre ativo maravilha, e entendi o esquema que você mandou, porém e o pino F15 (USB1_DRVVBUS/GPIO3_13) do AM335X, se eu alterar o estado desse pino para 1 irá refletir no Pino 4 do U8 ou estou fazendo confusão?

Franklin Tellez

unread,
Jun 3, 2014, 7:57:57 AM6/3/14
to sis_emb...@googlegroups.com
Cleiton, Francisco e Pessoal,

O enable do TPS2051 é em nível alto, verifiquem na página 2 do datasheet. O TPS2041 é que é ativo em nível baixo.

Assim, não é preciso alterar a placa, teoricamente basta jogar a GPIO3_13 para 0, como o Cleiton já estava cogitando desde o princípio.



Franklin.

Francesco

unread,
Jun 3, 2014, 8:04:07 AM6/3/14
to sis_emb...@googlegroups.com
Olá Franklin,

Você tem razão, este pino já está ligado em um GPIO. Cleiton havia comentado também.
Muito provavelmente o controle desse pino já seja suficiente para controlar o liga/desliga da tensão da USB sem a necessidade de uma alteração de hardware da beagleBone. Também verifiquei que ele considera nível alto as tensões maiores que 2V, logo os 3V3 gerados peno GPIO serão suficientes.

Cleiton, tente fazer esse controle e nos diga o resultado.
Boa sorte.

Francesco

Cleiton Bueno

unread,
Jun 3, 2014, 8:08:13 AM6/3/14
to sis_emb...@googlegroups.com
Legal pessoal,obrigado pelas dicas até agora. Então eu não estou ficando louco :)

Irei realizar os testes e posto o resultado.

Cleiton Bueno

unread,
Jun 3, 2014, 9:19:50 AM6/3/14
to sis_emb...@googlegroups.com
Esta aqui pensando:

Ontem fiz um teste com GPIO109 (GPIO3_13 -> 3* 32 + 13) porém não havia exito na operação, irei testar agora no almoço esta operação que discutimos aqui nesta thread, agora a pergunta:

Como este GPIO3_13 não esta "vinculado" aos pinos do P8 e P9 eu consigo exportar ele no /sys/class/gpio/export e tratar direto com value no gpio109 que irá criar? Ou devo escrever um programa para usar o endereço base 0x44E10000, dar um open no /dev/mem com O_RDWR ae usando mmap e o file descriptor do open() mais o endereço base vou ao meu address 44e109b4 que corresponde ao USB1_DRVVBUS/GPIO3_13 e ae realizo a alteração?

Abraço.

Diego Sueiro

unread,
Jun 3, 2014, 9:30:13 AM6/3/14
to sis_emb...@googlegroups.com
Cleiton,
Independente de onde o pino esteja populado ele deve funcionar com o gpio export. A única ressalva fica em relação ao pinmux dele. Se o kernel (via dtb) o configurou para outra função, você terá que criar um overlay para configurar o pinmux para usá-lo como gpio.

Cleiton Bueno

unread,
Jun 3, 2014, 9:52:06 AM6/3/14
to sis_emb...@googlegroups.com
Hum, interessante não me atentei a isso, vou verificar.
Obrigado Diego.

Diego Sueiro

unread,
Jun 3, 2014, 9:56:22 AM6/3/14
to sis_emb...@googlegroups.com

Abraços,

--
*dS
Diego Sueiro

Administrador do Embarcados
www.embarcados.com.br

/*long live rock 'n roll*/


2014-06-03 10:52 GMT-03:00 Cleiton Bueno <cleiton...@gmail.com>:
Hum, interessante não me atentei a isso, vou verificar.
Obrigado Diego.

--

Cleiton Bueno

unread,
Jun 24, 2014, 9:33:37 AM6/24/14
to sis_emb...@googlegroups.com
Pessoal apenas repassando os resultados, poderia ter passado bem antes mas queria ter certeza ;)

O script abaixo resolve este problema:

#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin

devmem2 0x47401c60 b 0x00
sleep 1
echo "usb1" > /sys/bus/usb/drivers/usb/unbind

sleep 20
echo "usb1" > /sys/bus/usb/drivers/usb/bind
sleep 1
devmem2 0x47401c60 b 0x01

Para chegar nisso primeiro eu tive que entender o que era essa tal de dts (Device Tree para este cara) e o pinmux desse carinha, e conheci uma ferramenta da propria Texas que me ajudou:
http://www.ti.com/tool/pinmuxtool
 
E este link para o DTS:
https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/overview


Os links abaixo foram muito importantes para entender casos parecidos e os address que eu iria mexer:
http://lxr.free-electrons.com/source/arch/arm/boot/dts/am335x-evm.dts
http://e2e.ti.com/support/arm/sitara_arm/f/791/p/277952/969990.aspx
http://e2e.ti.com/support/arm/sitara_arm/f/791/t/277952.aspx


Sobre o PinMux só roda no Windows devido ao dotnet da Micro$oft, porém aproveitei o embalado no (Modo On Debug do dia) para abrir esse trem no Linux e fazer funcionar, em um PC i386 é melzinho na chupeta:

##### 32bits ######

$ wget http://software-dl.ti.com/dsps/dsps_public_sw/am_bu/ampinmux/latest/exports/PinMuxUtility_02_05_02_00.zip
$ unzip PinMuxUtility_02_05_02_00.zip

# Se já tiver o wine instalado ignore o passo abaixo, caso contrario faça-o é importante:
$ sudo apt-get update && sudo apt-get install wine1.4 wine1.4-dbg wine1.4-i386 wine winetricks

$ cd  ~/PinMuxUtility_02_05_02_00
$ winetricks dotnet20

# O passo acima ira instalar o Framework dotnet 2.0

$ wine setup.exe

$ cd ~/.wine/drive_c/Program Files/Texas Instruments/Pin Mux Utility/bin
$ wine Pin\ Mux\ Utility.exe


Agora em 64bits é um pouco mais tenso:

###### 64bits #####
$ sudo apt-get update && sudo apt-get install wine1.4 wine1.4-amd64 wine1.4-dbg wine1.4-i386 wine winetricks

# Caso já tenha o wine instalado, mova o atual e teremos que criar outro com base em arquitetura 32bits:
$ mv ~/.wine/ ~/.wineOld/

# No meu caso realizei os passos abaixo e é para funcionar para a maioria:
WINEARCH=win32 WINEPREFIX=/home/bueno/.wine/ winecfg

# O restante é igual
$ cd  ~/PinMuxUtility_02_05_02_00
$ winetricks dotnet20

$ wine setup.exe

$ cd ~/.wine/drive_c/Program Files/Texas Instruments/Pin Mux Utility/bin
$ wine Pin\ Mux\ Utility.exe



É claro que tive algumas horas de debug usando winedbg, mas funcionou em uma maquina virtual e no meu notebook, espero que ajude caso alguém precise rodar no Linux como eu.

Abraço pessoal e muito obrigado a todos que me ajudaram com as dicas.

Att,
Cleiton Bueno


Linux Counter: #557867


Caio

unread,
Jun 25, 2014, 8:09:05 AM6/25/14
to sis_emb...@googlegroups.com

Cleiton muito obrigado por compartilhar a solução! Parabéns pelo avanço.

Abs

Caio Pereira

Diego Sueiro

unread,
Jun 25, 2014, 8:35:21 AM6/25/14
to sis_emb...@googlegroups.com
Olá Cleiton,


2014-06-24 10:33 GMT-03:00 Cleiton Bueno <cleiton...@gmail.com>:
Pessoal apenas repassando os resultados, poderia ter passado bem antes mas queria ter certeza ;)

O script abaixo resolve este problema:

#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin

devmem2 0x47401c60 b 0x00

Nessa linha você está mudando diretamente o status do pino que é ligado ao PMIC?
 
sleep 1
echo "usb1" > /sys/bus/usb/drivers/usb/unbind

Se você desligou a alimentação pelo PMIC é necessário essa linha?
 

sleep 20
echo "usb1" > /sys/bus/usb/drivers/usb/bind
sleep 1
devmem2 0x47401c60 b 0x01

Nessa linha você está mudando diretamente o status do pino que é ligado ao PMIC?
Muito bom esse tutorial de como instalar o Pin Mux Utility no Linux. Eu tinha tentado antes e nã tinha conseguido.
Vou ver se agora funciona.

Muito obrigado por compartilhar.

 



É claro que tive algumas horas de debug usando winedbg, mas funcionou em uma maquina virtual e no meu notebook, espero que ajude caso alguém precise rodar no Linux como eu.

Abraço pessoal e muito obrigado a todos que me ajudaram com as dicas.

Cleiton Bueno

unread,
Jun 25, 2014, 9:53:16 AM6/25/14
to sis_emb...@googlegroups.com
Opa Diego, belezinha? Vamos la...

Em quarta-feira, 25 de junho de 2014 09h35min21s UTC-3, Diego Sueiro escreveu:
Olá Cleiton,




 
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin

devmem2 0x47401c60 b 0x00

Nessa linha você está mudando diretamente o status do pino que é ligado ao PMIC?
O PMIC da board não, que ae seria o TPS65217C certo?
A analise que eu fiz na época do TPS65217C PMIC do BBB era sobre o USB_DC no pino 12 onde ele afetava diretamente o USB0, onde esse USB-DC afeta diretamente o USB PC Connector no VBUS do TPD4S012 e não era isso que eu precisava e sim no TPD4S012 do USB HOST,e quando consegui algo com PMIC eu acabei dando um power-off na board e perdi conexão.

Porém esse estava no USB1_VBUS do AM3358BZCZ100 e ae comecei a procurar sobre endereços, dts e os device tree no kernel deles, porque eu teria que mudar o nivel desse cara para desligar o USB Host.


Não sei se entendi muito bem a duvida mas detalhei por onde passei ;)

 
 
sleep 1
echo "usb1" > /sys/bus/usb/drivers/usb/unbind

Se você desligou a alimentação pelo PMIC é necessário essa linha?
No kernel 3.12 e um outro acima não tive problemas com o Angstrom e Ubuntu default com 3.8.13 hora voltava hora não e nada era reconhecido na USB Host, então realizando esse unbind e bind funcionou perfeito no kernel 3.8, mas não tive tempo para debugar o que era, mas o devmem2 no kernel superior é suficiente.
 
Então, já que estava com a mão na massa resolvi brincar com isso, com 32bits foi de boa, com 64bits a sacada é o WINEARCH e maravilha foi tambem, qualquer problema reporta ae. :)
 
Muito obrigado por compartilhar.
Fico muito feliz em compartilhar na lista e ver o feedback do pessoal.
 
Reply all
Reply to author
Forward
0 new messages