implementación de una interfase de red utilizando un ...148.206.53.84/tesiuami/uami11012.pdf ·...

67
Ciencias Básicas e Ingeniería Departamento de Ingeniería Eléctrica Implementación de una Interfase de Red utilizando un Sistema Mínimo Tesis que presentan los Alumnos: Rubén Aguirre Zurita Roberto Gómez Hernández Para la obtención de el grado de Licenciatura en Ingeniería Electrónica en Computación Asesor: Prof. Alexander Ekzhanov Marzo del 2004

Upload: trandat

Post on 03-Oct-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Ciencias Básicas e Ingeniería

Departamento de Ingeniería Eléctrica

Implementación de una Interfase de Red utilizando un Sistema Mínimo

Tesis que presentan los Alumnos:

Rubén Aguirre Zurita Roberto Gómez Hernández

Para la obtención de el grado de Licenciatura en Ingeniería Electrónica en Computación

Asesor:

Prof. Alexander Ekzhanov

Marzo del 2004

Índice

Interfaz de Red 68000 – CS8900 1

ÍNDICE GENERAL.

1 INTRODUCCIÓN...............................................................................................................5

1.1 Una visión sobre el desarrollo de la tecnología ........................................................5

1.2 Motivación y Ubicación del Contexto........................................................................6

1.3 Descripción de Proyecto y Propuesta.......................................................................7

2 IMPLEMENTACIÓN DE HARDWARE .............................................................................8

2.1 La tarjeta UAM68K ...................................................................................................8 2.1.1 Disponibilidad.................................................................................................................... 8 2.1.2 Descripción del sistema mínimo y Características ........................................................... 8 2.1.3 Funcionamiento................................................................................................................. 9 2.1.4 Puertos de Expansión ..................................................................................................... 10

2.2 La tarjeta CrystalLan 8900...................................................................................... 11 2.2.1 Disponibilidad.................................................................................................................. 11 2.2.2 Descripción del Chip CS8900 y Características ............................................................. 11 2.2.3 Conectores de la tarjeta .................................................................................................. 12 2.2.4 Funcionamiento del CS8900........................................................................................... 13

2.3 Interconexión entre UAM68K y CrystalLan 8900.................................................... 14 2.3.1 Adaptación de Hardware................................................................................................. 14 2.3.2 Modo de Acceso al CS8900............................................................................................ 16 2.3.3 Diagramas de Tiempos ................................................................................................... 16

3 IMPLEMENTACIÓN DE SOFTWARE ............................................................................18

3.1 Descripción General de la Implementación ............................................................ 18

3.2 Modelo de Capas de Red....................................................................................... 19 3.2.1 Capa Física ..................................................................................................................... 19 3.2.2 Capa de Enlace............................................................................................................... 20 3.2.3 Capa de Red ................................................................................................................... 20 3.2.4 Capa de Transporte ........................................................................................................ 20

3.3 Acceso al CS8900 .................................................................................................. 21 3.3.1 Escritura en los registros................................................................................................. 21 3.3.2 Lectura de registros ........................................................................................................ 21

Índice

Interfaz de Red 68000 – CS8900 2

3.3.3 Acceso al PacketPage .................................................................................................... 22

3.4 Programación ......................................................................................................... 23 3.4.1 Definición de Constantes ................................................................................................ 23 3.4.2 Inicialización de sistema ................................................................................................. 23 3.4.3 Envío de paquetes de Red.............................................................................................. 24

3.4.3.1 ARP............................................................................................................. 24 3.4.3.2 ICMP........................................................................................................... 24 3.4.3.3 UDP ............................................................................................................ 25

4 RESULTADOS................................................................................................................26

4.1 Introducción............................................................................................................ 26

4.2 Pruebas .................................................................................................................. 27 4.2.1 Comenzando con el sistema mínimo.............................................................................. 27 4.2.2 Verificación de la tarjeta CrystalLan 8900 ...................................................................... 28 4.2.3 Interconexión de tarjetas................................................................................................. 28 4.2.4 Lectura de Registros del CS8900 ................................................................................... 28 4.2.5 Transmisión de paquetes de red..................................................................................... 28 4.2.6 Recepción de paquetes .................................................................................................. 29

5 CONCLUSIONES............................................................................................................30

5.1 Experiencia adquirida ............................................................................................. 30

5.2 Trabajo futuro. ........................................................................................................ 30

6 BIBLIOGRAFÍA...............................................................................................................31

7 ANEXOS .........................................................................................................................32

7.1 Chip CS8900 .......................................................................................................... 32 7.1.1 Arquitectura..................................................................................................................... 32 7.1.2 Modo I/O ......................................................................................................................... 33 7.1.3 Configuración de Transmisión ........................................................................................ 33 7.1.4 Transmisión Individual de Paquetes ............................................................................... 34

7.2 Sistema Mínimo UAM68K....................................................................................... 36 7.2.1 Componentes.................................................................................................................. 36 7.2.2 El microprocesador. ........................................................................................................ 37 7.2.3 El generador de reloj, circuito de RESET, controlador de interrupciones y NMI. ........... 38 7.2.4 El decodificador de direcciones. ..................................................................................... 39

Índice

Interfaz de Red 68000 – CS8900 3

7.2.5 La memoria EPROM. ...................................................................................................... 40 7.2.6 La RAM. .......................................................................................................................... 40 7.2.7 El adaptador de comunicaciones serie (UART). ............................................................. 41

7.3 RFC de Protocolos ................................................................................................. 46

7.4 IO_8900.H .............................................................................................................. 47

7.5 IO_8900.C .............................................................................................................. 52

7.6 PROTOCOL.C........................................................................................................ 55

7.7 P1.C ....................................................................................................................... 63

7.8 IO_PPP.C ............................................................................................................... 65

Índice

Interfaz de Red 68000 – CS8900 4

ÍNDICE DE TABLAS TABLA 1: MAPA DE MEMORIA DE LA TARJETA UAM68K ..................................................................... 9 TABLA 2: DIRECCIONES DE LOS PUERTOS PARA LECTURA Y ESCRITURA DE LA TARJETA

UAM68K ..................................................................................................................................................... 9 TABLA 3: CONFIGURACIÓN DE DIRECCIONAMIENTO DE LA TARJETA CRYSTALLAN 8900 .....11 TABLA 4: CONFIGURACIÓN DE LOS PINES DE SALIDA DEL PUERTO P0 (BUS DIRECCIONES Y

CONTROL) ...............................................................................................................................................15 TABLA 5: CONFIGURACIÓN DE LOS PINES DE ENTRADA DEL PUERTO P0 (INTERRUPCIONES

DEL CS8900) ............................................................................................................................................15 TABLA 6: CONFIGURACIÓN DE LOS PINES DE SALIDA DEL PUERTO P1 (BUS DE DATOS) ........15 TABLA 7: CONFIGURACIÓN DE LOS PINES DE ENTRADA DEL PUERTO P2 (BUS DE DATOS) ....15 TABLA 8: TIEMPOS DE ACCESO AL CS8900 PARA ESCRITURA EN MODO I/O ................................16 TABLA 9: TIEMPOS DE ACCESO AL CS8900 PARA LECTURA EN MODO I/O....................................17 TABLA 10: PACKETPAGE MEMORY ADDRESS MAP..............................................................................32 TABLA 11: I/O MODE MAPPING...................................................................................................................33 TABLA 12: PHYSICAL INTERFACE CONFIGURATION ...........................................................................33 TABLA 13: TRANSMITTING INTERRUPT CONFIGURATION FOR REGISTER 7, TXCFG .................34 TABLA 14: TX COMMAND CONFIGURATION FOR REGISTER 9, TXCMD .........................................34

ÍNDICE DE ILUSTRACIONES ILUSTRACIÓN 1: PUERTOS DE EXPANSIÓN DE LA TARJETA UAM68K ............................................10 ILUSTRACIÓN 2: TARJETA CRYSTALLAN 8900 ......................................................................................12 ILUSTRACIÓN 3: ESQUEMA DE CONEXIONES ........................................................................................14 ILUSTRACIÓN 4: DIAGRAMA DE TIEMPOS DE ACCESO AL CS8900 PARA ESCRITURA EN MODO

I/O ..............................................................................................................................................................16 ILUSTRACIÓN 5: DIAGRAMA DE TIEMPOS DE ACCESO AL CS8900 PARA LECTURA EN MODO

I/O ..............................................................................................................................................................17 ILUSTRACIÓN 6: MODELO DE CAPAS DE RED........................................................................................19 ILUSTRACIÓN 7: CONFIGURACIÓN DE UNA TRAMA ETHERNET......................................................20 ILUSTRACIÓN 8: ACCESO AL PACKETPAGE ...........................................................................................22 ILUSTRACIÓN 9: MENU DE AYUDA DEL SISTEMA MONITOR ............................................................27 ILUSTRACIÓN 10: EJEMPLO DE MONITOREO DE PAQUETES DE RED CON ETHEREAL...............29 ILUSTRACIÓN 11: CS8900 DEVELOPMENT BOARD................................................................................35 ILUSTRACIÓN 12: TARJETA UAM68K........................................................................................................36 ILUSTRACIÓN 13: PROCESADOR 68000 DE MOTOROTA.......................................................................37 ILUSTRACIÓN 14: DECODIFICADOR DE DIRECCIONES DE LA TARJETA UAM68K .......................39 ILUSTRACIÓN 15: MEMORIAS RAM Y ROM DE LA TARJETA UAM68K ............................................40 ILUSTRACIÓN 16: PUERTOS SERIALES UART RS232 DE LA TARJETA UAM68K.............................41 ILUSTRACIÓN 17: DIAGRAMA ESQUEMÁTICO DE LA TARJETA UAM68K (1) ................................43 ILUSTRACIÓN 18: DIAGRAMA ESQUEMÁTICO DE LA TARJETA UAM68K (2) ................................44 ILUSTRACIÓN 19: DIAGRAMA ESQUEMÁTICO DE LA TARJETA UAM68K (3) ................................45

Introducción

Interfaz de Red 68000 – CS8900 5

1 Introducción 1.1 Una visión sobre el desarrollo de la tecnología

Se ha observado en la historia de todas las culturas de la humanidad el desarrollo de

tecnologías que han servido para crear herramientas. Estas herramientas a su vez se utilizan para mejorar el trabajo y optimizar el aprovechamiento de los recursos. Al parecer se crea un ciclo donde a partir del desarrollo de una tecnología aparecen nuevas necesidades y en consecuencia herramientas nuevas que sirven de base para desarrollos subsecuentes de tecnología. De acuerdo a las tendencias de los últimos años en que la tecnología a avanzado a pasos agigantados, el uso de los equipos de computo y de comunicaciones que antes se veían como tecnologías independientes, ahora se han fusionado creando una gran cantidad de aplicaciones. Una de las que ha tenido mayor crecimiento en todo el mundo es el uso de las redes de computo, en particular el uso del Internet. Con el solo echo de existir, el Internet crea nuevas necesidades y como era de esperarse nuevas tecnologías y nuevas herramientas. Inicialmente el uso de éste estaba reservado para fines científicos y militares (en Estados Unidos). En la actualidad el uso se ha generalizado para todo el mundo, de manera que se puede acceder a éste desde los lugares más recónditos del planeta. Existe una gran cantidad de aplicaciones y herramientas que funcionan sobre este nuevo medio que se ha convertido en la revolución de la época, donde las distancias se acortan y las comunicaciones se realizan de forma más rápida y económica. Hace algunos años podía parecer ficción el hecho de hacer compras, enviar mensajes de correo en algunos instantes a cualquier parte del mundo, o conocer gente de todo planeta sin salir de casa. Hoy en día podemos consultar las noticias diariamente por Internet, ver paginas de deportes, bajar música, etc. La tecnología de comunicaciones ha avanzado como base para el crecimiento de Internet, logrando velocidades de transmisión que permiten el desarrollo de aplicaciones como: videoconferencias, chats, telefonía VoIP (voz sobre IP), MediaStream (video y audio a “tiempo real” en demanda), Radio en Internet, etc. Hemos observado que la tendencia de esta tecnología se dirige hacia el desarrollo de equipo que no dependa de una computadora. Es decir, que por si solo tenga acceso a la red y sin la supervisión de nadie, como por ejemplo: los teléfonos y conmutadores de voz sobre IP, las cámaras de video con acceso vía red, inclusive los nuevos refrigeradores que se conectan a Internet para hacer compras en los supermercados a través de las tiendas virtuales.

Introducción

Interfaz de Red 68000 – CS8900 6

1.2 Motivación y Ubicación del Contexto

Actualmente la mayoría de las aplicaciones que se desarrollan en nuestro país son aplicaciones de software. Esto es debido a que resulta más económico adquirir una computadora con la cual se pueda programar que conseguir las herramientas necesarias para el desarrollo de hardware. En consecuencia, para las nuevas generaciones es menos fácil encontrar quien los asesore para este tipo de desarrollos, a demás del atraso tecnológico que en nuestro país parece ser cada vez mayor. El desarrollo de tecnología es vital para los países, y más en esta época en que la globalización y los monopolios de tecnologías nos orillan a la importación de productos y equipos, y a la adopción de tecnologías extranjeras. En la universidad hay diversos proyectos en los cuales muchos estudiantes trabajan. Creemos que una parte de estos proyectos solamente sirven como tramite para la obtención del titulo y no tienen gran relevancia. Lo que nuestro país necesita es gente creativa y comprometida que participe en proyectos de verdadera importancia y utilidad. El motivo principal que nos lleva al desarrollo de este proyecto es el de adquirir un conocimiento mas profundo sobre los sistemas digitales y las redes teleinformáticas, así como la programación de sistemas, que en estos momentos son los principales pilares para el desarrollo de nuevas tecnologías. Este conocimiento nos permitirá en un futuro ser parte de desarrolladores de tecnología en el país. Por esto es de gran importancia para nosotros como estudiantes universitarios conscientes de las necesidades del país.

