22

The LED light of my mouse gets on my nerves when sleeping. I usually close my notebook in the evening and Ubuntu calls pm-suspend. Anyways, the USB plug is still served with power. I could even charge my smartphone. This is bad for me for two reasons. I have to unplug my mouse and the notebook battery pack [akku] lasts less. Is there a way to automatically power off my USB device, or all USB devices, when the notebook goes into suspend mode?

How to configure it?

EDIT: As requested in the comments, I add this information: I am using a Lenovo G550.

EDIT: As requested here my lsusb output

Bus 002 Device 019: ID 1058:25a3 Western Digital Technologies, Inc. 
Bus 002 Device 017: ID 1b1a:7001  
Bus 002 Device 009: ID 2109:2812 VIA Labs, Inc. VL812 Hub
Bus 002 Device 008: ID 2109:2812 VIA Labs, Inc. VL812 Hub
Bus 002 Device 003: ID 0402:5608 ALi Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

EDIT: I think this information also leads to the answer.

root@localhost:/sys/bus/usb/devices# ls -al
insgesamt 0
drwxr-xr-x 2 root root 0 Okt  6 10:56 .
drwxr-xr-x 4 root root 0 Okt  6 10:56 ..
lrwxrwxrwx 1 root root 0 Okt  6 10:56 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.7/usb1/1-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-3 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-3
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-3:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-3:1.1 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3:1.1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.1 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.1/2-5.1:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.1.2 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.1/2-5.1.2
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.1.2:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.1/2-5.1.2/2-5.1.2:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.1.2:1.1 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.1/2-5.1.2/2-5.1.2:1.1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.2 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.2
lrwxrwxrwx 1 root root 0 Okt  6 10:56 2-5.2:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5.2/2-5.2:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 3-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.0/usb3/3-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 4-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.1/usb4/4-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 5-0:1.0 -> ../../../devices/pci0000:00/0000:00:1a.2/usb5/5-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 6-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6/6-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 6-1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6/6-1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 6-1:1.0 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 6-1:1.1 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 6-1:1.2 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.2
lrwxrwxrwx 1 root root 0 Okt  6 10:56 7-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.1/usb7/7-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 8-0:1.0 -> ../../../devices/pci0000:00/0000:00:1d.2/usb8/8-0:1.0
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb1 -> ../../../devices/pci0000:00/0000:00:1a.7/usb1
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb2 -> ../../../devices/pci0000:00/0000:00:1d.7/usb2
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb3 -> ../../../devices/pci0000:00/0000:00:1a.0/usb3
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb4 -> ../../../devices/pci0000:00/0000:00:1a.1/usb4
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb5 -> ../../../devices/pci0000:00/0000:00:1a.2/usb5
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb6 -> ../../../devices/pci0000:00/0000:00:1d.0/usb6
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb7 -> ../../../devices/pci0000:00/0000:00:1d.1/usb7
lrwxrwxrwx 1 root root 0 Okt  6 10:56 usb8 -> ../../../devices/pci0000:00/0000:00:1d.2/usb8

EDIT:

tokam@localhost:~$ lsusb -t
/:  Bus 08.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 2, If 2, Class=Human Interface Device, Driver=usbhid, 12M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
    |__ Port 3: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 3: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 5: Dev 51, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 52, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 2: Dev 54, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 2: Dev 54, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 2: Dev 53, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
Carolus
  • 587
