Forum Programmation.c Probleme de création de driver

Posté par  .
Étiquettes : aucune
0
20
déc.
2006
salut
Je suis en train de développer un driver qui me permet de savoir quand je recoie une interruption sur une carte de type PC104.

c'est un PC Embarqué Bus PC104 de chez Arcom mais la n'est pas le probleme.
En fait j'ai fais un petit programme qui attend via la fonction select() un evenement ( par ex sur read) .
Mais malheureusement le select est non bloquant et signale un evenement de lecture sur mon descripteur (driver)alors qu'il ya rien .
Pourtant select fonctionne tres bien pour l'attente sur Stdin ....

Je voudrai savoir si l'un d'entre vous pourrai m'eclairer sur mon prob

je sais pas si je suis assez clair m'enfin ...

je ne sais pas si mon probleme vient du driver ( je pense pas car meme en faisant un driver simple juste avec register_chrdev dans le init c'est le meme probleme.

voila mon code qui intercepte

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>

#include <stropts.h>
#include <poll.h>

#include <errno.h>
#include <string.h>

int main(int argc,char **argv)
{
int Pas_fd;
int ret;
int MPas_fd;
int Mpas=0;
int got;
char recu[50];
char recu2;
unsigned int cpt=0;
char device[40];
char device2[40];
fd_set rfds;
sprintf(device, "/dev/pas");
printf("Ouverture du driver Pas %s \n ", device);
//sprintf(device2, "/dev/MPas");
//printf("Ouverture du driver MPas %s \n ", device2);

if(( Pas_fd = open("/dev/pas", O_RDWR )) < 0 ) {
fprintf(stderr,"Error opening Pas Driver %s\n", device);
return(-1);
}

/* if(( MPas_fd = open(device2, O_RDONLY | O_NONBLOCK )) < 0 ) {
fprintf(stderr,"Error opening MPas Driver %s\n", device2);
return(-1);
}
*/
printf("Ouverture reussie Pas = %d MPas =%d \n ",Pas_fd,MPas_fd);

while(1) {

FD_ZERO(&rfds);
FD_SET(Pas_fd, &rfds); /* verifie fd pour Pas */
// FD_SET(MPas_fd, &rfds); /* verifie fd pour Mpas */
FD_SET(0, &rfds); /* watch on fd for stdin */
ret=select(FD_SETSIZE, &rfds, NULL, NULL, NULL );
printf("ret= %d \n",ret);


/*if( FD_ISSET(MPas_fd, &rfds) )
{
printf("1 \n");
got = read(MPas_fd, &recu2, 0);
printf("2 \n");
Mpas++;
}*/
if( FD_ISSET(Pas_fd, &rfds))
{
printf("3 \n");
//got = read(Pas_fd, &recu, 16);
printf("4 \n");
cpt++;
printf("Detection d'un Pas %u avec Mpas %u \n ",cpt,Mpas);
Mpas=0;
}
if( FD_ISSET(0, &rfds) ) {
int c, i;
/* it was the stdio terminal fd */
i = read(0 , &c, 1);
printf(" key = %x\n", c);
} /* stdio fd */


}


close(Pas_fd);
close(MPas_fd);
return 0;
}



voila mon driver






#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/interrupt.h>
#include <linux/jiffies.h>
#include <linux/init.h>
#include <linux/fs.h> /* everything... */
#include <linux/types.h> /* size_t */
#include <linux/wait.h>
#include <linux/sched.h> /* current and everything */
MODULE_AUTHOR ("Jean Rodriguez");
MODULE_LICENSE("Dual BSD/GPL");


int irq;
module_param(irq, int, 0);
static DECLARE_WAIT_QUEUE_HEAD(wq);
static int flag = 0;
/* this is used as devid in the handler */
struct Pas_data {
unsigned long seconds;
unsigned long count;
} data;

ssize_t Pas_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
if(wait_event_interruptible(wq, flag != 0))return -ERESTARTSYS;
flag = 0;
return 0; /* EOF */
}


/* the handler */
static int Pas_handler(int irq, void *devid, struct pt_regs *regs)
{
struct Pas_data *d = (struct Pas_data *)devid;
unsigned long seconds = jiffies/HZ;

d->count++;
if (seconds != d->seconds) {
/* next second: print stats */
printk(KERN_INFO "Pas: irq %i: got %li events\n",
irq, d->count);
d->count = 0;
d->seconds = seconds;
}
flag = 1;
wake_up_interruptible(&wq);
return IRQ_NONE;

}


struct file_operations Pas_fops = {
.owner = THIS_MODULE,
.read = Pas_read,
};




/* load time */
static int Pas_init(void)
{
int err;
int result;
result = register_chrdev(69, "pas", &Pas_fops);
if (result < 0) {
printk(KERN_INFO "Pas: can't get major number\n");
return result;
}

// err = request_irq(irq, Pas_handler, SA_SHIRQ, "pas", &data);
//if (err) return err;
return 0;
}

/* unload time */
static void Pas_exit(void)
{
free_irq(irq, &data);
}

module_init(Pas_init);
module_exit(Pas_exit);



Merci de votre aide

Suivre le flux des commentaires

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