Introducción

Interfaz de Red 68000 – CS8900 7

1.3 Descripción de Proyecto y Propuesta El proyecto consiste en la Implementación de una interfase entre un sistema digital mínimo y un adaptador de red ethernet. Dicha implementación requiere tanto de adaptaciones de hardware para la conexión entre las tarjetas como del desarrollo de un controlador de software que configure el sistema y realice las operaciones de transferencia de datos. Para esto es necesario adquirir una tarjeta de desarrollo ensamblada con el chip ethernet CS8900 que permita realizar las pruebas necesarias. También se utiliza un sistema mínimo que funcione como host y que nos permita el acceso al CS8900. El sistema mínimo utilizado está basado en el procesador 68000 de Motorota con el cual ya tenemos cierta experiencia. Se elige el lenguaje C de programación por ser fácilmente portable a diferentes plataformas de hardware, esto quiere decir que el código que se compila para el microprocesador 68000 podría compilarse para un microcontrolador PIC por ejemplo con un mínimo de modificaciones y obtener los mismos resultados. Con este proyecto queremos proporcionar una base para el desarrollo de sistemas de hardware que trabajen sobre el protocolo Ethernet y que permita a otros alumnos implementar aplicaciones a partir de ésta base. En principio el proyecto es parte de un proyecto mas general sobre el desarrollo de una cámara con acceso remoto a través de una red ethernet. Hay una gran cantidad de aplicaciones que se pueden desarrollar a partir de esta base: Ruteadores, Cámaras con acceso desde Internet, telefonía, sistemas de vigilancia y monitoreo, control de dispositivos remotos, etc.

Implementación de hardware

Interfaz de Red 68000 – CS8900 8

2 Implementación de hardware 2.1 La tarjeta UAM68K

2.1.1 Disponibilidad

Diseñado por el profesor Alexander Ekzhanov quien nos ha proporcionado una tarjeta para el desarrollo de este proyecto, debemos advertir que no tenemos conocimiento sobre la disponibilidad de este prototipo.

2.1.2 Descripción del sistema mínimo y Características

El prototipo del sistema mínimo UAM68K tiene como propósito servir de base experimental para apoyo de practicas de laboratorio en los cursos de Sistemas Digitales I, II y III. El prototipo está basado en el microprocesador de Motorola 68000. Es un procesador de 32 bits, con arquitectura CISC clásica, introducido por Motorola en 1982. Tiene bus de datos de 16 bits, bus de direcciones de 24 bits, interfaces de bus síncrono (compatible con la familia 6800) y asíncrono, 16 registros de propósito general de 32 bits (8 de datos y 8 de dirección o auxiliares), y frecuencia de reloj de 8 a 16 MHz, según el tipo. La familia 68000 se ha hecho muy popular gracias a su arquitectura simétrica, buenas prestaciones, robustez y precio razonable. Durante muchos años los procesadores de esta familia y arquitectura se utilizaban en las computadoras personales Apple, Atari, Amiga, HP. Actualmente se sigue fabricando el 68000, y se sigue utilizando en sistemas de control industrial. También el 68000 sirve como base para enseñanza en las carreras de electrónica digital en muchas universidades (cabe mencionar la de Stanford y la Universitat Politécnica de Catalunya).

El prototipo cuenta con memoria EPROM (64k), memoria RAM estática (de 16 a 256k), 1 o 2 puertos serie RS-232, 6 puertos paralelos (3 de salida y 3 de entrada), timer de 16 bits, una memoria EEPROM serie de hasta 256 bytes, controlador de interrupciones, y conectores de expansión del bus compatibles con los del analizador lógico TLA715. Puede funcionar con la frecuencia de reloj principal de 4 a 16 MHz. El sistema está montado sobre el circuito impreso de tamaño 7” x 7.9”, de dos capas con las interconexiones metalizadas (thru-hole), con la tecnología clase 3 (8 mil track, 20 mil via). En el anexo 6.2 Sistema Mínimo UAM68K, se puede consultar mas información sobre este prototipo.

Implementación de hardware

Interfaz de Red 68000 – CS8900 9

2.1.3 Funcionamiento El prototipo tiene el siguiente mapa de memoria, deducible fácilmente del diagrama del circuito: Operation Address range Signal Cont Read 0..03FFFF /CSROM EPROM Read/Write 100000..17FFFF /CSRAM RAM Read/Write 200000..27FFFF /CSPORT PORTS Read/Write 280000..2FFFFF /CSUART UART Tabla 1: Mapa de memoria de la tarjeta UAM68K

En la zona de UART se puede seleccionar efectivamente 16 direcciones utilizando señales A1..A4 según el mapa de registros de UART, lo que corresponde al rango 280000..28001F. Ya que el bus de datos de UART está conectado a la parte baja del bus de datos del micro, los registros del UART tendrán direcciones impares si se direccionan como bytes, y direcciones pares en caso de words. La zona de puertos (/CSPORT) se subdivide luego en las siguientes: Operation Address range Signal Cont Read 220000..220001 /RPORT0 In port 0 Write 220000..220001 /WPORT0 Out port 0 Read 220002..220003 /RPORT1 In port 1 Write 220002..220003 /WPORT1 Out port 1 Read 220004..220005 /RPORT2 Exp In port 2 Write 220004..220005 /WPORT2 Exp Out port 2 Read 220006..220007 /RPORT3 Exp In port 3 Write 220006..220007 /WPORT3 Exp Out port 3 Tabla 2: Direcciones de los puertos para lectura y escritura de la tarjeta UAM68K

Implementación de hardware

Interfaz de Red 68000 – CS8900 10

2.1.4 Puertos de Expansión

Los puertos de expansión son tiras de pines dobles que se conectan utilizando conectores para cable plano. Los conectores de bus de direcciones (JP1..JP3) y de datos (JP4, JP5) son de 8x2 con una tira conectada a tierra, lo que los hace compatibles con las sondas del analizador lógico TLA715 para facilitar el montaje. Las señales de control (JP6), los puertos (JP7..JP9) y la expansión buferizada de 8 bits de bus de datos (JP10) utilizan conectores de 10x2. Los conectores de puertos tienen, además, las redes de alimentación conectadas, para facilitar la alimentación de los circuitos de expansión.

Ilustración 1: Puertos de expansión de la tarjeta UAM68K

Implementación de hardware

Interfaz de Red 68000 – CS8900 11

2.2 La tarjeta CrystalLan 8900

2.2.1 Disponibilidad

Esta tarjeta se puede adquirir así como otros modelos similares en www.edtp.com donde tienen una variedad de tarjetas para desarrollo mayormente enfocados a aplicaciones de red.

2.2.2 Descripción del Chip CS8900 y Características

Es un controlador Ethernet de bajo costo optimizado para bus ISA. Tiene un diseño de alta integración que elimina la costosa necesidad de utilizar componentes externos. El CS8900 incluye RAM, Filtros de transmisión y recepción para 10BaseT, y una interfase directa para el bus ISA con drivers de 24 mA. A demás de la alta integración, el CS8900 ofrece un amplio rango de funciones y opciones de configuración. Su arquitectura única de PacketPage se adapta automáticamente a los cambiantes patrones de trafico en la red. El resultado es un sistema altamente eficiente y una carga mínima al CPU. En la Ilustración 11: CS8900 Development Board, se puede observar el diagrama de la tarjeta de donde se deduce la siguiente configuración de direccionamiento:

SA0

SA1

SA2

SA3

SA4

SA5

SA6

SA7

SA8

SA9

SA10

SA11

SA12

SA13

SA14

SA15

SA16

SA17

SA18

SA19

x x x x 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0

Tabla 3: Configuración de direccionamiento de la tarjeta CrystalLan 8900

Los pines SA0 – SA3 son los que quedan libres y permiten direccionar 16 localidades. De aquí se observa que la dirección base inicial es: SA19 .......................................................... SA0 En binario: 0000 0000 0011 0000 0000 b En hexadecimal: 0 0 3 0 0 h y la dirección final es: SA19 .......................................................... SA0 En binario: 0000 0000 0011 0000 1111 b En hexadecimal: 0 0 3 0 F h

Implementación de hardware

Interfaz de Red 68000 – CS8900 12

2.2.3 Conectores de la tarjeta En la tarjeta se observan 4 tiras de conectores de 8 pines cada una. Es fácilmente deducible la configuración de sus conectores contando de derecha a izquierda:

1. Líneas de datos (SD0 – SD7) 2. Líneas de datos (SD8 – SD15)1 3. Líneas de Control (AEN, /IOR, /IOW, INTRQ0) 4. Líneas de dirección (SA0 – SA3) y SBHE

Ilustración 2: Tarjeta CrystalLan 8900

Los conectores GND y VTG son los conectores de Tierra y Alimentación respectivamente El pin /SBHE selecciona el modo de 16 / 8 bits de transferencia de datos. En esta tarjeta, el pin /SBHE esta fijo a VCC, de manera que las transferencias siempre se realizan en modo de 8 bits.

1 Los pines SD8 – SD15 están conectados a tierra.

Implementación de hardware

Interfaz de Red 68000 – CS8900 13

2.2.4 Funcionamiento del CS8900 La Arquitectura del CS8900 está basada en un método altamente eficiente de acceso a registros internos y buffers de memoria llamado PacketPage. Este provee una forma de controlar el CS8900 en espacios de memoria o I/O que minimiza la carga al CPU y simplifica el software. En la Tabla 10: PacketPage Memory Address Map, se pueden ver algunos de los registros del PacketPage. El centro de esta arquitectura es la memoria RAM integrada que se usa para guardar temporalmente los frames de transmisión y recepción, y para registros internos. El acceso a esta memoria se hace directamente en modo de memoria ó indirectamente en modo I/O En modo I/O, la memoria del PacketPage es accedida a través de 8 puertos de 16 bits que están mapeados en 16 localidades contiguas en el espacio I/O. El modo I/O es la configuración inicial del CS8900 y siempre está habilitado. La dirección I/O base predeterminada es la 0x300h. Ver Tabla 11: I/O Mode Mapping Para la Transmisión Individual de Paquetes, en cualquier momento que el host tenga un paquete para transmitir, este debe emitir un Transmit Request al CS8900 que consiste de las siguientes 4 operaciones en el orden que se muestra:

• Escribir un comando de transmisión en el registro TxCMD (PacketPage base + 144h). El contenido del registro TxCMD puede ser read back desde el registro TxCMD (Registro 9)

• Escribir el tamaño del frame en el registro TxLength (PacketPage base + 146h) • Leer el registro BusST (Registro 18) hasta que el buffer de transmisión esté disponible • Escribir en el registro de transmisión el frame configurado

La información escrita en el registro TxCMD le indica al CS8900 como se transmitirá el siguiente frame. Para cada transmisión individual, el host debe emitir un Transmit Request completo. Mas aun, el host debe escribir en el registro TxCMD antes de cada transmisión de paquete, incluso si el contenido del registro TxCMD no cambia. Esto de debe hacer tanto en espacio de memoria como en espacio de E/S para indicar el inicio de una transmisión. En la Tabla 14: Tx Command Configuration for Register 9, TxCMD, se muestran los comandos de transmisión.

Implementación de hardware

Interfaz de Red 68000 – CS8900 14

2.3 Interconexión entre UAM68K y CrystalLan 8900

2.3.1 Adaptación de Hardware Para trabajar con estas dos tarjetas se implementa la siguiente interfaz:

CrystalLan 8900Development Board

UAM68K Sistema Minimo Digital

Ethernet

PC ejecutando Ethereal(analizador de paquetes de red)

PC ejecutando HyperTerminal(Sistema Monitor de la tarjeta UAM68K)

Interfaz serial RS232

BUS de Datos, Direcciones y Control(interfaz UAM68K - CrystalLan 8900)

Ilustración 3: Esquema de conexiones

Implementación de hardware

Interfaz de Red 68000 – CS8900 15

Se utilizan los puertos PORTB(1) y PORTA(0) de la tarjeta UAM68K-2 para acceder al chip ethernet CS8900 en modo I/O . El PORTA(0) se utiliza para las líneas de dirección y control del chip 8900 A0-A3, /AEN, /IOR, /IOW , P1DIR de salida y IRQ0 de entrada.

OUT 7 OUT 6 OUT 5 OUT 4 OUT 3 OUT 2 OUT 1 OUT 0 A3 A2 A1 A0 P1DIR /AEN /IOW /IOR

Tabla 4: Configuración de los pines de salida del puerto P0 (Bus Direcciones y Control)

IN 7 IN 6 IN 5 IN 4 IN 3 IN 2 IN 1 IN 0 IRQ0

Tabla 5: Configuración de los pines de entrada del puerto P0 (interrupciones del CS8900)

Como el bus de datos del CS8900 es bidireccional, es necesario implementar una adaptación hacia el PORTB(1): Se conectan juntos los pines de entrada y salida del PORTB(1) con los pines bidireccionales del conector de datos de la tarjeta CrystalLan 8900. El P1DIR se utiliza para configurar el puerto PORTB(1) en modo de entrada o de salida para los datos. Si P1DIR=0, el PORTB(1) esta en modo de salida. El PORTB(1) se utiliza como bus de datos D0-D7.

OUT 7 OUT 6 OUT 5 OUT 4 OUT 3 OUT 2 OUT 1 OUT 0 D7-OUT D6-OUT D5-OUT D4-OUT D3-OUT D2-OUT D1-OUT D0-OUT