tokam
  • 317
  • 2
  • 14
  • 8
    I don't think this sleep charge feature is something to do with Ubuntu. Windows and Ubuntu do it for me on my laptop. Instead, there should be a setting in BIOS to turn off power to the USB ports during sleep. – TheWanderer Sep 10 '16 at 13:52
  • 1
    Are you sure? Google showed me some information for the keyword "usb suspend ubuntu". But I am not yet 100% sure how to do it right.

    http://hamwaves.com/usb.autosuspend/en/

    http://askubuntu.com/questions/80638/how-to-disable-auto-power-off-of-usb-devices-like-usb-mouse

    – tokam Sep 10 '16 at 14:19
  • 1
    Well you can disable them, but that's while Ubuntu itself is running. If you want to make scripts to run before the laptop sleeps to suspend the ports, it's possible, but it's going to be easier to at least check your BIOS settings for that option. – TheWanderer Sep 10 '16 at 14:21
  • 1
    My BIOS unfortunately does not support such an option. – tokam Sep 12 '16 at 10:05
  • 1
    @tokam, could you [edit] question and add the brand and model of the laptop? Also could you confirm that it is not a USB power-share port as explained here: http://www.dell.com/support/article/ro/ro/robsdt1/SLN155147/EN (lightning bolt icon) – user.dz Sep 27 '16 at 10:53
  • 1
    It is a lenovo G550. No energy icon is displayed next to the USB slot. – tokam Sep 27 '16 at 11:25
  • 1
    I'll look into this later, but keep in mind most people want to use the mouse to wake the computer up from sleep. Laptops are a minority who mostly do not want this feature enabled when the lid is closed. If selecting suspend from a menu, then the option of waking on keyboard or mouse is probably desired on Laptops just like desktops. – WinEunuuchs2Unix Sep 27 '16 at 11:42
  • With the laptop I'd rather wake the computer up, but lifting the lid up again. – tokam Sep 27 '16 at 15:01

3 Answers3

7

The current stumbling block with OP links, follow up comments and proposed answers is the product ID is static 1b1a:7001 but the Bus and Device numbers keep changing.

The solution

Create a script (any name you want) in the directory /etc/pm/sleep.d/ and place the following in it:

#!/bin/bash
ZeroBUS=$(lsusb | grep 1b1a:7001 | cut -c  5-7 )

Strip leading zeros

BUS=$(echo $ZeroBUS | sed 's/^0*//')

Build "usbX" usb number

USB=usb$BUS

case $1 in suspend|suspend_hybrid|hibernate) echo "Powering off: " $USB echo $USB | sudo tee /sys/bus/usb/drivers/usb/unbind ;; resume|thaw) # No need to do anything here, kernel unsuspends USB devices # Show how to power on for interest sake but since device is # powered off the usb number will be blank. echo "Powering on: " $USB echo $USB | sudo tee /sys/bus/usb/drivers/usb/bind ;; esac

Mark the file as executable with sudo chmod +x file_name where "file_name" is the name you chose.

The explanation

This solution powers off the entire USB hub which in my case meant phone, wireless mouse, wireless keyboard, etc. When calling the script from terminal prompt the sudo password needs to be entered. Hopefully when called from systemd sudo powers are inherited. I could not test this though because I don't have a wired mouse. Therefore additional refinement may be necessary for sudo powers.

The power isn't physically cut when the BIOS is providing constant 5V power supply, rather the devices on the bus are told to turn themselves off. In my case the wireless keyboard and mouse stopped working and had to resort to laptop keyboard and touchpad to return power back on.

You can test this manually by calling the script and passing the parameters "suspend". Passing the parameter "resume" accomplishes nothing because the device is powered off it has no device ID to turn it back on.


Easier solution power off all USB ports

I recently ran into a problem where an unknown port was preventing laptop from suspending. I found this solution (credit in code) which I modified.

Create the file /lib/systemd/system-sleep/custom-xhci_hcd using sudo powers and insert this code:

#!/bin/bash

Original script was using /bin/sh but shellcheck reporting warnings.

NAME: custom-xhci_hcd

PATH: /lib/systemd/system-sleep

CALL: Called from SystemD automatically

DESC: Suspend broken for USB3.0 as of Oct 25/2018 various kernels all at once

DATE: Oct 28 2018.

NOTE: From comment #61 at: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/522998

TMPLIST=/tmp/xhci-dev-list

Original script was: case "${1}" in hibernate|suspend)

