Fedora-Fr - Communauté francophone Fedora - Linux

Communauté francophone des utilisateurs de la distribution Linux Fedora.

  

Dernière news : Fedora 28 livré à l'heure

#1 14/05/2009 18:18:12

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Communiquer avec un périphérique USB sans être root

Bonjour,

Je suis en train de développer un pilote (en userspace) pour un périphérique USB (Compteur de vélo VDO Z2/Z3) pour linux, en python grâce à la lib pyusb.
Mon code fonctionne parfaitement, mais seulement en root.
En effet, pour pouvoir "ouvrir" le périphérique, envoyer des commandes et recevoir le résultat, j'ai besoin des droits root.
J'aimerai que mon appli fonctionne sans demander le mot de passe à chaque fois qu'on l'utilise mais seulement une fois, à l'installation.

Comment puis-je faire ?
Merci

Dernière modification par Difool (14/05/2009 18:18:32)

Hors ligne

#2 14/05/2009 19:35:36

nouvo09
Accro à Fedo !
Lieu : Paris
Inscription : 22/09/2005
Messages : 20 958

Re : Communiquer avec un périphérique USB sans être root

Tu as regardé du côté de HAL et de ses règles ?


C'est pas parce que c'est difficile qu'on n'ose pas,
c'est parce qu'on ose pas que c'est difficile !

Hors ligne

#3 14/05/2009 19:57:37

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Nop, j'vais jeter un oeil de ce coté.
Merci pour la piste.

Hors ligne

#4 15/05/2009 12:18:46

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Ça ne m'a pas l'air super bien documenté HAL :/
En fait, ce qu'il faudrait que je fasse, c'est donner les droits rw au « device file » correspondant au périphérique ? Y'a pas plus propre que ça ? :p
Si quelqu'un a une doc, un lien, un exemple, etc ... qui pourrait m'éclairer, je suis preneur.
Merci

Hors ligne

#5 15/05/2009 12:48:27

nouvo09
Accro à Fedo !
Lieu : Paris
Inscription : 22/09/2005
Messages : 20 958

Re : Communiquer avec un périphérique USB sans être root

A mon avis c'est LA solution propre.

Le spécialiste de la question sur le forum, c'est Liho. Essaie de lui envoyer un petit mail, alors..


C'est pas parce que c'est difficile qu'on n'ose pas,
c'est parce qu'on ose pas que c'est difficile !

Hors ligne

#6 15/05/2009 18:52:48

liho
Membre
Inscription : 10/12/2005
Messages : 2 019

Re : Communiquer avec un périphérique USB sans être root

Bonjour,

As-tu pensé au setuid ?
Un fichier exécutable avec setuid root est exécuté avec les droits root, ça me semble correspondre à ce que tu désires faire.

setuid sur wikipedia

setuid chez linux-france


Pour ce qui est de HAL, je l'utilise pour ce qui concerne le montage de périphériques (point de montage, options,...)
Dans ton cas, si j'ai bien compris, il ne s'agit pas de monter le périphérique mais de communiquer avec lui.
C'est sans doute plutôt du côté de UDEV qu'il faudrait regarder...

La première chose à faire pour créer une règle udev est de repérer le nom de device (/dev/...) que prend ton périphérique lorsque tu le branches.
Tu peux ensuite demander des infos à udev sur le périphérique, par exemple pour sdb1 :

udevinfo -a -p $(udevinfo -q path -n /dev/sdb1)

Ces informations permettront d'identifier le périph pour créer un règle udev.

Par exemple, pour une clé usb, udevinfo me retourne entre autres informations :
ATTRS{vendor}=="EMTEC   "
ATTRS{model}=="U3 Smart Drive"

