Installation du contrôleur USB DMX (OpenDMX) sur Debian Wheezy

DMX USB PC v3

DMX USB PC v3

Ça y’est ! J’ai acquis tout le matériel me permettant d’effectuer des tests de DMX pour mon projet de lumières d’ambiances dans notre future maison.
J’ai opté pour un « DMX USB PC V3 » sur eBay, 36,50 € en enchère classique.
Après utilisation avec FreeStyler sous Windows, je peux être très content de mon achat, il répond à tous mes besoins, entre autres financiers.
Je n’anime pas de soirées, je souhaite simplement entre autre éclairer mes escaliers.

Il ne reste plus qu’à l’exploiter sur ma VirtualBox.
Le petit bémol est lié à la domination du produit d’Enttec Open DMX USB qui rend les recherches difficiles, mais au final, rien ne change, c’est effectivement 100% Open DMX compatible.

Installation du driver Open DMX

Si ce n’est pas encore fait, il faut installer le nécessaire pour récupérer et compiler les sources du driver.

# apt-get install git curl build-essential

Ensuite, il nous faudrait les headers et les sources du kernel pour la compilation.

# apt-get install linux-headers-$(uname -r) linux-source

Enfin, nous récupérons les sources du driver dmx usb module.

# cd /usr/src/
# git clone git://github.com/lowlander/dmx_usb_module.git
# cd dmx_usb_module/

MISE A JOUR 26/07/2012 :
la partie ci-dessous n’est plus utile depuis que l’auteur a adapté ses sources pour les kernels en 3.x ; cependant, je ne retirer pas le détail pour les lecteurs qui utilisent – à tord – des sources non actuelles.
Avec des sources à jour, passez directement au make.

Etant sous Debian Wheezy avec un kernel 3.2.0, il est nécessaire de modifier les sources :
(vu sur le tutoriel d’Open DMX).
Sans quoi, il est possible de rencontrer cette erreur :

/usr/src/dmx_usb_module/dmx_usb.c:21:28: fatal error: linux/smp_lock.h: Aucun fichier ou dossier de ce type
compilation terminated.

Ou bien, celle-ci :

/usr/src/dmx_usb_module/dmx_usb.c:95:8: warning: type defaults to 'int' in declaration of 'DECLARE_MUTEX' [-Wimplicit-int]
/usr/src/dmx_usb_module/dmx_usb.c:95:1: warning: parameter names (without types) in function declaration [enabled by default]
/usr/src/dmx_usb_module/dmx_usb.c:123:2: error: unknown field 'ioctl' specified in initializer
/usr/src/dmx_usb_module/dmx_usb.c:123:2: warning: initialization from incompatible pointer type [enabled by default]
/usr/src/dmx_usb_module/dmx_usb.c:123:2: warning: (near initialization for 'dmx_usb_fops.aio_read') [enabled by default]
/usr/src/dmx_usb_module/dmx_usb.c: In function 'dmx_usb_open':
/usr/src/dmx_usb_module/dmx_usb.c:298:9: error: 'disconnect_sem' undeclared (first use in this function)
/usr/src/dmx_usb_module/dmx_usb.c:298:9: note: each undeclared identifier is reported only once for each function it appears in
/usr/src/dmx_usb_module/dmx_usb.c: In function 'dmx_usb_probe':
/usr/src/dmx_usb_module/dmx_usb.c:620:2: error: implicit declaration of function 'init_MUTEX' [-Werror=implicit-function-declaration]
/usr/src/dmx_usb_module/dmx_usb.c: In function 'dmx_usb_disconnect':
/usr/src/dmx_usb_module/dmx_usb.c:731:9: error: 'disconnect_sem' undeclared (first use in this function)
/usr/src/dmx_usb_module/dmx_usb.c: At top level:
/usr/src/dmx_usb_module/dmx_usb.c:95:8: warning: 'DECLARE_MUTEX' declared 'static' but never defined [-Wunused-function]

Donc c’est parti pour la chasse aux modifs…

# vi dmx_usb.c

Supprimer la ligne 21, ce qui donne :

#include <linux/module.h>
#include <linux/completion.h>

Au lieu de :

#include <linux/module.h>
#include <linux/smp_lock.h>
#include <linux/completion.h>

D’autres modifications :

