Forum Linux.gentoo Problème avec des règles udev

Posté par  . Licence CC By‑SA.
Étiquettes :
1
2
sept.
2014

Bonjour,

J'ai 2 adaptateurs differents pour manette console vers usb

looking at device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:0E8F:1006.000A/input/input26/js0':
KERNEL=="js0"
SUBSYSTEM=="input"
DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:0E8F:1006.000A/input/input26':
KERNELS=="input26"
SUBSYSTEMS=="input"
DRIVERS==""
ATTRS{name}=="HuiJia USB GamePad"
ATTRS{phys}=="usb-0000:00:1a.0-1.2/input0"
ATTRS{uniq}==""
ATTRS{properties}=="0"

looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:0E8F:1006.000A':
KERNELS=="0003:0E8F:1006.000A"
SUBSYSTEMS=="hid"
DRIVERS=="hid-generic"

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

looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2':
KERNELS=="1-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="1.2"
ATTRS{idVendor}=="0e8f"
ATTRS{speed}=="1.5"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{busnum}=="1"
ATTRS{devnum}=="6"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="300mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0110"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 1.10"
ATTRS{urbnum}=="13"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="HuiJia "
ATTRS{removable}=="removable"
ATTRS{idProduct}=="1006"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="USB GamePad"

looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="1"
ATTRS{idVendor}=="8087"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="6"
ATTRS{bcdDevice}=="0000"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="115"
ATTRS{ltm_capable}=="no"
ATTRS{removable}=="fixed"
ATTRS{idProduct}=="0024"
ATTRS{bDeviceClass}=="09"

looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="2"
ATTRS{bcdDevice}=="0314"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:1a.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="24"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 3.14.14-gentoo ehci_hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="EHCI Host Controller"

looking at parent device '/devices/pci0000:00/0000:00:1a.0':
KERNELS=="0000:00:1a.0"
SUBSYSTEMS=="pci"
DRIVERS=="ehci-pci"
ATTRS{irq}=="16"
ATTRS{subsystem_vendor}=="0x1043"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0320"
ATTRS{companion}==""
ATTRS{enabled}=="1"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{dma_mask_bits}=="32"
ATTRS{local_cpus}=="ff"
ATTRS{device}=="0x1c2d"
ATTRS{uframe_periodic_max}=="100"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0-7"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x844d"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"

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

Et

looking at device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2/2-1/2-1:1.0/0003:0E8F:3010.000B/input/input30/js2':
KERNEL=="js2"
SUBSYSTEM=="input"
DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2/2-1/2-1:1.0/0003:0E8F:3010.000B/input/input30':
KERNELS=="input30"
SUBSYSTEMS=="input"
DRIVERS==""
ATTRS{name}=="HuiJia USB GamePad"
ATTRS{phys}=="usb-0000:03:00.0-1/input0"
ATTRS{uniq}==""
ATTRS{properties}=="0"

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2/2-1/2-1:1.0/0003:0E8F:3010.000B':
KERNELS=="0003:0E8F:3010.000B"
SUBSYSTEMS=="hid"
DRIVERS=="hid-generic"

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2/2-1/2-1:1.0':
KERNELS=="2-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usbhid"
ATTRS{bInterfaceClass}=="03"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bNumEndpoints}=="01"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2/2-1':
KERNELS=="2-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="1"
ATTRS{idVendor}=="0e8f"
ATTRS{speed}=="1.5"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{busnum}=="2"
ATTRS{devnum}=="2"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="300mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0111"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 1.10"
ATTRS{urbnum}=="12"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="HuiJia "
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="3010"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="USB GamePad"

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/usb2':
KERNELS=="usb2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="2"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="2"
ATTRS{bcdDevice}=="0314"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:03:00.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="27"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 3.14.14-gentoo xhci_hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="xHCI Host Controller"

looking at parent device '/devices/pci0000:00/0000:00:1c.1/0000:03:00.0':
KERNELS=="0000:03:00.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{irq}=="17"
ATTRS{subsystem_vendor}=="0x1043"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{enabled}=="1"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="ff"
ATTRS{device}=="0x0194"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0-7"
ATTRS{vendor}=="0x1033"
ATTRS{subsystem_device}=="0x8413"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"