Pour modifier les droits sur ce périphérique, je peux créer une règle udev que je place dans un fichier /etc/udev/rules.d/10-local.rules (que j'ai créé en root) :

ATTRS{vendor}=="EMTEC   ", ATTRS{model}=="U3 Smart Drive", SYMLINK+="ma_cle_usb_u3", MODE="0666"


Et quand je branche ma clé, je retrouve le nom "ma_cle_usb_u3" qui apparait dans /dev (c'est le "SYMLINK+="ma_cle_usb_u3"") et les droits sont rw-rw-rw comme spécifié dans la règle (MODE="0666")


Tu dois pouvoir trouver beaucoup de doc sur udev, pour ma part, j'ai créé cette règle (qui marche) à partir d'une doc ubuntu sur udev

Tiens nous au courant de ce que tu as fait (qui marche ou qui ne marche pas)

Dernière modification par liho (15/05/2009 20:32:43)


ASUS N751JX-T7015H   -   Fedora 22 x86_64   -   Gnome

Hors ligne

#7 15/05/2009 22:22:21

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Donc le retour de udevinfo :

% udevinfo -a -p /sys/devices/pci0000:00/0000:00:02.0/usb3/3-5

Udevinfo 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:02.0/usb3/3-5':
    KERNEL=="3-5"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{configuration}==""
    ATTR{bNumInterfaces}==" 1"
    ATTR{bConfigurationValue}=="1"
    ATTR{bmAttributes}=="80"
    ATTR{bMaxPower}=="100mA"
    ATTR{urbnum}=="8"
    ATTR{idVendor}=="0e6a"
    ATTR{idProduct}=="0101"
    ATTR{bcdDevice}=="0510"
    ATTR{bDeviceClass}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bNumConfigurations}=="1"
    ATTR{bMaxPacketSize0}=="8"
    ATTR{speed}=="1.5"
    ATTR{busnum}=="3"
    ATTR{devnum}=="14"
    ATTR{version}==" 1.10"
    ATTR{maxchild}=="0"
    ATTR{quirks}=="0x0"
    ATTR{authorized}=="1"
    ATTR{product}=="USB Bridge"

  looking at parent device '/devices/pci0000:00/0000:00:02.0/usb3':
    KERNELS=="usb3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="15582"
    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}=="3"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="8"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27.21-170.2.56.fc10.x86_64 ohci_hcd"
    ATTRS{product}=="OHCI Host Controller"
    ATTRS{serial}=="0000:00:02.0"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:02.0':
    KERNELS=="0000:00:02.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ohci_hcd"
    ATTRS{vendor}=="0x10de"
    ATTRS{device}=="0x03f1"
    ATTRS{subsystem_vendor}=="0x1019"
    ATTRS{subsystem_device}=="0x2601"
    ATTRS{class}=="0x0c0310"
    ATTRS{irq}=="22"
    ATTRS{local_cpus}=="00000000,00000003"
    ATTRS{local_cpulist}=="0-1"
    ATTRS{modalias}=="pci:v000010DEd000003F1sv00001019sd00002601bc0Csc03i10"
    ATTRS{numa_node}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

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

Mon /etc/udev/rules.d/10-local.rules :

# VDO USB Docking Station
BUS=="usb", ATTR{idVendor}=="0e6a", ATTR{idProduct}=="0101",SYMLINK+="vdo_docking_station", MODE="0666"

Dans /dev, j'ai :

lrwxrwxrwx  1 root root            15 mai 15 22:14 vdo_docking_station -> bus/usb/003/014

Puis :

# ll /dev/bus/usb/003/014 
crw-r--r-- 1 root vboxusers 189, 269 mai 15 22:14 /dev/bus/usb/003/014

Donc le nom a bien été changé mais pas le mode, du coup :

% python driver.py
Traceback (most recent call last):
  File "driver.py", line 145, in <module>
    DockingStation.setBaudRate(38400)
  File "driver.py", line 96, in setBaudRate
    self.handle.controlMsg(0x40,0x0C,chr(code),0x5003,0x00F0)
usb.USBError: error sending control message: Operation not permitted
zsh: exit 1     python driver.py

Et en root : it works !

J'ai oublié quelque chose ? Peut-être qu'une autre règle d'udev change le mode ? (si j'ai bien compris le fichier 10-local.rules a autorité sur les autres, vu que c'est classé par ordre alphabétique, ou alors c'est l'inverse ?)

Merci !

Hors ligne

#8 15/05/2009 22:41:42

liho
Membre
Inscription : 10/12/2005
Messages : 2 019

Re : Communiquer avec un périphérique USB sans être root

Le symlink a été créé donc la règle marche. Il y-a peut être effectivement une autre règle qui modifie les droits.

Tu peux essayer de changer le nom du fichier pour que ta règle soit appliquée en dernier, ou bien essayer d'ajouter OPTIONS+="last_rule" à la fin de ta règle :

# VDO USB Docking Station
BUS=="usb", ATTR{idVendor}=="0e6a", ATTR{idProduct}=="0101",SYMLINK+="vdo_docking_station", MODE="0666", OPTIONS+="last_rule"

si j'ai bien compris le fichier 10-local.rules a autorité sur les autres, vu que c'est classé par ordre alphabétique, ou alors c'est l'inverse ?