Tabla 6: Configuración de los pines de salida del puerto P1 (Bus de datos)

IN 7 IN 6 IN 5 IN 4 IN 3 IN 2 IN 1 IN 0 D7-IN D6-IN D5-IN D4-IN D3-IN D2-IN D1-IN D0-IN

Tabla 7: Configuración de los pines de entrada del puerto P2 (Bus de datos)

El bus de datos del CS8900 es bidireccional, por lo cual se conectan juntos los pines de entrada y de salida del PORTB(1) y por lo tanto es necesario utilizar el P1DIR. /AEN Address Enable P1DIR Dirección de los datos del PORTB(1) (0 = salida, 1 = entrada). /IOR Lectura en modo I/O /IOW Escritura en modo I/O IRQ0 Petición de Interrupción (se genera en el CS8900).

Implementación de hardware

Interfaz de Red 68000 – CS8900 16

2.3.2 Modo de Acceso al CS8900

Existen dos modos de operación del CS8900: El modo de memoria y el modo de I/O. El modo de acceso al CS8900 utilizado es el modo de I/O debido a que las líneas de direccionamiento para el modo de memoria es mayor a las líneas de direccionamiento del microprocesador 68000. A demás que la tarjeta CrystalLan 8900 está fabricada con la configuración en modo I/O que es la predeterminada del chip. Cuando se configura en modo I/O, el CS8900 se accede a través de 8 puertos de 16 bits mapeados en 16 localidades contiguas en el espacio I/O del host. Para una operación de lectura o escritura en modo I/O, el pin AEN debe bajarse y la dirección I/O debe coincidir en el espacio de direcciones del CS8900. Para lectura debe bajarse el /IOR, y para escritura el /IOW.

2.3.3 Diagramas de Tiempos

Tabla 8: Tiempos de acceso al CS8900 para escritura en modo I/O

Ilustración 4: Diagrama de Tiempos de acceso al CS8900 para escritura en modo I/O

Implementación de hardware

Interfaz de Red 68000 – CS8900 17

Tabla 9: Tiempos de acceso al CS8900 para Lectura en modo I/O

Ilustración 5: Diagrama de tiempos de acceso al CS8900 para lectura en modo I/O

Implementación de software

Interfaz de Red 68000 – CS8900 18

3 Implementación de software 3.1 Descripción General de la Implementación

En primer instancia es necesario acceder al CS8900 por lo que se necesitan las funciones

básicas de lectura y escritura a los puertos que hacen interfaz con la tarjeta de red. Estas funciones se desarrollan en ensamblador para el 68000 por cuestiones de tiempos de acceso (es más rápido ensamblador que C ). Una vez que las funciones básicas de acceso al CS8900 están funcionando, se implementan las funciones de acceso a los registros del PacketPage del CS8900 para poder realizar la configuración del mismo y la transmisión de paquetes. Las funciones de transmisión básicamente envían los datos de un arreglo previamente organizado con la trama de datos algún protocolo especifico hacia el registro de transmisión del CS8900. Después de esto, el CS8900 se encarga de formar la trama ethernet y del envió a través de la red. La configuración de los paquetes dependen del protocolo con el cual se va a transmitir:

• Los datagramas del protocolo UDP están contenidos en tramas IP por lo que es necesario agregar las cabeceras IP y UDP.

• En las tramas del protocolo ARP solo se incluye la cabecera IP En el Anexo PROTOCOL.C se encuentran el código para generar paquetes ICMP, ARP y UDP

Implementación de software

Interfaz de Red 68000 – CS8900 19

3.2 Modelo de Capas de Red

Como en la mayoría de los sistemas, los protocolos de red se implementan a partir de un modelo de capas. El modelo OSI (Open Systems Interconnection) de telecomunicaciones esta basado en una propuesta desarrollada por la organización de estándares internacional (ISO), por lo que también se le conoce como modelo ISO - OSI. Su función es la de definir la forma en que se comunican los sistemas abiertos de telecomunicaciones, es decir, los sistemas que se comunican con otros sistemas. El modelo de referencia consiste en 7 capas. Estas capas se visualizan generalmente como un montón de bloques apilados o en ingles como un "stack of blocks", por lo que a esto se le conoce como el "OSI Protocol Stack".

Ilustración 6: Modelo de capas de Red

3.2.1 Capa Física

La capa física comprende todo referente al hardware: características eléctricas, tipos de medio físico, tiempos de transmisión, etc. En el manual del 8900 se encuentran todas estas características con mas detalle.

Implementación de software

Interfaz de Red 68000 – CS8900 20

3.2.2 Capa de Enlace

La capa de Enlace es implementada en este caso por el Chip 8900. Ésta comprende la creación de la trama Ethernet que será transmitida de acuerdo al siguiente esquema:

Ilustración 7: Configuración de una trama Ethernet

3.2.3 Capa de Red

El Nivel de Red está formado por: El protocolo IP ( IPv4, IPv6), los protocolos de control ( ICMP, ARP, RARP, BOOTP, DHCP, IGMP) y los protocolos de routing (RIP, OSPF, IS-IS, IGRP, EIGRP, BGP). El protocolo IP es el encargado de hacer circular el mensaje hacia el equipo destino. Funciona en modo datagramas (no fiable). Es decir, no se garantiza la entrega de los paquetes ni su llegada en el orden de envío.

3.2.4 Capa de Transporte Esta capa la componen dos protocolos principalmente TCP y UDP. El protocolo TCP ofrece servicios Orientados a Conexión con entrega fiable de datagramas ya que dispone de mecanismos de confirmación de entrega. Además se dice que es multiplexado, porque puede mantener varias conversaciones a la vez. El protocolo UDP ofrece servicios sin conexión y no fiable; no se garantiza la entrega correcta de paquetes. Se emplea en aplicaciones que no requieran fiabilidad, como transmisión de sonido o video, donde es más importante la velocidad. Para este proyecto las capas de sesión, presentación y aplicación no se desarrollan ya que competen a desarrolladores de aplicaciones específicas de cada uno.

Implementación de software

Interfaz de Red 68000 – CS8900 21

3.3 Acceso al CS8900

3.3.1 Escritura en los registros La secuencia para el acceso de escritura al chip CS8900 utilizando un registro temporal del 68000 es la siguiente:

• Se resetea el puerto de direcciones y control P1 escribiendo FFh en su dirección. • Se escribe en el registro temporal, la dirección del registro que se quiere escribir • Se hace un corrimiento de 4 bits de la dirección debido a la configuración del puerto (las

líneas de dirección corresponden al nible alto) • Se baja el bit del puerto P1 correspondiente al P1DIR activando el modo OUTPUT • Se baja el bit del registro temporal correspondiente al AEN • Se envía el contenido del registro temporal al puerto P1 indicando la dirección del registro

del CS8900 y el inicio de una transferencia de datos (con AEN abajo) • Repitiendo el proceso del registro temporal, se baja /IOW • Se escribe el dato en el puerto P0 (D0-D3) • Repitiendo el proceso del registro temporal, se sube /IOW y AEN indicando el fin de la

transferencia.

3.3.2 Lectura de registros La lectura de un registro requiere un proceso similar al de una escritura, enviar secuencial mente el direccionamiento y los datos de acuerdo al orden de las líneas de dirección y datos en los puertos. La secuencia para el acceso de escritura al chip CS8900 utilizando un registro temporal del 68000 es la siguiente:

• Sé resetea el puerto de direcciones y control P1 escribiendo FFh en su dirección. • Se escribe en el registro temporal, la dirección del registro que se quiere leer • Se hace un corrimiento de 4 bits de la dirección debido a la configuración del puerto (las

líneas de dirección corresponden al nible alto) • Se deja en alto el bit del puerto P1 correspondiente al P1DIR activando el modo INPUT • Se baja el bit del registro temporal correspondiente al AEN • Se envía el contenido del registro temporal al puerto P1 indicando la dirección del registro

del CS8900 y el inicio de una transferencia de datos (con AEN abajo) • Repitiendo el proceso del registro temporal, se baja /IOR • Se leen los datos del puerto P0 (D0-D3) • Repitiendo el proceso del registro temporal, se sube /IOR y AEN indicando el fin de la

transferencia.

Implementación de software

Interfaz de Red 68000 – CS8900 22

3.3.3 Acceso al PacketPage

El PacketPage Pointer es un registro-puntero que sirve para acceder a los demás registros mapeados en la memoria interna del CS8900 con ayuda de los Registros PacketPage Data (Port 0 y Port 1). La secuencia para el acceso a los registros del PacketPage utilizando las funciones básicas de acceso a los 8 registros en modo I/O del CS8900 es la siguiente:

• se escribe en el PacketPage Pointer la dirección de algún registro del PacketPage • Se realiza la operación de Lectura o Escritura en los registros PacketPage Data (Port 0) y

PacketPage Data (Port 1).

0000h Product Identification Code

Packet Page Memory

PacketPage Pointer

PacketPage Data (Port 0)

PacketPage Data (Port 1)

I/O Mode Mapping

Receive/Transmit Data (Port 0)

2 Bytes

2 Bytes

0A00h Transmit Frame Location

PacketPage Address

Ilustración 8: Acceso al PacketPage

De esta manera se accede a todos los registros del PacketPage para configurar los modos de operación, la dirección MAC y demás parámetros de transmisión, buffers, etc.

Implementación de software

Interfaz de Red 68000 – CS8900 23

3.4 Programación

3.4.1 Definición de Constantes

Se utilizan definiciones de constantes para que el código sea mas claro y entendible. Pensando también que en algún momento puede ser necesario cambiar la dirección de algún puerto, o dirección IP por ejemplo, que se utilizan muchas veces en el código modificando solamente el valor de la constante.

En el Anexo IO_8900.H, se encuentran las definiciones para el CS8900. En este se muestran las definiciones de:

• Puertos en modo I/O del CS8900 (8 puertos o registros) • Offsets para el Pointer del PacketPage (acceso a los registros) • Direcciones IP y MAC • Comandos de configuración, transmisión y recepción • Posiciones de la cabecera del paquete tanto de recepción como de transmisión • Tipos de protocolo, hardware y opciones de cada protocolo

3.4.2 Inicialización de sistema

El modulo de inicialización crea los apuntadores necesarios para la utilización de los puertos P0 y P1 que son la interfase entre el sistema mínimo y el adaptador de red. También establece los valores iniciales de los registros de configuración del CS8900: modo de operación, configuración del buffer de transmisión y recepción, control de Bus, control de línea (10BaseT), full duplex, generador de interrupciones en recepción, etc. A demás establece la dirección MAC del chip. La configuración del CS8900 es la siguiente:

• LineCtl 0x0013 set to 10BaseT • TestCtl 0x4019 set to Full Duplex • RxCfg 0x0103 Enable RxOk Interrupt (interrupción en recepción) • RxCtl 0x0D05 Enable Broadcast, accepts frames with correct CRC • TxCfg 0x8FC7 Enable transmition, collision interrupt • BusCtl 0x8017 Enable IRQ

En el Anexo IO_8900.C se encuentra el código de inicialización y configuración del sistema.

Implementación de software

Interfaz de Red 68000 – CS8900 24

3.4.3 Envío de paquetes de Red

3.4.3.1 ARP

El protocolo ARP asocia las direcciones físicas de Hardware a cada dirección IP lógica asignada a una interfaz de red. La dirección MAC (Media Access Control) es un identificador de Hardware único asignado por el fabricante. Las MAC se adjuntan a las cabeceras de IP origen y destino a manera de identificar la dirección IP mas la MAC de un sistema remoto. Las MAC contienen 48 bits de longitud y son únicas, es un componente superior de la Capa de Enlace del modelo OSI. Los sistemas de red local LAN usan ARP para descubrir su propia dirección física y la de los sistemas vecinos. En el Anexo PROTOCOL.C, se encuentra la configuración de una trama ARP utilizada en las pruebas.

3.4.3.2 ICMP

El protocolo ICMP (Internet Control Message Protocol) es un mecanismo que informa de la aparición de errores en la manipulación de los datagramas. Siempre que un router detecte un error o excepción en un datagrama, utiliza el protocolo ICMP para informar al host origen de la circunstancia. ICMP no realiza ninguna acción para corregir el error que se haya producido, solamente se encarga de comunicarlo al host origen para que éste realice las acciones oportunas para corregir el error. Inicialmente, ICMP fue diseñado como un protocolo para los routers, sin embargo los hosts también lo pueden utilizar. El comando “ping” es la herramienta por excelencia para comprobación de conectividad a nivel de red. Con ayuda de ping podremos determinar si el nivel de red funciona adecuadamente, así como los niveles físico y de enlace sobre los que descansa. Ya hemos dicho que Ping para IP utiliza los mensajes "echo request" y "echo reply" del protocolo ICMP (Internet Control Message Protocol) para comprobar la conectividad con sistemas remotos. El emisor crea un paquete ICMP "echo request" y registra la hora de envío de la petición. El sistema destino devuelve al emisor un paquete ICMP "echo reply". Cuando la respuesta llega se comparan los tiempos de envío y recepción y se calcula el RTT (round-trip time, tiempo de ida y vuelta). Este tiempo generalmente viene calculado en milisegundos. Si no llega la respuesta tras una cantidad x de milisegundos (tiempo conocido como timeout), el paquete se marca como no respondido. En el Anexo PROTOCOL.C, se encuentra la programación de la trama ICMP utilizada para generar un ping request desde la el sistema 68000 – CS8900 hacia la computadora de pruebas.

Implementación de software

Interfaz de Red 68000 – CS8900 25

3.4.3.3 UDP

