How to turn off the USB power to my mouse, when I suspend the notebook?

6,182

Solution 1

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 in `cat $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

Solution 2

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

Share:
6,182

Related videos on Youtube

tokam
Author by

tokam

Updated on September 18, 2022

Comments

  • tokam
    tokam over 1 year

    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
    
    • TheWanderer
      TheWanderer over 7 years
      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.
    • tokam
      tokam over 7 years
      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. hamwaves.com/usb.autosuspend/en askubuntu.com/questions/80638/…
    • TheWanderer
      TheWanderer over 7 years
      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.
    • tokam
      tokam over 7 years
      My BIOS unfortunately does not support such an option.
    • user.dz
      user.dz over 7 years
      @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: dell.com/support/article/ro/ro/robsdt1/SLN155147/EN (lightning bolt icon)
    • tokam
      tokam over 7 years
      It is a lenovo G550. No energy icon is displayed next to the USB slot.
    • WinEunuuchs2Unix
      WinEunuuchs2Unix over 7 years
      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.
    • tokam
      tokam over 7 years
      With the laptop I'd rather wake the computer up, but lifting the lid up again.
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 7 years
    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.
  • tokam
    tokam over 7 years
    I have file save as too, using Ubuntu Mate.
  • Elder Geek
    Elder Geek over 7 years
    @WinEunuuchs2Unix Interesting. It doesn't appear to exist on a fresh install. Perhaps this is the basis for a new question....
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 7 years
    @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.
  • tokam
    tokam over 7 years
    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
    tokam over 7 years
    If I unplug and replug the mouse into the same usb plug, the id does not stay constant
  • Elder Geek
    Elder Geek over 7 years
    @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.
  • tokam
    tokam over 7 years
    What is Occams razor? With the mouse in the usb directly the id changes.
  • Elder Geek
    Elder Geek over 7 years
    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 : en.wikipedia.org/wiki/Occam%27s_razor
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 7 years
    @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.
  • tokam
    tokam over 7 years
    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.
  • Elder Geek
    Elder Geek over 7 years
    @tokam No worries, I updated the answer to take into consideration the new information you provided
  • tokam
    tokam over 7 years
    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
    tokam over 7 years
    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
    tokam over 7 years
    Maybe this brings us somehow further: unix.stackexchange.com/questions/66901/…
  • tokam
    tokam over 7 years
    I added lsusb -t
  • Elder Geek
    Elder Geek over 7 years
    updated answer.
  • tokam
    tokam over 7 years
    Can I test the script somehow before actually suspending the notebook with an non dynamic echo command?
  • tokam
    tokam over 7 years
    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
    tokam over 7 years
    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
    tokam over 7 years
    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
    tokam over 7 years
    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)
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 7 years
    @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!
  • Elder Geek
    Elder Geek over 7 years
    Does your mouse have a battery in it?
  • tokam
    tokam over 7 years
    It turns the laser of the mouse off but not the LED
  • WinEunuuchs2Unix
    WinEunuuchs2Unix over 7 years
    On a website someone suggested a little piece of black tape over the led.
  • Adeerlike
    Adeerlike over 3 years
    solved for 20.04 as well