Il n'a pas priorité, les règles qu'il contient sont seulement appliquées en premier. Cela n'empêche pas que d'autre règles puissent s'appliquer ensuite.
L'option "last_rule" est sensée empêcher que d'autres règles s'appliquent sur le périphérique.

EDIT :
Tu peux aussi essayer d'enlever le symlink de la règle, car les droits semblent s'appliquer sur le symlink mais pas sur le device (dans mon test avec la clé usb, cela s'applique au 2), ou bien sont modifiés ensuite sur le device mais pas sur le symlink.

Dernière modification par liho (15/05/2009 23:09:47)


ASUS N751JX-T7015H   -   Fedora 22 x86_64   -   Gnome

Hors ligne

#9 15/05/2009 23:18:22

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Avec l'option last_rules, le périphérique n'est même plus trouvé.
il n'apparait plus dans lsusb et dans /dev, j'ai :

lrwxrwxrwx  1 root root             3 mai 15 23:13 vdo_docking_station -> 3-5

En revanche, ça fonctionne si je renomme le fichier /etc/udev/rules.d/10-local.rules en /etc/udev/rules.d/99-local.rules (dernier fichier de règles).

C'est bien mais pas parfait :p
Vu que je compte distribuer ça, j'aimerai que ça fonctionne quelque soit les règles existantes, donc ça va pas être simple de s'arranger pour que ça reste le dernier fichier de règles :p

En fait, j'ai un /etc/udev/rules.d/10-vboxdrv.rules (qui vient de VirtualBox) avec le contenu suivant :

KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"

Ça à l'air d'être lui qui fou la merde mais c'est à moi de m'adapter ^^

Dernière modification par Difool (15/05/2009 23:21:40)

Hors ligne

#10 15/05/2009 23:57:11

Did
Membre
Lieu : nul part
Inscription : 11/01/2005
Messages : 2 446

Re : Communiquer avec un périphérique USB sans être root

Salut,
Pour faire avancer le schmilblick, j'obtiens ceci avec le VDO Z3 (enfin, si j'ai bien compris la commande !!!) :

[root@localhost 1-2]# udevinfo -a -p /sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2

Udevinfo 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:1d.7/usb1/1-2':
    KERNEL=="1-2"                                               
    SUBSYSTEM=="usb"                                            
    DRIVER=="usb"                                               
    ATTR{configuration}==""                                     
    ATTR{bNumInterfaces}==" 1"                                  
    ATTR{bConfigurationValue}=="1"                              
    ATTR{bmAttributes}=="e0"                                    
    ATTR{bMaxPower}=="  0mA"                                    
    ATTR{urbnum}=="51"                                          
    ATTR{idVendor}=="04cc"                                      
    ATTR{idProduct}=="1521"                                     
    ATTR{bcdDevice}=="0200"                                     
    ATTR{bDeviceClass}=="09"                                    
    ATTR{bDeviceSubClass}=="00"                                 
    ATTR{bDeviceProtocol}=="01"                                 
    ATTR{bNumConfigurations}=="1"                               
    ATTR{bMaxPacketSize0}=="64"                                 
    ATTR{speed}=="480"                                          
    ATTR{busnum}=="1"                                           
    ATTR{devnum}=="3"                                           
    ATTR{version}==" 2.00"                                      
    ATTR{maxchild}=="7"                                         
    ATTR{quirks}=="0x0"                                         
    ATTR{authorized}=="1"                                       

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
    KERNELS=="usb1"                                                
    SUBSYSTEMS=="usb"                                              
    DRIVERS=="usb"                                                 
    ATTRS{configuration}==""                                       
    ATTRS{bNumInterfaces}==" 1"                                    
    ATTRS{bConfigurationValue}=="1"                                
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="45"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="8"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27.21-170.2.56.fc10.i686 ehci_hcd"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.7"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7':
    KERNELS=="0000:00:1d.7"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x27cc"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{subsystem_device}=="0x8179"
    ATTRS{class}=="0x0c0320"
    ATTRS{irq}=="20"
    ATTRS{local_cpus}=="ffffffff"
    ATTRS{local_cpulist}=="0-31"
    ATTRS{modalias}=="pci:v00008086d000027CCsv00001043sd00008179bc0Csc03i20"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

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

En relisant plus haut je pense que ceci est plus précis et correspond au VDO :

[root@localhost dev]# udevinfo -a -p $(udevinfo -q path -n /dev/usbdev1.6_ep00)