El Protocolo de Datagrama de Usuario (UDP), es un protocolo no confiable y no orientado a conexión para la entrega de mensajes discretos. En este caso los paquetes enviados mediante el protocolo IP reciben el nombre específico de datagramas, y estos se envían y ya está; no se realiza una conexión definida entre los hosts ni un control de los paquetes enviados y recibidos. Los datagramas se rutean independientemente, por lo que deben llevar la dirección completa de destino. Este protocolo se describe en el RFC 768 - Protocolo de Datagrama de Usuario. Es simple, eficiente e ideal para aplicaciones como el TFTP y el DNS. Una dirección IP sirve para dirigir el datagrama hacia una máquina en particular, y el numero de puerto de destino en la cabecera UDP se utiliza para dirigir el datagrama UDP a un proceso especifico en dicha máquina. La cabecera UDP también contiene un numero de puerto origen que permite al proceso receptor saber como responder al datagrama.

Es por ello un protocolo del tipo best-effort (máximo esfuerzo), porque hace lo que puede para transmitir los datagramas hacia la aplicación, pero no puede garantizar que la aplicación los reciba.

Tampoco utiliza mecanismos de detección de errores. Cuando se detecta un error en un datagrama, en lugar de entregarlo a la aplicación destino, se descarta.

Cuando una aplicación envía datos a través de UDP, éstos llegan al otro extremo como una unidad. Por ejemplo, si una aplicación escribe 5 veces en el puerto UDP, la aplicación al otro extremo hará 5 lecturas del puerto UDP. Además, el tamaño de cada escritura será igual que el tamaño de las lecturas.

En el Anexo PROTOCOL.C, se encuentra la programación de un datagrama UDP utilizado para el envío de un mensaje de texto desde el sistema 68000 – CS8900 hacia la computadora de pruebas.

Resultados

Interfaz de Red 68000 – CS8900 26

4 Resultados 4.1 Introducción

Durante el desarrollo del proyecto se realizan diferentes pruebas en varias etapas:

• En primer instancia se ensambla el sistema mínimo UAM68K. Para este ensamble se adquieren los componentes necesarios: el microprocesador 68000 de motorota, el reloj del sistema, el decodificador de direcciones, las memorias RAM y ROM, y los buffers para los puertos de expansión. El montaje de los componentes se realiza colocando bases plásticas en los correspondientes espacios para cada chip, los componentes tales como resistencias, y capacitares no utilizan bases plásticas. Una vez montadas las bases, se comprueba primeramente el funcionamiento del reloj del sistema y el circuito de Reset. Después de esto se montan los circuitos.

• Para comenzar a utilizar el sistema mínimo se requiere de un programa monitor desarrollado

específicamente para este sistema. El programa monitor se graba en las memorias ROM del sistema localizado en el área de inicio para el arranque del procesador. El funcionamiento de este se verifica con la ayuda de la aplicación HyperTerminal de Windows que realiza la comunicación serial RS232 con el sistema mínimo y permite interactuar con éste escribiendo y leyendo datos de sus puertos, revisando su registros, y haciendo la depuración del sistema en general.

• Una vez verificado el sistema mínimo, se implementa todo el esquema de depuración para

poder realizar las pruebas con la tarjeta CrystalLan 8900. Para esto se utiliza un simulador del procesador 68000 con capacidad de depuración paso a paso y monitoreo de puertos y direcciones de memoria, también cuenta con watches de variables y de snack. Cabe mencionar que uno de los mayores problemas en la depuración de los programas de prueba es el hecho de que no hay manera de conocer con precisión los datos existentes en los registros del CS8900 para tener alguna referencia inicialmente2 ya que el simulador no simula el chip CS8900.

2 Existen algunos registros en el CS8900 que su contenido está predefinido de fabrica. Estos se utilizaron como referencia inicial para verificar las funciones de lectura iniciales.

Resultados

Interfaz de Red 68000 – CS8900 27

4.2 Pruebas

4.2.1 Comenzando con el sistema mínimo

Para utilizar el sistema mínimo se necesita el programa monitor del sistema, este nos permite interactuar con el sistema de manera similar al sistema operativo de una computadora. El programa monitor se opera basado en comandos y parámetros que se interpretan en el sistema y se ejecutan. Hay básicamente dos tipos de comandos: de lectura y de escritura, ya sea de registros internos del procesador o de direcciones de memoria o puertos. También se pueden cargar programas al sistema y ejecutarlos.

Ilustración 9: Menu de Ayuda del Sistema Monitor

De esta manera se realizan las pruebas de acceso de lectura y escritura con los puertos de expansión para así implementar el esquema de conexiones necesario parar la comunicación con el CS8900. Estas pruebas se realizan implementando un pequeño analizador de estados con LEDs y una protoboard.

Resultados

Interfaz de Red 68000 – CS8900 28

4.2.2 Verificación de la tarjeta CrystalLan 8900

Solo para estar seguros de que la tarjeta funciona, se le aplica el voltaje de alimentación, y se observan los LEDs indicadores de conexión que se encienden. Aunque no es aseguro que funcione correctamente en su totalidad, es un inicio satisfactorio.

4.2.3 Interconexión de tarjetas

Las pruebas de conexión básicamente se realizan verificando la continuidad de corriente de las líneas de datos, control y direcciones, revisando minuciosamente los diagramas para que no exista ningún error. Una vez que se ha verificado que las conexiones son correctas comenzamos con las pruebas de acceso al chip CS8900.

4.2.4 Lectura de Registros del CS8900

Las pruebas iniciales de acceso al CS8900 se realizan de manera incierta. Esto es debido a que los registros del chip que contienen datos predefinidos de fabrica y que sirven de referencia se encuentran en la memoria del PacketPage, y a los cuales se accede mediante una serie de escrituras para el posicionamiento del PacketPage Pointer y lecturas de los registros PacketPage Data Ports. Estas pruebas nos conducen a la creación de una secuencia de accesos en modo I/O que permiten la lectura y escritura de los registros del PacketPage del CS8900.

4.2.5 Transmisión de paquetes de red

Para realizar estas pruebas, se configura un arreglo que contiene la trama IP definida por nosotros para los diferentes protocolos que utilizamos: ARP, ICMP, UDP. Las pruebas iniciales de transmisión se realizan transmitiendo desde el sistema UAM68K – CS8900. Esto es básicamente por que es más fácil saber si el sistema está transmitiendo, ya que el analizador de paquetes de red muestra cada paquete enviado, y como la conexión de red es punto a punto, los únicos paquetes que se observan son los que transmite el sistema.

Resultados

Interfaz de Red 68000 – CS8900 29

Ilustración 10: Ejemplo de Monitoreo de paquetes de Red con Ethereal

Las primeras transmisiones se realizan con el protocolo ARP, con las cuales se observa la respuesta de la PC al intentar resolver la dirección IP del CS8900. Luego se transmiten paquetes ICMP (ping request) observando la respuesta de la PC que envía su contestación a sistema UAM68K – CS8900. Finalmente se realizan pruebas con el protocolo UDP, que permite enviar un mensaje de texto a la PC.

4.2.6 Recepción de paquetes

Las recepciones realizadas con el sistema presentan algunos errores, al parecer el problema ocurre al momento de leer el buffer de recepción del CS8900. Esto se detecta al analizar los paquetes de red, los cuales aparecen correctamente en el analizador de paquetes, pero al momento de leer el buffer se observan caracteres que no coinciden con el paquete original. En este punto es donde concluyen las pruebas del proyecto quedando pendiente la correcta recepción de paquetes de red.

Conclusiones

Interfaz de Red 68000 – CS8900 30

5 Conclusiones. 5.1 Experiencia adquirida

Al concluir las pruebas con este proyecto (el cual creemos requiere más tiempo en su

realización para lograr algo más interesante) se obtuvo experiencia a cerca del diseño de circuitos impresos de doble cara, en la implementación de puertos adicionales para el procesador 68000, aprendiendo algo mas acerca de los protocolos de Red, así como la utilización de analizadores de red, y en el funcionamiento de chips de Red como el CS8900. Adicionalmente se obtuvo conocimiento y mayor experiencia en la programación de sistemas y simulación de los mismos utilizando lenguajes fácilmente portables como C. También se optimizaron rutinas en el lenguaje ensamblador que permitieron acceder con los tiempos requeridos al chip CS8900.

5.2 Trabajo futuro.

Creemos que el desarrollo de este proyecto puede ayudar a quienes deseen retomarlo teniendo ya alguna base de conocimiento del chip CS8900, y puedan implementar mas protocolos que permitan utilizar el sistema para aplicaciones de más alto nivel, programando directamente sistemas de las capas superiores del modelo OSI. Quien desee continuar con el proyecto, no está obligado a utilizar los mismos chips y tarjetas. Básicamente se utiliza un sistema mínimo que bien se puede implementar con un procesador intel 8080, con el 68000 de motorota o con algún otro microprocesador o microcontrolador. También se puede utilizar algún chip similar al CS8900 como interfaz ethernet.

Bibliografía

Interfaz de Red 68000 – CS8900 31

6 Bibliografía

• MANUAL CS8900 (disco anexo) • http://laryc.uam.mx/~ezhn/ (manuales, compiladores, descripción del MC6800, etc.) • http://www.embeddedethernet.com/ • http://www.embeddedethernet.com/appnotes/PIC-crystal.asm (driver programado para un

PIC16C74) • http://www.solont.com/z-net/tcp-06/tcp_06.htm (protocolo ARP y Mascaras de Control de

acceso al Medio) • http://antonio_gallego.tripod.com/apuntes/ping.html (protocolo ICMP ping) • http://www.htmlweb.net/redes/tcp_ip/capa_4/transporte_2.html (protocolo UDP) • http://www.dte.upct.es/personal/manuel.jimenez/docencia/GD6_Comunic_Ind/pdfs/Tema

5.pdf • http://www.geocities.com/txmetsb/el_modelo_de_referencia_osi.htm (Capas de Red).

Anexos

Interfaz de Red 68000 – CS8900 32

7 Anexos 7.1 Chip CS8900

7.1.1 Arquitectura

La Arquitectura del CS8900 está basada en un método altamente eficiente de acceso a registros internos y buffers de memoria llamado PacketPage. Este provee una forma de controlar el CS8900 en espacios de memoria o I/O que minimiza la carga al CPU y simplifica el software.

Packet Page Address

# of Bytes

Type Description Cross Reference

Bus Interface Registers 0000h 4 Read-only Product Identification Code Section 4.3 0004h 28 - Reserved Note 2 0020h 2 Read/Write I/O Base Address Sections 4.3 4.10 0022h 2 Read/Write Interrupt Number (0,1,2 or 3) Sections 3.2 4.3 0024h 2 Read/Write DMA Channel Number(0,1, or 2) Sections 3.2 4.3 0026h 2 Read-only DMA Start of Frame Sections 4.3 5.4 0028h 2 Read-only DMA Frame Count (12 bits) Sections 4.3 5.4 002Ah 2 Read-only RxDMA Byte Count Sections 4.3 5.4 002Ch 4 Read/Write Memory Base Address Register (20 bit) Sections 4.3 4.9 0030h 4 Read/Write Boot PROM Base Address Sections 3.6 4.3 0034h 4 Read/Write Boot PROM Address Mask Sections 3.6 4.3 0038h 8 - Reserved Note 2 0040h 2 Read/Write EEPROM Command Sections 3.5 4.3 0042h 2 Read/Write EEPROM Data Sections 3.5 4.3 0044h 12 - Reserved Note 2 0050h 2 Read-only Received Byte Counter Sections 4.3 5.2.9 0052h 174 - Reserved Note 2

Status and Control Register 0100h 32 Read/Write Configuration & Control Registers (2 bytes per register) Section 4.4 0120h 32 Read-only Status & Event Registers (2 bytes per register) Section 4.4 0140h 4 - Reserved Note 2

Initiate Transmit Registers 0144h 2 Write-only TxCMD(transmit command) Sections 4.5, 5.7 0146h 2 Write-only TxLength(transmit length) Sections 4.5, 5.7 0148h 8 - Reserved Note 2

Address Filter Registers 0150h 8 Read/Write Logical Address Filter (hash table) Sections 4.6, 5.3 0158h 6 Read/Write Individual Address Sections 4.6, 5.3 015Eh 674 - Reserved Note 2

Frame Location 0400h 2 Read-only RxStatus (receive status) Sections 4.7, 5.2 0402h 2 Read-only RxLength (receive length, in bytes) Sections 4.7, 5.2 0404h 2 Read-only Receive Frame Location Sections 4.7, 5.2 0A00h 2 Read/Write Transmit Frame Location Sections 4.7, 5.7

Tabla 10: PacketPage Memory Address Map

Anexos

Interfaz de Red 68000 – CS8900 33

El centro de esta arquitectura es la memoria RAM integrada que se usa para guardar temporalmente los frames de transmisión y recepción, y para registros internos. El acceso a esta memoria se hace directamente en modo de memoria ó indirectamente en modo I/O.

7.1.2 Modo I/O En este modo, la memoria del PacketPage es accedida a través de 8 puertos de 16 bits que están mapeados en 16 localidades contiguas en el espacio I/O. El modo I/O es la configuración inicial del CS8900 y siempre está habilitado. La dirección I/O base es la 0x300h. 0000h Read/Write Receive/Transmit Data (Port 0) 0002h Read/Write Receive/Transmit Data (Port 1) 0004h Write-only TxCMD (Transmit Command) 0006h Write-only TxLength (Transmit Length) 0008h Read-only Interrupt Status Queue 000Ah Read/Write PacketPage Pointer 000Ch Read/Write PacketPage Data (Port 0) 000Eh Read/Write PacketPage Data (Port 1)

Tabla 11: I/O Mode Mapping

