Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
code d'un module
Envoyé par: reconor

Bonjour ,
je veux de l'aide de vous, s'il vous plait ;jai un programme et j'ai quelque dificultés là dessus:
**************************************************
#include <linux/module.h>
#include <asm/uaccess.h>
#include <asm-i386/io.h>
#include <linux/fs.h>

#define LPT_BASE 0x378
#define DEVICE_NAME "stepper"

static int Major,i,j,k;
static int Device_Open = 0;

static int pattern[2][8][8] = {
{{0xA,0x9,0x5,0x6,0xA,0x9,0x5,0x6},{0xA,0x8,0x9,0x1,0x5,0x4,0x6,0x2}},
{{0x6,0x5,0x9,0xA,0x6,0x5,0x9,0xA},{0x2,0x6,0x4,0x5,0x1,0x9,0x8,0xA}}
};

int step(void)
{
if(k<8) {
// printk("%d\n",pattern[j][k]);
outb(pattern[j][k],LPT_BASE);
k++;
}
else {
k=0;
outb(pattern[j][k],LPT_BASE);
// printk("%d\n",pattern[j][k]); /*#####*/
k++; /*#####*/
}
return 0;
}

static int stepper_open(struct inode *inode,struct file *filp)
{
if(Device_Open) return -EBUSY;
printk("Ouverture en mode Lecture/Ecriture ...\n");
Device_Open++;
return 0;
}

static int stepper_release(struct inode *inode,struct file *filp)
{
printk("Fermeture ...\n");
Device_Open --;
return 0;
}
static int stepper_write(struct file *file, const char *buffer, size_t len, loff_t *offset)
{
char data;
char cmd;
get_user(data,buffer);
switch (cmd=data) {
case 'H':
printk("Reportez-vous au fichier README\n");
break;
case 'h':
printk("Initialisation en mode demi pas\n");
j=0;
break;
case 'f':
printk("Initialisation en mode pas entier\n");
j=1;
break;
case 'F':
i=0;
step();
break;
case 'R':
i=1;
step();
break;
// default:
// printk("Reportez-vous au fichier README, les commandes sont H, h, F, f, et R\n");
// break;
}
return 1;
}

static struct file_operations fops={
open:stepper_open,
write:stepper_write,
release:stepper_release,
};

int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk("<1>L'enregistrement du périphérique caractère avec %d a échoué\n",Major);
return Major;
}
printk("<1>Enregistrement réussi, a obtenu le nombre majeur= %d\n",Major);
return 0;
}

void cleanup_module(void)
{
printk("<1>Non enregistré\n");
unregister_chrdev(Major,DEVICE_NAME);
}

***************************************
et dont voilà son makefile
-----------------------------------------------------------------
TARGET := stepper
WARN := -W -Wall
INCLUDE:= /usr/src/linux-2.4/include
#INCLUDE:= -isystem /usr/src/`uname -r`/include
CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} -I${INCLUDE}
all : stepper.o
#${TARGET}.o : ${TARGET}.c
clean:
rm -rf *.o
-------------------------------------------------------------------

je veux que vous m'expliquez ce programe surtout:
pattern[2][8][8] = {
{{0xA,0x9,0x5,0x6,0xA,0x9,0x5,0x6},{0xA,0x8,0x9,0x1,0x5,0x4,0x6,0x2}},
{{0x6,0x5,0x9,0xA,0x6,0x5,0x9,0xA},{0x2,0x6,0x4,0x5,0x1,0x9,0x8,0xA}}
};
j'attend votre reponse s'il vous plait le plus tot possible



Poste le Sunday 11 June 2006 20:07:05
Répondre     Citer    
Re: code d'un module

Tu donnes l'impression de ne pas maîtriser le C. Avant de coder ou modifier un module, apprends d'abord à utiliser correctement le C (d'ailleurs j'ai l'intuition qu'il y a plusieurs grosses erreurs dand ton code).

Coder un module (ou une partie d'un noyau) est nettement plus difficile que de coder des programmes C applicatifs. Apprends d'abord à coder ceux là, puis à utiliser les appels systèmes de Linux, et ensuite seulement attaques toi aux modules du noyau (qui sont des parties du noyau).

Enfin, la règle usuelle quand on a envie de coder un module, c'est de ne pas le faire (if you want to code a kernel module, don't). Il y a de nombreuses et excellentes raisons à celà, et elles sont abondamment documentées.


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Sunday 11 June 2006 21:40:34
Répondre     Citer    
Re: code d'un module
Envoyé par: Sve@r

Citation
reconor
je veux que vous m'expliquez ce programe surtout:

int pattern[2][8][8] = {
{
{0xA,0x9,0x5,0x6,0xA,0x9,0x5,0x6},
{0xA,0x8,0x9,0x1,0x5,0x4,0x6,0x2}
},
{
{0x6,0x5,0x9,0xA,0x6,0x5,0x9,0xA},
{0x2,0x6,0x4,0x5,0x1,0x9,0x8,0xA}
}
};