Udevinfo 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:1d.7/usb1/1-2/1-2.2/usb_endpoint/usbdev1.6_ep00':
    KERNEL=="usbdev1.6_ep00"                                                                      
    SUBSYSTEM=="usb_endpoint"                                                                     
    DRIVER==""                                                                                    
    ATTR{bLength}=="07"                                                                           
    ATTR{bEndpointAddress}=="00"                                                                  
    ATTR{bmAttributes}=="00"                                                                      
    ATTR{bInterval}=="00"                                                                         
    ATTR{wMaxPacketSize}=="0008"                                                                  
    ATTR{interval}=="0ms"                                                                         
    ATTR{type}=="Control"                                                                         
    ATTR{direction}=="both"                                                                       

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/usb_endpoint':
    KERNELS=="usb_endpoint"                                                               
    SUBSYSTEMS==""                                                                        
    DRIVERS==""                                                                           

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2':
    KERNELS=="1-2.2"                                                         
    SUBSYSTEMS=="usb"                                                        
    DRIVERS=="usb"                                                           
    ATTRS{configuration}==""                                                 
    ATTRS{bNumInterfaces}==" 1"                                              
    ATTRS{bConfigurationValue}=="1"                                          
    ATTRS{bmAttributes}=="80"                                                
    ATTRS{bMaxPower}=="100mA"                                                
    ATTRS{urbnum}=="8"                                                       
    ATTRS{idVendor}=="0e6a"                                                  
    ATTRS{idProduct}=="0101"                                                 
    ATTRS{bcdDevice}=="0510"                                                 
    ATTRS{bDeviceClass}=="00"                                                
    ATTRS{bDeviceSubClass}=="00"                                             
    ATTRS{bDeviceProtocol}=="00"                                             
    ATTRS{bNumConfigurations}=="1"                                           
    ATTRS{bMaxPacketSize0}=="8"                                              
    ATTRS{speed}=="1.5"                                                      
    ATTRS{busnum}=="1"                                                       
    ATTRS{devnum}=="6"                                                       
    ATTRS{version}==" 1.10"                                                  
    ATTRS{maxchild}=="0"                                                     
    ATTRS{quirks}=="0x0"                                                     
    ATTRS{authorized}=="1"                                                   
    ATTRS{product}=="USB Bridge"                                             

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2':
    KERNELS=="1-2"                                                     
    SUBSYSTEMS=="usb"                                                  
    DRIVERS=="usb"                                                     
    ATTRS{configuration}==""                                           
    ATTRS{bNumInterfaces}==" 1"                                        
    ATTRS{bConfigurationValue}=="1"                                    
    ATTRS{bmAttributes}=="e0"                                          
    ATTRS{bMaxPower}=="  0mA"                                          
    ATTRS{urbnum}=="76"                                                
    ATTRS{idVendor}=="04cc"                                            
    ATTRS{idProduct}=="1521"                                           
    ATTRS{bcdDevice}=="0200"                                           
    ATTRS{bDeviceClass}=="09"                                          
    ATTRS{bDeviceSubClass}=="00"                                       
    ATTRS{bDeviceProtocol}=="01"                                       
    ATTRS{bNumConfigurations}=="1"                                     
    ATTRS{bMaxPacketSize0}=="64"                                       
    ATTRS{speed}=="480"                                                
    ATTRS{busnum}=="1"                                                 
    ATTRS{devnum}=="3"                                                 
    ATTRS{version}==" 2.00"                                            
    ATTRS{maxchild}=="7"                                               
    ATTRS{quirks}=="0x0"                                               
    ATTRS{authorized}=="1"                                             

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
    KERNELS=="usb1"                                                
    SUBSYSTEMS=="usb"                                              
    DRIVERS=="usb"                                                 
    ATTRS{configuration}==""                                       
    ATTRS{bNumInterfaces}==" 1"                                    
    ATTRS{bConfigurationValue}=="1"                                
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="45"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="8"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27.21-170.2.56.fc10.i686 ehci_hcd"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.7"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7':
    KERNELS=="0000:00:1d.7"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x27cc"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{subsystem_device}=="0x8179"
    ATTRS{class}=="0x0c0320"
    ATTRS{irq}=="20"
    ATTRS{local_cpus}=="ffffffff"
    ATTRS{local_cpulist}=="0-31"
    ATTRS{modalias}=="pci:v00008086d000027CCsv00001043sd00008179bc0Csc03i20"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

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

ET ...

root@localhost dev]# udevinfo -a -p $(udevinfo -q path -n /dev/usbdev1.6_ep03)

Udevinfo 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:1d.7/usb1/1-2/1-2.2/1-2.2:1.0/usb_endpoint/usbdev1.6_ep03':
    KERNEL=="usbdev1.6_ep03"                                                                                
    SUBSYSTEM=="usb_endpoint"                                                                               
    DRIVER==""                                                                                              
    ATTR{bLength}=="07"                                                                                     
    ATTR{bEndpointAddress}=="03"                                                                            
    ATTR{bmAttributes}=="03"                                                                                
    ATTR{bInterval}=="0a"                                                                                   
    ATTR{wMaxPacketSize}=="0008"                                                                            
    ATTR{interval}=="10ms"                                                                                  
    ATTR{type}=="Interrupt"                                                                                 
    ATTR{direction}=="out"                                                                                  

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/1-2.2:1.0/usb_endpoint':
    KERNELS=="usb_endpoint"                                                                         
    SUBSYSTEMS==""                                                                                  
    DRIVERS==""                                                                                     

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/1-2.2:1.0':
    KERNELS=="1-2.2:1.0"                                                               
    SUBSYSTEMS=="usb"                                                                  
    DRIVERS==""                                                                        
    ATTRS{bInterfaceNumber}=="00"                                                      
    ATTRS{bAlternateSetting}==" 0"                                                     
    ATTRS{bNumEndpoints}=="01"                                                         
    ATTRS{bInterfaceClass}=="ff"                                                       
    ATTRS{bInterfaceSubClass}=="ff"                                                    
    ATTRS{bInterfaceProtocol}=="ff"                                                    
    ATTRS{modalias}=="usb:v0E6Ap0101d0510dc00dsc00dp00icFFiscFFipFF"                   

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2':
    KERNELS=="1-2.2"                                                         
    SUBSYSTEMS=="usb"                                                        
    DRIVERS=="usb"                                                           
    ATTRS{configuration}==""                                                 
    ATTRS{bNumInterfaces}==" 1"                                              
    ATTRS{bConfigurationValue}=="1"                                          
    ATTRS{bmAttributes}=="80"                                                
    ATTRS{bMaxPower}=="100mA"                                                
    ATTRS{urbnum}=="8"                                                       
    ATTRS{idVendor}=="0e6a"                                                  
    ATTRS{idProduct}=="0101"                                                 
    ATTRS{bcdDevice}=="0510"                                                 
    ATTRS{bDeviceClass}=="00"                                                
    ATTRS{bDeviceSubClass}=="00"                                             
    ATTRS{bDeviceProtocol}=="00"                                             
    ATTRS{bNumConfigurations}=="1"                                           
    ATTRS{bMaxPacketSize0}=="8"                                              
    ATTRS{speed}=="1.5"                                                      
    ATTRS{busnum}=="1"                                                       
    ATTRS{devnum}=="6"                                                       
    ATTRS{version}==" 1.10"                                                  
    ATTRS{maxchild}=="0"                                                     
    ATTRS{quirks}=="0x0"                                                     
    ATTRS{authorized}=="1"                                                   
    ATTRS{product}=="USB Bridge"                                             

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2':
    KERNELS=="1-2"                                                     
    SUBSYSTEMS=="usb"                                                  
    DRIVERS=="usb"                                                     
    ATTRS{configuration}==""                                           
    ATTRS{bNumInterfaces}==" 1"                                        
    ATTRS{bConfigurationValue}=="1"                                    
    ATTRS{bmAttributes}=="e0"                                          
    ATTRS{bMaxPower}=="  0mA"                                          
    ATTRS{urbnum}=="76"                                                
    ATTRS{idVendor}=="04cc"                                            
    ATTRS{idProduct}=="1521"                                           
    ATTRS{bcdDevice}=="0200"                                           
    ATTRS{bDeviceClass}=="09"                                          
    ATTRS{bDeviceSubClass}=="00"                                       
    ATTRS{bDeviceProtocol}=="01"                                       
    ATTRS{bNumConfigurations}=="1"                                     
    ATTRS{bMaxPacketSize0}=="64"                                       
    ATTRS{speed}=="480"                                                
    ATTRS{busnum}=="1"                                                 
    ATTRS{devnum}=="3"                                                 
    ATTRS{version}==" 2.00"                                            
    ATTRS{maxchild}=="7"                                               
    ATTRS{quirks}=="0x0"                                               
    ATTRS{authorized}=="1"                                             

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
    KERNELS=="usb1"                                                
    SUBSYSTEMS=="usb"                                              
    DRIVERS=="usb"                                                 
    ATTRS{configuration}==""                                       
    ATTRS{bNumInterfaces}==" 1"                                    
    ATTRS{bConfigurationValue}=="1"                                
    ATTRS{bmAttributes}=="e0"                                      
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="45"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="8"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.27.21-170.2.56.fc10.i686 ehci_hcd"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.7"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7':
    KERNELS=="0000:00:1d.7"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x27cc"
    ATTRS{subsystem_vendor}=="0x1043"
    ATTRS{subsystem_device}=="0x8179"
    ATTRS{class}=="0x0c0320"
    ATTRS{irq}=="20"
    ATTRS{local_cpus}=="ffffffff"
    ATTRS{local_cpulist}=="0-31"
    ATTRS{modalias}=="pci:v00008086d000027CCsv00001043sd00008179bc0Csc03i20"
    ATTRS{enable}=="1"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

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