case $1/$2 in pre/) echo "$0: Going to $2..." echo -n '' > $TMPLIST for i in `ls /sys/bus/pci/drivers/xhci_hcd/ | egrep '[0-9a-z]+:[0-9a-z]+:.$'; do # Unbind xhci_hcd for first device XXXX:XX:XX.X: echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/unbind echo "$i" >> $TMPLIST done ;; post/*) echo "$0: Waking up from $2..." for i incat $TMPLIST`; do # Bind xhci_hcd for first device XXXX:XX:XX.X: echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/bind done rm $TMPLIST ;; esac

  • Can I test the script somehow before actually suspending the notebook with an non dynamic echo command? – tokam Oct 16 '16 at 07:41
  • you were able to successfully isolate the bus and device which is also shown in lsusb, but as you pointed out the directory does not exist, as shown in the question, the directories have a different structure than ${BUS}-${DEVICE}, and I am not sure if even with knowing which one is the right one the suspending works – tokam Oct 16 '16 at 07:43
  • A test in which I unplugged and replugged the mouse helped to identify the folder. But look at the output of the next test: Keine Berechtigung means: no permission

    root@localhost:~# echo suspend > /sys/bus/usb/devices/2-5.1.2:1.1/power/level -bash: /sys/bus/usb/devices/2-5.1.2:1.1/power/level: Keine Berechtigung

    – tokam Oct 16 '16 at 07:47
  • The mouse has an LED at thouse outside and a laser at the bottom. With a combination of both answers provided, I was able to turn the laser of the mouse off, but not the LED, which adds light no my sleeping environment. Maybe we can not turn the LED off by the Kernel? I tested it on an isolated USB Plug for the mouse. – tokam Oct 16 '16 at 07:58
  • @tokam After a lot of research and testing I finally got it to work on my system manually but do not have your mouse to test it. Hopefully it works! – WinEunuuchs2Unix Oct 16 '16 at 13:57
  • It turns the laser of the mouse off but not the LED – tokam Oct 17 '16 at 13:14
  • On a website someone suggested a little piece of black tape over the led. – WinEunuuchs2Unix Oct 17 '16 at 15:03
  • solved for 20.04 as well – Adeerlike Feb 02 '21 at 20:28
5

Find the bus and device # of your mouse by issuing the command lsusb (with and without it plugged in) you want the one that's only there when it's plugged in. Make a note of the numbers. In your case they appear to be 6 and 6

issue the command sudo cp /etc/pm/sleep.d/novatel_3g_suspend /etc/pm/sleep.d/mouse_suspend (we have to do this because gedit no longer has a Save As option when launched as superuser that I can find.)

issue the command gksu gedit /etc/pm/sleep.d/mouse_suspend Change the Bus and Device numbers to match the ones you took note of earlier. Save the resulting file. It will be executed when you suspend your laptop.

In your case you should change BUS=X and DEVICE=Y to the Bus and Device numbers that match the mouse in question. This will work until you move the device to a different port in which case you will have to locate the device again and adjust the file accordingly.

BUS=X
DEVICE=Y

if [ ! -x /sys/bus/usb/devices/${BUS}-${DEVICE}/power/level ]; then
    exit 0
fi

case $1 in
     suspend|suspend_hybrid|hibernate)
    echo suspend > /sys/bus/usb/devices/${BUS}-${DEVICE}/power/level
        ;;
     resume|thaw)
    # No need to do anything here, kernel unsuspends USB devices
    :
        ;;
esac