/* prevent races between open() and disconnect() */
static DECLARE_MUTEX (disconnect_sem);

Devient :

/* prevent races between open() and disconnect() */
static DEFINE_SEMAPHORE(disconnect_sem);

Une autre modif,

.write =        dmx_usb_write,
.ioctl =        dmx_usb_ioctl,
.open =         dmx_usb_open,

Devient :

.write =        dmx_usb_write,
.unlocked_ioctl =	dmx_usb_ioctl,
.open =         dmx_usb_open,

Pour terminer,

init_MUTEX (&dev->sem);
dev->udev = udev;

Devient :

sema_init(&dev->sem, 1);
dev->udev = udev;

J’ai crée un patch, mais le git est régulièrement soumis à des modifications, d’où la présence du détail ci-dessus.
Voici le patch à enregistrer sous dmx_usb_patch.txt

--- dmx_usb_original.c  2012-04-20 17:13:47.508349903 +0200
+++ dmx_usb.c   2012-04-20 17:17:41.894998153 +0200
@@ -18,7 +18,6 @@
 #include
 #include
 #include
-#include
 #include
 #include
 #include
@@ -93,7 +92,7 @@

 /* prevent races between open() and disconnect() */
-static DECLARE_MUTEX (disconnect_sem);
+static DEFINE_SEMAPHORE(disconnect_sem);

 /* local function prototypes */
 //static ssize_t dmx_usb_read  (struct file *file, char *buffer, size_t count, loff_t *ppos);
@@ -121,7 +120,7 @@

        /* .read =              dmx_usb_read, */
        .write =        dmx_usb_write,
-       .ioctl =        dmx_usb_ioctl,
+       .unlocked_ioctl =   dmx_usb_ioctl,
        .open =         dmx_usb_open,
        .release =      dmx_usb_release,
 };
@@ -618,7 +617,7 @@
        }
        memset (dev, 0x00, sizeof (*dev));

-       init_MUTEX (&dev->sem);
+       sema_init(&dev->sem, 1);
        dev->udev = udev;
        dev->interface = interface;

Il s’applique ainsi :

# patch &gt; dmx_usb_patch.txt

S’il retourne autre chose que « patching file dmx_usb.c » c’est que le git a été modifié entre la rédaction de cet article et votre installation ; il ne reste plus qu’à remonter les erreurs les unes après les autres.

MISE A JOUR 26/07/2012 :
Ici prenne fin les modifications pour les kernels inférieur à 3.x

Installer le driver OpenDMX sous Ubuntu

