Desativar energia USB para régua de energia controlada por USB

5

Eu tenho uma régua de energia controlada por USB que tem uma única porta USB.

Se meu computador estiver ligado e conectado via USB à régua de energia, a régua de energia fornecerá eletricidade a todos os soquetes. Eu quero programaticamente desativar a energia para a porta usb no computador que está conectado à régua de energia.

Isso não funciona:

$ echo suspend > /sys/bus/usb/devices/usb*/power/level
-bash: echo: write error: Invalid argument

Existe alguma outra maneira de fazer isso? Eu gostaria de poder me conectar ao meu servidor de outro lugar e desligar a energia de todos os dispositivos conectados aos soquetes de energia.

    
por axel22 16.05.2011 / 20:46

6 respostas

6

A régua de energia faz qualquer coisa além de ler o + 5V que uma porta USB conectada oferece? (Você vê algo em dmesg quando você o anexa? A saída de lsusb muda depois de conectá-lo?) Se não, o kernel pode nem mesmo reconhecer que algo está anexado. Você não pode dizer a um dispositivo para suspender se ele nunca se enumera: ele nunca apareceria em / sys / bus / usb / devices, e com USB você suspende dispositivos, não portas.

Além disso, de Documentation/usb/power-management.txt :

 power/control

            This file contains one of two words: "on" or "auto".
            You can write those words to the file to change the
            device's setting.

            "on" means that the device should be resumed and
            autosuspend is not allowed.  (Of course, system
            suspends are still allowed.)

            "auto" is the normal state in which the kernel is
            allowed to autosuspend and autoresume the device.

            (In kernels up to 2.6.32, you could also specify
            "suspend", meaning that the device should remain
            suspended and autoresume was not allowed.  This
            setting is no longer supported.)

Então, de acordo com a última pequena declaração, se você tem um kernel mais novo que o 2.6.32, parece que você não pode forçar um dispositivo USB a suspender de qualquer maneira.

Desculpe por não poder lhe dar a resposta que você realmente queria, o que você estava tentando fazer parece muito legal, mas espero que tenha sido útil.

    
por 16.05.2011 / 22:25
4
# To enforce suspend immediately when device is unused:
echo -n "0" >$DEV_POWER_PATH"/power/autosuspend_delay_ms"
echo -n "auto" >$DEV_POWER_PATH"/power/control"
# Make the device was not used
rmmod drv_name # see result of lsmod

# Power on: 
echo -n "2000" >$DEV_POWER_PATH"/power/autosuspend_delay_ms"
echo -n "on" >$DEV_POWER_PATH"/power/control"
# Make the device was used.
modprobe drv_name
    
por 20.06.2011 / 20:50
1

Eu tive o mesmo problema do meu lado. um ls -al mostrou que apenas o root tem acesso de gravação

-rw-r--r-- 1 root root 4.0K May  8 10:27 level

Então eu tentei fazer o mesmo comando com o sudo mas eu ainda tinha o mesmo erro

A única maneira que encontrei para fazer isso foi fazer um chmod nesse arquivo e depois escrever nele. Além disso. No meu lado controle e autosuspend_delay_ms não foi suficiente. Eu tive que desvinculá-lo para poder realmente suspendê-lo.

sudo chmod 777 /sys/bus/usb/devices/2-1.7/power/control
sudo chmod 777 /sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms
sudo chmod 777 /sys/bus/usb/drivers/usb/unbind
echo "auto" > "/sys/bus/usb/devices/2-1.7/power/control"
echo "0" > "/sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms"
echo -n "2-1.7" > /sys/bus/usb/drivers/usb/unbind
    
por 08.05.2014 / 04:33
1

Obrigado Patrice pela sua solução, que funcionou para mim. O único problema que tive foi que não consegui descobrir como reiniciar o dispositivo! Tentando apenas reverter o processo com

echo "on" > "/sys/bus/usb/devices/2-1.7/power/control"
echo "2000" > "/sys/bus/usb/devices/2-1.7/power/autosuspend_delay_ms"
echo -n "2-1.7" > /sys/bus/usb/drivers/usb/bind

não funcionou. Finalmente, a única coisa que consegui fazer foi redefinir todo o barramento USB usando o ioctl do código C (fd, USBDEVFS_RESET, 0) e isso parece forçá-lo a reiniciar. Isso é feito compilando o código encontrado aqui (ou seja, com gcc usbreset.c -o usbreset) e executando-o no barramento # 2 neste caso.

usbreset /dev/bus/usb/002/001

Ao fazer isso, todos os dispositivos no barramento 2 parecem voltar com o conjunto de propriedades padrão.

    
por 14.09.2014 / 16:56
1

Por que não usar um hub e a energia para esse hub, o hub não terá seu próprio powerbrick conectado. Desde que se comporte como um dispositivo de acordo com um dos postes acima, deve ser possível desligar o hub.

Mas eu estaria cansado de realmente (acidentalmente) ter qualquer coisa USB como em qualquer outra porta alimentada pela fita, porque eles não serão adequadamente desmontados.

Pode ser útil desativar a energia do computador que está desligando o filtro de linha. Mas agora eu não consigo pensar em um bom cenário.

    
por 01.01.2015 / 01:19
0

como sobre isso:

for i in /sys/bus/usb/devices/usb* ; do echo "suspend" > $i/power/level; done

Para fins de depuração, você pode adicionar um "echo $ i" em algum lugar para informar quais dispositivos estão sendo atingidos.

    
por 16.05.2011 / 21:51