Compilation et debogage de module linux, aux pros de l'algo et systeme - C - Programmation
Marsh Posté le 24-06-2003 à 10:08:20
quelle version du noyau as-tu? S'on regard la configuration du module Ir dans le noyau 2.4.20 de base, beaucoup d'options sont inaccessibles ou 'EXPERIMENTAL', c'est-à-dire qu'elles sont en cours de développement. Tu peux essayer de regarder sur kernel.org les sources du noyau en cours de dével (2.5.* où * est suppérieur à 75 ;-) ...
Marsh Posté le 24-06-2003 à 12:15:34
je suis en noyau 2.4.20 et je n ai pas besoin de la gestion IR du noyau (je dois meme l enlever) car c est directement mon module qui pilote le controleur. D ailleurs ca marche bien vu que je recois des interruptions.
Par contre apres renseignements , le controleur IR fait partie d une puce (contenant d autres controleurs) de chez winbond modele : W83877TF.
Apparemment, apres tests, je recois une interruption lors d'un front descendant (chute du signal si vous preferez) mais pas lors d un front montant (verifié avec un oscilloscope et debugage du module).
Donc je pense que l initialisation de mon controleur est mauvaise ... mais je n ai pas trop d infos a ce niveau.
Marsh Posté le 25-06-2003 à 15:43:16
chtit informations supplémentaires :
j ai configuré mon controleur sur irq 11 et IO 0x03E8
j ai recupéré les valeurs des registres du controleur ... voici les valeurs :
hex : bin :
io + 0 : 0x7F 01111111
io + 1 : 0x01 00000001
io + 2 : 0xC1 11000001
io + 3 : 0x02 00000010
io + 4 : 0x0B 00001011
io + 5 : 0x60 01100000
io + 6 : 0x00 00000000
io + 7 : 0x00 00000000
j'ai regardé la doc technique du W83877TF mais ca ne m apporte pas grand chose (et je ne comprends pas tout).
Marsh Posté le 14-07-2003 à 17:44:21
J'ai déjà bricolé un module, mais c'était pas aussi près du hard.
Le inb, ça correspond à l'instruction assembleur IN, qui te permet de lire un octet sur le port donné en argument.
Par contre, je dis ça comme ça: tu es sûr d'avoir les mêmes paramètres pour les bits d'arrêt et de parité et tout ça ? C'est généralement des trucs comme ça qui empêche le matos de tourner.
Sinon si tu tiens à faire un module perso, dégage ce qui ne concerne pas ton matériel on y verra plus clair.
Marsh Posté le 23-06-2003 à 21:58:16
bonjour,
je developpe actuellement une application sous linux necessitant le port infra rouge et apres avoir galéré a installer lirc dessus, ca ne marche finalement pas. Ou plutot tout marche mais je ne recois pas correctement les signaux.
ex :
j envoie un signal codé en RC5 (il faut savoir que le RC5 code ses bits avec des fronts montant et descendant de 889 µs, donc je suis censé recevoir des PULSE et des SPACES d environ 889µs +- delta OU 2*889=1778µs +- delta), et je recois des donnees completement differentes (a savoir sur une autre machine avec d autres composants ca marche tres bien).
Mais je recois quelque chose qui "ressemble" : je m explique
si j etais censé recevoir :
SPACE 16777216
PULSE 889
SPACE 889
PULSE 889
SPACE 1778
PULSE 889
SPACE 889
PULSE 1778
SPACE 1778
je recois a la place
SPACE 1677216
PULSE 39
SPACE 1700
PULSE 39
SPACE 1765
PULSE 39
SPACE 2643
PULSE 39
etc...
J ai donc remarqué que les temps entre 2 pulses (somme de pulse + space ) etait le meme (+- delta je precise) entre ce que j emets et ce que je receptionne. Autrement dit, l interruption se produit bien mais le temps calculé pour le pulse est faux.
D ailleurs je precise que la valeur "39" n est pas une valeur anodine mais exactement egale a la moitié d'une constante dans le driver
soit 9bits * 1 sec / 115200 bits = 78,25 ms
j ai donc decidé de "completer" le driver pour qu il puisse fonctionner avec mon controleur IR (car j ai pas le choix) mais j avoue que dans le source, quelques choses me laissent perplexes :
voici le source de la fonction invoquée lors d'une interruption (le define LIRC_SA1100 concerne les PDA de type Ipaq donc a ignorer)
* a un moment dans le do .. while on a un truc du genre
je ne suis pas (encore) expert dans l ecriture des modules, mais si j ai bien compris, cela permet de lire une valeur IO a l adresse io (l adresse io de mon peripherique = l adresse io de mon controleur IR spécifiée dans le bios)
mais plus loin dans le code , on s apercoit qu on ecrase la valeur data (data=1 sans avoir testé cette valeur auparavant... quel interet ? (j ai pas compris)
* juste apres je vois le test :
c est un XOR bit a bit il me semble. Sachant que data vaut forcement 1 , cela signifie donc qu on passe dans le if si le premier bit de last_value est a 0 .. donc pourquoi ce test ?
* a un moment , on a : "if nothing came in last 2 cycles, it was gap "
Je ne comprends pas ce que signifie cette phrase... apparemment a chaque interruption il passe dedans OR il ne devrait pas passer dedans.Quelqu un peut m eclairer ?
* enfin, je n ai pas trouvé de doc parlant des constantes du genre
UART_RX
UART_LSR
UART_IIR_RDI
etc...
quelqu un peut il me dire ou trouver de la doc ?
merci de m aider car je ne comprends pas bien l interet de l algo permettant de calculer le temps du PULSE et le temps du SPACE.
merci d avoir lu jusque la ;-)