pattern est un tableau d'entiers en 3 dimensions (un cube) de 2 x 8 x 8 int.
Donc "pattern[0]" et "pattern[1]" sont chacun des tableaux en 2D (des damiers) de 8 x 8 int.
Et "pattern[0][0]" jusqu'à pattern[0][7] sont des tableaux en une dimension (des lignes) de 8 int. Idem pour "pattern[1][0]" jusqu'à "pattern[1][7]".
Et enfin "pattern[0][0][0]" jusqu'à "pattern[0][0][7]" sont chacun un int. Idem pour "pattern[0][1][0]" jusqu'à "pattern[0][1][7]" etc jusqu'à "pattern[0][7][0]" jusqu'à "pattern[0][7][7]".
Et idem pour "pattern[1][0][0]" jusqu'à pattern[1][7][7]"
Chaque valeur de "pattern" est codée en hexadécimal (par exemple 0xa en base 16 vaut 10 en base 10)

Pour le reste, tu fais là la douloureuse expèrience d'essayer de comprendre un programme écrit par un programmeur porc qui n'a pas pris la peine de mettre le moindre commentaire. En plus il n'a aucune indentation ce qui n'arrange rien (mais ça, ça vient du forum lea).

J'espère que de ton coté, tu veilleras bien, quand tu écriras tes propres programmes, à mettre des commentaires pour éviter à d'autres de devoir te relire.

Pour le détail de ce que fait le programme, tu dois probablement avoir un fichier "README" voire un répertoire "doc" ou "help" qui t'explique tout ça...


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Sunday 11 June 2006 21:41:24
Répondre     Citer    
Re: code d'un module

Le module initial donne l'impression de piloter (avec plusieurs bogues) un périphérique sur le port parallèle. Il y a de nombreuses façons de le faire sans écrire de module noyau. Renseignes toi...


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Sunday 11 June 2006 22:53:20
Répondre     Citer    
Re: code d'un module
Envoyé par: abgech

le code que tu nous propose me paraît assez confus et, surtout, totalement non commentarisé ce qui fait qu'il est inutilisable.

L'emploi de variables globales Major,i,j,k,Device_Open me paraît d'un goût plus que douteux, en tout cas représentatif d'un style de programmation totalement dépassé. Il n'est pas nécessaire de programmer objet pour s'inspirer de principe assez sains, ici l'encapsulation, c'est à dire refuser d'employer des variables globales. Dans le cas présent, seul Device_Open pourrait avoir le début d'un commencement de justification.

À première vue, c'est une transposition d'un code écrit pour DOS, avec Borland C: printk() est une fonction typiquement Borland C qui n'a pas, à ma connaissance, d'implémentation dans la GNU C library.
D'autre part, tu utilises la fonction outb(), en principe c'est une fonction qui ne s'utilise que dans le code du noyau. Elle peut être utilisée en code utilisateur, mais avec des restrictions relativement importantes, et, de toute façon, son premier appel doit être précédé d'un appel à ioperm(), ce que ne semble pas fait dans le code.

J'ai l'impression que tu nous présente une nouvelle version de: [lea-linux.org]. Si tu ne nous dis pas quel est ton problème, il semble assez difficile de t'aider. Alors, peux-tu nous exposer tes soucis, en termes de problème, décrire ce que tu veux faire, et non pas en terme de programmation, comment le faire (alors que l'on ne sait pas ce que tu veux faire).

Le premier travail de développement consiste à se poser la question: QUE FAIRE ?. La question COMMENT FAIRE ? (définition de l'algorithme et codage) c'est une étape qui vient bien plus tard, après avoir précisément définit le cahier des charges (le comment faire).

Dernière remarque, peux-tu ne faire qu'une seule file de discussion, ici, pour ton problème que crois qu'il y en a trois: cette file plus [lea-linux.org] et [lea-linux.org]. Celà n'est pas pour simplifier la tâche.

Poste le Monday 12 June 2006 08:43:52
Répondre     Citer    
Re: code d'un module
Envoyé par: abgech

Dans mon post précédent, j'ai écrit:
Citation
abgech
...
Le premier travail de développement consiste à se poser la question: QUE FAIRE ?. La question
COMMENT FAIRE ? (définition de l'algorithme et codage) c'est une étape qui vient bien plus tard,
après avoir précisément définit le cahier des charges (le comment faire).

Il fallait lire:
Le premier travail de développement consiste à se poser la question: QUE FAIRE ?. La question
COMMENT FAIRE ? (définition de l'algorithme et codage) c'est une étape qui vient bien plus tard,
après avoir précisément définit le cahier des charges (le que faire).

Un lapsus calamiteux m'a fait écrire le contraire de ce que je voulais dire.

Poste le Monday 12 June 2006 08:50:46
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
code d'un module
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons