Ejemplo de driver de dispositivo de caracteres

[ permalink ] [ download ]
/**
*  Makefile Para compilar (el archivo se llama fente.c):
*
* obj-m := fente.o
* PWD    := $(shell pwd)
* #Compiler
* 
* all:
*        @echo "------------------------------------------"
*        make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) modules
*
* clean:
*        @echo "------------------------------------------"
*        @rm -f *.o *.ko *.mod.c .*.cmd sysenter.h
*        make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) clean
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
int leido =0;int mn  = 0; //si le ponemos igual a 0 el kernel nos asigna el primero que este libre ;)
int mi_open (struct inode * inode, struct file * filp)
{
	leido=0;
	printk(KERN_INFO "open realizada\n");
	return 0;
}
ssize_t mi_read (struct file * filp, char __user * buff)
{
	int i;
	char * cadena = "Hola caracola\n";
	printk(KERN_INFO "Read ejecutada\n");
	if(!leido)
	{
	 for ( i=0; i<strlen(cadena) ; i++)
	                      { put_user(cadena[i], buff + i);}
		leido++;	                
	 	return strlen(cadena);
					//int aux=  copy_to_user(buff,cadena,sizeof(cadena));
		//return aux;
	}
	return 0;
	
}
int mi_release (struct inode * inode,struct file *filep)
{
	printk(KERN_INFO "Release del fichero \n");
	return 0;
}

struct file_operations fops = {
	.owner = THIS_MODULE,
	.open = mi_open,
	.read = mi_read,
	.release= mi_release,
};
int no_dev = MKDEV(50,1);	
static int __init fent_init(void) {
	printk(KERN_INFO "Prueba de un driver\n");
	if ((mn=register_chrdev(mn, "my_device", &fops))<0 )
		return -1;
	printk("mknod /dev/hook c %d 0.\n", mn);
	return 0;
}

static void __exit fent_exit(void) {
	printk(KERN_INFO "Se descarga el LKM...\n");
	unregister_chrdev(mn, "my_device");
}

module_init(fent_init);
module_exit(fent_exit);
MODULE_LICENSE("GPL");
hits counter