driver serie
Post on 01-Nov-2015
3 Views
Preview:
DESCRIPTION
TRANSCRIPT
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 1
Prctica 3COMUNICACIN SERIE RS-232
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 2
Introduccin a la prctica Gestin de Entrada/Salida del PC.
Anatoma de un manejador de dispositivo (driver) para Linux.
Nociones bsica de programacin
Enunciado de la prctica.
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 3
Entrada / Salida 2 espacios de direcciones:
uno para la E/S, otro para la memoria.=> juegos de instrucciones diferentes.
2 tipos de sincronismo de E/S: E/S por consulta de estado, E/S por interrupcin.
2 tipos de transferencia de E/S: Transferencia de bloques directo a
memoria(DMA). Transferencia programada.
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 4
Entrada/Salida (cont)
Instrucciones IN/OUT (lectura/escritura)En C: inb (puerto) y outb (valor,puerto).
Consulta de estado. Normalmente un bit de un puerto indica si est ocupado o terminado la operacin un dispositivo.
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 5
Control de Interrupciones
Puertos de E/S asociados: Maestro: 0x20 y 0x21
Esclavo:0xA0 y 0xA1
IRQ0...IRQ7=>8..15
IRQ8...IRQ15=>70h..77h
Interrupciones asociadas: Instrucciones tpicasEnviar el cdigo EOI:(0x20)
outp(0x20,0x20)
outp (0x20,0xA0)
Habilitar/Deshabiltar IRQ
outp(0, 0x21)
outp (0xFF, 0xA1)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 6
Estructura de un S.Ofd=open("/dev/cmos",O_RDONLY);read(fd,buffer,20);ioctl(fd,5);
PROGRAMA DE USUARIO
file_operations: read -> CMOS_lectura ioctl-> CMOS-ioctl
NCLEO DEL S.Odriver
Acceso a los puertos : inp , outp.Interrupciones IRQ.HARDWARE
dispositivos
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 7
Instalacin de un driver
Recompilacin del ncleo (kernel) Instalando un mdulo cargable.
1. Se compila con opciones especiales.2. Se utiliza el comando insmod para cargarlo en
memoria.3.Para descargarlo rmmod.Para obtener una lista de mdulos cargados actualesSe utiliza el comando lsmodLos pasos 1 y 2 los haremos con la ordenmake modA, make modB y el paso 3 con make limpia*
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 8
Anatoma del driver init_module:(Se ejecuta en la carga del mdulo)
Reservar recursos y establecer Rutina de Servicio de la Interrupcin.
cleanup_module:(Se ejecuta en la descarga del mdulo)Liberar recursos
file_operations:Establece la relacin entre las acciones dirigidas al dispositivos y las
funciones de l driver
request_region (BASE,8,NOMBRE_DRIVER);request_irq (IRQ,manipulador, SA_SHIRQ,NOMBRE_DRIVER,NULL);if(register_chrdev(MAJOR_DRIVER,NOMBRE_DRIVER,&func_serie)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 9
Operacin bsicasstatic struct file_operations func_serie ={
NULL, /* lseek */
leer_serie, /*read*/
escribir_serie, /*write*/
NULL, /*readdir*/
serie_poll, /*poll*/
serie_ioctl, /*ioctl*/
NULL, /*mmap*/
abrir, /*open*/
NULL,
cerrar, /*close*/
NULL,/*fsync*/
NULL,/*fassync*/
NULL,/*check_media_change*/
NULL, /*revalidate*/};
Abrir un dispositivo : usuario:fd=open(/dev/pr_serie,O_RDWR)
driver: Se ejecutar la funcin abrir.
Cerrar un dispositivo:
usuario: close(fd);
driver: Se ejecutar la funcin cerrar.
Leer/Escribir
usuario: read ( fd, buff,n) /write (fd,buff,n)
driver: leer_serie(filep,buff,n,ppos)
escribir_serie(filep,buff,n,ppos)
Ioctl
Usuario: ioctl (fd,arg);
driver: serie_ioctl(inode,f,i,l)// en i habr una copia del valor de arg.
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 10
Funciones tiles (cont) wake_up_interruptible e interruptible_sleep_on.
Para despertar y dormir un proceso hasta la llegada de una interrupcin.
wait_queueEs una estructura de datos donde estn almacenados los procesos dormidos.
static struct wait_queue *cola=NULL;void manipulador (int i,void *blah, struct pt_regs *regs){char iir;// printk ("Servicio de interrupcin \n");iir=sinp(UART_IIR); // sinp(UART_IIR) es igual inp(BASE+UART_IIR)
if (cola!=NULL) wake_up_interruptible(&cola);}
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 11
SincronismoSincronismo por consulta de estado
Sincronismo por interrupcin.
Ejecucin
Dormido Preparado
Finalizado
Nuevo
A CPU
Expulsin de
La CPU
Espera
a una
Interr
upci
n
(inter
rupt_s
leep_o
n)
Llegada de la Interrupcin
(wakeup_interruptible_on)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 12
Tratamiento de bitsEn el archivo linux/serial.h se define las siguiente constantes
- Registros:UART_(registro): p.e UART_LCR
-Mascaras: UART_(bit)_(registro) (...010...0) :p.e UART_DLAB_LCR 0x80 10000000
Complementar una mscara
~UART_(bit_(registro) (1..0...1): p.e ~UART_DLAB_LCR 0x7F 01111111
Consultar el bit i-simo
x & UART_(bit)_(registro) => (x7 ...x0)2 AND( ...010...) = (0..xi..0)
Poner a uno en el bit i-simo
x | UART_(bit)_ (registro) => (x7...x0)2 OR ( ...010...) = (...xi+1,1,xi-1...)
Poner a cero en el bit i-simo
X&~UART_(bit)_(registro) =>(x7 ...x0)2 AND ~( ...010...) = =>(x7 ...x0)2 AND ( ...101...) =(...xi+1,0,xi-1...)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 13
Nociones de CEl nombre de un vector especifica la direccin de comienzo.
Los pases por referencia en C consiste en pasar la direccin de la variable vector.
char buffer[20];
char fg;
scanf(%s,buffer); // Lee un cadena del teclado y la almacena en buffer
scanf (%c,&c); // Lee un carcter y lo almacena en la direccin &c
printf (%c %c,buffer[0],c); // visualiza en pantalla el primer carcter // de buffer y la variable c
La primera componente de un vector en C es el ndice 0.
El operando & es la direccin de una variable.
El operando * es el contenido de la direccin que le precede.
El operador [ ] indica el acceso a memoria de la direccin que le antecede ms el desplazamiento que hay en interior.
dato[3] es igual *(dato+3).
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 14
Funciones sinp y soutp
extern int port;static inline int sinp
(int offset){
return (inb (port+offset));}
static inline void soutp(int valor,int offset){outb (valor,port+offset);
}
Driverextern int fd;char sinp ( int puerto){char tmp[1];read(fd,tmp,puerto); return (tmp[0]);}void soutp (char valor,intpuerto){ char tmp[1];
tmp[0]=valor;write (fd,tmp,puerto);
}
Usuario
Slo se debe utilizar para el ejercicio 3
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 15
Interrupciones Serie
En el momento de atender una interrupcin, se tiene que resetear para permitir la activacin de otras. El origen vendr especificado en el registro UART_IIR.
ORIGEN RESET
- -
OE,PE,FE,BI (ver LSR) LEER LSR
Dato en RBR LEER RBR
THR vaco LEER IIR
CTS,DSR,RI,DCD (ver MSR) LEER MSR
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 16
Ejercicio 1ADQUISICIN EN EL ANALIZADOR LGICO DE LA
SEAL TRANSMISIN DE DATOS (TD)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 17
Ejercicio 2. PROGRAMACIN DE UN DRIVER PARA ACCESO A LA UART
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 18
Ejercicio 3PROGRAMA DE USUARIO QUE INTERCAMBIE MAYSCULAS
POR MINSCULAS Y VICERVERSA
Test2 ejA/B/C
driver 2 driver A/B/C
UART UART
COM 2 COM 1
cable
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 19
Ejercico 3 (cont)
-
F50 - Prctica 3: COMUNICACIN SERIE RS-232 20
Resto de ejercicios
EJERCICIO 5 PROGRAMAR UN DRIVER PARA ACCESO AL PUERTO SERIE DIRECTAMENTE CON SINCRONISMO POR INTERRUPCIN
EJERCICIO 4 PROGRAMAR UN DRIVER PARA ACCESO AL PUERTO SERIE DIRECTAMENTE CON SINCRONISMO POR CONSULTA DE ESTADO.
EJERCICIO 6 PROGRAMAR UN DRIVER PARA ACCESO AL PUERTO SERIE DIRECTAMENTE CON SINCRONISMO DE CONSULTA DE ESTADO MEJORADO CON LA FUNCIN DORMIR
top related