Mostrando las entradas con la etiqueta usb. Mostrar todas las entradas
Mostrando las entradas con la etiqueta usb. Mostrar todas las entradas

domingo, 20 de febrero de 2022

Preventing keyboard and mouse from waking up suspended computer

 Scenario

Laptop computer, Linux environment, external keyboard, monitor and mouse connected.

After suspension an insignificant movement wakes up the system. Sometimes mices have high resolution, so a very minor movement wakes up the laptop

ACPI

The first solution I found was via ACPI setup, but ditn't like it.

mabeett@nowhere:~$ cat /proc/acpi/wakeup
Device	S-state	  Status   Sysfs node
GLAN	  S4	*disabled
XHC	  S3	*enabled   pci:0000:00:14.0
XDCI	  S4	*disabled
HDAS	  S4	*disabled  pci:0000:00:1f.3
mabeett@nowhere:~$

udev device tailored made

So, again, udev might be my friend. The quick-fast way is generating rule for the device as mentioned in arch wiki.

mabeett@nowhere:~$ lsusb -v   | egrep -i  'Leno|mouse|keyb'
Bus 001 Device 007: ID 17ef:608d Lenovo 
  idVendor           0x17ef Lenovo
      bInterfaceProtocol      2 Mouse
Bus 001 Device 005: ID 17ef:6099 Lenovo 
  idVendor           0x17ef Lenovo
      bInterfaceProtocol      1 Keyboard

mabeett@nowhere:~$ cat 50-non-power-on-mouse.rules 
## mouse 
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="17ef", ATTR{idProduct}=="608d", ATTR{power/wakeup}="disabled"
# keyboard
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="17ef", ATTR{idProduct}=="6099", ATTR{power/wakeup}="disabled"

But I don't like it since I might change keyboard/mouse and with the change I should add a new rule. Then, I explored.

udev for HID devices

Forgetting the path for the device:

mabeett@nowhere:~$ dmesg  | grep Lenovo |  grep -i mouse | grep -P  "usb.+?:"
[    2.873048] usb 1-3.3: Product: Lenovo USB Optical Mouse
[    2.879777] input: PixArt Lenovo USB Optical Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14
[    2.888588] hid-generic 0003:17EF:608D.0005: input,hidraw4: USB HID v1.11 Mouse [PixArt Lenovo USB Optical Mouse] on usb-0000:00:14.0-3.3/input0
mabeett@nowhere:~$ 

There it is a path for exploring dev with udevadm info -a -p ${PATH}

