Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

dirver linux

18 réponses
Avatar
remy
bonjour

en premier je vais profiter de cette question pour savoir
s'il n'y a pas quelque part un groupe francophile pour poser des questions
sur la programmation de drivers

et ensuite la the question je n'arrive pas à introduire la bibliothèque

#include </usr/include/stdlib.h>
pour utiliser system("beep");
dans un driver en cours de fabrication

en gros et pour faire simple le but du jeu
faire une allocation dynamique du numéro majeur( cela fonctionne déjà)
pour ensuite créer le fichier qui va bien (cela ne fct pas encore )

et dans la foulée si vous savez comment je peux récupérer
le numéro majeur qd il y a eu une allocation dynamique je suis preneur
pour un driver bien sûr parce que pour l'instant

register_chrdev(0, "mydriver", &fops);

unregister_chrdev( ?????, "mydriver");



ps mon c est rouillé donc on y va doucement
remy

10 réponses

1 2
Avatar
Eric Levenez
Le 22/05/08 17:43, dans <g141ar$j14$, « remy »
a écrit :

en premier je vais profiter de cette question pour savoir
s'il n'y a pas quelque part un groupe francophile pour poser des questions
sur la programmation de drivers


Les drivers sont spécifiques à chaque plateforme. Il faudrait poster sur un
groupe dédié à Linux.

et ensuite la the question je n'arrive pas à introduire la bibliothèque

#include </usr/include/stdlib.h>
pour utiliser system("beep");
dans un driver en cours de fabrication


Tu parles de bibliothèque puis de drivers... Bizarre.

en gros et pour faire simple le but du jeu
faire une allocation dynamique du numéro majeur( cela fonctionne déjà)
pour ensuite créer le fichier qui va bien (cela ne fct pas encore )


Sous Linux 2.6, il suffit d'appeler devfs_mk_cdev dans la routine d'init du
driver pour créer automatiquement le fichier /dev associé au driver (si
c'est ce que tu veux faire).

et dans la foulée si vous savez comment je peux récupérer
le numéro majeur qd il y a eu une allocation dynamique je suis preneur
pour un driver bien sûr parce que pour l'instant

register_chrdev(0, "mydriver", &fops);

unregister_chrdev( ?????, "mydriver");


alloc_chrdev_region permet d'allouer et de récupérer le majeur et
unregister_chrdev_region libère le majeur.

ps mon c est rouillé donc on y va doucement


Linux c'est pas écrit en C mais en GNU-C, ce qui n'est pas toujours la même
chose.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Thierry B.
--{ remy a plopé ceci: }--

#include </usr/include/stdlib.h>
pour utiliser system("beep");
dans un driver en cours de fabrication


Il me semble t'avoir déja dit que tu était vraiment mal parti.
Je te conseille donc de courir t'acheter l'excellent ouvrage
de Rubini & Corbet: "Linux Device Drivers" édité, par O'Reilly,
et de revenir dans quelques mois poser une _vraie_ question.

--
La pénibilité purement de l'ordre de la corvé de brancher les fils et la
pénibilité de l'ordre de l'obscénité de voir les entrailles d'un
ordinateur ne sont pas comparables.
--{ Clickez sur <FSCK> pour continuer }--

Avatar
Pierre Maurette

[...]

mon c.. est rouillé donc on y va doucement


Arletty, sors de ce corps !

--
Pierre Maurette

Avatar
remy
Le 22/05/08 17:43, dans <g141ar$j14$, « remy »

en premier je vais profiter de cette question pour savoir
s'il n'y a pas quelque part un groupe francophile pour poser des questions
sur la programmation de drivers


Les drivers sont spécifiques à chaque plateforme. Il faudrait poster sur un
groupe dédié à Linux.

et ensuite la the question je n'arrive pas à introduire la bibliothèque

#include </usr/include/stdlib.h>
pour utiliser system("beep");
dans un driver en cours de fabrication


Tu parles de bibliothèque puis de drivers... Bizarre.




Bizarre cela est tout à fait possible

je cherche à développer un driver avec une allocation dynamique de
numéro majeur puis à créer un fichier dans /dev/

et tout cela depuis le driver dans la fonction

__init mon_module_init(void)

je souhaite que l'utilisateur potentiel du driver
n'est qu'à taper

make
insmod ...
ou rmmod ....

et tout le reste c'est le problème du programmeur


donc il faut que je puisse récupérer le numéro alloué par le système
pour pouvoir le stocker

et m'en servir pour libérer les ressources
quand il y a un déférencement du driver et ce numéro me sert aussi pour
créer le fichier avec mkmod

d'où la question intégration de la bibliothèque
/usr/include/stdlib.h pour utiliser system("....")
qui devrait me permettre d'exécuter un cmd shell


ce que je trouvais bizarre c'est qu'il n'y a pas de mécanisme déjà
établi et qu'on laisse l'intégrateur/utilisateur faire mumuse avec mkmod


bon bref je veux simplifier l'utilisation du mon driver et je suis
obligé de passer par une allocation dynamique à cause de la
"portabilité "


voila en gros le pourquoi du comment
mais devfs_mk_cdev me semble bien prometteuse et adaptée à la chose

il me reste donc le problème de récupération du numéro majeur pour
libérer les ressources parce que
int minor = MINOR(inode->i_rdev); ne passe pas la compilation
dit différemment je cherche à initialiser la structure
dev_t initialise par le system

dans tous les cas la question sur l'intégration des bibliothèques reste
d'actualité parce que je vais en avoir besoin pour mon truc
qui a besoin d'intégrer des fonctions mathématiques à la con sur les
structures de données à la con donc je suis assez intéressé par quelques
liens

mais bon il n'y a pas le feu c'est juste un développement perso
tranquille à temps perdu


dans tout les cas merci
a+ remy









en gros et pour faire simple le but du jeu
faire une allocation dynamique du numéro majeur( cela fonctionne déjà)
pour ensuite créer le fichier qui va bien (cela ne fct pas encore )


Sous Linux 2.6, il suffit d'appeler devfs_mk_cdev dans la routine d'init du
driver pour créer automatiquement le fichier /dev associé au driver (si
c'est ce que tu veux faire).

et dans la foulée si vous savez comment je peux récupérer
le numéro majeur qd il y a eu une allocation dynamique je suis preneur
pour un driver bien sûr parce que pour l'instant

register_chrdev(0, "mydriver", &fops);

unregister_chrdev( ?????, "mydriver");


alloc_chrdev_region permet d'allouer et de récupérer le majeur et
unregister_chrdev_region libère le majeur.

ps mon c est rouillé donc on y va doucement


Linux c'est pas écrit en C mais en GNU-C, ce qui n'est pas toujours la même
chose.




Avatar
Eric Levenez
Le 23/05/08 09:55, dans <g15q8n$9g2$, « remy »
a écrit :

Le 22/05/08 17:43, dans <g141ar$j14$, « remy »

en premier je vais profiter de cette question pour savoir
s'il n'y a pas quelque part un groupe francophile pour poser des questions
sur la programmation de drivers


Les drivers sont spécifiques à chaque plateforme. Il faudrait poster sur un
groupe dédié à Linux.

et ensuite la the question je n'arrive pas à introduire la bibliothèque

#include </usr/include/stdlib.h>
pour utiliser system("beep");
dans un driver en cours de fabrication


Tu parles de bibliothèque puis de drivers... Bizarre.




Bizarre cela est tout à fait possible

je cherche à développer un driver avec une allocation dynamique de
numéro majeur puis à créer un fichier dans /dev/


alloc_chrdev_region est fait pour cela. Où est le problème ?

et tout cela depuis le driver dans la fonction

__init mon_module_init(void)


C'est justement là qu'il faut mettre le alloc_chrdev_region.

je souhaite que l'utilisateur potentiel du driver
n'est qu'à taper

make
insmod ...
ou rmmod ....

et tout le reste c'est le problème du programmeur


Oui, bien sûr.

donc il faut que je puisse récupérer le numéro alloué par le système
pour pouvoir le stocker

et m'en servir pour libérer les ressources
quand il y a un déférencement du driver


Non. Il suffit de d'appeler unregister_chrdev_region dans
void __exit module_exit(void)

et ce numéro me sert aussi pour
créer le fichier avec mkmod


Non. On ne crée plus les dev à la main avec mknod. Cela se fait dans la
routine init du driver en appelant la fonction devfs_mk_cdev. On l'efface en
appelant devfs_remove dans la routine exit du driver.

d'où la question intégration de la bibliothèque
/usr/include/stdlib.h pour utiliser system("....")
qui devrait me permettre d'exécuter un cmd shell


Bien sur que non. Alors non seulement tu n'as pas du tout lu ma réponse
précédente, mais en plus tu semble ne pas avoir de notions de ce qu'est un
driver par rapport à programme utilisateur.

ce que je trouvais bizarre c'est qu'il n'y a pas de mécanisme déjà
établi et qu'on laisse l'intégrateur/utilisateur faire mumuse avec mkmod


Comme je l'ai dit, on ne fait plus "mumuse" avec mknod, le driver crée de
lui-même le dev sur fsdev.

bon bref je veux simplifier l'utilisation du mon driver et je suis
obligé de passer par une allocation dynamique à cause de la
"portabilité "


Je pense qu'un bouquin expliquant le b.a.ba des drivers Linux te ferai le
plus grand bien.

voila en gros le pourquoi du comment
mais devfs_mk_cdev me semble bien prometteuse et adaptée à la chose


dev_t mon_dev;
struct cdev mon_cdev;
struct file_operations fpga_fops = ...;

alloc_chrdev_region(&mon_dev, 0, 1, "truc");
cdev_init(&mon_cdev, &mon_fops);
cdev_add(&mon_cdev, mon_dev, 1);
devfs_mk_cdev(mon_dev, S_IFCHR | S_IRUSR | S_IWUSR, "truc");

Ces commandes vont allouer un numéro de majeur et créer le fichier spécial
/dev/truc. Il faut enrober le tout bien sûr, mais c'est le principe.

il me reste donc le problème de récupération du numéro majeur pour
libérer les ressources parce que
int minor = MINOR(inode->i_rdev); ne passe pas la compilation
dit différemment je cherche à initialiser la structure
dev_t initialise par le system


Non. Tu l'as déjà dit, mais tu fais fausse route.

La libération se fait par une séquence du genre :

devfs_remove("truc");
cdev_del(&mon_cdev);
unregister_chrdev_region(mon_dev, 1);

dans tous les cas la question sur l'intégration des bibliothèques reste
d'actualité


Pas pour ce que tu veux faire (créer un /dev, allouer les ressources d'un
driver...)

parce que je vais en avoir besoin pour mon truc
qui a besoin d'intégrer des fonctions mathématiques à la con sur les
structures de données à la con donc je suis assez intéressé par quelques
liens


Je te conseille de placer ton code hors du noyau, car dans le noyau on ne
fait pas ce que l'on veut, contrairement à ce que tu sembles penser. Si tu
veux jouer à cela, il vaut mieux utiliser AIX que Linux.

mais bon il n'y a pas le feu c'est juste un développement perso
tranquille à temps perdu


Conseil 1: Achète un bouquin ou lit les explications sur la création d'un
driver sur le web. Il te manque vraiment les bases.

Conseil 2 : poste dans un groupe dédié à Linux, car ici c'est le C standard,
et tes questions sont liés à la compréhension de ce qu'est un driver et pas
de comment coder en C.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
remy
bonjour

devfs_mk_cdev(mon_dev, S_IFCHR | S_IRUSR | S_IWUSR, "truc");



avec google code plus quelques lectures sur la toile je peux m'en sortir
par contre devfs_mk_cdev veut bien passer la compilation avec warnig
mais pas l'éxécution

compilation

make
make -C /lib/modules/`uname -r`/build/ M=/home/remy/Desktop/camera modules
make[1]: entrant dans le répertoire «
/usr/src/linux-headers-2.6.20-16-generic »
CC [M] /home/remy/..../mydriver.o
/home/remy/.../mydriver.c: In function «mydriver_init":
/home/remy/....mydriver.c:161: attention : implicit declaration of
function «devfs_mk_cdev"
Building modules, stage 2.
MODPOST 1 modules
WARNING: "devfs_mk_cdev" [/home/remy..../mydriver.ko] undefined!
LD [M] /home/remy/..../mydriver.ko
make[1]: quittant le répertoire « /usr/src/linux-headers-2.6.20-16-generic »



exécution

sudo insmod mydriver.ko
insmod: error inserting 'mydriver.ko': -1 Unknown symbol in module


et dans toutes les lectures que j'ai pu parcourir
il faut créer un script pour installer le driver cela veut t'il dire
que ce que je cherche à faire n'est pas possible

bon bref ça ne marche pas la création de fichiers dans dev de manière
automatique du moins moi je n'y arrive pas

une piste peut etre ?


http://cjoint.com/data/fAqjee13jw.htm
unzip
cd ..
make

sudo insmod mydriver.ko
ou
sudo rmmod mydriver.ko

tail /var/log/syslog

l
static int mydriver_init( void )
{
dev_t dev = 0;
int result;


printk( KERN_ALERT "driver loadedn" );

// general initilaization
dev = MKDEV( _dev_major, _dev_minor );
// allocate device major
if ( _dev_major ) {
printk( KERN_INFO " Reserving device major: %dn", _dev_major );
result = register_chrdev_region( dev, _dev_num, _device_name );a fct
} else {
printk( KERN_INFO "dynamic device major nuber...n" );
result = alloc_chrdev_region( &dev, _dev_major, _dev_num,_device_name );
_dev_major = MAJOR( dev );
printk( KERN_INFO " Device major got: %dn",_dev_major );

}

if ( result < 0 ) {
printk( KERN_ALERT " FATAL: allocate device major: %dn",_dev_major );
return result;
}
// register char device
printk( KERN_INFO " Registering char device...n" );
p_device = cdev_alloc();
if ( p_device ) {
p_device->ops = &mydriver_fops;
if ( cdev_add( p_device, dev, _dev_num ) ) {
printk( KERN_INFO " FATAL: not register devicen" );
mydriver_exit();
return -1;
} else {
printk( KERN_INFO " Device registeredn" );
}
} else {
printk( KERN_INFO " FATAL: not allocate devicen" );
mydriver_exit();
return -1;
}

//create /dev/ _device_name

/*
resultÞvfs_mk_cdev(MKDEV(_dev_major, 0), S_IFCHR | S_IRUGO |
S_IWUSR, _device_name);
result Þvfs_mk_cdev(dev , S_IFCHR | S_IRUGO | S_IWUGO, "mydriver");

if ( result < 0 ) {
printk( KERN_ALERT " FATAL: create /dev/ ");
return result;
}

printk( KERN_INFO " create /dev/... ");
*/
return 0;
}

Avatar
Eric Levenez
Le 26/05/08 16:17, dans <g1edmu$pjf$, « remy »
a écrit :

avec google code plus quelques lectures sur la toile je peux m'en sortir
par contre devfs_mk_cdev veut bien passer la compilation


Il ne passe pas la compilation, ton code. Voir plus loin.

avec warnig
mais pas l'éxécution

compilation

make
make -C /lib/modules/`uname -r`/build/ M=/home/remy/Desktop/camera modules
make[1]: entrant dans le répertoire «
/usr/src/linux-headers-2.6.20-16-generic »
CC [M] /home/remy/..../mydriver.o
/home/remy/.../mydriver.c: In function «mydriver_init":
/home/remy/....mydriver.c:161: attention : implicit declaration of
function «devfs_mk_cdev"


Là le compilateur te dit clairement que tu n'as pas les bons includes et
donc que ton driver a toutes les chances d'être mal compilé.

Il manque (au moins) :

#include <linux/devfs_fs_kernel.h>


Building modules, stage 2.
MODPOST 1 modules
WARNING: "devfs_mk_cdev" [/home/remy..../mydriver.ko] undefined!


Là c'est clair : à cause de l'include manquant, ton driver ne pourra pas
marcher.

LD [M] /home/remy/..../mydriver.ko
make[1]: quittant le répertoire « /usr/src/linux-headers-2.6.20-16-generic »

exécution

sudo insmod mydriver.ko
insmod: error inserting 'mydriver.ko': -1 Unknown symbol in module


Normal que ça ne marche pas vu le problème du dessus. Tant que ton programme
ne compile pas sans erreur, inutile d'essayer de le charger.

et dans toutes les lectures que j'ai pu parcourir
il faut créer un script pour installer le driver cela veut t'il dire
que ce que je cherche à faire n'est pas possible


Un driver qui alloue dynamiquement un majeur et crée un nom dans /dev ?
Si c'est possible.

bon bref ça ne marche pas la création de fichiers dans dev de manière
automatique du moins moi je n'y arrive pas


Si ça marche, j'utilise cela sans problème.

une piste peut etre ?

http://cjoint.com/data/fAqjee13jw.htm


Je ne peux pas tester ton code, vu que je ne suis actuellement pas sous
GNU/Linux. Pour la rountine d'init :

static int __init mydriver_init(void)

Pour MODULE_LICENSE, pas sûr qu'une chaîne vide soit acceptée.

Il faut ajouter "linux/devfs_fs_kernel" et peut-être d'autres includes.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
YBM
http://tldp.org/LDP/lkmpg/2.6/html/index.html

regarder chardev.c
Avatar
YBM

http://tldp.org/LDP/lkmpg/2.6/html/index.html

regarder chardev.c




Zut, il utilise des fonctions obsolètes. Voir plutôt :
http://lwn.net/Kernel/LDD3/
Chapitre 3.

Avatar
remy


ah non chez moi cela passe la compilation sans erreur j'avais mis le code
"litigieux "en commentaire

:~/Desktop/Mydriver$ make
make -C /lib/modules/`uname -r`/build/ M=/home/remy/Desktop/Mydriver
modules
make[1]: entrant dans le répertoire «
/usr/src/linux-headers-2.6.20-16-generic »
CC [M] /home/remy/Desktop/Mydriver/mydriver.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/remy/Desktop/Mydriver/mydriver.mod.o
LD [M] /home/remy/Desktop/Mydriver/mydriver.ko
make[1]: quittant le répertoire «
/usr/src/linux-headers-2.6.20-16-generic »
:~/Desktop/Mydriver$


Il faut ajouter "linux/devfs_fs_kernel" et peut-être d'autres includes.



là tu viens de mettre le doigt sur mon problème
il ne trouve pas le fichier d'en tête
c'est bizarre les retours d'erreurs de type


attention : implicit declaration of function «devfs_register_chrdev"

va falloir que je me remette au gout du jour

bon bref le même code met
#include <linux/devfs_fs_kernel.h>




:~/Desktop/Mydriver$ make
make -C /lib/modules/`uname -r`/build/ M=/home/remy/Desktop/Mydriver modules
make[1]: entrant dans le répertoire «
/usr/src/linux-headers-2.6.20-16-generic »
CC [M] /home/remy/Desktop/Mydriver/mydriver.o
/home/remy/Desktop/Mydriver/mydriver.c:9:35: erreur:
linux/devfs_fs_kernel.h : Aucun fichier ou répertoire de ce type
make[2]: *** [/home/remy/Desktop/Mydriver/mydriver.o] Erreur 1
make[1]: *** [_module_/home/remy/Desktop/Mydriver] Erreur 2
make[1]: quittant le répertoire « /usr/src/linux-headers-2.6.20-16-generic »
make: *** [modules] Erreur 2
:~/Desktop/Mydriver$



je dois avoir un truc à la con bête comme chou
mais quoi ?

merci remy

1 2