7.1.3 Configuración de Transmisión Después de cada reset, el CS8900 debe configurarse para la operación de transmisión. De las opciones que hay que configurar con la interfase física y los eventos de transmisión que causan interrupciones. Configuración de la interfase física: Hay que seleccionar cual interfase Ethernet se va a activar (10BaseT o AUI), y habilitar la transmisión lógica para transmisión serial. Esta configuración se hace vía el registro LineCTL (Registro 13) Bit Bit Name Operation 7 SerTxON When set, transmission enabled. 8 AUIonly When set, AUI selected, when clear, 10BaseT selected. 9 AutoAUI/10BT When set, automatic interface selection enabled. B Mod BackoffE When set, the modified back off algorithm is used. When clear, the standard

back off algorithm is used. D 2-partDefDis When set, two-part deferral is disabled.

Tabla 12: Physical Interface Configuration

Selección de los Eventos que Causan Interrupción: El registro 7 (TxCFG) y el registro B (BufCFG) se usan para determinar cuales eventos de transmisión causaran interrupciones al procesador del host.

Anexos

Interfaz de Red 68000 – CS8900 34

Bit Bit Name Operation 6 Loss-of-CRSiE When set, there is an interrupt whenever the CS8900 fails to detect Carrier

Sense alter transmitting the preamble (applies to the AUI only) 7 SQEerroriE When set, there is an interrupt whenever there is an SQE error. 8 TxOKiE When set, there is an interrupt whenever a frame is transmitted successfully 9 Out-of-windowiE When set, there is an interrupt whenever a late collision is detected. A JabberiE When set, there is an interrupt whenever there is a jabber condition. B AnycolliE When set, there is an interrupt whenever there is a collision. F 16colliE When set, there is an interrupt whenever the CS8900 attempts to transmit a

single frame 16 times.

Tabla 13: Transmitting Interrupt Configuration for Register 7, TxCFG

7.1.4 Transmisión Individual de Paquetes En cualquier momento que el host tenga un paquete para transmitir, este debe emitir un Transmit Request al CS8900 que consiste de las siguientes 3 operaciones en el orden exacto que se muestra:

1. El host debe escribir un comando de transmisión en el registro TxCMD (PacketPage base + 144h). El contenido del registro TxCMD puede ser read back desde el registro TxCMD (Registro 9)

2. El host debe escribir el tamaño del frame en el registro TxLength (PacketPage base + 146h) 3. El host debe leer el registro BusST (Registro 18)

La información escrita en el registro TxCMD le dice al CS8900 como va a transmitir el siguiente frame. Bit Bit Name Operación 6 7 Tx Start Clear Clear Start preamble after 5 bytes have been transferred to the CS8900 Clear Set Start preamble after 381 bytes have been transferred to de CS8900 Set Clear Start preamble after 1021 bytes have been transferred to the CS8900 Set Set Start preamble after entire frame has been transferred to the CS8900 8 Force When set, the CS8900 discards any frame data currently in the transmit buffer. 9 Onecoll When set, the CS8900 will not attempt to re-transmit any packet after a collision C InhibitCRC When set, the CS8900 will not attempt to re-transmit any packet after a collision D TxPadDis When set, the CS8900 will not add pad bits to short frames

Tabla 14: Tx Command Configuration for Register 9, TxCMD

Para cada transmisión individual, el host debe emitir un Transmit Request completo. Mas aun, el host debe escribir en el registro TxCMD antes de cada transmisión de paquete, incluso si el contenido del registro TxCMD no cambia. Esto de debe hacer tanto en espacio de memoria como en espacio de E/S.

Anexos

Interfaz de Red 68000 – CS8900 35

Ilustración 11: CS8900 Development Board

Anexos

Interfaz de Red 68000 – CS8900 36

7.2 Sistema Mínimo UAM68K

7.2.1 Componentes

Ilustración 12: Tarjeta UAM68K

Casi todos los componentes de lógica discreta utilizados en el prototipo tienen encapsulado DIP y se montan sobre bases. Algunos chips pueden montarse directamente ya que es poco probable que requieran cambio. Independientemente de las indicaciones en los diagramas, se puede utilizar la lógica discreta de cualquier tecnología. Las series LS y HCT son las más comunes. Es preferible utilizar la serie LS o ABT para los puertos de salida ya que tienen mayor capacidad de salida (hasta 20 mA a nivel lógico 0, contra las 6 mA de HCT). En los capacitores polarizados (C1, C2, C5 – C9, C18) hay que respetar la polaridad, el orificio con el metalizado cuadrado corresponde al positivo (+). Para los LEDs y el diodo (D1 – D3) el pin 1 (cuadrado) corresponde al ánodo.

Anexos

Interfaz de Red 68000 – CS8900 37

No es necesario montar todos los componentes desde principio. Para el curso de Sistemas Digitales I, por ejemplo, es suficiente con montar solamente el microprocesador, el generador de reloj, el decodificador de direcciones, la EPROM, la RAM, y uno de los puertos paralelos. Las indicaciones al respeto se las dará el profesor en el desarrollo de los cursos.

7.2.2 El microprocesador.

Ilustración 13: Procesador 68000 de Motorota

Se utiliza el microprocesador de Motorola 68000CC8, con el encapsulado PLCC de 68 pines. Este chip se sigue fabricando por Motorola y se encuentra en las distribuidoras por el precio de aproximadamente 5 dólares. Para montaje requiere la base PLCC correspondiente de 68 pines. El más barato es de 8 MHz, pero se puede utilizar cualquiera. Es importante montar un arreglo de resistencias R1 para pull-up de las señales de control. El arreglo puede tener cualquier valor de 4.7k hasta 10k, y se monta directamente sobre el circuito.

Anexos

Interfaz de Red 68000 – CS8900 38

7.2.3 El generador de reloj, circuito de RESET, controlador de interrupciones y NMI.

Estos circuitos están compuestos por los elementos Y2 (oscilador), U24 (D flip-flop), U25 (trigger Schmidt), U11 (codificador con prioridad), U13 (4-NAND); y elementos discretos D2, R5, R6, SW5, C18 (esquema de generación de RESET), SW4 (puente del divisor de reloj), C1 y SW1 (generación de NMI), y R2 (pull-ups de las líneas de interrupción). El Y2 es un oscilador encapsulado de cristal de cuarzo. Para el reloj principal es preferible utilizar este tipo de osciladores en lugar de cristales, aún si el procesador cuenta con el circuito oscilador. El uso de un oscilador encapsulado no requiere elementos discretos, no es crítico al montaje, y proporciona una señal de reloj estable. La frecuencia del oscilador puede ser cualquiera en el rango de 4 MHz hasta el doble de la frecuencia máxima del micro (16 MHz para 68000CC8), ya que el circuito de reloj cuenta con un divisor de frecuencia por 2 (74HCT74), seleccionado por el puente SW4. El 68000 tiene un diseño dinámico, y su frecuencia mínima de funcionamiento es de 4 MHz. La configuración normal es utilizar el oscilador de la frecuencia doble del máximo permitido (16 MHz) y el divisor, para evitar problemas de simetría de la señal de reloj. Se puede utilizar osciladores DIP16 (rectangulares) o DIP8 (cuadrados) ya que el circuito impreso está preparado para los dos casos. Se sueldan directamente, o pueden montarse sobre una base DIP16, para lo que hay que quitar los pines sobrantes a la base. Los U11, U13, U24 y U25 pueden ser de cualquier serie, y se montan sobre las bases correspondientes o directamente. El diodo D2 puede ser de cualquier marca. Los microswitches (botones) de RESET y NMI son de montaje superficial, pero los más comunes para thru-hole también sirven, solo hay que doblar las patas hacía fuera. El array de R2 puede ser de cualquier nominal de 4.7k hasta 10k, y se monta directamente sobre el circuito impreso.

Anexos

Interfaz de Red 68000 – CS8900 39

7.2.4 El decodificador de direcciones.

Ilustración 14: Decodificador de direcciones de la tarjeta UAM68K

Se compone de dos partes: decodificador principal (U8, U9, U10, U12), y decodificador de puertos (U23). Su montaje completo es imprescindible para el funcionamiento correcto del sistema. Los chips se montan sobre las bases o directamente. Es preferible usar la base para U23, para diagnósticos y posibles sustituciones en caso de ser dañado por un hardware externo.

Anexos

Interfaz de Red 68000 – CS8900 40

7.2.5 La memoria EPROM. Se utilizan 2 memorias EPROM tipo 27C256 (de 256 kbits), lo que en suma proporciona 64 kB. Tienen encapsulado DIP600 de 28 pines y se montan sobre bases. Actualmente están producidas por varios fabricantes, y se consiguen fácilmente ya que durante mucho tiempo se utilizaban para BIOS de las placas madre de los PCs. Se pueden mezclar memorias de diferentes fabricantes, pero no de diferentes velocidades. La velocidad se encuentra después de la marca, por ejemplo, Am27C256 – 150 es de 150 ns de ciclo, I27C256 – 25 es de 250 ns. Para la frecuencia de reloj principal de hasta 10 MHz se puede utilizar memorias de cualquier velocidad, para las frecuencias más altas la velocidad mínima es de 200 ns. Pueden utilizarse memorias de menor capacidad (por ejemplo, 2764), ya que son compatibles pin a pin (excepto las líneas sobrantes de direcciones), pero no es recomendable ya que estos chips hace años que no se fabrican, suelen ser lentos y pueden tener dificultades de programación.

Ilustración 15: Memorias RAM y ROM de la tarjeta UAM68K

7.2.6 La RAM. El circuito impreso está preparado para utilizar 2 memorias RAM que pueden ser de 8k x 8 (6264), de 32k x 8 (62256), o de 128k x 8 (681000). Las dos primeras llevan encapsulado DIP600 de 28 pines, y se montan sobre las bases. Las 681000 son de encapsulado SOP de 32 pines y se sueldan directamente a la placa. Las 6264 ya no se fabrican pero se encuentran con cierta facilidad. Las otras tienen varios fabricantes (Samsung, Toshiba, Cypress etc.), todos son compatibles. Aquí no hay problemas de velocidad ya que la más lenta es de 70 ns. No es recomendable mezclar chips de diferentes fabricantes.

Anexos

Interfaz de Red 68000 – CS8900 41

7.2.7 El adaptador de comunicaciones serie (UART).

Ilustración 16: Puertos seriales UART RS232 de la tarjeta UAM68K

El circuito está preparado para utilizar el adaptador SC28L92 de Philips, en el encapsulado PLCC de 44 pines, que se monta sobre su base correspondiente. Este chip es el sucesor del muy conocido 68681 de Motorola. Tiene 2 puertos serie, un puerto de entrada de 6 bits, un puerto de salida de 8 bits, timer de 16 bits, generador programable de frecuencia de comunicación serie (bitrate). Sus principales características se encuentran en el anexo 3. Para su funcionamiento es necesario un cristal de cuarzo de 3.6864 MHz. Para adaptación de niveles de voltaje al estándar RS-232 se utiliza el chip MAX232 (U15) de Maxim. Este chip tiene incorporado un generador de voltajes +12V y –12V necesarios para el funcionamiento correcto de RS-232. Durante el montaje, prestar atención a la polaridad de los capacitores. Con el chip MAX232A se puede utilizar capacitores de 0.1 uF y sin polaridad. Pueden utilizarse otros adaptadores UART con el mismo encapsulado PLCC48: el MC68681 de Motorola (Motorola ya no lo fabrica, pero está fabricado por Philips como SCN68681), y el SC28L91. El 68681 es pin a pin compatible con el SC28L92, pero su programación es un poco diferente. El SC28L91 tiene solo un puerto serie, y en lo demás es igual al SC28L92. En el último caso hay que cambiar el puente SW2 (conectar pin 11 a VCC), y no montar el conector P2 (Serial 2). Los puertos y la EEPROM. Los puertos de entrada utilizan buffers 74LS244 (U16, U20), y los puertos de salida – latches (flip-flops) octales con puesta a “0” 74LS273 (U17, U21). Se montan sobre sus bases DIP20. Si se necesita alta impedancia de entrada se puede utilizar los chips CMOS (por ejemplo, serie HC). Los chips de salida serie LS tienen capacidad de suministrar la corriente de hasta aproximadamente 20

Anexos

Interfaz de Red 68000 – CS8900 42

mA en el estado lógico ‘0’ y hasta 6 mA en el estado ‘1’ lo que permite conectar directamente un indicador LED o un relevador. Para posible expansión existe también una salida buferizada de 8 bits menos significativos del bus de datos (D0..D7), así como las señales de selección para añadir 2 puertos más de lectura y escritura. La EEPROM serie está conectada a los puertos de salida 1 (bits 0, 1, 2) y entrada 1 (bit 0). Es una memoria permanente reprogramable con la capacidad de hasta 2048 bit organizados en palabras de 8 o 16 bit, dependiendo del tipo. Existen chips 93LC66A (palabras de 8 bit), 93LC66B (16 bit), y 93LC66 (organización seleccionable por en pin ORG, si se conecta a tierra, es de 16 bit). También se puede utilizar chips 93LC46 y 93LC56, de menor capacidad. Se puede montar cualquiera de estos, pero la programación del driver depende del tipo, y después no se podrá cambiar del uno al otro.

Anexos

Interfaz de Red 68000 – CS8900 43

Ilustración 17: Diagrama esquemático de la tarjeta UAM68K (1)

Anexos

Interfaz de Red 68000 – CS8900 44

Ilustración 18: Diagrama esquemático de la tarjeta UAM68K (2)

Anexos

Interfaz de Red 68000 – CS8900 45

Ilustración 19: Diagrama esquemático de la tarjeta UAM68K (3)

Anexos

Interfaz de Red 68000 – CS8900 46

7.3 RFC de Protocolos

• RFC 792 - Internet Control Message Protocol • RFC 826 - Ethernet Address Resolution Protocol: Or converting network protocol addresses

to 48.bit Ethernet address for transmission on Ethernet hardware • RFC 768 - User Datagram Protocol • RFC 781 - Specification of the Internet Protocol (IP) timestamp option

Para mayor información de los diferentes protocolos ir a http://www.faqs.org/rfcs/

Anexos

Interfaz de Red 68000 – CS8900 47

7.4 IO_8900.H /**************************DEFINICIÓN DE CONSTANTES PARA EL CS89000*******************/ /*************************************************** Definición de puertos del CS8900 ****************************************************/ #define portRxTxData 0x00 /*Receive/Transmit data (port 0)*/ #define portRxTxData1 0x02 /*Receive/Transmit data (port 0)*/ #define portTxCmd 0x04 /*Transmit Commnad*/ #define portTxLength 0x06 /*Transmit Length*/ #define portISQ 0x08 /*Interrupt status queue*/ #define portPtr 0x0a /*PacketPage pointer*/ #define portData 0x0c /*PacketPage data (port 0)*/ #define portData1 0x0e /*PacketPage data (port 1)*/ /************************************************** Offsets Para el Pointer del PacketPage ***************************************************/ #define ppEISA 0x0000 /*EISA Registration number of CS8900*/ #define ppProdID 0x0002 /*Product ID Number*/ #define ppIOBase 0x0020 /*I/O Base Address*/ #define ppIntNum 0x0022 /*Interrupt number (0,1,2, or 3)*/ #define ppMemBase 0x002C /*Memory Base address register (20 bit)*/ #define ppRxCfg 0x0102 /*Receiver Configuration*/ #define ppRxCtl 0x0104 /*Receiver Control*/ #define ppTxCfg 0x0106 /*Transmit Configuration*/ #define ppBufCfg 0x010A /*Buffer Configuration*/ #define ppLineCtl 0x0112 /*Line Control*/ #define ppSelfCtl 0x0114 /*Self Control*/ #define ppBusCtl 0x0116 /*Bus Control*/ #define ppTestCtl 0x0118 /*Test Control*/ #define ppISQ 0x0120 /*Interrupt status queue*/ #define ppRxEvt 0x0124 /*Receiver Event*/ #define ppTxEvt 0x0128 /*Transmitter Event*/ #define ppBufEvt 0x012C /*Buffer Event*/ #define ppRxMiss 0x0130 /*Receiver Miss Counter*/ #define ppTxCol 0x0132 /*Transmit Collision Counter*/ #define ppLineSt 0x0134 /*Line Status*/ #define ppSelfSt 0x0136 /*Self Status*/ #define ppBusSt 0x0138 /*Bus Status*/ #define ppTxCmd 0x0144 /*Transmit Command Rest*/ #define ppTxLength 0x0146 /*Transmit Length*/ #define ppIndAddr 0x0158 /*Individual Address (IA)*/ #define ppRxStat 0x0400 /*Receive Status*/ #define ppRxLength 0x0402 /*Receive Length*/ #define ppRxFrame 0x0404 /*Receive Frame Location*/ #define ppTxFrame 0x0A00 /*Transmit Frame Location*/

Anexos

Interfaz de Red 68000 – CS8900 48

/*DEFINICIONES DE PACKET PAGE Y PUERTOS*/

#define IP1 192 /* ;first octet of IP address */ #define IP2 168 /* ;second octet of IP address*/ #define IP3 0 /* ;third octet of IP address*/ #define IP4 3 /* ;fourth octet of IP address*/ #define MAC2 0x0E /* ;\ °*/ #define MAC3 0x63 /* ; \ °*/ #define MAC1 0x00 /* ; \ °*/ #define MAC4 0x03 /* ; 48 bit IEEE OUI (Organizationally°*/ #define MAC5 0x34 /* ; / °*/ #define MAC6 0x56 /* ;/ °*/ /* ; Register Numbers */ #define REG_NUM_MASK 0x003F #define REG_NUM_RX_EVENT 0x0004 #define REG_NUM_TX_EVENT 0x0008 #define REG_NUM_BUF_EVENT 0x000C #define REG_NUM_RX_MISS 0x0010 #define REG_NUM_TX_COL 0x0012 /* ; Self Control Register */ #define SELF_CTL_RESET 0x0040 #define SELF_CTL_HC1E 0x2000 #define SELF_CTL_HCB1 0x8000 /* ; Self Status Register */ #define SELF_ST_INIT_DONE 0x0080 #define SELF_ST_SI_BUSY 0x0100 #define SELF_ST_EEP_PRES 0x0200 #define SELF_ST_EEP_OK 0x0400 #define SELF_ST_EL_PRES 0x0800 /* ; Bus Control Register */ #define BUS_CTL_USE_SA 0x0200 #define BUS_CTL_MEM_MODE 0x0400 #define BUS_CTL_IOCHRDY 0x1000 #define BUS_CTL_INT_ENBL 0x8000 /* ; Bus Status Register */ #define BUS_ST_TX_BID_ERR 0x0080 #define BUS_ST_RDY4TXNOW 0x0100 /* Line Control Register */ #define LINE_CTL_RX_ON 0x0040 #define LINE_CTL_TX_ON 0x0080 #define LINE_CTL_AUI_ONLY 0x0100 #define LINE_CTL_10BASET 0x0000 /* Test Control Register */ #define TEST_CTL_DIS_LT 0x0080

Anexos

Interfaz de Red 68000 – CS8900 49

#define TEST_CTL_ENDEC_LP 0x0200 #define TEST_CTL_AUI_LOOP 0x0400 #define TEST_CTL_DIS_BKOFF 0x0800 #define TEST_CTL_FDX 0x4000 /* Receiver Configuration Register */ #define RX_CFG_SKIP 0x0040 #define RX_CFG_RX_OK_IE 0x0100 #define RX_CFG_RX_OK_ID 0x0000 /* Interrupt disable */ #define RX_CFG_CRC_ERR_IE 0x1000 #define RX_CFG_RUNT_IE 0x2000 #define RX_CFG_X_DATA_IE 0x4000 /* Receiver Event Register */ #define RX_EVENT_RX_OK 0x0100 #define RX_EVENT_IND_ADDR 0x0400 #define RX_EVENT_BCAST 0x0800 #define RX_EVENT_CRC_ERR 0x1000 #define RX_EVENT_RUNT 0x2000 #define RX_EVENT_X_DATA 0x4000 /* Receiver Control Register */ #define RX_CTL_RX_OK_A 0x0100 #define RX_CTL_MCAST_A 0x0200 #define RX_CTL_IND_A 0x0400 #define RX_CTL_BCAST_A 0x0800 #define RX_CTL_CRC_ERR_A 0x1000 #define RX_CTL_RUNT_A 0x2000 #define RX_CTL_X_DATA_A 0x4000 /* Transmit Configuration Register */ #define TX_CFG_LOSS_CRS_IE 0x0040 #define TX_CFG_SQE_ERR_IE 0x0080 #define TX_CFG_TX_OK_IE 0x0100 #define TX_CFG_OUT_WIN_IE 0x0200 #define TX_CFG_JABBER_IE 0x0400 #define TX_CFG_16_COLL_IE 0x8000 #define TX_CFG_ALL_IE 0x8FC0 /* Transmit Event Register */ #define TX_EVENT_TX_OK 0x0100 #define TX_EVENT_OUT_WIN 0x0200 #define TX_EVENT_JABBER 0x0400 #define TX_EVENT_16_COLL 0x1000

Anexos

Interfaz de Red 68000 – CS8900 50

/* Transmit Command Register */ #define TX_CMD_START_5 0x0000 #define TX_CMD_START_381 0x0080 #define TX_CMD_START_1021 0x0040 #define TX_CMD_START_ALL 0x00C0 #define TX_CMD_FORCE 0x0100 #define TX_CMD_ONE_COLL 0x0200 #define TX_CMD_NO_CRC 0x1000 #define TX_CMD_NO_PAD 0x2000 /* Buffer Configuration Register */ #define BUF_CFG_SW_INT 0x0040 #define BUF_CFG_RDY4TX_IE 0x0100 #define BUF_CFG_TX_UNDR_IE 0x0200 /* Packet header */ #define pktLenH 0x00 #define pktLenL 0x01 #define pktDest0H 0x02 #define pktDest0L 0x03 #define pktDest1H 0x04 #define pktDest1L 0x05 #define pktDest2H 0x06 #define pktDest2L 0x07 #define pktSrc0H 0x08 #define pktSrc0L 0x09 #define pktSrc1H 0x0a #define pktSrc1L 0x0b #define pktSrc2H 0x0c #define pktSrc2L 0x0d #define pktTypeH 0x0e #define pktTypeL 0x0f /* ARP */ #define ar_hwtype 0x10 /* ;hardware type */ #define ar_prtype 0x12 /* ;protocol type*/ #define ar_hwlen 0x14 /* ;hardware address length*/ #define ar_prlen 0x15 /* ;protocol address length*/ #define ar_op 0x16 /* ;ARP operation (1=request, 2=reply)*/ #define ar_sha 0x18 /* ;senders hardware address*/ #define ar_spa 0x1e /* ;senders IP address*/ #define ar_tha 0x22 /* ;target hardware address*/ #define ar_tpa 0x28 /* ;target IP address*/ /* IP header */ #define ip_verlen 0x10 /* ;IP version and header length(in longs)*/ #define ip_tos 0x11 /* ;IP type of service*/ #define ip_len 0x12 /* ;packet length (length-header_length)*/ #define ip_id 0x14 /* ;datagram id*/ #define ip_fragoff 0x16 /* ;fragment offset*/ #define ip_ttl 0x18 /* ;time to live (in gateway hops)*/ #define ip_proto 0x19 /* ;protocol (ICMP=1, TCP=6, EGP=8, UDP=17)*/ #define ip_cksum 0x1a /* ;header checksum*/ #define ip_src 0x1c /* ;IP address of source*/ #define ip_dst 0x20 /* ;IP addess of destination*/ #define ip_data 0x24 /* IP value equates */ #define IPT_ICMP 1 /* ;protocol type for ICMP packets*/ #define IPT_TCP 6 /* ;protocol type for TCP packets*/ #define IPT_EGP 8 /* ;protocol type for EGP packets*/ #define IPT_UDP 0x11 /* ;protocol type for UDP packets*/

/* ICMP */ #define icmp_type 0x24

Anexos

Interfaz de Red 68000 – CS8900 51

#define icmp_code 0x25 #define icmp_cksum 0x26 #define icmp_id 0x28 #define icmp_sec 0x2A #define icmp_data 0x2C /* UDP */ #define udp_src_port 0x24 #define udp_dst_port 0x26 #define udp_len 0x28 #define udp_cksum 0x2A #define udp_data 0x2C

/**************************************************************************************/

Anexos

Interfaz de Red 68000 – CS8900 52

7.5 IO_8900.C /************************ init_8900_io *********************************************/ /*Este modulo crea los apuntadores para la utilización de los puertos de interfase 68k-8900. También establece los valores iniciales para los registros de configuración del CS8900 para que funcione correctamente para el envío y recepción de tramas./ void init_8900_io() { unsigned short int mac12,mac34,mac56; unsigned short int BusCtl=0,LineCtl=0,RxCtl=0,TestCtl=0,RxCfg=0,TxCfg=0; int i; flags=0; /* Inicializa el área de uso común para C y ASM con apuntadores */ value= (unsigned short int *) 0x103000; /* Datos */ port= (unsigned short int *) 0x103002; /* Direcciones de puertos portPtr,portISQ,etc */ asm("VALUE EQU 103000H"); /*Direcciones de los puertos de la tarjeta UAM-I 68000*/ asm("PORT EQU 103002H"); /*P0 Puerto de Control*/ asm("P0 EQU 220000H"); /*P1 Puerto de Datos*/ asm("P1W EQU 220002H"); /*P1W Puerto de Datos Escritura/ asm("P1R EQU 220003H"); /*P1R Puerto de Datos Lectura/ /*VALUE y PORT Dirección asignada en la memoria RAM */ /*para las variables globales usadas en C con el mismo*/ /*nombre*/ LineCtl=readPP(ppLineCtl); BusCtl=readPP(ppBusCtl); RxCtl=readPP(ppRxCtl); /*Lectura de cada offset de acuerdo al packet page */ TestCtl=readPP(ppTestCtl); RxCfg=readPP(ppRxCfg); TxCfg=0x7; LineCtl=LineCtl&0x0013; writePP(LineCtl,ppLineCtl); /*set to 10BaseT */ TestCtl=TestCtl|TEST_CTL_FDX; writePP(TestCtl,ppTestCtl); /* set to full duplex */ RxCfg=RxCfg|RX_CFG_RX_OK_IE; writePP(RxCfg,ppRxCfg); /* enable RxOK interrupt */ RxCtl=RxCtl|RX_CTL_RX_OK_A; RxCtl=RxCtl|RX_CTL_IND_A; RxCtl=RxCtl|RX_CTL_BCAST_A; writePP(RxCtl,ppRxCtl); /* set RxCtl (0x0D05) */ TxCfg=TxCfg|TX_CFG_ALL_IE; writePP(TxCfg,ppTxCfg); mac12=MAC2<<8|MAC1; /*Colocar la direccion MAC en el Packet Page*/ mac34=MAC4<<8|MAC3; /*Individual Address*/ mac56=MAC6<<8|MAC5; writePP(mac12,ppIndAddr); writePP(mac34,ppIndAddr+2); /*La direccion puede modificarse en el archivo*/ writePP(mac56,ppIndAddr+4); /*IO_8900.H*/ writePP(0x00,ppIntNum); /* INT is on INTRQ0 */ BusCtl = BusCtl|8000; writePP(BusCtl,ppBusCtl); /* enable irq */ LineCtl = LineCtl|0xC0; writePP(LineCtl,ppLineCtl); /* set SerRxon, SerTxon */ writePP(0x0D05,ppRxCtl); /* set RxCtl (0x0D05) */ writePP(0x4019,ppTestCtl); /* set to full duplex */ writePP(0x0103,ppRxCfg); /* enable RxOK interrupt */ writePP(0x8FC7,ppTxCfg); }

Anexos

Interfaz de Red 68000 – CS8900 53

/************************ resetPort ***********************************************/ /* Levanta /iow, /ior para que no este en conflicto el BUS de DATOS (al aplicar la alimentación a las tarjetas, inicialmente el IOW y el IOR están en nivel bajo. Esto configura al CS8900 para que ponga datos en el BUS, pero como también el puerto de la UAM2-68K esta en modo de salida, se produce un conflicto en el BUS )*/ void resetPort() { asm("\tMOVE.B #$FF,P0"); } /********************************* ioWrite********************************************/ /*ioWrite: escribe el dato proporcionado en la dirección correspondiente a portAddr*/ /*La escritura se hace de acuerdo al ciclo descrito en el manual del CS8900*/ /*Nota: Las rutinas de acceso están en ensamblador por la razón de que hay variaciones en los tiempos de acceso al CS8900 que producen problemas al momento de acceder sus registros de recepción y transmisión. Los tiempos de acceso en modo I/O al CS8900 se pueden consultar en el manual del CS8900*/ void ioWrite(data, portAddr) unsigned short int data; unsigned short int portAddr; { *value = data; /*Posiciona los valores (data y portAddr)en la RAM*/ *port = portAddr; /*de la tarjeta UAMI68000*/ asm("\tMOVE.B VALUE+1,P1W"); /* Escribe el dato en el puerto fisico */ /********* Ejecuta el Ciclo de Escritura *********/ asm("\tMOVE.B PORT+1,D6"); /* Pone la direccion del port en D6 */ asm("\tLSL.B #4,D6"); /* Recorre la direccion de 4 bits al nible alto */ asm("\tORI.B #3,D6"); /* configura D6 para que Suba /ior, /iow y AEN */ asm("\tMOVE.B #$FF,P0"); /* Resetea el puerto de Direccion y control */ asm("\tMOVE.B #$F7,P0"); /* Baja Pone el Bus en modo OUTPUT */ asm("\tMOVE.B D6,P0"); /* Pone la direccion del puerto a escribir */ asm("\tAND.B #$F1,D6"); /* Baja /iow */ asm("\tMOVE.B D6,P0"); asm("\tORI.B #7,D6"); /* Sube /iow y AEN */ asm("\tMOVE.B D6,P0"); asm("\tMOVE.B #$FF,P0"); }

/*********************** ioRead *************************************************/ /*ioRead: Lee el dato de acuerdo al valor asignado a portAddr(1 byte) y devuelve el valor en el puntero global value definido en la memoria RAM del UAMI-68000(103000H)*/ /*Nota: Las rutinas de acceso están en ensamblador por la razón de que hay variaciones en los tiempos de acceso al CS8900 que producen problemas al momento de acceder sus registros de recepción y transmisión. Los tiempos de acceso en modo I/O al CS8900 se pueden consultar en el manual del CS8900*/ ioRead(portAddr) unsigned short int portAddr; { int i; *port = portAddr; /*Coloca el parámetro en el puntero port(103002H)*/ asm("\tMOVE.B #$FF,P0"); /* Resetea el puerto de Direccion y Control; */ asm("\tMOVE.B PORT+1,D6"); /* Pone la direccion de 4 bits en D6 */

Anexos

Interfaz de Red 68000 – CS8900 54

asm("\tLSL.B #4,D6"); asm("\tORI.B #$0B,D6"); /* Baja AEN y configura el BUS EN MODO INPUT */ asm("\tMOVE.B D6,P0"); asm("\tANDI.B #$FA,D6"); /* Baja /ior */ asm("\tMOVE.B D6,P0"); asm("\tMOVE.B P1R,D7"); /* Lee el dato */ asm("\tORI.B #$0B,D6"); /* Sube /ior */ asm("\tMOVE.B D6,P0"); asm("\tMOVE.B #$FF,P0"); /* Resetea el puerto */ asm("\tMOVE.B D7,VALUE+1"); /* Deja el Byte leido en el area compartida */ return *value; } /**************************************************************************************/ esperar(t) unsigned short int t; { unsigned short int i,j; for(i=0;i<=t;i++) for(j=0;j<=64000;j++) ; } /***********************************************************************************/

Anexos

Interfaz de Red 68000 – CS8900 55

7.6 PROTOCOL.C /********************************* SendEth *************************************/ /*SendEth: envía la trama previamente configurada por cualquiera de las rutinas de protocolos (ICMP,ARP,UDP,etc), se le envían como parámetro el inicio y fin que es el tamaño de la trama*/ SendEth(ini,fin) int ini; int fin; { unsigned short int ready_txt; int i; ready_txt=0; writePP(0x00C9,ppTxCmd); /*Escribe en ppTxCmd para transmitir*/ writePP(fin-ini+1,ppTxLength); /*Escribe en ppTxLength el tamaño*/ /*de la trama a transmitir*/

/*Este ciclo sirve para leer el Bus status, para que cuando este listo, pueda enviar la trama, de acuerdo al bit numero cuatro del ppBusSt, que debe estar en uno para transmitir*/ do { ready_txt=readPP(ppBusSt); }while((ready_txt&BUS_ST_RDY4TXNOW)!=BUS_ST_RDY4TXNOW); /*El ciclo sirve para escribir cada uno de los bytes a transmitir en el Mode Maping en el puerto de transmisión Recepción(portRxTxData dirección 00h, tanto el byte bajo como el alto*/ for(i=ini;i<=(fin);i=i+2){ ioWrite(eth_frame_buffer[i],portRxTxData); ioWrite(eth_frame_buffer[i+1],portRxTxData+1); } } /********************************* ARPReplay ***********************************/ /*ARPReplay: Este modulo organiza el formato de una trama ARP, este protocolo sirve para averiguar la dirección de enlace que corresponde a la dirección de red del destinatario, en nuestro caso solo están conectadas dos tarjetas entre si*/

Anexos

Interfaz de Red 68000 – CS8900 56

ARPReplay(){ /* Dirección MAC Destino, variante de acuerdo a que tarjeta se conecte */ eth_frame_buffer[pktDest0H]=0x00; eth_frame_buffer[pktDest0L]=0x01; eth_frame_buffer[pktDest1H]=0x02; eth_frame_buffer[pktDest1L]=0x89; eth_frame_buffer[pktDest2H]=0x26; eth_frame_buffer[pktDest2L]=0x57;

/* Dirección MAC origen (6 bytes), definidos en I0_8900 */ eth_frame_buffer[pktSrc0H]=MAC1; eth_frame_buffer[pktSrc0L]=MAC2; eth_frame_buffer[pktSrc1H]=MAC3; eth_frame_buffer[pktSrc1L]=MAC4; eth_frame_buffer[pktSrc2H]=MAC5; eth_frame_buffer[pktSrc2L]=MAC6; /* Tipo de protocolo (0x0806 ARP) */ eth_frame_buffer[pktTypeH]=0x08; eth_frame_buffer[pktTypeL]=0x06; /* Tipo de hardware (1 ethernet) */ eth_frame_buffer[ar_hwtype]=0x00; eth_frame_buffer[ar_hwtype+1]=0x01; /* Tipo de protocolo a resolver (0x0800 IP) */ eth_frame_buffer[ar_prtype]=0x08; eth_frame_buffer[ar_prtype+1]=0x00; /* Tamaño de dirección de hardware (6 ARP) */ eth_frame_buffer[ar_hwlen]=0x06;

/* Tamaño de dirección de protocolo (4 IP) */ eth_frame_buffer[ar_prlen]=0x04;

/* Operación de ARP (2 replay) */ eth_frame_buffer[ar_op]=0x00; eth_frame_buffer[ar_op+1]=0x02; /*Dirección MAC "sender" (6 bytes) */ eth_frame_buffer[ar_sha]=MAC1; eth_frame_buffer[ar_sha+1]=MAC2; eth_frame_buffer[ar_sha+2]=MAC3; eth_frame_buffer[ar_sha+3]=MAC4; eth_frame_buffer[ar_sha+4]=MAC5; eth_frame_buffer[ar_sha+5]=MAC6; /* Dirección IP "sender" (4 bytes) */ eth_frame_buffer[ar_spa]=IP1; eth_frame_buffer[ar_spa+1]=IP2; eth_frame_buffer[ar_spa+2]=IP3; eth_frame_buffer[ar_spa+3]=IP4; /* Dirección MAC "target" (6 bytes) */ eth_frame_buffer[ar_tha]=MAC1; eth_frame_buffer[ar_tha+1]=MAC2; eth_frame_buffer[ar_tha+2]=MAC3; eth_frame_buffer[ar_tha+3]=MAC4; eth_frame_buffer[ar_tha+4]=MAC5; eth_frame_buffer[ar_tha+5]=MAC6; /* Dirección IP "sender" (4 bytes) */ eth_frame_buffer[ar_tpa]=IP1; eth_frame_buffer[ar_tpa+1]=IP2; eth_frame_buffer[ar_tpa+2]=IP3; eth_frame_buffer[ar_tpa+3]=IP4;

Anexos

Interfaz de Red 68000 – CS8900 57

} /*******************************************************************************/ ARPRequest() { /* MAC Addr Dest */ eth_frame_buffer[pktDest0H]=0xff; eth_frame_buffer[pktDest0L]=0xff; eth_frame_buffer[pktDest1H]=0xff; eth_frame_buffer[pktDest1L]=0xff; eth_frame_buffer[pktDest2H]=0xff; eth_frame_buffer[pktDest2L]=0xff; /* Envia la dirección MAC origen (6 bytes) */ eth_frame_buffer[pktSrc0H]=MAC1; eth_frame_buffer[pktSrc0L]=MAC2; eth_frame_buffer[pktSrc1H]=MAC3; eth_frame_buffer[pktSrc1L]=MAC4; eth_frame_buffer[pktSrc2H]=MAC5; eth_frame_buffer[pktSrc2L]=MAC6; /* Tipo de protocolo (0x0806 ARP) */ eth_frame_buffer[pktTypeH]=0x08; eth_frame_buffer[pktTypeL]=0x06; /* Tipo de hardware (1 ethernet) */ eth_frame_buffer[ar_hwtype]=0x00; eth_frame_buffer[ar_hwtype+1]=0x01; /* Tipo de protocolo a resolver (0x0800 IP) */ eth_frame_buffer[ar_prtype]=0x08; eth_frame_buffer[ar_prtype+1]=0x00; /* Tamaño de dirección de hardware (6 ARP) */ eth_frame_buffer[ar_hwlen]=0x06; /* Tamaño de dirección de protocolo (4 IP) */ eth_frame_buffer[ar_prlen]=0x04;

/* Operación de ARP (1 request) */ eth_frame_buffer[ar_op]=0x00; eth_frame_buffer[ar_op+1]=0x01; /* Envia la dirección MAC "sender" (6 bytes) */ eth_frame_buffer[ar_sha]=MAC1; eth_frame_buffer[ar_sha+1]=MAC2; eth_frame_buffer[ar_sha+2]=MAC3; eth_frame_buffer[ar_sha+3]=MAC4; eth_frame_buffer[ar_sha+4]=MAC5; eth_frame_buffer[ar_sha+5]=MAC6; /* Envia la dirección IP "sender" (4 bytes) */ eth_frame_buffer[ar_spa]=IP1; eth_frame_buffer[ar_spa+1]=IP2; eth_frame_buffer[ar_spa+2]=IP3; eth_frame_buffer[ar_spa+3]=IP4; /* Envia la dirección MAC "target" (6 bytes) */ eth_frame_buffer[ar_tha]=0; eth_frame_buffer[ar_tha+1]=0; eth_frame_buffer[ar_tha+2]=0; eth_frame_buffer[ar_tha+3]=0;

Anexos

Interfaz de Red 68000 – CS8900 58

eth_frame_buffer[ar_tha+4]=0; eth_frame_buffer[ar_tha+5]=0; /* Envia la dirección IP "target" (4 bytes) */ eth_frame_buffer[ar_tpa]=IP1; eth_frame_buffer[ar_tpa+1]=IP2; eth_frame_buffer[ar_tpa+2]=IP3; eth_frame_buffer[ar_tpa+3]=254; }

Anexos

Interfaz de Red 68000 – CS8900 59

/*************************** Ping_request **************************************/ /*Ping_request: Este modulo organiza el formato de una datagrama ICMP, este protocolo Permite reportar diversas incidencias que pueden producirse en el envío de un datagrama, esto es como teclear en una terminal de windows o linux ping ejem: ping –s www.uv.es 64 4 PING video.ci.uv.es: 64 bytes packets 64 bytes from 147.156.1.46: icmp_seq=0. time=1. ms 64 bytes from 147.156.1.46: icmp_seq=1. time=1. ms 64 bytes from 147.156.1.46: icmp_seq=2. time=1. ms 64 bytes from 147.156.1.46: icmp_seq=3. time=1. ms ---video.ci.uv.es PING Statistics ---- 5 packets transmitted, 5 packets receivded, 0% packet loss Round-trip (ms) min/avg/max = 1/1/1 */ Ping_request() { int i; unsigned short int d; /*Dirección MAC Destino variante de acuerdo a que tarjeta se conecte */ eth_frame_buffer[pktDest0H]=0x00; eth_frame_buffer[pktDest0L]=0x01; eth_frame_buffer[pktDest1H]=0x02; eth_frame_buffer[pktDest1L]=0x89; eth_frame_buffer[pktDest2H]=0x26; eth_frame_buffer[pktDest2L]=0x57; /* Dirección MAC origen (6 bytes) */ eth_frame_buffer[pktSrc0H]=MAC1; eth_frame_buffer[pktSrc0L]=MAC2; eth_frame_buffer[pktSrc1H]=MAC3; eth_frame_buffer[pktSrc1L]=MAC4; eth_frame_buffer[pktSrc2H]=MAC5; eth_frame_buffer[pktSrc2L]=MAC6; /* Tipo de protocolo (0x0800 IP) */ eth_frame_buffer[pktTypeH]=0x08; eth_frame_buffer[pktTypeL]=0x00; /* Versión y Tamaño de Cabecera IP */ eth_frame_buffer[ip_verlen]=0x45; eth_frame_buffer[ip_tos]=0x00; /* packet length (length-header_length)*/ eth_frame_buffer[ip_len]=0x00; eth_frame_buffer[ip_len+1]=0x54; /* datagram id */ eth_frame_buffer[ip_id]=0x00; eth_frame_buffer[ip_id+1]=0x00; /* Flags de Fragmentación */ eth_frame_buffer[ip_fragoff]=0x40; /* Offset de fragmento */ eth_frame_buffer[ip_fragoff+1]=0x00;

Anexos

Interfaz de Red 68000 – CS8900 60

/* TTL */ eth_frame_buffer[ip_ttl]=0x40; /* Protocol (1 ICMP) */ eth_frame_buffer[ip_proto]=IPT_ICMP; /* Header CheckSum */ eth_frame_buffer[ip_cksum]=0xB8; eth_frame_buffer[ip_cksum+1]=0x57; /* Dirección IP Fuente */ eth_frame_buffer[ip_src]=IP1; eth_frame_buffer[ip_src+1]=IP2; eth_frame_buffer[ip_src+2]=IP3; eth_frame_buffer[ip_src+3]=IP4; /* Dirección IP Destino */ eth_frame_buffer[ip_dst]=IP1; eth_frame_buffer[ip_dst+1]=IP2; eth_frame_buffer[ip_dst+2]=IP3; eth_frame_buffer[ip_dst+3]=254; /* Tipo de ICMP (8 ping request) */ eth_frame_buffer[icmp_type]=0x08; /* Código ICMP */ eth_frame_buffer[icmp_code]=0x00; /* CheckSum ICMP */ eth_frame_buffer[icmp_cksum]=0x39; eth_frame_buffer[icmp_cksum+1]=0x07; /* ICMP id */ eth_frame_buffer[icmp_id]=0x28; eth_frame_buffer[icmp_id+1]=0x05; /* numero de secuencia */ eth_frame_buffer[icmp_sec]=0x01; eth_frame_buffer[icmp_sec+1]=0x00; /* datos ICMP */ eth_frame_buffer[icmp_data]=0x6A; eth_frame_buffer[icmp_data+1]=0xC4; eth_frame_buffer[icmp_data+2]=0x26; eth_frame_buffer[icmp_data+3]=0x3F; eth_frame_buffer[icmp_data+4]=0x14; eth_frame_buffer[icmp_data+5]=0xED; eth_frame_buffer[icmp_data+6]=0x05; eth_frame_buffer[icmp_data+7]=0x00; d=8; for(i=icmp_data+8;i<=icmp_data+56;i++){ eth_frame_buffer[i]=d; d++; } }

/*****************************************************************************/ /*UDP_Send: de acuerdo a los otros protocolos que se programaron este sigue la misma idea de organizar un datagrama UDP(capa de transporte) de acuerdo a la siguiente forma*/ /*Nota: este modulo envía el data grama, pero tiene un inconveniente, si uno detectara el protocolo por medio del programa Ethereal en la maquina donde se conecta la tarjeta se

Anexos

Interfaz de Red 68000 – CS8900 61

podrá dar uno cuenta que no lo marca como protocolo UDP. Este es el ultimo punto donde este proyecto fue probado o concluido*/ UDP_Send() { /* MAC Addr Dest */ eth_frame_buffer[pktDest0H]=0x00; eth_frame_buffer[pktDest0L]=0x03; eth_frame_buffer[pktDest1H]=0x47; eth_frame_buffer[pktDest1L]=0xCC; eth_frame_buffer[pktDest2H]=0x36; eth_frame_buffer[pktDest2L]=0xCC; /* Dirección MAC origen (6 bytes) */ eth_frame_buffer[pktSrc0H]=MAC1; eth_frame_buffer[pktSrc0L]=MAC2; eth_frame_buffer[pktSrc1H]=MAC3; eth_frame_buffer[pktSrc1L]=MAC4; eth_frame_buffer[pktSrc2H]=MAC5; eth_frame_buffer[pktSrc2L]=MAC6; /* Tipo de protocolo (0x0800 IP) */ eth_frame_buffer[pktTypeH]=0x08; eth_frame_buffer[pktTypeL]=0x00; /* Versión y Tamaño de Cabecera IP */ eth_frame_buffer[ip_verlen]=0x45; eth_frame_buffer[ip_tos]=0x00; /* packet length (length-header_length)*/ eth_frame_buffer[ip_len]=0x00; eth_frame_buffer[ip_len+1]=0x32; /* datagram id */ eth_frame_buffer[ip_id]=0x20; eth_frame_buffer[ip_id+1]=0x50; /* Flags de Fragmentación */ eth_frame_buffer[ip_fragoff]=0x00; /* Offset de fragmento */ eth_frame_buffer[ip_fragoff+1]=0x00; /* TTL */ eth_frame_buffer[ip_ttl]=0x80; /* Protocol (0x11 UDP) */ eth_frame_buffer[ip_proto]=IPT_UDP; /* Header CheckSum */ eth_frame_buffer[ip_cksum]=0x99; eth_frame_buffer[ip_cksum+1]=0x15; /* Dirección IP Fuente */ eth_frame_buffer[ip_src]=IP1; eth_frame_buffer[ip_src+1]=IP2; eth_frame_buffer[ip_src+2]=IP3; eth_frame_buffer[ip_src+3]=IP4;

Anexos

Interfaz de Red 68000 – CS8900 62

/* Dirección IP Destino */ eth_frame_buffer[ip_dst]=IP1; eth_frame_buffer[ip_dst+1]=IP2; eth_frame_buffer[ip_dst+2]=IP3; eth_frame_buffer[ip_dst+3]=1; /* UDP Source port */ eth_frame_buffer[udp_src_port]=0x0e; eth_frame_buffer[udp_src_port+1]=0x85; /* UDP Source port */ eth_frame_buffer[udp_dst_port]=0x17; eth_frame_buffer[udp_dst_port+1]=0x70; /* Length UDP */ eth_frame_buffer[udp_len]=0x00; eth_frame_buffer[udp_len+1]=0x0C; /* CheckSum UDP */ eth_frame_buffer[udp_cksum]=0xF7; eth_frame_buffer[udp_cksum+1]=0x20; /* datos UDP */ eth_frame_buffer[udp_data]=0x68; eth_frame_buffer[udp_data+1]=0x6f; eth_frame_buffer[udp_data+2]=0x6c; eth_frame_buffer[udp_data+3]=0x61; }

Anexos

Interfaz de Red 68000 – CS8900 63

7.7 P1.C /*****************************************************************************/ #include <stdio.h> #include "io_8900.h" unsigned short int *value; /*asignación de puntero global*/ unsigned short int *port; /*puntero al Puerto*/ unsigned short int flags; /*banderas*/ unsigned short int eth_frame_buffer[256]; /*arreglo para envío de trama(paquete)*/ unsigned short int statusL,statusH; unsigned char RxBuffer[256];/*Buffer de Recepción*/

/* main que hace las llamadas principales, para configurar la tarjeta de red a través de la tarjeta del 68000, una vez hecho la configuración manda paquetes ARP y pide su respuesta, por ultimo manda en un ciclo infinito peticiones del protocolo ICMP(ping) y además de paquetes con el protocolo UDP*/ main() { resetPort(); /* Resetea el Puerto de Datos para mantenerlo inactivo ya que si no se hace se produce un calentamiento del latch del puerto*/ init_8900_io();/*Inicializa parámetros del chip 8900 para su funcionamiento/ esperar(100);/*Ciclo de espera necesario para la correcta sincronización de la salida de los datos al puerto*/ resetPort(); init_8900_io(); ARPReplay(); /*Configuración de la trama ARP*/ SendEth(pktDest0H,ar_tpa+3); /* Envió de la Trama ARP*/ esperar(15); ARPReplay(); SendEth(pktDest0H,ar_tpa+3); esperar(15); ARPRequest(); SendEth(pktDest0H,ar_tpa+3); esperar(15); ARPReplay(); SendEth(pktDest0H,ar_tpa+3); for(;;){ esperar(15); Ping_request(); /*Configuración de la trama ICMP(ping)*/ SendEth(pktDest0H,icmp_data+56); /* Envió de la trama ICMP*/ esperar(15); /*Configuración de UDP no terminada */ UDP_Send(); /*Configuración de la trama UDP*/ eth_frame_buffer[ip_id+1]++; SendEth(pktDest0H,udp_data+4); /*Envío de trama UDP*/ } }

Anexos

Interfaz de Red 68000 – CS8900 64

/******************************************************************* Identifica el tipo de interrupción y ejecuta la operación adecuada (ISQ = Interrupt Status Queue) *******************************************************************/ ProcessISQ() { unsigned short int st; st=readPP(ppISQ); /*statusL=ioRead(portISQ); statusH=ioRead(portISQ+1); /*Verifica si es cero entonces ya termina y retorna */ while(st!=0) { /*Identifica el evento ocurrido*/ if(st&REG_NUM_RX_EVENT==REG_NUM_RX_EVENT) ReceiveEvent(); if(st&REG_NUM_TX_EVENT==REG_NUM_TX_EVENT) TransmitEvent(); /*switch(statusL) { case REG_NUM_RX_EVENT: ReceiveEvent();break; case REG_NUM_TX_EVENT: TransmitEvent();break;*/ } /*statusL=ioRead(portISQ); statusH=ioRead(portISQ+1); }*/ } /********************************************************************* Procesa el Evento de Recepción *********************************************************************/ ReceiveEvent(){ unsigned char PacketTypeH,PacketTypeL; PacketTypeH = RxBuffer[pktTypeH]; /*lee el indice donde se guarda el tipo de trama*/ PacketTypeL = RxBuffer[pktTypeL]; if((PacketTypeH==8)&&(PacketTypeL==0)) DoIP(); /*Procesa el paquete IP*/ /* if((PacketTypeH==8)&&(PacketTypeL==6)) DoArp(); /*Procesa el paquete ARP*//* else if((PacketTypeH==8)&&(PacketTypeL==0)) DoIP(); /*Procesa el paquete IP*//* else discard_packet(); /*Descarta el paquete recibido*/ }

Anexos

Interfaz de Red 68000 – CS8900 65

7.8 IO_PPP.C /******************************************************************** * Implementación de las Funciones Básicas del Packet Page * ********************************************************************/ #include "IO_8900.H" extern unsigned short int *value; extern unsigned short int *port; /* SetPointer: Fija el puntero del PacketPage en la dirección especificada por el parámetro que le es enviado(ppOffset) */ void SetPointer(ppOffset) unsigned short int ppOffset; { int i; /*Separa el parámetro Offset en dos bytes(ppOffsetL y ppOffsetH) para que puede ser escrito en el packet page pointer (portPtr)*/ unsigned short int ppOffsetL = ppOffset & 0xFF; unsigned short int ppOffsetH = ppOffset>>8; /*Escritura en el portPtr(0Ah y 0Bh)*/ for(i=0;i<300;i++){ ioWrite(ppOffsetL,portPtr); ioWrite(ppOffsetH,portPtr+1); } /*El ciclo for que se utiliza para asegurar la escritura del puntero*/ /*ya que si se trata de escribir solo una vez en este pareciera que no funciona*/ }

/*************************** readPP *************************************/ /* readPP: este modulo lee el Packet Page de acuerdo al parametro offset correspondiente al puntero que se quiere leer y regresa el resultado en la variable result */ readPP(ppOffset) unsigned short int ppOffset; { unsigned short int result; unsigned short int temp; SetPointer(ppOffset); /*Posiciona el puntero del Packet Page para ser leído*/ /* Lee el primer byte (alto) en el Mode Maping Packet Page Data (Port0)*/ result = ioRead(portData+1);

/* Recorre el byte alto a su posición final en result */ result = result<<8;

/* Lee el segundo byte (bajo) en el Mode Maping Packet Page Data (Port1)*/ temp = ioRead(portData);

/* Pone el byte bajo en su posición en result */ result = result | temp; return(result); }

Anexos

Interfaz de Red 68000 – CS8900 66

/*************************** writePP *************************************/ /* writePP: escribe el dato en el Packet Page de acuerdo al parámetro Offset */ writePP(dato,ppOffset) unsigned short int dato; unsigned short int ppOffset; { SetPointer(ppOffset); /*Posiciona el puntero del Packet Page para ser escrito*/

/* Escribe el primer byte (bajo) en el Mode Maping Packet Page Data (Port0)*/ ioWrite(dato, portData);

/* Recorre el segundo byte del dato*/ dato = dato>>8;

/* Escribe el segundo byte (alto) en el Mode Maping Packet Page Data (Port1)*/ ioWrite(dato, portData+1); }