Comandos puertos I/O

Iniciado por cpu2, 4 Julio 2013, 11:05 AM

0 Miembros y 3 Visitantes están viendo este tema.

cpu2

Hola

En un tema anterior hable de como obtener valores del teclado a traves del puerto de entrada.
Ahora me gustaria intentar comunicarme con algun dispositivo mas complejo, pero el problema es que no se que comandos enviar o como comunicarme con el.

Aqui estan los del teclado y el raton.

http://www.win.tue.nl/~aeb/linux/kbd/scancodes-11.html

Tendra que a ver algo parecido para los distintos dispositivos no?

Unos cuantos dispositivos y sus puertos que saque de ioport.

1000-1003 : ACPI PM1a_EVT_BLK
1004-1005 : ACPI PM1a_CNT_BLK
1008-100b : ACPI PM_TMR
1010-1015 : ACPI CPU throttle
1020-1020 : ACPI PM2_CNT_BLK
1028-102f : ACPI GPE0_BLK
4000-40ff : 8139too
4400-44ff : PCI CardBus 0000:07
4800-48ff : PCI CardBus 0000:07
5000-5fff : PCI Bus 0000:02


Me interesan todos pero el que mas es 8139too, es el dispositivo ethernet. Cualquier ayuda es bienvenida.

Y ya que estoy les pregunto esto, se puede construir un paquete ya sea TCP, ICMP, UDP y enviarlo a traves del puerto ethernet, como la API send, connect etc...

Un saludo.

P.D: Siento las faltas de ortografia, teclado distinto.

cpu2

Este fragmento de codigo es una funcion de un controlador, sacado de ipxe.

/**************************************************************************
ETH_TRANSMIT - Transmit a frame
***************************************************************************/
static char padmap[] = {
0, 3, 2, 1};

static void t595_transmit(
struct nic *nic,
const char *d, /* Destination */
unsigned int t, /* Type */
unsigned int s, /* size */
const char *p) /* Packet */
{
register int len;
int pad;
int status;

#ifdef EDEBUG
printf("{l=%d,t=%hX}",s+ETH_HLEN,t);
#endif

/* swap bytes of type */
t= htons(t);

len=s+ETH_HLEN; /* actual length of packet */
pad = padmap[len & 3];

/*
* The 3c595 automatically pads short packets to minimum ethernet length,
* but we drop packets that are too large. Perhaps we should truncate
* them instead?
*/
if (len + pad > ETH_FRAME_LEN) {
return;
}

/* drop acknowledgements */
while(( status=inb(BASE + VX_W1_TX_STATUS) )& TXS_COMPLETE ) {
if(status & (TXS_UNDERRUN|TXS_MAX_COLLISION|TXS_STATUS_OVERFLOW)) {
outw(TX_RESET, BASE + VX_COMMAND);
outw(TX_ENABLE, BASE + VX_COMMAND);
}

outb(0x0, BASE + VX_W1_TX_STATUS);
}

while (inw(BASE + VX_W1_FREE_TX) < len + pad + 4) {
/* no room in FIFO */
}

outw(len, BASE + VX_W1_TX_PIO_WR_1);
outw(0x0, BASE + VX_W1_TX_PIO_WR_1); /* Second dword meaningless */

/* write packet */
outsw(BASE + VX_W1_TX_PIO_WR_1, d, ETH_ALEN/2);
outsw(BASE + VX_W1_TX_PIO_WR_1, nic->node_addr, ETH_ALEN/2);
outw(t, BASE + VX_W1_TX_PIO_WR_1);
outsw(BASE + VX_W1_TX_PIO_WR_1, p, s / 2);
if (s & 1)
outb(*(p+s - 1), BASE + VX_W1_TX_PIO_WR_1);

while (pad--)
outb(0, BASE + VX_W1_TX_PIO_WR_1); /* Padding */

        /* wait for Tx complete */
        while((inw(BASE + VX_STATUS) & S_COMMAND_IN_PROGRESS) != 0)
                ;
}


Las definiciones son en hex estan en un .h, como puedo saber todas esas especificaciones de mi tarjeta, hay algun libro o algo completo sobre esta programacion?

Algo entiendo, pero me gustaria saber como funciona del todo, estoy algo quemado.

Un saludo.

eferion

Eso es algo que te tiene que proporcionar el fabricante... el que fabrica la tarjeta es el que conoce todos los entresijos de dicha tarjeta.

Otra opción es usar ( si la tarjeta dispone de esta posibilidad ) del protocolo estándar para el caso, por ejemplo el de comunicación por usb o el de las tarjetas gráficas... no podrás obtener toda la potencia del hardware usando este mecanismo pero desde luego la programación será más sencilla y estará mejor documentada.

cpu2

Cita de: eferion en 18 Julio 2013, 13:34 PM
Eso es algo que te tiene que proporcionar el fabricante... el que fabrica la tarjeta es el que conoce todos los entresijos de dicha tarjeta.

