passer un paramétre à un module kernel , version avancée Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Bonjour,
petit résumé du contexte. J'ai une nouvelle carte son USB, et pour changer sa fréquence d'chantillonage je dois passer un paramétre au chargement du module.
Je vais faire classique:
- créer un fichier dans /etc/modprobe.d/
- y mettre une ligne: options snd-usb-audio device_setup=2

Rien de bien compliqué.
Sauf que j'ai 2 carte son en usb, donc qui utilisent le même module.
comment faire pour que ce paramètre ne soit passé qu'a une des cartes ?
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Code : Tout sélectionner

modinfo -p snd-usb-audio
indique que le paramètre device_setup prend un tableau d'entiers (séparés par des virgules), donc par exemple device_setup=0,2 pour deux adaptateurs audio.
Par contre je ne sais pas comment faire pour appliquer telle valeur à tel adaptateur, peut-être en combinant avec les paramètres vid et pid rapportés par lsusb (préfixés par 0x en notation hexadécimale) s'ils sont différents pour les deux.adaptateurs.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

J'ai contacté l'auteur du module pour avoir son avis.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

j'ai fouillé dans pas mal de recoins de l'internet, mais impossible de trouver comment ajouter une condition au changement de parametre dans modprobe.conf.
Ca doit pourtant bien exister!
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

J'ai finalement demandé à chatGPT :076:
Il me dit de modifier la ligne en :

Code : Tout sélectionner

options snd-usb-audio device_setup=1 idVendor=194f, idProduct=010c  serial=<serial_number>
Je n'ai pas de quoi faire le test ce soir, je vous tiens au courant!
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

piratebab a écrit : 18 janv. 2023, 18:53 comment ajouter une condition au changement de parametre dans modprobe.conf.
Qu'est-ce que tu veux dire ?
piratebab a écrit : 18 janv. 2023, 22:07 options snd-usb-audio device_setup=1 idVendor=194f, idProduct=010c serial=<serial_number>
C'est grosso modo ce que je suggérais. Par contre il ne faut pas de virgule entre les paramètres, seulement entre les valeurs d'un paramètre de type tableau, a priori il faut préfixer les valeurs hexadécimales par 0x et je ne vois pas de paramètre "serial" pour ce module dans le noyau 5.10 de bullseye.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Bonjour Pascal, je ne cherche pas à modifier plusieurs paramètre s, mais un seul: device_setup
Par contre, je ne veux pas qu'il soit changé à chaque fois que le module est chargé, mais uniquement si il est chargé suite à la connection de la carte ayant les caractéristiques idVendor=194f, idProduct=010c, serial=XXX
Si une autre interface son USB est connectée, et que le module snd-usb-audioest chargé, le paramètre device_setup ne doit pas être changé
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Le module est chargé par udev une seule fois lors de la détection de la première interface, et pas pour chaque interface. Et les paramètres ne sont pas modifiables une fois le module chargé car tous les pseudo-fichiers dans /sys/module/snd_usb_audio/parameters sont en lecture seule. Je pense que les valeurs doivent être définies pour toutes les interfaces lors du chargement du module, du moins pour celles qui doivent avoir des valeurs spécifiques qui ne sont pas par défaut.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Merci Pascal, je comprends mieux pour j'ai trouvé des solutions via systemctl, qui lance le module en fonction de la carte connectée.
Pour si on veut connecter simultanément plusieurs cartes différentes, cela va poser problème si le même paramètre doit avoir des valeurs différentes suivant le type de carte.
Jusqu'a présent c'était un cas très hypothétique car JACK ne savait gérer qu'une carte à la fois (on pouvait contourner en agrégeant 2 cartes, mais c'est compliqué), mais avec l'arrivée de pipewire, on peut gérer simultanément plusieurs cartes
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

piratebab a écrit : 20 janv. 2023, 11:03 j'ai trouvé des solutions via systemctl, qui lance le module en fonction de la carte connectée.
Peux-tu préciser de quoi il s'agit ?
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Bonsoir pascal,
tout d'abord un tuto redhat, je ne sais pas si ça marchera sous debian
https://access.redhat.com/documentation ... le_loading

Diverses propositions pour influer le chargement d'un module via systemd
https://unix.stackexchange.com/question ... -boot-time

Comment systemd charge un module
https://www.freedesktop.org/software/sy ... oad.d.html
https://wiki.archlinux.org/title/Kernel ... e_handling