The comments in the file (lines beginning with #) are irrelevant and can be safely ignored.

Note: I tested this via Suspend on a desktop and it worked as advertised. I do not have access to the same hardware you have but I had to resume the system via the power button so I'm fairly certain this will work for you.

Edit based on comments and expansion of question:

It appears that this is the info you need to proceed: Bus 006 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver

Elder Geek
  • 36,023
  • 25
  • 98
  • 183
  • In my gedit Ubuntu 16.04 vanilla upgrade from 14.04 there is a Save as option under the File menu. Something must have happened to your configuration??? PS good answer, I'll try it later. – WinEunuuchs2Unix Sep 28 '16 at 11:44
  • I have file save as too, using Ubuntu Mate. – tokam Sep 29 '16 at 10:34
  • @WinEunuuchs2Unix Interesting. It doesn't appear to exist on a fresh install. Perhaps this is the basis for a new question.... – Elder Geek Sep 29 '16 at 14:26
  • @ElderGeek An update on Save As if I type gedit I get the entire top line menu of "File Edit View Search Tools Documents Help" but if I type gksu gedit the menu list doesn't appear. HTH. – WinEunuuchs2Unix Oct 01 '16 at 17:22
  • I edited the file like this: BUS=2 DEVICE=12 As this appears to be my mouse: Bus 002 Device 012: ID 1b1a:7001

    But the blue LED of the mouse is still turned on. The mouse is connected via an USB-Hub. But the hub get's it's entire energy from the notebook.

    – tokam Oct 04 '16 at 14:47
  • If I unplug and replug the mouse into the same usb plug, the id does not stay constant – tokam Oct 04 '16 at 14:49
  • @tokam I suggest using Occams razor by eliminating the hub as the source of confusion and plugging the mouse directly into a system USB port to see if you get the results I did. – Elder Geek Oct 04 '16 at 14:53
  • What is Occams razor? With the mouse in the usb directly the id changes. – tokam Oct 04 '16 at 14:57
  • Edit to include the new ID as described in my answer. Oh Occams razor? I always considered it to mean reducing the problem to the minimum number of variables that exhibit the same result, but : https://en.wikipedia.org/wiki/Occam%27s_razor – Elder Geek Oct 04 '16 at 15:01
  • 1
    @tokam Can you update your question with output from lsusb -t and lsusb with all your devices plugged in as you normally use them day-to-day. That might help us visualize the hub and what not. – WinEunuuchs2Unix Oct 04 '16 at 23:05
  • I updated it. @ElderGeek: Sorry for not having assigned the bounty on time. I hope you will somehow receive it after the issue is solved. – tokam Oct 05 '16 at 20:53
  • @tokam No worries, I updated the answer to take into consideration the new information you provided – Elder Geek Oct 05 '16 at 21:27
  • I think 6.6 is the keyboard receiver and this is the mouse: Bus 002 Device 017: ID 1b1a:7001

    At 2.17

    I tried it before with your answer, but it did not work. It also did not work without the usb hub. Because it seems as if the id and the bus changes frequently (when changig the ubs plug, we should modify the script (after we got it working once) in a way that it detects the bus and teh device by the unique device id.

    Is there a way to test your script without having to suspend the notebook? Maybe it gets us closer if we can suspend and unsuspend the mouse just via command line?

    – tokam Oct 06 '16 at 08:53
  • The 2-5 folders depend on my usb hub. If I nether the less try to write suspend into the level file some instance tells me that I passed an invalid argument. I did it while my computer was not suspended – tokam Oct 06 '16 at 09:06
  • Maybe this brings us somehow further: https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name – tokam Oct 11 '16 at 12:42
  • I added lsusb -t – tokam Oct 13 '16 at 10:18
  • updated answer. – Elder Geek Oct 13 '16 at 14:42
  • The suspending of the laser bellow the mouse works with this. But not the suspension of the led of the mouse (even when not plugged into the usb hub) – tokam Oct 16 '16 at 10:59
  • Does your mouse have a battery in it? – Elder Geek Oct 16 '16 at 14:24
0

i ended up doing a slight edit to @WinEunuuchs2Unix's script

case $1 in
    find_port)  
        ZeroBUS=$(lsusb | grep $2 | cut -c  5-7 )
        # Strip leading zeros
        BUS=$(echo $ZeroBUS | sed 's/^0*//')
    if [ -z "$BUS" ]; then
           echo "port not found"
           exit 1
    fi

    # Build "usbX" usb number
    USB=usb$BUS
    echo "port found:" $USB $2
    ;;
off)
    echo "Powering off: " $2
    echo $2 | sudo tee /sys/bus/usb/drivers/usb/unbind
    ;;
on)
    echo "Powering on: " $2
    echo $2 | sudo tee /sys/bus/usb/drivers/usb/bind
    ;;

esac```

SnIcK
  • 1