Dernière modification par Did (16/05/2009 00:12:44)

Hors ligne

#11 15/05/2009 23:59:13

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

T'as pas l'air d'avoir pris le bon périphérique :p
Pour retrouver le « device file », j'ai fait :

lshal | grep -i megawin -C 10

Dernière modification par Difool (16/05/2009 00:00:16)

Hors ligne

#12 16/05/2009 00:01:15

liho
Membre
Inscription : 10/12/2005
Messages : 2 019

Re : Communiquer avec un périphérique USB sans être root

Essaye voir celle-là :

BUS=="usb", ATTR{idVendor}=="0e6a", ATTR{idProduct}=="0101", NAME="%k", SYMLINK+="vdo_docking_station", MODE:="0666"

le NAME="%k" pour assigner comme nom de device celui donné par le noyau
le MODE:="0666" (noter le := à la place du =) pour que le mode soit définitif

Extrait du man udev :

       :=
           Assign a value to a key finally; disallow any later changes, which may be used to prevent changes by any later rules.

ASUS N751JX-T7015H   -   Fedora 22 x86_64   -   Gnome

Hors ligne

#13 16/05/2009 00:08:43

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

C'est pareil qu'avec l'option last-rule.

En fait, je viens de remarquer que les droits sont bien pris en compte mais le chemin du node est changé et ça doit être ça qui pose problème.
Reste à savoir pourquoi il change ...

Hors ligne

#14 16/05/2009 00:12:36

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

\o/
Ça fonctionne avec la règle suivante dans /etc/udev/rules.d/10-local.rules :

BUS=="usb", ATTR{idVendor}=="0e6a", ATTR{idProduct}=="0101", MODE:="0666"

(j'ai viré le SYMLINK+="vdo_docking_station" qui servait surtout à repérer le node dans /dev)

Dernière modification par Difool (16/05/2009 00:14:37)

Hors ligne

#15 16/05/2009 00:14:33

Did
Membre
Lieu : nul part
Inscription : 11/01/2005
Messages : 2 446

Re : Communiquer avec un périphérique USB sans être root

Difool a écrit :

T'as pas l'air d'avoir pris le bon périphérique :p
Pour retrouver le « device file », j'ai fait :

lshal | grep -i megawin -C 10

Ha, la commande qu'il me fallait, j'avais fait par comparaison...

Je viens d'éditer ma réponse wink ... ça correspond un peu plus...

Par contre je n'ai pas de règle /etc/udev/rules.d/10-local.rules !

Pour info :

[root@localhost dev]# lshal | grep -i megawin -C 10
  usb_device.vendor = 'Philips Semiconductors'  (string)
  usb_device.vendor_id = 1228  (0x4cc)  (int)           
  usb_device.version = 2.0 (2) (double)                 

udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial'
  info.bus = 'usb_device'  (string)                             
  info.parent = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial'  (string)
  info.product = 'USB Bridge'  (string)                                              
  info.subsystem = 'usb_device'  (string)                                            
  info.udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial'  (string)    
  info.vendor = 'Megawin Technology Co., Ltd'  (string)                              
  linux.device_file = '/dev/bus/usb/001/006'  (string)                               
  linux.hotplug_type = 2  (0x2)  (int)                                               
  linux.subsystem = 'usb'  (string)                                                  
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2'  (string) 
  usb_device.bus_number = 1  (0x1)  (int)                                            
  usb_device.can_wake_up = false  (bool)                                             
  usb_device.configuration_value = 1  (0x1)  (int)                                   
  usb_device.device_class = 0  (0x0)  (int)                                          
  usb_device.device_protocol = 0  (0x0)  (int)                                       
  usb_device.device_revision_bcd = 1296  (0x510)  (int)                              
--
  usb_device.is_self_powered = false  (bool)
  usb_device.linux.device_number = 6  (0x6)  (int)
  usb_device.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2'  (string)
  usb_device.max_power = 100  (0x64)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.product = 'USB Bridge'  (string)
  usb_device.product_id = 257  (0x101)  (int)
  usb_device.speed = 1.5 (1.5) (double)
  usb_device.vendor = 'Megawin Technology Co., Ltd'  (string)
  usb_device.vendor_id = 3690  (0xe6a)  (int)
  usb_device.version = 1.1 (1.1) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial_if0'
  info.bus = 'usb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial'  (string)
  info.product = 'USB Vendor Specific Interface'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial_if0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
--
  usb.is_self_powered = false  (bool)
  usb.linux.device_number = 6  (0x6)  (int)
  usb.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/1-2.2:1.0'  (string)
  usb.max_power = 100  (0x64)  (int)
  usb.num_configurations = 1  (0x1)  (int)
  usb.num_interfaces = 1  (0x1)  (int)
  usb.num_ports = 0  (0x0)  (int)
  usb.product = 'USB Vendor Specific Interface'  (string)
  usb.product_id = 257  (0x101)  (int)
  usb.speed = 1.5 (1.5) (double)
  usb.vendor = 'Megawin Technology Co., Ltd'  (string)
  usb.vendor_id = 3690  (0xe6a)  (int)
  usb.version = 1.1 (1.1) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial_if0'
  info.bus = 'usb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial'  (string)
  info.product = 'USB Hub Interface'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial_if0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)

