DEPARTAMENTO DE INGENIERÍA ELECTRÓNICA
LABORATORIO DE SISTEMAS ELECTRÓNICOS Controladores para GNU/Linux
Alvaro Araujo Marzo ‘06
OBJETIVOS
• CONCEPTO DE CONTROLADOR • CONTROLADORES EN GNU/LINUX • EJEMPLO DE CONTROLADOR
• DESMITIFICAR LOS CONTROLADORES LABORATORIO DE SISTEMAS ELECTRÓNICOS
1
DEFINICIÓN •ARQUITECTURA
•“Módulo software que permite a otros módulos interactuar con los diferentes dispositivos hardware” LABORATORIO DE SISTEMAS ELECTRÓNICOS
ESPACIO DE USUARIO Y KERNEL
Espacio de usuario (aplicaciones)
Funciones de intercambio entre el espacio de usuario y el espacio del kernel (Ficheros)
Espacio de kernel (módulos o controladores) Hardware
Funciones de intercambio entre el espacio del kernel y el dispositivo hardware
LABORATORIO DE SISTEMAS ELECTRÓNICOS
2
FUNCIONES USUARIO-KERNEL Eventos
Funciones de usuarios
Funciones de kernel
Carga de módulo Abrir dispositivo Leer dispositivo Escribir dispositivo Cerrar dispositivo Quitar módulo
LABORATORIO DE SISTEMAS ELECTRÓNICOS
FUNCIONES KERNEL-HARDWARE
Eventos
Funciones del kernel
Leer datos Escribir datos
LABORATORIO DE SISTEMAS ELECTRÓNICOS
3
MI PRIMER CONTROLADOR nada.c __KERNEL__ #define MODULE #include
$ gcc –c nada.c $ insmod nada.o $ lsmod $ rmmod nada
LABORATORIO DE SISTEMAS ELECTRÓNICOS
FUNCIONES USUARIO-KERNEL Eventos
Funciones de usuarios
Carga de módulo
Funciones de kernel
insmod
Abrir dispositivo Leer dispositivo Escribir dispositivo Cerrar dispositivo Quitar módulo
rmmod
LABORATORIO DE SISTEMAS ELECTRÓNICOS
4
MI PRIMER CONTROLADOR algo.c __KERNEL__ #define MODULE #include
int init_module(void){ printk(“Hola mundo\n”); return 0; } void cleanup_module(vo
/*Funciones de acceso a fichero*/ Struct file_operations paralelo_fops = { read: paralelo_read, write: paralelo_write, open: paralelo_open, release: paralelo_release };
/*Variables globales*/ Int paralelo_major =60;
LABORATORIO DE SISTEMAS ELECTRÓNICOS
CONTROLADOR PUERTO PARALELO DISPOSITIVOS == FICHEROS /dev
$ mknod /dev/paralelo c 60 0
LABORATORIO DE SISTEMAS ELECTRÓNICOS
9
CONTROLADOR PUERTO PARALELO
/*Inicio de módulo*/ Int init_module(void){ int result; //Registrando dispositivo result = register_chrdev(paralelo_major, “paralelo”, ¶lelo_fops); if (result < 0){ printk(“Fallo número mayor\n”); return result; }
LABORATORIO DE SISTEMAS ELECTRÓNICOS
CONTROLADOR PUERTO PARALELO
/* Disponibilidad de la región de memoria*/ port = check_region(0x378,1); if (port){ printk(“Fallo”); result = port; goto fallo; } printk(“Insertando módulo”); return 0; fallo: cleanup_module(); LABORATORIO DE SISTEMAS ELECTRÓNICOS
10
CONTROLADOR PUERTO PARALELO
/* Disponibilidad de la región de memoria*/ port = check_region(0x378,1); if (port){ printk(“Fallo”); result = port; goto fallo; } printk(“Insertando módulo”); return 0; fallo: cleanup_module(); LABORATORIO DE SISTEMAS ELECTRÓNICOS
CONTROLADOR PUERTO PARALELO
/* Disponibilidad de la región de memoria*/ port = check_region(0x378,1); if (port){ printk(“Fallo”); result = port; goto fallo; } printk(“Insertando módulo”); return 0; fallo: cleanup_module(); LABORATORIO DE SISTEMAS ELECTRÓNICOS
11
CONTROLADOR PUERTO PARALELO
/* Liberando el módulo*/ Void cleanup_module(void) { //Liberamos el número mayor unregister_chrdev(paralelo_major, “paralelo”);
//Liberamos el puerto if (!port) release_region(0x378,1); printk(“Quitando módulo”); } LABORATORIO DE SISTEMAS ELECTRÓNICOS
CONTROLADOR PUERTO PARALELO /* Abriendo el dispositivo como fichero*/ int paralelo_open(………) { MOD_INC_USE_COUNT; printk(“Abriendo”); return 1; } /* Abriendo el dispositivo como fichero*/ int paralelo_close(………) { MOD_DEC_USE_COUNT; printk(“Cerrando”); return 0; } LABORATORIO DE SISTEMAS ELECTRÓNICOS
12
CONTROLADOR PUERTO PARALELO /* Leyendo del dispositivo*/ int paralelo_read(………) { char par_buffer; par_buffer = inb(0x378); return 1; } /* Escribiendo en el dispositivo*/ int paralelo_write(………) { char par_buffer; outb(par_buffer,0x378); return 1; } LABORATORIO DE SISTEMAS ELECTRÓNICOS
FUNCIONES USUARIO-KERNEL Eventos
Funciones de usuarios
Carga de módulo
Funciones de kernel
insmod
init_module
Abrir dispositivo
fopen
File op: open
Leer dispositivo
fread
File op: read
Escribir dispositivo
fwrite
File op: write
Cerrar dispositivo
fclose
File op: release
Rmmod
cleanup_module
Quitar módulo
LABORATORIO DE SISTEMAS ELECTRÓNICOS
13
FUNCIONES KERNEL-HARDWARE
Eventos
Funciones del kernel
Leer datos Escribir datos
inb outb
LABORATORIO DE SISTEMAS ELECTRÓNICOS
APLICACIÓN FINAL int main(void){ unsigned char byte; FILE * puertopar; puertopar = fopen(“/dev/puertopar”,”w”); byte = 1; while(1){ fwrite(&byte,1,1,puertopar); sleep(1); byte