Питание USB и ethernet портов

Здравствуйте! Возникла необходимость полностью отключить usb и ethernet порты.
https://wirenboard.com/wiki/index.php/Питание_USB-портов - это читал, но там только один USB порт отключается. Есть ли возможность отключить оба USB порта программно.
И так же с входом Etnernet, можно ли отключить их питание?
Пытался отключить стандартными средствами Linux
echo “0” > “/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms”
echo “auto” > “/sys/bus/usb/devices/usbX/power/control”
а так же

echo “0” > “/sys/bus/usb/devices/2-1/power/autosuspend_delay_ms”
echo “auto” > “/sys/bus/usb/devices/2-1/power/control”

echo “0” > “/sys/bus/usb/devices/1-1/autosuspend_delay_ms”
echo “auto” > “/sys/bus/usb/devices/1-1r/control”

Соответственно USB2 отключается, а USb1 нет.
Подскажите решение проблемы, пожалуйста.

Добрый день!

  1. У вас WB6 ?
  2. Зачем вы хотите отключать USB и Ethernet порты?
  3. как вы проверяете, что порт отключается?

autosuspend и control работать не будет в общем случае, правильно отключать именно через hubpower. Оно это делает вполне стандартными средствами Linux, просто эти стандартные средства недоступны через sysfs, а работают через ioctl.

1 Like

Да, WB6.
Есть необходимость ограничить доступ к устройству.
Проверяю флешкой со светодиодиком, если горит, значит порт включен, если не горит, значит выключен:)
hub power позволяет отключать все порты? В Вашей инструкции на вики пишется, что отключить можно только второй порт и wifi, как я могу отключить первый usb порт

root@wirenboard:~# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M
__ |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
____ |__ Port 1: Dev 3, If 0, Class=Wireless, Driver=btusb, 480M
____ |__ Port 1: Dev 3, If 1, Class=Wireless, Driver=btusb, 480M
____ |__ Port 1: Dev 3, If 2, Class=Vendor Specific Class, Driver=rtl8723bu, 480M
____ |__ Port 4: Dev 5, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M
root@wirenboard:~# hubpower 2:2 power 4 off
Port 4 status: 0000 Power-Off

Bus 2 Dev 2 Port 4 , hubpower отключил питание порта, но когда я подключаю свое устройство к usb 1

/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
__ |__ Port 1: Dev 3, If 0, Class=Wireless, Driver=btusb, 480M
____ |__ Port 1: Dev 3, If 1, Class=Wireless, Driver=btusb, 480M
____ |__ Port 1: Dev 3, If 2, Class=Vendor Specific Class, Driver=rtl8723bu, 480M
____ |__ Port 4: Dev 5, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M
__ |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=ch341, 12M

и использую

root@wirenboard:~# hubpower 1:1 power 1 off
Port 1 status: 0003 Power-Off Enabled Connected

ничего не происходит, питание не пропадает с первого порта

ну тогда возможно снимать питание - не самый хороший способ. Если кто-то воткнёт флешку с внешним питанием (ну например переносной жёсткий диск, или телефон в режиме эмуляции флешки) - то оно определится системой.

Правильно тут тогда именно отключать порты. Вам это надо делать в рантайме, т.е. иметь возможность включать и выключать порты? Или достаточно отключить насовсем?

1 Like

С Возможностью включить по требованию.

Предусмотрено ли отключение портов?

я думаю, что лучше всего отключать порты программно. Это можно сделать, например, через devicetree и механизм изменения его в рантайме, который есть в Wiren Board.
Работает это так:

  1. Создаёте файл devicetree-оверлея
root@wirenboard-AMZF3H42:~# cat usb-disable.dtso 
/ {
	fragment_usb1_off {
		target = <&usbotg1>;
		__overlay__ {
			status = "disabled";
		};
	};
};
  1. Применяете оверлей, чтобы отключить порт
wb-hwconf-helper load-overlay usb-disable.dtso
  1. Отменяете оверлей, чтобы включить порт обратно
wb-hwconf-helper unload-overlay usb-disable.dtso

Метки устройств (как usbotg1) брать отсюда: https://github.com/contactless/linux/blob/dev/v4.9.x/arch/arm/boot/dts/imx6ul-wirenboard61.dts и далее отсюда https://github.com/contactless/linux/blob/dev/v4.9.x/arch/arm/boot/dts/imx6ull.dtsi

также их можно найти в sysfs и в /proc/device-tree на запущенной системе

1 Like