Dernière modification par Did (16/05/2009 00:16:48)

Hors ligne

#16 16/05/2009 00:16:39

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Did a écrit :

Par contre je n'ai pas de règle /etc/udev/rules.d/10-local.rules !

Ça c'est normal, c'est à toi de créer ce fichier.
Par contre, quand je distribuerai le pilote, ça sera à moi (enfin, au script d'installation) de le faire.

Du coup, je sais pas vraiment quelle « priorité » donner au fichier. Laisser un truc genre 10-vdo-docking-station.rules ?

Hors ligne

#17 16/05/2009 00:17:42

Did
Membre
Lieu : nul part
Inscription : 11/01/2005
Messages : 2 446

Re : Communiquer avec un périphérique USB sans être root

Ok !

Peux-tu poster ton lshal | grep -i megawin -C 10
pour comparer ?

Dernière modification par Did (16/05/2009 00:19:16)

Hors ligne

#18 16/05/2009 00:18:31

liho
Membre
Inscription : 10/12/2005
Messages : 2 019

Re : Communiquer avec un périphérique USB sans être root

Par contre je n'ai pas de règle /etc/udev/rules.d/10-local.rules !

C'est pas un règle, c'est un fichier contenant des règles.
Il n'existe pas il faut le créer en root (comme je l'ai dis dans un des messages précédents...j'en vois qui suivent pas au fond de la classe lol )

EDIT :
Les messages fusent dans cette discussion.

Dernière modification par liho (16/05/2009 00:21:15)


ASUS N751JX-T7015H   -   Fedora 22 x86_64   -   Gnome

Hors ligne

#19 16/05/2009 00:19:48

Did
Membre
Lieu : nul part
Inscription : 11/01/2005
Messages : 2 446

Re : Communiquer avec un périphérique USB sans être root

Ca va un peu vite en ce moment smile

Hors ligne

#20 16/05/2009 00:22:02

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Did a écrit :

Ok !

Peux-tu poster ton lshal | grep -i megawin -C 10
pour comparer ?

Si tu veux :

% lshal | grep -i megawin -C 10
  usb.vendor = 'Linux Foundation'  (string)
  usb.vendor_id = 7531  (0x1d6b)  (int)
  usb.version = 1.1 (1.1) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial'
  info.bus = 'usb_device'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_1d6b_1_0000_00_02_0'  (string)
  info.product = 'USB Bridge'  (string)
  info.subsystem = 'usb_device'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_e6a_101_noserial'  (string)
  info.vendor = 'Megawin Technology Co., Ltd'  (string)
  linux.device_file = '/dev/bus/usb/003/028'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  linux.subsystem = 'usb'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:02.0/usb3/3-5'  (string)
  usb_device.bus_number = 3  (0x3)  (int)
  usb_device.can_wake_up = false  (bool)
  usb_device.configuration_value = 1  (0x1)  (int)
  usb_device.device_class = 0  (0x0)  (int)
  usb_device.device_protocol = 0  (0x0)  (int)
  usb_device.device_revision_bcd = 1296  (0x510)  (int)
--
  usb_device.is_self_powered = false  (bool)
  usb_device.linux.device_number = 28  (0x1c)  (int)
  usb_device.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:02.0/usb3/3-5'  (string)
  usb_device.max_power = 100  (0x64)  (int)
  usb_device.num_configurations = 1  (0x1)  (int)
  usb_device.num_interfaces = 1  (0x1)  (int)
  usb_device.num_ports = 0  (0x0)  (int)
  usb_device.product = 'USB Bridge'  (string)
  usb_device.product_id = 257  (0x101)  (int)
  usb_device.speed = 1.5 (1.5) (double)
  usb_device.vendor = 'Megawin Technology Co., Ltd'  (string)
  usb_device.vendor_id = 3690  (0xe6a)  (int)
  usb_device.version = 1.1 (1.1) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_46d_c50e_noserial'
  battery.charge_level.current = 7  (0x7)  (int)
  battery.charge_level.design = 7  (0x7)  (int)
  battery.charge_level.last_full = 7  (0x7)  (int)
  battery.charge_level.percentage = 100  (0x64)  (int)
  battery.command_interface = 'csr'  (string)
  battery.csr.has_res = false  (bool)

Hors ligne

#21 16/05/2009 00:29:04

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

Y'a donc pas de règle particulière pour le nom du fichier de règle ? :x

En tout cas, merci à vous trois ;)