Sous Ubuntu, vous devrez modifier le fichier dmx_usb.c pour remplacer chaque occurence de err( en pr_err( .Sans quoi, vous obtiendrez le message d’erreur suivant :

/home/quentin/Bureau/dmx_usb_module/dmx_usb.c: In function ‘dmx_usb_setup’:
/home/quentin/Bureau/dmx_usb_module/dmx_usb.c:256:3: erreur: implicit declaration of function ‘err’ [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
make[2]: *** [/home/quentin/Bureau/dmx_usb_module/dmx_usb.o] Erreur 1
make[1]: *** [_module_/home/quentin/Bureau/dmx_usb_module] Erreur 2
make[1]: quittant le répertoire « /usr/src/linux-headers-3.5.0-27-generic »
make: *** [default] Erreur 2

Merci à Quentin (cf commentaires).

Compilation

Place à la compilation et l’installation du driver :

# make
# cp dmx_usb.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial/
# depmod

Et un petit reboot pour être sûr.

Après insertion du contrôleur DMX USB PC V3 sur une prise USB, dmesg doit absolument vous retourner ceci :

/usr/src/dmx_usb_module/dmx_usb.c: DMX USB device now attached to dmx0

S’il vous est retourné ttyUSB0 au lieu de dmx0, c’est en raison de l’utilisation ftdi_sio au lieu de dmx_usb que nous venons de compiler.

La solution consisterait à décharger ftdi_sio et usbserial (rmmod ftdi_sio) mais ça serait très embêtant pour l’utilisation d’un éventuel autre adaptateur USB/serial.

Je me suis inspiré d’un article intitulé Gérer un pilote USB avec UDEV pour créer un fichier rules:

# vi /etc/udev/rules.d/99-dmx-usb.rules

Fichier rules qui contient ceci :

ATTRS{idVendor}=="0403",
ATTRS{idProduct}=="6001",
PROGRAM="/bin/sh -c 'echo -n $id:1.0 > /sys/bus/usb/drivers/ftdi_sio/unbind;  echo -n $id:1.0 > /sys/bus/usb/drivers/dmx_usb/bind'",
MODE="0666"

A noter que le contrôleur USB ce présente comme ceci :

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 002 Device 003: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
Bus 002 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

La présence du contrôleur USB/DMX n’entraîne pas de changement pour le DS9404 USB/1-Wire.

Lors de la connexion au port USB (ou au rattachement via VirtualBox dans mon cas), dmesg donne ceci :

[   43.643958] usb 2-3: new full-speed USB device number 4 using ohci_hcd
[   44.184274] usb 2-3: New USB device found, idVendor=0403, idProduct=6001
[   44.184278] usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   44.184281] usb 2-3: Product: FT232R USB UART
[   44.184283] usb 2-3: Manufacturer: FTDI
[   44.184285] usb 2-3: SerialNumber: AH014RWJ
[   44.247045] usbcore: registered new interface driver usbserial
[   44.247061] USB Serial support registered for generic
[   44.247885] usbcore: registered new interface driver usbserial_generic
[   44.248222] usbserial: USB Serial Driver core
[   44.264304] USB Serial support registered for FTDI USB Serial Device
[   44.264682] ftdi_sio 2-3:1.0: FTDI USB Serial Device converter detected
[   44.264794] usb 2-3: Detected FT232RL
[   44.264796] usb 2-3: Number of endpoints 2
[   44.264799] usb 2-3: Endpoint 1 MaxPacketSize 64
[   44.264801] usb 2-3: Endpoint 2 MaxPacketSize 64
[   44.264803] usb 2-3: Setting MaxPacketSize 64
[   44.288179] usb 2-3: FTDI USB Serial Device converter now attached to ttyUSB0
[   44.288218] usbcore: registered new interface driver ftdi_sio
[   44.288222] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
[   44.300042] usbcore: registered new interface driver dmx_usb
[   44.300044] /usr/src/dmx_usb_module/dmx_usb.c: DMX USB Driver v0.1.20101106
[   44.320269] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[   44.320311] ftdi_sio 2-3:1.0: device disconnected
[   44.363993] /usr/src/dmx_usb_module/dmx_usb.c: DMX USB device now attached to dmx0

Pour terminer cette première partie, il est nécessaire que le contrôleur Open DMX USB soit lié à /dev/dmx0 avec des droits élargis en lecture et écriture aux utilisateurs du système :

# ls -lh /dev/dmx0
crw-rw-rwT 1 root root 180, 0 avril 20 19:43 /dev/dmx0

Si ce n’est pas le cas, pas la peine d’aller plus loin, il y’a un couac quelque part, retour à la case départ.

Coté matériel, c’est maintenant terminé. Le matériel est reconnu, les modules sont chargés.

Place à l’exploitation logiciel du DMX avec l’installation de Open Lighting Architecture pour Debian Wheezy afin de contrôleur des spots RGB.

Ce billet est posté dans dmx, Open DMX. Mettre en favoris le permalien.

7 réponses à Installation du contrôleur USB DMX (OpenDMX) sur Debian Wheezy

  1. Quentin says:

    Hello, j’ai cette erreur après avoir récupérer les dernières sources avec un git clone, pour ma part et je ne trouve pas comment la corriger sous ma kubuntu 12.10 si vous avez une idée : /home/quentin/Bureau/dmx_usb_module/dmx_usb.c:256:3: erreur: implicit declaration of function ‘err’ [-Werror=implicit-function-declaration]

    quentin@quentin-AMILO-Xi-2428:~/Bureau/dmx_usb_module$ sudo make
    make -C /lib/modules/3.5.0-27-generic/build SUBDIRS=/home/quentin/Bureau/dmx_usb_module modules
    make[1]: entrant dans le répertoire « /usr/src/linux-headers-3.5.0-27-generic »
    CC [M] /home/quentin/Bureau/dmx_usb_module/dmx_usb.o
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c: In function ‘__check_debug’:
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c:63:1: attention : return from incompatible pointer type [enabled by default]
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c: In function ‘dmx_usb_setup’:
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c:256:3: erreur: implicit declaration of function ‘err’ [-Werror=implicit-function-declaration]
    cc1: some warnings being treated as errors
    make[2]: *** [/home/quentin/Bureau/dmx_usb_module/dmx_usb.o] Erreur 1
    make[1]: *** [_module_/home/quentin/Bureau/dmx_usb_module] Erreur 2
    make[1]: quittant le répertoire « /usr/src/linux-headers-3.5.0-27-generic »
    make: *** [default] Erreur 2

    Je cherche à la réoudre, merci du coup de main.
    Cordialement,

  2. Lionel says:

    Salut,

    Ca semble être un problème dans le fichier « dmx_usb.c ».
    Remplace chaque occurence de « err( » par « pr_err(« .

    Attention, il y’a des « err( » et des « err (« .
    Avec vim, ca donne :
    :%s/err (/pr_err(/g
    et
    :%s/err(/pr_err(/g

    Ou un autre outil pour rechercher & remplacer fera l’affaire.
    Ensuite, la compilation semble passer, mais je ne suis pas aller plus loin sous Ubuntu, je ne sais pas si il y a d’autres surprises.

    Je rajoute l’info dans l’article, merci pour ton feedback !

  3. Quentin says:

    Bonjour,

    Meme avec la modification c’est pareil, j’ai remplacer chaque occurrence de err( en pr_err mais toujours pareil :
    quentin@quentin-AMILO-Xi-2428:~/Bureau/dmx_usb_module$ sudo make
    [sudo] password for quentin:
    make -C /lib/modules/3.5.0-27-generic/build SUBDIRS=/home/quentin/Bureau/dmx_usb_module modules
    make[1]: entrant dans le répertoire « /usr/src/linux-headers-3.5.0-27-generic »
    CC [M] /home/quentin/Bureau/dmx_usb_module/dmx_usb.o
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c: In function ‘__check_debug’:
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c:63:1: attention : return from incompatible pointer type [enabled by default]
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c: In function ‘dmx_usb_open’:
    /home/quentin/Bureau/dmx_usb_module/dmx_usb.c:325:3: erreur: implicit declaration of function ‘err’ [-Werror=implicit-function-declaration]
    cc1: some warnings being treated as errors
    make[2]: *** [/home/quentin/Bureau/dmx_usb_module/dmx_usb.o] Erreur 1
    make[1]: *** [_module_/home/quentin/Bureau/dmx_usb_module] Erreur 2
    make[1]: quittant le répertoire « /usr/src/linux-headers-3.5.0-27-generic »
    make: *** [default] Erreur 2
    quentin@quentin-AMILO-Xi-2428:~/Bureau/dmx_usb_module$

  4. Quentin says:

    Bonjour,
    Visiblement il y a eu des corrections de faites dans cette version : https://github.com/djgreg13/dmx_usb_module/commits/dev-3.6.
    Erwin m’a donner ce lien par mail, à voir donc.

  5. Daduke says:

    Bonjour,
    un petit retout sur le driver opendmx, perso je l’ai compilé sur une beaglebone black sous ubuntu raring.
    Ça n’a pas été une partie de plaisir, mais finalement ça a marché.
    Par contre, syslog sur les rotules a cause des messages de debug (les enlever dans dmx_usb.c ça aide bien).
    Par contre avec le driver dmx_usb, j’ai pleins de soucis: beaucoup de charge et ça plante méchamment!
    Du coup je suis en train de tester le module ftdi de ola qui a pleins d’avantage: utilise les modules ftdi du noyau (pas besoin de recompiler-patcher-hacker -> moins de soucis en géneral, pas besoin de blacklister des modules ni de les gérer via udev), la charge a baissé enormément sur ma beaglebone…
    Bref que du bonheur pour l’instant.
    C’est le plugin ftdidmx, pour la config voir ici:
    http://www.opendmx.net/index.php/OLA_Device_Specific_Configuration#Open_DMX_USB_.2F_FTDI_RS485

  6. Jean says:

    Salut !
    Sauriez-vous m’expliquer pourquoi j’obtiens « DMX USB Device now attached to dmx192 » plutôt que dmx0 !? 🙁

    merci
    jean

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *