Pour faire suite à l'article précédent, je vais vous présenter un deuxième driver "hello world", qui lui est "un vrai" pilote de périphérique.
Le source
#include linux/fs.h
#include linux/sched.h
#include linux/errno.h
#include linux/init.h
#include linux/module.h
#include linux/kernel.h
#include asm/current.h
#include asm/segment.h
#include asm/uaccess.h
/* le message à retourner */
char message[80]="bonjour monde";
/* ma fonction open. */
int mon_open(struct inode *inode,struct file *filep)
{
return 0;
}
/* ma fonction close. */
int mon_release(struct inode *inode,struct file *filep)
{
return 0;
}
/* ma fonction lecture. */
ssize_t mon_read(struct file *filep,char *buff,size_t count,loff_t *offp )
{
/* fonction pour copier le tampon depuis l'espace du noyau vers l'espace utilisateur*/
if ( copy_to_user(buff,message,strlen(message)) != 0 )
printk( "Kernel -> Erreur copie vers espace utilisateur\n" );
return strlen(message);
}
/* ma fonction lecture */
ssize_t mon_write(struct file *filep,const char *buff,size_t count,loff_t *offp )
{
/* On ne fait rien en écriture */
return 0;
}
/* Cette structure permet de définir les 4 fonctions de base que doit remplir */
/* un pilote caractère. Ces 4 fonctions sont celles décrites par les prototypes */
/* que l'on vient de décrire. */
/* Ces fonctions sont l'ouverture du périphérique, sa fermeture, l'écriture et */
/* la lecture. */
struct file_operations mon_fops={
open: mon_open,
read: mon_read,
write: mon_write,
release:mon_release,
};
MODULE_AUTHOR("olivier thebault");
MODULE_DESCRIPTION("Hello world");
MODULE_LICENSE("GPL");
static int hello_init(void) {
/* enregistre le driver auprès du système. */
/* On précise son numéro majeur, son nom */
/* et la structure file_operations qui */
/* contient les références aux fonction de */
/* base du driver. */
/* Ce driver ne fait que retourner le message */
/* "message". */
if(register_chrdev(234,"Bonjour Monde",&mon_fops)){
printk("<1>déclaration impossible");
}
return 0;
}
static void hello_exit(void) {
/* On désenregistre le driver */
unregister_chrdev(234,"Bonjour Monde");
}
module_init(hello_init);
module_exit(hello_exit);
L'installation
Une fois la commande insmod appelée, il faut déclarer le chemin /dev du périphérique avec
la commande mknod /dev/bonjour c 234 0.
Test
La commande cat /dev/bonjour devrait vous permettre de voir le message Bonjour Monde.