Hors ligne

#22 16/05/2009 00:40:54

liho
Membre
Inscription : 10/12/2005
Messages : 2 019

Re : Communiquer avec un périphérique USB sans être root

En fait, les règles de udev sont dans /lib/udev/rules.d (en particulier le fichier 50-udev-default.rules)

Les règles dans /etc/udev/rules.d sont les règles "utilisateur" (à noter que si 2 fichiers de même nom se trouvent dans /lib/udev/rules.d et dans /etc/udev/rules.d, c'est le fichier dans /etc/udev/rules.d qui est utilisé.

Les fichiers sont de la forme xxxx.rules et sont lus dans l'ordre alphabétique, le nom xxxx est libre mais détermine l'ordre d'application des règles.


ASUS N751JX-T7015H   -   Fedora 22 x86_64   -   Gnome

Hors ligne

#23 16/05/2009 00:56:08

Did
Membre
Lieu : nul part
Inscription : 11/01/2005
Messages : 2 446

Re : Communiquer avec un périphérique USB sans être root

A part les adresses matérielles, je ne vois pas beaucoup de différences entre nos 2 fichiers, MAIS le fait que je branche le Z3 sur un Hub USB me donne ceci en plus :

--
  usb.is_self_powered = false  (bool)
  usb.linux.device_number = 6  (0x6)  (int)
  usb.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.2/1-2.2:1.0'  (string)
  usb.max_power = 100  (0x64)  (int)
  usb.num_configurations = 1  (0x1)  (int)
  usb.num_interfaces = 1  (0x1)  (int)
  usb.num_ports = 0  (0x0)  (int)
  usb.product = 'USB Vendor Specific Interface'  (string)
  usb.product_id = 257  (0x101)  (int)
  usb.speed = 1.5 (1.5) (double)
  usb.vendor = 'Megawin Technology Co., Ltd'  (string)
  usb.vendor_id = 3690  (0xe6a)  (int)
  usb.version = 1.1 (1.1) (double)

udi = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial_if0'
  info.bus = 'usb'  (string)
  info.parent = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial'  (string)
  info.product = 'USB Hub Interface'  (string)
  info.subsystem = 'usb'  (string)
  info.udi = '/org/freedesktop/Hal/devices/usb_device_4cc_1521_noserial_if0'  (string)
  linux.hotplug_type = 2  (0x2)  (int)

Hors ligne

#24 16/05/2009 01:05:26

Difool
Membre
Lieu : Hocquélus (80)
Inscription : 08/02/2007
Messages : 374
Site Web

Re : Communiquer avec un périphérique USB sans être root

@Did : La station d'amarrage est la même, que ce soit pour le Z2 ou le Z3 (ça minimise les coûts pour le fabricant, de toute façon) ;)
@liho : oké, va donc pour un 10-vdo-docking-station.rules ;)

Encore merci !

Hors ligne

Pied de page des forums