πŸš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #9036

Re: Programacion E/S C.

#9036
From: Lepton
Date: Sun, 15 Sep 2002 15:08
74 lines
3506 bytes
On Sun, 15 Sep 2002, Juan Carlos wrote:

# Buenas grupo.
#
# Estoy esperimentando con una targeta de E/S y esto un poco pez en C, he
# visto ejemplos de programacion para targetas con puerta 8255 pero se
# escapan a mi comprension. Y no es el caso de la mia.
# Tene un simple comparador de 8 bits y en teoria 16 entradas y 16 salidas.
# La targeta utiliza las seΓ±ales iow, ior, aen, el bus de datos y direcciones
# A0-A9. Sigiendo las pistas de la placa pienso que se encuentra en el rango
# E/S 0x301.
#
# Este es el programilla que me he currado para acceder a esa direccion,
# basandome en un articulo sobre RTLinux y loque he podido ir averiguando
# sobre sintaxis de C en revistas.
#
# /*
# Es necesario ser root UID=0 para poder ejecutarlo sin errores.
# Parametros compilacion:
# gcc -O2 linux_io.c
# Compilar con:
# gcc -O2 -o lector lector.c
# */
# #include <asm/io.h>
# #include <time.h>
# #include <stdio.h>
# #include <sched.h>
# main(){
#    unsigned char temp;
#    unsigned char entr;
#    int i;
#    struct sched_param prio;
#         // Proceso Linux de tiempo real.
#         prio.sched_priority = 10;
#         sched_setscheduler(0, SCHED_FIFO, &prio);
#         for (i=0; i<255; i++) {
#         ioperm(0x301,2,1);
#                 temp = i;
#                 printf("%d\\",temp);
#                 scanf("%d",&temp);

Al loro aqui, ya que 'temp' esta definido como un 'char', que normalmente
ocupa 8 bits (un byte), mientras que scanf() piensa que 'temp' es un 'int',
que en Linux suele ser de 32 bits (4 bytes), asi que es posible que
sobreescribas algun dato importante de la memoria..

#                 outb(temp,0x301);
#                 entr = inb(0x301);
#                 printf("%d\n",entr);
#         }
# }
#
# Compila bien y se ejecuta pero no vale pa naaa.
#
# He soldado un led a la salida del comparador 74ls688 y mi impresion es que a
# la targeta no le llegan esas operaciones de E/S. He leido algo acerca de
# tiempos de espera en buses lentos como el ISA.
#
# Me puede decir algien como se hace eso en C?

No conozco la tarjeta en cuestion, ni se demasiado de programacion
hardware en Linux, pero no se si fuera del kernel se puede usar inb()
y outb().

Lo ideal seria hacer un modulo para el kernel que implemente un
dispositivo en modo caracter (/dev/mi_tarjeta, por ejemplo), y que
tu programa se limitara a leer y escribir en el dispositivo (abriendolo
con open())

Lepton.
Technical Details
Message-ID: <Pine.LNX.4.44.0209151705140.12169-100000@lorien.local>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!newsmi-us.news.garr.it!newsmi-eu.news.garr.it!NewsITBone-GARR!fu-berlin.de!uni-berlin.de!c-134-121-22.d.dial.de.ignite.NET!not-for-mail
References: <QP%g9.154$ma5.1878@news-reader.eresmas.com>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,e0ac740fba5fcb07
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2002-09-15 08:47:23 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!newsmi-us.news.garr.it!newsmi-eu.news.garr.it!NewsITBone-GARR!fu-berlin.de!uni-berlin.de!c-134-121-22.d.dial.de.ignite.NET!not-for-mail
From: Lepton <reinob@jazzfree.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Programacion E/S C.
Date: Sun, 15 Sep 2002 17:08:47 +0200
Lines: 76
Message-ID: <Pine.LNX.4.44.0209151705140.12169-100000@lorien.local>
References: <QP%g9.154$ma5.1878@news-reader.eresmas.com>
NNTP-Posting-Host: c-134-121-22.d.dial.de.ignite.net (62.134.121.22)
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=X-UNKNOWN
Content-Transfer-Encoding: QUOTED-PRINTABLE
X-Trace: fu-berlin.de 1032104842 2203639 62.134.121.22 (16 [130846])
X-Orig-Path: localhost!reinob
In-Reply-To: <QP%g9.154$ma5.1878@news-reader.eresmas.com>