mabeett@nowhere:~$ udevadm info -a -p /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005/input/input14':
    KERNEL=="input14"
    SUBSYSTEM=="input"
    DRIVER==""
    ATTR{properties}=="0"
    ATTR{uniq}==""
    ATTR{name}=="PixArt Lenovo USB Optical Mouse"
    ATTR{inhibited}=="0"
    ATTR{phys}=="usb-0000:00:14.0-3.3/input0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/0003:17EF:608D.0005':
    KERNELS=="0003:17EF:608D.0005"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"
    ATTRS{country}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0':
    KERNELS=="1-3.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{authorized}=="1"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3':
    KERNELS=="1-3.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{idProduct}=="608d"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{quirks}=="0x0"
    ATTRS{speed}=="1.5"
    ATTRS{removable}=="unknown"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{bcdDevice}=="0100"
    ATTRS{urbnum}=="42757"
    ATTRS{version}==" 2.00"
    ATTRS{busnum}=="1"
    ATTRS{authorized}=="1"
    ATTRS{product}=="Lenovo USB Optical Mouse"
    ATTRS{devpath}=="3.3"
    ATTRS{devnum}=="7"
    ATTRS{idVendor}=="17ef"
    ATTRS{bmAttributes}=="a0"
    ATTRS{maxchild}=="0"
    ATTRS{manufacturer}=="PixArt"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{rx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{configuration}==""
    ATTRS{bDeviceProtocol}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
    KERNELS=="1-3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
   [...]

The device
/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0
indicates being detected as USB-HID device (
DRIVERS=="usbhid"
), but the path with the
power/wakeup
path is one level up:
/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3'
The approach is to invoke ../ in the attribute:
mabeett@nowhere:~$ cat /etc/udev/rules.d/52-non-power-on-hid.rules
# Disables USB HID devices (as mouse/keyboard) wakeup from suspend

ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usbhid", TAG+="usb_hid_donot_wakeup"
ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usbhid", ATTR{../power/wakeup}="disabled"
With this rule any HID connnected device will be disabled for wakeup.
The tag is going to be used for debugging porpouses.
I may see all the mathched/confugured devices at /run interface
mabeett@nowhere:~$ ls /run/udev/tags/usb_hid_donot_wakeup/
+usb:1-3.3:1.0

References

lunes, 11 de abril de 2011

Linux: udev para varios dispositivos USB

Las computadoras de escritorio relativamente nuevas y notebooks no traen puerto paralelo. Así que una de las maneras de solucionarlo es usando una placa pci-paralelo o un adaptador USB.
El escenario y problema
Tengo a CUPS con dos impresoras conectadas al USB, una vía un adaptador a paralelo y la otra es una chorro de tinta que ya es USB. La corro de tinta es Hewlett Packard y el backend para cups es hplib así que la URI es algo como hp:/usb/DeskJet_840C?serial=NumeroDeSerie la referencia es absoluta al aparato, solucionado. Pero con el adaptador se usa el backend parallel, la URI es parallel:/dev/usblp0 y ahí empieza el problema: la HP también tiene un archivo en /dev/usblpN, y a veces le toca un N=0 y otras N=1
Implementación
La encontré con udev. En el directorio /etc/udev/rules.d/ se agregan las reglas locales para renombrar los dispositivos o crear enlaces simbólicos.
Para poder encontar algunos datos que permitan individualizar al periférico:
matias@melezca:~$ udevadm info -q path -n /dev/usblp1
/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1

matias@melezca:~$ udevadm info -a -p /devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0/usb/lp1':
KERNEL=="lp1"
SUBSYSTEM=="usb"
DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4/4-5/4-5:1.0':
KERNELS=="4-5:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usblp"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 1"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="07"
ATTRS{bInterfaceSubClass}=="01"
ATTRS{bInterfaceProtocol}=="02"
ATTRS{modalias}=="usb:v067Bp2305d0200dc00dsc00dp00ic07isc01ip02"
ATTRS{supports_autosuspend}=="1"

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4/4-5':
KERNELS=="4-5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="19"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2305"
ATTRS{bcdDevice}=="0200"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{speed}=="12"
ATTRS{busnum}=="4"
ATTRS{devnum}=="3"
ATTRS{version}==" 1.00"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{product}=="IEEE-1284 Controller"

looking at parent device '/devices/pci0000:00/0000:00:12.0/usb4':
KERNELS=="usb4"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="55"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="4"
ATTRS{devnum}=="1"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="5"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.32-30-generic ohci_hcd"
ATTRS{product}=="OHCI Host Controller"
ATTRS{serial}=="0000:00:12.0"
ATTRS{authorized_default}=="1"

looking at parent device '/devices/pci0000:00/0000:00:12.0':
KERNELS=="0000:00:12.0"
SUBSYSTEMS=="pci"
DRIVERS=="ohci_hcd"
ATTRS{vendor}=="0x1002"
ATTRS{device}=="0x4397"
ATTRS{subsystem_vendor}=="0x1002"
ATTRS{subsystem_device}=="0x4397"
ATTRS{class}=="0x0c0310"
ATTRS{irq}=="18"
ATTRS{local_cpus}=="00000000,0000000f"
ATTRS{local_cpulist}=="0-3"
ATTRS{modalias}=="pci:v00001002d00004397sv00001002sd00004397bc0Csc03i10"
ATTRS{numa_node}=="0"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""

matias@melezca:~$
Con esa información es suficiente para generar un archivo de reglas locales con esta información:
matias@melezca:~$ cat /etc/udev/rules.d/80-melezca.rules
# Creado 20110410
# Adaptador puerto paralelo para que tenga un symlink y lo tome siempre con el mismo nombre cups
SUBSYSTEM=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2305", ATTRS{bcdDevice}=="0200", SYMLINK+="usb2Parallel"
matias@melezca:~$
No elegí renombrar porque no tiene mucho sentido forzar un nombre.
El backend para la impresora queda como:
DeviceURI parallel:/dev/usb2Parallel
Y problema solucionado.
Observaciones (?)
Con udev alcanzaría para individualizar cualquier dispositivo y usar una referencia fija.
Es vital para varios dispositicos con el mismo rol en puerto USB
Referencias
http://en.wikipedia.org/wiki/Udev
http://www.reactivated.net/writing_udev_rules.html