looking at parent device '/devices/pci0000:00/0000:00:1c.1':
KERNELS=="0000:00:1c.1"
SUBSYSTEMS=="pci"
DRIVERS=="pcieport"
ATTRS{irq}=="17"
ATTRS{subsystem_vendor}=="0x1043"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x060400"
ATTRS{enabled}=="2"
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{dma_mask_bits}=="32"
ATTRS{local_cpus}=="ff"
ATTRS{device}=="0x1c12"
ATTRS{msi_bus}=="1"
ATTRS{local_cpulist}=="0-7"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x844d"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="0"

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

Les 2 ont pour ATTRS{name} "HuiJia USB GamePad", j'aimerai qu'ils portent 2 noms différents (ATTRS{name} semble être la concaténation de ATTRS{manufacturer} et ATTRS{product}).

Après lecture de la doc udev, je pensais que quelque chose comme çà fonctionnerait :

KERNEL=="js*", SUBSYSTEM=="input", ATTRS{idVendor}=="0e8f", ATTRS{idProduct}=="3010", ATTRS{product}="USB GamePad SS"
KERNEL=="js*", SUBSYSTEM=="input", ATTRS{idVendor}=="0e8f", ATTRS{idProduct}=="1006", ATTRS{product}="USB GamePad PS"

Malheureusement, ni ATTRS{product} ni ATTRS{name} ne semblent être modifiés, quelqu'un sait-il où est mon erreur ?

  • # tu peux pas

    Posté par  . Évalué à 3.

    apparemment ce n'est pas prevu par udev

    ici : http://unix.stackexchange.com/questions/119593/is-there-a-way-to-change-device-names-in-dev-directory

    la personne lance un programme pour faire le montage dans un dossier qui porte le nom qui l'interesse,

    au mieux tu pourras t'inspirer de ce qui est fait pour les cartes reseaux :
    http://www.debianhelp.co.uk/udev.htm

    ou tu va utiliser les attrs du peripherique pour trouver lequel est connecté,
    puis lui changer son "NAME" qui sera alors /dev/MONDEVICE plutot que /dev/eth0 (par exemple)

    • [^] # Re: tu peux pas

      Posté par  . Évalué à 2. Dernière modification le 02 septembre 2014 à 14:09.

      Oui, je suis dedans aussi. Les attributs sont ceux qui sont renvoyés par le noyau et qui se trouvent dans /sys, ils servent à faire des comparaisons, qui va ensuite permettre une affectation, qui va elle impacter dans /dev.

      On peut utiliser soit NAME="blabla" pour créer un fichier /dev/blabla, ou mieux : SYMLINK+="blabla", pour créer un lien symbolique /dev/blabla qui pointe vers le nom original (créé automatiquement par udev).

  • # pas sûr qu'on peut pas

    Posté par  . Évalué à 1.

    Je ne cherche pas à renommer le device, çà ne présenterai aucun interet dans mon cas, les liens évoqués concernent justement le renommage des devices dans /dev (par exemple si je voulais renommer js0 en toto1). Là je cherche juste à modifier la chaine de caractères dans un attribut, ce qui semble possible (j'ai vu des gens modifier ces attributs dans d'autres topics). A noter que les valeurs des attributs ne sont pas définis par le noyau (j'ai déjà cherché dans les sources), si quelqu'un sait où le système va les chercher (et si ce n'est pas dans l'eprom de l'adaptateur), çà peut m'interesser.

    • [^] # Re: pas sûr qu'on peut pas

      Posté par  . Évalué à 2.

      J’ai du mal à voir à quoi ça peut bien servir, mais dans tous les cas, man 7 udev est formel :

      The following keys can get values assigned:

      (pas de ATTRS)

      ATTR{key}

      Du coup, essayez de matcher le device parent, plutôt que le device fils, changez l’ATTR, et il se pourrait que ça fonctionne.

      Je propose un truc du genre :

      SUBSYSTEM=="usb", ATTR{idVendor}=="0e8f", ATTR{idProduct}=="3010", ATTR{product}="USB GamePad SS"

      Voilà. Sur le papier ça doit être ok.

  • # la règle est bonne, mais...

    Posté par  . Évalué à 1.

    La règle est bonne, mais d'après udevadm test, le fichier product n'est pas modifiable, et quand je le rend modifiable à coup de chmod et que je tente un echo "test" > product, il me retourne une erreur d'entrée/sortie, donc effectivement impossible d'après vous ?

    • [^] # Re: la règle est bonne, mais...

      Posté par  . Évalué à 1.

      https://www.kernel.org/doc/Documentation/filesystems/sysfs.txt

      En particulier :

      Attributes
      ~~~~~~~~~~

      Attributes can be exported for kobjects in the form of regular files in
      the filesystem. Sysfs forwards file I/O operations to methods defined
      for the attributes, providing a means to read and write kernel
      attributes.

      Attributes should be ASCII text files, preferably with only one value
      per file. It is noted that it may not be efficient to contain only one
      value per file, so it is socially acceptable to express an array of
      values of the same type.

      Mixing types, expressing multiple lines of data, and doing fancy
      formatting of data is heavily frowned upon. Doing these things may get
      you publicly humiliated and your code rewritten without notice.

      An attribute definition is simply:

      struct attribute {
      char * name;
      struct module *owner;
      umode_t mode;
      };

      int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
      void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);

      A bare attribute contains no means to read or write the value of the
      attribute. Subsystems are encouraged to define their own attribute
      structure and wrapper functions for adding and removing attributes for
      a specific object type.

      For example, the driver model defines struct device_attribute like:

      struct device_attribute {
      struct attribute attr;
      ssize_t (*show)(struct device *dev, struct device_attribute *attr,
      char *buf);
      ssize_t (*store)(struct device *dev, struct device_attribute *attr,
      const char *buf, size_t count);
      };

      int device_create_file(struct device *, const struct device_attribute *);
      void device_remove_file(struct device *, const struct device_attribute *);

      It also defines this helper for defining device attributes:

      #define DEVICE_ATTR(name, mode, _show, _store) \
      struct device
      attribute dev
      attr_##_name = __ATTR(_name, _mode, _show, _store)

      For example, declaring

      static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo);

      is equivalent to doing:

      static struct device_attribute dev_attr_foo = {
      .attr = {
      .name = "foo",
      .mode = S_IWUSR | S_IRUGO,
      },
      .show = show_foo,
      .store = store_foo,
      };

      C’est donc bien le noyau qui exporte les données. Ceci dit il est possible qu’il y ait aussi une ou des bases de données pour renseigner les info (c’est le cas des lspci&co), mais de ce que j’ai compris ça n’est pas lié à udev.

      • [^] # Re: la règle est bonne, mais...

        Posté par  . Évalué à 1. Dernière modification le 03 septembre 2014 à 19:30.

        En fait udev utilise des bases de données de ce genre, hwids que ça s’appelle (sous Gentoo), mais je n’y comprends pas grand chose.

        • [^] # Re: la règle est bonne, mais...

          Posté par  . Évalué à 2.

          doit y avoir aussi lspciid et lsusbid

          qui renseignent les noms des peripheriques par rapport aux ids

      • [^] # Re: la règle est bonne, mais...

        Posté par  . Évalué à 1. Dernière modification le 04 septembre 2014 à 01:41.

        Je me rends compte que j’ai été expéditif. Je programme un peu, mais je n’ai jamais rien fait qui soit lié de près ou de loin au noyau. Ceci dit, si je comprends bien, à première vue umode_t mode permet de définir les droits des fichiers du sysfs en écriture–lecture, dans la doc que j’ai cité ils donnent en exemple les flags S_IWUSR (écriture pour l’utilisateur j’imagine) et S_IRUGO (lecture pour l’utilisateur et le groupe et les autres itou).

        Quand qu’il soit ce sont les auteurs des pilotes du noyau qui définissent les attributs disponibles dans le sysfs et les droits rattachés, au moins partiellement. Alors je vous souhaite bon courage s’il faut vous plonger dans tout ça. Peut-être vaudrait-il mieux interroger votre besoin de changer ces attributs.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.