Buscare en la web del fabricante, en algunos codigos se hace referencia de algunos documentos sobre eso mismo.

Cita de: eferion en 18 Julio 2013, 13:34 PMOtra opción es usar ( si la tarjeta dispone de esta posibilidad ) del protocolo estándar para el caso, por ejemplo el de comunicación por usb o el de las tarjetas gráficas... no podrás obtener toda la potencia del hardware usando este mecanismo pero desde luego la programación será más sencilla y estará mejor documentada.

Pues no lose, si con estandar te refieras a dispositivos como el teclado que todos se controlan a traves de los puertos 0x60 y 0x64, buscare documentacion sobre la tarjeta grafica y el usb, si tienes algo pasalo pero que no sea un link de la primera pagina de google. Pero esta claro de que esa funcion no esta hecha con ese estandar que comentas.

Como dije anteriormente el codigo lo entiendo bastante, ya que es un C muy puro, lo que no entiendo son los puertos y los valores que usa, para comunicarse, es esa la informacion que busco.

Un saludo.

eferion

Desgraciadamente no dispongo de esa documentación... no me dedico a programar a ese nivel.

Lo que está claro que a no ser que el fabricante te proporcione el datasheet de la tarjeta, donde se detallará toda la información que necesitas, te toca patearte foros en inglés para ir recabando información.

También puede ser que esos datasheet tengas que comprarlos, como te digo, desconozco como está el mercado en este tema.

cpu2

Ya e leido el datasheet de mi tarjeta, una imagen del chip con los pins enumerados, y al lado su simbolo, despues hay tablas con los pins su simbolo y la descripcion.

Cita de: eferion en 21 Julio 2013, 00:29 AMLo que está claro que a no ser que el fabricante te proporcione el datasheet de la tarjeta, donde se detallará toda la información que necesitas, te toca patearte foros en inglés para ir recabando información.

Aunque no te dediques a esta programacion, sabes de algun buen foro especializado en estos temas?

Un saludo.

eferion

Cita de: cpu2 en 22 Julio 2013, 21:16 PM
Ya e leido el datasheet de mi tarjeta, una imagen del chip con los pins enumerados, y al lado su simbolo, despues hay tablas con los pins su simbolo y la descripcion.

Y no dice nada de las operaciones de lectura / escritura sobre la tarjeta ??

si no es así ya te digo yo que el datasheet que tienes o no está completo o tiene que haber otro por con esa parte de la documentación.

Es como si el datasheet de una USART no te dijese cual es la forma de enviar y/o recibir información.

cpu2

Esto es lo que encontre, no puedo descargarlos desde la pagina de realtek, ya que tengo que ser socio.

No es una 3c595 si no una rtl8168, tambien hay unos diagramas pero nada de codigo, ni de puertos ni nada por el estilo.

http://www.datasheetarchive.com/RTL8168-datasheet.html

A ver si puedes echarme un cable.

Un saludo.

eferion

Lo que estás mirando es el datasheet del chip... no el de la tarjeta.

En la tarjeta que tienes el chip al que se refiere el datasheet estará rodeado por otros componentes electrónicos que se encargan de configurar y dar vida al dispositivo.

El datasheet de un chip no entiende de interrupciones y puertos por la sencilla razón de que un chip, por si solo, nunca hace nada util... necesita una configuración externa de hardware para cumplir la tarea de una forma determinada... y es ese hardware externo el que determina si tu tarjeta responde a una interrupción determinada o si te va a devolver datos en el puerto X.

Los diagramas que ves se corresponden con la configuración eléctrica de las señales ( los tiempos y frecuencias ) que se dan ( o se han de dar ) para un correcto funcionamiento del chip.

Por lo que he visto ese chip es para una tarjeta ethernet... Quizás debieras mirar información sobre comunicación con sockets vía ensamblador... supongo que las tarjetas ethernet tendrán todas una interfaz común... si no la tienen entonces es bastante posible que sea el sistema operativo el que te proporcione esa interfaz común y se encargue él de comunicarse con la tarjeta.

cpu2

Cita de: eferion en 24 Julio 2013, 09:14 AMPor lo que he visto ese chip es para una tarjeta ethernet... Quizás debieras mirar información sobre comunicación con sockets vía ensamblador...

Te refieres a la API del sistema, socket, connect etc...

Cita de: eferion en 24 Julio 2013, 09:14 AMsupongo que las tarjetas ethernet tendrán todas una interfaz común... si no la tienen entonces es bastante posible que sea el sistema operativo el que te proporcione esa interfaz común y se encargue él de comunicarse con la tarjeta.

Puede ser, estoy leyendo algunos codigos del nucleo y los controladores tienen en comun estas librerias y estructuras.

mbuf - Kernel memory management for networking protocols.
ifnet -  Kernel interface for manipulating network interfaces.

Tendre que mirar mejor esos dos apartados. Ya te comentare algo gracias por la ayuda.

Un saludo.