Je n'ai pas encore compris comment ça s'organise entre systemd et udev, mais j'ai compris que modalias était impliqué.

Pour revenir sur ta proposition initiale, on peut effectivement passer un tableau de valeurs au paramètre device-setup qui seront passé successivement aux diverses instances du module (une pour chaque carte son).
Malheureusement, l'ordre des paramètres est lié à l'ordre de cartes son (hw0, hw1 ..), qui lui même va dépendre de l'ordre dans lequel on connecte les cartes.
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

piratebab a écrit : 20 janv. 2023, 20:20 un tuto redhat, je ne sais pas si ça marchera sous debian
Non, /etc/sysconfig n'existe pas dans Debian, c'est spécifique à RedHat et dérivées. De toute façon ça ne fait que charger des modules au démarrage. Un équivalent approximatif traditionnel dans Debian est /etc/modules, qui est maintenant un lien symbolique pointant dans /etc/modules-load.d/ géré par systemd.
piratebab a écrit : 20 janv. 2023, 20:20 Diverses propositions pour influer le chargement d'un module via systemd
Tout ça est connu et ne répond pas spécifiquement à ta problématique de carte son USB multiple.
piratebab a écrit : 20 janv. 2023, 20:20 Je n'ai pas encore compris comment ça s'organise entre systemd et udev
Partie statique : au démarrage, systemd lance le service systemd-modules-load qui charge les modules listés dans /etc/modules-load.d/*.conf, /run/modules-load.d/*.conf
et /usr/lib/modules-load.d/*.conf avec les paramètres éventuels spécifiés.
Partie dynamique: le noyau notifie udev lors de l'ajout d'un périphérique. udev lance modprobe avec l'alias hotplug du périphérique (construit à partir de ses identifiants PCI, USB...). modprobe charge le ou les modules correspondant à cet alias. Si le module est déjà chargé, cela ne fait rien.
piratebab a écrit : 20 janv. 2023, 20:20 on peut effectivement passer un tableau de valeurs au paramètre device-setup qui seront passé successivement aux diverses instances du module (une pour chaque carte son).
Erreur conceptuelle : il n'y a qu'une seule instance du module qui gère toutes les instances de périphériques correspondants.
piratebab a écrit : 20 janv. 2023, 20:20 Malheureusement, l'ordre des paramètres est lié à l'ordre de cartes son (hw0, hw1 ..), qui lui même va dépendre de l'ordre dans lequel on connecte les cartes.
Je n'en suis pas si sûr. Si c'était le cas, à quoi serviraient les paramètres pid et vid ? Ce ne sont manifestement pas des valeurs qu'on peut affecter à un périphérique mais des caractéristiques intrinsèques d'un périphérique qui ne peuvent à mon avis servir que de critère de sélection pour appliquer les valeurs de même rang dans les autres paramètres de type tableau. Mais ce n'est pas clair.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Concernant l'ordre des paramètres et des cartes son, c'est l'info que m'a donnée par le concepteur du driver pour la carte studio 1810c.
j'ai fait un test:
- j'ai mis uniquement un paramétre (device_setup=1)
- je connecte la studio 1810C, puis la focusrite (elle se retrouvent numérotées dans cet ordre), le paramètre est bien passé à la presonus Presonus Studio 1810c, device_setup: 1
- je connecte la focusrite, puis la studio 1810c, le paramètre n'est pas passé à la studio 1810c
[ 1015.707720] usb 1-2: Presonus Studio 1810c, device_setup: 0
Je suis d'accord avec toi qu'il doit étre possible d'utiliser les valeurs de pid et vid, pour passer un paramètre de façon conditionnelle , mais je n'arrive pas à trouver des infos la dessus.
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Tu veux device_setup=1 ou 2 ? Dans ton message initial c'était 2, ensuite c'est devenu 1.

Si tu veux appliquer device_setup=1 au périphérique qui a les identifiants 194f:010c, as-tu essayé les paramètres suivants ?

Code : Tout sélectionner

device_setup=1 idVendor=0x194f idProduct=0x010c
Pour tester sans t'embêter avec la configuration de modprobe ou la ligne de commande du noyau dans un premier temps :

Code : Tout sélectionner

modprobe -r snd-usb-audio
modprobe snd-usb-audio device_setup=1 idVendor=0x194f idProduct=0x010c
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Je vais tester ça.
La valeur de device_setup pour cette carte son définie la fréquence d'échantillonage et le nombre d'entrées sorties utilisables
default: 8out/14in @ 96kHz
#1 : 8out/18in @ 48kHz
#2 : 6out/8in @ 192kHz
je suis généralement en 48kHz, mais pas toujours.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Petit test
Je connecte la carte studio 1810c, le paramètre est pris en compte.

Code : Tout sélectionner

new high-speed USB device number 7 using xhci_hcd
[  677.242717] usb 1-2: New USB device found, idVendor=194f, idProduct=010c, bcdDevice= 2.51
[  677.242719] usb 1-2: New USB device strings: Mfr=1, Product=3, SerialNumber=2
[  677.242720] usb 1-2: Product: Studio 1810c
[  677.242721] usb 1-2: Manufacturer: PreSonus
[  677.242722] usb 1-2: SerialNumber: SC8E19060141
[  677.400660] usb 1-2: Presonus Studio 1810c, device_setup: 1
[  677.400662] usb 1-2:[b] (8out/18in @ 48kHz[/b])
Mais si je connecte la focusrite, puis la studio 1810c, j'ai une erreur et le paramètre n'est pas pris en compte par la 1810c (je suis en valeur par défaut à 96 kħz au lieu de 48 kħz)
ew high-speed USB device number 5 using xhci_hcd
[ 602.623538] usb 1-9: New USB device found, idVendor=1235, idProduct=800c, bcdDevice= 2.7a
[ 602.623541] usb 1-9: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 602.623542] usb 1-9: Product: Scarlett 18i20 USB
[ 602.623543] usb 1-9: Manufacturer: Focusrite
[ 602.739529] snd_usb_audio: unknown parameter 'idVendor' ignored
[ 602.739532] snd_usb_audio: unknown parameter 'idProduct' ignored
[ 605.181009] usbcore: registered new interface driver snd-usb-audio
[ 614.435096] usb 1-2: new high-speed USB device number 6 using xhci_hcd
[ 614.583797] usb 1-2: New USB device found, idVendor=194f, idProduct=010c, bcdDevice= 2.51
[ 614.583799] usb 1-2: New USB device strings: Mfr=1, Product=3, SerialNumber=2
[ 614.583800] usb 1-2: Product: Studio 1810c
[ 614.583801] usb 1-2: Manufacturer: PreSonus
[ 614.583801] usb 1-2: SerialNumber: SC8E19060141
[ 614.746572] usb 1-2: Presonus Studio 1810c, device_setup: 0
[ 614.746574] usb 1-2: (8out/14in @ 96kHz)
PascalHambourg
Contributeur
Contributeur
Messages : 930
Inscription : 05 août 2016, 20:25
Status : Hors-ligne

Je devrais me relire avant et après avoir posté... Les noms des paramètres sont incorrects, j'ai bêtement recopié la sortie de dmesg pour récupérer les identifiant. Il fallait lire

Code : Tout sélectionner

modprobe -r snd-usb-audio
modprobe snd-usb-audio device_setup=1 vid=0x194f pid=0x010c
Accessoirement, as-tu vérifié si device_setup=1 (ou 2, selon ton besoin) avait un effet indésirable sur l'autre carte son ? S'il n'y en a pas, tu pourrais simplement mettre device_setup=1,1 (ou 2,2) pour appliquer la valeur aux deux cartes son.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

J'ai effectivement regardé rapidement l'impact, je n'en ai pas vu. Mais la focusrite est une carte complexe, je n'ai pas tout vérifié.
Je referai des tests et je te tiens au courant
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

J'étais moi aussi passé à coté du mauvais nom de paramètre.
impossible de décharger le module en cours d'utilisation

Code : Tout sélectionner

modprobe: FATAL: Module snd_usb_audio is in use
J'ai donc modifier le fichier de configuration dans modprobe.d et redémarrer (j'aurais pu simplement débrancher/rebrancher les câble USB, mais la machine est dans une piéce non chauffée :) je suis donc en ssh)
Je n'ai pas d'erreur dans la sortie de dmesg, et le papamétre est pris en compte;
Je vais tester d'autresconfiguration de carte au boot (sur cet essai, le 2 étaient branchées au boot)
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5858
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Un dev alsa vient de me répondre, il me dit que pour plusieurs cartes il faut mettre

Code : Tout sélectionner

options snd-usb-audio vid=0xXXXX,0xXXXX pid=0xXXXX,0xXXXX device_setup=1,0
mais je ne comprends pas comment assigner des valeurs différentes a device_setup pour différentes cartes connectées
Répondre