Forum Linux.noyau driver cx82xx et infrarouge (IR)

Posté par  (site web personnel) .
Étiquettes : aucune
0
17
avr.
2006
Bonjour,

J'ai une carte TV avec un périphérique infrarouge associé une télécommande. Le problème c'est que certains bouttons de cette télécommande ne répondent pas.

En ragardant les sources du noyau, j'ai l'impression que les codes reçus par le périphérique infrarouge sont transformés en des évènnemebts clavier ... sauf qu'il semble manquer des touches ... dans le fichier drivers/media/common/ir-common.c

Cela me fait poser plusieurs questions ...

- Pourquoi les codes télécommande sont-ils codés en dur dans le noyau ? Il est a mon avis indispensable de pouvoir les modifier sans recompiler (si on change de télécommande par exemple).

- Comment faire pour que mes touches soient prises en compte ? m'amuser avec /sys/module/cx88xx/parameters/ir_debug et dmesg ? Solution qui a l'avantage de pouvoir modifier les associations facilement.
Ou modifier le kernel en modifiant quelques fichiers ? Solution qui me déplaît le plus, car manque de souplesse.

- Où pourrais-je poser des questions ? sur la mailing list du kernel ?

Il me semble que lirc permettait de configurer tout cela simplement, et aussi de pouvoir faire beaucoup plus de choses inté&ressantes (utiliser la téélécommanbde comme une souris, notament). Mais le problème c'est que l'installation n'est pas aisée et je n'ai pas encore réussi a le faire fonctionner le module :( peut être que deux modules cherchant a utiliser le même périphérique, ca ne marche pas bien ...

Merci
  • # Idem

    Posté par  (site web personnel) . Évalué à 3.

    Je suis passés par les meme questions que toi mais la difference c'est que j'ai trouvé tout seul :)
    Donc
    Je vais commencer par la fin apres le debut puis le milieu (je sais je suis tordu)
    Donc dire que lirc configurer tout simplement franchement j'ai essayé de le faire marcher longtemps avant de.......abandonner!
    Les touches codées en dur?
    Ben voui c'est la vie ils savent pas trop comment faire autrement, si t'as une idée propose!
    Enfin bon il est excessivement facile de rajouter des touches (par cotrne faut rajouter un printk ou le decommenter je sais plus pour savoir à quel code la touche correspond), vu la structure.

    Pour surveiller les evenements c'est avec un /dev/input qui correspond
    Voici un code d'exemple
    #define __KERNEL_STRICT_NAMES
    #define _GNU_SOURCE
    #include <linux/input.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>

    int main() {
    int pid;
    struct input_event evenement;
    /*
    for(pid=0;pid>=0;pid++) {
    char *path;
    asprintf(&path, "/dev/input/event%d", pid);
    printf("%s\n", path);
    int fd=open(path, O_RDONLY);
    if(fd<0) {
    perror("Open input device");
    return -1;
    }
    char *buf=malloc(512);
    ioctl(fd, EVIOCGNAME(512), buf);
    printf("%s\n", buf);
    close(fd);
    free(path);
    free(buf);
    }*/
    int fd=open("/dev/input/event4", O_RDONLY);
    ioctl(fd, EVIOCGRAB, 1);
    while(1) {
    read(fd, &evenement, sizeof(evenement));
    switch(evenement.code) {
    default:
    printf("time (s): %d\ntype: %d\ncode: %d\nvalue: %d\n", evenement.time.tv_sec,
    evenement.type,
    evenement.code,
    evenement.value);
    break;
    }
    }
    return 0;
    }

    Le code en commentaire permet de detecter les devices qui existent et de donner leur nom (c'est aussi possible par /sys mais c'est moins drole :)
    Apres on a le open bon ben lui c'est pas compliqué (faut peut être changer le device). Le ioctl qui n'est pas obligatoire permet de verouiller le périphérique, càd qu'il n'est utilisé par personne d'autre et qu'il n'emule plus un clavier (comme ca on peut utiliser la telecommande sans se faire chier avec une appli en arriere plan pendant qu'on fait autre chose sur une appli devant)
    Et finalement dans le switch evenement.code on fait les cases pour les différentes touches (les define sont dans /usr/include/linux/input.h, regarde dans cx88-ir.c (de mémoire) pour connaitre les codes qu'il renvoie (et aussi pour en ajouter/les corriger))

    Voila je crois que j'ai rien oublié
    Ah si quand meme pour lirc si t'y tiens vraiment tu prends le driver devinput pour pouvoir etre compatible avec le driver la
    • [^] # Re: Idem

      Posté par  (site web personnel) . Évalué à 2.

      Merci pour ton code, je pense qu'il a de grandes chances de m'être utile :) J'avais déja regardé du coté de /dev/input et /sys/class/input, c'est input6 et event0 chez moi :) (dmesg)

      Par contre, pour l'instant, lirc a un avantage énorme par rapport au module cx88xx ... on peut configurer les touches de la télécommande :)
      Car quand même, la carte utilisée ne permet en aucun cas de dire quelle télécommande se trouve derrière.
      Et je dois dire que recompiler mon kernel, je n'ai pas trop envie ... surtout que je devrais le refaire pour chaque version du kernel .... :(
      • [^] # Re: Idem

        Posté par  (site web personnel) . Évalué à 2.

        Bah tu fais un patch, comme c'est pas un code qui bouge beaucoup ca devrait passer à chaque fois comme une lettre à la poste
        Sinon si tu veux pouvoir changer de telecommande tu peux mettre pour que toutes les touches renvoient ce code meme, et comme ca tu peux changer la map de la telecommande du côté de ton appli user land
        Mais bon c'est bof quand même, enfin les gouts les couleurs
        • [^] # Re: Idem

          Posté par  (site web personnel) . Évalué à 2.

          Oui, mais pour le coup des touches qui renvoient le même code ... c'est possible de le spécifier comme une option à un module quelconque ou alors il faut que je modifie le kernel ... en faisant un patch qui ne risque pas d'être accepté ? Enfin, voici le patch ... il faudrait que je l'envoie sur la ml du kernel ?
          --- ir-common.c.old	2006-03-02 22:18:37.000000000 +0100
          +++ ir-common.c	2006-04-17 19:28:44.000000000 +0200
          @@ -95,23 +95,45 @@
           	[  9 ] = KEY_KP4,
           	[ 10 ] = KEY_KP5,
           	[ 11 ] = KEY_KP6,
           	[ 13 ] = KEY_KP7,
           	[ 14 ] = KEY_KP8,
           	[ 15 ] = KEY_KP9,
           
          +	/* keycodes found in include/linux/input.h */
          +
          +	[ 54 ] = KEY_TV,
          +	[ 55 ] = KEY_TUNER, /* FM */
          +	[ 56 ] = KEY_DVD,
          +	[ 48 ] = KEY_CANCEL,	/* C : cancel */
          +	[ 47 ] = KEY_MENU,
          +	[ 49 ] = KEY_CHANNEL,	/* gird */
          +	[ 50 ] = KEY_SUBTITLE,	/* dots (...) */
          +	[ 52 ] = KEY_REWIND,
          +	[ 53 ] = KEY_FASTFORWARD,
          +	[ 51 ] = KEY_LANGUAGE,
          +	[ 17 ] = KEY_UNDO,	/* revert to previous channel */
          +	[ 27 ] = KEY_AUDIO,
          +	[ 22 ] = KEY_INFO,	/* Display */
          +	[ 40 ] = KEY_COPY,	/* snaptshot */
          +	[ 42 ] = KEY_NEW,	/* PIP */
          +	[ 37 ] = KEY_PAUSE,	/* Time shifting */
          +
          +	[ 41 ] = KEY_CLOSE,	/* Boss key : hide programm */
          +	[ 38 ] = KEY_STOPCD,	/* Stop recording */
          +
           	[  0 ] = KEY_POWER,
           	[  2 ] = KEY_TUNER,		/* TV/FM */
           	[ 30 ] = KEY_VIDEO,
           	[  4 ] = KEY_VOLUMEUP,
           	[  8 ] = KEY_VOLUMEDOWN,
           	[ 12 ] = KEY_CHANNELUP,
           	[ 16 ] = KEY_CHANNELDOWN,
           	[  3 ] = KEY_ZOOM,		/* fullscreen */
          -	[ 31 ] = KEY_SUBTITLE,		/* closed caption/teletext */
          +	[ 31 ] = KEY_TEXT,		/* closed caption/teletext */
           	[ 32 ] = KEY_SLEEP,
           	[ 20 ] = KEY_MUTE,
           	[ 43 ] = KEY_RED,
           	[ 44 ] = KEY_GREEN,
           	[ 45 ] = KEY_YELLOW,
           	[ 46 ] = KEY_BLUE,
           	[ 24 ] = KEY_KPPLUS,		/* fine tune + */
          
          Ce qui m'embête, c'est que j'ai du modifier une touche existante ... car ma télécommande a une fonction soustitres ET teletexte ... Et que l'ancien binding avait utilisé KEY_SUBTITLE pour la touche teletexte car il n'existe pas de KEY_TELETEXT :(

Suivre le flux des commentaires

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