Linux

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

5 downloads 109 Views 859KB Size

Story Transcript

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(void) { printk(“Adios amigos\n”); } LABORATORIO DE SISTEMAS ELECTRÓNICOS

MI PRIMER CONTROLADOR algo.c __KERNEL__ #define MODULE #include

int init_module(void){ printk(“Hola mundo\n”); return 0; } void cleanup_module(void) { printk(“Adios amigos\n”); } LABORATORIO DE SISTEMAS ELECTRÓNICOS

5

MI PRIMER CONTROLADOR algo.c __KERNEL__ #define MODULE #include #include

module_init(mi_inicio); module_exit(mi_final);

LABORATORIO DE SISTEMAS ELECTRÓNICOS

MI PRIMER CONTROLADOR algo.c __KERNEL__ #define MODULE #include

int init_module(void){ printk(“Hola mundo\n”); return 0; } void cleanup_module(void) { printk(“Adios amigos\n”); } LABORATORIO DE SISTEMAS ELECTRÓNICOS

6

FUNCIONES USUARIO-KERNEL Eventos

Funciones de usuarios

Carga de módulo

Funciones de kernel

insmod

init_module

rmmod

cleanup_module

Abrir dispositivo Leer dispositivo Escribir dispositivo Cerrar dispositivo Quitar módulo

LABORATORIO DE SISTEMAS ELECTRÓNICOS

CONTROLADOR PUERTO PARALELO • OCUPA TRES BYTES DE MEMORIA • DIRECCIÓN PRIMER BYTE 0x378 • ÚNICAMENTE PRIMER BYTE: SALIDAS

LABORATORIO DE SISTEMAS ELECTRÓNICOS

7

CONTROLADOR PUERTO PARALELO

__KERNEL__ #define MODULE #include #include #include #include #include

LABORATORIO DE SISTEMAS ELECTRÓNICOS

CONTROLADOR PUERTO PARALELO

/*Declaración de funciones*/

int paralelo_open(struct inode *inode, struct file *filp); int paralelo_release(struct inode *inode, struct file *filep); ssize_t paralelo_read(struct file *filep, char *buf, size_t count, loof_t *f_pos); ssize_t paralelo_write(struct file *filep, const char *buf, size_t count, loof_t *f_pos); void cleanup_module(void); LABORATORIO DE SISTEMAS ELECTRÓNICOS

8

CONTROLADOR PUERTO PARALELO

/*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

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.